@liminalfunctions/framework 1.0.74 → 1.0.75

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.
@@ -1,5 +1,5 @@
1
1
  import * as z from "zod/v4";
2
- import mongoose, { Model } from "mongoose";
2
+ import mongoose, { ClientSession, Model } from "mongoose";
3
3
  import { F_Security_Model } from "./F_Security_Models/F_Security_Model.js";
4
4
  export type CollectionType<Col extends F_Collection<string, Validator>, Validator extends z.ZodObject> = z.output<Col['validator']>;
5
5
  export type F_Layer<Collection_ID extends string, ZodSchema extends z.ZodObject> = {
@@ -40,8 +40,8 @@ export declare class F_Collection<Collection_ID extends string, ZodSchema extend
40
40
  after_create(hook: (created_document: z.output<ZodSchema>) => Promise<void>): void;
41
41
  after_update(hook: (updated_document: z.output<ZodSchema>) => Promise<void>): void;
42
42
  after_delete(hook: (deleted_document: z.output<ZodSchema>) => Promise<void>): void;
43
- perform_create_and_side_effects(data: z.output<this['post_validator']>): Promise<z.output<ZodSchema>>;
44
- perform_update_and_side_effects(find: any, data: z.output<this['put_validator']>): Promise<z.output<ZodSchema>>;
45
- perform_delete_and_side_effects(find: any): Promise<z.output<ZodSchema>>;
43
+ perform_create_and_side_effects(data: z.output<this['post_validator']>, session?: ClientSession): Promise<z.output<ZodSchema>>;
44
+ perform_update_and_side_effects(find: any, data: z.output<this['put_validator']>, session?: ClientSession): Promise<z.output<ZodSchema>>;
45
+ perform_delete_and_side_effects(find: any, session?: ClientSession): Promise<z.output<ZodSchema>>;
46
46
  }
47
47
  export {};
