@wizeworks/lens-cloud 0.3.0-alpha.1 → 0.3.0-alpha.2

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.
Files changed (275) hide show
  1. package/README.md +57 -5
  2. package/dist/alerts/evaluate.d.ts.map +1 -1
  3. package/dist/alerts/evaluate.js +17 -2
  4. package/dist/alerts/evaluate.js.map +1 -1
  5. package/dist/alerts/notify.d.ts +13 -2
  6. package/dist/alerts/notify.d.ts.map +1 -1
  7. package/dist/alerts/notify.js +22 -16
  8. package/dist/alerts/notify.js.map +1 -1
  9. package/dist/app.d.ts +10 -2
  10. package/dist/app.d.ts.map +1 -1
  11. package/dist/auth/auth.d.ts +51 -0
  12. package/dist/auth/auth.d.ts.map +1 -0
  13. package/dist/auth/auth.js +63 -0
  14. package/dist/auth/auth.js.map +1 -0
  15. package/dist/auth/bridge.d.ts +7 -0
  16. package/dist/auth/bridge.d.ts.map +1 -0
  17. package/dist/auth/bridge.js +39 -0
  18. package/dist/auth/bridge.js.map +1 -0
  19. package/dist/auth/crypto.d.ts +0 -5
  20. package/dist/auth/crypto.d.ts.map +1 -1
  21. package/dist/auth/crypto.js +3 -20
  22. package/dist/auth/crypto.js.map +1 -1
  23. package/dist/auth/delete-user.d.ts +16 -0
  24. package/dist/auth/delete-user.d.ts.map +1 -0
  25. package/dist/auth/delete-user.js +21 -0
  26. package/dist/auth/delete-user.js.map +1 -0
  27. package/dist/auth/deps.d.ts +27 -0
  28. package/dist/auth/deps.d.ts.map +1 -0
  29. package/dist/auth/deps.js +3 -0
  30. package/dist/auth/deps.js.map +1 -0
  31. package/dist/auth/email-token.d.ts +8 -0
  32. package/dist/auth/email-token.d.ts.map +1 -0
  33. package/dist/auth/email-token.js +15 -0
  34. package/dist/auth/email-token.js.map +1 -0
  35. package/dist/auth/hooks.d.ts +4 -0
  36. package/dist/auth/hooks.d.ts.map +1 -0
  37. package/dist/auth/hooks.js +143 -0
  38. package/dist/auth/hooks.js.map +1 -0
  39. package/dist/auth/options.d.ts +17 -0
  40. package/dist/auth/options.d.ts.map +1 -0
  41. package/dist/auth/options.js +98 -0
  42. package/dist/auth/options.js.map +1 -0
  43. package/dist/auth/password.d.ts +10 -0
  44. package/dist/auth/password.d.ts.map +1 -0
  45. package/dist/auth/password.js +22 -0
  46. package/dist/auth/password.js.map +1 -0
  47. package/dist/auth/plugins.d.ts +4 -0
  48. package/dist/auth/plugins.d.ts.map +1 -0
  49. package/dist/auth/plugins.js +45 -0
  50. package/dist/auth/plugins.js.map +1 -0
  51. package/dist/auth/principal.d.ts +8 -3
  52. package/dist/auth/principal.d.ts.map +1 -1
  53. package/dist/auth/principal.js +13 -8
  54. package/dist/auth/principal.js.map +1 -1
  55. package/dist/auth/roles.d.ts +43 -3
  56. package/dist/auth/roles.d.ts.map +1 -1
  57. package/dist/auth/roles.js +15 -6
  58. package/dist/auth/roles.js.map +1 -1
  59. package/dist/auth/schema-names.d.ts +130 -0
  60. package/dist/auth/schema-names.d.ts.map +1 -0
  61. package/dist/auth/schema-names.js +53 -0
  62. package/dist/auth/schema-names.js.map +1 -0
  63. package/dist/auth/secret.d.ts +12 -0
  64. package/dist/auth/secret.d.ts.map +1 -0
  65. package/dist/auth/secret.js +32 -0
  66. package/dist/auth/secret.js.map +1 -0
  67. package/dist/auth/security-notices.d.ts +34 -0
  68. package/dist/auth/security-notices.d.ts.map +1 -0
  69. package/dist/auth/security-notices.js +81 -0
  70. package/dist/auth/security-notices.js.map +1 -0
  71. package/dist/auth/signup.d.ts +23 -0
  72. package/dist/auth/signup.d.ts.map +1 -0
  73. package/dist/auth/signup.js +61 -0
  74. package/dist/auth/signup.js.map +1 -0
  75. package/dist/auth/sso.d.ts +21 -0
  76. package/dist/auth/sso.d.ts.map +1 -0
  77. package/dist/auth/sso.js +35 -0
  78. package/dist/auth/sso.js.map +1 -0
  79. package/dist/auth/wire.d.ts +16 -0
  80. package/dist/auth/wire.d.ts.map +1 -0
  81. package/dist/auth/wire.js +47 -0
  82. package/dist/auth/wire.js.map +1 -0
  83. package/dist/cli-args.d.ts +1 -1
  84. package/dist/cli-args.d.ts.map +1 -1
  85. package/dist/cli-args.js +55 -14
  86. package/dist/cli-args.js.map +1 -1
  87. package/dist/cli.js +18 -2
  88. package/dist/cli.js.map +1 -1
  89. package/dist/config.d.ts +26 -4
  90. package/dist/config.d.ts.map +1 -1
  91. package/dist/config.js +35 -0
  92. package/dist/config.js.map +1 -1
  93. package/dist/db/db.d.ts +5 -2
  94. package/dist/db/db.d.ts.map +1 -1
  95. package/dist/db/db.js +15 -8
  96. package/dist/db/db.js.map +1 -1
  97. package/dist/db/migrate.d.ts +2 -2
  98. package/dist/db/migrate.d.ts.map +1 -1
  99. package/dist/db/migrate.js +15 -5
  100. package/dist/db/migrate.js.map +1 -1
  101. package/dist/db/schema-auth.d.ts +2 -0
  102. package/dist/db/schema-auth.d.ts.map +1 -0
  103. package/dist/db/schema-auth.js +93 -0
  104. package/dist/db/schema-auth.js.map +1 -0
  105. package/dist/db/schema-mail.d.ts +2 -0
  106. package/dist/db/schema-mail.d.ts.map +1 -0
  107. package/dist/db/schema-mail.js +8 -0
  108. package/dist/db/schema-mail.js.map +1 -0
  109. package/dist/db/schema-notify.d.ts +2 -0
  110. package/dist/db/schema-notify.d.ts.map +1 -0
  111. package/dist/db/schema-notify.js +26 -0
  112. package/dist/db/schema-notify.js.map +1 -0
  113. package/dist/db/schema-sso.d.ts +2 -0
  114. package/dist/db/schema-sso.d.ts.map +1 -0
  115. package/dist/db/schema-sso.js +17 -0
  116. package/dist/db/schema-sso.js.map +1 -0
  117. package/dist/db/schema.d.ts.map +1 -1
  118. package/dist/db/schema.js +8 -0
  119. package/dist/db/schema.js.map +1 -1
  120. package/dist/http/http.d.ts +2 -0
  121. package/dist/http/http.d.ts.map +1 -1
  122. package/dist/http/http.js +7 -3
  123. package/dist/http/http.js.map +1 -1
  124. package/dist/jobs.d.ts +1 -1
  125. package/dist/jobs.d.ts.map +1 -1
  126. package/dist/jobs.js +14 -3
  127. package/dist/jobs.js.map +1 -1
  128. package/dist/mail/blocks.d.ts +14 -0
  129. package/dist/mail/blocks.d.ts.map +1 -0
  130. package/dist/mail/blocks.js +35 -0
  131. package/dist/mail/blocks.js.map +1 -0
  132. package/dist/mail/content.d.ts +68 -0
  133. package/dist/mail/content.d.ts.map +1 -0
  134. package/dist/mail/content.js +6 -0
  135. package/dist/mail/content.js.map +1 -0
  136. package/dist/mail/emails-digest.d.ts +10 -0
  137. package/dist/mail/emails-digest.d.ts.map +1 -0
  138. package/dist/mail/emails-digest.js +55 -0
  139. package/dist/mail/emails-digest.js.map +1 -0
  140. package/dist/mail/emails-health.d.ts +6 -0
  141. package/dist/mail/emails-health.d.ts.map +1 -0
  142. package/dist/mail/emails-health.js +36 -0
  143. package/dist/mail/emails-health.js.map +1 -0
  144. package/dist/mail/emails-security.d.ts +14 -0
  145. package/dist/mail/emails-security.d.ts.map +1 -0
  146. package/dist/mail/emails-security.js +27 -0
  147. package/dist/mail/emails-security.js.map +1 -0
  148. package/dist/mail/emails-team.d.ts +11 -0
  149. package/dist/mail/emails-team.d.ts.map +1 -0
  150. package/dist/mail/emails-team.js +45 -0
  151. package/dist/mail/emails-team.js.map +1 -0
  152. package/dist/mail/emails.d.ts +9 -0
  153. package/dist/mail/emails.d.ts.map +1 -0
  154. package/dist/mail/emails.js +49 -0
  155. package/dist/mail/emails.js.map +1 -0
  156. package/dist/mail/layout.d.ts +6 -0
  157. package/dist/mail/layout.d.ts.map +1 -0
  158. package/dist/mail/layout.js +10 -0
  159. package/dist/mail/layout.js.map +1 -0
  160. package/dist/mail/mailer.d.ts +25 -0
  161. package/dist/mail/mailer.d.ts.map +1 -0
  162. package/dist/mail/mailer.js +49 -0
  163. package/dist/mail/mailer.js.map +1 -0
  164. package/dist/mail/preview.d.ts +6 -0
  165. package/dist/mail/preview.d.ts.map +1 -0
  166. package/dist/mail/preview.js +26 -0
  167. package/dist/mail/preview.js.map +1 -0
  168. package/dist/mail/resend.d.ts +11 -0
  169. package/dist/mail/resend.d.ts.map +1 -0
  170. package/dist/mail/resend.js +34 -0
  171. package/dist/mail/resend.js.map +1 -0
  172. package/dist/mail/samples.d.ts +3 -0
  173. package/dist/mail/samples.d.ts.map +1 -0
  174. package/dist/mail/samples.js +63 -0
  175. package/dist/mail/samples.js.map +1 -0
  176. package/dist/mail/stop-route.d.ts +4 -0
  177. package/dist/mail/stop-route.d.ts.map +1 -0
  178. package/dist/mail/stop-route.js +41 -0
  179. package/dist/mail/stop-route.js.map +1 -0
  180. package/dist/mail/svix.d.ts +8 -0
  181. package/dist/mail/svix.d.ts.map +1 -0
  182. package/dist/mail/svix.js +17 -0
  183. package/dist/mail/svix.js.map +1 -0
  184. package/dist/mail/templates.d.ts +12 -0
  185. package/dist/mail/templates.d.ts.map +1 -0
  186. package/dist/mail/templates.js +18 -0
  187. package/dist/mail/templates.js.map +1 -0
  188. package/dist/mail/text.d.ts +4 -0
  189. package/dist/mail/text.d.ts.map +1 -0
  190. package/dist/mail/text.js +17 -0
  191. package/dist/mail/text.js.map +1 -0
  192. package/dist/mail/theme.d.ts +26 -0
  193. package/dist/mail/theme.d.ts.map +1 -0
  194. package/dist/mail/theme.js +21 -0
  195. package/dist/mail/theme.js.map +1 -0
  196. package/dist/mail/unsubscribe.d.ts +14 -0
  197. package/dist/mail/unsubscribe.d.ts.map +1 -0
  198. package/dist/mail/unsubscribe.js +39 -0
  199. package/dist/mail/unsubscribe.js.map +1 -0
  200. package/dist/mail/webhook.d.ts +5 -0
  201. package/dist/mail/webhook.d.ts.map +1 -0
  202. package/dist/mail/webhook.js +41 -0
  203. package/dist/mail/webhook.js.map +1 -0
  204. package/dist/notify/digest-data.d.ts +31 -0
  205. package/dist/notify/digest-data.d.ts.map +1 -0
  206. package/dist/notify/digest-data.js +37 -0
  207. package/dist/notify/digest-data.js.map +1 -0
  208. package/dist/notify/digest.d.ts +17 -0
  209. package/dist/notify/digest.d.ts.map +1 -0
  210. package/dist/notify/digest.js +76 -0
  211. package/dist/notify/digest.js.map +1 -0
  212. package/dist/notify/health.d.ts +6 -0
  213. package/dist/notify/health.d.ts.map +1 -0
  214. package/dist/notify/health.js +43 -0
  215. package/dist/notify/health.js.map +1 -0
  216. package/dist/notify/team-describe.d.ts +22 -0
  217. package/dist/notify/team-describe.d.ts.map +1 -0
  218. package/dist/notify/team-describe.js +67 -0
  219. package/dist/notify/team-describe.js.map +1 -0
  220. package/dist/notify/team.d.ts +6 -0
  221. package/dist/notify/team.d.ts.map +1 -0
  222. package/dist/notify/team.js +56 -0
  223. package/dist/notify/team.js.map +1 -0
  224. package/dist/repo/alerts.d.ts +6 -2
  225. package/dist/repo/alerts.d.ts.map +1 -1
  226. package/dist/repo/alerts.js.map +1 -1
  227. package/dist/repo/auth-prune.d.ts +4 -0
  228. package/dist/repo/auth-prune.d.ts.map +1 -0
  229. package/dist/repo/auth-prune.js +8 -0
  230. package/dist/repo/auth-prune.js.map +1 -0
  231. package/dist/repo/mail-prefs.d.ts +35 -0
  232. package/dist/repo/mail-prefs.d.ts.map +1 -0
  233. package/dist/repo/mail-prefs.js +34 -0
  234. package/dist/repo/mail-prefs.js.map +1 -0
  235. package/dist/repo/orgs.d.ts +15 -25
  236. package/dist/repo/orgs.d.ts.map +1 -1
  237. package/dist/repo/orgs.js +18 -60
  238. package/dist/repo/orgs.js.map +1 -1
  239. package/dist/repo/suppressions.d.ts +8 -0
  240. package/dist/repo/suppressions.d.ts.map +1 -0
  241. package/dist/repo/suppressions.js +16 -0
  242. package/dist/repo/suppressions.js.map +1 -0
  243. package/dist/repo/users.d.ts +5 -16
  244. package/dist/repo/users.d.ts.map +1 -1
  245. package/dist/repo/users.js +2 -60
  246. package/dist/repo/users.js.map +1 -1
  247. package/dist/routes/alerts.d.ts.map +1 -1
  248. package/dist/routes/alerts.js +23 -6
  249. package/dist/routes/alerts.js.map +1 -1
  250. package/dist/routes/index.d.ts.map +1 -1
  251. package/dist/routes/index.js +4 -2
  252. package/dist/routes/index.js.map +1 -1
  253. package/dist/routes/me.d.ts +4 -0
  254. package/dist/routes/me.d.ts.map +1 -0
  255. package/dist/routes/me.js +37 -0
  256. package/dist/routes/me.js.map +1 -0
  257. package/dist/routes/notify.d.ts +4 -0
  258. package/dist/routes/notify.d.ts.map +1 -0
  259. package/dist/routes/notify.js +55 -0
  260. package/dist/routes/notify.js.map +1 -0
  261. package/dist/routes/orgs.d.ts.map +1 -1
  262. package/dist/routes/orgs.js +30 -53
  263. package/dist/routes/orgs.js.map +1 -1
  264. package/dist/routes/projects.d.ts.map +1 -1
  265. package/dist/routes/projects.js +4 -3
  266. package/dist/routes/projects.js.map +1 -1
  267. package/dist/server.d.ts +2 -0
  268. package/dist/server.d.ts.map +1 -1
  269. package/dist/server.js +45 -14
  270. package/dist/server.js.map +1 -1
  271. package/package.json +19 -6
  272. package/dist/routes/auth.d.ts +0 -4
  273. package/dist/routes/auth.d.ts.map +0 -1
  274. package/dist/routes/auth.js +0 -106
  275. package/dist/routes/auth.js.map +0 -1
