@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/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,eAAe,GAAG,EAAE,GAAG,MAAM,CAAC;AACpC,MAAM,SAAS,GAAG,KAAK,CAAC;AACxB,wGAAwG;AACxG,MAAM,cAAc,GAAG,KAAK,CAAC;AAC7B,MAAM,eAAe,GAAG,MAAM,CAAC;AAC/B,MAAM,SAAS,GAAG,MAAM,CAAC;AACzB,MAAM,SAAS,GAAG,EAAE,GAAG,MAAM,CAAC;AAE9B,4FAA4F;AAC5F,SAAS,KAAK,CAAC,IAAY,EAAE,OAAe,EAAE,GAA2B;IACvE,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,GAAG,GAAG,GAAG,EAAE;QACf,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,GAAG,EAAE;aACF,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,oBAAoB,IAAI,UAAU,EAAE,GAAG,CAAC,CAAC;aAC/E,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,OAAO,GAAG,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,+JAA+J;AAC/J,MAAM,UAAU,SAAS,CAAC,GAAa;IACrC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;IAC3B,MAAM,KAAK,GAAG;QACZ,KAAK,CAAC,WAAW,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACtE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,CAAC,GAAG,EAAE,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5G,OAAO,CAAC,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,cAAc;gBAAC,CAAC;QACnE,CAAC,CAAC;QACF,KAAK,CAAC,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1E,KAAK,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/D,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACnE,KAAK,CAAC,cAAc,EAAE,SAAS,EAAE,KAAK,IAAI,EAAE;YAC1C,OAAO,CAAC,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;gBAAC,CAAC;QAC3C,CAAC,CAAC;QACF,KAAK,CAAC,gBAAgB,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAChE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;KACpD,CAAC;IACF,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Block, EmailContent } from "./content.js";
|
|
2
|
+
/** The mark, its center dot in the tone's color, and the word mark. */
|
|
3
|
+
export declare function Header({ tone }: {
|
|
4
|
+
tone: EmailContent["tone"];
|
|
5
|
+
}): import("react").JSX.Element;
|
|
6
|
+
/** One body block. A new block kind needs a case here and in text.ts. */
|
|
7
|
+
export declare function BlockView({ block }: {
|
|
8
|
+
block: Block;
|
|
9
|
+
}): import("react").JSX.Element;
|
|
10
|
+
/** The one button, with the link written out below it for mail apps that hide buttons. */
|
|
11
|
+
export declare function Action({ action }: {
|
|
12
|
+
action: NonNullable<EmailContent["action"]>;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/mail/blocks.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAQ,MAAM,cAAc,CAAC;AAM9D,uEAAuE;AACvE,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,CAAA;CAAE,+BAe9D;AAiDD,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,KAAK,CAAA;CAAE,+BAKpD;AAED,0FAA0F;AAC1F,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAA;CAAE,+BAWjF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Button, Column, Img, Link, Row, Section, Text } from "@react-email/components";
|
|
3
|
+
import { theme } from "./theme.js";
|
|
4
|
+
const textStyle = { margin: "0 0 16px", fontSize: "15px", lineHeight: "24px", color: theme.body };
|
|
5
|
+
const noteStyle = { margin: "0 0 16px", fontSize: "13px", lineHeight: "20px", color: theme.muted };
|
|
6
|
+
/** The mark, its center dot in the tone's color, and the word mark. */
|
|
7
|
+
export function Header({ tone }) {
|
|
8
|
+
return (_jsx(Section, { style: { padding: "24px 32px 0" }, children: _jsxs(Row, { children: [_jsx(Column, { style: { width: "32px" }, children: _jsx(Img, { src: theme.markUrl[tone], width: "28", height: "28", alt: "", style: { display: "block" } }) }), _jsx(Column, { children: _jsx(Text, { style: { margin: 0, fontSize: "16px", fontWeight: 700, color: theme.ink, letterSpacing: "-0.01em" }, children: "WizeLens" }) })] }) }));
|
|
9
|
+
}
|
|
10
|
+
function Facts({ rows }) {
|
|
11
|
+
return (_jsx(Section, { style: { margin: "0 0 16px", padding: "12px 16px", background: theme.factsBg, borderRadius: "8px" }, children: rows.map((r) => (_jsxs(Row, { children: [_jsx(Column, { style: { width: "40%", padding: "4px 0", fontSize: "13px", color: theme.muted }, children: r.label }), _jsx(Column, { style: { padding: "4px 0", fontSize: "13px", color: theme.ink, fontFamily: theme.mono }, children: r.value })] }, r.label))) }));
|
|
12
|
+
}
|
|
13
|
+
/** Up to 3 numbers per row, each with its change in the tone's color. */
|
|
14
|
+
function Stats({ items }) {
|
|
15
|
+
const rows = Array.from({ length: Math.ceil(items.length / 3) }, (_, i) => items.slice(i * 3, i * 3 + 3));
|
|
16
|
+
return (_jsx(Section, { style: { margin: "0 0 16px" }, children: rows.map((row, i) => (_jsx(Row, { children: row.map((s) => (_jsxs(Column, { style: { width: "33%", padding: "8px 8px 8px 0", verticalAlign: "top" }, children: [_jsx(Text, { style: { margin: 0, fontSize: "12px", color: theme.muted }, children: s.label }), _jsx(Text, { style: { margin: "2px 0 0", fontSize: "20px", fontWeight: 700, color: theme.ink, letterSpacing: "-0.01em" }, children: s.value }), s.change && _jsx(Text, { style: { margin: "2px 0 0", fontSize: "12px", color: s.tone ? theme.tone[s.tone] : theme.muted }, children: s.change })] }, s.label))) }, i))) }));
|
|
17
|
+
}
|
|
18
|
+
function List({ title, items }) {
|
|
19
|
+
return (_jsxs(Section, { style: { margin: "0 0 16px" }, children: [_jsx(Text, { style: { margin: "0 0 8px", fontSize: "13px", fontWeight: 700, color: theme.ink }, children: title }), items.map((item, i) => (_jsxs(Row, { style: { borderTop: `1px solid ${theme.line}` }, children: [_jsx(Column, { style: { padding: "8px 0", fontSize: "13px", color: theme.body, fontFamily: theme.mono, wordBreak: "break-all" }, children: item.text }), _jsx(Column, { style: { width: "30%", padding: "8px 0", fontSize: "13px", color: theme.muted, textAlign: "right" }, children: item.meta ?? "" })] }, i)))] }));
|
|
20
|
+
}
|
|
21
|
+
/** One body block. A new block kind needs a case here and in text.ts. */
|
|
22
|
+
export function BlockView({ block }) {
|
|
23
|
+
if (block.kind === "facts")
|
|
24
|
+
return _jsx(Facts, { rows: block.rows });
|
|
25
|
+
if (block.kind === "stats")
|
|
26
|
+
return _jsx(Stats, { items: block.items });
|
|
27
|
+
if (block.kind === "list")
|
|
28
|
+
return _jsx(List, { title: block.title, items: block.items });
|
|
29
|
+
return _jsx(Text, { style: block.kind === "note" ? noteStyle : textStyle, children: block.text });
|
|
30
|
+
}
|
|
31
|
+
/** The one button, with the link written out below it for mail apps that hide buttons. */
|
|
32
|
+
export function Action({ action }) {
|
|
33
|
+
return (_jsxs(Section, { style: { margin: "8px 0 24px" }, children: [_jsx(Button, { href: action.url, style: { background: theme.accent, color: theme.accentText, fontSize: "15px", fontWeight: 600, padding: "12px 20px", borderRadius: "8px" }, children: action.label }), _jsxs(Text, { style: { ...noteStyle, margin: "16px 0 0", wordBreak: "break-all" }, children: ["Or open this link: ", _jsx(Link, { href: action.url, style: { color: theme.accent }, children: action.url })] })] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=blocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.js","sourceRoot":"","sources":["../../src/mail/blocks.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAExF,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;AAClG,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;AAEnG,uEAAuE;AACvE,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAAkC;IAC7D,OAAO,CACL,KAAC,OAAO,IAAC,KAAK,EAAE,EAAE,OAAO,EAAE,aAAa,EAAE,YACxC,MAAC,GAAG,eACF,KAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAC9B,KAAC,GAAG,IAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,GAAG,EAAC,EAAE,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,GAAI,GACrF,EACT,KAAC,MAAM,cACL,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,yBAElG,GACA,IACL,GACE,CACX,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,EAAE,IAAI,EAAgD;IACnE,OAAO,CACL,KAAC,OAAO,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,YACzG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACf,MAAC,GAAG,eACF,KAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,YAAG,CAAC,CAAC,KAAK,GAAU,EAC3G,KAAC,MAAM,IAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,YAAG,CAAC,CAAC,KAAK,GAAU,KAF3G,CAAC,CAAC,KAAK,CAGX,CACP,CAAC,GACM,CACX,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,SAAS,KAAK,CAAC,EAAE,KAAK,EAAqB;IACzC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1G,OAAO,CACL,KAAC,OAAO,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,YACnC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,KAAC,GAAG,cACD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACd,MAAC,MAAM,IAAe,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,KAAK,EAAE,aAC3F,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,YAAG,CAAC,CAAC,KAAK,GAAQ,EAClF,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,YAAG,CAAC,CAAC,KAAK,GAAQ,EAClI,CAAC,CAAC,MAAM,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,YAAG,CAAC,CAAC,MAAM,GAAQ,KAH3H,CAAC,CAAC,KAAK,CAIX,CACV,CAAC,IAPM,CAAC,CAQL,CACP,CAAC,GACM,CACX,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAA+D;IACzF,OAAO,CACL,MAAC,OAAO,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,aACpC,KAAC,IAAI,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,YAAG,KAAK,GAAQ,EACtG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,MAAC,GAAG,IAAS,KAAK,EAAE,EAAE,SAAS,EAAE,aAAa,KAAK,CAAC,IAAI,EAAE,EAAE,aAC1D,KAAC,MAAM,IAAC,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,YAAG,IAAI,CAAC,IAAI,GAAU,EAC9I,KAAC,MAAM,IAAC,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,YAAG,IAAI,CAAC,IAAI,IAAI,EAAE,GAAU,KAF/H,CAAC,CAGL,CACP,CAAC,IACM,CACX,CAAC;AACJ,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAoB;IACnD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAC,KAAK,IAAC,IAAI,EAAE,KAAK,CAAC,IAAI,GAAI,CAAC;IAC/D,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAC,KAAK,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAI,CAAC;IACjE,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,GAAI,CAAC;IACnF,OAAO,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,YAAG,KAAK,CAAC,IAAI,GAAQ,CAAC;AACzF,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAmD;IAChF,OAAO,CACL,MAAC,OAAO,IAAC,KAAK,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,aACtC,KAAC,MAAM,IAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,YACjK,MAAM,CAAC,KAAK,GACN,EACT,MAAC,IAAI,IAAC,KAAK,EAAE,EAAE,GAAG,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,oCACpD,KAAC,IAAI,IAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,YAAG,MAAM,CAAC,GAAG,GAAQ,IACzF,IACC,CACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { MailKind } from "./mailer.js";
|
|
2
|
+
import type { Tone } from "./theme.js";
|
|
3
|
+
/** One part of an email body. The layout decides how each kind looks; the text version uses the same parts. */
|
|
4
|
+
export type Block = {
|
|
5
|
+
kind: "text";
|
|
6
|
+
text: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: "facts";
|
|
9
|
+
rows: {
|
|
10
|
+
label: string;
|
|
11
|
+
value: string;
|
|
12
|
+
}[];
|
|
13
|
+
} | {
|
|
14
|
+
kind: "note";
|
|
15
|
+
text: string;
|
|
16
|
+
}
|
|
17
|
+
/** Numbers side by side, each with how it changed. */
|
|
18
|
+
| {
|
|
19
|
+
kind: "stats";
|
|
20
|
+
items: Stat[];
|
|
21
|
+
}
|
|
22
|
+
/** A titled list, for example the slowest endpoints. */
|
|
23
|
+
| {
|
|
24
|
+
kind: "list";
|
|
25
|
+
title: string;
|
|
26
|
+
items: {
|
|
27
|
+
text: string;
|
|
28
|
+
meta?: string;
|
|
29
|
+
}[];
|
|
30
|
+
};
|
|
31
|
+
export interface Stat {
|
|
32
|
+
label: string;
|
|
33
|
+
value: string;
|
|
34
|
+
/** "+12% vs last week". */
|
|
35
|
+
change?: string;
|
|
36
|
+
tone?: Tone;
|
|
37
|
+
}
|
|
38
|
+
/** What an email says, with no markup. Templates in emails.ts make these; layout.tsx and text.ts draw them. */
|
|
39
|
+
export interface EmailContent {
|
|
40
|
+
kind: MailKind;
|
|
41
|
+
subject: string;
|
|
42
|
+
/** The line inboxes show after the subject. */
|
|
43
|
+
preview: string;
|
|
44
|
+
heading: string;
|
|
45
|
+
/** The status dot next to the logo: blue for account mail, red when an alert fires, green when it resolves. */
|
|
46
|
+
tone: Tone;
|
|
47
|
+
blocks: Block[];
|
|
48
|
+
action?: {
|
|
49
|
+
label: string;
|
|
50
|
+
url: string;
|
|
51
|
+
};
|
|
52
|
+
/** Why the person got this email. */
|
|
53
|
+
footer: string;
|
|
54
|
+
/** For repeated mail: a one-click stop link, also sent as the List-Unsubscribe header. */
|
|
55
|
+
unsubscribe?: {
|
|
56
|
+
label: string;
|
|
57
|
+
url: string;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export declare const text: (t: string) => Block;
|
|
61
|
+
export declare const note: (t: string) => Block;
|
|
62
|
+
export declare const facts: (rows: [string, string][]) => Block;
|
|
63
|
+
export declare const stats: (items: Stat[]) => Block;
|
|
64
|
+
export declare const list: (title: string, items: {
|
|
65
|
+
text: string;
|
|
66
|
+
meta?: string;
|
|
67
|
+
}[]) => Block;
|
|
68
|
+
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/mail/content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,+GAA+G;AAC/G,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC9B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAChC,sDAAsD;GACpD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE;AAClC,wDAAwD;GACtD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC;AAE9E,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,+GAA+G;AAC/G,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,+GAA+G;IAC/G,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED,eAAO,MAAM,IAAI,MAAO,MAAM,KAAG,KAAoC,CAAC;AACtE,eAAO,MAAM,IAAI,MAAO,MAAM,KAAG,KAAoC,CAAC;AACtE,eAAO,MAAM,KAAK,SAAU,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAG,KAAoF,CAAC;AACtI,eAAO,MAAM,KAAK,UAAW,IAAI,EAAE,KAAG,KAAmC,CAAC;AAC1E,eAAO,MAAM,IAAI,UAAW,MAAM,SAAS;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAG,KAAyC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const text = (t) => ({ kind: "text", text: t });
|
|
2
|
+
export const note = (t) => ({ kind: "note", text: t });
|
|
3
|
+
export const facts = (rows) => ({ kind: "facts", rows: rows.map(([label, value]) => ({ label, value })) });
|
|
4
|
+
export const stats = (items) => ({ kind: "stats", items });
|
|
5
|
+
export const list = (title, items) => ({ kind: "list", title, items });
|
|
6
|
+
//# sourceMappingURL=content.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content.js","sourceRoot":"","sources":["../../src/mail/content.ts"],"names":[],"mappings":"AAsCA,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAS,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAS,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AACtE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,IAAwB,EAAS,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;AACtI,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,KAAa,EAAS,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC1E,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,KAAwC,EAAS,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { DigestData } from "../notify/digest-data.js";
|
|
2
|
+
import type { DigestPeriod } from "../repo/mail-prefs.js";
|
|
3
|
+
import { type EmailContent } from "./content.js";
|
|
4
|
+
export interface DigestLinks {
|
|
5
|
+
project: string;
|
|
6
|
+
stop: string;
|
|
7
|
+
}
|
|
8
|
+
/** One project's day, week, or month: headline numbers with their change, then errors, slow endpoints, and insights. */
|
|
9
|
+
export declare function digest(project: string, org: string, period: DigestPeriod, d: DigestData, links: DigestLinks): EmailContent;
|
|
10
|
+
//# sourceMappingURL=emails-digest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-digest.d.ts","sourceRoot":"","sources":["../../src/mail/emails-digest.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAc,KAAK,YAAY,EAA0B,MAAM,cAAc,CAAC;AA6BrF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wHAAwH;AACxH,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,YAAY,CAwB1H"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { list, stats } from "./content.js";
|
|
2
|
+
const WORD = {
|
|
3
|
+
daily: { noun: "day", vs: "vs the day before", adj: "daily" },
|
|
4
|
+
weekly: { noun: "week", vs: "vs last week", adj: "weekly" },
|
|
5
|
+
monthly: { noun: "month", vs: "vs the 30 days before", adj: "monthly" },
|
|
6
|
+
};
|
|
7
|
+
const count = (v) => (v === null ? "–" : Math.round(v).toLocaleString("en-US"));
|
|
8
|
+
const ms = (v) => (v === null ? "–" : v >= 1000 ? `${(v / 1000).toFixed(1)} s` : `${Math.round(v)} ms`);
|
|
9
|
+
const pct = (v) => (v === null ? "–" : `${v.toFixed(v < 10 ? 1 : 0)}%`);
|
|
10
|
+
/** "+12% vs last week" in red when a bigger number is worse, green when it is better. `null`: neither, for traffic. */
|
|
11
|
+
function stat(label, h, show, vs, higherIsBad) {
|
|
12
|
+
if (h.change === null || h.previous === null)
|
|
13
|
+
return { label, value: show(h.value) };
|
|
14
|
+
const up = h.change > 0;
|
|
15
|
+
const change = Math.abs(h.change) < 0.5 ? `same ${vs}` : `${up ? "+" : "−"}${Math.abs(Math.round(h.change))}% ${vs}`;
|
|
16
|
+
const tone = Math.abs(h.change) < 0.5 || higherIsBad === null ? undefined : up === higherIsBad ? "bad" : "good";
|
|
17
|
+
return { label, value: show(h.value), change, tone };
|
|
18
|
+
}
|
|
19
|
+
function lists(d) {
|
|
20
|
+
const out = [];
|
|
21
|
+
if (d.errors.length)
|
|
22
|
+
out.push(list("Top errors", d.errors.map((e) => ({ text: `${e.type}: ${e.message}`.slice(0, 140), meta: `${count(e.count)} times` }))));
|
|
23
|
+
if (d.slowest.length)
|
|
24
|
+
out.push(list("Slowest endpoints (p95)", d.slowest.map((s) => ({ text: s.endpoint, meta: `${ms(s.p95Ms)} · ${count(s.count)} calls` }))));
|
|
25
|
+
if (d.insights.length)
|
|
26
|
+
out.push(list("Insights", d.insights.map((i) => ({ text: i.title, meta: `${count(i.occurrences)} requests` }))));
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
/** One project's day, week, or month: headline numbers with their change, then errors, slow endpoints, and insights. */
|
|
30
|
+
export function digest(project, org, period, d, links) {
|
|
31
|
+
const w = WORD[period];
|
|
32
|
+
const errorsUp = (d.errorRate.change ?? 0) >= 0.5 && (d.errorRate.value ?? 0) > 0;
|
|
33
|
+
return {
|
|
34
|
+
kind: "digest",
|
|
35
|
+
subject: `${project}: your ${w.noun} on WizeLens (${count(d.requests.value)} requests, ${pct(d.errorRate.value)} errors)`,
|
|
36
|
+
preview: `${count(d.requests.value)} requests, ${pct(d.errorRate.value)} errors, p95 ${ms(d.p95Ms)}.`,
|
|
37
|
+
heading: `Your ${w.noun} in ${project}.`,
|
|
38
|
+
tone: errorsUp || d.alertsFired > 0 ? "warn" : "good",
|
|
39
|
+
blocks: [
|
|
40
|
+
stats([
|
|
41
|
+
stat("Requests", d.requests, count, w.vs, null),
|
|
42
|
+
stat("Error rate", d.errorRate, pct, w.vs, true),
|
|
43
|
+
stat("Average time", d.avgMs, ms, w.vs, true),
|
|
44
|
+
{ label: "p95 time", value: ms(d.p95Ms) },
|
|
45
|
+
stat("SQL queries", d.sqlQueries, count, w.vs, true),
|
|
46
|
+
{ label: "Alerts fired", value: count(d.alertsFired), tone: d.alertsFired ? "bad" : undefined },
|
|
47
|
+
]),
|
|
48
|
+
...lists(d),
|
|
49
|
+
],
|
|
50
|
+
action: { label: `Open ${project}`, url: links.project },
|
|
51
|
+
footer: `You get the ${w.adj} digest of ${project} because you are a member of ${org}. Pick digests on your Account page.`,
|
|
52
|
+
unsubscribe: { label: `Stop the ${w.adj} digest for ${project}`, url: links.stop },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=emails-digest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-digest.js","sourceRoot":"","sources":["../../src/mail/emails-digest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type EmailContent } from "./content.js";
|
|
2
|
+
/** A project that sends data around the clock stopped. */
|
|
3
|
+
export declare function projectQuiet(project: string, org: string, lastMs: number, nowMs: number, url: string, stop: string): EmailContent;
|
|
4
|
+
/** Data arrives again after a quiet notice. */
|
|
5
|
+
export declare function projectBack(project: string, org: string, quietMs: number, url: string, stop: string): EmailContent;
|
|
6
|
+
//# sourceMappingURL=emails-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-health.d.ts","sourceRoot":"","sources":["../../src/mail/emails-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAe,MAAM,cAAc,CAAC;AAK9D,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAgBjI;AAED,+CAA+C;AAC/C,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAYlH"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { facts, text } from "./content.js";
|
|
2
|
+
const clock = (ms) => `${new Date(ms).toISOString().slice(0, 16).replace("T", " ")} UTC`;
|
|
3
|
+
const span = (ms) => (ms >= 86_400_000 ? `${Math.round(ms / 86_400_000)} days` : `${Math.max(1, Math.round(ms / 3_600_000))} hours`);
|
|
4
|
+
/** A project that sends data around the clock stopped. */
|
|
5
|
+
export function projectQuiet(project, org, lastMs, nowMs, url, stop) {
|
|
6
|
+
return {
|
|
7
|
+
kind: "health",
|
|
8
|
+
subject: `${project} stopped sending data to WizeLens`,
|
|
9
|
+
preview: `No data from ${project} for ${span(nowMs - lastMs)}.`,
|
|
10
|
+
heading: `${project} went quiet.`,
|
|
11
|
+
tone: "bad",
|
|
12
|
+
blocks: [
|
|
13
|
+
text(`${project} in ${org} usually sends data every hour. Nothing arrived for ${span(nowMs - lastMs)}.`),
|
|
14
|
+
text("The app may be down, its add-on may have lost its key, or traffic may have stopped."),
|
|
15
|
+
facts([["Last data", clock(lastMs)], ["Quiet for", span(nowMs - lastMs)]]),
|
|
16
|
+
],
|
|
17
|
+
action: { label: `Open ${project}`, url },
|
|
18
|
+
footer: `You get this because you are an owner or admin of ${org}.`,
|
|
19
|
+
unsubscribe: { label: "Stop project health emails", url: stop },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Data arrives again after a quiet notice. */
|
|
23
|
+
export function projectBack(project, org, quietMs, url, stop) {
|
|
24
|
+
return {
|
|
25
|
+
kind: "health",
|
|
26
|
+
subject: `${project} is sending data to WizeLens again`,
|
|
27
|
+
preview: `Data from ${project} arrives again after ${span(quietMs)}.`,
|
|
28
|
+
heading: `${project} is back.`,
|
|
29
|
+
tone: "good",
|
|
30
|
+
blocks: [text(`Data from ${project} in ${org} arrives again. It was quiet for about ${span(quietMs)}.`)],
|
|
31
|
+
action: { label: `Open ${project}`, url },
|
|
32
|
+
footer: `You get this because you are an owner or admin of ${org}.`,
|
|
33
|
+
unsubscribe: { label: "Stop project health emails", url: stop },
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=emails-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-health.js","sourceRoot":"","sources":["../../src/mail/emails-health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE9D,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;AACjG,MAAM,IAAI,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;AAE7I,0DAA0D;AAC1D,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,GAAW,EAAE,MAAc,EAAE,KAAa,EAAE,GAAW,EAAE,IAAY;IACjH,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG,OAAO,mCAAmC;QACtD,OAAO,EAAE,gBAAgB,OAAO,QAAQ,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG;QAC/D,OAAO,EAAE,GAAG,OAAO,cAAc;QACjC,IAAI,EAAE,KAAK;QACX,MAAM,EAAE;YACN,IAAI,CAAC,GAAG,OAAO,OAAO,GAAG,uDAAuD,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;YACxG,IAAI,CAAC,qFAAqF,CAAC;YAC3F,KAAK,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;SAC3E;QACD,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,GAAG,EAAE;QACzC,MAAM,EAAE,qDAAqD,GAAG,GAAG;QACnE,WAAW,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,GAAG,EAAE,IAAI,EAAE;KAChE,CAAC;AACJ,CAAC;AAED,+CAA+C;AAC/C,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,GAAW,EAAE,OAAe,EAAE,GAAW,EAAE,IAAY;IAClG,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,GAAG,OAAO,oCAAoC;QACvD,OAAO,EAAE,aAAa,OAAO,wBAAwB,IAAI,CAAC,OAAO,CAAC,GAAG;QACrE,OAAO,EAAE,GAAG,OAAO,WAAW;QAC9B,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,CAAC,IAAI,CAAC,aAAa,OAAO,OAAO,GAAG,0CAA0C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACxG,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,OAAO,EAAE,EAAE,GAAG,EAAE;QACzC,MAAM,EAAE,qDAAqD,GAAG,GAAG;QACnE,WAAW,EAAE,EAAE,KAAK,EAAE,4BAA4B,EAAE,GAAG,EAAE,IAAI,EAAE;KAChE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type EmailContent } from "./content.js";
|
|
2
|
+
export interface SecurityLinks {
|
|
3
|
+
/** The Account page, to review devices and sign-in settings. */
|
|
4
|
+
account: string;
|
|
5
|
+
/** The page that sends a reset link, for when the person cannot sign in. */
|
|
6
|
+
forgot: string;
|
|
7
|
+
}
|
|
8
|
+
export declare const passwordChanged: (l: SecurityLinks, atMs: number) => EmailContent;
|
|
9
|
+
export declare const emailChanged: (l: SecurityLinks, newEmail: string, atMs: number) => EmailContent;
|
|
10
|
+
export declare const twoFactorChanged: (l: SecurityLinks, on: boolean, atMs: number) => EmailContent;
|
|
11
|
+
export declare const passkeyChanged: (l: SecurityLinks, added: boolean, name: string, atMs: number) => EmailContent;
|
|
12
|
+
export declare const backupCodesMade: (l: SecurityLinks, atMs: number) => EmailContent;
|
|
13
|
+
export declare const newSignIn: (l: SecurityLinks, device: string, address: string, atMs: number) => EmailContent;
|
|
14
|
+
//# sourceMappingURL=emails-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-security.d.ts","sourceRoot":"","sources":["../../src/mail/emails-security.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,cAAc,CAAC;AAOpE,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD,eAAO,MAAM,eAAe,MAAO,aAAa,QAAQ,MAAM,iBAI1D,CAAC;AAEL,eAAO,MAAM,YAAY,MAAO,aAAa,YAAY,MAAM,QAAQ,MAAM,iBAIzE,CAAC;AAEL,eAAO,MAAM,gBAAgB,MAAO,aAAa,MAAM,OAAO,QAAQ,MAAM,iBAQzE,CAAC;AAEJ,eAAO,MAAM,cAAc,MAAO,aAAa,SAAS,OAAO,QAAQ,MAAM,QAAQ,MAAM,iBAQxF,CAAC;AAEJ,eAAO,MAAM,eAAe,MAAO,aAAa,QAAQ,MAAM,iBAI1D,CAAC;AAEL,eAAO,MAAM,SAAS,MAAO,aAAa,UAAU,MAAM,WAAW,MAAM,QAAQ,MAAM,iBAIrF,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { facts, note, text } from "./content.js";
|
|
2
|
+
// Notices about changes to the person's own account. They always go out: they are how a taken account gets noticed.
|
|
3
|
+
const FOOTER = "We send a notice for every security change to your account. These notices cannot be turned off.";
|
|
4
|
+
const NOT_YOU = "If this was not you, reset your password now. It signs out every device.";
|
|
5
|
+
const when = (ms) => `${new Date(ms).toISOString().slice(0, 16).replace("T", " ")} UTC`;
|
|
6
|
+
function notice(subject, heading, lines, tone, rows, action) {
|
|
7
|
+
return { kind: "security", subject, preview: lines[0], heading, tone, blocks: [...lines.map(text), facts(rows), note(NOT_YOU)], action, footer: FOOTER };
|
|
8
|
+
}
|
|
9
|
+
export const passwordChanged = (l, atMs) => notice("Your WizeLens password was changed", "Your password changed.", ["The password of your WizeLens account was changed. Other devices were signed out."], "neutral", [["When", when(atMs)]], {
|
|
10
|
+
label: "Reset your password",
|
|
11
|
+
url: l.forgot,
|
|
12
|
+
});
|
|
13
|
+
export const emailChanged = (l, newEmail, atMs) => notice("Your WizeLens email was changed", "Your email changed.", [`Your WizeLens account now uses ${newEmail}. This address gets no more mail from it.`], "warn", [["New email", newEmail], ["When", when(atMs)]], {
|
|
14
|
+
label: "Get back in",
|
|
15
|
+
url: l.forgot,
|
|
16
|
+
});
|
|
17
|
+
export const twoFactorChanged = (l, on, atMs) => notice(on ? "Two-step sign-in is on for WizeLens" : "Two-step sign-in is off for WizeLens", on ? "Two-step sign-in is on." : "Two-step sign-in is off.", [on ? "Signing in now needs a code from your authenticator app, or a backup code." : "Signing in now needs only your password or a passkey."], on ? "good" : "warn", [["When", when(atMs)]], { label: "Review your account", url: l.account });
|
|
18
|
+
export const passkeyChanged = (l, added, name, atMs) => notice(added ? "A passkey was added to your WizeLens account" : "A passkey was removed from your WizeLens account", added ? "New passkey." : "Passkey removed.", [added ? "A new passkey can now sign in to your account." : "A passkey can no longer sign in to your account."], added ? "warn" : "neutral", [["Passkey", name || "Unnamed"], ["When", when(atMs)]], { label: "Review your passkeys", url: l.account });
|
|
19
|
+
export const backupCodesMade = (l, atMs) => notice("New WizeLens backup codes", "New backup codes.", ["New backup codes were made for two-step sign-in. The old codes no longer work."], "neutral", [["When", when(atMs)]], {
|
|
20
|
+
label: "Review your account",
|
|
21
|
+
url: l.account,
|
|
22
|
+
});
|
|
23
|
+
export const newSignIn = (l, device, address, atMs) => notice("New sign-in to your WizeLens account", "New sign-in.", [`Your account was signed in on ${device}, a device it has not used before.`], "warn", [["Device", device], ["Address", address || "Unknown"], ["When", when(atMs)]], {
|
|
24
|
+
label: "Review your devices",
|
|
25
|
+
url: l.account,
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=emails-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-security.js","sourceRoot":"","sources":["../../src/mail/emails-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type EmailContent } from "./content.js";
|
|
2
|
+
/** Changes in one organization since the last notice, for its owners and admins. */
|
|
3
|
+
export declare function teamChanges(org: string, changes: {
|
|
4
|
+
text: string;
|
|
5
|
+
timeMs: number;
|
|
6
|
+
}[], url: string, stop: string): EmailContent;
|
|
7
|
+
/** A member's own role changed. */
|
|
8
|
+
export declare function roleChanged(org: string, role: string, url: string, stop: string): EmailContent;
|
|
9
|
+
/** An organization and all its data are gone. Sent to every member, always. */
|
|
10
|
+
export declare function orgDeleted(org: string, by: string, url: string): EmailContent;
|
|
11
|
+
//# sourceMappingURL=emails-team.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-team.d.ts","sourceRoot":"","sources":["../../src/mail/emails-team.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAc,MAAM,cAAc,CAAC;AAI7D,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAa7H;AAED,mCAAmC;AACnC,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAY9F;AAED,+EAA+E;AAC/E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAW7E"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { list, text } from "./content.js";
|
|
2
|
+
const clock = (ms) => `${new Date(ms).toISOString().slice(0, 16).replace("T", " ")} UTC`;
|
|
3
|
+
/** Changes in one organization since the last notice, for its owners and admins. */
|
|
4
|
+
export function teamChanges(org, changes, url, stop) {
|
|
5
|
+
const one = changes.length === 1;
|
|
6
|
+
return {
|
|
7
|
+
kind: "team",
|
|
8
|
+
subject: one ? `${org}: ${changes[0].text}` : `${changes.length} changes in ${org} on WizeLens`,
|
|
9
|
+
preview: changes[0].text,
|
|
10
|
+
heading: `Changes in ${org}.`,
|
|
11
|
+
tone: "neutral",
|
|
12
|
+
blocks: [list(one ? "What changed" : `${changes.length} changes`, changes.map((c) => ({ text: c.text, meta: clock(c.timeMs) })))],
|
|
13
|
+
action: { label: "Open the audit log", url },
|
|
14
|
+
footer: `You get this because you are an owner or admin of ${org}.`,
|
|
15
|
+
unsubscribe: { label: "Stop team change emails", url: stop },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/** A member's own role changed. */
|
|
19
|
+
export function roleChanged(org, role, url, stop) {
|
|
20
|
+
return {
|
|
21
|
+
kind: "team",
|
|
22
|
+
subject: `Your role in ${org} is now ${role}`,
|
|
23
|
+
preview: `You are now ${role} in ${org}.`,
|
|
24
|
+
heading: `You are now ${role}.`,
|
|
25
|
+
tone: "neutral",
|
|
26
|
+
blocks: [text(`Your role in ${org} on WizeLens changed to ${role}. What you can see and change follows the new role.`)],
|
|
27
|
+
action: { label: `Open ${org}`, url },
|
|
28
|
+
footer: `You get this because you are a member of ${org}.`,
|
|
29
|
+
unsubscribe: { label: "Stop team change emails", url: stop },
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** An organization and all its data are gone. Sent to every member, always. */
|
|
33
|
+
export function orgDeleted(org, by, url) {
|
|
34
|
+
return {
|
|
35
|
+
kind: "team",
|
|
36
|
+
subject: `${org} was deleted on WizeLens`,
|
|
37
|
+
preview: `${by} deleted ${org} and all its data.`,
|
|
38
|
+
heading: `${org} was deleted.`,
|
|
39
|
+
tone: "bad",
|
|
40
|
+
blocks: [text(`${by} deleted ${org} on WizeLens. Its projects, traces, keys, and alerts are gone. This cannot be undone.`)],
|
|
41
|
+
action: { label: "Open WizeLens", url },
|
|
42
|
+
footer: `You get this because you were a member of ${org}.`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=emails-team.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails-team.js","sourceRoot":"","sources":["../../src/mail/emails-team.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,IAAI,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE7D,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC;AAEjG,oFAAoF;AACpF,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,OAA2C,EAAE,GAAW,EAAE,IAAY;IAC7G,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,eAAe,GAAG,cAAc;QAChG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI;QACzB,OAAO,EAAE,cAAc,GAAG,GAAG;QAC7B,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjI,MAAM,EAAE,EAAE,KAAK,EAAE,oBAAoB,EAAE,GAAG,EAAE;QAC5C,MAAM,EAAE,qDAAqD,GAAG,GAAG;QACnE,WAAW,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,GAAG,EAAE,IAAI,EAAE;KAC7D,CAAC;AACJ,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,IAAY,EAAE,GAAW,EAAE,IAAY;IAC9E,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,gBAAgB,GAAG,WAAW,IAAI,EAAE;QAC7C,OAAO,EAAE,eAAe,IAAI,OAAO,GAAG,GAAG;QACzC,OAAO,EAAE,eAAe,IAAI,GAAG;QAC/B,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,CAAC,IAAI,CAAC,gBAAgB,GAAG,2BAA2B,IAAI,qDAAqD,CAAC,CAAC;QACvH,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,4CAA4C,GAAG,GAAG;QAC1D,WAAW,EAAE,EAAE,KAAK,EAAE,yBAAyB,EAAE,GAAG,EAAE,IAAI,EAAE;KAC7D,CAAC;AACJ,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,EAAU,EAAE,GAAW;IAC7D,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,GAAG,GAAG,0BAA0B;QACzC,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,oBAAoB;QACjD,OAAO,EAAE,GAAG,GAAG,eAAe;QAC9B,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,GAAG,uFAAuF,CAAC,CAAC;QAC3H,MAAM,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,6CAA6C,GAAG,GAAG;KAC5D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Notice } from "../alerts/notify.js";
|
|
2
|
+
import { type EmailContent } from "./content.js";
|
|
3
|
+
export declare const verifyEmail: (url: string) => EmailContent;
|
|
4
|
+
export declare const resetPassword: (url: string) => EmailContent;
|
|
5
|
+
export declare const changeEmail: (newEmail: string, url: string) => EmailContent;
|
|
6
|
+
export declare const deleteAccount: (url: string) => EmailContent;
|
|
7
|
+
export declare function invite(inviter: string, org: string, role: string, url: string): EmailContent;
|
|
8
|
+
export declare function alert(n: Notice): EmailContent;
|
|
9
|
+
//# sourceMappingURL=emails.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails.d.ts","sourceRoot":"","sources":["../../src/mail/emails.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,cAAc,CAAC;AAUpE,eAAO,MAAM,WAAW,QAAS,MAAM,iBACsI,CAAC;AAE9K,eAAO,MAAM,aAAa,QAAS,MAAM,iBAIrC,CAAC;AAEL,eAAO,MAAM,WAAW,aAAc,MAAM,OAAO,MAAM,iBAIrD,CAAC;AAEL,eAAO,MAAM,aAAa,QAAS,MAAM,iBAIrC,CAAC;AAEL,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,CAW5F;AAMD,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,YAAY,CAY7C"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { facts, note, text } from "./content.js";
|
|
2
|
+
// Every email the cloud sends, as content only. The words follow the README's voice: plain, short, concrete.
|
|
3
|
+
const IGNORE = "If you did not ask for this, you can ignore this email. Nothing changes.";
|
|
4
|
+
const ACCOUNT_FOOTER = "You got this email because someone used this address on WizeLens.";
|
|
5
|
+
function account(subject, heading, lines, action) {
|
|
6
|
+
return { kind: "account", subject, preview: lines[0], heading, tone: "neutral", blocks: [...lines.map(text), note(IGNORE)], action, footer: ACCOUNT_FOOTER };
|
|
7
|
+
}
|
|
8
|
+
export const verifyEmail = (url) => account("Confirm your email for WizeLens", "Confirm your email.", ["Confirm that this is your email address. The link works for 1 hour."], { label: "Confirm email", url });
|
|
9
|
+
export const resetPassword = (url) => account("Reset your WizeLens password", "Reset your password.", ["Someone asked to reset the password of this account. The link works for 30 minutes, once.", "A new password signs out every device."], {
|
|
10
|
+
label: "Set a new password",
|
|
11
|
+
url,
|
|
12
|
+
});
|
|
13
|
+
export const changeEmail = (newEmail, url) => account("Confirm your new WizeLens email", "Confirm the new email.", [`Someone asked to change the email of this account to ${newEmail}.`, "Confirm it here first. Then we send a link to the new address."], {
|
|
14
|
+
label: "Confirm the change",
|
|
15
|
+
url,
|
|
16
|
+
});
|
|
17
|
+
export const deleteAccount = (url) => account("Confirm deleting your WizeLens account", "Delete your account?", ["Someone asked to delete this account. This cannot be undone. The link works for 1 day."], {
|
|
18
|
+
label: "Delete my account",
|
|
19
|
+
url,
|
|
20
|
+
});
|
|
21
|
+
export function invite(inviter, org, role, url) {
|
|
22
|
+
return {
|
|
23
|
+
kind: "invite",
|
|
24
|
+
subject: `${inviter} invited you to ${org} on WizeLens`,
|
|
25
|
+
preview: `Join ${org} as ${role}.`,
|
|
26
|
+
heading: `Join ${org}.`,
|
|
27
|
+
tone: "neutral",
|
|
28
|
+
blocks: [text(`${inviter} invited you to join ${org} on WizeLens as ${role}.`), facts([["Team", org], ["Role", role], ["Works for", "7 days"]])],
|
|
29
|
+
action: { label: `Join ${org}`, url },
|
|
30
|
+
footer: `${inviter} sent this invite. If you do not know them, ignore it.`,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const VERB = { fired: "Alert", resolved: "Resolved", test: "Test" };
|
|
34
|
+
const TONE = { fired: "bad", resolved: "good", test: "neutral" };
|
|
35
|
+
const number = (v) => (v === null ? "no data" : String(Math.round(v * 100) / 100));
|
|
36
|
+
export function alert(n) {
|
|
37
|
+
const when = `${new Date(n.timeMs).toISOString().slice(0, 16).replace("T", " ")} UTC`;
|
|
38
|
+
return {
|
|
39
|
+
kind: "alert",
|
|
40
|
+
subject: `${VERB[n.state]}: ${n.rule} (${n.project})`,
|
|
41
|
+
preview: n.message,
|
|
42
|
+
heading: `${VERB[n.state]}: ${n.rule}.`,
|
|
43
|
+
tone: TONE[n.state],
|
|
44
|
+
blocks: [text(n.message), facts([["Project", n.project], ["Value", number(n.value)], ["Threshold", number(n.threshold)], ["When", when]])],
|
|
45
|
+
action: { label: "Open the alert", url: n.url },
|
|
46
|
+
footer: `You get this because an alert rule in ${n.project} emails you. Change it on the Alerts page.`,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=emails.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emails.js","sourceRoot":"","sources":["../../src/mail/emails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { EmailContent } from "./content.js";
|
|
2
|
+
/** The frame every email shares: a light page, one white card with a top stripe in the tone's color, the header, the body, and the footer under the card. */
|
|
3
|
+
export declare function EmailLayout({ content: c }: {
|
|
4
|
+
content: EmailContent;
|
|
5
|
+
}): import("react").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=layout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../src/mail/layout.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKjD,6JAA6J;AAC7J,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE;IAAE,OAAO,EAAE,YAAY,CAAA;CAAE,+BAwCpE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Body, Container, Head, Heading, Hr, Html, Link, Preview, Section, Text } from "@react-email/components";
|
|
3
|
+
import { Action, BlockView, Header } from "./blocks.js";
|
|
4
|
+
import { theme } from "./theme.js";
|
|
5
|
+
const footerText = { margin: "0 0 4px", fontSize: "12px", lineHeight: "18px", color: theme.muted };
|
|
6
|
+
/** The frame every email shares: a light page, one white card with a top stripe in the tone's color, the header, the body, and the footer under the card. */
|
|
7
|
+
export function EmailLayout({ content: c }) {
|
|
8
|
+
return (_jsxs(Html, { lang: "en", children: [_jsxs(Head, { children: [_jsx("meta", { name: "color-scheme", content: "light" }), _jsx("meta", { name: "supported-color-schemes", content: "light" })] }), _jsx(Preview, { children: c.preview }), _jsxs(Body, { style: { margin: 0, padding: "32px 12px", background: theme.page, fontFamily: theme.sans }, children: [_jsxs(Container, { style: { maxWidth: `${theme.width}px`, background: theme.card, border: `1px solid ${theme.line}`, borderTop: `4px solid ${theme.tone[c.tone]}`, borderRadius: theme.radius }, children: [_jsx(Header, { tone: c.tone }), _jsxs(Section, { style: { padding: "8px 32px 8px" }, children: [_jsx(Heading, { as: "h1", style: { margin: "16px 0", fontSize: "26px", lineHeight: "32px", fontWeight: 800, letterSpacing: "-0.02em", color: theme.ink }, children: c.heading }), c.blocks.map((b, i) => (_jsx(BlockView, { block: b }, i))), c.action && _jsx(Action, { action: c.action })] })] }), _jsxs(Container, { style: { maxWidth: `${theme.width}px`, padding: "16px 32px 0" }, children: [_jsx(Text, { style: footerText, children: c.footer }), c.unsubscribe && (_jsx(Text, { style: footerText, children: _jsx(Link, { href: c.unsubscribe.url, style: { color: theme.muted, textDecoration: "underline" }, children: c.unsubscribe.label }) })), _jsx(Hr, { style: { margin: "12px 0", borderColor: theme.line } }), _jsx(Text, { style: footerText, children: _jsx(Link, { href: theme.homeUrl, style: { color: theme.muted }, children: theme.company }) })] })] })] }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/mail/layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CloudConfig } from "../config.js";
|
|
2
|
+
import type { Queryable } from "../db/db.js";
|
|
3
|
+
/** "account": mail the person asked for. "security": notices about their own account. The rest: mail someone or something else started. */
|
|
4
|
+
export type MailKind = "account" | "security" | "invite" | "alert" | "team" | "health" | "digest";
|
|
5
|
+
export interface Mail {
|
|
6
|
+
kind: MailKind;
|
|
7
|
+
to: string;
|
|
8
|
+
subject: string;
|
|
9
|
+
text: string;
|
|
10
|
+
html: string;
|
|
11
|
+
/** Extra headers, for example List-Unsubscribe. */
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export type MailVia = "resend" | "smtp" | "test" | "log";
|
|
15
|
+
export interface Mailer {
|
|
16
|
+
/** True when mail really leaves (Resend, SMTP, or a test sender). False: mail is written to the log only. */
|
|
17
|
+
readonly live: boolean;
|
|
18
|
+
readonly via: MailVia;
|
|
19
|
+
/** Queue one email (or one still rendering). Never throws and never waits, so a slow mail server cannot slow or reveal anything. */
|
|
20
|
+
send(mail: Mail | Promise<Mail>): void;
|
|
21
|
+
close(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
/** The cloud's mail, with the suppression list checked before each send. */
|
|
24
|
+
export declare function createMailer(config: CloudConfig, db: Queryable): Promise<Mailer>;
|
|
25
|
+
//# sourceMappingURL=mailer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mailer.d.ts","sourceRoot":"","sources":["../../src/mail/mailer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,2IAA2I;AAC3I,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAKlG,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,QAAQ,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAEzD,MAAM,WAAW,MAAM;IACrB,6GAA6G;IAC7G,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,oIAAoI;IACpI,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAkCD,4EAA4E;AAC5E,wBAAsB,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBtF"}
|