@mongrov/analytics 0.8.0 → 0.8.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.
- package/UPGRADING.md +22 -0
- package/dist/core/extensions.d.ts.map +1 -1
- package/dist/core/extensions.js +22 -3
- package/dist/core/extensions.js.map +1 -1
- package/package.json +5 -5
package/UPGRADING.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# Upgrading
|
|
2
2
|
|
|
3
|
+
## @mongrov/data-access 0.2.0 → 0.3.0 — bind only referenced placeholders
|
|
4
|
+
|
|
5
|
+
**Behaviour fix. No API change, but it repairs queries that could never run.**
|
|
6
|
+
|
|
7
|
+
DuckDB binds parameters by NAME and **rejects** any bound parameter the
|
|
8
|
+
statement does not declare — `Failed to retrieve bind parameter index`. The
|
|
9
|
+
dispatcher injected `brand` / `familyId` / `tz` unconditionally, so every
|
|
10
|
+
query whose SQL omitted one of them failed at bind time.
|
|
11
|
+
|
|
12
|
+
Three ZivaOne registry queries did exactly that (`spo2.compareBaseline`,
|
|
13
|
+
`spo2.worthALookInsight`, `device.lastSyncedAt` — all use `$userId`,
|
|
14
|
+
`$brand`, `$familyId` but not `$tz`). It went unnoticed because the app's
|
|
15
|
+
`duckdb` adapter routed to Timon and mapped every error to `[]`.
|
|
16
|
+
|
|
17
|
+
`mergeTenantParams(input, ctx, sql?)` now filters to placeholders the SQL
|
|
18
|
+
actually references. Tenant values still win over caller input, so the
|
|
19
|
+
anti-forgery guarantee is unchanged.
|
|
20
|
+
|
|
21
|
+
If you assert on the params passed to your engine adapter, expect a smaller
|
|
22
|
+
object — only what the SQL uses.
|
|
23
|
+
|
|
24
|
+
|
|
3
25
|
## 0.7.0 → 0.8.0 — `device_config` firmware contract (Sprint 5 §2, T-02/T-09/T-10)
|
|
4
26
|
|
|
5
27
|
**Breaking, and it changes both a table and a mapper input type.**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,kDAAmD,CAAA;AAEnF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,6BAA8B,CAAA;AAE3D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAQpE;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,YAAY,EAChB,IAAI,GAAE,aAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,kDAAmD,CAAA;AAEnF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,6BAA8B,CAAA;AAE3D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;AAQpE;;;;;;;;;;;;GAYG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,YAAY,EAChB,IAAI,GAAE,aAAoB,GACzB,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAEzE"}
|
package/dist/core/extensions.js
CHANGED
|
@@ -67,12 +67,31 @@ export async function bootstrapExtensions(db, mode = 'r2') {
|
|
|
67
67
|
if (booted.has(ext)) {
|
|
68
68
|
continue;
|
|
69
69
|
}
|
|
70
|
+
// LOAD first, INSTALL only as a fallback.
|
|
71
|
+
//
|
|
72
|
+
// A statically linked extension needs no INSTALL, and on mobile the
|
|
73
|
+
// INSTALL cannot succeed: there is no artifact to fetch. iOS asks for
|
|
74
|
+
// `http://extensions.duckdb.org/<ver>/ios_arm64/<ext>.duckdb_extension.gz`
|
|
75
|
+
// and gets a 404, so issuing INSTALL unconditionally made a correctly
|
|
76
|
+
// built binary fail exactly as loudly as a missing one.
|
|
77
|
+
//
|
|
78
|
+
// Ordering it this way keeps both cases working: linked extensions load
|
|
79
|
+
// straight away, and a desktop build that genuinely needs a download
|
|
80
|
+
// still gets one from the fallback.
|
|
70
81
|
try {
|
|
71
|
-
await db.execute(`INSTALL ${ext};`);
|
|
72
82
|
await db.execute(`LOAD ${ext};`);
|
|
73
83
|
}
|
|
74
|
-
catch (
|
|
75
|
-
|
|
84
|
+
catch (loadCause) {
|
|
85
|
+
try {
|
|
86
|
+
await db.execute(`INSTALL ${ext};`);
|
|
87
|
+
await db.execute(`LOAD ${ext};`);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Report the original LOAD failure: if the extension is meant to be
|
|
91
|
+
// linked in, "could not load" is the real problem and the INSTALL
|
|
92
|
+
// 404 is just noise about a fetch that was never going to work.
|
|
93
|
+
throw new AnalyticsError('extension_load_failed', `Failed to load DuckDB extension: ${ext}`, loadCause);
|
|
94
|
+
}
|
|
76
95
|
}
|
|
77
96
|
booted.add(ext);
|
|
78
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAIzC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAU,CAAA;AAEnF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAU,CAAA;AAI3D;;;GAGG;AACH,MAAM,UAAU,GAAG,IAAI,OAAO,EAA6B,CAAA;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAgB,EAChB,OAAsB,IAAI;IAE1B,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;QAClB,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,MAAM,UAAU,GACZ,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAE7D,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,SAAQ;QACV,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAIzC;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAU,CAAA;AAEnF;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,SAAS,CAAU,CAAA;AAI3D;;;GAGG;AACH,MAAM,UAAU,GAAG,IAAI,OAAO,EAA6B,CAAA;AAE3D;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAgB,EAChB,OAAsB,IAAI;IAE1B,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;QAClB,UAAU,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;IAC5B,CAAC;IAED,MAAM,UAAU,GACZ,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAE7D,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,SAAQ;QACV,CAAC;QACD,0CAA0C;QAC1C,EAAE;QACF,oEAAoE;QACpE,sEAAsE;QACtE,2EAA2E;QAC3E,sEAAsE;QACtE,wDAAwD;QACxD,EAAE;QACF,wEAAwE;QACxE,qEAAqE;QACrE,oCAAoC;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAA;QAClC,CAAC;QACD,OAAO,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,CAAC,CAAA;gBACnC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAA;YAClC,CAAC;YACD,MAAM,CAAC;gBACL,oEAAoE;gBACpE,kEAAkE;gBAClE,gEAAgE;gBAChE,MAAM,IAAI,cAAc,CACtB,uBAAuB,EACvB,oCAAoC,GAAG,EAAE,EACzC,SAAS,CACV,CAAA;YACH,CAAC;QACH,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAgB;IAClD,OAAO,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,CAAA;AACxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mongrov/analytics",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"description": "DuckDB + R2 Iceberg local analytics for @mongrov apps",
|
|
6
6
|
"license": "MIT",
|
|
@@ -61,12 +61,12 @@
|
|
|
61
61
|
],
|
|
62
62
|
"peerDependencies": {
|
|
63
63
|
"@modelcontextprotocol/sdk": ">=1.20.0",
|
|
64
|
-
"@mongrov/types": "^0.5.
|
|
64
|
+
"@mongrov/types": "^0.5.1",
|
|
65
65
|
"ai": ">=4",
|
|
66
66
|
"react": ">=19",
|
|
67
67
|
"react-native": ">=0.81",
|
|
68
68
|
"react-native-duckdb": ">=1.0.0",
|
|
69
|
-
"@mongrov/db": "0.3.0"
|
|
69
|
+
"@mongrov/db": "^0.3.0"
|
|
70
70
|
},
|
|
71
71
|
"peerDependenciesMeta": {
|
|
72
72
|
"@modelcontextprotocol/sdk": {
|
|
@@ -107,8 +107,8 @@
|
|
|
107
107
|
"typescript": "^5.9.3",
|
|
108
108
|
"vitest": "^2.1.9",
|
|
109
109
|
"zod": "^3.23.8",
|
|
110
|
-
"@mongrov/
|
|
111
|
-
"@mongrov/
|
|
110
|
+
"@mongrov/types": "0.5.1",
|
|
111
|
+
"@mongrov/db": "0.3.0"
|
|
112
112
|
},
|
|
113
113
|
"scripts": {
|
|
114
114
|
"build": "tsc -p tsconfig.build.json",
|