@wizeworks/lens-cloud 0.3.0-alpha.1 → 0.3.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -5
- package/dist/alerts/evaluate.d.ts.map +1 -1
- package/dist/alerts/evaluate.js +20 -6
- package/dist/alerts/evaluate.js.map +1 -1
- package/dist/alerts/notify.d.ts +13 -2
- package/dist/alerts/notify.d.ts.map +1 -1
- package/dist/alerts/notify.js +22 -16
- package/dist/alerts/notify.js.map +1 -1
- package/dist/app.d.ts +16 -2
- package/dist/app.d.ts.map +1 -1
- package/dist/auth/auth.d.ts +51 -0
- package/dist/auth/auth.d.ts.map +1 -0
- package/dist/auth/auth.js +63 -0
- package/dist/auth/auth.js.map +1 -0
- package/dist/auth/bridge.d.ts +7 -0
- package/dist/auth/bridge.d.ts.map +1 -0
- package/dist/auth/bridge.js +39 -0
- package/dist/auth/bridge.js.map +1 -0
- package/dist/auth/crypto.d.ts +0 -5
- package/dist/auth/crypto.d.ts.map +1 -1
- package/dist/auth/crypto.js +3 -20
- package/dist/auth/crypto.js.map +1 -1
- package/dist/auth/delete-user.d.ts +16 -0
- package/dist/auth/delete-user.d.ts.map +1 -0
- package/dist/auth/delete-user.js +21 -0
- package/dist/auth/delete-user.js.map +1 -0
- package/dist/auth/deps.d.ts +27 -0
- package/dist/auth/deps.d.ts.map +1 -0
- package/dist/auth/deps.js +3 -0
- package/dist/auth/deps.js.map +1 -0
- package/dist/auth/email-token.d.ts +8 -0
- package/dist/auth/email-token.d.ts.map +1 -0
- package/dist/auth/email-token.js +15 -0
- package/dist/auth/email-token.js.map +1 -0
- package/dist/auth/hooks.d.ts +4 -0
- package/dist/auth/hooks.d.ts.map +1 -0
- package/dist/auth/hooks.js +143 -0
- package/dist/auth/hooks.js.map +1 -0
- package/dist/auth/join-scope.d.ts +7 -0
- package/dist/auth/join-scope.d.ts.map +1 -0
- package/dist/auth/join-scope.js +17 -0
- package/dist/auth/join-scope.js.map +1 -0
- package/dist/auth/options.d.ts +17 -0
- package/dist/auth/options.d.ts.map +1 -0
- package/dist/auth/options.js +98 -0
- package/dist/auth/options.js.map +1 -0
- package/dist/auth/password.d.ts +10 -0
- package/dist/auth/password.d.ts.map +1 -0
- package/dist/auth/password.js +22 -0
- package/dist/auth/password.js.map +1 -0
- package/dist/auth/plugins.d.ts +4 -0
- package/dist/auth/plugins.d.ts.map +1 -0
- package/dist/auth/plugins.js +45 -0
- package/dist/auth/plugins.js.map +1 -0
- package/dist/auth/principal.d.ts +8 -3
- package/dist/auth/principal.d.ts.map +1 -1
- package/dist/auth/principal.js +13 -8
- package/dist/auth/principal.js.map +1 -1
- package/dist/auth/roles.d.ts +43 -3
- package/dist/auth/roles.d.ts.map +1 -1
- package/dist/auth/roles.js +15 -6
- package/dist/auth/roles.js.map +1 -1
- package/dist/auth/schema-names.d.ts +130 -0
- package/dist/auth/schema-names.d.ts.map +1 -0
- package/dist/auth/schema-names.js +53 -0
- package/dist/auth/schema-names.js.map +1 -0
- package/dist/auth/secret.d.ts +12 -0
- package/dist/auth/secret.d.ts.map +1 -0
- package/dist/auth/secret.js +32 -0
- package/dist/auth/secret.js.map +1 -0
- package/dist/auth/security-notices.d.ts +34 -0
- package/dist/auth/security-notices.d.ts.map +1 -0
- package/dist/auth/security-notices.js +81 -0
- package/dist/auth/security-notices.js.map +1 -0
- package/dist/auth/signup.d.ts +23 -0
- package/dist/auth/signup.d.ts.map +1 -0
- package/dist/auth/signup.js +61 -0
- package/dist/auth/signup.js.map +1 -0
- package/dist/auth/sso.d.ts +21 -0
- package/dist/auth/sso.d.ts.map +1 -0
- package/dist/auth/sso.js +35 -0
- package/dist/auth/sso.js.map +1 -0
- package/dist/auth/wire.d.ts +16 -0
- package/dist/auth/wire.d.ts.map +1 -0
- package/dist/auth/wire.js +47 -0
- package/dist/auth/wire.js.map +1 -0
- package/dist/changes.d.ts +15 -0
- package/dist/changes.d.ts.map +1 -0
- package/dist/changes.js +45 -0
- package/dist/changes.js.map +1 -0
- package/dist/cli-args.d.ts +1 -1
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +66 -14
- package/dist/cli-args.js.map +1 -1
- package/dist/cli.js +22 -2
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +30 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +37 -0
- package/dist/config.js.map +1 -1
- package/dist/copy-cli.d.ts +3 -0
- package/dist/copy-cli.d.ts.map +1 -0
- package/dist/copy-cli.js +24 -0
- package/dist/copy-cli.js.map +1 -0
- package/dist/db/db.d.ts +7 -2
- package/dist/db/db.d.ts.map +1 -1
- package/dist/db/db.js +28 -10
- package/dist/db/db.js.map +1 -1
- package/dist/db/migrate.d.ts +2 -2
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +15 -5
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema-auth.d.ts +2 -0
- package/dist/db/schema-auth.d.ts.map +1 -0
- package/dist/db/schema-auth.js +93 -0
- package/dist/db/schema-auth.js.map +1 -0
- package/dist/db/schema-mail.d.ts +2 -0
- package/dist/db/schema-mail.d.ts.map +1 -0
- package/dist/db/schema-mail.js +8 -0
- package/dist/db/schema-mail.js.map +1 -0
- package/dist/db/schema-notify.d.ts +2 -0
- package/dist/db/schema-notify.d.ts.map +1 -0
- package/dist/db/schema-notify.js +26 -0
- package/dist/db/schema-notify.js.map +1 -0
- package/dist/db/schema-search.d.ts +2 -0
- package/dist/db/schema-search.d.ts.map +1 -0
- package/dist/db/schema-search.js +16 -0
- package/dist/db/schema-search.js.map +1 -0
- package/dist/db/schema-sso.d.ts +2 -0
- package/dist/db/schema-sso.d.ts.map +1 -0
- package/dist/db/schema-sso.js +17 -0
- package/dist/db/schema-sso.js.map +1 -0
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +10 -0
- package/dist/db/schema.js.map +1 -1
- package/dist/db/trigram.d.ts +4 -0
- package/dist/db/trigram.d.ts.map +1 -0
- package/dist/db/trigram.js +34 -0
- package/dist/db/trigram.js.map +1 -0
- package/dist/http/http.d.ts +2 -0
- package/dist/http/http.d.ts.map +1 -1
- package/dist/http/http.js +7 -3
- package/dist/http/http.js.map +1 -1
- package/dist/jobs.d.ts +1 -1
- package/dist/jobs.d.ts.map +1 -1
- package/dist/jobs.js +23 -11
- package/dist/jobs.js.map +1 -1
- package/dist/mail/blocks.d.ts +14 -0
- package/dist/mail/blocks.d.ts.map +1 -0
- package/dist/mail/blocks.js +35 -0
- package/dist/mail/blocks.js.map +1 -0
- package/dist/mail/content.d.ts +68 -0
- package/dist/mail/content.d.ts.map +1 -0
- package/dist/mail/content.js +6 -0
- package/dist/mail/content.js.map +1 -0
- package/dist/mail/emails-digest.d.ts +10 -0
- package/dist/mail/emails-digest.d.ts.map +1 -0
- package/dist/mail/emails-digest.js +55 -0
- package/dist/mail/emails-digest.js.map +1 -0
- package/dist/mail/emails-health.d.ts +6 -0
- package/dist/mail/emails-health.d.ts.map +1 -0
- package/dist/mail/emails-health.js +36 -0
- package/dist/mail/emails-health.js.map +1 -0
- package/dist/mail/emails-security.d.ts +14 -0
- package/dist/mail/emails-security.d.ts.map +1 -0
- package/dist/mail/emails-security.js +27 -0
- package/dist/mail/emails-security.js.map +1 -0
- package/dist/mail/emails-team.d.ts +11 -0
- package/dist/mail/emails-team.d.ts.map +1 -0
- package/dist/mail/emails-team.js +45 -0
- package/dist/mail/emails-team.js.map +1 -0
- package/dist/mail/emails.d.ts +9 -0
- package/dist/mail/emails.d.ts.map +1 -0
- package/dist/mail/emails.js +49 -0
- package/dist/mail/emails.js.map +1 -0
- package/dist/mail/layout.d.ts +6 -0
- package/dist/mail/layout.d.ts.map +1 -0
- package/dist/mail/layout.js +10 -0
- package/dist/mail/layout.js.map +1 -0
- package/dist/mail/mailer.d.ts +25 -0
- package/dist/mail/mailer.d.ts.map +1 -0
- package/dist/mail/mailer.js +50 -0
- package/dist/mail/mailer.js.map +1 -0
- package/dist/mail/preview.d.ts +6 -0
- package/dist/mail/preview.d.ts.map +1 -0
- package/dist/mail/preview.js +26 -0
- package/dist/mail/preview.js.map +1 -0
- package/dist/mail/resend.d.ts +13 -0
- package/dist/mail/resend.d.ts.map +1 -0
- package/dist/mail/resend.js +34 -0
- package/dist/mail/resend.js.map +1 -0
- package/dist/mail/samples.d.ts +3 -0
- package/dist/mail/samples.d.ts.map +1 -0
- package/dist/mail/samples.js +63 -0
- package/dist/mail/samples.js.map +1 -0
- package/dist/mail/stop-route.d.ts +4 -0
- package/dist/mail/stop-route.d.ts.map +1 -0
- package/dist/mail/stop-route.js +41 -0
- package/dist/mail/stop-route.js.map +1 -0
- package/dist/mail/svix.d.ts +8 -0
- package/dist/mail/svix.d.ts.map +1 -0
- package/dist/mail/svix.js +17 -0
- package/dist/mail/svix.js.map +1 -0
- package/dist/mail/templates.d.ts +12 -0
- package/dist/mail/templates.d.ts.map +1 -0
- package/dist/mail/templates.js +18 -0
- package/dist/mail/templates.js.map +1 -0
- package/dist/mail/text.d.ts +4 -0
- package/dist/mail/text.d.ts.map +1 -0
- package/dist/mail/text.js +17 -0
- package/dist/mail/text.js.map +1 -0
- package/dist/mail/theme.d.ts +32 -0
- package/dist/mail/theme.d.ts.map +1 -0
- package/dist/mail/theme.js +27 -0
- package/dist/mail/theme.js.map +1 -0
- package/dist/mail/unsubscribe.d.ts +14 -0
- package/dist/mail/unsubscribe.d.ts.map +1 -0
- package/dist/mail/unsubscribe.js +39 -0
- package/dist/mail/unsubscribe.js.map +1 -0
- package/dist/mail/webhook.d.ts +5 -0
- package/dist/mail/webhook.d.ts.map +1 -0
- package/dist/mail/webhook.js +41 -0
- package/dist/mail/webhook.js.map +1 -0
- package/dist/notify/digest-data.d.ts +32 -0
- package/dist/notify/digest-data.d.ts.map +1 -0
- package/dist/notify/digest-data.js +31 -0
- package/dist/notify/digest-data.js.map +1 -0
- package/dist/notify/digest.d.ts +17 -0
- package/dist/notify/digest.d.ts.map +1 -0
- package/dist/notify/digest.js +76 -0
- package/dist/notify/digest.js.map +1 -0
- package/dist/notify/health.d.ts +6 -0
- package/dist/notify/health.d.ts.map +1 -0
- package/dist/notify/health.js +42 -0
- package/dist/notify/health.js.map +1 -0
- package/dist/notify/team-describe.d.ts +22 -0
- package/dist/notify/team-describe.d.ts.map +1 -0
- package/dist/notify/team-describe.js +67 -0
- package/dist/notify/team-describe.js.map +1 -0
- package/dist/notify/team.d.ts +6 -0
- package/dist/notify/team.d.ts.map +1 -0
- package/dist/notify/team.js +56 -0
- package/dist/notify/team.js.map +1 -0
- package/dist/repo/alerts.d.ts +6 -2
- package/dist/repo/alerts.d.ts.map +1 -1
- package/dist/repo/alerts.js.map +1 -1
- package/dist/repo/auth-prune.d.ts +4 -0
- package/dist/repo/auth-prune.d.ts.map +1 -0
- package/dist/repo/auth-prune.js +8 -0
- package/dist/repo/auth-prune.js.map +1 -0
- package/dist/repo/mail-prefs.d.ts +35 -0
- package/dist/repo/mail-prefs.d.ts.map +1 -0
- package/dist/repo/mail-prefs.js +34 -0
- package/dist/repo/mail-prefs.js.map +1 -0
- package/dist/repo/orgs.d.ts +15 -25
- package/dist/repo/orgs.d.ts.map +1 -1
- package/dist/repo/orgs.js +18 -60
- package/dist/repo/orgs.js.map +1 -1
- package/dist/repo/services.d.ts +6 -0
- package/dist/repo/services.d.ts.map +1 -0
- package/dist/repo/services.js +16 -0
- package/dist/repo/services.js.map +1 -0
- package/dist/repo/suppressions.d.ts +8 -0
- package/dist/repo/suppressions.d.ts.map +1 -0
- package/dist/repo/suppressions.js +16 -0
- package/dist/repo/suppressions.js.map +1 -0
- package/dist/repo/trace-join.d.ts +9 -0
- package/dist/repo/trace-join.d.ts.map +1 -0
- package/dist/repo/trace-join.js +35 -0
- package/dist/repo/trace-join.js.map +1 -0
- package/dist/repo/trace-read.d.ts +6 -13
- package/dist/repo/trace-read.d.ts.map +1 -1
- package/dist/repo/trace-read.js +8 -3
- package/dist/repo/trace-read.js.map +1 -1
- package/dist/repo/trace-write.d.ts +5 -1
- package/dist/repo/trace-write.d.ts.map +1 -1
- package/dist/repo/trace-write.js +11 -2
- package/dist/repo/trace-write.js.map +1 -1
- package/dist/repo/users.d.ts +5 -16
- package/dist/repo/users.d.ts.map +1 -1
- package/dist/repo/users.js +2 -60
- package/dist/repo/users.js.map +1 -1
- package/dist/routes/alerts.d.ts.map +1 -1
- package/dist/routes/alerts.js +23 -6
- package/dist/routes/alerts.js.map +1 -1
- package/dist/routes/changes.d.ts +4 -0
- package/dist/routes/changes.d.ts.map +1 -0
- package/dist/routes/changes.js +19 -0
- package/dist/routes/changes.js.map +1 -0
- package/dist/routes/data.d.ts.map +1 -1
- package/dist/routes/data.js +24 -9
- package/dist/routes/data.js.map +1 -1
- package/dist/routes/index.d.ts.map +1 -1
- package/dist/routes/index.js +8 -2
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/ingest.d.ts.map +1 -1
- package/dist/routes/ingest.js +7 -2
- package/dist/routes/ingest.js.map +1 -1
- package/dist/routes/mcp.d.ts.map +1 -1
- package/dist/routes/mcp.js +42 -25
- package/dist/routes/mcp.js.map +1 -1
- package/dist/routes/me.d.ts +4 -0
- package/dist/routes/me.d.ts.map +1 -0
- package/dist/routes/me.js +37 -0
- package/dist/routes/me.js.map +1 -0
- package/dist/routes/metrics.d.ts +2 -2
- package/dist/routes/metrics.d.ts.map +1 -1
- package/dist/routes/metrics.js +2 -3
- package/dist/routes/metrics.js.map +1 -1
- package/dist/routes/models.d.ts +2 -0
- package/dist/routes/models.d.ts.map +1 -1
- package/dist/routes/models.js +10 -5
- package/dist/routes/models.js.map +1 -1
- package/dist/routes/notify.d.ts +4 -0
- package/dist/routes/notify.d.ts.map +1 -0
- package/dist/routes/notify.js +55 -0
- package/dist/routes/notify.js.map +1 -0
- package/dist/routes/orgs.d.ts.map +1 -1
- package/dist/routes/orgs.js +34 -53
- package/dist/routes/orgs.js.map +1 -1
- package/dist/routes/projects.d.ts.map +1 -1
- package/dist/routes/projects.js +5 -3
- package/dist/routes/projects.js.map +1 -1
- package/dist/routes/search.d.ts +4 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +33 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/shares.d.ts.map +1 -1
- package/dist/routes/shares.js +8 -5
- package/dist/routes/shares.js.map +1 -1
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +59 -16
- package/dist/server.js.map +1 -1
- package/dist/settle.d.ts +7 -6
- package/dist/settle.d.ts.map +1 -1
- package/dist/settle.js +30 -13
- package/dist/settle.js.map +1 -1
- package/dist/telemetry/cached.d.ts +11 -0
- package/dist/telemetry/cached.d.ts.map +1 -0
- package/dist/telemetry/cached.js +30 -0
- package/dist/telemetry/cached.js.map +1 -0
- package/dist/telemetry/ch/admin.d.ts +10 -0
- package/dist/telemetry/ch/admin.d.ts.map +1 -0
- package/dist/telemetry/ch/admin.js +65 -0
- package/dist/telemetry/ch/admin.js.map +1 -0
- package/dist/telemetry/ch/http.d.ts +19 -0
- package/dist/telemetry/ch/http.d.ts.map +1 -0
- package/dist/telemetry/ch/http.js +91 -0
- package/dist/telemetry/ch/http.js.map +1 -0
- package/dist/telemetry/ch/metrics.d.ts +10 -0
- package/dist/telemetry/ch/metrics.d.ts.map +1 -0
- package/dist/telemetry/ch/metrics.js +61 -0
- package/dist/telemetry/ch/metrics.js.map +1 -0
- package/dist/telemetry/ch/queries.d.ts +19 -0
- package/dist/telemetry/ch/queries.d.ts.map +1 -0
- package/dist/telemetry/ch/queries.js +30 -0
- package/dist/telemetry/ch/queries.js.map +1 -0
- package/dist/telemetry/ch/queue.d.ts +34 -0
- package/dist/telemetry/ch/queue.d.ts.map +1 -0
- package/dist/telemetry/ch/queue.js +79 -0
- package/dist/telemetry/ch/queue.js.map +1 -0
- package/dist/telemetry/ch/read.d.ts +12 -0
- package/dist/telemetry/ch/read.d.ts.map +1 -0
- package/dist/telemetry/ch/read.js +72 -0
- package/dist/telemetry/ch/read.js.map +1 -0
- package/dist/telemetry/ch/schema-facts.d.ts +6 -0
- package/dist/telemetry/ch/schema-facts.d.ts.map +1 -0
- package/dist/telemetry/ch/schema-facts.js +49 -0
- package/dist/telemetry/ch/schema-facts.js.map +1 -0
- package/dist/telemetry/ch/schema-raw.d.ts +8 -0
- package/dist/telemetry/ch/schema-raw.d.ts.map +1 -0
- package/dist/telemetry/ch/schema-raw.js +35 -0
- package/dist/telemetry/ch/schema-raw.js.map +1 -0
- package/dist/telemetry/ch/schema-rollups.d.ts +2 -0
- package/dist/telemetry/ch/schema-rollups.d.ts.map +1 -0
- package/dist/telemetry/ch/schema-rollups.js +61 -0
- package/dist/telemetry/ch/schema-rollups.js.map +1 -0
- package/dist/telemetry/ch/schema.d.ts +12 -0
- package/dist/telemetry/ch/schema.d.ts.map +1 -0
- package/dist/telemetry/ch/schema.js +25 -0
- package/dist/telemetry/ch/schema.js.map +1 -0
- package/dist/telemetry/ch/settle-rows.d.ts +13 -0
- package/dist/telemetry/ch/settle-rows.d.ts.map +1 -0
- package/dist/telemetry/ch/settle-rows.js +67 -0
- package/dist/telemetry/ch/settle-rows.js.map +1 -0
- package/dist/telemetry/ch/settle.d.ts +7 -0
- package/dist/telemetry/ch/settle.d.ts.map +1 -0
- package/dist/telemetry/ch/settle.js +96 -0
- package/dist/telemetry/ch/settle.js.map +1 -0
- package/dist/telemetry/ch/store.d.ts +16 -0
- package/dist/telemetry/ch/store.d.ts.map +1 -0
- package/dist/telemetry/ch/store.js +65 -0
- package/dist/telemetry/ch/store.js.map +1 -0
- package/dist/telemetry/ch/util.d.ts +20 -0
- package/dist/telemetry/ch/util.d.ts.map +1 -0
- package/dist/telemetry/ch/util.js +45 -0
- package/dist/telemetry/ch/util.js.map +1 -0
- package/dist/telemetry/ch/write.d.ts +11 -0
- package/dist/telemetry/ch/write.d.ts.map +1 -0
- package/dist/telemetry/ch/write.js +59 -0
- package/dist/telemetry/ch/write.js.map +1 -0
- package/dist/telemetry/copy.d.ts +9 -0
- package/dist/telemetry/copy.d.ts.map +1 -0
- package/dist/telemetry/copy.js +60 -0
- package/dist/telemetry/copy.js.map +1 -0
- package/dist/telemetry/index.d.ts +11 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +21 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/pg-store.d.ts +5 -0
- package/dist/telemetry/pg-store.d.ts.map +1 -0
- package/dist/telemetry/pg-store.js +78 -0
- package/dist/telemetry/pg-store.js.map +1 -0
- package/dist/telemetry/store.d.ts +74 -0
- package/dist/telemetry/store.d.ts.map +1 -0
- package/dist/telemetry/store.js +2 -0
- package/dist/telemetry/store.js.map +1 -0
- package/package.json +20 -6
- package/dist/routes/auth.d.ts +0 -4
- package/dist/routes/auth.d.ts.map +0 -1
- package/dist/routes/auth.js +0 -106
- package/dist/routes/auth.js.map +0 -1
package/dist/db/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,mGAAmG;AACnG,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,EAAG,SAAQ,SAAS;IACnC,mEAAmE;IACnE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACpD,uGAAuG;IACvG,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,sGAAsG;IACtG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,CAAC;IACrC,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,EAAE,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;CACnE;AAMD,oDAAoD;AACpD,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAiC3D;AAED,0IAA0I;AAC1I,wBAAsB,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAqB1D;AAED,mFAAmF;AACnF,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAK/C"}
|
package/dist/db/db.js
CHANGED
|
@@ -4,10 +4,11 @@ const wrap = (client) => ({
|
|
|
4
4
|
/** A managed Postgres, from a `postgres://` URL. */
|
|
5
5
|
export async function openPostgres(url) {
|
|
6
6
|
const { default: pg } = await import("pg");
|
|
7
|
-
// Times are
|
|
8
|
-
const pool = new pg.Pool({ connectionString: url, max: 10 });
|
|
7
|
+
// Times are double precision (no bigint parsing); the timeouts free connections that a runaway query or a gone client holds.
|
|
8
|
+
const pool = new pg.Pool({ connectionString: url, max: 10, statement_timeout: 120_000, idle_in_transaction_session_timeout: 60_000 });
|
|
9
9
|
return {
|
|
10
10
|
kind: "postgres",
|
|
11
|
+
authDatabase: pool,
|
|
11
12
|
...wrap(pool),
|
|
12
13
|
async tx(fn) {
|
|
13
14
|
const client = await pool.connect();
|
|
@@ -25,23 +26,40 @@ export async function openPostgres(url) {
|
|
|
25
26
|
client.release();
|
|
26
27
|
}
|
|
27
28
|
},
|
|
29
|
+
async session(fn) {
|
|
30
|
+
const client = await pool.connect();
|
|
31
|
+
try {
|
|
32
|
+
return await fn(wrap(client));
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
client.release();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
28
38
|
exec: async (sql) => void (await pool.query(sql)),
|
|
29
39
|
close: () => pool.end(),
|
|
30
40
|
};
|
|
31
41
|
}
|
|
32
|
-
/**
|
|
42
|
+
/** PGlite (a folder, or memory), for tests and trials. All queries share one Kysely queue with Better Auth: PGlite has one connection. */
|
|
33
43
|
export async function openPglite(dir) {
|
|
34
|
-
const { PGlite
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
44
|
+
const [{ PGlite }, { pg_trgm }, { Kysely, CompiledQuery }, { PGliteDialect }] = await Promise.all([
|
|
45
|
+
import("@electric-sql/pglite"),
|
|
46
|
+
import("@electric-sql/pglite/contrib/pg_trgm"),
|
|
47
|
+
import("kysely"),
|
|
48
|
+
import("kysely-pglite-dialect"),
|
|
49
|
+
]);
|
|
50
|
+
const lite = await PGlite.create(dir, { extensions: { pg_trgm } });
|
|
51
|
+
const kysely = new Kysely({ dialect: new PGliteDialect(lite) });
|
|
52
|
+
const run = (k) => ({
|
|
53
|
+
query: async (sql, params = []) => (await k.executeQuery(CompiledQuery.raw(sql, params))).rows,
|
|
38
54
|
});
|
|
39
55
|
return {
|
|
40
56
|
kind: "pglite",
|
|
41
|
-
|
|
42
|
-
|
|
57
|
+
authDatabase: { db: kysely, type: "postgres", transaction: true },
|
|
58
|
+
...run(kysely),
|
|
59
|
+
tx: (fn) => kysely.transaction().execute((t) => fn(run(t))),
|
|
60
|
+
session: (fn) => fn(run(kysely)),
|
|
43
61
|
exec: async (sql) => void (await lite.exec(sql)),
|
|
44
|
-
close: () =>
|
|
62
|
+
close: () => kysely.destroy(),
|
|
45
63
|
};
|
|
46
64
|
}
|
|
47
65
|
/** "postgres://..." opens Postgres; "pglite:<folder>" or "memory" opens PGlite. */
|
package/dist/db/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"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"}
|
package/dist/db/migrate.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Db } from "./db.js";
|
|
2
2
|
/** Apply every migration not applied yet, each in its own transaction. Returns how many ran. */
|
|
3
3
|
export declare function migrate(db: Db): Promise<number>;
|
|
4
|
-
/** One migration as single statements, so it runs inside a transaction on every driver. */
|
|
5
|
-
export declare
|
|
4
|
+
/** One migration as single statements, so it runs inside a transaction on every driver. A `$$ … $$` body (a function) stays whole. */
|
|
5
|
+
export declare function splitStatements(sql: string): string[];
|
|
6
6
|
//# sourceMappingURL=migrate.d.ts.map
|
package/dist/db/migrate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAGlC,gGAAgG;AAChG,wBAAsB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAcrD;AAED,
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAGlC,gGAAgG;AAChG,wBAAsB,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAcrD;AAED,sIAAsI;AACtI,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAWrD"}
|
package/dist/db/migrate.js
CHANGED
|
@@ -17,9 +17,19 @@ export async function migrate(db) {
|
|
|
17
17
|
}
|
|
18
18
|
return ran;
|
|
19
19
|
}
|
|
20
|
-
/** One migration as single statements, so it runs inside a transaction on every driver. */
|
|
21
|
-
export
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
/** One migration as single statements, so it runs inside a transaction on every driver. A `$$ … $$` body (a function) stays whole. */
|
|
21
|
+
export function splitStatements(sql) {
|
|
22
|
+
const out = [];
|
|
23
|
+
let current = "";
|
|
24
|
+
let quoted = false;
|
|
25
|
+
for (const line of sql.split("\n")) {
|
|
26
|
+
current += `${line}\n`;
|
|
27
|
+
if ((line.match(/\$\$/g)?.length ?? 0) % 2 === 1)
|
|
28
|
+
quoted = !quoted;
|
|
29
|
+
if (!quoted && /;\s*$/.test(line))
|
|
30
|
+
(out.push(current), (current = ""));
|
|
31
|
+
}
|
|
32
|
+
out.push(current);
|
|
33
|
+
return out.map((s) => s.trim().replace(/;$/, "")).filter(Boolean);
|
|
34
|
+
}
|
|
25
35
|
//# sourceMappingURL=migrate.js.map
|
package/dist/db/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAM;IAClC,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAsB,yCAAyC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7H,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAChC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACtB,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;gBAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAClF,MAAM,CAAC,CAAC,KAAK,CAAC,uEAAuE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;IACR,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,EAAM;IAClC,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAsB,yCAAyC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7H,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,SAAS;QAChC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACtB,KAAK,MAAM,SAAS,IAAI,eAAe,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;gBAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAClF,MAAM,CAAC,CAAC,KAAK,CAAC,uEAAuE,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChH,CAAC,CAAC,CAAC;QACH,GAAG,EAAE,CAAC;IACR,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sIAAsI;AACtI,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,OAAO,IAAI,GAAG,IAAI,IAAI,CAAC;QACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,GAAG,CAAC,MAAM,CAAC;QACnE,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAClB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const AUTH_MIGRATION = "\nALTER TABLE users ADD COLUMN email_verified BOOLEAN NOT NULL DEFAULT FALSE;\nALTER TABLE users ADD COLUMN image TEXT;\nALTER TABLE users ADD COLUMN created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;\nALTER TABLE users ADD COLUMN updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;\nALTER TABLE users ADD COLUMN two_factor_enabled BOOLEAN DEFAULT FALSE;\nUPDATE users SET email = lower(email), email_verified = TRUE, created_at = to_timestamp(created_ms / 1000.0), updated_at = to_timestamp(created_ms / 1000.0);\nCREATE TABLE accounts (\n id TEXT NOT NULL PRIMARY KEY, account_id TEXT NOT NULL, provider_id TEXT NOT NULL,\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, access_token TEXT, refresh_token TEXT, id_token TEXT,\n access_token_expires_at TIMESTAMPTZ, refresh_token_expires_at TIMESTAMPTZ, scope TEXT, password TEXT,\n created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL\n);\nCREATE INDEX accounts_user_id_idx ON accounts (user_id);\nCREATE UNIQUE INDEX ux_accounts_provider_account ON accounts (provider_id, account_id);\nINSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)\n SELECT gen_random_uuid()::text, id, 'credential', id, password_hash, created_at, CURRENT_TIMESTAMP FROM users;\nALTER TABLE users DROP COLUMN password_hash;\nALTER TABLE users DROP COLUMN created_ms;\nDROP TABLE sessions;\nCREATE TABLE sessions (\n id TEXT NOT NULL PRIMARY KEY, expires_at TIMESTAMPTZ NOT NULL, token TEXT NOT NULL UNIQUE,\n created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL, ip_address TEXT, user_agent TEXT,\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, active_org_id TEXT\n);\nCREATE INDEX sessions_user_id_idx ON sessions (user_id);\nALTER TABLE orgs ADD COLUMN logo TEXT;\nALTER TABLE orgs ADD COLUMN metadata TEXT;\nALTER TABLE orgs ADD COLUMN created_at TIMESTAMPTZ;\nUPDATE orgs SET created_at = to_timestamp(created_ms / 1000.0);\nALTER TABLE orgs ALTER COLUMN created_at SET NOT NULL;\nALTER TABLE orgs DROP COLUMN created_ms;\nALTER TABLE members ADD COLUMN id TEXT;\nALTER TABLE members ADD COLUMN created_at TIMESTAMPTZ;\nUPDATE members SET id = gen_random_uuid()::text, created_at = to_timestamp(created_ms / 1000.0);\nALTER TABLE members DROP CONSTRAINT members_pkey;\nALTER TABLE members ALTER COLUMN id SET NOT NULL;\nALTER TABLE members ALTER COLUMN created_at SET NOT NULL;\nALTER TABLE members DROP COLUMN created_ms;\nALTER TABLE members ADD PRIMARY KEY (id);\nCREATE UNIQUE INDEX ux_members_org_user ON members (org_id, user_id);\nCREATE INDEX members_org_id_idx ON members (org_id);\nCREATE INDEX members_user_id_idx ON members (user_id);\nDROP INDEX ix_members_user;\nALTER TABLE invites RENAME TO legacy_invites;\nCREATE TABLE invites (\n id TEXT NOT NULL PRIMARY KEY, org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE, email TEXT NOT NULL, role TEXT,\n status TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,\n inviter_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE\n);\nCREATE INDEX invites_org_id_idx ON invites (org_id);\nCREATE INDEX invites_email_idx ON invites (email);\nINSERT INTO invites (id, org_id, email, role, status, expires_at, created_at, inviter_id)\n SELECT gen_random_uuid()::text, i.org_id, lower(i.email), i.role, 'pending', to_timestamp(i.expires_ms / 1000.0), to_timestamp(i.created_ms / 1000.0),\n COALESCE((SELECT u.id FROM users u WHERE u.id = i.created_by),\n (SELECT m.user_id FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner' ORDER BY m.created_at LIMIT 1))\n FROM legacy_invites i\n WHERE i.accepted_ms IS NULL AND i.expires_ms > extract(epoch FROM CURRENT_TIMESTAMP) * 1000\n AND EXISTS (SELECT 1 FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner');\nDROP TABLE legacy_invites;\nCREATE TABLE verifications (\n id TEXT NOT NULL PRIMARY KEY, identifier TEXT NOT NULL, value TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\nCREATE INDEX verifications_identifier_idx ON verifications (identifier);\nCREATE TABLE two_factors (\n id TEXT NOT NULL PRIMARY KEY, secret TEXT NOT NULL, backup_codes TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,\n verified BOOLEAN, failed_verification_count INTEGER, locked_until TIMESTAMPTZ\n);\nCREATE INDEX two_factors_secret_idx ON two_factors (secret);\nCREATE INDEX two_factors_user_id_idx ON two_factors (user_id);\nCREATE TABLE passkeys (\n id TEXT NOT NULL PRIMARY KEY, name TEXT, public_key TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,\n credential_id TEXT NOT NULL, counter INTEGER NOT NULL, device_type TEXT NOT NULL, backed_up BOOLEAN NOT NULL, transports TEXT,\n created_at TIMESTAMPTZ, aaguid TEXT\n);\nCREATE INDEX passkeys_user_id_idx ON passkeys (user_id);\nCREATE INDEX passkeys_credential_id_idx ON passkeys (credential_id);\nCREATE TABLE rate_limits (id TEXT NOT NULL PRIMARY KEY, key TEXT NOT NULL UNIQUE, count INTEGER NOT NULL, last_request BIGINT NOT NULL);\nCREATE TABLE cloud_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);\nCREATE FUNCTION wl_org_keeps_owner() RETURNS trigger LANGUAGE plpgsql AS $$\nDECLARE oid TEXT := COALESCE(OLD.org_id, NEW.org_id);\nBEGIN\n IF EXISTS (SELECT 1 FROM orgs WHERE id = oid) AND NOT EXISTS (SELECT 1 FROM members WHERE org_id = oid AND role = 'owner') THEN\n RAISE EXCEPTION 'organization % must keep at least one owner', oid USING ERRCODE = 'check_violation';\n END IF;\n RETURN NULL;\nEND $$;\nCREATE CONSTRAINT TRIGGER members_keep_owner AFTER UPDATE OR DELETE ON members\n DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION wl_org_keeps_owner();\n";
|
|
2
|
+
//# sourceMappingURL=schema-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-auth.d.ts","sourceRoot":"","sources":["../../src/db/schema-auth.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,8xLA0F1B,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Migration 4: accounts move to Better Auth (names in auth/schema-names.ts). Rows and ids stay; sessions start over; invites get new links.
|
|
2
|
+
export const AUTH_MIGRATION = `
|
|
3
|
+
ALTER TABLE users ADD COLUMN email_verified BOOLEAN NOT NULL DEFAULT FALSE;
|
|
4
|
+
ALTER TABLE users ADD COLUMN image TEXT;
|
|
5
|
+
ALTER TABLE users ADD COLUMN created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
|
6
|
+
ALTER TABLE users ADD COLUMN updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
|
|
7
|
+
ALTER TABLE users ADD COLUMN two_factor_enabled BOOLEAN DEFAULT FALSE;
|
|
8
|
+
UPDATE users SET email = lower(email), email_verified = TRUE, created_at = to_timestamp(created_ms / 1000.0), updated_at = to_timestamp(created_ms / 1000.0);
|
|
9
|
+
CREATE TABLE accounts (
|
|
10
|
+
id TEXT NOT NULL PRIMARY KEY, account_id TEXT NOT NULL, provider_id TEXT NOT NULL,
|
|
11
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, access_token TEXT, refresh_token TEXT, id_token TEXT,
|
|
12
|
+
access_token_expires_at TIMESTAMPTZ, refresh_token_expires_at TIMESTAMPTZ, scope TEXT, password TEXT,
|
|
13
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL
|
|
14
|
+
);
|
|
15
|
+
CREATE INDEX accounts_user_id_idx ON accounts (user_id);
|
|
16
|
+
CREATE UNIQUE INDEX ux_accounts_provider_account ON accounts (provider_id, account_id);
|
|
17
|
+
INSERT INTO accounts (id, account_id, provider_id, user_id, password, created_at, updated_at)
|
|
18
|
+
SELECT gen_random_uuid()::text, id, 'credential', id, password_hash, created_at, CURRENT_TIMESTAMP FROM users;
|
|
19
|
+
ALTER TABLE users DROP COLUMN password_hash;
|
|
20
|
+
ALTER TABLE users DROP COLUMN created_ms;
|
|
21
|
+
DROP TABLE sessions;
|
|
22
|
+
CREATE TABLE sessions (
|
|
23
|
+
id TEXT NOT NULL PRIMARY KEY, expires_at TIMESTAMPTZ NOT NULL, token TEXT NOT NULL UNIQUE,
|
|
24
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL, ip_address TEXT, user_agent TEXT,
|
|
25
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, active_org_id TEXT
|
|
26
|
+
);
|
|
27
|
+
CREATE INDEX sessions_user_id_idx ON sessions (user_id);
|
|
28
|
+
ALTER TABLE orgs ADD COLUMN logo TEXT;
|
|
29
|
+
ALTER TABLE orgs ADD COLUMN metadata TEXT;
|
|
30
|
+
ALTER TABLE orgs ADD COLUMN created_at TIMESTAMPTZ;
|
|
31
|
+
UPDATE orgs SET created_at = to_timestamp(created_ms / 1000.0);
|
|
32
|
+
ALTER TABLE orgs ALTER COLUMN created_at SET NOT NULL;
|
|
33
|
+
ALTER TABLE orgs DROP COLUMN created_ms;
|
|
34
|
+
ALTER TABLE members ADD COLUMN id TEXT;
|
|
35
|
+
ALTER TABLE members ADD COLUMN created_at TIMESTAMPTZ;
|
|
36
|
+
UPDATE members SET id = gen_random_uuid()::text, created_at = to_timestamp(created_ms / 1000.0);
|
|
37
|
+
ALTER TABLE members DROP CONSTRAINT members_pkey;
|
|
38
|
+
ALTER TABLE members ALTER COLUMN id SET NOT NULL;
|
|
39
|
+
ALTER TABLE members ALTER COLUMN created_at SET NOT NULL;
|
|
40
|
+
ALTER TABLE members DROP COLUMN created_ms;
|
|
41
|
+
ALTER TABLE members ADD PRIMARY KEY (id);
|
|
42
|
+
CREATE UNIQUE INDEX ux_members_org_user ON members (org_id, user_id);
|
|
43
|
+
CREATE INDEX members_org_id_idx ON members (org_id);
|
|
44
|
+
CREATE INDEX members_user_id_idx ON members (user_id);
|
|
45
|
+
DROP INDEX ix_members_user;
|
|
46
|
+
ALTER TABLE invites RENAME TO legacy_invites;
|
|
47
|
+
CREATE TABLE invites (
|
|
48
|
+
id TEXT NOT NULL PRIMARY KEY, org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE, email TEXT NOT NULL, role TEXT,
|
|
49
|
+
status TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
50
|
+
inviter_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE
|
|
51
|
+
);
|
|
52
|
+
CREATE INDEX invites_org_id_idx ON invites (org_id);
|
|
53
|
+
CREATE INDEX invites_email_idx ON invites (email);
|
|
54
|
+
INSERT INTO invites (id, org_id, email, role, status, expires_at, created_at, inviter_id)
|
|
55
|
+
SELECT gen_random_uuid()::text, i.org_id, lower(i.email), i.role, 'pending', to_timestamp(i.expires_ms / 1000.0), to_timestamp(i.created_ms / 1000.0),
|
|
56
|
+
COALESCE((SELECT u.id FROM users u WHERE u.id = i.created_by),
|
|
57
|
+
(SELECT m.user_id FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner' ORDER BY m.created_at LIMIT 1))
|
|
58
|
+
FROM legacy_invites i
|
|
59
|
+
WHERE i.accepted_ms IS NULL AND i.expires_ms > extract(epoch FROM CURRENT_TIMESTAMP) * 1000
|
|
60
|
+
AND EXISTS (SELECT 1 FROM members m WHERE m.org_id = i.org_id AND m.role = 'owner');
|
|
61
|
+
DROP TABLE legacy_invites;
|
|
62
|
+
CREATE TABLE verifications (
|
|
63
|
+
id TEXT NOT NULL PRIMARY KEY, identifier TEXT NOT NULL, value TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL,
|
|
64
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
65
|
+
);
|
|
66
|
+
CREATE INDEX verifications_identifier_idx ON verifications (identifier);
|
|
67
|
+
CREATE TABLE two_factors (
|
|
68
|
+
id TEXT NOT NULL PRIMARY KEY, secret TEXT NOT NULL, backup_codes TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
69
|
+
verified BOOLEAN, failed_verification_count INTEGER, locked_until TIMESTAMPTZ
|
|
70
|
+
);
|
|
71
|
+
CREATE INDEX two_factors_secret_idx ON two_factors (secret);
|
|
72
|
+
CREATE INDEX two_factors_user_id_idx ON two_factors (user_id);
|
|
73
|
+
CREATE TABLE passkeys (
|
|
74
|
+
id TEXT NOT NULL PRIMARY KEY, name TEXT, public_key TEXT NOT NULL, user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
|
75
|
+
credential_id TEXT NOT NULL, counter INTEGER NOT NULL, device_type TEXT NOT NULL, backed_up BOOLEAN NOT NULL, transports TEXT,
|
|
76
|
+
created_at TIMESTAMPTZ, aaguid TEXT
|
|
77
|
+
);
|
|
78
|
+
CREATE INDEX passkeys_user_id_idx ON passkeys (user_id);
|
|
79
|
+
CREATE INDEX passkeys_credential_id_idx ON passkeys (credential_id);
|
|
80
|
+
CREATE TABLE rate_limits (id TEXT NOT NULL PRIMARY KEY, key TEXT NOT NULL UNIQUE, count INTEGER NOT NULL, last_request BIGINT NOT NULL);
|
|
81
|
+
CREATE TABLE cloud_meta (key TEXT PRIMARY KEY, value TEXT NOT NULL);
|
|
82
|
+
CREATE FUNCTION wl_org_keeps_owner() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
83
|
+
DECLARE oid TEXT := COALESCE(OLD.org_id, NEW.org_id);
|
|
84
|
+
BEGIN
|
|
85
|
+
IF EXISTS (SELECT 1 FROM orgs WHERE id = oid) AND NOT EXISTS (SELECT 1 FROM members WHERE org_id = oid AND role = 'owner') THEN
|
|
86
|
+
RAISE EXCEPTION 'organization % must keep at least one owner', oid USING ERRCODE = 'check_violation';
|
|
87
|
+
END IF;
|
|
88
|
+
RETURN NULL;
|
|
89
|
+
END $$;
|
|
90
|
+
CREATE CONSTRAINT TRIGGER members_keep_owner AFTER UPDATE OR DELETE ON members
|
|
91
|
+
DEFERRABLE INITIALLY DEFERRED FOR EACH ROW EXECUTE FUNCTION wl_org_keeps_owner();
|
|
92
|
+
`;
|
|
93
|
+
//# sourceMappingURL=schema-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-auth.js","sourceRoot":"","sources":["../../src/db/schema-auth.ts"],"names":[],"mappings":"AAAA,4IAA4I;AAC5I,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F7B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const MAIL_MIGRATION = "\nCREATE TABLE mail_suppressions (\n email TEXT NOT NULL PRIMARY KEY, reason TEXT NOT NULL CHECK (reason IN ('bounce', 'complaint')), detail TEXT NOT NULL,\n created_ms DOUBLE PRECISION NOT NULL\n);\n";
|
|
2
|
+
//# sourceMappingURL=schema-mail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-mail.d.ts","sourceRoot":"","sources":["../../src/db/schema-mail.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,+MAK1B,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Migration 6: addresses mail must skip. A hard bounce skips every email; a spam complaint skips all but mail the person asked for.
|
|
2
|
+
export const MAIL_MIGRATION = `
|
|
3
|
+
CREATE TABLE mail_suppressions (
|
|
4
|
+
email TEXT NOT NULL PRIMARY KEY, reason TEXT NOT NULL CHECK (reason IN ('bounce', 'complaint')), detail TEXT NOT NULL,
|
|
5
|
+
created_ms DOUBLE PRECISION NOT NULL
|
|
6
|
+
);
|
|
7
|
+
`;
|
|
8
|
+
//# sourceMappingURL=schema-mail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-mail.js","sourceRoot":"","sources":["../../src/db/schema-mail.ts"],"names":[],"mappings":"AAAA,oIAAoI;AACpI,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;CAK7B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const NOTIFY_MIGRATION = "\nALTER TABLE audit ADD COLUMN noticed BOOLEAN NOT NULL DEFAULT TRUE;\nALTER TABLE audit ALTER COLUMN noticed SET DEFAULT FALSE;\nCREATE INDEX ix_audit_unnoticed ON audit (time_ms) WHERE NOT noticed;\nCREATE TABLE mail_prefs (\n user_id TEXT NOT NULL PRIMARY KEY REFERENCES users (id) ON DELETE CASCADE, team BOOLEAN NOT NULL DEFAULT TRUE,\n health BOOLEAN NOT NULL DEFAULT TRUE, digests BOOLEAN NOT NULL DEFAULT TRUE, time_zone TEXT NOT NULL DEFAULT 'UTC', digest_hour SMALLINT NOT NULL DEFAULT 8\n);\nCREATE TABLE digest_prefs (\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,\n daily BOOLEAN NOT NULL, weekly BOOLEAN NOT NULL, monthly BOOLEAN NOT NULL, PRIMARY KEY (user_id, project_id)\n);\nCREATE TABLE digest_sends (\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,\n period TEXT NOT NULL, period_key TEXT NOT NULL, sent_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, project_id, period, period_key)\n);\nCREATE TABLE known_devices (\n user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, device TEXT NOT NULL, first_ms DOUBLE PRECISION NOT NULL,\n last_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, device)\n);\nCREATE TABLE project_health (\n project_id TEXT NOT NULL PRIMARY KEY REFERENCES projects (id) ON DELETE CASCADE, quiet BOOLEAN NOT NULL, changed_ms DOUBLE PRECISION NOT NULL\n);\n";
|
|
2
|
+
//# sourceMappingURL=schema-notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-notify.d.ts","sourceRoot":"","sources":["../../src/db/schema-notify.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,g+CAuB5B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Migration 7: notices and digests. Old audit lines count as noticed, so an upgrade sends nothing for the past.
|
|
2
|
+
export const NOTIFY_MIGRATION = `
|
|
3
|
+
ALTER TABLE audit ADD COLUMN noticed BOOLEAN NOT NULL DEFAULT TRUE;
|
|
4
|
+
ALTER TABLE audit ALTER COLUMN noticed SET DEFAULT FALSE;
|
|
5
|
+
CREATE INDEX ix_audit_unnoticed ON audit (time_ms) WHERE NOT noticed;
|
|
6
|
+
CREATE TABLE mail_prefs (
|
|
7
|
+
user_id TEXT NOT NULL PRIMARY KEY REFERENCES users (id) ON DELETE CASCADE, team BOOLEAN NOT NULL DEFAULT TRUE,
|
|
8
|
+
health BOOLEAN NOT NULL DEFAULT TRUE, digests BOOLEAN NOT NULL DEFAULT TRUE, time_zone TEXT NOT NULL DEFAULT 'UTC', digest_hour SMALLINT NOT NULL DEFAULT 8
|
|
9
|
+
);
|
|
10
|
+
CREATE TABLE digest_prefs (
|
|
11
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
12
|
+
daily BOOLEAN NOT NULL, weekly BOOLEAN NOT NULL, monthly BOOLEAN NOT NULL, PRIMARY KEY (user_id, project_id)
|
|
13
|
+
);
|
|
14
|
+
CREATE TABLE digest_sends (
|
|
15
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, project_id TEXT NOT NULL REFERENCES projects (id) ON DELETE CASCADE,
|
|
16
|
+
period TEXT NOT NULL, period_key TEXT NOT NULL, sent_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, project_id, period, period_key)
|
|
17
|
+
);
|
|
18
|
+
CREATE TABLE known_devices (
|
|
19
|
+
user_id TEXT NOT NULL REFERENCES users (id) ON DELETE CASCADE, device TEXT NOT NULL, first_ms DOUBLE PRECISION NOT NULL,
|
|
20
|
+
last_ms DOUBLE PRECISION NOT NULL, PRIMARY KEY (user_id, device)
|
|
21
|
+
);
|
|
22
|
+
CREATE TABLE project_health (
|
|
23
|
+
project_id TEXT NOT NULL PRIMARY KEY REFERENCES projects (id) ON DELETE CASCADE, quiet BOOLEAN NOT NULL, changed_ms DOUBLE PRECISION NOT NULL
|
|
24
|
+
);
|
|
25
|
+
`;
|
|
26
|
+
//# sourceMappingURL=schema-notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-notify.js","sourceRoot":"","sources":["../../src/db/schema-notify.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;CAuB/B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const SEARCH_MIGRATION = "\nCREATE TABLE fact_search (\n project_id TEXT NOT NULL, kind TEXT NOT NULL, trace_id TEXT NOT NULL, owner TEXT NOT NULL, env TEXT NOT NULL DEFAULT '', time_ms DOUBLE PRECISION NOT NULL,\n span_id TEXT, service TEXT NOT NULL, name TEXT, method TEXT, path TEXT, route TEXT, status INTEGER, outcome TEXT, duration_ms DOUBLE PRECISION,\n level_rank SMALLINT, category TEXT, span_kind TEXT, end_user TEXT, error BOOLEAN NOT NULL, message TEXT, text TEXT NOT NULL,\n PRIMARY KEY (project_id, kind, trace_id, owner)\n);\nCREATE INDEX ix_fact_search_time ON fact_search (project_id, kind, time_ms);\nCREATE TABLE fact_attrs (\n project_id TEXT NOT NULL, trace_id TEXT NOT NULL, src TEXT NOT NULL, owner TEXT NOT NULL, key TEXT NOT NULL, value TEXT NOT NULL, num DOUBLE PRECISION\n);\nCREATE INDEX ix_fact_attrs_trace ON fact_attrs (project_id, trace_id, src, owner, key);\nCREATE INDEX ix_fact_attrs_key ON fact_attrs (project_id, key, value);\n";
|
|
2
|
+
//# sourceMappingURL=schema-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-search.d.ts","sourceRoot":"","sources":["../../src/db/schema-search.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,o7BAa5B,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Migration 8: search rows (one per request, trace, span, and log line) and attribute values, built when traces settle.
|
|
2
|
+
export const SEARCH_MIGRATION = `
|
|
3
|
+
CREATE TABLE fact_search (
|
|
4
|
+
project_id TEXT NOT NULL, kind TEXT NOT NULL, trace_id TEXT NOT NULL, owner TEXT NOT NULL, env TEXT NOT NULL DEFAULT '', time_ms DOUBLE PRECISION NOT NULL,
|
|
5
|
+
span_id TEXT, service TEXT NOT NULL, name TEXT, method TEXT, path TEXT, route TEXT, status INTEGER, outcome TEXT, duration_ms DOUBLE PRECISION,
|
|
6
|
+
level_rank SMALLINT, category TEXT, span_kind TEXT, end_user TEXT, error BOOLEAN NOT NULL, message TEXT, text TEXT NOT NULL,
|
|
7
|
+
PRIMARY KEY (project_id, kind, trace_id, owner)
|
|
8
|
+
);
|
|
9
|
+
CREATE INDEX ix_fact_search_time ON fact_search (project_id, kind, time_ms);
|
|
10
|
+
CREATE TABLE fact_attrs (
|
|
11
|
+
project_id TEXT NOT NULL, trace_id TEXT NOT NULL, src TEXT NOT NULL, owner TEXT NOT NULL, key TEXT NOT NULL, value TEXT NOT NULL, num DOUBLE PRECISION
|
|
12
|
+
);
|
|
13
|
+
CREATE INDEX ix_fact_attrs_trace ON fact_attrs (project_id, trace_id, src, owner, key);
|
|
14
|
+
CREATE INDEX ix_fact_attrs_key ON fact_attrs (project_id, key, value);
|
|
15
|
+
`;
|
|
16
|
+
//# sourceMappingURL=schema-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-search.js","sourceRoot":"","sources":["../../src/db/schema-search.ts"],"names":[],"mappings":"AAAA,wHAAwH;AACxH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;CAa/B,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export declare const SSO_MIGRATION = "\nCREATE TABLE sso_providers (\n id TEXT NOT NULL PRIMARY KEY, provider_id TEXT NOT NULL UNIQUE, issuer TEXT NOT NULL, domain TEXT NOT NULL, domain_verified BOOLEAN,\n oidc_config TEXT, saml_config TEXT, user_id TEXT REFERENCES users (id) ON DELETE SET NULL,\n org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE\n);\nCREATE INDEX sso_providers_user_id_idx ON sso_providers (user_id);\nCREATE INDEX sso_providers_org_id_idx ON sso_providers (org_id);\nCREATE FUNCTION wl_sso_accounts_go() RETURNS trigger LANGUAGE plpgsql AS $$\nBEGIN\n DELETE FROM accounts WHERE provider_id = OLD.provider_id;\n RETURN NULL;\nEND $$;\nCREATE TRIGGER sso_providers_accounts_go AFTER DELETE ON sso_providers FOR EACH ROW EXECUTE FUNCTION wl_sso_accounts_go();\n";
|
|
2
|
+
//# sourceMappingURL=schema-sso.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-sso.d.ts","sourceRoot":"","sources":["../../src/db/schema-sso.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,aAAa,0vBAczB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// Migration 5: single sign-on providers, one organization each (Better Auth's SSO plugin; names in auth/schema-names.ts).
|
|
2
|
+
export const SSO_MIGRATION = `
|
|
3
|
+
CREATE TABLE sso_providers (
|
|
4
|
+
id TEXT NOT NULL PRIMARY KEY, provider_id TEXT NOT NULL UNIQUE, issuer TEXT NOT NULL, domain TEXT NOT NULL, domain_verified BOOLEAN,
|
|
5
|
+
oidc_config TEXT, saml_config TEXT, user_id TEXT REFERENCES users (id) ON DELETE SET NULL,
|
|
6
|
+
org_id TEXT NOT NULL REFERENCES orgs (id) ON DELETE CASCADE
|
|
7
|
+
);
|
|
8
|
+
CREATE INDEX sso_providers_user_id_idx ON sso_providers (user_id);
|
|
9
|
+
CREATE INDEX sso_providers_org_id_idx ON sso_providers (org_id);
|
|
10
|
+
CREATE FUNCTION wl_sso_accounts_go() RETURNS trigger LANGUAGE plpgsql AS $$
|
|
11
|
+
BEGIN
|
|
12
|
+
DELETE FROM accounts WHERE provider_id = OLD.provider_id;
|
|
13
|
+
RETURN NULL;
|
|
14
|
+
END $$;
|
|
15
|
+
CREATE TRIGGER sso_providers_accounts_go AFTER DELETE ON sso_providers FOR EACH ROW EXECUTE FUNCTION wl_sso_accounts_go();
|
|
16
|
+
`;
|
|
17
|
+
//# sourceMappingURL=schema-sso.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-sso.js","sourceRoot":"","sources":["../../src/db/schema-sso.ts"],"names":[],"mappings":"AAAA,0HAA0H;AAC1H,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;CAc5B,CAAC"}
|
package/dist/db/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAyMvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,uHAAuH,CAAC"}
|
package/dist/db/schema.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import { AUTH_MIGRATION } from "./schema-auth.js";
|
|
2
|
+
import { MAIL_MIGRATION } from "./schema-mail.js";
|
|
3
|
+
import { NOTIFY_MIGRATION } from "./schema-notify.js";
|
|
4
|
+
import { SEARCH_MIGRATION } from "./schema-search.js";
|
|
5
|
+
import { SSO_MIGRATION } from "./schema-sso.js";
|
|
1
6
|
// Cloud schema, one entry per version. Never edit a shipped entry: add a new one (docs/CONTRACT.md, "Cloud storage").
|
|
2
7
|
export const MIGRATIONS = [
|
|
3
8
|
`
|
|
@@ -195,6 +200,11 @@ CREATE INDEX ix_metric_10s_time ON metric_10s (project_id, bucket_ms);
|
|
|
195
200
|
CREATE INDEX ix_metric_5m_time ON metric_5m (project_id, bucket_ms);
|
|
196
201
|
CREATE INDEX ix_metric_1h_time ON metric_1h (project_id, bucket_ms);
|
|
197
202
|
`,
|
|
203
|
+
AUTH_MIGRATION,
|
|
204
|
+
SSO_MIGRATION,
|
|
205
|
+
MAIL_MIGRATION,
|
|
206
|
+
NOTIFY_MIGRATION,
|
|
207
|
+
SEARCH_MIGRATION,
|
|
198
208
|
];
|
|
199
209
|
export const MIGRATIONS_TABLE = `CREATE TABLE IF NOT EXISTS wizelens_migrations (version INTEGER PRIMARY KEY, applied_ms DOUBLE PRECISION NOT NULL)`;
|
|
200
210
|
//# sourceMappingURL=schema.js.map
|
package/dist/db/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ED;IACC;;;;;;;;;;CAUD;IACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGD;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/db/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,sHAAsH;AACtH,MAAM,CAAC,MAAM,UAAU,GAAsB;IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6ED;IACC;;;;;;;;;;CAUD;IACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyGD;IACC,cAAc;IACd,aAAa;IACb,cAAc;IACd,gBAAgB;IAChB,gBAAgB;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,oHAAoH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigram.d.ts","sourceRoot":"","sources":["../../src/db/trigram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAa,MAAM,SAAS,CAAC;AAc7C,2HAA2H;AAC3H,wBAAsB,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB5D"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// Best effort (docs/SEARCH-PLAN.md, small mode): with pg_trgm, "contains" searches read GIN trigram indexes; without it they scan the time window.
|
|
2
|
+
const COLUMNS = [["fact_search", "text"], ["fact_requests", "search"], ["fact_traces", "search"], ["fact_logs", "search"]];
|
|
3
|
+
/** One index, built without blocking writes; a half-built one from a stopped run is dropped first. */
|
|
4
|
+
async function buildIndex(q, table, col) {
|
|
5
|
+
const name = `ix_${table}_trgm`;
|
|
6
|
+
const [old] = await q.query("SELECT i.indisvalid AS valid FROM pg_index i JOIN pg_class c ON c.oid = i.indexrelid WHERE c.relname = $1", [name]);
|
|
7
|
+
if (old?.valid)
|
|
8
|
+
return;
|
|
9
|
+
if (old)
|
|
10
|
+
await q.query(`DROP INDEX CONCURRENTLY IF EXISTS ${name}`);
|
|
11
|
+
await q.query(`CREATE INDEX CONCURRENTLY IF NOT EXISTS ${name} ON ${table} USING gin (${col} gin_trgm_ops)`);
|
|
12
|
+
}
|
|
13
|
+
/** Add pg_trgm and the indexes, with no time limit (a big table takes minutes). False when the database has no pg_trgm. */
|
|
14
|
+
export async function ensureTrigram(db) {
|
|
15
|
+
return db.session(async (q) => {
|
|
16
|
+
try {
|
|
17
|
+
await q.query("CREATE EXTENSION IF NOT EXISTS pg_trgm");
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
console.warn(`pg_trgm is not available, so text searches scan the time window: ${err instanceof Error ? err.message : String(err)}`);
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
await q.query("SET statement_timeout = 0");
|
|
24
|
+
try {
|
|
25
|
+
for (const [table, col] of COLUMNS)
|
|
26
|
+
await buildIndex(q, table, col);
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await q.query("RESET statement_timeout");
|
|
30
|
+
}
|
|
31
|
+
return true;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=trigram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trigram.js","sourceRoot":"","sources":["../../src/db/trigram.ts"],"names":[],"mappings":"AAEA,mJAAmJ;AACnJ,MAAM,OAAO,GAAG,CAAC,CAAC,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAU,CAAC;AAEpI,sGAAsG;AACtG,KAAK,UAAU,UAAU,CAAC,CAAY,EAAE,KAAa,EAAE,GAAW;IAChE,MAAM,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC;IAChC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,KAAK,CAAqB,2GAA2G,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACrK,IAAI,GAAG,EAAE,KAAK;QAAE,OAAO;IACvB,IAAI,GAAG;QAAE,MAAM,CAAC,CAAC,KAAK,CAAC,qCAAqC,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,CAAC,CAAC,KAAK,CAAC,2CAA2C,IAAI,OAAO,KAAK,eAAe,GAAG,gBAAgB,CAAC,CAAC;AAC/G,CAAC;AAED,2HAA2H;AAC3H,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,EAAM;IACxC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,oEAAoE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrI,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC3C,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,OAAO;gBAAE,MAAM,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/http/http.d.ts
CHANGED
|
@@ -6,6 +6,8 @@ export declare class HttpError extends Error {
|
|
|
6
6
|
}
|
|
7
7
|
export declare const fail: (status: number, message: string) => never;
|
|
8
8
|
export declare function sendJson(res: ServerResponse, status: number, value: unknown, headers?: Record<string, string | string[]>): void;
|
|
9
|
+
/** The body exactly as sent, for signature checks. Throws 413 past 1 MB. */
|
|
10
|
+
export declare function readRawBody(req: IncomingMessage): Promise<string>;
|
|
9
11
|
/** A small JSON body. Throws 400 for bad JSON or more than 1 MB. */
|
|
10
12
|
export declare function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown>>;
|
|
11
13
|
export declare function cookieOf(req: IncomingMessage, name: string): string | undefined;
|
package/dist/http/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,oDAAoD;AACpD,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,CAAC,MAAM,EAAE,MAAM;IADzB,YACW,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EAGhB;CACF;AAED,eAAO,MAAM,IAAI,WAAY,MAAM,WAAW,MAAM,KAAG,KAEtD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAM,GAAG,IAAI,CAGnI;AAED,oEAAoE;AACpE,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIjE,oDAAoD;AACpD,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,CAAC,MAAM,EAAE,MAAM;IADzB,YACW,MAAM,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EAGhB;CACF;AAED,eAAO,MAAM,IAAI,WAAY,MAAM,WAAW,MAAM,KAAG,KAEtD,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAM,GAAG,IAAI,CAGnI;AAED,4EAA4E;AAC5E,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAUvE;AAED,oEAAoE;AACpE,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CASzF;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAM/E;AAED,wFAAwF;AACxF,eAAO,MAAM,MAAM,SAAU,MAAM,SAAS,MAAM,WAAW,MAAM,UAAU,OAAO,KAAG,MACgC,CAAC;AAExH,eAAO,MAAM,QAAQ,QAAS,eAAe,KAAG,MAAM,GAAG,SAGxD,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,UAAO,GAAG,MAAM,CAKvF"}
|
package/dist/http/http.js
CHANGED
|
@@ -14,8 +14,8 @@ export function sendJson(res, status, value, headers = {}) {
|
|
|
14
14
|
res.writeHead(status, { "Content-Type": "application/json; charset=utf-8", "Cache-Control": "no-store", ...headers });
|
|
15
15
|
res.end(JSON.stringify(value));
|
|
16
16
|
}
|
|
17
|
-
/**
|
|
18
|
-
export async function
|
|
17
|
+
/** The body exactly as sent, for signature checks. Throws 413 past 1 MB. */
|
|
18
|
+
export async function readRawBody(req) {
|
|
19
19
|
const chunks = [];
|
|
20
20
|
let size = 0;
|
|
21
21
|
for await (const chunk of req) {
|
|
@@ -25,7 +25,11 @@ export async function readJsonBody(req) {
|
|
|
25
25
|
fail(413, "The body is too large.");
|
|
26
26
|
chunks.push(buf);
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
29
|
+
}
|
|
30
|
+
/** A small JSON body. Throws 400 for bad JSON or more than 1 MB. */
|
|
31
|
+
export async function readJsonBody(req) {
|
|
32
|
+
const text = await readRawBody(req);
|
|
29
33
|
try {
|
|
30
34
|
const v = text ? JSON.parse(text) : {};
|
|
31
35
|
return v && typeof v === "object" && !Array.isArray(v) ? v : fail(400, "Send a JSON object.");
|
package/dist/http/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC;AAE7B,oDAAoD;AACpD,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEvB,MAAM;IADjB,YACW,MAAc,EACvB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;sBAHN,MAAM;IAIjB,CAAC;CACF;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,OAAe,EAAS,EAAE;IAC7D,MAAM,IAAI,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,GAAmB,EAAE,MAAc,EAAE,KAAc,EAAE,OAAO,GAAsC,EAAE;IAC3H,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,iCAAiC,EAAE,eAAe,EAAE,UAAU,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACtH,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/http/http.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { CloudApp } from "./app.js";
|
|
2
|
-
/** Background work: retention,
|
|
2
|
+
/** Background work: retention, old services, stats, rollups, sessions, alert rules, team and health notices, and digests. Returns a function that stops it. */
|
|
3
3
|
export declare function startJobs(app: CloudApp): () => void;
|
|
4
4
|
//# sourceMappingURL=jobs.d.ts.map
|
package/dist/jobs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAgCzC,+JAA+J;AAC/J,wBAAgB,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,MAAM,IAAI,CAmBnD"}
|
package/dist/jobs.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { evaluateAll } from "./alerts/evaluate.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { pruneAuthRows } from "./repo/auth-prune.js";
|
|
3
|
+
import { pruneServices } from "./repo/services.js";
|
|
4
|
+
import { sendDigests } from "./notify/digest.js";
|
|
5
|
+
import { checkHealth } from "./notify/health.js";
|
|
6
|
+
import { sendTeamNotices } from "./notify/team.js";
|
|
5
7
|
const HOUSEKEEPING_MS = 10 * 60_000;
|
|
6
8
|
const SETTLE_MS = 3_000;
|
|
9
|
+
/** A settle run this big means a backlog: settle again at once instead of waiting for the next tick. */
|
|
10
|
+
const SETTLE_BACKLOG = 1_000;
|
|
7
11
|
const ROLLUP_PRUNE_MS = 60_000;
|
|
12
|
+
const NOTICE_MS = 60_000;
|
|
13
|
+
const DIGEST_MS = 10 * 60_000;
|
|
8
14
|
/** Run `job` now and then every `everyMs`. A failed run logs and waits for the next one. */
|
|
9
15
|
function every(name, everyMs, job) {
|
|
10
16
|
let running = false;
|
|
@@ -22,20 +28,26 @@ function every(name, everyMs, job) {
|
|
|
22
28
|
first.unref();
|
|
23
29
|
return () => (clearInterval(timer), clearTimeout(first));
|
|
24
30
|
}
|
|
25
|
-
/** Background work: retention,
|
|
31
|
+
/** Background work: retention, old services, stats, rollups, sessions, alert rules, team and health notices, and digests. Returns a function that stops it. */
|
|
26
32
|
export function startJobs(app) {
|
|
27
33
|
const now = app.config.now;
|
|
28
34
|
const stops = [
|
|
29
|
-
every("retention", HOUSEKEEPING_MS,
|
|
30
|
-
|
|
35
|
+
every("retention", HOUSEKEEPING_MS, () => app.telemetry.prune(now())),
|
|
36
|
+
every("services", HOUSEKEEPING_MS, () => pruneServices(app.db, now())),
|
|
37
|
+
every("settle", SETTLE_MS, async () => {
|
|
38
|
+
const o = { defaultRetentionDays: app.config.retentionDays, onSettled: (p) => app.changes.emit(p) };
|
|
39
|
+
while ((await app.telemetry.settle(now(), o)) >= SETTLE_BACKLOG)
|
|
31
40
|
;
|
|
32
|
-
await pruneMetricsByRetention(app.db, now());
|
|
33
|
-
await pruneRollups(app.db, now(), true);
|
|
34
41
|
}),
|
|
35
|
-
every("
|
|
36
|
-
every("
|
|
37
|
-
every("sessions", HOUSEKEEPING_MS, () => pruneSessions(app.db, now())),
|
|
42
|
+
every("rollups", ROLLUP_PRUNE_MS, () => app.telemetry.pruneRollups(now())),
|
|
43
|
+
every("sessions", HOUSEKEEPING_MS, () => pruneAuthRows(app.db)),
|
|
38
44
|
every("alerts", app.config.alertIntervalMs, () => evaluateAll(app)),
|
|
45
|
+
every("team notices", NOTICE_MS, async () => {
|
|
46
|
+
while ((await sendTeamNotices(app)) > 0)
|
|
47
|
+
;
|
|
48
|
+
}),
|
|
49
|
+
every("project health", HOUSEKEEPING_MS, () => checkHealth(app)),
|
|
50
|
+
every("digests", DIGEST_MS, () => sendDigests(app)),
|
|
39
51
|
];
|
|
40
52
|
return () => stops.forEach((stop) => stop());
|
|
41
53
|
}
|