@@ -85,16 +85,16 @@ export class F_Collection {
85
85
  after_delete(hook) {
86
86
  this.post_delete_hooks.push(hook);
87
87
  }
88
- async perform_create_and_side_effects(data) {
88
+ async perform_create_and_side_effects(data, session) {
89
89
  let created_document_data;
90
- if (this.create_hooks.length > 0) {
91
- await mongoose.connection.transaction(async (session) => {
90
+ if (this.create_hooks.length > 0 || session) {
91
+ await create_or_use_session(async (session) => {
92
92
  let [created_document] = await this.mongoose_model.create([data], { session: session, lean: true });
93
93
  created_document_data = created_document;
94
94
  for (let hook of this.create_hooks) {
95
95
  await hook(session, created_document);
96
96
  }
97
- });
97
+ }, session);
98
98
  }
99
99
  else {
100
100
  created_document_data = await this.mongoose_model.create(data);
@@ -110,16 +110,16 @@ export class F_Collection {
110
110
  }
111
111
  return created_document_data;
112
112
  }
113
- async perform_update_and_side_effects(find, data) {
113
+ async perform_update_and_side_effects(find, data, session) {
114
114
  let update_document_data;
115
- if (this.update_hooks.length > 0) {
116
- await mongoose.connection.transaction(async (session) => {
115
+ if (this.update_hooks.length > 0 || session) {
116
+ await create_or_use_session(async (session) => {
117
117
  let updated_document = await this.mongoose_model.findOneAndUpdate(find, data, { returnDocument: 'after', session: session, lean: true });
118
118
  update_document_data = updated_document;
119
119
  for (let hook of this.update_hooks) {
120
120
  await hook(session, updated_document);
121
121
  }
122
- });
122
+ }, session);
123
123
  }
124
124
  else {
125
125
  update_document_data = await this.mongoose_model.findOneAndUpdate(find, data, { returnDocument: 'after', lean: true });
@@ -135,30 +135,42 @@ export class F_Collection {
135
135
  }
136
136
  return update_document_data;
137
137
  }
138
- async perform_delete_and_side_effects(find) {
138
+ async perform_delete_and_side_effects(find, session) {
139
139
  let deleted_document_data;
140
- if (this.delete_hooks.length > 0) {
141
- await mongoose.connection.transaction(async (session) => {
140
+ if (this.delete_hooks.length > 0 || session) {
141
+ await create_or_use_session(async (session) => {
142
142
  let deleted_document = await this.mongoose_model.findOneAndDelete(find, { returnDocument: 'after', session: session, lean: true });
143
143
  deleted_document_data = deleted_document;
144
- for (let hook of this.delete_hooks) {
145
- await hook(session, deleted_document);
144
+ if (deleted_document_data) {
145
+ for (let hook of this.delete_hooks) {
146
+ await hook(session, deleted_document);
147
+ }
146
148
  }
147
- });
149
+ }, session);
148
150
  }
149
151
  else {
150
152
  deleted_document_data = await this.mongoose_model.findOneAndDelete(find, { returnDocument: 'after', lean: true });
151
153
  }
152
- for (let hook of this.post_delete_hooks) {
153
- try {
154
- await hook(deleted_document_data);
155
- }
156
- catch (err) {
157
- console.error(`Error in ${this.collection_id} after_delete:`);
158
- console.error(err);
154
+ if (deleted_document_data) {
155
+ for (let hook of this.post_delete_hooks) {
156
+ try {
157
+ await hook(deleted_document_data);
158
+ }
159
+ catch (err) {
160
+ console.error(`Error in ${this.collection_id} after_delete:`);
161
+ console.error(err);
162
+ }
159
163
  }
160
164
  }
161
165
  return deleted_document_data;
162
166
  }
163
167
  }
168
+ async function create_or_use_session(callback, session) {
169
+ if (session) {
170
+ return await callback(session);
171
+ }
172
+ else {
173
+ return await mongoose.connection.transaction(callback);
174
+ }
175
+ }
164
176
  //# sourceMappingURL=F_Collection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"F_Collection.js","sourceRoot":"","sources":["../src/F_Collection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"F_Collection.js","sourceRoot":"","sources":["../src/F_Collection.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liminalfunctions/framework",
3
- "version": "1.0.74",
3
+ "version": "1.0.75",
4
4
  "engines": {
5
5
  "node": "22.x.x"
6
6
  },
@@ -1,6 +1,6 @@
1
1
  import * as z from "zod/v4";
2
2
  import { mongoose_from_zod, schema_from_zod } from "./utils/mongoose_from_zod.js";
3
- import mongoose, { Collection, Model, ObjectId } from "mongoose";
3
+ import mongoose, { ClientSession, Collection, Model, ObjectId } from "mongoose";
4
4
  import { F_Security_Model } from "./F_Security_Models/F_Security_Model.js";
5
5
  import { query_validator_from_zod } from "./utils/query_validator_from_zod.js";
6
6
  import { array_children_from_zod } from "./utils/array_children_from_zod.js";
@@ -160,12 +160,12 @@ export class F_Collection<Collection_ID extends string, ZodSchema extends z.ZodO
160
160
  * If there are no side-effects specified by the on_create method, runs a normal non-transaction create to avoid
161
161
  * the performance impacts of a transaction.
162
162
  */
163
- async perform_create_and_side_effects(data: z.output<this['post_validator']>): Promise<z.output<ZodSchema>> {
163
+ async perform_create_and_side_effects(data: z.output<this['post_validator']>, session?: ClientSession): Promise<z.output<ZodSchema>> {
164
164
  let created_document_data;
165
165
 
166
166
  // if we have any create hooks, run the create operation in a transaction
167
- if(this.create_hooks.length > 0){
168
- await mongoose.connection.transaction(async (session) => {
167
+ if(this.create_hooks.length > 0 || session){
168
+ await create_or_use_session(async (session) => {
169
169
  // create the document
170
170
  //@ts-expect-error
171
171
  let [created_document] = await this.mongoose_model.create([data], {session: session, lean: true});
@@ -176,7 +176,7 @@ export class F_Collection<Collection_ID extends string, ZodSchema extends z.ZodO
176
176
  for(let hook of this.create_hooks){
177
177
  await hook(session, created_document);
178
178
  }
179
- });
179
+ }, session);
180
180
  } else {// if we don't have any post create hooks, run the create operation normally
181
181
  //@ts-expect-error
182
182
  created_document_data = await this.mongoose_model.create(data);
@@ -204,12 +204,12 @@ export class F_Collection<Collection_ID extends string, ZodSchema extends z.ZodO
204
204
  * If there are no side-effects specified by the on_update method, runs a normal non-transaction update to avoid
205
205
  * the performance impacts of a transaction.
206
206
  */
207
- async perform_update_and_side_effects(find: any, data: z.output<this['put_validator']>): Promise<z.output<ZodSchema>> {
207
+ async perform_update_and_side_effects(find: any, data: z.output<this['put_validator']>, session?: ClientSession): Promise<z.output<ZodSchema>> {
208
208
  let update_document_data;
209
209
 
210
210
  // if we have any update hooks, run the update operation in a transaction
211
- if(this.update_hooks.length > 0){
212
- await mongoose.connection.transaction(async (session) => {
211
+ if(this.update_hooks.length > 0 || session){
212
+ await create_or_use_session(async (session) => {
213
213
  // update the document
214
214
  let updated_document = await this.mongoose_model.findOneAndUpdate(find, data, {returnDocument: 'after', session: session, lean: true})
215
215
  update_document_data = updated_document;
@@ -220,7 +220,7 @@ export class F_Collection<Collection_ID extends string, ZodSchema extends z.ZodO
220
220
  //@ts-expect-error
221
221
  await hook(session, updated_document);
222
222
  }
223
- });
223
+ }, session);
224
224
  } else {// if we don't have any post update hooks, run the update operation normally
225
225
  update_document_data = await this.mongoose_model.findOneAndUpdate(find, data, {returnDocument: 'after', lean: true})
226
226
  }
@@ -248,36 +248,49 @@ export class F_Collection<Collection_ID extends string, ZodSchema extends z.ZodO
248
248
  * If there are no side-effects specified by the on_delete method, runs a normal non-transaction delete to avoid
249
249
  * the performance impacts of a transaction.
250
250
  */
251
- async perform_delete_and_side_effects(find: any): Promise<z.output<ZodSchema>> {
251
+ async perform_delete_and_side_effects(find: any, session?: ClientSession): Promise<z.output<ZodSchema>> {
252
252
  let deleted_document_data;
253
253
 
254
- // if we have any update hooks, run the update operation in a transaction
255
- if(this.delete_hooks.length > 0){
256
- await mongoose.connection.transaction(async (session) => {
257
- // update the document
254
+ // if we have any delete hooks, run the delete operation in a transaction
255
+ if(this.delete_hooks.length > 0 || session){
256
+ await create_or_use_session(async (session) => {
257
+ // delete the document
258
258
  let deleted_document = await this.mongoose_model.findOneAndDelete(find, {returnDocument: 'after', session: session, lean: true})
259
259
  deleted_document_data = deleted_document;
260
260
 
261
- // run each hook one-by-one because running them in parallell is verboten
262
- // https://mongoosejs.com/docs/transactions.html
263
- for(let hook of this.delete_hooks){
264
- await hook(session, deleted_document);
261
+ if(deleted_document_data) {
262
+ // run each hook one-by-one because running them in parallell is verboten
263
+ // https://mongoosejs.com/docs/transactions.html
264
+ for(let hook of this.delete_hooks){
265
+ await hook(session, deleted_document);
266
+ }
265
267
  }
266
- });
267
- } else {// if we don't have any post update hooks, run the update operation normally
268
+
269
+ }, session);
270
+ } else {// if we don't have any post delete hooks, run the delete operation normally
268
271
  deleted_document_data = await this.mongoose_model.findOneAndDelete(find, {returnDocument: 'after', lean: true})
269
272
  }
270
273
 
271
- // run the post-update hooks, which should not make DB changes.
272
- for(let hook of this.post_delete_hooks) {
273
- try {
274
- await hook(deleted_document_data);
275
- } catch(err) {
276
- console.error(`Error in ${this.collection_id} after_delete:`)
277
- console.error(err);
274
+ // run the post-delete hooks, which should not make DB changes.
275
+ if(deleted_document_data) {
276
+ for(let hook of this.post_delete_hooks) {
277
+ try {
278
+ await hook(deleted_document_data);
279
+ } catch(err) {
280
+ console.error(`Error in ${this.collection_id} after_delete:`)
281
+ console.error(err);
282
+ }
278
283
  }
279
284
  }
280
285
 
281
286
  return deleted_document_data;
282
287
  }
288
+ }
289
+
290
+ async function create_or_use_session(callback: (session: ClientSession) => Promise<void>, session?: ClientSession, ) {
291
+ if(session) {
292
+ return await callback(session);
293
+ } else {
294
+ return await mongoose.connection.transaction(callback);
295
+ }
283
296
  }