package/dist/server.js CHANGED
@@ -2,6 +2,9 @@ import { createRequire } from "node:module";
2
2
  import { createServer } from "node:http";
3
3
  import { otlpSignalOf } from "@wizeworks/lens-hub/kit";
4
4
  import { resolveUiDir, serveUi } from "@wizeworks/lens-node/kit";
5
+ import { authHandler } from "./auth/bridge.js";
6
+ import { AUTH_BASE_PATH } from "./auth/options.js";
7
+ import { wireAuth } from "./auth/wire.js";
5
8
  import { resolveConfig } from "./config.js";
6
9
  import { openDb } from "./db/db.js";
7
10
  import { migrate } from "./db/migrate.js";
@@ -9,6 +12,10 @@ import { HttpError, sendJson } from "./http/http.js";
9
12
  import { RateLimiter } from "./http/limiter.js";
10
13
  import { Router } from "./http/router.js";
11
14
  import { startJobs } from "./jobs.js";
15
+ import { createMailer } from "./mail/mailer.js";
16
+ import { stopRoute } from "./mail/stop-route.js";
17
+ import { UNSUBSCRIBE_PATH } from "./mail/unsubscribe.js";
18
+ import { RESEND_WEBHOOK_PATH, resendWebhook } from "./mail/webhook.js";
12
19
  import { checkFactsVersion } from "./settle.js";
