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.
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 +371 -155
  10. package/dist/cloudflare-do.d.cts +47 -9
  11. package/dist/cloudflare-do.d.ts +47 -9
  12. package/dist/cloudflare-do.js +371 -155
  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.js CHANGED
@@ -1161,6 +1161,108 @@ var init_DocumentQueryTranslator = __esm({
1161
1161
  }
1162
1162
  });
1163
1163
 
1164
+ // src/models/metaSync.ts
1165
+ import * as Y from "yjs";
1166
+ function registerFunctionDefault(fn, name) {
1167
+ KNOWN_FUNCTION_DEFAULTS.set(fn, name);
1168
+ }
1169
+ function encodeDefault(value) {
1170
+ if (value === void 0 || value === null) return void 0;
1171
+ if (typeof value === "function") {
1172
+ const name = KNOWN_FUNCTION_DEFAULTS.get(value);
1173
+ return name ? `$${name}` : "$unknown_function";
1174
+ }
1175
+ return value;
1176
+ }
1177
+ function syncModelMeta(yDoc, modelName, schema) {
1178
+ let synced = _syncedCache.get(yDoc);
1179
+ if (synced?.has(modelName)) return;
1180
+ if (!synced) {
1181
+ synced = /* @__PURE__ */ new Set();
1182
+ _syncedCache.set(yDoc, synced);
1183
+ }
1184
+ const meta = yDoc.getMap(`_meta_${modelName}`);
1185
+ for (const [fieldName, fieldOpts] of schema.fields.entries()) {
1186
+ syncFieldMeta(meta, fieldName, fieldOpts);
1187
+ }
1188
+ const compoundConstraints = schema.resolvedUniqueConstraints.filter(
1189
+ (c) => c.fields.length > 1
1190
+ );
1191
+ if (compoundConstraints.length > 0) {
1192
+ let constraints = meta.get("_constraints");
1193
+ if (!constraints) {
1194
+ constraints = new Y.Map();
1195
+ meta.set("_constraints", constraints);
1196
+ }
1197
+ for (const constraint of compoundConstraints) {
1198
+ syncConstraintMeta(constraints, constraint);
1199
+ }
1200
+ }
1201
+ const relationships = schema.options.relationships;
1202
+ if (relationships && Object.keys(relationships).length > 0) {
1203
+ let rels = meta.get("_relationships");
1204
+ if (!rels) {
1205
+ rels = new Y.Map();
1206
+ meta.set("_relationships", rels);
1207
+ }
1208
+ for (const [relName, relConfig] of Object.entries(relationships)) {
1209
+ syncRelationshipMeta(rels, relName, relConfig);
1210
+ }
1211
+ }
1212
+ synced.add(modelName);
1213
+ }
1214
+ function syncFieldMeta(metaMap, fieldName, fieldOpts) {
1215
+ let fieldMeta = metaMap.get(fieldName);
1216
+ if (!fieldMeta) {
1217
+ fieldMeta = new Y.Map();
1218
+ metaMap.set(fieldName, fieldMeta);
1219
+ }
1220
+ setIfChanged(fieldMeta, "type", fieldOpts.type);
1221
+ if (fieldOpts.indexed) setIfChanged(fieldMeta, "indexed", true);
1222
+ if (fieldOpts.unique) setIfChanged(fieldMeta, "unique", true);
1223
+ if (fieldOpts.required) setIfChanged(fieldMeta, "required", true);
1224
+ if (fieldOpts.autoAssign) setIfChanged(fieldMeta, "autoAssign", true);
1225
+ if (fieldOpts.maxLength !== void 0) setIfChanged(fieldMeta, "maxLength", fieldOpts.maxLength);
1226
+ if (fieldOpts.maxCount !== void 0) setIfChanged(fieldMeta, "maxCount", fieldOpts.maxCount);
1227
+ const encoded = encodeDefault(fieldOpts.default);
1228
+ if (encoded !== void 0) setIfChanged(fieldMeta, "default", encoded);
1229
+ }
1230
+ function syncConstraintMeta(constraintsMap, constraint) {
1231
+ let cMeta = constraintsMap.get(constraint.name);
1232
+ if (!cMeta) {
1233
+ cMeta = new Y.Map();
1234
+ constraintsMap.set(constraint.name, cMeta);
1235
+ }
1236
+ setIfChanged(cMeta, "type", "unique");
1237
+ const fieldsJson = JSON.stringify(constraint.fields);
1238
+ setIfChanged(cMeta, "fields", fieldsJson);
1239
+ }
1240
+ function syncRelationshipMeta(relsMap, relName, relConfig) {
1241
+ let relMeta = relsMap.get(relName);
1242
+ if (!relMeta) {
1243
+ relMeta = new Y.Map();
1244
+ relsMap.set(relName, relMeta);
1245
+ }
1246
+ for (const [key, value] of Object.entries(relConfig)) {
1247
+ if (value !== void 0) {
1248
+ setIfChanged(relMeta, key, value);
1249
+ }
1250
+ }
1251
+ }
1252
+ function setIfChanged(map, key, value) {
1253
+ if (map.get(key) !== value) {
1254
+ map.set(key, value);
1255
+ }
1256
+ }
1257
+ var KNOWN_FUNCTION_DEFAULTS, _syncedCache;
1258
+ var init_metaSync = __esm({
1259
+ "src/models/metaSync.ts"() {
1260
+ "use strict";
1261
+ KNOWN_FUNCTION_DEFAULTS = /* @__PURE__ */ new WeakMap();
1262
+ _syncedCache = /* @__PURE__ */ new WeakMap();
1263
+ }
1264
+ });
1265
+
1164
1266
  // src/models/relationshipManager.ts
