@happyvertical/smrt-core 0.55.7 → 0.55.8
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/AGENTS.md +2 -1
- package/agents/browser-entry.md +44 -0
- package/agents/build-knowledge.md +7 -0
- package/agents/recipes.md +217 -0
- package/agents/revision-guard.md +72 -1
- package/dist/audit-context.d.ts.map +1 -1
- package/dist/audit-context.js +2 -2
- package/dist/audit-context.js.map +1 -1
- package/dist/browser.d.ts +2 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +7 -7
- package/dist/cascade.d.ts +1 -1
- package/dist/cascade.d.ts.map +1 -1
- package/dist/cascade.js +1 -1
- package/dist/cascade.js.map +1 -1
- package/dist/change-feed.d.ts.map +1 -1
- package/dist/change-feed.js +1 -2
- package/dist/change-feed.js.map +1 -1
- package/dist/class.d.ts +1 -1
- package/dist/class.d.ts.map +1 -1
- package/dist/class.js +7 -3
- package/dist/class.js.map +1 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +1 -1
- package/dist/collection.js.map +1 -1
- package/dist/consumer-plugin/index.js +2 -2
- package/dist/data-query.d.ts.map +1 -1
- package/dist/data-query.js +2 -13
- package/dist/data-query.js.map +1 -1
- package/dist/database.js +1 -1
- package/dist/database.js.map +1 -1
- package/dist/dispatch/bus.js +1 -1
- package/dist/dispatch/bus.js.map +1 -1
- package/dist/embedded-write-queue.d.ts +1 -1
- package/dist/embedded-write-queue.d.ts.map +1 -1
- package/dist/embedded-write-queue.js +7 -5
- package/dist/embedded-write-queue.js.map +1 -1
- package/dist/embeddings/hash.js +2 -2
- package/dist/embeddings/hash.js.map +1 -1
- package/dist/embeddings/storage.d.ts.map +1 -1
- package/dist/embeddings/storage.js +1 -2
- package/dist/embeddings/storage.js.map +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -0
- package/dist/errors.js.map +1 -1
- package/dist/generation-snapshot.js +1 -1
- package/dist/generators/index.js +1 -1
- package/dist/generators/mcp.js +3 -3
- package/dist/generators/preflight-route.js +1 -1
- package/dist/generators/rest.js +1 -1
- package/dist/generators.js +1 -1
- package/dist/host.browser.d.ts +12 -0
- package/dist/host.browser.d.ts.map +1 -0
- package/dist/host.browser.js +30 -0
- package/dist/host.browser.js.map +1 -0
- package/dist/host.d.ts +18 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +15 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -9
- package/dist/knowledge.d.ts.map +1 -1
- package/dist/knowledge.js +5 -4
- package/dist/knowledge.js.map +1 -1
- package/dist/manifest/browser-capability.generated.d.ts +14 -0
- package/dist/manifest/browser-capability.generated.d.ts.map +1 -0
- package/dist/manifest/browser-capability.generated.js +499 -0
- package/dist/manifest/browser-capability.generated.js.map +1 -0
- package/dist/manifest/discover-base-classes.js +1 -1
- package/dist/manifest/discover-smrt-packages.js +1 -1
- package/dist/manifest/generator.js +3 -3
- package/dist/manifest/index.js +2 -2
- package/dist/manifest/local-manifest-reader.d.ts +48 -0
- package/dist/manifest/local-manifest-reader.d.ts.map +1 -0
- package/dist/manifest/local-manifest-reader.js +81 -0
- package/dist/manifest/local-manifest-reader.js.map +1 -0
- package/dist/manifest/manager.d.ts +5 -28
- package/dist/manifest/manager.d.ts.map +1 -1
- package/dist/manifest/manager.js +10 -56
- package/dist/manifest/manager.js.map +1 -1
- package/dist/manifest/manifest-loader.d.ts +1 -1
- package/dist/manifest/manifest-loader.d.ts.map +1 -1
- package/dist/manifest/manifest-loader.js +43 -12
- package/dist/manifest/manifest-loader.js.map +1 -1
- package/dist/manifest/node-host.d.ts +38 -0
- package/dist/manifest/node-host.d.ts.map +1 -0
- package/dist/manifest/node-host.js +52 -0
- package/dist/manifest/node-host.js.map +1 -0
- package/dist/manifest/package-manifest-exports.js +1 -1
- package/dist/manifest/static-manifest.d.ts.map +1 -1
- package/dist/manifest/static-manifest.js +7 -2
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.d.ts +2 -1
- package/dist/manifest/store.d.ts.map +1 -1
- package/dist/manifest/store.js +7 -4
- package/dist/manifest/store.js.map +1 -1
- package/dist/manifest.js +1 -1
- package/dist/manifest.json +9 -2
- package/dist/native-duckdb.d.ts +28 -0
- package/dist/native-duckdb.d.ts.map +1 -0
- package/dist/native-duckdb.js +51 -0
- package/dist/native-duckdb.js.map +1 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_md.js +169 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_md.js.map +1 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_u64.js +13 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/_u64.js.map +1 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/sha2.js +198 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/sha2.js.map +1 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/utils.js +243 -0
- package/dist/node_modules/.pnpm/@noble_hashes@2.4.0/node_modules/@noble/hashes/utils.js.map +1 -0
- package/dist/object.d.ts +56 -0
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +139 -16
- package/dist/object.js.map +1 -1
- package/dist/postgres-permissions.d.ts.map +1 -1
- package/dist/postgres-permissions.js +3 -3
- package/dist/postgres-permissions.js.map +1 -1
- package/dist/prebuild/index.js +1 -1
- package/dist/recipe-demo.d.ts +70 -0
- package/dist/recipe-demo.d.ts.map +1 -0
- package/dist/recipe-demo.js +130 -0
- package/dist/recipe-demo.js.map +1 -0
- package/dist/recipe.d.ts +64 -1
- package/dist/recipe.d.ts.map +1 -1
- package/dist/recipe.js +30 -0
- package/dist/recipe.js.map +1 -1
- package/dist/registry/class-registration.js +2 -2
- package/dist/registry/class-registration.js.map +1 -1
- package/dist/registry/db-cache-key.js +4 -5
- package/dist/registry/db-cache-key.js.map +1 -1
- package/dist/registry/inheritance-resolver.js +1 -1
- package/dist/registry/name-resolver.js +1 -1
- package/dist/registry/qualified-name-aliases.js +1 -1
- package/dist/registry/schema-builder.d.ts.map +1 -1
- package/dist/registry/schema-builder.js +3 -3
- package/dist/registry/schema-builder.js.map +1 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +5 -8
- package/dist/registry.js.map +1 -1
- package/dist/revision-guard.js +1 -1
- package/dist/revision-guard.js.map +1 -1
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +19 -10
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/recipe-demo-pass.d.ts +14 -0
- package/dist/scanner/recipe-demo-pass.d.ts.map +1 -0
- package/dist/scanner/recipe-demo-pass.js +33 -0
- package/dist/scanner/recipe-demo-pass.js.map +1 -0
- package/dist/scanner/types.d.ts +7 -1
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/scanner/types.js.map +1 -1
- package/dist/schema/ddl/duckdb-strategy.d.ts.map +1 -1
- package/dist/schema/ddl/duckdb-strategy.js +1 -1
- package/dist/schema/ddl/duckdb-strategy.js.map +1 -1
- package/dist/schema/foreign-key-planner.d.ts.map +1 -1
- package/dist/schema/foreign-key-planner.js +1 -1
- package/dist/schema/foreign-key-planner.js.map +1 -1
- package/dist/schema/generator.d.ts.map +1 -1
- package/dist/schema/generator.js +10 -14
- package/dist/schema/generator.js.map +1 -1
- package/dist/schema/schema-aggregator.js +1 -1
- package/dist/scripts/browser-entry-evaluation.mjs +157 -0
- package/dist/smrt-knowledge.json +27 -12
- package/dist/system/browser.d.ts +16 -0
- package/dist/system/browser.d.ts.map +1 -0
- package/dist/system/browser.js +6 -0
- package/dist/system/index.d.ts +1 -6
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +2 -1
- package/dist/testing/database.js +1 -1
- package/dist/tools/index.js +1 -1
- package/dist/unchanged-indexed.d.ts +85 -0
- package/dist/unchanged-indexed.d.ts.map +1 -0
- package/dist/unchanged-indexed.js +219 -0
- package/dist/unchanged-indexed.js.map +1 -0
- package/dist/utils/async-context.d.ts +22 -0
- package/dist/utils/async-context.d.ts.map +1 -0
- package/dist/utils/async-context.js +27 -0
- package/dist/utils/async-context.js.map +1 -0
- package/dist/utils/import-project-vite.js +1 -1
- package/dist/utils/import-workspace-module.js +1 -1
- package/dist/utils/json.browser.d.ts +18 -0
- package/dist/utils/json.browser.d.ts.map +1 -0
- package/dist/utils/json.browser.js +47 -0
- package/dist/utils/json.browser.js.map +1 -0
- package/dist/utils/sha256.d.ts +15 -0
- package/dist/utils/sha256.d.ts.map +1 -0
- package/dist/utils/sha256.js +29 -0
- package/dist/utils/sha256.js.map +1 -0
- package/dist/vite-plugin/changes-route.js +1 -1
- package/dist/vite-plugin/dev-plane-route.js +1 -1
- package/dist/vite-plugin/events-route.js +1 -1
- package/dist/vite-plugin/import-build-aware.js +1 -1
- package/dist/vite-plugin/index.js +2 -2
- package/dist/vite-plugin/resources-route.js +1 -1
- package/dist/vite-plugin/sveltekit-generator.js +2 -2
- package/dist/vite-plugin/sveltekit-path.js +1 -1
- package/dist/vite-plugin/sveltekit-register-injection.js +1 -1
- package/dist/vite-plugin/sveltekit-route-coordinator.js +1 -1
- package/dist/vite-plugin/sync-apply-route.js +1 -1
- package/dist/vite-plugin/web-collections.js +2 -2
- package/package.json +21 -11
package/dist/object.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"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"}
|
package/dist/object.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { classifyDatabaseError, classifyDialectMessage } from "./db-errors.js";
|
|
2
|
+
import { buildWhere } from "./host.js";
|
|
3
|
+
import { isKnownNativeDuckDbHandle } from "./native-duckdb.js";
|
|
2
4
|
import { isEmbeddedDatabase, isPostgresDatabase, usesEmbeddedRevisionFallback, withEmbeddedWriteQueue, withEmbeddedWriteTransaction } from "./embedded-write-queue.js";
|
|
3
5
|
import { DatabaseError, ErrorUtils, RuntimeError, SmrtError, TenantIsolationError, ValidationError } from "./errors.js";
|
|
4
6
|
import { toSnakeCase } from "./utils/naming.js";
|
|
@@ -19,9 +21,9 @@ import { getBoxedPrimitiveKind, isRawJSON } from "./plain-json.js";
|
|
|
19
21
|
import { isBatchSafeValidator } from "./registry/validator.js";
|
|
20
22
|
import { postgresRevisionCondition } from "./revision-guard.js";
|
|
21
23
|
import { executeToolCall } from "./tools/tool-executor.js";
|
|
24
|
+
import { buildDuckDbIdUpdate, collectIndexedColumns, timestampColumnsToProve, unchangedIndexedColumns } from "./unchanged-indexed.js";
|
|
22
25
|
import { ObjectRegistry } from "./registry.js";
|
|
23
26
|
import { createLogger } from "@happyvertical/logger";
|
|
24
|
-
import { buildWhere } from "@happyvertical/sql";
|
|
25
27
|
//#region src/object.ts
|
|
26
28
|
/**
|
|
27
29
|
* Converts a hydration filter key to its column name, PRESERVING a leading
|
|
@@ -35,7 +37,6 @@ function toFilterColumnName(key) {
|
|
|
35
37
|
return key.startsWith("_") ? `_${toSnakeCase(key.slice(1))}` : toSnakeCase(key);
|
|
36
38
|
}
|
|
37
39
|
var logger = createLogger({ level: process.env.DEBUG_STI ? "debug" : "info" });
|
|
38
|
-
var nativeJunctionClients = /* @__PURE__ */ new WeakSet();
|
|
39
40
|
function isDuckDbHugeInt(value) {
|
|
40
41
|
return Boolean(value && typeof value === "object" && "hugeint" in value && (typeof value.hugeint === "number" || typeof value.hugeint === "bigint"));
|
|
41
42
|
}
|
|
@@ -706,6 +707,24 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
706
707
|
const { rows } = await this.db.query(sql, ...values);
|
|
707
708
|
return rows[0] ?? null;
|
|
708
709
|
}
|
|
710
|
+
/**
|
|
711
|
+
* Whether this database is POSITIVELY the native DuckDB adapter, never the
|
|
712
|
+
* JSON adapter that shares its client class.
|
|
713
|
+
*
|
|
714
|
+
* {@link isNativeDuckDb} answers "DuckDB dialect": the JSON adapter wraps the
|
|
715
|
+
* same `DuckDBConnection`, and even a `json` type hint maps to `duckdb`. The
|
|
716
|
+
* JSON adapter only persists a table to its `<table>.json` file from its own
|
|
717
|
+
* `insert`/`update`/`upsert`/`delete`; a raw `query()` never does, so a raw
|
|
718
|
+
* write there is visible in-process and lost on the next one. Writers that
|
|
719
|
+
* bypass those methods must therefore gate on this.
|
|
720
|
+
*
|
|
721
|
+
* Identification is deterministic, see `native-duckdb.ts`: a root handle is
|
|
722
|
+
* recognized structurally, and a transaction handle through the root core
|
|
723
|
+
* noted before binding to it (initialize, withDatabase, transactions).
|
|
724
|
+
*/
|
|
725
|
+
isPositivelyNativeDuckDb() {
|
|
726
|
+
return this.isNativeDuckDb() && isKnownNativeDuckDbHandle(this.db, this.getDatabaseEngineHint());
|
|
727
|
+
}
|
|
709
728
|
isNativeDuckDb() {
|
|
710
729
|
const db = this.db;
|
|
711
730
|
const isDuckDbConnection = (db.client?.constructor?.name?.toLowerCase() ?? "").includes("duckdb") || typeof db.exportTable === "function" && db.client !== void 0 && "connection" in db.client;
|
|
@@ -1238,15 +1257,9 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
1238
1257
|
const first = all[0];
|
|
1239
1258
|
if (!first) return true;
|
|
1240
1259
|
if (all.length > 100 || all.some((item) => item.db !== first.db || item.tableName !== first.tableName || item.constructor !== first.constructor || !SmrtObject.prototype.supportsJunctionBatch.call(item)) || added.some((item) => item.isPersisted) || removed.some((item) => !item.id)) return false;
|
|
1241
|
-
const dbCapabilities = first.db;
|
|
1242
1260
|
if (first.getDatabaseEngineHint() === "json") return false;
|
|
1243
1261
|
const duck = first.isNativeDuckDb();
|
|
1244
|
-
if (duck)
|
|
1245
|
-
const client = dbCapabilities.client;
|
|
1246
|
-
if (!client) return false;
|
|
1247
|
-
if (typeof dbCapabilities.getTableSchema === "function" || first.getDatabaseEngineHint() === "duckdb") nativeJunctionClients.add(client);
|
|
1248
|
-
if (!nativeJunctionClients.has(client)) return false;
|
|
1249
|
-
}
|
|
1262
|
+
if (duck && !first.isPositivelyNativeDuckDb()) return false;
|
|
1250
1263
|
const engine = isPostgresDatabase(first.db) ? "postgres" : duck ? "duckdb" : detectEngine(first.db.url ?? "", first.getDatabaseEngineHint());
|
|
1251
1264
|
if (![
|
|
1252
1265
|
"sqlite",
|
|
@@ -1522,14 +1535,15 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
1522
1535
|
try {
|
|
1523
1536
|
if (writePlan.type === "updateById" || revisionGuard !== void 0) {
|
|
1524
1537
|
const { id: _id, ...updateData } = data;
|
|
1538
|
+
let current = null;
|
|
1525
1539
|
if (useEmbeddedRevisionFallback) {
|
|
1526
|
-
|
|
1540
|
+
current = this.isPositivelyNativeDuckDb() ? await this.getCanonicalPersistedRow({ id: data.id }) : await this.db.get(this.tableName, { id: data.id });
|
|
1527
1541
|
if (!current || !this.revisionsEqual(current.updated_at, revisionGuard)) {
|
|
1528
1542
|
revisionMatched = false;
|
|
1529
1543
|
return;
|
|
1530
1544
|
}
|
|
1531
1545
|
}
|
|
1532
|
-
const updateResult = useEmbeddedRevisionFallback ? await this.
|
|
1546
|
+
const updateResult = useEmbeddedRevisionFallback ? await this.writeEmbeddedRevisionRow(data, current) : await this.db.update(this.tableName, {
|
|
1533
1547
|
id: data.id,
|
|
1534
1548
|
...revisionGuard !== void 0 ? this.revisionPredicate(revisionGuard) : {}
|
|
1535
1549
|
}, updateData);
|
|
@@ -1539,7 +1553,10 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
1539
1553
|
}
|
|
1540
1554
|
if (writePlan.type === "updateById") this.setMetaType(writePlan.qualifiedMetaType);
|
|
1541
1555
|
} else if (this._insertOnly && !this._persisted || insertUnderFreshSlug) await this.db.insert(this.tableName, data);
|
|
1542
|
-
else
|
|
1556
|
+
else {
|
|
1557
|
+
const naturalKeyConflictColumns = ObjectRegistry.getConflictPredicate(this.getResolvedQualifiedName()) ? ["id"] : upsertConflictColumns;
|
|
1558
|
+
await this.writeNaturalKeyUpsert(data, naturalKeyConflictColumns, adopted.existing ?? null);
|
|
1559
|
+
}
|
|
1543
1560
|
} catch (error) {
|
|
1544
1561
|
throw this.toTypedWriteError(error, writePlan.type === "updateById" || revisionGuard !== void 0 ? `UPDATE ${this.tableName} (id-targeted)` : this._insertOnly && !this._persisted || insertUnderFreshSlug ? `INSERT INTO ${this.tableName}` : `UPSERT INTO ${this.tableName}`);
|
|
1545
1562
|
}
|
|
@@ -1591,13 +1608,15 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
1591
1608
|
return;
|
|
1592
1609
|
}
|
|
1593
1610
|
}
|
|
1594
|
-
result =
|
|
1595
|
-
...current,
|
|
1596
|
-
updated_at: updatedAt.toISOString()
|
|
1597
|
-
}) : await this.db.update(this.tableName, {
|
|
1611
|
+
if (!useEmbeddedRevisionFallback) result = await this.db.update(this.tableName, {
|
|
1598
1612
|
id: this.id,
|
|
1599
1613
|
...this.revisionPredicate(expectedUpdatedAt)
|
|
1600
1614
|
}, { updated_at: updatedAt.toISOString() });
|
|
1615
|
+
else if (this.isPositivelyNativeDuckDb()) result = await this.updateDuckDbRowById(this.id, { updated_at: updatedAt.toISOString() });
|
|
1616
|
+
else result = await this.db.upsert(this.tableName, ["id"], {
|
|
1617
|
+
...current,
|
|
1618
|
+
updated_at: updatedAt.toISOString()
|
|
1619
|
+
});
|
|
1601
1620
|
});
|
|
1602
1621
|
if (!revisionMatched || result?.affected !== 1) throw new RuntimeError(`Revision conflict while claiming ${className}`, "RUNTIME_REVISION_CONFLICT", {
|
|
1603
1622
|
className,
|
|
@@ -1625,6 +1644,108 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
1625
1644
|
await GlobalInterceptors.executeAfterSave(this, context);
|
|
1626
1645
|
}
|
|
1627
1646
|
/**
|
|
1647
|
+
* Indexed columns of `data` that provably keep the stored row's value, so the
|
|
1648
|
+
* write can leave them out (#3737). Native DuckDB only: it rewrites a row
|
|
1649
|
+
* when an indexed column is assigned, even to its existing value, which a
|
|
1650
|
+
* foreign key still referencing the row then rejects. Other engines assign
|
|
1651
|
+
* unchanged columns harmlessly and keep writing exactly what they did.
|
|
1652
|
+
*
|
|
1653
|
+
* `stored` is the row just read under the embedded write queue, after its
|
|
1654
|
+
* revision matched the loaded one, so it is the state this save was loaded
|
|
1655
|
+
* from. Anything not provably equal stays assigned.
|
|
1656
|
+
*/
|
|
1657
|
+
async unchangedIndexedColumnsOf(data, stored) {
|
|
1658
|
+
if (!stored || !this.isPositivelyNativeDuckDb()) return /* @__PURE__ */ new Set();
|
|
1659
|
+
const qualifiedName = this.getResolvedQualifiedName();
|
|
1660
|
+
const stiBase = ObjectRegistry.getSTIBase(qualifiedName);
|
|
1661
|
+
const schemas = [
|
|
1662
|
+
ObjectRegistry.getSchema(qualifiedName),
|
|
1663
|
+
ObjectRegistry.getSchema(this.getResolvedClassName()),
|
|
1664
|
+
stiBase ? ObjectRegistry.getSchema(stiBase) : void 0
|
|
1665
|
+
];
|
|
1666
|
+
const indexed = collectIndexedColumns(schemas, [
|
|
1667
|
+
"slug",
|
|
1668
|
+
"context",
|
|
1669
|
+
"tenant_id",
|
|
1670
|
+
...ObjectRegistry.getConflictColumns(qualifiedName),
|
|
1671
|
+
...SmrtObject.ownershipColumnsFor(qualifiedName)
|
|
1672
|
+
]);
|
|
1673
|
+
const columnTypes = {};
|
|
1674
|
+
for (const schema of schemas) for (const [name, column] of Object.entries(schema?.columns ?? {})) columnTypes[name] ??= column;
|
|
1675
|
+
const exactTimestamps = {};
|
|
1676
|
+
const timestamps = timestampColumnsToProve(data, stored, indexed, columnTypes);
|
|
1677
|
+
if (timestamps.length > 0 && stored.id != null) {
|
|
1678
|
+
const quote = (identifier) => `"${identifier.replaceAll("\"", "\"\"")}"`;
|
|
1679
|
+
const { rows } = await this.db.query(`SELECT ${timestamps.map((column) => `CAST(${quote(column)} AS VARCHAR) AS ${quote(column)}`).join(", ")} FROM ${quote(this.tableName)} WHERE ${quote("id")} = ?`, stored.id);
|
|
1680
|
+
for (const column of timestamps) {
|
|
1681
|
+
const text = rows[0]?.[column];
|
|
1682
|
+
if (typeof text === "string") exactTimestamps[column] = text;
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
return unchangedIndexedColumns(data, stored, indexed, columnTypes, exactTimestamps);
|
|
1686
|
+
}
|
|
1687
|
+
/**
|
|
1688
|
+
* Write an existing row on an embedded engine, after the caller verified its
|
|
1689
|
+
* revision under the write queue.
|
|
1690
|
+
*
|
|
1691
|
+
* Ordinarily one `upsert` by primary key that assigns every column. When
|
|
1692
|
+
* {@link unchangedIndexedColumnsOf} proves indexed columns unchanged, those
|
|
1693
|
+
* are left out of an id-targeted `UPDATE` instead (the adapter's `upsert`
|
|
1694
|
+
* cannot restrict its `DO UPDATE SET`), so a referenced DuckDB parent is not
|
|
1695
|
+
* rewritten. Every changed column, including a changed indexed one that
|
|
1696
|
+
* DuckDB may still rightly refuse, is assigned as before.
|
|
1697
|
+
*/
|
|
1698
|
+
async writeEmbeddedRevisionRow(data, stored) {
|
|
1699
|
+
const unchanged = await this.unchangedIndexedColumnsOf(data, stored);
|
|
1700
|
+
if (unchanged.size === 0) return this.db.upsert(this.tableName, ["id"], data);
|
|
1701
|
+
const assignments = {};
|
|
1702
|
+
for (const [column, value] of Object.entries(data)) {
|
|
1703
|
+
if (column === "id" || unchanged.has(column)) continue;
|
|
1704
|
+
assignments[column] = value;
|
|
1705
|
+
}
|
|
1706
|
+
return this.updateDuckDbRowById(data.id, assignments);
|
|
1707
|
+
}
|
|
1708
|
+
/**
|
|
1709
|
+
* The natural-key upsert of a new object. When it adopts an existing row on
|
|
1710
|
+
* native DuckDB, the columns the row already holds (its key, ownership and
|
|
1711
|
+
* creation time among them) are left out of an id-targeted `UPDATE` rather
|
|
1712
|
+
* than reassigned by `DO UPDATE SET`, for the reason given at
|
|
1713
|
+
* {@link unchangedIndexedColumnsOf} (#3737). The adopted row was read, and
|
|
1714
|
+
* its owner checked, under the same embedded write queue; the conflict
|
|
1715
|
+
* columns it matched are never assigned, exactly as in the upsert.
|
|
1716
|
+
*/
|
|
1717
|
+
async writeNaturalKeyUpsert(data, conflictColumns, existing) {
|
|
1718
|
+
const unchanged = await this.unchangedIndexedColumnsOf(data, existing);
|
|
1719
|
+
if (!existing || unchanged.size === 0 || existing.id == null) return this.db.upsert(this.tableName, conflictColumns, data);
|
|
1720
|
+
const assignments = {};
|
|
1721
|
+
for (const [column, value] of Object.entries(data)) {
|
|
1722
|
+
if (column === "id" || unchanged.has(column) || conflictColumns.includes(column)) continue;
|
|
1723
|
+
assignments[column] = value;
|
|
1724
|
+
}
|
|
1725
|
+
return Object.keys(assignments).length === 0 ? {
|
|
1726
|
+
operation: "upsert",
|
|
1727
|
+
affected: 1
|
|
1728
|
+
} : this.updateDuckDbRowById(existing.id, assignments);
|
|
1729
|
+
}
|
|
1730
|
+
/**
|
|
1731
|
+
* One id-targeted `UPDATE` on native DuckDB (see {@link buildDuckDbIdUpdate}
|
|
1732
|
+
* for the quoting and binding). The caller holds the embedded write queue
|
|
1733
|
+
* and has already matched the row; `affected` is the driver's own count.
|
|
1734
|
+
*/
|
|
1735
|
+
async updateDuckDbRowById(id, assignments) {
|
|
1736
|
+
const { sql, values } = buildDuckDbIdUpdate(this.tableName, id, assignments);
|
|
1737
|
+
const reported = (await this.db.query(sql, ...values))?.rows?.[0]?.Count;
|
|
1738
|
+
const count = typeof reported === "number" || typeof reported === "bigint" ? Number(reported) : NaN;
|
|
1739
|
+
if (!Number.isInteger(count) || count < 0) throw RuntimeError.invalidState("The DuckDB UPDATE did not report an affected-row count", {
|
|
1740
|
+
className: this.getResolvedClassName(),
|
|
1741
|
+
tableName: this.tableName
|
|
1742
|
+
});
|
|
1743
|
+
return {
|
|
1744
|
+
operation: "update",
|
|
1745
|
+
affected: count
|
|
1746
|
+
};
|
|
1747
|
+
}
|
|
1748
|
+
/**
|
|
1628
1749
|
* Build the compare-and-swap condition that pins a guarded UPDATE or DELETE
|
|
1629
1750
|
* to the revision this writer loaded.
|
|
1630
1751
|
*
|
|
@@ -1708,6 +1829,7 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
1708
1829
|
*/
|
|
1709
1830
|
toTypedWriteError(error, operation) {
|
|
1710
1831
|
if (!(error instanceof Error)) return error;
|
|
1832
|
+
if (error instanceof RuntimeError && error.code === "RUNTIME_INVALID_STATE") return error;
|
|
1711
1833
|
const classification = classifyDatabaseError(error);
|
|
1712
1834
|
if (classification.kind === "unique_violation") {
|
|
1713
1835
|
const field = this.extractConstraintFieldFromChain(error, classification);
|
|
@@ -1805,6 +1927,7 @@ var SmrtObject = class SmrtObject extends SmrtClass {
|
|
|
1805
1927
|
adopted.createdAt = existing.created_at;
|
|
1806
1928
|
}
|
|
1807
1929
|
}
|
|
1930
|
+
adopted.existing = existing;
|
|
1808
1931
|
return "upsert";
|
|
1809
1932
|
}
|
|
1810
1933
|
throw DatabaseError.queryFailed(`INSERT INTO ${this.tableName} (natural key)`, /* @__PURE__ */ new Error("The natural key kept colliding with concurrent writes; retry the save."));
|