js-bao 0.3.0-alpha.1 → 0.3.0-alpha.2

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.
@@ -1979,6 +1979,7 @@ function createDatabaseDO(config = {}) {
1979
1979
  if (request.method === "DELETE" && path === "/destroy") {
1980
1980
  await this._doState.storage.deleteAll();
1981
1981
  this._initialized = false;
1982
+ this._engine.initialized = false;
1982
1983
  return Response.json({
1983
1984
  deleted: true,
1984
1985
  deletedAt: (/* @__PURE__ */ new Date()).toISOString()
@@ -2097,6 +2098,18 @@ function createDatabaseDO(config = {}) {
2097
2098
  };
2098
2099
  return Response.json(response);
2099
2100
  }
2101
+ /** @internal — Check for reserved field names in record data */
2102
+ _checkReservedFields(data) {
2103
+ for (const key of Object.keys(data)) {
2104
+ if (key === "type") {
2105
+ return `Field 'type' is reserved and cannot be used in record data`;
2106
+ }
2107
+ if (key.startsWith("_meta")) {
2108
+ return `Field '${key}' is reserved (fields starting with '_meta' are internal) and cannot be used in record data`;
2109
+ }
2110
+ }
2111
+ return null;
2112
+ }
2100
2113
  /** @internal */
2101
2114
  async _handleSave(request, docId) {
2102
2115
  const body = await request.json();
@@ -2104,6 +2117,15 @@ function createDatabaseDO(config = {}) {
2104
2117
  if (!modelName || !id) {
2105
2118
  return this._errorResponse("modelName and id are required", 400);
2106
2119
  }
2120
+ if (!data) {
2121
+ return this._errorResponse("data is required", 400);
2122
+ }
2123
+ if (data) {
2124
+ const reservedError = this._checkReservedFields(data);
2125
+ if (reservedError) {
2126
+ return this._errorResponse(reservedError, 400);
2127
+ }
2128
+ }
2107
2129
  if (condition && !this._checkCondition(modelName, id, condition)) {
2108
2130
  return this._errorResponse(
2109
2131
  `Condition not met for ${modelName}/${id}`,
@@ -2161,6 +2183,10 @@ function createDatabaseDO(config = {}) {
2161
2183
  if (!modelName || !id || !data) {
2162
2184
  return this._errorResponse("modelName, id, and data are required", 400);
2163
2185
  }
2186
+ const reservedError = this._checkReservedFields(data);
2187
+ if (reservedError) {
2188
+ return this._errorResponse(reservedError, 400);
2189
+ }
2164
2190
  if (!this._engine.recordExists(modelName, id)) {
2165
2191
  return this._errorResponse(`Record ${modelName}/${id} not found`, 404);
2166
2192
  }
@@ -2269,6 +2295,13 @@ function createDatabaseDO(config = {}) {
2269
2295
  400
2270
2296
  );
2271
2297
  }
2298
+ const reservedError = this._checkReservedFields(op.data);
2299
+ if (reservedError) {
2300
+ return this._errorResponse(
2301
+ `Operation ${i}: ${reservedError}`,
2302
+ 400
2303
+ );
2304
+ }
2272
2305
  if (hooks?.beforeSave) {
2273
2306
  const isNew = op.op === "save" ? !this._engine.recordExists(op.modelName, op.id) : false;
2274
2307
  const ctx = {
@@ -194,7 +194,7 @@ interface JsonSchemaEngineOptions extends JsonSchemaOptions {
194
194
  }
195
195
  declare abstract class JsonSchemaEngine extends DatabaseEngine {
196
196
  protected schemaOptions: JsonSchemaEngineOptions;
197
- protected initialized: boolean;
197
+ initialized: boolean;
198
198
  constructor(options: JsonSchemaEngineOptions);
199
199
  /**
200
200
  * Execute SQL and return results.
@@ -1166,6 +1166,8 @@ declare function createDatabaseDO(config?: DatabaseDOConfig): {
1166
1166
  fetch(request: Request): Promise<Response>;
1167
1167
  /** @internal */
1168
1168
  _handleQuery(request: Request, docId: string): Promise<Response>;
1169
+ /** @internal — Check for reserved field names in record data */
1170
+ _checkReservedFields(data: Record<string, any>): string | null;
1169
1171
  /** @internal */
1170
1172
  _handleSave(request: Request, docId: string): Promise<Response>;
1171
1173
  /** @internal — Partial update: merge provided fields into existing record */
@@ -194,7 +194,7 @@ interface JsonSchemaEngineOptions extends JsonSchemaOptions {
194
194
  }
195
195
  declare abstract class JsonSchemaEngine extends DatabaseEngine {
196
196
  protected schemaOptions: JsonSchemaEngineOptions;
197
- protected initialized: boolean;
197
+ initialized: boolean;
198
198
  constructor(options: JsonSchemaEngineOptions);
199
199
  /**
200
200
  * Execute SQL and return results.
@@ -1166,6 +1166,8 @@ declare function createDatabaseDO(config?: DatabaseDOConfig): {
1166
1166
  fetch(request: Request): Promise<Response>;
1167
1167
  /** @internal */
1168
1168
  _handleQuery(request: Request, docId: string): Promise<Response>;
1169
+ /** @internal — Check for reserved field names in record data */
1170
+ _checkReservedFields(data: Record<string, any>): string | null;
1169
1171
  /** @internal */
1170
1172
  _handleSave(request: Request, docId: string): Promise<Response>;
1171
1173
  /** @internal — Partial update: merge provided fields into existing record */
@@ -1948,6 +1948,7 @@ function createDatabaseDO(config = {}) {
1948
1948
  if (request.method === "DELETE" && path === "/destroy") {
1949
1949
  await this._doState.storage.deleteAll();
1950
1950
  this._initialized = false;
1951
+ this._engine.initialized = false;
1951
1952
  return Response.json({
1952
1953
  deleted: true,
1953
1954
  deletedAt: (/* @__PURE__ */ new Date()).toISOString()
@@ -2066,6 +2067,18 @@ function createDatabaseDO(config = {}) {
2066
2067
  };
2067
2068
  return Response.json(response);
2068
2069
  }
2070
+ /** @internal — Check for reserved field names in record data */
2071
+ _checkReservedFields(data) {
2072
+ for (const key of Object.keys(data)) {
2073
+ if (key === "type") {
2074
+ return `Field 'type' is reserved and cannot be used in record data`;
2075
+ }
2076
+ if (key.startsWith("_meta")) {
2077
+ return `Field '${key}' is reserved (fields starting with '_meta' are internal) and cannot be used in record data`;
2078
+ }
2079
+ }
2080
+ return null;
2081
+ }
2069
2082
  /** @internal */
2070
2083
  async _handleSave(request, docId) {
2071
2084
  const body = await request.json();
@@ -2073,6 +2086,15 @@ function createDatabaseDO(config = {}) {
2073
2086
  if (!modelName || !id) {
2074
2087
  return this._errorResponse("modelName and id are required", 400);
2075
2088
  }
2089
+ if (!data) {
2090
+ return this._errorResponse("data is required", 400);
2091
+ }
2092
+ if (data) {
2093
+ const reservedError = this._checkReservedFields(data);
2094
+ if (reservedError) {
2095
+ return this._errorResponse(reservedError, 400);
2096
+ }
2097
+ }
2076
2098
  if (condition && !this._checkCondition(modelName, id, condition)) {
2077
2099
  return this._errorResponse(
2078
2100
  `Condition not met for ${modelName}/${id}`,
@@ -2130,6 +2152,10 @@ function createDatabaseDO(config = {}) {
2130
2152
  if (!modelName || !id || !data) {
2131
2153
  return this._errorResponse("modelName, id, and data are required", 400);
2132
2154
  }
2155
+ const reservedError = this._checkReservedFields(data);
2156
+ if (reservedError) {
2157
+ return this._errorResponse(reservedError, 400);
2158
+ }
2133
2159
  if (!this._engine.recordExists(modelName, id)) {
2134
2160
  return this._errorResponse(`Record ${modelName}/${id} not found`, 404);
2135
2161
  }
@@ -2238,6 +2264,13 @@ function createDatabaseDO(config = {}) {
2238
2264
  400
2239
2265
  );
2240
2266
  }
2267
+ const reservedError = this._checkReservedFields(op.data);
2268
+ if (reservedError) {
2269
+ return this._errorResponse(
2270
+ `Operation ${i}: ${reservedError}`,
2271
+ 400
2272
+ );
2273
+ }
2241
2274
  if (hooks?.beforeSave) {
2242
2275
  const isNew = op.op === "save" ? !this._engine.recordExists(op.modelName, op.id) : false;
2243
2276
  const ctx = {
package/dist/codegen.cjs CHANGED
@@ -1189,7 +1189,7 @@ var SchemaExtractor = class {
1189
1189
  // package.json
1190
1190
  var package_default = {
1191
1191
  name: "js-bao",
1192
- version: "0.3.0-alpha.1",
1192
+ version: "0.3.0-alpha.2",
1193
1193
  description: "A library providing data modeling capabilities which support live updates and queries.",
1194
1194
  types: "dist/index.d.ts",
1195
1195
  type: "module",
@@ -1273,7 +1273,7 @@ var package_default = {
1273
1273
  ulid: "^3.0.0"
1274
1274
  },
1275
1275
  devDependencies: {
1276
- "@types/better-sqlite3": "^7.6.9",
1276
+ "@types/better-sqlite3": "^7.6.13",
1277
1277
  "@types/node": "^20.17.51",
1278
1278
  "@types/sql.js": "^1.4.9",
1279
1279
  commander: "^11.0.0",
@@ -1287,7 +1287,7 @@ var package_default = {
1287
1287
  yjs: "^13.6.18"
1288
1288
  },
1289
1289
  optionalDependencies: {
1290
- "better-sqlite3": "^9.6.0"
1290
+ "better-sqlite3": "^12.6.2"
1291
1291
  },
1292
1292
  keywords: [
1293
1293
  "yjs",
package/dist/index.cjs CHANGED
@@ -6250,12 +6250,16 @@ async function resetJsBao() {
6250
6250
  ormInitializationPromise = null;
6251
6251
  const { BaseModel: BaseModel3 } = await Promise.resolve().then(() => (init_BaseModel(), BaseModel_exports));
6252
6252
  BaseModel3.dbInstance = null;
6253
- Logger.debug("[resetJsBao] BaseModel database instance cleared.");
6253
+ BaseModel3.connectedDocuments = /* @__PURE__ */ new Map();
6254
+ BaseModel3.documentYMaps = /* @__PURE__ */ new Map();
6255
+ BaseModel3.clearModelDefaultDocumentIds();
6256
+ BaseModel3.clearGlobalDefaultDocumentId();
6257
+ Logger.debug("[resetJsBao] BaseModel database instance and document state cleared.");
6254
6258
  const modelRegistryInstance = ModelRegistry.getInstance();
6255
6259
  modelRegistryInstance.clearSessionState();
6256
6260
  Logger.debug("[resetJsBao] ModelRegistry session state cleared.");
6257
6261
  Logger.info(
6258
- "[resetJsBao] js-bao initialization promise has been reset. DB engine (if any) destroyed. ModelRegistry session cleared."
6262
+ "[resetJsBao] js-bao state fully reset. DB engine destroyed. Document mappings cleared. ModelRegistry session cleared."
6259
6263
  );
6260
6264
  }
6261
6265
 
package/dist/index.js CHANGED
@@ -6200,12 +6200,16 @@ async function resetJsBao() {
6200
6200
  ormInitializationPromise = null;
6201
6201
  const { BaseModel: BaseModel3 } = await Promise.resolve().then(() => (init_BaseModel(), BaseModel_exports));
6202
6202
  BaseModel3.dbInstance = null;
6203
- Logger.debug("[resetJsBao] BaseModel database instance cleared.");
6203
+ BaseModel3.connectedDocuments = /* @__PURE__ */ new Map();
6204
+ BaseModel3.documentYMaps = /* @__PURE__ */ new Map();
6205
+ BaseModel3.clearModelDefaultDocumentIds();
6206
+ BaseModel3.clearGlobalDefaultDocumentId();
6207
+ Logger.debug("[resetJsBao] BaseModel database instance and document state cleared.");
6204
6208
  const modelRegistryInstance = ModelRegistry.getInstance();
6205
6209
  modelRegistryInstance.clearSessionState();
6206
6210
  Logger.debug("[resetJsBao] ModelRegistry session state cleared.");
6207
6211
  Logger.info(
6208
- "[resetJsBao] js-bao initialization promise has been reset. DB engine (if any) destroyed. ModelRegistry session cleared."
6212
+ "[resetJsBao] js-bao state fully reset. DB engine destroyed. Document mappings cleared. ModelRegistry session cleared."
6209
6213
  );
6210
6214
  }
6211
6215
 
package/dist/node.cjs CHANGED
@@ -6435,12 +6435,16 @@ async function resetJsBao() {
6435
6435
  ormInitializationPromise = null;
6436
6436
  const { BaseModel: BaseModel3 } = await Promise.resolve().then(() => (init_BaseModel(), BaseModel_exports));
6437
6437
  BaseModel3.dbInstance = null;
6438
- Logger.debug("[resetJsBao] BaseModel database instance cleared.");
6438
+ BaseModel3.connectedDocuments = /* @__PURE__ */ new Map();
6439
+ BaseModel3.documentYMaps = /* @__PURE__ */ new Map();
6440
+ BaseModel3.clearModelDefaultDocumentIds();
6441
+ BaseModel3.clearGlobalDefaultDocumentId();
6442
+ Logger.debug("[resetJsBao] BaseModel database instance and document state cleared.");
6439
6443
  const modelRegistryInstance = ModelRegistry.getInstance();
6440
6444
  modelRegistryInstance.clearSessionState();
6441
6445
  Logger.debug("[resetJsBao] ModelRegistry session state cleared.");
6442
6446
  Logger.info(
6443
- "[resetJsBao] js-bao initialization promise has been reset. DB engine (if any) destroyed. ModelRegistry session cleared."
6447
+ "[resetJsBao] js-bao state fully reset. DB engine destroyed. Document mappings cleared. ModelRegistry session cleared."
6444
6448
  );
6445
6449
  }
6446
6450
 
package/dist/node.js CHANGED
@@ -6382,12 +6382,16 @@ async function resetJsBao() {
6382
6382
  ormInitializationPromise = null;
6383
6383
  const { BaseModel: BaseModel3 } = await Promise.resolve().then(() => (init_BaseModel(), BaseModel_exports));
6384
6384
  BaseModel3.dbInstance = null;
6385
- Logger.debug("[resetJsBao] BaseModel database instance cleared.");
6385
+ BaseModel3.connectedDocuments = /* @__PURE__ */ new Map();
6386
+ BaseModel3.documentYMaps = /* @__PURE__ */ new Map();
6387
+ BaseModel3.clearModelDefaultDocumentIds();
6388
+ BaseModel3.clearGlobalDefaultDocumentId();
6389
+ Logger.debug("[resetJsBao] BaseModel database instance and document state cleared.");
6386
6390
  const modelRegistryInstance = ModelRegistry.getInstance();
6387
6391
  modelRegistryInstance.clearSessionState();
6388
6392
  Logger.debug("[resetJsBao] ModelRegistry session state cleared.");
6389
6393
  Logger.info(
6390
- "[resetJsBao] js-bao initialization promise has been reset. DB engine (if any) destroyed. ModelRegistry session cleared."
6394
+ "[resetJsBao] js-bao state fully reset. DB engine destroyed. Document mappings cleared. ModelRegistry session cleared."
6391
6395
  );
6392
6396
  }
6393
6397
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js-bao",
3
- "version": "0.3.0-alpha.1",
3
+ "version": "0.3.0-alpha.2",
4
4
  "description": "A library providing data modeling capabilities which support live updates and queries.",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -84,7 +84,7 @@
84
84
  "ulid": "^3.0.0"
85
85
  },
86
86
  "devDependencies": {
87
- "@types/better-sqlite3": "^7.6.9",
87
+ "@types/better-sqlite3": "^7.6.13",
88
88
  "@types/node": "^20.17.51",
89
89
  "@types/sql.js": "^1.4.9",
90
90
  "commander": "^11.0.0",
@@ -98,7 +98,7 @@
98
98
  "yjs": "^13.6.18"
99
99
  },
100
100
  "optionalDependencies": {
101
- "better-sqlite3": "^9.6.0"
101
+ "better-sqlite3": "^12.6.2"
102
102
  },
103
103
  "keywords": [
104
104
  "yjs",