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.
- package/dist/cloudflare-do.cjs +33 -0
- package/dist/cloudflare-do.d.cts +3 -1
- package/dist/cloudflare-do.d.ts +3 -1
- package/dist/cloudflare-do.js +33 -0
- package/dist/codegen.cjs +3 -3
- package/dist/index.cjs +6 -2
- package/dist/index.js +6 -2
- package/dist/node.cjs +6 -2
- package/dist/node.js +6 -2
- package/package.json +3 -3
package/dist/cloudflare-do.cjs
CHANGED
|
@@ -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 = {
|
package/dist/cloudflare-do.d.cts
CHANGED
|
@@ -194,7 +194,7 @@ interface JsonSchemaEngineOptions extends JsonSchemaOptions {
|
|
|
194
194
|
}
|
|
195
195
|
declare abstract class JsonSchemaEngine extends DatabaseEngine {
|
|
196
196
|
protected schemaOptions: JsonSchemaEngineOptions;
|
|
197
|
-
|
|
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 */
|
package/dist/cloudflare-do.d.ts
CHANGED
|
@@ -194,7 +194,7 @@ interface JsonSchemaEngineOptions extends JsonSchemaOptions {
|
|
|
194
194
|
}
|
|
195
195
|
declare abstract class JsonSchemaEngine extends DatabaseEngine {
|
|
196
196
|
protected schemaOptions: JsonSchemaEngineOptions;
|
|
197
|
-
|
|
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 */
|
package/dist/cloudflare-do.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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": "^
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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.
|
|
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.
|
|
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": "^
|
|
101
|
+
"better-sqlite3": "^12.6.2"
|
|
102
102
|
},
|
|
103
103
|
"keywords": [
|
|
104
104
|
"yjs",
|