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.
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/server/TelemetryStore.js +7 -8
- package/dist/server/TelemetryStore.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/server/TelemetryStore.test.ts +24 -8
- package/src/server/TelemetryStore.ts +7 -7
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.785";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -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
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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('
|
|
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.
|
|
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": [
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
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
|
-
|
|
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
|
-
|
|
17
|
-
prepare: (
|
|
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
|
|
24
|
-
|
|
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
|
|
30
|
-
|
|
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
|
-
|
|
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 {
|