ugly-app 0.1.784 → 0.1.785

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.
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.784";
1
+ export declare const CLI_VERSION = "0.1.785";
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.784";
2
+ export const CLI_VERSION = "0.1.785";
3
3
  //# sourceMappingURL=version.js.map
@@ -180,15 +180,14 @@ export async function resolveFeedbackReport(id, status, resolution, resolvedAt)
180
180
  throw new Error('[Telemetry] no D1 binding — feedback resolve only works on the deployed Worker');
181
181
  }
182
182
  await ensureSchema(db);
183
- const upd = (await db
184
- .prepare('UPDATE feedback_report SET status = ?, resolution = ?, resolved_at = ? WHERE id = ?')
185
- .bind(status, resolution, resolvedAt, id)
186
- .run());
187
- if ((upd?.meta?.changes ?? 0) === 0)
188
- return null;
183
+ // Single atomic statement: `UPDATE … RETURNING` writes and reads back the row in
184
+ // one round-trip. A separate post-UPDATE SELECT could hit a lagging D1 read
185
+ // replica and return null — which previously made the resolve report failure
186
+ // (and silently skip the reporter email) even though the update had persisted.
187
+ // `.first()` returns null iff no row matched the id.
189
188
  const row = await db
190
- .prepare('SELECT user_id, message, type FROM feedback_report WHERE id = ?')
191
- .bind(id)
189
+ .prepare('UPDATE feedback_report SET status = ?, resolution = ?, resolved_at = ? WHERE id = ? RETURNING user_id, message, type')
190
+ .bind(status, resolution, resolvedAt, id)
192
191
  .first();
193
192
  if (!row)
194
193
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"TelemetryStore.js","sourceRoot":"","sources":["../../src/server/TelemetryStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TelemetryStore.js","sourceRoot":"","sources":["../../src/server/TelemetryStore.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.784",
3
+ "version": "0.1.785",
4
4
  "type": "module",
5
5
  "comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
6
6
  "files": [
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.784";
2
+ export const CLI_VERSION = "0.1.785";
@@ -1,33 +1,49 @@
1
1
  import { describe, it, expect } from 'vitest';
2
2
  import { setTelemetryDb, resolveFeedbackReport, type D1Like } from './TelemetryStore.js';
3
3
 
4
- function fakeDb(row: Record<string, unknown> | null, changes: number): D1Like {
4
+ // The resolve uses a single `UPDATE … RETURNING` read via `.first()` the fake
5
+ // returns `row` from first() (the RETURNING row) and captures the SQL so we can
6
+ // assert it's one atomic statement (no separate post-write SELECT that could hit
7
+ // a lagging replica).
8
+ function fakeDb(row: Record<string, unknown> | null): { db: D1Like; sql: () => string[] } {
9
+ const sqls: string[] = [];
5
10
  const prepared = {
6
11
  bind(..._v: unknown[]) {
7
12
  return prepared;
8
13
  },
9
14
  async run() {
10
- return { meta: { changes } };
15
+ return { meta: { changes: row ? 1 : 0 } };
11
16
  },
12
17
  async first<T>() {
13
18
  return row as T | null;
14
19
  },
15
20
  };
16
- return {
17
- prepare: (_sql: string) => prepared,
21
+ const db = {
22
+ prepare: (sql: string) => {
23
+ sqls.push(sql);
24
+ return prepared;
25
+ },
18
26
  batch: async () => undefined,
19
27
  } as unknown as D1Like;
28
+ return { db, sql: () => sqls };
20
29
  }
21
30
 
22
31
  describe('resolveFeedbackReport', () => {
23
- it('updates the row and returns userId/message/type on success', async () => {
24
- setTelemetryDb(fakeDb({ user_id: 'u1', message: 'tokens wrong', type: 'bug' }, 1));
32
+ it('updates + reads back in one UPDATE…RETURNING statement', async () => {
33
+ const f = fakeDb({ user_id: 'u1', message: 'tokens wrong', type: 'bug' });
34
+ setTelemetryDb(f.db);
25
35
  const r = await resolveFeedbackReport('id1', 'resolved', 'fixed', 123);
26
36
  expect(r).toEqual({ userId: 'u1', message: 'tokens wrong', type: 'bug' });
37
+ const updates = f.sql().filter((s) => /UPDATE\s+feedback_report/i.test(s));
38
+ expect(updates).toHaveLength(1);
39
+ expect(updates[0]).toMatch(/RETURNING/i);
40
+ // No separate post-write SELECT read-back (the source of the replica-lag bug).
41
+ expect(f.sql().some((s) => /SELECT[\s\S]*FROM\s+feedback_report/i.test(s))).toBe(false);
27
42
  });
28
43
 
29
- it('returns null when no row changed', async () => {
30
- setTelemetryDb(fakeDb(null, 0));
44
+ it('returns null when no row matched the id', async () => {
45
+ const f = fakeDb(null);
46
+ setTelemetryDb(f.db);
31
47
  expect(await resolveFeedbackReport('missing', 'declined', 'n/a', 1)).toBeNull();
32
48
  });
33
49
  });
@@ -257,16 +257,16 @@ export async function resolveFeedbackReport(
257
257
  );
258
258
  }
259
259
  await ensureSchema(db);
260
- const upd = (await db
260
+ // Single atomic statement: `UPDATE … RETURNING` writes and reads back the row in
261
+ // one round-trip. A separate post-UPDATE SELECT could hit a lagging D1 read
262
+ // replica and return null — which previously made the resolve report failure
263
+ // (and silently skip the reporter email) even though the update had persisted.
264
+ // `.first()` returns null iff no row matched the id.
265
+ const row = await db
261
266
  .prepare(
262
- 'UPDATE feedback_report SET status = ?, resolution = ?, resolved_at = ? WHERE id = ?',
267
+ 'UPDATE feedback_report SET status = ?, resolution = ?, resolved_at = ? WHERE id = ? RETURNING user_id, message, type',
263
268
  )
264
269
  .bind(status, resolution, resolvedAt, id)
265
- .run()) as { meta?: { changes?: number } };
266
- if ((upd?.meta?.changes ?? 0) === 0) return null;
267
- const row = await db
268
- .prepare('SELECT user_id, message, type FROM feedback_report WHERE id = ?')
269
- .bind(id)
270
270
  .first<Record<string, unknown>>();
271
271
  if (!row) return null;
272
272
  return {