qarpeo 0.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +102 -0
- package/dist/chunks/auth-schema.mjs +219 -0
- package/dist/chunks/wrangler.mjs +783 -0
- package/dist/cli/index.mjs +1085 -0
- package/dist/dev/env.d.ts +12 -0
- package/dist/dev/wrangler.d.ts +18 -0
- package/dist/module.d.ts +16 -0
- package/dist/module.mjs +4436 -0
- package/dist/runtime/ai.d.ts +25 -0
- package/dist/runtime/ai.mjs +106 -0
- package/dist/runtime/analytics.d.ts +24 -0
- package/dist/runtime/analytics.mjs +38 -0
- package/dist/runtime/app/components/BlobImage.vue +100 -0
- package/dist/runtime/app/components/CMSBlocks.vue +93 -0
- package/dist/runtime/app/components/CMSContent.vue +23 -0
- package/dist/runtime/app/components/CMSImage.vue +49 -0
- package/dist/runtime/app/components/CMSLocaleSwitcher.vue +110 -0
- package/dist/runtime/app/components/CMSPreviewBanner.vue +79 -0
- package/dist/runtime/app/components/CMSVersionBanner.vue +49 -0
- package/dist/runtime/app/components/CMSVersionSwitcher.vue +126 -0
- package/dist/runtime/app/components/ContentRenderer.vue +80 -0
- package/dist/runtime/app/components/FileUpload.vue +196 -0
- package/dist/runtime/app/components/ImpersonationBanner.vue +57 -0
- package/dist/runtime/app/components/SignedIn.vue +13 -0
- package/dist/runtime/app/components/SignedOut.vue +13 -0
- package/dist/runtime/app/components/shiki.css +34 -0
- package/dist/runtime/app/composables/analytics.d.ts +125 -0
- package/dist/runtime/app/composables/analytics.mjs +81 -0
- package/dist/runtime/app/composables/api-tokens.d.ts +49 -0
- package/dist/runtime/app/composables/api-tokens.mjs +61 -0
- package/dist/runtime/app/composables/auth.d.ts +50 -0
- package/dist/runtime/app/composables/auth.mjs +101 -0
- package/dist/runtime/app/composables/chat.d.ts +69 -0
- package/dist/runtime/app/composables/chat.mjs +159 -0
- package/dist/runtime/app/composables/cms-preview.d.ts +33 -0
- package/dist/runtime/app/composables/cms-preview.mjs +83 -0
- package/dist/runtime/app/composables/cms.d.ts +307 -0
- package/dist/runtime/app/composables/cms.mjs +355 -0
- package/dist/runtime/app/composables/docs-version.d.ts +35 -0
- package/dist/runtime/app/composables/docs-version.mjs +70 -0
- package/dist/runtime/app/composables/impersonation.d.ts +14 -0
- package/dist/runtime/app/composables/impersonation.mjs +44 -0
- package/dist/runtime/app/composables/notifications.d.ts +35 -0
- package/dist/runtime/app/composables/notifications.mjs +139 -0
- package/dist/runtime/app/composables/organization.d.ts +127 -0
- package/dist/runtime/app/composables/organization.mjs +138 -0
- package/dist/runtime/app/composables/passkey.d.ts +6 -0
- package/dist/runtime/app/composables/passkey.mjs +105 -0
- package/dist/runtime/app/composables/passwordless.d.ts +7 -0
- package/dist/runtime/app/composables/passwordless.mjs +67 -0
- package/dist/runtime/app/composables/payments.d.ts +43 -0
- package/dist/runtime/app/composables/payments.mjs +74 -0
- package/dist/runtime/app/composables/realtime.d.ts +96 -0
- package/dist/runtime/app/composables/realtime.mjs +432 -0
- package/dist/runtime/app/composables/site.d.ts +35 -0
- package/dist/runtime/app/composables/site.mjs +36 -0
- package/dist/runtime/app/composables/storage.d.ts +60 -0
- package/dist/runtime/app/composables/storage.mjs +294 -0
- package/dist/runtime/app/composables/tenant.d.ts +82 -0
- package/dist/runtime/app/composables/tenant.mjs +120 -0
- package/dist/runtime/app/composables/turnstile.d.ts +3 -0
- package/dist/runtime/app/composables/turnstile.mjs +10 -0
- package/dist/runtime/app/composables/two-factor.d.ts +12 -0
- package/dist/runtime/app/composables/two-factor.mjs +65 -0
- package/dist/runtime/app/middleware/auth.global.d.ts +2 -0
- package/dist/runtime/app/middleware/auth.global.mjs +44 -0
- package/dist/runtime/app/pages/cms.vue +2249 -0
- package/dist/runtime/app/pages/devtools/agents.vue +717 -0
- package/dist/runtime/app/pages/devtools/analytics.vue +618 -0
- package/dist/runtime/app/pages/devtools/auth.vue +351 -0
- package/dist/runtime/app/pages/devtools/blob.vue +745 -0
- package/dist/runtime/app/pages/devtools/db.vue +546 -0
- package/dist/runtime/app/pages/devtools/domains.vue +772 -0
- package/dist/runtime/app/pages/devtools/kv.vue +829 -0
- package/dist/runtime/app/pages/devtools/logs.vue +655 -0
- package/dist/runtime/app/pages/devtools/mail.vue +389 -0
- package/dist/runtime/app/pages/devtools/overview.vue +390 -0
- package/dist/runtime/app/pages/devtools/settings.vue +560 -0
- package/dist/runtime/app/pages/devtools.vue +165 -0
- package/dist/runtime/app/plugins/seo.d.ts +2 -0
- package/dist/runtime/app/plugins/seo.mjs +105 -0
- package/dist/runtime/app/plugins/shortcuts.client.d.ts +6 -0
- package/dist/runtime/app/plugins/shortcuts.client.mjs +19 -0
- package/dist/runtime/app/public/sw-notifications.mjs +52 -0
- package/dist/runtime/auth.d.ts +25 -0
- package/dist/runtime/auth.mjs +11 -0
- package/dist/runtime/bindings.d.ts +27 -0
- package/dist/runtime/bindings.mjs +38 -0
- package/dist/runtime/blob.d.ts +26 -0
- package/dist/runtime/blob.mjs +334 -0
- package/dist/runtime/bots.d.ts +1 -0
- package/dist/runtime/bots.mjs +1 -0
- package/dist/runtime/browser.d.ts +21 -0
- package/dist/runtime/browser.mjs +64 -0
- package/dist/runtime/cache.d.ts +19 -0
- package/dist/runtime/cache.mjs +12 -0
- package/dist/runtime/cms.d.ts +2 -0
- package/dist/runtime/cms.mjs +0 -0
- package/dist/runtime/db.d.ts +21 -0
- package/dist/runtime/db.mjs +36 -0
- package/dist/runtime/drizzle.d.ts +11 -0
- package/dist/runtime/drizzle.mjs +18 -0
- package/dist/runtime/email.d.ts +51 -0
- package/dist/runtime/email.mjs +245 -0
- package/dist/runtime/hyperdrive.d.ts +21 -0
- package/dist/runtime/hyperdrive.mjs +49 -0
- package/dist/runtime/index.d.ts +23 -0
- package/dist/runtime/index.mjs +23 -0
- package/dist/runtime/kv.d.ts +16 -0
- package/dist/runtime/kv.mjs +126 -0
- package/dist/runtime/payments.d.ts +2 -0
- package/dist/runtime/payments.mjs +0 -0
- package/dist/runtime/queue.d.ts +21 -0
- package/dist/runtime/queue.mjs +41 -0
- package/dist/runtime/rag.d.ts +1 -0
- package/dist/runtime/rag.mjs +1 -0
- package/dist/runtime/ratelimit.d.ts +21 -0
- package/dist/runtime/ratelimit.mjs +38 -0
- package/dist/runtime/realtime.d.ts +6 -0
- package/dist/runtime/realtime.mjs +13 -0
- package/dist/runtime/server/db/cms-schema.d.ts +651 -0
- package/dist/runtime/server/db/cms-schema.mjs +74 -0
- package/dist/runtime/server/durable-objects/agent.d.ts +14 -0
- package/dist/runtime/server/durable-objects/agent.mjs +571 -0
- package/dist/runtime/server/durable-objects/room.d.ts +34 -0
- package/dist/runtime/server/durable-objects/room.mjs +514 -0
- package/dist/runtime/server/middleware/auth.d.ts +2 -0
- package/dist/runtime/server/middleware/auth.mjs +108 -0
- package/dist/runtime/server/middleware/devtools.d.ts +2 -0
- package/dist/runtime/server/middleware/devtools.mjs +61 -0
- package/dist/runtime/server/middleware/ratelimit.d.ts +2 -0
- package/dist/runtime/server/middleware/ratelimit.mjs +49 -0
- package/dist/runtime/server/middleware/tenancy.d.ts +6 -0
- package/dist/runtime/server/middleware/tenancy.mjs +15 -0
- package/dist/runtime/server/middleware/tracker.d.ts +7 -0
- package/dist/runtime/server/middleware/tracker.mjs +9 -0
- package/dist/runtime/server/plugins/agents.d.ts +7 -0
- package/dist/runtime/server/plugins/agents.mjs +3 -0
- package/dist/runtime/server/plugins/cms.d.ts +7 -0
- package/dist/runtime/server/plugins/cms.mjs +16 -0
- package/dist/runtime/server/plugins/dev-logs.d.ts +1 -0
- package/dist/runtime/server/plugins/dev-logs.mjs +58 -0
- package/dist/runtime/server/plugins/dev-proxy.d.ts +3 -0
- package/dist/runtime/server/plugins/dev-proxy.mjs +21 -0
- package/dist/runtime/server/plugins/env.d.ts +6 -0
- package/dist/runtime/server/plugins/env.mjs +17 -0
- package/dist/runtime/server/plugins/queue.d.ts +6 -0
- package/dist/runtime/server/plugins/queue.mjs +8 -0
- package/dist/runtime/server/routes/__qarpeo/agents/chat.post.d.ts +20 -0
- package/dist/runtime/server/routes/__qarpeo/agents/chat.post.mjs +110 -0
- package/dist/runtime/server/routes/__qarpeo/agents/clear.post.d.ts +7 -0
- package/dist/runtime/server/routes/__qarpeo/agents/clear.post.mjs +15 -0
- package/dist/runtime/server/routes/__qarpeo/agents/create.post.d.ts +17 -0
- package/dist/runtime/server/routes/__qarpeo/agents/create.post.mjs +47 -0
- package/dist/runtime/server/routes/__qarpeo/agents/history.get.d.ts +15 -0
- package/dist/runtime/server/routes/__qarpeo/agents/history.get.mjs +24 -0
- package/dist/runtime/server/routes/__qarpeo/agents/list.get.d.ts +5 -0
- package/dist/runtime/server/routes/__qarpeo/agents/list.get.mjs +63 -0
- package/dist/runtime/server/routes/__qarpeo/analytics/events.get.d.ts +64 -0
- package/dist/runtime/server/routes/__qarpeo/analytics/events.get.mjs +55 -0
- package/dist/runtime/server/routes/__qarpeo/analytics/summary.get.d.ts +30 -0
- package/dist/runtime/server/routes/__qarpeo/analytics/summary.get.mjs +73 -0
- package/dist/runtime/server/routes/__qarpeo/auth/revoke-session.post.d.ts +6 -0
- package/dist/runtime/server/routes/__qarpeo/auth/revoke-session.post.mjs +26 -0
- package/dist/runtime/server/routes/__qarpeo/auth/sessions.get.d.ts +6 -0
- package/dist/runtime/server/routes/__qarpeo/auth/sessions.get.mjs +46 -0
- package/dist/runtime/server/routes/__qarpeo/auth/users.get.d.ts +7 -0
- package/dist/runtime/server/routes/__qarpeo/auth/users.get.mjs +65 -0
- package/dist/runtime/server/routes/__qarpeo/blob/files.get.d.ts +22 -0
- package/dist/runtime/server/routes/__qarpeo/blob/files.get.mjs +36 -0
- package/dist/runtime/server/routes/__qarpeo/db/query.post.d.ts +23 -0
- package/dist/runtime/server/routes/__qarpeo/db/query.post.mjs +34 -0
- package/dist/runtime/server/routes/__qarpeo/db/tables.get.d.ts +31 -0
- package/dist/runtime/server/routes/__qarpeo/db/tables.get.mjs +81 -0
- package/dist/runtime/server/routes/__qarpeo/kv/delete.post.d.ts +11 -0
- package/dist/runtime/server/routes/__qarpeo/kv/delete.post.mjs +18 -0
- package/dist/runtime/server/routes/__qarpeo/kv/get.get.d.ts +11 -0
- package/dist/runtime/server/routes/__qarpeo/kv/get.get.mjs +20 -0
- package/dist/runtime/server/routes/__qarpeo/kv/keys.get.d.ts +8 -0
- package/dist/runtime/server/routes/__qarpeo/kv/keys.get.mjs +27 -0
- package/dist/runtime/server/routes/__qarpeo/kv/set.post.d.ts +14 -0
- package/dist/runtime/server/routes/__qarpeo/kv/set.post.mjs +24 -0
- package/dist/runtime/server/routes/__qarpeo/logs.delete.d.ts +5 -0
- package/dist/runtime/server/routes/__qarpeo/logs.delete.mjs +6 -0
- package/dist/runtime/server/routes/__qarpeo/logs.get.d.ts +5 -0
- package/dist/runtime/server/routes/__qarpeo/logs.get.mjs +26 -0
- package/dist/runtime/server/routes/__qarpeo/logs.post.d.ts +6 -0
- package/dist/runtime/server/routes/__qarpeo/logs.post.mjs +17 -0
- package/dist/runtime/server/routes/__qarpeo/mail/bounce.post.d.ts +5 -0
- package/dist/runtime/server/routes/__qarpeo/mail/bounce.post.mjs +37 -0
- package/dist/runtime/server/routes/__qarpeo/mail/clear.post.d.ts +4 -0
- package/dist/runtime/server/routes/__qarpeo/mail/clear.post.mjs +6 -0
- package/dist/runtime/server/routes/__qarpeo/mail/inbox.get.d.ts +5 -0
- package/dist/runtime/server/routes/__qarpeo/mail/inbox.get.mjs +7 -0
- package/dist/runtime/server/routes/__qarpeo/mail/send-test.post.d.ts +4 -0
- package/dist/runtime/server/routes/__qarpeo/mail/send-test.post.mjs +29 -0
- package/dist/runtime/server/routes/__qarpeo/mail/track/click/[id].get.d.ts +2 -0
- package/dist/runtime/server/routes/__qarpeo/mail/track/click/[id].get.mjs +23 -0
- package/dist/runtime/server/routes/__qarpeo/mail/track/open/[id].get.d.ts +2 -0
- package/dist/runtime/server/routes/__qarpeo/mail/track/open/[id].get.mjs +31 -0
- package/dist/runtime/server/routes/__qarpeo/overview/health.get.d.ts +8 -0
- package/dist/runtime/server/routes/__qarpeo/overview/health.get.mjs +46 -0
- package/dist/runtime/server/routes/__qarpeo/overview.get.d.ts +32 -0
- package/dist/runtime/server/routes/__qarpeo/overview.get.mjs +38 -0
- package/dist/runtime/server/routes/__qarpeo/settings/reset-dev-data.post.d.ts +11 -0
- package/dist/runtime/server/routes/__qarpeo/settings/reset-dev-data.post.mjs +84 -0
- package/dist/runtime/server/routes/__qarpeo/settings.get.d.ts +124 -0
- package/dist/runtime/server/routes/__qarpeo/settings.get.mjs +145 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/create.post.d.ts +7 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/create.post.mjs +26 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/domain-add.post.d.ts +6 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/domain-add.post.mjs +29 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/domain-delete.post.d.ts +7 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/domain-delete.post.mjs +21 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/domain-verify.post.d.ts +9 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/domain-verify.post.mjs +21 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/list.get.d.ts +15 -0
- package/dist/runtime/server/routes/__qarpeo/tenants/list.get.mjs +22 -0
- package/dist/runtime/server/routes/agents/[agent]/chat.post.d.ts +2 -0
- package/dist/runtime/server/routes/agents/[agent]/chat.post.mjs +35 -0
- package/dist/runtime/server/routes/agents/[agent]/clear.post.d.ts +4 -0
- package/dist/runtime/server/routes/agents/[agent]/clear.post.mjs +27 -0
- package/dist/runtime/server/routes/agents/[agent]/history.get.d.ts +4 -0
- package/dist/runtime/server/routes/agents/[agent]/history.get.mjs +27 -0
- package/dist/runtime/server/routes/analytics/events.get.d.ts +3 -0
- package/dist/runtime/server/routes/analytics/events.get.mjs +17 -0
- package/dist/runtime/server/routes/analytics/pageviews.get.d.ts +3 -0
- package/dist/runtime/server/routes/analytics/pageviews.get.mjs +15 -0
- package/dist/runtime/server/routes/analytics/summary.get.d.ts +6 -0
- package/dist/runtime/server/routes/analytics/summary.get.mjs +15 -0
- package/dist/runtime/server/routes/atom.xml.get.d.ts +2 -0
- package/dist/runtime/server/routes/atom.xml.get.mjs +76 -0
- package/dist/runtime/server/routes/auth/2fa/disable.post.d.ts +4 -0
- package/dist/runtime/server/routes/auth/2fa/disable.post.mjs +44 -0
- package/dist/runtime/server/routes/auth/2fa/setup.post.d.ts +6 -0
- package/dist/runtime/server/routes/auth/2fa/setup.post.mjs +32 -0
- package/dist/runtime/server/routes/auth/2fa/verify.post.d.ts +6 -0
- package/dist/runtime/server/routes/auth/2fa/verify.post.mjs +92 -0
- package/dist/runtime/server/routes/auth/[provider]/callback.d.ts +1 -0
- package/dist/runtime/server/routes/auth/[provider]/callback.mjs +1 -0
- package/dist/runtime/server/routes/auth/[provider].d.ts +3 -0
- package/dist/runtime/server/routes/auth/[provider].mjs +95 -0
- package/dist/runtime/server/routes/auth/account.delete.d.ts +5 -0
- package/dist/runtime/server/routes/auth/account.delete.mjs +52 -0
- package/dist/runtime/server/routes/auth/impersonate/start.post.d.ts +5 -0
- package/dist/runtime/server/routes/auth/impersonate/start.post.mjs +14 -0
- package/dist/runtime/server/routes/auth/impersonate/stop.post.d.ts +5 -0
- package/dist/runtime/server/routes/auth/impersonate/stop.post.mjs +5 -0
- package/dist/runtime/server/routes/auth/logout-all.post.d.ts +4 -0
- package/dist/runtime/server/routes/auth/logout-all.post.mjs +16 -0
- package/dist/runtime/server/routes/auth/logout-others.post.d.ts +4 -0
- package/dist/runtime/server/routes/auth/logout-others.post.mjs +11 -0
- package/dist/runtime/server/routes/auth/logout.post.d.ts +4 -0
- package/dist/runtime/server/routes/auth/logout.post.mjs +17 -0
- package/dist/runtime/server/routes/auth/magic-link/send.post.d.ts +10 -0
- package/dist/runtime/server/routes/auth/magic-link/send.post.mjs +29 -0
- package/dist/runtime/server/routes/auth/magic-link/verify.get.d.ts +2 -0
- package/dist/runtime/server/routes/auth/magic-link/verify.get.mjs +81 -0
- package/dist/runtime/server/routes/auth/organization/create.post.d.ts +5 -0
- package/dist/runtime/server/routes/auth/organization/create.post.mjs +10 -0
- package/dist/runtime/server/routes/auth/organization/invite.post.d.ts +9 -0
- package/dist/runtime/server/routes/auth/organization/invite.post.mjs +27 -0
- package/dist/runtime/server/routes/auth/organization/join.post.d.ts +6 -0
- package/dist/runtime/server/routes/auth/organization/join.post.mjs +15 -0
- package/dist/runtime/server/routes/auth/organization/list.get.d.ts +5 -0
- package/dist/runtime/server/routes/auth/organization/list.get.mjs +7 -0
- package/dist/runtime/server/routes/auth/organization/members/[id].delete.d.ts +4 -0
- package/dist/runtime/server/routes/auth/organization/members/[id].delete.mjs +33 -0
- package/dist/runtime/server/routes/auth/organization/members/index.get.d.ts +6 -0
- package/dist/runtime/server/routes/auth/organization/members/index.get.mjs +18 -0
- package/dist/runtime/server/routes/auth/organization/mfa.post.d.ts +6 -0
- package/dist/runtime/server/routes/auth/organization/mfa.post.mjs +33 -0
- package/dist/runtime/server/routes/auth/organization/sso/[id].delete.d.ts +4 -0
- package/dist/runtime/server/routes/auth/organization/sso/[id].delete.mjs +28 -0
- package/dist/runtime/server/routes/auth/organization/sso/index.get.d.ts +2 -0
- package/dist/runtime/server/routes/auth/organization/sso/index.get.mjs +23 -0
- package/dist/runtime/server/routes/auth/organization/sso/index.post.d.ts +5 -0
- package/dist/runtime/server/routes/auth/organization/sso/index.post.mjs +84 -0
- package/dist/runtime/server/routes/auth/organization/switch.post.d.ts +6 -0
- package/dist/runtime/server/routes/auth/organization/switch.post.mjs +14 -0
- package/dist/runtime/server/routes/auth/otp/send.post.d.ts +10 -0
- package/dist/runtime/server/routes/auth/otp/send.post.mjs +29 -0
- package/dist/runtime/server/routes/auth/otp/verify.post.d.ts +6 -0
- package/dist/runtime/server/routes/auth/otp/verify.post.mjs +95 -0
- package/dist/runtime/server/routes/auth/sessions/[id].delete.d.ts +5 -0
- package/dist/runtime/server/routes/auth/sessions/[id].delete.mjs +24 -0
- package/dist/runtime/server/routes/auth/sessions.get.d.ts +2 -0
- package/dist/runtime/server/routes/auth/sessions.get.mjs +11 -0
- package/dist/runtime/server/routes/auth/sso/login.get.d.ts +2 -0
- package/dist/runtime/server/routes/auth/sso/login.get.mjs +94 -0
- package/dist/runtime/server/routes/auth/sso/oidc/callback.get.d.ts +2 -0
- package/dist/runtime/server/routes/auth/sso/oidc/callback.get.mjs +113 -0
- package/dist/runtime/server/routes/auth/sso/saml/acs.post.d.ts +2 -0
- package/dist/runtime/server/routes/auth/sso/saml/acs.post.mjs +95 -0
- package/dist/runtime/server/routes/auth/tokens/[id].delete.d.ts +4 -0
- package/dist/runtime/server/routes/auth/tokens/[id].delete.mjs +13 -0
- package/dist/runtime/server/routes/auth/tokens/create.post.d.ts +9 -0
- package/dist/runtime/server/routes/auth/tokens/create.post.mjs +17 -0
- package/dist/runtime/server/routes/auth/tokens/index.get.d.ts +9 -0
- package/dist/runtime/server/routes/auth/tokens/index.get.mjs +5 -0
- package/dist/runtime/server/routes/auth/turnstile/verify.post.d.ts +2 -0
- package/dist/runtime/server/routes/auth/turnstile/verify.post.mjs +15 -0
- package/dist/runtime/server/routes/auth/user.get.d.ts +2 -0
- package/dist/runtime/server/routes/auth/user.get.mjs +6 -0
- package/dist/runtime/server/routes/auth/webauthn/login/options.post.d.ts +2 -0
- package/dist/runtime/server/routes/auth/webauthn/login/options.post.mjs +17 -0
- package/dist/runtime/server/routes/auth/webauthn/login/verify.post.d.ts +6 -0
- package/dist/runtime/server/routes/auth/webauthn/login/verify.post.mjs +127 -0
- package/dist/runtime/server/routes/auth/webauthn/register/options.post.d.ts +2 -0
- package/dist/runtime/server/routes/auth/webauthn/register/options.post.mjs +47 -0
- package/dist/runtime/server/routes/auth/webauthn/register/verify.post.d.ts +5 -0
- package/dist/runtime/server/routes/auth/webauthn/register/verify.post.mjs +88 -0
- package/dist/runtime/server/routes/cms/[collection]/[id]/preview-token.post.d.ts +8 -0
- package/dist/runtime/server/routes/cms/[collection]/[id]/preview-token.post.mjs +27 -0
- package/dist/runtime/server/routes/cms/[collection]/[id]/publish.post.d.ts +6 -0
- package/dist/runtime/server/routes/cms/[collection]/[id]/publish.post.mjs +19 -0
- package/dist/runtime/server/routes/cms/[collection]/[id]/review.post.d.ts +6 -0
- package/dist/runtime/server/routes/cms/[collection]/[id]/review.post.mjs +33 -0
- package/dist/runtime/server/routes/cms/[collection]/[id].delete.d.ts +4 -0
- package/dist/runtime/server/routes/cms/[collection]/[id].delete.mjs +17 -0
- package/dist/runtime/server/routes/cms/[collection]/[id].put.d.ts +4 -0
- package/dist/runtime/server/routes/cms/[collection]/[id].put.mjs +18 -0
- package/dist/runtime/server/routes/cms/[collection]/[slug].get.d.ts +4 -0
- package/dist/runtime/server/routes/cms/[collection]/[slug].get.mjs +19 -0
- package/dist/runtime/server/routes/cms/[collection]/atom.xml.get.d.ts +2 -0
- package/dist/runtime/server/routes/cms/[collection]/atom.xml.get.mjs +69 -0
- package/dist/runtime/server/routes/cms/[collection]/by-path.get.d.ts +8 -0
- package/dist/runtime/server/routes/cms/[collection]/by-path.get.mjs +23 -0
- package/dist/runtime/server/routes/cms/[collection]/feed.xml.get.d.ts +2 -0
- package/dist/runtime/server/routes/cms/[collection]/feed.xml.get.mjs +65 -0
- package/dist/runtime/server/routes/cms/[collection]/index.get.d.ts +7 -0
- package/dist/runtime/server/routes/cms/[collection]/index.get.mjs +15 -0
- package/dist/runtime/server/routes/cms/[collection]/index.post.d.ts +4 -0
- package/dist/runtime/server/routes/cms/[collection]/index.post.mjs +23 -0
- package/dist/runtime/server/routes/cms/[collection]/references.get.d.ts +19 -0
- package/dist/runtime/server/routes/cms/[collection]/references.get.mjs +47 -0
- package/dist/runtime/server/routes/cms/[collection]/surroundings.get.d.ts +10 -0
- package/dist/runtime/server/routes/cms/[collection]/surroundings.get.mjs +12 -0
- package/dist/runtime/server/routes/cms/collections/[id].delete.d.ts +4 -0
- package/dist/runtime/server/routes/cms/collections/[id].delete.mjs +10 -0
- package/dist/runtime/server/routes/cms/collections/[id].put.d.ts +4 -0
- package/dist/runtime/server/routes/cms/collections/[id].put.mjs +11 -0
- package/dist/runtime/server/routes/cms/collections/index.get.d.ts +4 -0
- package/dist/runtime/server/routes/cms/collections/index.get.mjs +6 -0
- package/dist/runtime/server/routes/cms/collections/index.post.d.ts +4 -0
- package/dist/runtime/server/routes/cms/collections/index.post.mjs +19 -0
- package/dist/runtime/server/routes/cms/components/index.get.d.ts +17 -0
- package/dist/runtime/server/routes/cms/components/index.get.mjs +16 -0
- package/dist/runtime/server/routes/cms/deploy.post.d.ts +4 -0
- package/dist/runtime/server/routes/cms/deploy.post.mjs +46 -0
- package/dist/runtime/server/routes/cms/export.post.d.ts +10 -0
- package/dist/runtime/server/routes/cms/export.post.mjs +55 -0
- package/dist/runtime/server/routes/cms/navigation.get.d.ts +8 -0
- package/dist/runtime/server/routes/cms/navigation.get.mjs +36 -0
- package/dist/runtime/server/routes/cms/preview/disable.get.d.ts +9 -0
- package/dist/runtime/server/routes/cms/preview/disable.get.mjs +9 -0
- package/dist/runtime/server/routes/cms/preview/enable.get.d.ts +14 -0
- package/dist/runtime/server/routes/cms/preview/enable.get.mjs +42 -0
- package/dist/runtime/server/routes/cms/publish-scheduled.post.d.ts +11 -0
- package/dist/runtime/server/routes/cms/publish-scheduled.post.mjs +35 -0
- package/dist/runtime/server/routes/cms/search.get.d.ts +13 -0
- package/dist/runtime/server/routes/cms/search.get.mjs +137 -0
- package/dist/runtime/server/routes/cms/sync.post.d.ts +7 -0
- package/dist/runtime/server/routes/cms/sync.post.mjs +18 -0
- package/dist/runtime/server/routes/cms/webhooks/[provider].post.d.ts +150 -0
- package/dist/runtime/server/routes/cms/webhooks/[provider].post.mjs +213 -0
- package/dist/runtime/server/routes/docs/search.get.d.ts +15 -0
- package/dist/runtime/server/routes/docs/search.get.mjs +20 -0
- package/dist/runtime/server/routes/feed.xml.get.d.ts +2 -0
- package/dist/runtime/server/routes/feed.xml.get.mjs +73 -0
- package/dist/runtime/server/routes/mail/bounce.post.d.ts +14 -0
- package/dist/runtime/server/routes/mail/bounce.post.mjs +56 -0
- package/dist/runtime/server/routes/mail/inbox/[id].get.d.ts +2 -0
- package/dist/runtime/server/routes/mail/inbox/[id].get.mjs +9 -0
- package/dist/runtime/server/routes/mail/inbox.get.d.ts +4 -0
- package/dist/runtime/server/routes/mail/inbox.get.mjs +7 -0
- package/dist/runtime/server/routes/mail/suppressions/[email].delete.d.ts +11 -0
- package/dist/runtime/server/routes/mail/suppressions/[email].delete.mjs +18 -0
- package/dist/runtime/server/routes/mail/suppressions/index.get.d.ts +12 -0
- package/dist/runtime/server/routes/mail/suppressions/index.get.mjs +23 -0
- package/dist/runtime/server/routes/mail/suppressions/index.post.d.ts +10 -0
- package/dist/runtime/server/routes/mail/suppressions/index.post.mjs +23 -0
- package/dist/runtime/server/routes/mail/unsubscribe.d.ts +13 -0
- package/dist/runtime/server/routes/mail/unsubscribe.mjs +91 -0
- package/dist/runtime/server/routes/mail/webhooks.post.d.ts +12 -0
- package/dist/runtime/server/routes/mail/webhooks.post.mjs +71 -0
- package/dist/runtime/server/routes/notifications/[id]/read.post.d.ts +4 -0
- package/dist/runtime/server/routes/notifications/[id]/read.post.mjs +13 -0
- package/dist/runtime/server/routes/notifications/[id].delete.d.ts +4 -0
- package/dist/runtime/server/routes/notifications/[id].delete.mjs +13 -0
- package/dist/runtime/server/routes/notifications/[id].get.d.ts +2 -0
- package/dist/runtime/server/routes/notifications/[id].get.mjs +15 -0
- package/dist/runtime/server/routes/notifications/index.get.d.ts +6 -0
- package/dist/runtime/server/routes/notifications/index.get.mjs +18 -0
- package/dist/runtime/server/routes/notifications/push/subscribe.post.d.ts +4 -0
- package/dist/runtime/server/routes/notifications/push/subscribe.post.mjs +20 -0
- package/dist/runtime/server/routes/notifications/push/unsubscribe.post.d.ts +4 -0
- package/dist/runtime/server/routes/notifications/push/unsubscribe.post.mjs +15 -0
- package/dist/runtime/server/routes/notifications/read-all.post.d.ts +4 -0
- package/dist/runtime/server/routes/notifications/read-all.post.mjs +11 -0
- package/dist/runtime/server/routes/payments/cancel.post.d.ts +7 -0
- package/dist/runtime/server/routes/payments/cancel.post.mjs +9 -0
- package/dist/runtime/server/routes/payments/change-plan.post.d.ts +7 -0
- package/dist/runtime/server/routes/payments/change-plan.post.mjs +12 -0
- package/dist/runtime/server/routes/payments/checkout.post.d.ts +9 -0
- package/dist/runtime/server/routes/payments/checkout.post.mjs +16 -0
- package/dist/runtime/server/routes/payments/pause.post.d.ts +7 -0
- package/dist/runtime/server/routes/payments/pause.post.mjs +9 -0
- package/dist/runtime/server/routes/payments/portal.post.d.ts +5 -0
- package/dist/runtime/server/routes/payments/portal.post.mjs +9 -0
- package/dist/runtime/server/routes/payments/subscription.get.d.ts +6 -0
- package/dist/runtime/server/routes/payments/subscription.get.mjs +9 -0
- package/dist/runtime/server/routes/payments/usage.get.d.ts +12 -0
- package/dist/runtime/server/routes/payments/usage.get.mjs +18 -0
- package/dist/runtime/server/routes/payments/usage.post.d.ts +6 -0
- package/dist/runtime/server/routes/payments/usage.post.mjs +24 -0
- package/dist/runtime/server/routes/payments/webhook.post.d.ts +14 -0
- package/dist/runtime/server/routes/payments/webhook.post.mjs +21 -0
- package/dist/runtime/server/routes/realtime/broadcast.post.d.ts +4 -0
- package/dist/runtime/server/routes/realtime/broadcast.post.mjs +26 -0
- package/dist/runtime/server/routes/realtime/history.delete.d.ts +13 -0
- package/dist/runtime/server/routes/realtime/history.delete.mjs +12 -0
- package/dist/runtime/server/routes/realtime/history.get.d.ts +16 -0
- package/dist/runtime/server/routes/realtime/history.get.mjs +15 -0
- package/dist/runtime/server/routes/realtime/presence.get.d.ts +6 -0
- package/dist/runtime/server/routes/realtime/presence.get.mjs +27 -0
- package/dist/runtime/server/routes/realtime/state.get.d.ts +5 -0
- package/dist/runtime/server/routes/realtime/state.get.mjs +26 -0
- package/dist/runtime/server/routes/realtime/state.post.d.ts +6 -0
- package/dist/runtime/server/routes/realtime/state.post.mjs +37 -0
- package/dist/runtime/server/routes/realtime/ws.get.d.ts +2 -0
- package/dist/runtime/server/routes/realtime/ws.get.mjs +73 -0
- package/dist/runtime/server/routes/robots.txt.get.d.ts +2 -0
- package/dist/runtime/server/routes/robots.txt.get.mjs +41 -0
- package/dist/runtime/server/routes/rss.xml.get.d.ts +2 -0
- package/dist/runtime/server/routes/rss.xml.get.mjs +2 -0
- package/dist/runtime/server/routes/sitemap.xml.get.d.ts +2 -0
- package/dist/runtime/server/routes/sitemap.xml.get.mjs +84 -0
- package/dist/runtime/server/routes/storage/file/[...key].delete.d.ts +4 -0
- package/dist/runtime/server/routes/storage/file/[...key].delete.mjs +23 -0
- package/dist/runtime/server/routes/storage/file/[...key].get.d.ts +2 -0
- package/dist/runtime/server/routes/storage/file/[...key].get.mjs +23 -0
- package/dist/runtime/server/routes/storage/files.get.d.ts +14 -0
- package/dist/runtime/server/routes/storage/files.get.mjs +11 -0
- package/dist/runtime/server/routes/storage/presigned.post.d.ts +8 -0
- package/dist/runtime/server/routes/storage/presigned.post.mjs +39 -0
- package/dist/runtime/server/routes/storage/sign.post.d.ts +6 -0
- package/dist/runtime/server/routes/storage/sign.post.mjs +24 -0
- package/dist/runtime/server/routes/storage/upload.post.d.ts +22 -0
- package/dist/runtime/server/routes/storage/upload.post.mjs +96 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/index.delete.d.ts +8 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/index.delete.mjs +39 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/verify.post.d.ts +8 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/[domain]/verify.post.mjs +39 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/index.get.d.ts +8 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/index.get.mjs +20 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/index.post.d.ts +8 -0
- package/dist/runtime/server/routes/tenants/[tenant]/domains/index.post.mjs +44 -0
- package/dist/runtime/server/routes/tenants/current.get.d.ts +8 -0
- package/dist/runtime/server/routes/tenants/current.get.mjs +6 -0
- package/dist/runtime/server/tasks/cms/publish.d.ts +4 -0
- package/dist/runtime/server/tasks/cms/publish.mjs +18 -0
- package/dist/runtime/server/utils/agent-store.d.ts +24 -0
- package/dist/runtime/server/utils/agent-store.mjs +53 -0
- package/dist/runtime/server/utils/agents-registry-fallback.d.ts +1 -0
- package/dist/runtime/server/utils/agents-registry-fallback.mjs +1 -0
- package/dist/runtime/server/utils/ai.d.ts +119 -0
- package/dist/runtime/server/utils/ai.mjs +607 -0
- package/dist/runtime/server/utils/analytics-query.d.ts +109 -0
- package/dist/runtime/server/utils/analytics-query.mjs +234 -0
- package/dist/runtime/server/utils/auth.d.ts +60 -0
- package/dist/runtime/server/utils/auth.mjs +361 -0
- package/dist/runtime/server/utils/blob-store.d.ts +13 -0
- package/dist/runtime/server/utils/blob-store.mjs +60 -0
- package/dist/runtime/server/utils/bots.d.ts +21 -0
- package/dist/runtime/server/utils/bots.mjs +491 -0
- package/dist/runtime/server/utils/cache.d.ts +33 -0
- package/dist/runtime/server/utils/cache.mjs +128 -0
- package/dist/runtime/server/utils/cms-events.d.ts +17 -0
- package/dist/runtime/server/utils/cms-events.mjs +80 -0
- package/dist/runtime/server/utils/cms-filter.d.ts +3 -0
- package/dist/runtime/server/utils/cms-filter.mjs +34 -0
- package/dist/runtime/server/utils/cms.d.ts +278 -0
- package/dist/runtime/server/utils/cms.mjs +3268 -0
- package/dist/runtime/server/utils/config.d.ts +27 -0
- package/dist/runtime/server/utils/config.mjs +38 -0
- package/dist/runtime/server/utils/context.d.ts +13 -0
- package/dist/runtime/server/utils/context.mjs +98 -0
- package/dist/runtime/server/utils/crypto.d.ts +16 -0
- package/dist/runtime/server/utils/crypto.mjs +56 -0
- package/dist/runtime/server/utils/dev-logs.d.ts +21 -0
- package/dist/runtime/server/utils/dev-logs.mjs +41 -0
- package/dist/runtime/server/utils/dev-proxy.d.ts +1 -0
- package/dist/runtime/server/utils/dev-proxy.mjs +69 -0
- package/dist/runtime/server/utils/domains.d.ts +46 -0
- package/dist/runtime/server/utils/domains.mjs +318 -0
- package/dist/runtime/server/utils/drizzle.d.ts +10 -0
- package/dist/runtime/server/utils/drizzle.mjs +36 -0
- package/dist/runtime/server/utils/email-templates.d.ts +44 -0
- package/dist/runtime/server/utils/email-templates.mjs +373 -0
- package/dist/runtime/server/utils/feed.d.ts +42 -0
- package/dist/runtime/server/utils/feed.mjs +161 -0
- package/dist/runtime/server/utils/impersonation.d.ts +67 -0
- package/dist/runtime/server/utils/impersonation.mjs +298 -0
- package/dist/runtime/server/utils/jobs.d.ts +70 -0
- package/dist/runtime/server/utils/jobs.mjs +125 -0
- package/dist/runtime/server/utils/kv-store.d.ts +9 -0
- package/dist/runtime/server/utils/kv-store.mjs +32 -0
- package/dist/runtime/server/utils/mail-suppression.d.ts +62 -0
- package/dist/runtime/server/utils/mail-suppression.mjs +328 -0
- package/dist/runtime/server/utils/mail.d.ts +90 -0
- package/dist/runtime/server/utils/mail.mjs +366 -0
- package/dist/runtime/server/utils/notifications.d.ts +51 -0
- package/dist/runtime/server/utils/notifications.mjs +215 -0
- package/dist/runtime/server/utils/organization.d.ts +54 -0
- package/dist/runtime/server/utils/organization.mjs +354 -0
- package/dist/runtime/server/utils/passwordless.d.ts +48 -0
- package/dist/runtime/server/utils/passwordless.mjs +179 -0
- package/dist/runtime/server/utils/payments.d.ts +121 -0
- package/dist/runtime/server/utils/payments.mjs +1067 -0
- package/dist/runtime/server/utils/queue-fallback.d.ts +2 -0
- package/dist/runtime/server/utils/queue-fallback.mjs +2 -0
- package/dist/runtime/server/utils/queue.d.ts +4 -0
- package/dist/runtime/server/utils/queue.mjs +3 -0
- package/dist/runtime/server/utils/rag.d.ts +25 -0
- package/dist/runtime/server/utils/rag.mjs +333 -0
- package/dist/runtime/server/utils/ratelimit.d.ts +45 -0
- package/dist/runtime/server/utils/ratelimit.mjs +182 -0
- package/dist/runtime/server/utils/realtime.d.ts +110 -0
- package/dist/runtime/server/utils/realtime.mjs +197 -0
- package/dist/runtime/server/utils/schema-fallback.d.ts +3 -0
- package/dist/runtime/server/utils/schema-fallback.mjs +2 -0
- package/dist/runtime/server/utils/session.d.ts +72 -0
- package/dist/runtime/server/utils/session.mjs +287 -0
- package/dist/runtime/server/utils/sso.d.ts +49 -0
- package/dist/runtime/server/utils/sso.mjs +131 -0
- package/dist/runtime/server/utils/storage.d.ts +111 -0
- package/dist/runtime/server/utils/storage.mjs +654 -0
- package/dist/runtime/server/utils/tenant.d.ts +44 -0
- package/dist/runtime/server/utils/tenant.mjs +285 -0
- package/dist/runtime/server/utils/totp.d.ts +33 -0
- package/dist/runtime/server/utils/totp.mjs +112 -0
- package/dist/runtime/server/utils/tracker.d.ts +72 -0
- package/dist/runtime/server/utils/tracker.mjs +139 -0
- package/dist/runtime/server/utils/turnstile.d.ts +17 -0
- package/dist/runtime/server/utils/turnstile.mjs +68 -0
- package/dist/runtime/server/utils/vapid.d.ts +35 -0
- package/dist/runtime/server/utils/vapid.mjs +211 -0
- package/dist/runtime/storage.d.ts +1 -0
- package/dist/runtime/storage.mjs +0 -0
- package/dist/runtime/types/ai.d.ts +68 -0
- package/dist/runtime/types/ai.mjs +0 -0
- package/dist/runtime/types/analytics.d.ts +30 -0
- package/dist/runtime/types/analytics.mjs +0 -0
- package/dist/runtime/types/auth-globals.d.ts +14 -0
- package/dist/runtime/types/auth.d.ts +153 -0
- package/dist/runtime/types/auth.mjs +0 -0
- package/dist/runtime/types/browser.d.ts +29 -0
- package/dist/runtime/types/browser.mjs +0 -0
- package/dist/runtime/types/d1.d.ts +44 -0
- package/dist/runtime/types/d1.mjs +0 -0
- package/dist/runtime/types/drizzle.d.ts +13 -0
- package/dist/runtime/types/drizzle.mjs +0 -0
- package/dist/runtime/types/durable-object.d.ts +51 -0
- package/dist/runtime/types/durable-object.mjs +0 -0
- package/dist/runtime/types/email.d.ts +66 -0
- package/dist/runtime/types/email.mjs +0 -0
- package/dist/runtime/types/hyperdrive.d.ts +18 -0
- package/dist/runtime/types/hyperdrive.mjs +0 -0
- package/dist/runtime/types/imports.d.ts +58 -0
- package/dist/runtime/types/index.d.ts +156 -0
- package/dist/runtime/types/index.mjs +13 -0
- package/dist/runtime/types/queue.d.ts +67 -0
- package/dist/runtime/types/queue.mjs +0 -0
- package/dist/runtime/types/r2.d.ts +108 -0
- package/dist/runtime/types/r2.mjs +0 -0
- package/dist/runtime/types/ratelimit.d.ts +21 -0
- package/dist/runtime/types/ratelimit.mjs +0 -0
- package/dist/runtime/types/vectorize.d.ts +74 -0
- package/dist/runtime/types/vectorize.mjs +0 -0
- package/dist/runtime/vectorize.d.ts +21 -0
- package/dist/runtime/vectorize.mjs +53 -0
- package/dist/types.d.ts +2750 -0
- package/dist/types.mjs +1 -0
- package/dist/utils/agents.d.ts +8 -0
- package/dist/utils/auth-schema.d.ts +11 -0
- package/dist/utils/bindings.d.ts +16 -0
- package/dist/utils/cms-schema.d.ts +1 -0
- package/dist/utils/cms-sources.d.ts +62 -0
- package/dist/utils/drizzle.d.ts +42 -0
- package/dist/utils/jobs.d.ts +8 -0
- package/dist/utils/local-db.d.ts +28 -0
- package/dist/utils/notifications-schema.d.ts +15 -0
- package/dist/utils/payments-schema.d.ts +11 -0
- package/dist/utils/pkg.d.ts +15 -0
- package/dist/utils/queue.d.ts +8 -0
- package/dist/utils/tenants-schema.d.ts +11 -0
- package/package.json +104 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
function rangeToInterval(range = "7d") {
|
|
2
|
+
const map = {
|
|
3
|
+
"1h": "1 HOUR",
|
|
4
|
+
"24h": "24 HOUR",
|
|
5
|
+
"7d": "7 DAY",
|
|
6
|
+
"30d": "30 DAY",
|
|
7
|
+
"90d": "90 DAY"
|
|
8
|
+
};
|
|
9
|
+
return map[range] || "7 DAY";
|
|
10
|
+
}
|
|
11
|
+
function rangeToGranularity(range = "7d") {
|
|
12
|
+
if (range === "1h") return "toStartOfFiveMinutes";
|
|
13
|
+
if (range === "24h") return "toStartOfHour";
|
|
14
|
+
return "toStartOfDay";
|
|
15
|
+
}
|
|
16
|
+
export async function queryAnalytics(sql, options = {}) {
|
|
17
|
+
const accountId = options.accountId || process.env.CLOUDFLARE_ACCOUNT_ID || process.env.CF_ACCOUNT_ID;
|
|
18
|
+
const apiToken = options.apiToken || process.env.CLOUDFLARE_API_TOKEN || process.env.CF_API_TOKEN;
|
|
19
|
+
if (!accountId || !apiToken) {
|
|
20
|
+
if (process.env.NODE_ENV !== "production") {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
throw new Error(
|
|
24
|
+
"[qarpeo/analytics] Missing Cloudflare credentials. Set CLOUDFLARE_ACCOUNT_ID and CLOUDFLARE_API_TOKEN, or pass them via AnalyticsOptions."
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
const url = `https://api.cloudflare.com/client/v4/accounts/${accountId}/analytics_engine/sql`;
|
|
28
|
+
let res;
|
|
29
|
+
try {
|
|
30
|
+
res = await fetch(url, {
|
|
31
|
+
method: "POST",
|
|
32
|
+
headers: {
|
|
33
|
+
Authorization: `Bearer ${apiToken}`,
|
|
34
|
+
"Content-Type": "text/plain"
|
|
35
|
+
},
|
|
36
|
+
body: sql
|
|
37
|
+
});
|
|
38
|
+
} catch (err) {
|
|
39
|
+
if (process.env.NODE_ENV !== "production") return [];
|
|
40
|
+
throw new Error(`[qarpeo/analytics] Network error querying AE SQL API: ${err.message}`);
|
|
41
|
+
}
|
|
42
|
+
if (!res.ok) {
|
|
43
|
+
if (process.env.NODE_ENV !== "production") return [];
|
|
44
|
+
const body = await res.text().catch(() => "");
|
|
45
|
+
throw new Error(`[qarpeo/analytics] AE SQL API error ${res.status}: ${body}`);
|
|
46
|
+
}
|
|
47
|
+
const json = await res.json();
|
|
48
|
+
return json.data || [];
|
|
49
|
+
}
|
|
50
|
+
export function useAnalyticsDashboard(options = {}) {
|
|
51
|
+
const dataset = options.dataset || process.env.QARPEO_ANALYTICS_DATASET || "analytics";
|
|
52
|
+
const siteFilter = options.siteId ? `AND index1 = '${options.siteId.replace(/'/g, "''")}'` : "";
|
|
53
|
+
const query = (sql) => queryAnalytics(sql, options);
|
|
54
|
+
return {
|
|
55
|
+
/**
|
|
56
|
+
* Total pageviews and time-series breakdown.
|
|
57
|
+
*
|
|
58
|
+
* @param range Time range (default: '7d')
|
|
59
|
+
*/
|
|
60
|
+
async pageviews(range = "7d") {
|
|
61
|
+
const interval = rangeToInterval(range);
|
|
62
|
+
const granFn = rangeToGranularity(range);
|
|
63
|
+
const seriesRows = await query(`
|
|
64
|
+
SELECT
|
|
65
|
+
${granFn}(timestamp) AS date,
|
|
66
|
+
count() AS count
|
|
67
|
+
FROM ${dataset}
|
|
68
|
+
WHERE blob1 = 'pageview'
|
|
69
|
+
AND timestamp > NOW() - INTERVAL '${interval}'
|
|
70
|
+
${siteFilter}
|
|
71
|
+
GROUP BY date
|
|
72
|
+
ORDER BY date ASC
|
|
73
|
+
`);
|
|
74
|
+
const series = seriesRows.map((r) => ({
|
|
75
|
+
date: String(r.date),
|
|
76
|
+
count: Number(r.count)
|
|
77
|
+
}));
|
|
78
|
+
const total = series.reduce((s, r) => s + r.count, 0);
|
|
79
|
+
return { total, series };
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* Unique visitor count (unique session fingerprints).
|
|
83
|
+
*
|
|
84
|
+
* @param range Time range (default: '7d')
|
|
85
|
+
*/
|
|
86
|
+
async visitors(range = "7d") {
|
|
87
|
+
const interval = rangeToInterval(range);
|
|
88
|
+
const rows = await query(`
|
|
89
|
+
SELECT count(DISTINCT blob7) AS visitors
|
|
90
|
+
FROM ${dataset}
|
|
91
|
+
WHERE blob1 = 'pageview'
|
|
92
|
+
AND timestamp > NOW() - INTERVAL '${interval}'
|
|
93
|
+
${siteFilter}
|
|
94
|
+
`);
|
|
95
|
+
return Number(rows[0]?.visitors ?? 0);
|
|
96
|
+
},
|
|
97
|
+
/**
|
|
98
|
+
* Top pages by pageview count.
|
|
99
|
+
*
|
|
100
|
+
* @param limit Max results (default: 10)
|
|
101
|
+
* @param range Time range (default: '7d')
|
|
102
|
+
*/
|
|
103
|
+
async topPages(limit = 10, range = "7d") {
|
|
104
|
+
const interval = rangeToInterval(range);
|
|
105
|
+
const rows = await query(`
|
|
106
|
+
SELECT blob2 AS path, count() AS views
|
|
107
|
+
FROM ${dataset}
|
|
108
|
+
WHERE blob1 = 'pageview'
|
|
109
|
+
AND timestamp > NOW() - INTERVAL '${interval}'
|
|
110
|
+
${siteFilter}
|
|
111
|
+
GROUP BY path
|
|
112
|
+
ORDER BY views DESC
|
|
113
|
+
LIMIT ${limit}
|
|
114
|
+
`);
|
|
115
|
+
return rows.map((r) => ({ path: String(r.path || "/"), views: Number(r.views) }));
|
|
116
|
+
},
|
|
117
|
+
/**
|
|
118
|
+
* Top referrers by visit count.
|
|
119
|
+
*
|
|
120
|
+
* @param limit Max results (default: 10)
|
|
121
|
+
* @param range Time range (default: '7d')
|
|
122
|
+
*/
|
|
123
|
+
async topReferrers(limit = 10, range = "7d") {
|
|
124
|
+
const interval = rangeToInterval(range);
|
|
125
|
+
const rows = await query(`
|
|
126
|
+
SELECT blob3 AS referrer, count() AS count
|
|
127
|
+
FROM ${dataset}
|
|
128
|
+
WHERE blob1 = 'pageview'
|
|
129
|
+
AND blob3 != ''
|
|
130
|
+
AND timestamp > NOW() - INTERVAL '${interval}'
|
|
131
|
+
${siteFilter}
|
|
132
|
+
GROUP BY referrer
|
|
133
|
+
ORDER BY count DESC
|
|
134
|
+
LIMIT ${limit}
|
|
135
|
+
`);
|
|
136
|
+
return rows.map((r) => ({ referrer: String(r.referrer), count: Number(r.count) }));
|
|
137
|
+
},
|
|
138
|
+
/**
|
|
139
|
+
* Pageview breakdown by country.
|
|
140
|
+
*
|
|
141
|
+
* @param limit Max results (default: 10)
|
|
142
|
+
* @param range Time range (default: '7d')
|
|
143
|
+
*/
|
|
144
|
+
async countries(limit = 10, range = "7d") {
|
|
145
|
+
const interval = rangeToInterval(range);
|
|
146
|
+
const rows = await query(`
|
|
147
|
+
SELECT blob4 AS country, count() AS count
|
|
148
|
+
FROM ${dataset}
|
|
149
|
+
WHERE blob1 = 'pageview'
|
|
150
|
+
AND timestamp > NOW() - INTERVAL '${interval}'
|
|
151
|
+
${siteFilter}
|
|
152
|
+
GROUP BY country
|
|
153
|
+
ORDER BY count DESC
|
|
154
|
+
LIMIT ${limit}
|
|
155
|
+
`);
|
|
156
|
+
return rows.map((r) => ({ country: String(r.country || "XX"), count: Number(r.count) }));
|
|
157
|
+
},
|
|
158
|
+
/**
|
|
159
|
+
* Device type breakdown.
|
|
160
|
+
*
|
|
161
|
+
* @param range Time range (default: '7d')
|
|
162
|
+
*/
|
|
163
|
+
async devices(range = "7d") {
|
|
164
|
+
const interval = rangeToInterval(range);
|
|
165
|
+
const rows = await query(`
|
|
166
|
+
SELECT blob5 AS device, count() AS count
|
|
167
|
+
FROM ${dataset}
|
|
168
|
+
WHERE blob1 = 'pageview'
|
|
169
|
+
AND timestamp > NOW() - INTERVAL '${interval}'
|
|
170
|
+
${siteFilter}
|
|
171
|
+
GROUP BY device
|
|
172
|
+
`);
|
|
173
|
+
const result = { mobile: 0, desktop: 0, bot: 0 };
|
|
174
|
+
for (const r of rows) {
|
|
175
|
+
const d = String(r.device);
|
|
176
|
+
if (d in result) result[d] = Number(r.count);
|
|
177
|
+
}
|
|
178
|
+
return result;
|
|
179
|
+
},
|
|
180
|
+
/**
|
|
181
|
+
* Custom event breakdown.
|
|
182
|
+
*
|
|
183
|
+
* @param name Filter to a specific event name. If omitted, returns all events.
|
|
184
|
+
* @param limit Max results (default: 20)
|
|
185
|
+
* @param range Time range (default: '7d')
|
|
186
|
+
*/
|
|
187
|
+
async events(name, limit = 20, range = "7d") {
|
|
188
|
+
const interval = rangeToInterval(range);
|
|
189
|
+
const nameFilter = name ? `AND blob1 = '${name.replace(/'/g, "''")}'` : "AND blob1 != 'pageview'";
|
|
190
|
+
const rows = await query(`
|
|
191
|
+
SELECT
|
|
192
|
+
blob1 AS name,
|
|
193
|
+
count() AS count,
|
|
194
|
+
max(timestamp) AS lastSeen
|
|
195
|
+
FROM ${dataset}
|
|
196
|
+
WHERE timestamp > NOW() - INTERVAL '${interval}'
|
|
197
|
+
${nameFilter}
|
|
198
|
+
${siteFilter}
|
|
199
|
+
GROUP BY name
|
|
200
|
+
ORDER BY count DESC
|
|
201
|
+
LIMIT ${limit}
|
|
202
|
+
`);
|
|
203
|
+
return rows.map((r) => ({
|
|
204
|
+
name: String(r.name),
|
|
205
|
+
count: Number(r.count),
|
|
206
|
+
lastSeen: String(r.lastSeen)
|
|
207
|
+
}));
|
|
208
|
+
},
|
|
209
|
+
/**
|
|
210
|
+
* Returns a full KPI summary object — useful for the dashboard overview card. Runs multiple
|
|
211
|
+
* queries in parallel.
|
|
212
|
+
*
|
|
213
|
+
* @param range Time range (default: '7d')
|
|
214
|
+
*/
|
|
215
|
+
async summary(range = "7d") {
|
|
216
|
+
const [pvResult, visitors, topPages, topReferrers, countries, devices] = await Promise.all([
|
|
217
|
+
this.pageviews(range),
|
|
218
|
+
this.visitors(range),
|
|
219
|
+
this.topPages(10, range),
|
|
220
|
+
this.topReferrers(10, range),
|
|
221
|
+
this.countries(10, range),
|
|
222
|
+
this.devices(range)
|
|
223
|
+
]);
|
|
224
|
+
return {
|
|
225
|
+
pageviews: pvResult.total,
|
|
226
|
+
visitors,
|
|
227
|
+
topPages,
|
|
228
|
+
topReferrers,
|
|
229
|
+
countries,
|
|
230
|
+
devices
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { RequestEvent } from "nuxt/server";
|
|
2
|
+
import type { QarpeoSession } from "../../types/auth";
|
|
3
|
+
/** Ensures core auth tables (_qarpeo_users, _qarpeo_accounts, _qarpeo_sessions) exist in D1. */
|
|
4
|
+
export declare function ensureAuthTables(d1: any): Promise<void>;
|
|
5
|
+
export interface NormalizeOAuthProfileOptions {
|
|
6
|
+
provider: string;
|
|
7
|
+
rawUser: any;
|
|
8
|
+
tokens: any;
|
|
9
|
+
}
|
|
10
|
+
export declare function normalizeOAuthProfile({ provider, rawUser, tokens }: NormalizeOAuthProfileOptions): {
|
|
11
|
+
provider: string;
|
|
12
|
+
providerAccountId: string;
|
|
13
|
+
email: any;
|
|
14
|
+
emailVerified: boolean;
|
|
15
|
+
name: any;
|
|
16
|
+
avatarUrl: any;
|
|
17
|
+
tokens: any;
|
|
18
|
+
};
|
|
19
|
+
export interface HandleOAuthSuccessOptions {
|
|
20
|
+
event: RequestEvent;
|
|
21
|
+
provider: string;
|
|
22
|
+
user: any;
|
|
23
|
+
tokens: any;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Handles OAuth callback success:
|
|
27
|
+
*
|
|
28
|
+
* 1. Upserts user in D1 database
|
|
29
|
+
* 2. Manages account linking according to security rules
|
|
30
|
+
* 3. Triggers `qarpeo:auth:oauth:success` Nitro hook
|
|
31
|
+
* 4. Triggers `qarpeo:auth:session:create` Nitro hook
|
|
32
|
+
* 5. Issues secured session cookie
|
|
33
|
+
*/
|
|
34
|
+
export declare function handleOAuthSuccess({ event, provider, user: rawUser, tokens, }: HandleOAuthSuccessOptions): Promise<QarpeoSession>;
|
|
35
|
+
export interface DeleteAccountOptions {
|
|
36
|
+
confirm?: boolean;
|
|
37
|
+
phrase?: string;
|
|
38
|
+
turnstileToken?: string;
|
|
39
|
+
cascadeOrg?: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Permanently deletes a user account and purges all related sessions, OAuth accounts,
|
|
43
|
+
* 2FA credentials, WebAuthn authenticators, API tokens, and notification records.
|
|
44
|
+
* Throws 400 if user is sole owner of an organization and cascadeOrg is not specified.
|
|
45
|
+
*/
|
|
46
|
+
export declare function deleteUserAccount(event: any, userId: string, options?: DeleteAccountOptions): Promise<{
|
|
47
|
+
success: boolean;
|
|
48
|
+
userId: string;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Evaluates whether Multi-Factor Authentication is required for a user
|
|
52
|
+
* based on user 2FA enrollment and global/organization MFA policies.
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveMfaStatus(d1: any, user: {
|
|
55
|
+
id: string;
|
|
56
|
+
role?: string;
|
|
57
|
+
}, authConfig?: any): Promise<{
|
|
58
|
+
mfaRequired: boolean;
|
|
59
|
+
mfaVerified: boolean;
|
|
60
|
+
}>;
|
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
import { useNitroApp } from "nitro/app";
|
|
2
|
+
import { getD1Binding } from "../../db.mjs";
|
|
3
|
+
import { getQarpeoConfig } from "./config.mjs";
|
|
4
|
+
import { encryptToken } from "./crypto.mjs";
|
|
5
|
+
import { createDeviceSession, setAuthSession } from "./session.mjs";
|
|
6
|
+
let tablesEnsured = false;
|
|
7
|
+
export async function ensureAuthTables(d1) {
|
|
8
|
+
if (tablesEnsured) return;
|
|
9
|
+
await d1.batch([
|
|
10
|
+
d1.prepare(`
|
|
11
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_users (
|
|
12
|
+
id TEXT PRIMARY KEY,
|
|
13
|
+
email TEXT UNIQUE NOT NULL,
|
|
14
|
+
email_verified INTEGER DEFAULT 0,
|
|
15
|
+
name TEXT,
|
|
16
|
+
avatar_url TEXT,
|
|
17
|
+
role TEXT DEFAULT 'user',
|
|
18
|
+
created_at INTEGER NOT NULL,
|
|
19
|
+
updated_at INTEGER NOT NULL
|
|
20
|
+
)
|
|
21
|
+
`),
|
|
22
|
+
d1.prepare(`
|
|
23
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_accounts (
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
user_id TEXT NOT NULL REFERENCES _qarpeo_users(id) ON DELETE CASCADE,
|
|
26
|
+
provider TEXT NOT NULL,
|
|
27
|
+
provider_account_id TEXT NOT NULL,
|
|
28
|
+
email TEXT,
|
|
29
|
+
email_verified INTEGER DEFAULT 0,
|
|
30
|
+
access_token TEXT,
|
|
31
|
+
refresh_token TEXT,
|
|
32
|
+
expires_at INTEGER,
|
|
33
|
+
created_at INTEGER NOT NULL,
|
|
34
|
+
UNIQUE(provider, provider_account_id)
|
|
35
|
+
)
|
|
36
|
+
`),
|
|
37
|
+
d1.prepare(`
|
|
38
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_sessions (
|
|
39
|
+
id TEXT PRIMARY KEY,
|
|
40
|
+
user_id TEXT NOT NULL REFERENCES _qarpeo_users(id) ON DELETE CASCADE,
|
|
41
|
+
token_hash TEXT NOT NULL,
|
|
42
|
+
client_type TEXT DEFAULT 'web',
|
|
43
|
+
user_agent TEXT,
|
|
44
|
+
ip_address TEXT,
|
|
45
|
+
last_active INTEGER NOT NULL,
|
|
46
|
+
expires_at INTEGER NOT NULL
|
|
47
|
+
)
|
|
48
|
+
`),
|
|
49
|
+
d1.prepare(`
|
|
50
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_two_factor (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
user_id TEXT NOT NULL UNIQUE REFERENCES _qarpeo_users(id) ON DELETE CASCADE,
|
|
53
|
+
secret TEXT NOT NULL,
|
|
54
|
+
backup_codes TEXT NOT NULL,
|
|
55
|
+
enabled INTEGER DEFAULT 0,
|
|
56
|
+
created_at INTEGER NOT NULL
|
|
57
|
+
)
|
|
58
|
+
`),
|
|
59
|
+
d1.prepare(`
|
|
60
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_authenticators (
|
|
61
|
+
id TEXT PRIMARY KEY,
|
|
62
|
+
user_id TEXT NOT NULL REFERENCES _qarpeo_users(id) ON DELETE CASCADE,
|
|
63
|
+
credential_id TEXT NOT NULL UNIQUE,
|
|
64
|
+
public_key BLOB NOT NULL,
|
|
65
|
+
counter INTEGER NOT NULL DEFAULT 0,
|
|
66
|
+
transports TEXT,
|
|
67
|
+
created_at INTEGER NOT NULL
|
|
68
|
+
)
|
|
69
|
+
`),
|
|
70
|
+
d1.prepare(`
|
|
71
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_organizations (
|
|
72
|
+
id TEXT PRIMARY KEY,
|
|
73
|
+
name TEXT NOT NULL,
|
|
74
|
+
slug TEXT NOT NULL UNIQUE,
|
|
75
|
+
logo_url TEXT,
|
|
76
|
+
created_at INTEGER NOT NULL
|
|
77
|
+
)
|
|
78
|
+
`),
|
|
79
|
+
d1.prepare(`
|
|
80
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_members (
|
|
81
|
+
id TEXT PRIMARY KEY,
|
|
82
|
+
organization_id TEXT NOT NULL REFERENCES _qarpeo_organizations(id) ON DELETE CASCADE,
|
|
83
|
+
user_id TEXT NOT NULL REFERENCES _qarpeo_users(id) ON DELETE CASCADE,
|
|
84
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
85
|
+
created_at INTEGER NOT NULL,
|
|
86
|
+
UNIQUE(organization_id, user_id)
|
|
87
|
+
)
|
|
88
|
+
`),
|
|
89
|
+
d1.prepare(`
|
|
90
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_invitations (
|
|
91
|
+
id TEXT PRIMARY KEY,
|
|
92
|
+
organization_id TEXT NOT NULL REFERENCES _qarpeo_organizations(id) ON DELETE CASCADE,
|
|
93
|
+
email TEXT NOT NULL,
|
|
94
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
95
|
+
token_hash TEXT NOT NULL,
|
|
96
|
+
expires_at INTEGER NOT NULL,
|
|
97
|
+
created_at INTEGER NOT NULL
|
|
98
|
+
)
|
|
99
|
+
`),
|
|
100
|
+
d1.prepare(`
|
|
101
|
+
CREATE TABLE IF NOT EXISTS _qarpeo_api_tokens (
|
|
102
|
+
id TEXT PRIMARY KEY,
|
|
103
|
+
user_id TEXT NOT NULL REFERENCES _qarpeo_users(id) ON DELETE CASCADE,
|
|
104
|
+
name TEXT NOT NULL,
|
|
105
|
+
token_hash TEXT NOT NULL,
|
|
106
|
+
scopes TEXT DEFAULT '["*"]',
|
|
107
|
+
last_used_at INTEGER,
|
|
108
|
+
expires_at INTEGER,
|
|
109
|
+
created_at INTEGER NOT NULL
|
|
110
|
+
)
|
|
111
|
+
`),
|
|
112
|
+
// Secondary indexes for hot paths (FK lookups & session validation)
|
|
113
|
+
d1.prepare(
|
|
114
|
+
`CREATE INDEX IF NOT EXISTS _qarpeo_sessions_user_id_idx ON _qarpeo_sessions(user_id)`
|
|
115
|
+
),
|
|
116
|
+
d1.prepare(
|
|
117
|
+
`CREATE INDEX IF NOT EXISTS _qarpeo_sessions_token_hash_idx ON _qarpeo_sessions(token_hash)`
|
|
118
|
+
),
|
|
119
|
+
d1.prepare(
|
|
120
|
+
`CREATE INDEX IF NOT EXISTS _qarpeo_sessions_expires_at_idx ON _qarpeo_sessions(expires_at)`
|
|
121
|
+
),
|
|
122
|
+
d1.prepare(
|
|
123
|
+
`CREATE INDEX IF NOT EXISTS _qarpeo_accounts_user_id_idx ON _qarpeo_accounts(user_id)`
|
|
124
|
+
),
|
|
125
|
+
d1.prepare(
|
|
126
|
+
`CREATE INDEX IF NOT EXISTS _qarpeo_api_tokens_user_id_idx ON _qarpeo_api_tokens(user_id)`
|
|
127
|
+
),
|
|
128
|
+
d1.prepare(
|
|
129
|
+
`CREATE INDEX IF NOT EXISTS _qarpeo_members_user_id_idx ON _qarpeo_members(user_id)`
|
|
130
|
+
),
|
|
131
|
+
d1.prepare(
|
|
132
|
+
`CREATE INDEX IF NOT EXISTS _qarpeo_members_org_id_idx ON _qarpeo_members(organization_id)`
|
|
133
|
+
)
|
|
134
|
+
]);
|
|
135
|
+
tablesEnsured = true;
|
|
136
|
+
}
|
|
137
|
+
export function normalizeOAuthProfile({ provider, rawUser, tokens }) {
|
|
138
|
+
let email = rawUser.email || null;
|
|
139
|
+
let name = rawUser.name || rawUser.login || rawUser.username || null;
|
|
140
|
+
let avatarUrl = rawUser.avatar_url || rawUser.picture || (rawUser.avatar ? `https://cdn.discordapp.com/avatars/${rawUser.id}/${rawUser.avatar}.png` : null);
|
|
141
|
+
let providerAccountId = String(rawUser.id || rawUser.sub || "");
|
|
142
|
+
let emailVerified = Boolean(rawUser.email_verified || rawUser.verified);
|
|
143
|
+
if (provider === "github" && rawUser.email) {
|
|
144
|
+
emailVerified = Boolean(rawUser.email_verified ?? true);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
provider,
|
|
148
|
+
providerAccountId,
|
|
149
|
+
email,
|
|
150
|
+
emailVerified,
|
|
151
|
+
name,
|
|
152
|
+
avatarUrl,
|
|
153
|
+
tokens
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
export async function handleOAuthSuccess({
|
|
157
|
+
event,
|
|
158
|
+
provider,
|
|
159
|
+
user: rawUser,
|
|
160
|
+
tokens
|
|
161
|
+
}) {
|
|
162
|
+
let d1;
|
|
163
|
+
try {
|
|
164
|
+
const bindingName = globalThis.process?.env?.QARPEO_DEFAULT_DB_BINDING || "DB";
|
|
165
|
+
d1 = getD1Binding(bindingName, event);
|
|
166
|
+
await ensureAuthTables(d1);
|
|
167
|
+
} catch (err) {
|
|
168
|
+
console.warn("[qarpeo:auth] Failed to initialize D1 auth tables:", err);
|
|
169
|
+
d1 = null;
|
|
170
|
+
}
|
|
171
|
+
const profile = normalizeOAuthProfile({ provider, rawUser, tokens });
|
|
172
|
+
const authConfig = getQarpeoConfig(event).auth;
|
|
173
|
+
const linkAccounts = authConfig.linkAccounts !== false;
|
|
174
|
+
const now = Date.now();
|
|
175
|
+
let dbUser = null;
|
|
176
|
+
let isNew = false;
|
|
177
|
+
if (d1 && profile.providerAccountId) {
|
|
178
|
+
const existingAccount = await d1.prepare(
|
|
179
|
+
"SELECT * FROM _qarpeo_accounts WHERE provider = ? AND provider_account_id = ? LIMIT 1"
|
|
180
|
+
).bind(provider, profile.providerAccountId).first();
|
|
181
|
+
const encryptedAccessToken = tokens?.access_token ? await encryptToken(tokens.access_token, event) : null;
|
|
182
|
+
const encryptedRefreshToken = tokens?.refresh_token ? await encryptToken(tokens.refresh_token, event) : null;
|
|
183
|
+
if (existingAccount) {
|
|
184
|
+
dbUser = await d1.prepare("SELECT * FROM _qarpeo_users WHERE id = ? LIMIT 1").bind(existingAccount.user_id).first();
|
|
185
|
+
if (dbUser) {
|
|
186
|
+
await d1.prepare("UPDATE _qarpeo_accounts SET access_token = ?, refresh_token = ? WHERE id = ?").bind(encryptedAccessToken, encryptedRefreshToken, existingAccount.id).run();
|
|
187
|
+
await d1.prepare("UPDATE _qarpeo_users SET updated_at = ? WHERE id = ?").bind(now, dbUser.id).run();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (!dbUser && profile.email) {
|
|
191
|
+
const existingUser = await d1.prepare("SELECT * FROM _qarpeo_users WHERE email = ? LIMIT 1").bind(profile.email).first();
|
|
192
|
+
if (existingUser) {
|
|
193
|
+
const canLink = linkAccounts && Boolean(existingUser.email_verified) && Boolean(profile.emailVerified);
|
|
194
|
+
if (canLink || !linkAccounts) {
|
|
195
|
+
dbUser = existingUser;
|
|
196
|
+
const accountId = crypto.randomUUID();
|
|
197
|
+
await d1.prepare(`
|
|
198
|
+
INSERT INTO _qarpeo_accounts (id, user_id, provider, provider_account_id, email, email_verified, access_token, refresh_token, created_at)
|
|
199
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
200
|
+
`).bind(
|
|
201
|
+
accountId,
|
|
202
|
+
dbUser.id,
|
|
203
|
+
provider,
|
|
204
|
+
profile.providerAccountId,
|
|
205
|
+
profile.email,
|
|
206
|
+
profile.emailVerified ? 1 : 0,
|
|
207
|
+
encryptedAccessToken,
|
|
208
|
+
encryptedRefreshToken,
|
|
209
|
+
now
|
|
210
|
+
).run();
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (!dbUser) {
|
|
215
|
+
isNew = true;
|
|
216
|
+
const userId = crypto.randomUUID();
|
|
217
|
+
const accountId = crypto.randomUUID();
|
|
218
|
+
const userStmt = d1.prepare(`
|
|
219
|
+
INSERT INTO _qarpeo_users (id, email, email_verified, name, avatar_url, role, created_at, updated_at)
|
|
220
|
+
VALUES (?, ?, ?, ?, ?, 'user', ?, ?)
|
|
221
|
+
`).bind(
|
|
222
|
+
userId,
|
|
223
|
+
profile.email || `${provider}_${profile.providerAccountId}@qarpeo.local`,
|
|
224
|
+
profile.emailVerified ? 1 : 0,
|
|
225
|
+
profile.name || null,
|
|
226
|
+
profile.avatarUrl || null,
|
|
227
|
+
now,
|
|
228
|
+
now
|
|
229
|
+
);
|
|
230
|
+
const accountStmt = d1.prepare(`
|
|
231
|
+
INSERT INTO _qarpeo_accounts (id, user_id, provider, provider_account_id, email, email_verified, access_token, refresh_token, created_at)
|
|
232
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
233
|
+
`).bind(
|
|
234
|
+
accountId,
|
|
235
|
+
userId,
|
|
236
|
+
provider,
|
|
237
|
+
profile.providerAccountId,
|
|
238
|
+
profile.email,
|
|
239
|
+
profile.emailVerified ? 1 : 0,
|
|
240
|
+
encryptedAccessToken,
|
|
241
|
+
encryptedRefreshToken,
|
|
242
|
+
now
|
|
243
|
+
);
|
|
244
|
+
await d1.batch([userStmt, accountStmt]);
|
|
245
|
+
dbUser = {
|
|
246
|
+
id: userId,
|
|
247
|
+
email: profile.email || `${provider}_${profile.providerAccountId}@qarpeo.local`,
|
|
248
|
+
email_verified: profile.emailVerified ? 1 : 0,
|
|
249
|
+
name: profile.name,
|
|
250
|
+
avatar_url: profile.avatarUrl,
|
|
251
|
+
role: "user"
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
const finalUser = dbUser ? {
|
|
256
|
+
id: dbUser.id,
|
|
257
|
+
email: dbUser.email,
|
|
258
|
+
name: dbUser.name,
|
|
259
|
+
avatarUrl: dbUser.avatar_url,
|
|
260
|
+
emailVerified: Boolean(dbUser.email_verified),
|
|
261
|
+
role: dbUser.role || "user"
|
|
262
|
+
} : {
|
|
263
|
+
id: profile.providerAccountId || crypto.randomUUID(),
|
|
264
|
+
email: profile.email || `${provider}@qarpeo.local`,
|
|
265
|
+
name: profile.name,
|
|
266
|
+
avatarUrl: profile.avatarUrl,
|
|
267
|
+
emailVerified: profile.emailVerified,
|
|
268
|
+
role: "user"
|
|
269
|
+
};
|
|
270
|
+
const nitroApp = useNitroApp();
|
|
271
|
+
await nitroApp.hooks?.callHook("qarpeo:auth:oauth:success", {
|
|
272
|
+
event,
|
|
273
|
+
provider,
|
|
274
|
+
user: { ...finalUser, isNew },
|
|
275
|
+
tokens
|
|
276
|
+
});
|
|
277
|
+
const sessionData = {
|
|
278
|
+
user: finalUser,
|
|
279
|
+
provider,
|
|
280
|
+
loggedInAt: now,
|
|
281
|
+
tenantId: event?.context?.tenant?.id ?? void 0
|
|
282
|
+
};
|
|
283
|
+
await nitroApp.hooks?.callHook("qarpeo:auth:session:create", {
|
|
284
|
+
event,
|
|
285
|
+
user: finalUser,
|
|
286
|
+
session: sessionData
|
|
287
|
+
});
|
|
288
|
+
const sessionCfg = authConfig.session || {};
|
|
289
|
+
try {
|
|
290
|
+
const deviceSession = await createDeviceSession(event, finalUser, {
|
|
291
|
+
provider,
|
|
292
|
+
maxAge: sessionCfg.maxAge || 604800,
|
|
293
|
+
maxSessionsPerUser: sessionCfg.maxSessionsPerUser ?? 5,
|
|
294
|
+
backend: sessionCfg.backend || "cookie"
|
|
295
|
+
});
|
|
296
|
+
sessionData.sessionId = deviceSession.sessionId;
|
|
297
|
+
} catch (err) {
|
|
298
|
+
console.warn("[qarpeo:auth] Failed to register device session:", err);
|
|
299
|
+
}
|
|
300
|
+
await setAuthSession(event, sessionData);
|
|
301
|
+
return sessionData;
|
|
302
|
+
}
|
|
303
|
+
export async function deleteUserAccount(event, userId, options = {}) {
|
|
304
|
+
let d1;
|
|
305
|
+
try {
|
|
306
|
+
const bindingName = globalThis.process?.env?.QARPEO_DEFAULT_DB_BINDING || "DB";
|
|
307
|
+
d1 = getD1Binding(bindingName, event);
|
|
308
|
+
} catch {
|
|
309
|
+
d1 = null;
|
|
310
|
+
}
|
|
311
|
+
if (d1) {
|
|
312
|
+
const memberships = await d1.prepare("SELECT m.organization_id, m.role, o.name as org_name FROM _qarpeo_members m LEFT JOIN _qarpeo_organizations o ON m.organization_id = o.id WHERE m.user_id = ? AND m.role = 'owner'").bind(userId).all();
|
|
313
|
+
const ownedOrgs = memberships.results || [];
|
|
314
|
+
for (const org of ownedOrgs) {
|
|
315
|
+
const otherOwners = await d1.prepare("SELECT COUNT(*) as count FROM _qarpeo_members WHERE organization_id = ? AND role = 'owner' AND user_id != ?").bind(org.organization_id, userId).first();
|
|
316
|
+
const otherOwnerCount = Number(otherOwners?.count || 0);
|
|
317
|
+
if (otherOwnerCount === 0) {
|
|
318
|
+
if (options.cascadeOrg) {
|
|
319
|
+
await d1.prepare("DELETE FROM _qarpeo_organizations WHERE id = ?").bind(org.organization_id).run();
|
|
320
|
+
} else {
|
|
321
|
+
throw new Error(
|
|
322
|
+
`Cannot delete account: You are the sole owner of organization "${org.org_name || org.organization_id}". Transfer ownership or delete the organization first, or pass cascadeOrg: true.`
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
try {
|
|
328
|
+
await d1.prepare("DELETE FROM _qarpeo_notifications WHERE user_id = ?").bind(userId).run();
|
|
329
|
+
await d1.prepare("DELETE FROM _qarpeo_push_subscriptions WHERE user_id = ?").bind(userId).run();
|
|
330
|
+
} catch {
|
|
331
|
+
}
|
|
332
|
+
await d1.prepare("DELETE FROM _qarpeo_users WHERE id = ?").bind(userId).run();
|
|
333
|
+
}
|
|
334
|
+
try {
|
|
335
|
+
const nitroApp = useNitroApp();
|
|
336
|
+
await nitroApp.hooks?.callHook("qarpeo:auth:account:delete", {
|
|
337
|
+
event,
|
|
338
|
+
userId
|
|
339
|
+
});
|
|
340
|
+
} catch {
|
|
341
|
+
}
|
|
342
|
+
return { success: true, userId };
|
|
343
|
+
}
|
|
344
|
+
export async function resolveMfaStatus(d1, user, authConfig = {}) {
|
|
345
|
+
let userHas2FA = false;
|
|
346
|
+
if (d1 && user?.id) {
|
|
347
|
+
try {
|
|
348
|
+
const twoFa = await d1.prepare("SELECT enabled FROM _qarpeo_two_factor WHERE user_id = ? AND enabled = 1 LIMIT 1").bind(user.id).first();
|
|
349
|
+
userHas2FA = Boolean(twoFa?.enabled);
|
|
350
|
+
} catch {
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const mfaCfg = typeof authConfig.mfa === "object" ? authConfig.mfa : {};
|
|
354
|
+
const roleEnforced = mfaCfg.enforce === "role" && Array.isArray(mfaCfg.roles) && mfaCfg.roles.includes(user.role || "user");
|
|
355
|
+
const globalEnforced = mfaCfg.enforce === true;
|
|
356
|
+
const required = userHas2FA || globalEnforced || roleEnforced;
|
|
357
|
+
return {
|
|
358
|
+
mfaRequired: required,
|
|
359
|
+
mfaVerified: !required
|
|
360
|
+
};
|
|
361
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared in-memory Blob/R2 store for local development and preview mode. Attached to globalThis to
|
|
3
|
+
* ensure cross-chunk persistence in Nitro/Vite.
|
|
4
|
+
*/
|
|
5
|
+
export interface DevMockBlobItem {
|
|
6
|
+
key: string;
|
|
7
|
+
size: number;
|
|
8
|
+
contentType: string;
|
|
9
|
+
uploaded: string;
|
|
10
|
+
data?: Uint8Array;
|
|
11
|
+
access?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare function getDevMockBlobStore(): Map<string, DevMockBlobItem>;
|