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.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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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/
|
|
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
|
|