js-bao 0.3.0-alpha.4 → 0.3.0
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/browser.cjs +187 -16
- package/dist/browser.d.cts +3 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.js +186 -15
- package/dist/client.cjs +20 -2
- package/dist/client.d.cts +7 -2
- package/dist/client.d.ts +7 -2
- package/dist/client.js +19 -1
- package/dist/cloudflare-do.cjs +371 -155
- package/dist/cloudflare-do.d.cts +47 -9
- package/dist/cloudflare-do.d.ts +47 -9
- package/dist/cloudflare-do.js +371 -155
- package/dist/cloudflare.cjs +20 -2
- package/dist/cloudflare.d.cts +7 -2
- package/dist/cloudflare.d.ts +7 -2
- package/dist/cloudflare.js +19 -1
- package/dist/codegen.cjs +8 -7
- package/dist/index.cjs +576 -26
- package/dist/index.d.cts +134 -1
- package/dist/index.d.ts +134 -1
- package/dist/index.js +564 -24
- package/dist/node.cjs +257 -22
- package/dist/node.d.cts +40 -1
- package/dist/node.d.ts +40 -1
- package/dist/node.js +253 -20
- package/package.json +8 -7
- package/dist/BaseModel-5YQCROYE.js +0 -17
- package/dist/BaseModel-5YQCROYE.js.map +0 -1
- package/dist/BaseModel-FCNWDJBH.js +0 -17
- package/dist/BaseModel-FCNWDJBH.js.map +0 -1
- package/dist/BrowserDatabaseFactory-PXOTK2DQ.js +0 -119
- package/dist/BrowserDatabaseFactory-PXOTK2DQ.js.map +0 -1
- package/dist/BrowserDatabaseFactory-WD4VX2VZ.js +0 -119
- package/dist/BrowserDatabaseFactory-WD4VX2VZ.js.map +0 -1
- package/dist/IncludeResolver-RCKQGNPZ.js +0 -385
- package/dist/IncludeResolver-RCKQGNPZ.js.map +0 -1
- package/dist/IncludeResolver-WGSQDMS7.js +0 -385
- package/dist/IncludeResolver-WGSQDMS7.js.map +0 -1
- package/dist/NodeDatabaseFactory-J4Z36UF3.js +0 -165
- package/dist/NodeDatabaseFactory-J4Z36UF3.js.map +0 -1
- package/dist/NodeDatabaseFactory-QIEKAXBM.js +0 -10
- package/dist/NodeDatabaseFactory-QIEKAXBM.js.map +0 -1
- package/dist/NodeSqliteEngine-HJSAYE4E.js +0 -383
- package/dist/NodeSqliteEngine-HJSAYE4E.js.map +0 -1
- package/dist/NodeSqliteEngine-I5SLWLME.js +0 -383
- package/dist/NodeSqliteEngine-I5SLWLME.js.map +0 -1
- package/dist/chunk-3PZWHUZO.js +0 -4153
- package/dist/chunk-3PZWHUZO.js.map +0 -1
- package/dist/chunk-53MS4MN7.js +0 -373
- package/dist/chunk-53MS4MN7.js.map +0 -1
- package/dist/chunk-65G2P4GL.js +0 -709
- package/dist/chunk-65G2P4GL.js.map +0 -1
- package/dist/chunk-6UX3YSCW.js +0 -4151
- package/dist/chunk-6UX3YSCW.js.map +0 -1
- package/dist/chunk-DANSD6BE.js +0 -709
- package/dist/chunk-DANSD6BE.js.map +0 -1
- package/dist/chunk-DF3JEQXA.js +0 -373
- package/dist/chunk-DF3JEQXA.js.map +0 -1
- package/dist/chunk-GO3APTPX.js +0 -61
- package/dist/chunk-GO3APTPX.js.map +0 -1
- package/dist/chunk-ID4U6IQC.js +0 -53
- package/dist/chunk-ID4U6IQC.js.map +0 -1
- package/dist/chunk-RQVS3LVL.js +0 -165
- package/dist/chunk-RQVS3LVL.js.map +0 -1
- package/dist/environment-TOTQICSE.js +0 -17
- package/dist/environment-TOTQICSE.js.map +0 -1
package/dist/browser.cjs
CHANGED
|
@@ -1183,6 +1183,108 @@ var init_DocumentQueryTranslator = __esm({
|
|
|
1183
1183
|
}
|
|
1184
1184
|
});
|
|
1185
1185
|
|
|
1186
|
+
// src/models/metaSync.ts
|
|
1187
|
+
function registerFunctionDefault(fn, name) {
|
|
1188
|
+
KNOWN_FUNCTION_DEFAULTS.set(fn, name);
|
|
1189
|
+
}
|
|
1190
|
+
function encodeDefault(value) {
|
|
1191
|
+
if (value === void 0 || value === null) return void 0;
|
|
1192
|
+
if (typeof value === "function") {
|
|
1193
|
+
const name = KNOWN_FUNCTION_DEFAULTS.get(value);
|
|
1194
|
+
return name ? `$${name}` : "$unknown_function";
|
|
1195
|
+
}
|
|
1196
|
+
return value;
|
|
1197
|
+
}
|
|
1198
|
+
function syncModelMeta(yDoc, modelName, schema) {
|
|
1199
|
+
let synced = _syncedCache.get(yDoc);
|
|
1200
|
+
if (synced?.has(modelName)) return;
|
|
1201
|
+
if (!synced) {
|
|
1202
|
+
synced = /* @__PURE__ */ new Set();
|
|
1203
|
+
_syncedCache.set(yDoc, synced);
|
|
1204
|
+
}
|
|
1205
|
+
const meta = yDoc.getMap(`_meta_${modelName}`);
|
|
1206
|
+
for (const [fieldName, fieldOpts] of schema.fields.entries()) {
|
|
1207
|
+
syncFieldMeta(meta, fieldName, fieldOpts);
|
|
1208
|
+
}
|
|
1209
|
+
const compoundConstraints = schema.resolvedUniqueConstraints.filter(
|
|
1210
|
+
(c) => c.fields.length > 1
|
|
1211
|
+
);
|
|
1212
|
+
if (compoundConstraints.length > 0) {
|
|
1213
|
+
let constraints = meta.get("_constraints");
|
|
1214
|
+
if (!constraints) {
|
|
1215
|
+
constraints = new Y.Map();
|
|
1216
|
+
meta.set("_constraints", constraints);
|
|
1217
|
+
}
|
|
1218
|
+
for (const constraint of compoundConstraints) {
|
|
1219
|
+
syncConstraintMeta(constraints, constraint);
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
const relationships = schema.options.relationships;
|
|
1223
|
+
if (relationships && Object.keys(relationships).length > 0) {
|
|
1224
|
+
let rels = meta.get("_relationships");
|
|
1225
|
+
if (!rels) {
|
|
1226
|
+
rels = new Y.Map();
|
|
1227
|
+
meta.set("_relationships", rels);
|
|
1228
|
+
}
|
|
1229
|
+
for (const [relName, relConfig] of Object.entries(relationships)) {
|
|
1230
|
+
syncRelationshipMeta(rels, relName, relConfig);
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
synced.add(modelName);
|
|
1234
|
+
}
|
|
1235
|
+
function syncFieldMeta(metaMap, fieldName, fieldOpts) {
|
|
1236
|
+
let fieldMeta = metaMap.get(fieldName);
|
|
1237
|
+
if (!fieldMeta) {
|
|
1238
|
+
fieldMeta = new Y.Map();
|
|
1239
|
+
metaMap.set(fieldName, fieldMeta);
|
|
1240
|
+
}
|
|
1241
|
+
setIfChanged(fieldMeta, "type", fieldOpts.type);
|
|
1242
|
+
if (fieldOpts.indexed) setIfChanged(fieldMeta, "indexed", true);
|
|
1243
|
+
if (fieldOpts.unique) setIfChanged(fieldMeta, "unique", true);
|
|
1244
|
+
if (fieldOpts.required) setIfChanged(fieldMeta, "required", true);
|
|
1245
|
+
if (fieldOpts.autoAssign) setIfChanged(fieldMeta, "autoAssign", true);
|
|
1246
|
+
if (fieldOpts.maxLength !== void 0) setIfChanged(fieldMeta, "maxLength", fieldOpts.maxLength);
|
|
1247
|
+
if (fieldOpts.maxCount !== void 0) setIfChanged(fieldMeta, "maxCount", fieldOpts.maxCount);
|
|
1248
|
+
const encoded = encodeDefault(fieldOpts.default);
|
|
1249
|
+
if (encoded !== void 0) setIfChanged(fieldMeta, "default", encoded);
|
|
1250
|
+
}
|
|
1251
|
+
function syncConstraintMeta(constraintsMap, constraint) {
|
|
1252
|
+
let cMeta = constraintsMap.get(constraint.name);
|
|
1253
|
+
if (!cMeta) {
|
|
1254
|
+
cMeta = new Y.Map();
|
|
1255
|
+
constraintsMap.set(constraint.name, cMeta);
|
|
1256
|
+
}
|
|
1257
|
+
setIfChanged(cMeta, "type", "unique");
|
|
1258
|
+
const fieldsJson = JSON.stringify(constraint.fields);
|
|
1259
|
+
setIfChanged(cMeta, "fields", fieldsJson);
|
|
1260
|
+
}
|
|
1261
|
+
function syncRelationshipMeta(relsMap, relName, relConfig) {
|
|
1262
|
+
let relMeta = relsMap.get(relName);
|
|
1263
|
+
if (!relMeta) {
|
|
1264
|
+
relMeta = new Y.Map();
|
|
1265
|
+
relsMap.set(relName, relMeta);
|
|
1266
|
+
}
|
|
1267
|
+
for (const [key, value] of Object.entries(relConfig)) {
|
|
1268
|
+
if (value !== void 0) {
|
|
1269
|
+
setIfChanged(relMeta, key, value);
|
|
1270
|
+
}
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
function setIfChanged(map, key, value) {
|
|
1274
|
+
if (map.get(key) !== value) {
|
|
1275
|
+
map.set(key, value);
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
var Y, KNOWN_FUNCTION_DEFAULTS, _syncedCache;
|
|
1279
|
+
var init_metaSync = __esm({
|
|
1280
|
+
"src/models/metaSync.ts"() {
|
|
1281
|
+
"use strict";
|
|
1282
|
+
Y = __toESM(require("yjs"), 1);
|
|
1283
|
+
KNOWN_FUNCTION_DEFAULTS = /* @__PURE__ */ new WeakMap();
|
|
1284
|
+
_syncedCache = /* @__PURE__ */ new WeakMap();
|
|
1285
|
+
}
|
|
1286
|
+
});
|
|
1287
|
+
|
|
1186
1288
|
// src/models/relationshipManager.ts
|
|
1187
1289
|
function generateRefersToMethod(_sourceModelClass, config, targetModelClass) {
|
|
1188
1290
|
return async function() {
|
|
@@ -2296,17 +2398,18 @@ __export(BaseModel_exports, {
|
|
|
2296
2398
|
function generateULID() {
|
|
2297
2399
|
return (0, import_ulid.ulid)();
|
|
2298
2400
|
}
|
|
2299
|
-
var
|
|
2401
|
+
var Y2, import_ulid, LogLevel, Logger, UniqueConstraintViolationError, RecordNotFoundError, SCHEMA_ACCESSORS_KEY, BaseModel2;
|
|
2300
2402
|
var init_BaseModel = __esm({
|
|
2301
2403
|
"src/models/BaseModel.ts"() {
|
|
2302
2404
|
"use strict";
|
|
2303
|
-
|
|
2405
|
+
Y2 = __toESM(require("yjs"), 1);
|
|
2304
2406
|
import_ulid = require("ulid");
|
|
2305
2407
|
init_StringSet();
|
|
2306
2408
|
init_documentTypes();
|
|
2307
2409
|
init_DocumentQueryTranslator();
|
|
2308
2410
|
init_CursorManager();
|
|
2309
2411
|
init_sql();
|
|
2412
|
+
init_metaSync();
|
|
2310
2413
|
LogLevel = /* @__PURE__ */ ((LogLevel2) => {
|
|
2311
2414
|
LogLevel2[LogLevel2["SILENT"] = 0] = "SILENT";
|
|
2312
2415
|
LogLevel2[LogLevel2["ERROR"] = 1] = "ERROR";
|
|
@@ -2410,6 +2513,7 @@ var init_BaseModel = __esm({
|
|
|
2410
2513
|
Object.setPrototypeOf(this, _RecordNotFoundError.prototype);
|
|
2411
2514
|
}
|
|
2412
2515
|
};
|
|
2516
|
+
registerFunctionDefault(generateULID, "generate_ulid");
|
|
2413
2517
|
SCHEMA_ACCESSORS_KEY = /* @__PURE__ */ Symbol("jsBaoSchemaAccessors");
|
|
2414
2518
|
BaseModel2 = class _BaseModel {
|
|
2415
2519
|
static modelName;
|
|
@@ -2440,6 +2544,9 @@ var init_BaseModel = __esm({
|
|
|
2440
2544
|
// Flag to distinguish loading vs user changes
|
|
2441
2545
|
// StringSet field caching
|
|
2442
2546
|
_stringSetFields = /* @__PURE__ */ new Map();
|
|
2547
|
+
// upsertOn: track what the caller explicitly provided in the constructor
|
|
2548
|
+
_constructorProvidedId = false;
|
|
2549
|
+
_constructorProvidedFields = /* @__PURE__ */ new Set();
|
|
2443
2550
|
// Multi-document instance metadata
|
|
2444
2551
|
_metaDocId = null;
|
|
2445
2552
|
_metaPermissionHint = null;
|
|
@@ -2601,6 +2708,7 @@ var init_BaseModel = __esm({
|
|
|
2601
2708
|
const idFieldOptions = schema.fields.get("id");
|
|
2602
2709
|
if (data.id) {
|
|
2603
2710
|
this.id = data.id;
|
|
2711
|
+
this._constructorProvidedId = true;
|
|
2604
2712
|
} else if (idFieldOptions?.autoAssign) {
|
|
2605
2713
|
this.id = generateULID();
|
|
2606
2714
|
} else if (idFieldOptions?.default) {
|
|
@@ -2681,6 +2789,7 @@ var init_BaseModel = __esm({
|
|
|
2681
2789
|
if (fieldKey === "id") continue;
|
|
2682
2790
|
if (data.hasOwnProperty(fieldKey)) {
|
|
2683
2791
|
this.setValue(fieldKey, data[fieldKey]);
|
|
2792
|
+
this._constructorProvidedFields.add(fieldKey);
|
|
2684
2793
|
} else if (fieldOptions.default !== void 0) {
|
|
2685
2794
|
const defaultValue = typeof fieldOptions.default === "function" ? fieldOptions.default() : fieldOptions.default;
|
|
2686
2795
|
this.setValue(fieldKey, defaultValue);
|
|
@@ -3060,7 +3169,7 @@ var init_BaseModel = __esm({
|
|
|
3060
3169
|
}
|
|
3061
3170
|
const extractStringSetValues = (value) => {
|
|
3062
3171
|
if (!value) return [];
|
|
3063
|
-
if (value instanceof
|
|
3172
|
+
if (value instanceof Y2.Map) {
|
|
3064
3173
|
return Array.from(value.entries()).filter(([, isMember]) => Boolean(isMember)).map(([key]) => key);
|
|
3065
3174
|
}
|
|
3066
3175
|
if (Array.isArray(value)) {
|
|
@@ -3077,7 +3186,7 @@ var init_BaseModel = __esm({
|
|
|
3077
3186
|
if (!recordId) continue;
|
|
3078
3187
|
let itemData;
|
|
3079
3188
|
const stringSetValuesByField = {};
|
|
3080
|
-
if (recordData instanceof
|
|
3189
|
+
if (recordData instanceof Y2.Map) {
|
|
3081
3190
|
itemData = {};
|
|
3082
3191
|
const unknownFields = [];
|
|
3083
3192
|
for (const [fieldKey, value] of recordData.entries()) {
|
|
@@ -3196,7 +3305,7 @@ var init_BaseModel = __esm({
|
|
|
3196
3305
|
const buildUniqueKey = (recordData, fields) => {
|
|
3197
3306
|
const keyParts = [];
|
|
3198
3307
|
for (const field of fields) {
|
|
3199
|
-
const value = recordData instanceof
|
|
3308
|
+
const value = recordData instanceof Y2.Map ? recordData.get(field) : recordData[field];
|
|
3200
3309
|
if (value === null || value === void 0) {
|
|
3201
3310
|
return null;
|
|
3202
3311
|
}
|
|
@@ -3206,7 +3315,7 @@ var init_BaseModel = __esm({
|
|
|
3206
3315
|
};
|
|
3207
3316
|
const extractItemData = (key, recordData) => {
|
|
3208
3317
|
let itemData;
|
|
3209
|
-
if (recordData instanceof
|
|
3318
|
+
if (recordData instanceof Y2.Map) {
|
|
3210
3319
|
itemData = {};
|
|
3211
3320
|
const unknownFields = [];
|
|
3212
3321
|
for (const [fieldKey, value] of recordData.entries()) {
|
|
@@ -3322,7 +3431,7 @@ var init_BaseModel = __esm({
|
|
|
3322
3431
|
if (!recordData || !key) continue;
|
|
3323
3432
|
const itemData = extractItemData(key, recordData);
|
|
3324
3433
|
if (!itemData) continue;
|
|
3325
|
-
if (change.action === "add" && recordData instanceof
|
|
3434
|
+
if (change.action === "add" && recordData instanceof Y2.Map) {
|
|
3326
3435
|
Logger.verbose(
|
|
3327
3436
|
`[${this.name}] Setting up observer on newly added nested YMap for record ${key} in document ${docId}`
|
|
3328
3437
|
);
|
|
@@ -3467,7 +3576,7 @@ var init_BaseModel = __esm({
|
|
|
3467
3576
|
`[${this.name}] Setting up observers on existing nested YMaps for ${modelName}/${docId}...`
|
|
3468
3577
|
);
|
|
3469
3578
|
for (const [recordId, recordData] of documentYMap.entries()) {
|
|
3470
|
-
if (recordData instanceof
|
|
3579
|
+
if (recordData instanceof Y2.Map) {
|
|
3471
3580
|
Logger.verbose(
|
|
3472
3581
|
`[${this.name}] Setting up observer on existing nested YMap for record ${recordId} in document ${docId}`
|
|
3473
3582
|
);
|
|
@@ -3815,6 +3924,39 @@ var init_BaseModel = __esm({
|
|
|
3815
3924
|
);
|
|
3816
3925
|
}
|
|
3817
3926
|
const yDoc = targetYDoc;
|
|
3927
|
+
let upsertOnConstraint = null;
|
|
3928
|
+
let upsertOnKey = null;
|
|
3929
|
+
if (options?.upsertOn) {
|
|
3930
|
+
const upsertField = options.upsertOn;
|
|
3931
|
+
assertValidIdentifier(upsertField, "upsertOn field");
|
|
3932
|
+
const upsertValue = this[upsertField];
|
|
3933
|
+
if (upsertValue === null || upsertValue === void 0 || upsertValue === "") {
|
|
3934
|
+
throw new Error(
|
|
3935
|
+
`[${modelName}] upsertOn field '${upsertField}' must be present in data and not null/empty`
|
|
3936
|
+
);
|
|
3937
|
+
}
|
|
3938
|
+
const constraint = schema.resolvedUniqueConstraints.find(
|
|
3939
|
+
(c) => c.fields.length === 1 && c.fields[0] === upsertField
|
|
3940
|
+
);
|
|
3941
|
+
if (!constraint) {
|
|
3942
|
+
throw new Error(
|
|
3943
|
+
`[${modelName}] upsertOn field '${upsertField}' does not have a registered unique index`
|
|
3944
|
+
);
|
|
3945
|
+
}
|
|
3946
|
+
const uniqueKey = modelConstructor._buildKeyFromValues(
|
|
3947
|
+
constraint.fields,
|
|
3948
|
+
[upsertValue],
|
|
3949
|
+
modelName,
|
|
3950
|
+
constraint.name
|
|
3951
|
+
);
|
|
3952
|
+
if (uniqueKey === null) {
|
|
3953
|
+
throw new Error(
|
|
3954
|
+
`[${modelName}] upsertOn: unable to build unique key for field '${upsertField}'`
|
|
3955
|
+
);
|
|
3956
|
+
}
|
|
3957
|
+
upsertOnConstraint = constraint;
|
|
3958
|
+
upsertOnKey = uniqueKey;
|
|
3959
|
+
}
|
|
3818
3960
|
if (!this.id) {
|
|
3819
3961
|
Logger.error(
|
|
3820
3962
|
"[BaseModel.save()] ID is undefined before saving! Instance dump:",
|
|
@@ -3832,6 +3974,28 @@ var init_BaseModel = __esm({
|
|
|
3832
3974
|
dataToSave
|
|
3833
3975
|
);
|
|
3834
3976
|
await yDoc.transact(async () => {
|
|
3977
|
+
if (upsertOnConstraint && upsertOnKey) {
|
|
3978
|
+
const constraintMapName = `_uniqueIdx_${modelName}_${upsertOnConstraint.name}`;
|
|
3979
|
+
const constraintMap = yDoc.getMap(constraintMapName);
|
|
3980
|
+
const existingId = constraintMap.get(upsertOnKey);
|
|
3981
|
+
if (existingId) {
|
|
3982
|
+
if (this._constructorProvidedId && this.id !== existingId) {
|
|
3983
|
+
throw new Error(
|
|
3984
|
+
`[${modelName}] upsertOn conflict: caller id '${this.id}' does not match existing record '${existingId}'`
|
|
3985
|
+
);
|
|
3986
|
+
}
|
|
3987
|
+
this.id = existingId;
|
|
3988
|
+
this._metaDocId = targetDocId;
|
|
3989
|
+
this._metaPermissionHint = permissionHint;
|
|
3990
|
+
if (this._localChanges) {
|
|
3991
|
+
for (const key of Object.keys(this._localChanges)) {
|
|
3992
|
+
if (!this._constructorProvidedFields.has(key)) {
|
|
3993
|
+
delete this._localChanges[key];
|
|
3994
|
+
}
|
|
3995
|
+
}
|
|
3996
|
+
}
|
|
3997
|
+
}
|
|
3998
|
+
}
|
|
3835
3999
|
if (!targetYMap) {
|
|
3836
4000
|
throw new Error(
|
|
3837
4001
|
`[${modelName}] Target YMap not found for save operation`
|
|
@@ -3842,7 +4006,7 @@ var init_BaseModel = __esm({
|
|
|
3842
4006
|
Logger.debug(`[${modelName}.save] isUpdate: ${isUpdate}`);
|
|
3843
4007
|
Logger.debug(`[${modelName}.save] recordYMap exists: ${!!recordYMap}`);
|
|
3844
4008
|
if (!recordYMap) {
|
|
3845
|
-
recordYMap = new
|
|
4009
|
+
recordYMap = new Y2.Map();
|
|
3846
4010
|
Logger.verbose(
|
|
3847
4011
|
`[${modelName}] Creating new nested YMap for record ${this.id} in document ${targetDocId || "legacy"}`
|
|
3848
4012
|
);
|
|
@@ -4014,6 +4178,7 @@ var init_BaseModel = __esm({
|
|
|
4014
4178
|
}
|
|
4015
4179
|
}
|
|
4016
4180
|
Logger.verbose(`[${modelName}] Save completed for ${this.id}`);
|
|
4181
|
+
syncModelMeta(yDoc, modelName, schema);
|
|
4017
4182
|
if (_BaseModel.dbInstance) {
|
|
4018
4183
|
Logger.verbose(
|
|
4019
4184
|
`[${modelName}] Syncing StringSet changes to database for ${this.id}`
|
|
@@ -4858,7 +5023,7 @@ var init_BaseModel = __esm({
|
|
|
4858
5023
|
);
|
|
4859
5024
|
}
|
|
4860
5025
|
for (const [recordId, recordYMap] of documentYMap.entries()) {
|
|
4861
|
-
if (recordYMap instanceof
|
|
5026
|
+
if (recordYMap instanceof Y2.Map) {
|
|
4862
5027
|
const instance = new this({ id: recordId });
|
|
4863
5028
|
instance._metaDocId = docId;
|
|
4864
5029
|
const connectedDoc = modelConstructor.connectedDocuments.get(docId);
|
|
@@ -4929,7 +5094,7 @@ var init_BaseModel = __esm({
|
|
|
4929
5094
|
const documentYMap = modelConstructor.documentYMaps.get(documentYMapKey);
|
|
4930
5095
|
if (documentYMap) {
|
|
4931
5096
|
const recordYMap2 = documentYMap.get(recordId2);
|
|
4932
|
-
if (recordYMap2 && recordYMap2 instanceof
|
|
5097
|
+
if (recordYMap2 && recordYMap2 instanceof Y2.Map) {
|
|
4933
5098
|
const instance = new modelConstructor({
|
|
4934
5099
|
id: recordId2
|
|
4935
5100
|
});
|
|
@@ -4966,7 +5131,7 @@ var init_BaseModel = __esm({
|
|
|
4966
5131
|
if (!recordYMap) {
|
|
4967
5132
|
return null;
|
|
4968
5133
|
}
|
|
4969
|
-
if (recordYMap instanceof
|
|
5134
|
+
if (recordYMap instanceof Y2.Map) {
|
|
4970
5135
|
const instance = new modelConstructor({
|
|
4971
5136
|
id: recordId
|
|
4972
5137
|
});
|
|
@@ -5549,9 +5714,12 @@ var TransactionalSQLJSOperations = class {
|
|
|
5549
5714
|
const quotedColumns = columns.map((column) => quoteIdentifier(column));
|
|
5550
5715
|
const placeholders = columns.map(() => "?").join(", ");
|
|
5551
5716
|
const values = Object.values(data);
|
|
5552
|
-
const
|
|
5717
|
+
const nonIdColumns = columns.filter((c) => c !== "id");
|
|
5718
|
+
const quotedNonIdColumns = nonIdColumns.map((c) => quoteIdentifier(c));
|
|
5719
|
+
const updateClause = nonIdColumns.length > 0 ? `ON CONFLICT(${quoteIdentifier("id")}) DO UPDATE SET ${quotedNonIdColumns.map((c) => `${c}=excluded.${c}`).join(", ")}` : `ON CONFLICT(${quoteIdentifier("id")}) DO NOTHING`;
|
|
5720
|
+
const insertSQL = `INSERT INTO ${quotedTableName} (${quotedColumns.join(
|
|
5553
5721
|
", "
|
|
5554
|
-
)}) VALUES (${placeholders});`;
|
|
5722
|
+
)}) VALUES (${placeholders}) ${updateClause};`;
|
|
5555
5723
|
this.db.run(insertSQL, values);
|
|
5556
5724
|
}
|
|
5557
5725
|
async delete(modelName, id) {
|
|
@@ -5762,9 +5930,12 @@ var SqljsEngine = class _SqljsEngine {
|
|
|
5762
5930
|
const quotedColumns = columns.map((column) => quoteIdentifier(column));
|
|
5763
5931
|
const placeholders = columns.map(() => "?").join(", ");
|
|
5764
5932
|
const values = Object.values(data);
|
|
5765
|
-
const
|
|
5933
|
+
const nonIdColumns = columns.filter((c) => c !== "id");
|
|
5934
|
+
const quotedNonIdColumns = nonIdColumns.map((c) => quoteIdentifier(c));
|
|
5935
|
+
const updateClause = nonIdColumns.length > 0 ? `ON CONFLICT(${quoteIdentifier("id")}) DO UPDATE SET ${quotedNonIdColumns.map((c) => `${c}=excluded.${c}`).join(", ")}` : `ON CONFLICT(${quoteIdentifier("id")}) DO NOTHING`;
|
|
5936
|
+
const insertSQL = `INSERT INTO ${quotedTableName} (${quotedColumns.join(
|
|
5766
5937
|
", "
|
|
5767
|
-
)}) VALUES (${placeholders});`;
|
|
5938
|
+
)}) VALUES (${placeholders}) ${updateClause};`;
|
|
5768
5939
|
this.db.run(insertSQL, values);
|
|
5769
5940
|
}
|
|
5770
5941
|
async delete(modelName, id) {
|
package/dist/browser.d.cts
CHANGED
|
@@ -181,6 +181,7 @@ interface ConnectedDocument {
|
|
|
181
181
|
interface SaveOptions {
|
|
182
182
|
targetDocument?: string;
|
|
183
183
|
forceWrite?: boolean;
|
|
184
|
+
upsertOn?: string;
|
|
184
185
|
}
|
|
185
186
|
interface DocumentConnectionEvent {
|
|
186
187
|
type: "connect" | "disconnect";
|
|
@@ -450,6 +451,8 @@ declare class BaseModel implements StringSetChangeTracker {
|
|
|
450
451
|
private _isDirty;
|
|
451
452
|
private _isLoadingFromYjs;
|
|
452
453
|
private _stringSetFields;
|
|
454
|
+
protected _constructorProvidedId: boolean;
|
|
455
|
+
protected _constructorProvidedFields: Set<string>;
|
|
453
456
|
private _metaDocId;
|
|
454
457
|
private _metaPermissionHint;
|
|
455
458
|
/**
|
package/dist/browser.d.ts
CHANGED
|
@@ -181,6 +181,7 @@ interface ConnectedDocument {
|
|
|
181
181
|
interface SaveOptions {
|
|
182
182
|
targetDocument?: string;
|
|
183
183
|
forceWrite?: boolean;
|
|
184
|
+
upsertOn?: string;
|
|
184
185
|
}
|
|
185
186
|
interface DocumentConnectionEvent {
|
|
186
187
|
type: "connect" | "disconnect";
|
|
@@ -450,6 +451,8 @@ declare class BaseModel implements StringSetChangeTracker {
|
|
|
450
451
|
private _isDirty;
|
|
451
452
|
private _isLoadingFromYjs;
|
|
452
453
|
private _stringSetFields;
|
|
454
|
+
protected _constructorProvidedId: boolean;
|
|
455
|
+
protected _constructorProvidedFields: Set<string>;
|
|
453
456
|
private _metaDocId;
|
|
454
457
|
private _metaPermissionHint;
|
|
455
458
|
/**
|