js-bao 0.3.0-alpha.5 → 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.
Files changed (66) hide show
  1. package/dist/browser.cjs +187 -16
  2. package/dist/browser.d.cts +3 -0
  3. package/dist/browser.d.ts +3 -0
  4. package/dist/browser.js +186 -15
  5. package/dist/client.cjs +20 -2
  6. package/dist/client.d.cts +7 -2
  7. package/dist/client.d.ts +7 -2
  8. package/dist/client.js +19 -1
  9. package/dist/cloudflare-do.cjs +207 -38
  10. package/dist/cloudflare-do.d.cts +35 -3
  11. package/dist/cloudflare-do.d.ts +35 -3
  12. package/dist/cloudflare-do.js +207 -38
  13. package/dist/cloudflare.cjs +20 -2
  14. package/dist/cloudflare.d.cts +7 -2
  15. package/dist/cloudflare.d.ts +7 -2
  16. package/dist/cloudflare.js +19 -1
  17. package/dist/codegen.cjs +8 -7
  18. package/dist/index.cjs +576 -26
  19. package/dist/index.d.cts +134 -1
  20. package/dist/index.d.ts +134 -1
  21. package/dist/index.js +564 -24
  22. package/dist/node.cjs +257 -22
  23. package/dist/node.d.cts +40 -1
  24. package/dist/node.d.ts +40 -1
  25. package/dist/node.js +253 -20
  26. package/package.json +8 -7
  27. package/dist/BaseModel-5YQCROYE.js +0 -17
  28. package/dist/BaseModel-5YQCROYE.js.map +0 -1
  29. package/dist/BaseModel-FCNWDJBH.js +0 -17
  30. package/dist/BaseModel-FCNWDJBH.js.map +0 -1
  31. package/dist/BrowserDatabaseFactory-PXOTK2DQ.js +0 -119
  32. package/dist/BrowserDatabaseFactory-PXOTK2DQ.js.map +0 -1
  33. package/dist/BrowserDatabaseFactory-WD4VX2VZ.js +0 -119
  34. package/dist/BrowserDatabaseFactory-WD4VX2VZ.js.map +0 -1
  35. package/dist/IncludeResolver-RCKQGNPZ.js +0 -385
  36. package/dist/IncludeResolver-RCKQGNPZ.js.map +0 -1
  37. package/dist/IncludeResolver-WGSQDMS7.js +0 -385
  38. package/dist/IncludeResolver-WGSQDMS7.js.map +0 -1
  39. package/dist/NodeDatabaseFactory-J4Z36UF3.js +0 -165
  40. package/dist/NodeDatabaseFactory-J4Z36UF3.js.map +0 -1
  41. package/dist/NodeDatabaseFactory-QIEKAXBM.js +0 -10
  42. package/dist/NodeDatabaseFactory-QIEKAXBM.js.map +0 -1
  43. package/dist/NodeSqliteEngine-HJSAYE4E.js +0 -383
  44. package/dist/NodeSqliteEngine-HJSAYE4E.js.map +0 -1
  45. package/dist/NodeSqliteEngine-I5SLWLME.js +0 -383
  46. package/dist/NodeSqliteEngine-I5SLWLME.js.map +0 -1
  47. package/dist/chunk-3PZWHUZO.js +0 -4153
  48. package/dist/chunk-3PZWHUZO.js.map +0 -1
  49. package/dist/chunk-53MS4MN7.js +0 -373
  50. package/dist/chunk-53MS4MN7.js.map +0 -1
  51. package/dist/chunk-65G2P4GL.js +0 -709
  52. package/dist/chunk-65G2P4GL.js.map +0 -1
  53. package/dist/chunk-6UX3YSCW.js +0 -4151
  54. package/dist/chunk-6UX3YSCW.js.map +0 -1
  55. package/dist/chunk-DANSD6BE.js +0 -709
  56. package/dist/chunk-DANSD6BE.js.map +0 -1
  57. package/dist/chunk-DF3JEQXA.js +0 -373
  58. package/dist/chunk-DF3JEQXA.js.map +0 -1
  59. package/dist/chunk-GO3APTPX.js +0 -61
  60. package/dist/chunk-GO3APTPX.js.map +0 -1
  61. package/dist/chunk-ID4U6IQC.js +0 -53
  62. package/dist/chunk-ID4U6IQC.js.map +0 -1
  63. package/dist/chunk-RQVS3LVL.js +0 -165
  64. package/dist/chunk-RQVS3LVL.js.map +0 -1
  65. package/dist/environment-TOTQICSE.js +0 -17
  66. 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 Y, import_ulid, LogLevel, Logger, UniqueConstraintViolationError, RecordNotFoundError, SCHEMA_ACCESSORS_KEY, BaseModel2;
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
- Y = __toESM(require("yjs"), 1);
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 Y.Map) {
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 Y.Map) {
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 Y.Map ? recordData.get(field) : recordData[field];
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 Y.Map) {
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 Y.Map) {
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 Y.Map) {
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 Y.Map();
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 Y.Map) {
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 Y.Map) {
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 Y.Map) {
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 insertSQL = `INSERT OR REPLACE INTO ${quotedTableName} (${quotedColumns.join(
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 insertSQL = `INSERT OR REPLACE INTO ${quotedTableName} (${quotedColumns.join(
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) {
@@ -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
  /**