1165
1267
  function generateRefersToMethod(_sourceModelClass, config, targetModelClass) {
1166
1268
  return async function() {
@@ -2271,7 +2373,7 @@ __export(BaseModel_exports, {
2271
2373
  UniqueConstraintViolationError: () => UniqueConstraintViolationError,
2272
2374
  generateULID: () => generateULID
2273
2375
  });
2274
- import * as Y from "yjs";
2376
+ import * as Y2 from "yjs";
2275
2377
  import { ulid } from "ulid";
2276
2378
  function generateULID() {
2277
2379
  return ulid();
@@ -2285,6 +2387,7 @@ var init_BaseModel = __esm({
2285
2387
  init_DocumentQueryTranslator();
2286
2388
  init_CursorManager();
2287
2389
  init_sql();
2390
+ init_metaSync();
2288
2391
  LogLevel = /* @__PURE__ */ ((LogLevel2) => {
2289
2392
  LogLevel2[LogLevel2["SILENT"] = 0] = "SILENT";
2290
2393
  LogLevel2[LogLevel2["ERROR"] = 1] = "ERROR";
@@ -2388,6 +2491,7 @@ var init_BaseModel = __esm({
2388
2491
  Object.setPrototypeOf(this, _RecordNotFoundError.prototype);
2389
2492
  }
2390
2493
  };
2494
+ registerFunctionDefault(generateULID, "generate_ulid");
2391
2495
  SCHEMA_ACCESSORS_KEY = /* @__PURE__ */ Symbol("jsBaoSchemaAccessors");
2392
2496
  BaseModel2 = class _BaseModel {
2393
2497
  static modelName;
@@ -2418,6 +2522,9 @@ var init_BaseModel = __esm({
2418
2522
  // Flag to distinguish loading vs user changes
2419
2523
  // StringSet field caching
2420
2524
  _stringSetFields = /* @__PURE__ */ new Map();
2525
+ // upsertOn: track what the caller explicitly provided in the constructor
2526
+ _constructorProvidedId = false;
2527
+ _constructorProvidedFields = /* @__PURE__ */ new Set();
2421
2528
  // Multi-document instance metadata
2422
2529
  _metaDocId = null;
2423
2530
  _metaPermissionHint = null;
@@ -2579,6 +2686,7 @@ var init_BaseModel = __esm({
2579
2686
  const idFieldOptions = schema.fields.get("id");
2580
2687
  if (data.id) {
2581
2688
  this.id = data.id;
2689
+ this._constructorProvidedId = true;
2582
2690
  } else if (idFieldOptions?.autoAssign) {
2583
2691
  this.id = generateULID();
2584
2692
  } else if (idFieldOptions?.default) {
@@ -2659,6 +2767,7 @@ var init_BaseModel = __esm({
2659
2767
  if (fieldKey === "id") continue;
2660
2768
  if (data.hasOwnProperty(fieldKey)) {
2661
2769
  this.setValue(fieldKey, data[fieldKey]);
2770
+ this._constructorProvidedFields.add(fieldKey);
2662
2771
  } else if (fieldOptions.default !== void 0) {
2663
2772
  const defaultValue = typeof fieldOptions.default === "function" ? fieldOptions.default() : fieldOptions.default;
2664
2773
  this.setValue(fieldKey, defaultValue);
@@ -3038,7 +3147,7 @@ var init_BaseModel = __esm({
3038
3147
  }
3039
3148
  const extractStringSetValues = (value) => {
3040
3149
  if (!value) return [];
3041
- if (value instanceof Y.Map) {
3150
+ if (value instanceof Y2.Map) {
3042
3151
  return Array.from(value.entries()).filter(([, isMember]) => Boolean(isMember)).map(([key]) => key);
3043
3152
  }
3044
3153
  if (Array.isArray(value)) {
@@ -3055,7 +3164,7 @@ var init_BaseModel = __esm({
3055
3164
  if (!recordId) continue;
3056
3165
  let itemData;
3057
3166
  const stringSetValuesByField = {};
3058
- if (recordData instanceof Y.Map) {
3167
+ if (recordData instanceof Y2.Map) {
3059
3168
  itemData = {};
3060
3169
  const unknownFields = [];
3061
3170
  for (const [fieldKey, value] of recordData.entries()) {
@@ -3174,7 +3283,7 @@ var init_BaseModel = __esm({
3174
3283
  const buildUniqueKey = (recordData, fields) => {
3175
3284
  const keyParts = [];
3176
3285
  for (const field of fields) {
3177
- const value = recordData instanceof Y.Map ? recordData.get(field) : recordData[field];
3286
+ const value = recordData instanceof Y2.Map ? recordData.get(field) : recordData[field];
3178
3287
  if (value === null || value === void 0) {
3179
3288
  return null;
3180
3289
  }
@@ -3184,7 +3293,7 @@ var init_BaseModel = __esm({
3184
3293
  };
3185
3294
  const extractItemData = (key, recordData) => {
3186
3295
  let itemData;
3187
- if (recordData instanceof Y.Map) {
3296
+ if (recordData instanceof Y2.Map) {
3188
3297
  itemData = {};
3189
3298
  const unknownFields = [];
3190
3299
  for (const [fieldKey, value] of recordData.entries()) {
@@ -3300,7 +3409,7 @@ var init_BaseModel = __esm({
3300
3409
  if (!recordData || !key) continue;
3301
3410
  const itemData = extractItemData(key, recordData);
3302
3411
  if (!itemData) continue;
3303
- if (change.action === "add" && recordData instanceof Y.Map) {
3412
+ if (change.action === "add" && recordData instanceof Y2.Map) {
3304
3413
  Logger.verbose(
3305
3414
  `[${this.name}] Setting up observer on newly added nested YMap for record ${key} in document ${docId}`
3306
3415
  );
@@ -3445,7 +3554,7 @@ var init_BaseModel = __esm({
3445
3554
  `[${this.name}] Setting up observers on existing nested YMaps for ${modelName}/${docId}...`
3446
3555
  );
3447
3556
  for (const [recordId, recordData] of documentYMap.entries()) {
3448
- if (recordData instanceof Y.Map) {
3557
+ if (recordData instanceof Y2.Map) {
3449
3558
  Logger.verbose(
3450
3559
  `[${this.name}] Setting up observer on existing nested YMap for record ${recordId} in document ${docId}`
3451
3560
  );
@@ -3793,6 +3902,39 @@ var init_BaseModel = __esm({
3793
3902
  );
3794
3903
  }
3795
3904
  const yDoc = targetYDoc;
3905
+ let upsertOnConstraint = null;
3906
+ let upsertOnKey = null;
3907
+ if (options?.upsertOn) {
3908
+ const upsertField = options.upsertOn;
3909
+ assertValidIdentifier(upsertField, "upsertOn field");
3910
+ const upsertValue = this[upsertField];
3911
+ if (upsertValue === null || upsertValue === void 0 || upsertValue === "") {
3912
+ throw new Error(
3913
+ `[${modelName}] upsertOn field '${upsertField}' must be present in data and not null/empty`
3914
+ );
3915
+ }
3916
+ const constraint = schema.resolvedUniqueConstraints.find(
3917
+ (c) => c.fields.length === 1 && c.fields[0] === upsertField
3918
+ );
3919
+ if (!constraint) {
3920
+ throw new Error(
3921
+ `[${modelName}] upsertOn field '${upsertField}' does not have a registered unique index`
3922
+ );
3923
+ }
3924
+ const uniqueKey = modelConstructor._buildKeyFromValues(
3925
+ constraint.fields,
3926
+ [upsertValue],
3927
+ modelName,
3928
+ constraint.name
3929
+ );
3930
+ if (uniqueKey === null) {
3931
+ throw new Error(
3932
+ `[${modelName}] upsertOn: unable to build unique key for field '${upsertField}'`
3933
+ );
3934
+ }
3935
+ upsertOnConstraint = constraint;
3936
+ upsertOnKey = uniqueKey;
3937
+ }
3796
3938
  if (!this.id) {
3797
3939
  Logger.error(
3798
3940
  "[BaseModel.save()] ID is undefined before saving! Instance dump:",
@@ -3810,6 +3952,28 @@ var init_BaseModel = __esm({
3810
3952
  dataToSave
3811
3953
  );
3812
3954
  await yDoc.transact(async () => {
3955
+ if (upsertOnConstraint && upsertOnKey) {
3956
+ const constraintMapName = `_uniqueIdx_${modelName}_${upsertOnConstraint.name}`;
3957
+ const constraintMap = yDoc.getMap(constraintMapName);
3958
+ const existingId = constraintMap.get(upsertOnKey);
3959
+ if (existingId) {
3960
+ if (this._constructorProvidedId && this.id !== existingId) {
3961
+ throw new Error(
3962
+ `[${modelName}] upsertOn conflict: caller id '${this.id}' does not match existing record '${existingId}'`
3963
+ );
3964
+ }
3965
+ this.id = existingId;
3966
+ this._metaDocId = targetDocId;
3967
+ this._metaPermissionHint = permissionHint;
3968
+ if (this._localChanges) {
3969
+ for (const key of Object.keys(this._localChanges)) {
3970
+ if (!this._constructorProvidedFields.has(key)) {
3971
+ delete this._localChanges[key];
3972
+ }
3973
+ }
3974
+ }
3975
+ }
3976
+ }
3813
3977
  if (!targetYMap) {
3814
3978
  throw new Error(
3815
3979
  `[${modelName}] Target YMap not found for save operation`
@@ -3820,7 +3984,7 @@ var init_BaseModel = __esm({
3820
3984
  Logger.debug(`[${modelName}.save] isUpdate: ${isUpdate}`);
3821
3985
  Logger.debug(`[${modelName}.save] recordYMap exists: ${!!recordYMap}`);
3822
3986
  if (!recordYMap) {
3823
- recordYMap = new Y.Map();
3987
+ recordYMap = new Y2.Map();
3824
3988
  Logger.verbose(
3825
3989
  `[${modelName}] Creating new nested YMap for record ${this.id} in document ${targetDocId || "legacy"}`
3826
3990
  );
@@ -3992,6 +4156,7 @@ var init_BaseModel = __esm({
3992
4156
  }
3993
4157
  }
3994
4158
  Logger.verbose(`[${modelName}] Save completed for ${this.id}`);
4159
+ syncModelMeta(yDoc, modelName, schema);
3995
4160
  if (_BaseModel.dbInstance) {
3996
4161
  Logger.verbose(
3997
4162
  `[${modelName}] Syncing StringSet changes to database for ${this.id}`
@@ -4836,7 +5001,7 @@ var init_BaseModel = __esm({
4836
5001
  );
4837
5002
  }
4838
5003
  for (const [recordId, recordYMap] of documentYMap.entries()) {
4839
- if (recordYMap instanceof Y.Map) {
5004
+ if (recordYMap instanceof Y2.Map) {
4840
5005
  const instance = new this({ id: recordId });
4841
5006
  instance._metaDocId = docId;
4842
5007
  const connectedDoc = modelConstructor.connectedDocuments.get(docId);
@@ -4907,7 +5072,7 @@ var init_BaseModel = __esm({
4907
5072
  const documentYMap = modelConstructor.documentYMaps.get(documentYMapKey);
4908
5073
  if (documentYMap) {
4909
5074
  const recordYMap2 = documentYMap.get(recordId2);
4910
- if (recordYMap2 && recordYMap2 instanceof Y.Map) {
5075
+ if (recordYMap2 && recordYMap2 instanceof Y2.Map) {
4911
5076
  const instance = new modelConstructor({
4912
5077
  id: recordId2
4913
5078
  });
@@ -4944,7 +5109,7 @@ var init_BaseModel = __esm({
4944
5109
  if (!recordYMap) {
4945
5110
  return null;
4946
5111
  }
4947
- if (recordYMap instanceof Y.Map) {
5112
+ if (recordYMap instanceof Y2.Map) {
4948
5113
  const instance = new modelConstructor({
4949
5114
  id: recordId
4950
5115
  });
@@ -5499,9 +5664,12 @@ var TransactionalSQLJSOperations = class {
5499
5664
  const quotedColumns = columns.map((column) => quoteIdentifier(column));
5500
5665
  const placeholders = columns.map(() => "?").join(", ");
5501
5666
  const values = Object.values(data);
5502
- const insertSQL = `INSERT OR REPLACE INTO ${quotedTableName} (${quotedColumns.join(
5667
+ const nonIdColumns = columns.filter((c) => c !== "id");
5668
+ const quotedNonIdColumns = nonIdColumns.map((c) => quoteIdentifier(c));
5669
+ 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`;
5670
+ const insertSQL = `INSERT INTO ${quotedTableName} (${quotedColumns.join(
5503
5671
  ", "
5504
- )}) VALUES (${placeholders});`;
5672
+ )}) VALUES (${placeholders}) ${updateClause};`;
5505
5673
  this.db.run(insertSQL, values);
5506
5674
  }
5507
5675
  async delete(modelName, id) {
@@ -5712,9 +5880,12 @@ var SqljsEngine = class _SqljsEngine {
5712
5880
  const quotedColumns = columns.map((column) => quoteIdentifier(column));
5713
5881
  const placeholders = columns.map(() => "?").join(", ");
5714
5882
  const values = Object.values(data);
5715
- const insertSQL = `INSERT OR REPLACE INTO ${quotedTableName} (${quotedColumns.join(
5883
+ const nonIdColumns = columns.filter((c) => c !== "id");
5884
+ const quotedNonIdColumns = nonIdColumns.map((c) => quoteIdentifier(c));
5885
+ 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`;
5886
+ const insertSQL = `INSERT INTO ${quotedTableName} (${quotedColumns.join(
5716
5887
  ", "
5717
- )}) VALUES (${placeholders});`;
5888
+ )}) VALUES (${placeholders}) ${updateClause};`;
5718
5889
  this.db.run(insertSQL, values);
5719
5890
  }
5720
5891
  async delete(modelName, id) {
package/dist/client.cjs CHANGED
@@ -84,18 +84,35 @@ var init_DocumentQueryTranslator = __esm({
84
84
  }
85
85
  });
86
86
 
87
+ // src/models/metaSync.ts
88
+ function registerFunctionDefault(fn, name) {
89
+ KNOWN_FUNCTION_DEFAULTS.set(fn, name);
90
+ }
91
+ var Y, KNOWN_FUNCTION_DEFAULTS;
92
+ var init_metaSync = __esm({
93
+ "src/models/metaSync.ts"() {
94
+ "use strict";
95
+ Y = __toESM(require("yjs"), 1);
96
+ KNOWN_FUNCTION_DEFAULTS = /* @__PURE__ */ new WeakMap();
97
+ }
98
+ });
99
+
87
100
  // src/models/BaseModel.ts
88
- var Y, import_ulid, Logger;
101
+ function generateULID() {
102
+ return (0, import_ulid.ulid)();
103
+ }
104
+ var Y2, import_ulid, Logger;
89
105
  var init_BaseModel = __esm({
90
106
  "src/models/BaseModel.ts"() {
91
107
  "use strict";
92
- Y = __toESM(require("yjs"), 1);
108
+ Y2 = __toESM(require("yjs"), 1);
93
109
  import_ulid = require("ulid");
94
110
  init_StringSet();
95
111
  init_documentTypes();
96
112
  init_DocumentQueryTranslator();
97
113
  init_CursorManager();
98
114
  init_sql();
115
+ init_metaSync();
99
116
  Logger = class {
100
117
  static _logLevel = 1 /* ERROR */;
101
118
  static _logCallback = null;
@@ -164,6 +181,7 @@ var init_BaseModel = __esm({
164
181
  }
165
182
  }
166
183
  };
184
+ registerFunctionDefault(generateULID, "generate_ulid");
167
185
  }
168
186
  });
169
187
 
package/dist/client.d.cts CHANGED
@@ -110,6 +110,7 @@ type DocumentPermissionHint = "read" | "read-write";
110
110
  interface SaveOptions$1 {
111
111
  targetDocument?: string;
112
112
  forceWrite?: boolean;
113
+ upsertOn?: string;
113
114
  }
114
115
 
115
116
  interface ComparisonOperators<T = any> {
@@ -349,6 +350,8 @@ declare class BaseModel implements StringSetChangeTracker {
349
350
  private _isDirty;
350
351
  private _isLoadingFromYjs;
351
352
  private _stringSetFields;
353
+ protected _constructorProvidedId: boolean;
354
+ protected _constructorProvidedFields: Set<string>;
352
355
  private _metaDocId;
353
356
  private _metaPermissionHint;
354
357
  /**
@@ -641,11 +644,12 @@ interface QueryRequest {
641
644
  }
642
645
  interface SaveRequest {
643
646
  modelName: string;
644
- id: string;
647
+ id?: string;
645
648
  data: Record<string, any>;
646
649
  stringSets?: Record<string, string[]>;
647
650
  ifNotExists?: boolean;
648
651
  condition?: DocumentFilter;
652
+ upsertOn?: string;
649
653
  }
650
654
  interface DeleteRequest {
651
655
  modelName: string;
@@ -717,12 +721,13 @@ interface PatchResponse {
717
721
  interface BatchOperation {
718
722
  op: "save" | "patch" | "delete" | "increment" | "addToSet" | "removeFromSet";
719
723
  modelName: string;
720
- id: string;
724
+ id?: string;
721
725
  data?: Record<string, any>;
722
726
  stringSets?: Record<string, string[]>;
723
727
  fields?: Record<string, number>;
724
728
  ifNotExists?: boolean;
725
729
  condition?: DocumentFilter;
730
+ upsertOn?: string;
726
731
  }
727
732
  interface BatchRequest {
728
733
  operations: BatchOperation[];
package/dist/client.d.ts CHANGED
@@ -110,6 +110,7 @@ type DocumentPermissionHint = "read" | "read-write";
110
110
  interface SaveOptions$1 {
111
111
  targetDocument?: string;
112
112
  forceWrite?: boolean;
113
+ upsertOn?: string;
113
114
  }
114
115
 
115
116
  interface ComparisonOperators<T = any> {
@@ -349,6 +350,8 @@ declare class BaseModel implements StringSetChangeTracker {
349
350
  private _isDirty;
350
351
  private _isLoadingFromYjs;
351
352
  private _stringSetFields;
353
+ protected _constructorProvidedId: boolean;
354
+ protected _constructorProvidedFields: Set<string>;
352
355
  private _metaDocId;
353
356
  private _metaPermissionHint;
354
357
  /**
@@ -641,11 +644,12 @@ interface QueryRequest {
641
644
  }
642
645
  interface SaveRequest {
643
646
  modelName: string;
644
- id: string;
647
+ id?: string;
645
648
  data: Record<string, any>;
646
649
  stringSets?: Record<string, string[]>;
647
650
  ifNotExists?: boolean;
648
651
  condition?: DocumentFilter;
652
+ upsertOn?: string;
649
653
  }
650
654
  interface DeleteRequest {
651
655
  modelName: string;
@@ -717,12 +721,13 @@ interface PatchResponse {
717
721
  interface BatchOperation {
718
722
  op: "save" | "patch" | "delete" | "increment" | "addToSet" | "removeFromSet";
719
723
  modelName: string;
720
- id: string;
724
+ id?: string;
721
725
  data?: Record<string, any>;
722
726
  stringSets?: Record<string, string[]>;
723
727
  fields?: Record<string, number>;
724
728
  ifNotExists?: boolean;
725
729
  condition?: DocumentFilter;
730
+ upsertOn?: string;
726
731
  }
727
732
  interface BatchRequest {
728
733
  operations: BatchOperation[];
package/dist/client.js CHANGED
@@ -57,9 +57,25 @@ var init_DocumentQueryTranslator = __esm({
57
57
  }
58
58
  });
59
59
 
60
- // src/models/BaseModel.ts
60
+ // src/models/metaSync.ts
61
61
  import * as Y from "yjs";
62
+ function registerFunctionDefault(fn, name) {
63
+ KNOWN_FUNCTION_DEFAULTS.set(fn, name);
64
+ }
65
+ var KNOWN_FUNCTION_DEFAULTS;
66
+ var init_metaSync = __esm({
67
+ "src/models/metaSync.ts"() {
68
+ "use strict";
69
+ KNOWN_FUNCTION_DEFAULTS = /* @__PURE__ */ new WeakMap();
70
+ }
71
+ });
72
+
73
+ // src/models/BaseModel.ts
74
+ import * as Y2 from "yjs";
62
75
  import { ulid } from "ulid";
76
+ function generateULID() {
77
+ return ulid();
78
+ }
63
79
  var Logger;
64
80
  var init_BaseModel = __esm({
65
81
  "src/models/BaseModel.ts"() {
@@ -69,6 +85,7 @@ var init_BaseModel = __esm({
69
85
  init_DocumentQueryTranslator();
70
86
  init_CursorManager();
71
87
  init_sql();
88
+ init_metaSync();
72
89
  Logger = class {
73
90
  static _logLevel = 1 /* ERROR */;
74
91
  static _logCallback = null;
@@ -137,6 +154,7 @@ var init_BaseModel = __esm({
137
154
  }
138
155
  }
139
156
  };
157
+ registerFunctionDefault(generateULID, "generate_ulid");
140
158
  }
141
159
  });
142
160