13
20
  import { allRoutes } from "./routes/index.js";
14
21
  import { ingestBatch, ingestOtlp } from "./routes/ingest.js";
@@ -21,6 +28,12 @@ async function routeBase(p, ctx, sub) {
21
28
  const { req, res } = ctx;
22
29
  if (sub === "api/ingest" && req.method === "POST")
23
30
  return ingestBatch(ctx, p.ingest);
31
+ // Resend signs its webhook, so it needs no dashboard header.
32
+ if (sub === RESEND_WEBHOOK_PATH && req.method === "POST")
33
+ return resendWebhook(ctx);
34
+ // Stop links come from mail apps (RFC 8058 one-click POST), with the signed token as the only proof.
35
+ if (sub === UNSUBSCRIBE_PATH && (req.method === "GET" || req.method === "POST"))
36
+ return stopRoute(ctx);
24
37
  if (needsClientHeader(req, sub) && req.headers["x-wizelens-client"] !== "dashboard")
25
38
  throw new HttpError(403, "Missing the X-WizeLens-Client header.");
26
39
  const m = p.router.match(req.method ?? "GET", sub);
@@ -40,6 +53,8 @@ async function route(p, req, res) {
40
53
  return void res.writeHead(200, { "Content-Type": "text/plain" }).end("ok");
41
54
  if (path === "/" || path === BASE)
42
55
  return void res.writeHead(302, { Location: `${BASE}/${url.search}` }).end();
56
+ if (path.startsWith(`${AUTH_BASE_PATH}/`))
57
+ return p.auth()(req, res);
43
58
  const signal = otlpSignalOf(path);
44
59
  if (signal && req.method === "POST")
45
60
  return ingestOtlp(ctx, signal, p.ingest);
@@ -55,39 +70,55 @@ function onError(err, res) {
55
70
  console.error("[wizelens-cloud]", err);
56
71
  sendJson(res, 500, { error: "Something went wrong on the server." });
57
72
  }
58
- function makeApp(db, options) {
73
+ /** Open the database, bring its schema up to date, and build the server. Call `listen()` to start. */
74
+ export async function createCloud(options = {}) {
59
75
  const config = resolveConfig(options);
60
- return {
76
+ const db = await openDb(config.database);
77
+ await migrate(db);
78
+ await checkFactsVersion(db);
79
+ const mailer = await createMailer(config, db);
80
+ const wiring = await wireAuth(db, config, mailer);
81
+ let auth;
82
+ let handler;
83
+ let listenUrl = config.publicUrl ?? `http://localhost:${config.port}`;
84
+ const app = {
61
85
  db,
62
86
  config,
63
87
  version: CLOUD_VERSION,
64
88
  startedMs: config.now(),
65
- baseUrl: (req) => config.publicUrl ?? `${req.headers["x-forwarded-proto"] === "https" ? "https" : "http"}://${req.headers.host ?? "localhost"}`,
89
+ mailer,
90
+ secrets: wiring.secrets,
91
+ get auth() {
92
+ if (!auth)
93
+ throw new Error("The cloud is not listening yet.");
94
+ return auth;
95
+ },
96
+ baseUrl: () => config.publicUrl ?? listenUrl,
66
97
  };
67
- }
68
- /** Open the database, bring its schema up to date, and build the server. Call `listen()` to start. */
69
- export async function createCloud(options = {}) {
70
- const db = await openDb(resolveConfig(options).database);
71
- await migrate(db);
72
- await checkFactsVersion(db);
73
- const app = makeApp(db, options);
74
- const parts = { app, router: allRoutes(), ingest: new RateLimiter(app.config.ingestPerMinute, 60_000, app.config.now), uiDir: resolveUiDir(app.config.uiDir) };
98
+ const ready = (url) => ((listenUrl = url), (auth = wiring.start(url)), (handler = authHandler(auth, config.trustProxy)));
99
+ if (config.publicUrl)
100
+ ready(config.publicUrl);
101
+ const parts = { app, router: allRoutes(), ingest: new RateLimiter(config.ingestPerMinute, 60_000, config.now), uiDir: resolveUiDir(config.uiDir), auth: () => handler };
75
102
  const server = createServer((req, res) => void route(parts, req, res).catch((err) => onError(err, res)));
76
- const stopJobs = startJobs(app);
103
+ const stopJobs = config.jobs ? startJobs(app) : () => { };
77
104
  return {
78
105
  server,
79
106
  app,
107
+ setupLink: wiring.setupLink,
80
108
  listen: () => new Promise((resolve, reject) => {
81
109
  server.once("error", reject);
82
- server.listen(app.config.port, app.config.host, () => {
110
+ server.listen(config.port, config.host, () => {
83
111
  const { port } = server.address();
84
- resolve(app.config.publicUrl ?? `http://localhost:${port}`);
112
+ if (!config.publicUrl)
113
+ ready(`http://localhost:${port}`);
114
+ resolve(config.publicUrl ?? `http://localhost:${port}`);
85
115
  });
86
116
  }),
87
117
  close: async () => {
88
118
  stopJobs();
89
119
  server.closeAllConnections?.();
90
120
  await new Promise((resolve) => server.close(() => resolve()));
121
+ await mailer.close();
91
122
  await db.close();
92
123
  },
93
124
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wizeworks/lens-cloud",
3
- "version": "0.3.0-alpha.1",
3
+ "version": "0.3.0-alpha.2",
4
4
  "description": "The WizeLens cloud service: many organizations, accounts and teams, server-side stats, alerts, sharing, and scoped AI access, on Postgres.",
5
5
  "license": "MIT",
6
6
  "author": "WizeWorks LLC",
@@ -42,16 +42,28 @@
42
42
  "node": ">=22.13"
43
43
  },
44
44
  "dependencies": {
45
+ "@better-auth/passkey": "1.7.10",
46
+ "@better-auth/sso": "1.7.10",
45
47
  "@electric-sql/pglite": "^0.5.10",
48
+ "@react-email/components": "1.0.12",
49
+ "better-auth": "1.7.10",
50
+ "kysely": "^0.29.6",
51
+ "kysely-pglite-dialect": "^1.4.0",
52
+ "nodemailer": "^10.1.2",
46
53
  "pg": "^8.23.1",
47
- "@wizeworks/lens-core": "^0.3.0-alpha.1",
48
- "@wizeworks/lens-hub": "^0.3.0-alpha.1",
49
- "@wizeworks/lens-node": "^0.3.0-alpha.1",
50
- "@wizeworks/lens-ui": "^0.3.0-alpha.1"
54
+ "react": "^19.3.1",
55
+ "react-dom": "^19.3.1",
56
+ "@wizeworks/lens-core": "^0.3.0-alpha.2",
57
+ "@wizeworks/lens-hub": "^0.3.0-alpha.2",
58
+ "@wizeworks/lens-ui": "^0.3.0-alpha.2",
59
+ "@wizeworks/lens-node": "^0.3.0-alpha.2"
51
60
  },
52
61
  "devDependencies": {
53
62
  "@types/node": "^24.19.2",
63
+ "@types/nodemailer": "^8.0.2",
54
64
  "@types/pg": "^8.23.1",
65
+ "@types/react": "^19.3.0",
66
+ "@types/react-dom": "^19.3.0",
55
67
  "typescript": "^7.0.2",
56
68
  "vitest": "^5.0.5"
57
69
  },
@@ -61,6 +73,7 @@
61
73
  "scripts": {
62
74
  "build": "tsc -p tsconfig.build.json",
63
75
  "test": "vitest run",
64
- "start": "node dist/cli.js"
76
+ "start": "node dist/cli.js",
77
+ "email:preview": "node dist/mail/preview.js"
65
78
  }
66
79
  }
@@ -1,4 +0,0 @@
1
- import type { Ctx } from "../app.js";
2
- import type { Router } from "../http/router.js";
3
- export declare function authRoutes(r: Router<Ctx>): void;
4
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGrC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA8FhD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAQ/C"}
@@ -1,106 +0,0 @@
1
- import { principalOf, requireUser, SESSION_COOKIE } from "../auth/principal.js";
2
- import { cookie, cookieOf, fail, readJsonBody, sendJson, str } from "../http/http.js";
3
- import { audit } from "../repo/audit.js";
4
- import { acceptInvite, createOrg, openInvite, orgsOfUser } from "../repo/orgs.js";
5
- import { createProject, listProjects } from "../repo/projects.js";
6
- import { createSession, createUser, endSession, signUpProblem, userByEmail, userCount, verifyLogin } from "../repo/users.js";
7
- const MAX_AGE_S = 30 * 24 * 60 * 60;
8
- async function signIn(ctx, user, status = 200) {
9
- const { token } = await createSession(ctx.app.db, user.id, ctx.app.config.now());
10
- const set = cookie(SESSION_COOKIE, token, MAX_AGE_S, ctx.app.config.secureCookies);
11
- sendJson(ctx.res, status, { user }, { "Set-Cookie": set });
12
- }
13
- /** The signed-in person with their organizations and each one's projects. */
14
- async function meOf(ctx, user) {
15
- const orgs = await orgsOfUser(ctx.app.db, user.id);
16
- const withProjects = await Promise.all(orgs.map(async (o) => ({ ...o, projects: await listProjects(ctx.app.db, o.id) })));
17
- return { user, orgs: withProjects };
18
- }
19
- async function state(ctx) {
20
- const p = await principalOf(ctx);
21
- const needsSetup = (await userCount(ctx.app.db)) === 0;
22
- const me = p?.kind === "user" ? await meOf(ctx, p.user) : null;
23
- sendJson(ctx.res, 200, { signedIn: !!me, needsSetup, signup: ctx.app.config.signup, ...(me ?? {}) });
24
- }
25
- /** The first account: creates the person, their organization, and a first project. Only while no account exists. */
26
- async function setup(ctx) {
27
- const body = await readJsonBody(ctx.req);
28
- const [email, password, name] = [str(body, "email"), str(body, "password"), str(body, "name")];
29
- const problem = signUpProblem(email, password, name);
30
- if (problem)
31
- fail(400, problem);
32
- const now = ctx.app.config.now();
33
- const user = await ctx.app.db.tx(async (q) => {
34
- if ((await userCount(q)) > 0)
35
- fail(409, "Setup is already done. Sign in instead.");
36
- const u = await createUser(q, email, password, name, now);
37
- const org = await createOrg(q, str(body, "orgName", false) || `${name.trim()}'s team`, u.id, now, ctx.app.config.retentionDays);
38
- await createProject(q, org.id, str(body, "projectName", false) || "My app", now);
39
- await audit(q, org.id, `user:${u.id}`, "org.create", { name: org.name }, now);
40
- return u;
41
- });
42
- await signIn(ctx, user, 201);
43
- }
44
- /** A new account. Needs an invite, unless sign-up is open (then it gets its own organization). */
45
- async function signup(ctx) {
46
- const body = await readJsonBody(ctx.req);
47
- const [email, password, name, invite] = [str(body, "email"), str(body, "password"), str(body, "name"), str(body, "invite", false)];
48
- const problem = signUpProblem(email, password, name);
49
- if (problem)
50
- fail(400, problem);
51
- const now = ctx.app.config.now();
52
- if (!invite && ctx.app.config.signup !== "open")
53
- fail(403, "Sign-up needs an invite link.");
54
- if (await userByEmail(ctx.app.db, email))
55
- fail(409, "An account with this email exists. Sign in instead.");
56
- const user = await ctx.app.db.tx(async (q) => {
57
- const open = invite ? await openInvite(q, invite, now) : undefined;
58
- if (invite && !open)
59
- fail(410, "This invite link is not valid any more.");
60
- const u = await createUser(q, email, password, name, now);
61
- if (open)
62
- await acceptInvite(q, invite, u.id, now);
63
- else
64
- await createProject(q, (await createOrg(q, `${name.trim()}'s team`, u.id, now, ctx.app.config.retentionDays)).id, "My app", now);
65
- return u;
66
- });
67
- await signIn(ctx, user, 201);
68
- }
69
- async function login(ctx) {
70
- const body = await readJsonBody(ctx.req);
71
- const user = await verifyLogin(ctx.app.db, str(body, "email"), str(body, "password"));
72
- if (!user)
73
- fail(401, "The email or password is not right.");
74
- await signIn(ctx, user);
75
- }
76
- async function logout(ctx) {
77
- const token = cookieOf(ctx.req, SESSION_COOKIE);
78
- if (token)
79
- await endSession(ctx.app.db, token);
80
- sendJson(ctx.res, 200, { ok: true }, { "Set-Cookie": cookie(SESSION_COOKIE, "", 0, ctx.app.config.secureCookies) });
81
- }
82
- async function showInvite(ctx) {
83
- const invite = await openInvite(ctx.app.db, ctx.params.token, ctx.app.config.now());
84
- if (!invite)
85
- fail(404, "This invite link is not valid any more.");
86
- sendJson(ctx.res, 200, { orgName: invite.orgName, email: invite.email, role: invite.role });
87
- }
88
- /** A signed-in person joins with an invite link. */
89
- async function joinInvite(ctx) {
90
- const user = await requireUser(ctx);
91
- const invite = await acceptInvite(ctx.app.db, ctx.params.token, user.id, ctx.app.config.now());
92
- if (!invite)
93
- fail(410, "This invite link is not valid any more.");
94
- await audit(ctx.app.db, invite.orgId, `user:${user.id}`, "member.join", { role: invite.role }, ctx.app.config.now());
95
- sendJson(ctx.res, 200, await meOf(ctx, user));
96
- }
97
- export function authRoutes(r) {
98
- r.on("GET", "api/auth/state", state)
99
- .on("POST", "api/auth/setup", setup)
100
- .on("POST", "api/auth/signup", signup)
101
- .on("POST", "api/auth/login", login)
102
- .on("POST", "api/auth/logout", logout)
103
- .on("GET", "api/auth/invites/:token", showInvite)
104
- .on("POST", "api/auth/invites/:token/accept", joinInvite);
105
- }
106
- //# sourceMappingURL=auth.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/routes/auth.ts"],"names":[],"mappings":"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"}