ugly-app 0.1.598 → 0.1.600

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 (41) hide show
  1. package/dist/cli/version.d.ts +1 -1
  2. package/dist/cli/version.js +1 -1
  3. package/dist/server/PostgresFilter.d.ts.map +1 -1
  4. package/dist/server/PostgresFilter.js +14 -3
  5. package/dist/server/PostgresFilter.js.map +1 -1
  6. package/package.json +1 -1
  7. package/src/cli/version.ts +1 -1
  8. package/src/server/PostgresFilter.test.ts +35 -0
  9. package/src/server/PostgresFilter.ts +19 -4
  10. package/dist/cli/uglyappConfig.test.d.ts +0 -2
  11. package/dist/cli/uglyappConfig.test.d.ts.map +0 -1
  12. package/dist/cli/uglyappConfig.test.js +0 -115
  13. package/dist/cli/uglyappConfig.test.js.map +0 -1
  14. package/dist/server/auth/buildAuth.integration.test.d.ts +0 -2
  15. package/dist/server/auth/buildAuth.integration.test.d.ts.map +0 -1
  16. package/dist/server/auth/buildAuth.integration.test.js +0 -152
  17. package/dist/server/auth/buildAuth.integration.test.js.map +0 -1
  18. package/dist/server/auth/buildAuth.test.d.ts +0 -2
  19. package/dist/server/auth/buildAuth.test.d.ts.map +0 -1
  20. package/dist/server/auth/buildAuth.test.js +0 -33
  21. package/dist/server/auth/buildAuth.test.js.map +0 -1
  22. package/dist/server/auth/googleProvider.test.d.ts +0 -2
  23. package/dist/server/auth/googleProvider.test.d.ts.map +0 -1
  24. package/dist/server/auth/googleProvider.test.js +0 -176
  25. package/dist/server/auth/googleProvider.test.js.map +0 -1
  26. package/dist/server/auth/hmac.test.d.ts +0 -2
  27. package/dist/server/auth/hmac.test.d.ts.map +0 -1
  28. package/dist/server/auth/hmac.test.js +0 -48
  29. package/dist/server/auth/hmac.test.js.map +0 -1
  30. package/dist/server/auth/magicLinkProvider.test.d.ts +0 -2
  31. package/dist/server/auth/magicLinkProvider.test.d.ts.map +0 -1
  32. package/dist/server/auth/magicLinkProvider.test.js +0 -249
  33. package/dist/server/auth/magicLinkProvider.test.js.map +0 -1
  34. package/dist/server/auth/userContext.test.d.ts +0 -2
  35. package/dist/server/auth/userContext.test.d.ts.map +0 -1
  36. package/dist/server/auth/userContext.test.js +0 -35
  37. package/dist/server/auth/userContext.test.js.map +0 -1
  38. package/dist/server/auth/userUpsert.test.d.ts +0 -2
  39. package/dist/server/auth/userUpsert.test.d.ts.map +0 -1
  40. package/dist/server/auth/userUpsert.test.js +0 -92
  41. package/dist/server/auth/userUpsert.test.js.map +0 -1
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.598";
1
+ export declare const CLI_VERSION = "0.1.600";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.598";
2
+ export const CLI_VERSION = "0.1.600";
3
3
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PostgresFilter.d.ts","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAgCD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,gBAAgB,CAoIlB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAW5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CASlE"}
1
+ {"version":3,"file":"PostgresFilter.d.ts","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAgCD,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,gBAAgB,CAmJlB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAW5E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CASlE"}
@@ -48,11 +48,15 @@ export function translateFilter(filter) {
48
48
  paramIdx++;
49
49
  break;
50
50
  case '$nin':
51
+ // Mongo `$nin` (like `$ne`) ALSO matches documents MISSING the
52
+ // field — only docs whose value is in the array are excluded. A
53
+ // bare `!= ALL($n)` is SQL UNKNOWN for a missing/null key, which
54
+ // wrongly drops those rows; include them via an explicit NULL test.
51
55
  if (TOP_LEVEL_COLUMNS.has(field)) {
52
- clauses.push(`${jsonbPath(field)} != ALL($${paramIdx})`);
56
+ clauses.push(`(${jsonbPath(field)} IS NULL OR ${jsonbPath(field)} != ALL($${paramIdx}))`);
53
57
  }
54
58
  else {
55
- clauses.push(`(${jsonbPath(field)} != ALL($${paramIdx}) AND NOT (${jsonbPath(field, false)} ?| $${paramIdx}))`);
59
+ clauses.push(`(${jsonbPath(field)} IS NULL OR (${jsonbPath(field)} != ALL($${paramIdx}) AND NOT (${jsonbPath(field, false)} ?| $${paramIdx})))`);
56
60
  }
57
61
  values.push(operand);
58
62
  paramIdx++;
@@ -106,7 +110,14 @@ export function translateFilter(filter) {
106
110
  clauses.push(`(${jsonbPath(field, false)} IS NOT NULL AND ${jsonbPath(field)} != 'null')`);
107
111
  }
108
112
  else {
109
- clauses.push(`${jsonbPath(field)} != $${paramIdx}`);
113
+ // Mongo semantics: `$ne: x` ALSO matches documents that are
114
+ // MISSING the field (or hold an explicit null) — only docs whose
115
+ // value equals `x` are excluded. A bare `<text> != $n` is SQL
116
+ // UNKNOWN for a missing/null key, which wrongly drops those rows
117
+ // (e.g. `{ visibility: { $ne: 'hidden' } }` silently hid every
118
+ // conversation/message with no `visibility` set). Include them
119
+ // via an explicit NULL test (`->>` is NULL for both cases).
120
+ clauses.push(`(${jsonbPath(field)} IS NULL OR ${jsonbPath(field)} != $${paramIdx})`);
110
121
  values.push(coerceTimestamp(field, operand));
111
122
  paramIdx++;
112
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PostgresFilter.js","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PostgresFilter.js","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.598",
3
+ "version": "0.1.600",
4
4
  "type": "module",
5
5
  "main": "./dist/server/index.js",
6
6
  "exports": {
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.598";
2
+ export const CLI_VERSION = "0.1.600";
@@ -0,0 +1,35 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { translateFilter } from './PostgresFilter';
3
+
4
+ describe('translateFilter — Mongo null semantics', () => {
5
+ // Regression: `$ne` / `$nin` must ALSO match documents missing the field
6
+ // (Mongo semantics). A bare `<text> != $n` / `!= ALL($n)` is SQL UNKNOWN for
7
+ // a missing/null key, which silently dropped rows with no value set — e.g.
8
+ // `{ visibility: { $ne: 'hidden' } }` hid every conversation/message that had
9
+ // never had `visibility` denormalized onto it.
10
+ it('$ne on a JSON field includes rows where the field is null/missing', () => {
11
+ const { where, values } = translateFilter({ visibility: { $ne: 'hidden' } });
12
+ expect(where).toContain('IS NULL');
13
+ expect(where).toBe(`(data->>'visibility' IS NULL OR data->>'visibility' != $1)`);
14
+ expect(values).toEqual(['hidden']);
15
+ });
16
+
17
+ it('$nin on a JSON field includes rows where the field is null/missing', () => {
18
+ const { where, values } = translateFilter({ status: { $nin: ['a', 'b'] } });
19
+ expect(where).toContain('IS NULL');
20
+ expect(where.startsWith(`(data->>'status' IS NULL OR`)).toBe(true);
21
+ expect(values).toEqual([['a', 'b']]);
22
+ });
23
+
24
+ it('$ne: null stays an explicit IS-NOT-NULL test (unchanged)', () => {
25
+ const { where } = translateFilter({ deletedAt: { $ne: null } });
26
+ expect(where).toContain('IS NOT NULL');
27
+ });
28
+
29
+ it('range operators still do NOT match missing fields', () => {
30
+ // A missing field is not `> x` in Mongo — these must remain UNKNOWN/excluded.
31
+ const { where } = translateFilter({ score: { $gt: 5 } });
32
+ expect(where).not.toContain('IS NULL');
33
+ expect(where).toContain('> $1');
34
+ });
35
+ });
@@ -64,14 +64,20 @@ export function translateFilter(
64
64
  paramIdx++;
65
65
  break;
66
66
  case '$nin':
67
+ // Mongo `$nin` (like `$ne`) ALSO matches documents MISSING the
68
+ // field — only docs whose value is in the array are excluded. A
69
+ // bare `!= ALL($n)` is SQL UNKNOWN for a missing/null key, which
70
+ // wrongly drops those rows; include them via an explicit NULL test.
67
71
  if (TOP_LEVEL_COLUMNS.has(field)) {
68
- clauses.push(`${jsonbPath(field)} != ALL($${paramIdx})`);
72
+ clauses.push(
73
+ `(${jsonbPath(field)} IS NULL OR ${jsonbPath(field)} != ALL($${paramIdx}))`,
74
+ );
69
75
  } else {
70
76
  clauses.push(
71
- `(${jsonbPath(field)} != ALL($${paramIdx}) AND NOT (${jsonbPath(
77
+ `(${jsonbPath(field)} IS NULL OR (${jsonbPath(field)} != ALL($${paramIdx}) AND NOT (${jsonbPath(
72
78
  field,
73
79
  false,
74
- )} ?| $${paramIdx}))`,
80
+ )} ?| $${paramIdx})))`,
75
81
  );
76
82
  }
77
83
  values.push(operand);
@@ -127,7 +133,16 @@ export function translateFilter(
127
133
  `(${jsonbPath(field, false)} IS NOT NULL AND ${jsonbPath(field)} != 'null')`,
128
134
  );
129
135
  } else {
130
- clauses.push(`${jsonbPath(field)} != $${paramIdx}`);
136
+ // Mongo semantics: `$ne: x` ALSO matches documents that are
137
+ // MISSING the field (or hold an explicit null) — only docs whose
138
+ // value equals `x` are excluded. A bare `<text> != $n` is SQL
139
+ // UNKNOWN for a missing/null key, which wrongly drops those rows
140
+ // (e.g. `{ visibility: { $ne: 'hidden' } }` silently hid every
141
+ // conversation/message with no `visibility` set). Include them
142
+ // via an explicit NULL test (`->>` is NULL for both cases).
143
+ clauses.push(
144
+ `(${jsonbPath(field)} IS NULL OR ${jsonbPath(field)} != $${paramIdx})`,
145
+ );
131
146
  values.push(coerceTimestamp(field, operand));
132
147
  paramIdx++;
133
148
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=uglyappConfig.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uglyappConfig.test.d.ts","sourceRoot":"","sources":["../../src/cli/uglyappConfig.test.ts"],"names":[],"mappings":""}
@@ -1,115 +0,0 @@
1
- import fs from 'fs';
2
- import os from 'os';
3
- import path from 'path';
4
- import { afterEach, beforeEach, describe, expect, it } from 'vitest';
5
- import { readUglyAppConfig, resolveAuthMode, writeUglyAppConfig } from './uglyappConfig.js';
6
- let tmpDir;
7
- beforeEach(() => {
8
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'uglyapp-test-'));
9
- });
10
- afterEach(() => {
11
- fs.rmSync(tmpDir, { recursive: true });
12
- });
13
- describe('domain field', () => {
14
- it('round-trips domain through write and read', () => {
15
- writeUglyAppConfig(tmpDir, {
16
- projectId: 'abc',
17
- domain: 'myapp.com',
18
- });
19
- const result = readUglyAppConfig(tmpDir);
20
- expect(result?.domain).toBe('myapp.com');
21
- });
22
- it('round-trips without domain (optional)', () => {
23
- writeUglyAppConfig(tmpDir, { projectId: 'abc' });
24
- const result = readUglyAppConfig(tmpDir);
25
- expect(result?.domain).toBeUndefined();
26
- });
27
- it('does not erase domain on re-write', () => {
28
- writeUglyAppConfig(tmpDir, {
29
- projectId: 'abc',
30
- domain: 'myapp.com',
31
- });
32
- const config = readUglyAppConfig(tmpDir);
33
- writeUglyAppConfig(tmpDir, config); // re-save without changes
34
- expect(readUglyAppConfig(tmpDir)?.domain).toBe('myapp.com');
35
- });
36
- });
37
- describe('auth config', () => {
38
- function writeRaw(obj) {
39
- fs.writeFileSync(path.join(tmpDir, '.uglyapp'), JSON.stringify(obj, null, 2), 'utf-8');
40
- }
41
- it("accepts auth.mode='uglybot'", () => {
42
- writeRaw({ projectId: 'abc', auth: { mode: 'uglybot' } });
43
- const result = readUglyAppConfig(tmpDir);
44
- expect(result?.auth).toEqual({ mode: 'uglybot' });
45
- });
46
- it("accepts auth.mode='self'", () => {
47
- writeRaw({ projectId: 'abc', auth: { mode: 'self' } });
48
- const result = readUglyAppConfig(tmpDir);
49
- expect(result?.auth).toEqual({ mode: 'self' });
50
- });
51
- it("accepts auth.mode='self' with google provider", () => {
52
- writeRaw({
53
- projectId: 'abc',
54
- auth: { mode: 'self', providers: { google: { clientId: 'gx' } } },
55
- });
56
- const result = readUglyAppConfig(tmpDir);
57
- expect(result?.auth).toEqual({
58
- mode: 'self',
59
- providers: { google: { clientId: 'gx' } },
60
- });
61
- });
62
- it("accepts auth.mode='self' with magicLinkExpiresMin", () => {
63
- writeRaw({ projectId: 'abc', auth: { mode: 'self', magicLinkExpiresMin: 30 } });
64
- const result = readUglyAppConfig(tmpDir);
65
- expect(result?.auth).toEqual({ mode: 'self', magicLinkExpiresMin: 30 });
66
- });
67
- it("rejects auth.mode='uglybot' with providers", () => {
68
- writeRaw({ projectId: 'abc', auth: { mode: 'uglybot', providers: {} } });
69
- expect(() => readUglyAppConfig(tmpDir)).toThrow(/mutually exclusive/);
70
- });
71
- it("rejects auth.mode='uglybot' with magicLinkExpiresMin", () => {
72
- writeRaw({ projectId: 'abc', auth: { mode: 'uglybot', magicLinkExpiresMin: 30 } });
73
- expect(() => readUglyAppConfig(tmpDir)).toThrow(/mutually exclusive/);
74
- });
75
- it('rejects an invalid auth.mode', () => {
76
- writeRaw({ projectId: 'abc', auth: { mode: 'invalid' } });
77
- expect(() => readUglyAppConfig(tmpDir)).toThrow(/auth\.mode/);
78
- });
79
- it('rejects magicLinkExpiresMin=0', () => {
80
- writeRaw({ projectId: 'abc', auth: { mode: 'self', magicLinkExpiresMin: 0 } });
81
- expect(() => readUglyAppConfig(tmpDir)).toThrow(/magicLinkExpiresMin/);
82
- });
83
- it('rejects magicLinkExpiresMin above 1440', () => {
84
- writeRaw({ projectId: 'abc', auth: { mode: 'self', magicLinkExpiresMin: 1500 } });
85
- expect(() => readUglyAppConfig(tmpDir)).toThrow(/magicLinkExpiresMin/);
86
- });
87
- it('resolveAuthMode returns uglybot when config is null', () => {
88
- expect(resolveAuthMode(null)).toEqual({ mode: 'uglybot' });
89
- });
90
- it('resolveAuthMode returns uglybot when no auth block is present', () => {
91
- writeUglyAppConfig(tmpDir, { projectId: 'abc' });
92
- const result = readUglyAppConfig(tmpDir);
93
- expect(resolveAuthMode(result)).toEqual({ mode: 'uglybot' });
94
- });
95
- it('resolveAuthMode returns the configured block when present', () => {
96
- writeRaw({ projectId: 'abc', auth: { mode: 'self', magicLinkExpiresMin: 30 } });
97
- const result = readUglyAppConfig(tmpDir);
98
- expect(resolveAuthMode(result)).toEqual({
99
- mode: 'self',
100
- magicLinkExpiresMin: 30,
101
- });
102
- });
103
- it('round-trips an auth block through write/read', () => {
104
- writeUglyAppConfig(tmpDir, {
105
- projectId: 'abc',
106
- auth: { mode: 'self', providers: { google: { clientId: 'gx' } } },
107
- });
108
- const result = readUglyAppConfig(tmpDir);
109
- expect(result?.auth).toEqual({
110
- mode: 'self',
111
- providers: { google: { clientId: 'gx' } },
112
- });
113
- });
114
- });
115
- //# sourceMappingURL=uglyappConfig.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"uglyappConfig.test.js","sourceRoot":"","sources":["../../src/cli/uglyappConfig.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=buildAuth.integration.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildAuth.integration.test.d.ts","sourceRoot":"","sources":["../../../src/server/auth/buildAuth.integration.test.ts"],"names":[],"mappings":""}
@@ -1,152 +0,0 @@
1
- import cookieParser from 'cookie-parser';
2
- import express from 'express';
3
- import http, { createServer } from 'http';
4
- import { afterEach, describe, expect, it, vi } from 'vitest';
5
- import { createAuthRoutes, noOpUserHelper } from '../Auth.js';
6
- import { createTypedDB } from '../DB.js';
7
- import { BUILTIN_DEFS } from '../../shared/DB.js';
8
- import { buildAuth } from './buildAuth.js';
9
- /**
10
- * Integration shim: stand up a tiny express app wired the way App.ts wires
11
- * it (createAuthRoutes(primary) + a router per extra). We then probe each
12
- * Mode-A / Mode-B route to make sure `buildAuth` actually registers the
13
- * surfaces the deployed app exposes. Full App.ts boot is too heavy
14
- * (Postgres, NATS, R2) for a pure-unit harness, so we replicate just the
15
- * auth-mount slice.
16
- */
17
- process.env['AUTH_SECRET'] = 'test-auth-secret-do-not-use-in-prod';
18
- async function startApp(modeAfterBuild) {
19
- const app = express();
20
- app.use(cookieParser());
21
- app.use(express.json());
22
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
- const db = createTypedDB(BUILTIN_DEFS);
24
- const onUserCreate = vi.fn().mockResolvedValue(undefined);
25
- app.use(createAuthRoutes(db, noOpUserHelper, onUserCreate, modeAfterBuild.primary));
26
- for (const extra of modeAfterBuild.extras) {
27
- if (!extra.registerRoutes)
28
- continue;
29
- const r = express.Router();
30
- extra.registerRoutes(r, { db, onUserCreate });
31
- app.use(r);
32
- }
33
- const server = createServer(app);
34
- await new Promise((resolve) => server.listen(0, resolve));
35
- const port = server.address().port;
36
- return {
37
- port,
38
- close: () => new Promise((resolve, reject) => server.close((err) => (err ? reject(err) : resolve()))),
39
- };
40
- }
41
- function httpGet(port, path) {
42
- return new Promise((resolve, reject) => {
43
- const req = http.request({ hostname: '127.0.0.1', port, path, method: 'GET' }, (res) => {
44
- let raw = '';
45
- res.on('data', (chunk) => {
46
- raw += chunk;
47
- });
48
- res.on('end', () => {
49
- resolve({ status: res.statusCode, body: raw });
50
- });
51
- });
52
- req.on('error', reject);
53
- req.end();
54
- });
55
- }
56
- function httpPostJson(port, path, body) {
57
- return new Promise((resolve, reject) => {
58
- const data = JSON.stringify(body);
59
- const req = http.request({
60
- hostname: '127.0.0.1',
61
- port,
62
- path,
63
- method: 'POST',
64
- headers: {
65
- 'Content-Type': 'application/json',
66
- 'Content-Length': Buffer.byteLength(data),
67
- },
68
- }, (res) => {
69
- let raw = '';
70
- res.on('data', (chunk) => {
71
- raw += chunk;
72
- });
73
- res.on('end', () => {
74
- try {
75
- resolve({ status: res.statusCode, body: JSON.parse(raw) });
76
- }
77
- catch {
78
- resolve({ status: res.statusCode, body: raw });
79
- }
80
- });
81
- });
82
- req.on('error', reject);
83
- req.write(data);
84
- req.end();
85
- });
86
- }
87
- describe('buildAuth integration — Mode A (uglybot)', () => {
88
- afterEach(() => {
89
- vi.unstubAllGlobals();
90
- });
91
- it('mounts /auth/url backed by uglyBotAuthProvider', async () => {
92
- const built = buildAuth({ mode: 'uglybot' });
93
- const { port, close } = await startApp(built);
94
- try {
95
- const { status, body } = await httpGet(port, '/auth/url?origin=https%3A%2F%2Fmyapp.com');
96
- expect(status).toBe(200);
97
- const parsed = JSON.parse(body);
98
- expect(parsed.url).toContain('ugly.bot/oauth');
99
- expect(parsed.url).toContain('myapp.com');
100
- }
101
- finally {
102
- await close();
103
- }
104
- });
105
- });
106
- describe('buildAuth integration — Mode B (self, magic-link primary)', () => {
107
- it('mounts POST /auth/magic-link/request and returns ok regardless of payload', async () => {
108
- const built = buildAuth({ mode: 'self' });
109
- const { port, close } = await startApp(built);
110
- try {
111
- // Missing email → anti-enumeration says still 200 + {ok:true}.
112
- const r1 = await httpPostJson(port, '/auth/magic-link/request', {});
113
- expect(r1.status).toBe(200);
114
- expect(r1.body.ok).toBe(true);
115
- }
116
- finally {
117
- await close();
118
- }
119
- });
120
- it('does NOT mount /auth/google/url when google provider is absent', async () => {
121
- const built = buildAuth({ mode: 'self' });
122
- const { port, close } = await startApp(built);
123
- try {
124
- // No google extra → 404 from express's default handler.
125
- const { status } = await httpGet(port, '/auth/google/url');
126
- expect(status).toBe(404);
127
- }
128
- finally {
129
- await close();
130
- }
131
- });
132
- });
133
- describe('buildAuth integration — Mode B + Google extra', () => {
134
- it('mounts /auth/google/url when providers.google is set', async () => {
135
- const built = buildAuth({
136
- mode: 'self',
137
- providers: { google: { clientId: 'gid.apps.googleusercontent.com' } },
138
- });
139
- const { port, close } = await startApp(built);
140
- try {
141
- const { status, body } = await httpGet(port, '/auth/google/url?origin=https%3A%2F%2Fmyapp.com');
142
- expect(status).toBe(200);
143
- const parsed = JSON.parse(body);
144
- expect(parsed.url).toContain('accounts.google.com/o/oauth2/v2/auth');
145
- expect(parsed.url).toContain('gid.apps.googleusercontent.com');
146
- }
147
- finally {
148
- await close();
149
- }
150
- });
151
- });
152
- //# sourceMappingURL=buildAuth.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildAuth.integration.test.js","sourceRoot":"","sources":["../../../src/server/auth/buildAuth.integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=buildAuth.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildAuth.test.d.ts","sourceRoot":"","sources":["../../../src/server/auth/buildAuth.test.ts"],"names":[],"mappings":""}
@@ -1,33 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { uglyBotAuthProvider } from '../Auth.js';
3
- import { buildAuth } from './buildAuth.js';
4
- process.env['AUTH_SECRET'] = 'test-auth-secret-do-not-use-in-prod';
5
- describe('buildAuth', () => {
6
- it("returns uglyBotAuthProvider as primary when mode='uglybot'", () => {
7
- const result = buildAuth({ mode: 'uglybot' });
8
- expect(result.primary).toBe(uglyBotAuthProvider);
9
- expect(result.extras).toEqual([]);
10
- });
11
- it("returns a magic-link provider as primary when mode='self'", () => {
12
- const result = buildAuth({ mode: 'self' });
13
- expect(result.primary.name).toBe('magic-link');
14
- expect(result.extras).toEqual([]);
15
- });
16
- it('appends Google as an extra when providers.google is set', () => {
17
- const result = buildAuth({
18
- mode: 'self',
19
- providers: { google: { clientId: 'gid.apps.googleusercontent.com' } },
20
- });
21
- expect(result.primary.name).toBe('magic-link');
22
- expect(result.extras).toHaveLength(1);
23
- expect(result.extras[0].name).toBe('google');
24
- });
25
- it('honours magicLinkExpiresMin via the config', () => {
26
- // The provider does not expose expiresMin directly, but the factory
27
- // accepts and validates it; we assert the call doesn't throw and the
28
- // returned provider has the expected name.
29
- const result = buildAuth({ mode: 'self', magicLinkExpiresMin: 30 });
30
- expect(result.primary.name).toBe('magic-link');
31
- });
32
- });
33
- //# sourceMappingURL=buildAuth.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"buildAuth.test.js","sourceRoot":"","sources":["../../../src/server/auth/buildAuth.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,qCAAqC,CAAC;AAEnE,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG,SAAS,CAAC;YACvB,IAAI,EAAE,MAAM;YACZ,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,gCAAgC,EAAE,EAAE;SACtE,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,oEAAoE;QACpE,qEAAqE;QACrE,2CAA2C;QAC3C,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=googleProvider.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"googleProvider.test.d.ts","sourceRoot":"","sources":["../../../src/server/auth/googleProvider.test.ts"],"names":[],"mappings":""}