@batchactions/state-sequelize 0.0.1

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/index.cjs ADDED
@@ -0,0 +1,651 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ SequelizeStateStore: () => SequelizeStateStore
34
+ });
35
+ module.exports = __toCommonJS(index_exports);
36
+
37
+ // src/models/JobModel.ts
38
+ var import_sequelize = require("sequelize");
39
+ function defineJobModel(sequelize) {
40
+ return sequelize.define(
41
+ "BatchActionsJob",
42
+ {
43
+ id: {
44
+ type: import_sequelize.DataTypes.STRING(36),
45
+ primaryKey: true,
46
+ allowNull: false
47
+ },
48
+ status: {
49
+ type: import_sequelize.DataTypes.STRING(20),
50
+ allowNull: false
51
+ },
52
+ config: {
53
+ type: import_sequelize.DataTypes.JSON,
54
+ allowNull: false
55
+ },
56
+ batches: {
57
+ type: import_sequelize.DataTypes.JSON,
58
+ allowNull: false,
59
+ defaultValue: []
60
+ },
61
+ totalRecords: {
62
+ type: import_sequelize.DataTypes.INTEGER,
63
+ allowNull: false,
64
+ defaultValue: 0
65
+ },
66
+ startedAt: {
67
+ type: import_sequelize.DataTypes.BIGINT,
68
+ allowNull: true
69
+ },
70
+ completedAt: {
71
+ type: import_sequelize.DataTypes.BIGINT,
72
+ allowNull: true
73
+ },
74
+ distributed: {
75
+ type: import_sequelize.DataTypes.BOOLEAN,
76
+ allowNull: false,
77
+ defaultValue: false
78
+ }
79
+ },
80
+ {
81
+ tableName: "bulkimport_jobs",
82
+ timestamps: false
83
+ }
84
+ );
85
+ }
86
+
87
+ // src/models/RecordModel.ts
88
+ var import_sequelize2 = require("sequelize");
89
+ function defineRecordModel(sequelize) {
90
+ return sequelize.define(
91
+ "BatchActionsRecord",
92
+ {
93
+ id: {
94
+ type: import_sequelize2.DataTypes.INTEGER,
95
+ primaryKey: true,
96
+ autoIncrement: true
97
+ },
98
+ jobId: {
99
+ type: import_sequelize2.DataTypes.STRING(36),
100
+ allowNull: false
101
+ },
102
+ batchId: {
103
+ type: import_sequelize2.DataTypes.STRING(36),
104
+ allowNull: false
105
+ },
106
+ recordIndex: {
107
+ type: import_sequelize2.DataTypes.INTEGER,
108
+ allowNull: false
109
+ },
110
+ status: {
111
+ type: import_sequelize2.DataTypes.STRING(10),
112
+ allowNull: false
113
+ },
114
+ raw: {
115
+ type: import_sequelize2.DataTypes.JSON,
116
+ allowNull: false
117
+ },
118
+ parsed: {
119
+ type: import_sequelize2.DataTypes.JSON,
120
+ allowNull: false
121
+ },
122
+ errors: {
123
+ type: import_sequelize2.DataTypes.JSON,
124
+ allowNull: false,
125
+ defaultValue: []
126
+ },
127
+ processingError: {
128
+ type: import_sequelize2.DataTypes.TEXT,
129
+ allowNull: true
130
+ }
131
+ },
132
+ {
133
+ tableName: "bulkimport_records",
134
+ timestamps: false,
135
+ indexes: [
136
+ { fields: ["jobId", "status"] },
137
+ { fields: ["jobId", "batchId"] },
138
+ { unique: true, fields: ["jobId", "recordIndex"] }
139
+ ]
140
+ }
141
+ );
142
+ }
143
+
144
+ // src/models/BatchModel.ts
145
+ var import_sequelize3 = require("sequelize");
146
+ function defineBatchModel(sequelize) {
147
+ return sequelize.define(
148
+ "BatchActionsBatch",
149
+ {
150
+ id: {
151
+ type: import_sequelize3.DataTypes.STRING(36),
152
+ primaryKey: true,
153
+ allowNull: false
154
+ },
155
+ jobId: {
156
+ type: import_sequelize3.DataTypes.STRING(36),
157
+ allowNull: false
158
+ },
159
+ batchIndex: {
160
+ type: import_sequelize3.DataTypes.INTEGER,
161
+ allowNull: false
162
+ },
163
+ status: {
164
+ type: import_sequelize3.DataTypes.STRING(20),
165
+ allowNull: false,
166
+ defaultValue: "PENDING"
167
+ },
168
+ workerId: {
169
+ type: import_sequelize3.DataTypes.STRING(128),
170
+ allowNull: true
171
+ },
172
+ claimedAt: {
173
+ type: import_sequelize3.DataTypes.BIGINT,
174
+ allowNull: true
175
+ },
176
+ recordStartIndex: {
177
+ type: import_sequelize3.DataTypes.INTEGER,
178
+ allowNull: false,
179
+ defaultValue: 0
180
+ },
181
+ recordEndIndex: {
182
+ type: import_sequelize3.DataTypes.INTEGER,
183
+ allowNull: false,
184
+ defaultValue: 0
185
+ },
186
+ processedCount: {
187
+ type: import_sequelize3.DataTypes.INTEGER,
188
+ allowNull: false,
189
+ defaultValue: 0
190
+ },
191
+ failedCount: {
192
+ type: import_sequelize3.DataTypes.INTEGER,
193
+ allowNull: false,
194
+ defaultValue: 0
195
+ },
196
+ version: {
197
+ type: import_sequelize3.DataTypes.INTEGER,
198
+ allowNull: false,
199
+ defaultValue: 0
200
+ }
201
+ },
202
+ {
203
+ tableName: "bulkimport_batches",
204
+ timestamps: false,
205
+ indexes: [{ fields: ["jobId", "status"] }, { unique: true, fields: ["jobId", "batchIndex"] }]
206
+ }
207
+ );
208
+ }
209
+
210
+ // src/utils/parseJson.ts
211
+ function parseJson(value) {
212
+ if (typeof value === "string") {
213
+ return JSON.parse(value);
214
+ }
215
+ return value;
216
+ }
217
+
218
+ // src/mappers/JobMapper.ts
219
+ function stripNonSerializableFields(config) {
220
+ if (!config.schema) return config;
221
+ const schema = config.schema;
222
+ if (!schema.fields || !Array.isArray(schema.fields)) return config;
223
+ const rawFields = schema.fields;
224
+ const fields = rawFields.map((f) => {
225
+ const name = typeof f["name"] === "string" ? f["name"] : "";
226
+ const type = typeof f["type"] === "string" ? f["type"] : "";
227
+ const required = typeof f["required"] === "boolean" ? f["required"] : false;
228
+ const result = { name, type, required };
229
+ if (f["defaultValue"] !== void 0) result["defaultValue"] = f["defaultValue"];
230
+ if (f["separator"] !== void 0) result["separator"] = f["separator"];
231
+ if (f["aliases"] !== void 0) result["aliases"] = f["aliases"];
232
+ return result;
233
+ });
234
+ return {
235
+ ...config,
236
+ schema: {
237
+ ...config.schema,
238
+ fields
239
+ }
240
+ };
241
+ }
242
+ function toRow(state) {
243
+ return {
244
+ id: state.id,
245
+ status: state.status,
246
+ config: stripNonSerializableFields(state.config),
247
+ batches: state.batches.map((b) => ({
248
+ id: b.id,
249
+ index: b.index,
250
+ status: b.status,
251
+ records: [],
252
+ processedCount: b.processedCount,
253
+ failedCount: b.failedCount
254
+ })),
255
+ totalRecords: state.totalRecords,
256
+ startedAt: state.startedAt ?? null,
257
+ completedAt: state.completedAt ?? null,
258
+ distributed: state.distributed ?? false
259
+ };
260
+ }
261
+ function toDomain(row) {
262
+ const config = parseJson(row.config);
263
+ const batches = parseJson(row.batches);
264
+ const base = {
265
+ id: row.id,
266
+ config,
267
+ status: row.status,
268
+ batches,
269
+ totalRecords: row.totalRecords
270
+ };
271
+ const result = { ...base };
272
+ if (row.startedAt !== null) {
273
+ result["startedAt"] = Number(row.startedAt);
274
+ }
275
+ if (row.completedAt !== null) {
276
+ result["completedAt"] = Number(row.completedAt);
277
+ }
278
+ if (row.distributed) {
279
+ result["distributed"] = true;
280
+ }
281
+ return result;
282
+ }
283
+
284
+ // src/mappers/RecordMapper.ts
285
+ function toRow2(jobId, batchId, record) {
286
+ return {
287
+ jobId,
288
+ batchId,
289
+ recordIndex: record.index,
290
+ status: record.status,
291
+ raw: record.raw,
292
+ parsed: record.parsed,
293
+ errors: record.errors,
294
+ processingError: record.processingError ?? null
295
+ };
296
+ }
297
+ function toDomain2(row) {
298
+ const result = {
299
+ index: row.recordIndex,
300
+ raw: parseJson(row.raw),
301
+ parsed: parseJson(row.parsed),
302
+ status: row.status,
303
+ errors: parseJson(row.errors)
304
+ };
305
+ if (row.processingError !== null) {
306
+ return { ...result, processingError: row.processingError };
307
+ }
308
+ return result;
309
+ }
310
+
311
+ // src/SequelizeStateStore.ts
312
+ var SequelizeStateStore = class {
313
+ constructor(sequelize, _options) {
314
+ this.sequelize = sequelize;
315
+ this.Job = defineJobModel(this.sequelize);
316
+ this.Record = defineRecordModel(this.sequelize);
317
+ this.Batch = defineBatchModel(this.sequelize);
318
+ }
319
+ async initialize() {
320
+ await this.Job.sync();
321
+ await this.Record.sync();
322
+ await this.Batch.sync();
323
+ }
324
+ // ── StateStore methods ──────────────────────────────────────────────
325
+ async saveJobState(job) {
326
+ const row = toRow(job);
327
+ await this.Job.upsert(row);
328
+ }
329
+ async getJobState(jobId) {
330
+ const row = await this.Job.findByPk(jobId);
331
+ if (!row) return null;
332
+ return toDomain(row.get({ plain: true }));
333
+ }
334
+ async updateBatchState(jobId, batchId, state) {
335
+ const row = await this.Job.findByPk(jobId);
336
+ if (!row) return;
337
+ const plain = row.get({ plain: true });
338
+ const batches = parseJson(plain.batches);
339
+ const updated = batches.map(
340
+ (b) => b.id === batchId ? { ...b, status: state.status, processedCount: state.processedCount, failedCount: state.failedCount } : b
341
+ );
342
+ await row.update({ batches: updated });
343
+ const batchRow = await this.Batch.findByPk(batchId);
344
+ if (batchRow) {
345
+ await batchRow.update({
346
+ status: state.status,
347
+ processedCount: state.processedCount,
348
+ failedCount: state.failedCount
349
+ });
350
+ }
351
+ }
352
+ async saveProcessedRecord(jobId, batchId, record) {
353
+ const row = toRow2(jobId, batchId, record);
354
+ const existing = await this.Record.findOne({
355
+ where: { jobId, recordIndex: record.index }
356
+ });
357
+ if (existing) {
358
+ await existing.update(row);
359
+ } else {
360
+ await this.Record.create(row);
361
+ }
362
+ }
363
+ async getFailedRecords(jobId) {
364
+ const { Op } = await import("sequelize");
365
+ const rows = await this.Record.findAll({
366
+ where: { jobId, status: { [Op.in]: ["failed", "invalid"] } },
367
+ order: [["recordIndex", "ASC"]]
368
+ });
369
+ return rows.map((r) => toDomain2(r.get({ plain: true })));
370
+ }
371
+ async getPendingRecords(jobId) {
372
+ const { Op } = await import("sequelize");
373
+ const rows = await this.Record.findAll({
374
+ where: { jobId, status: { [Op.in]: ["pending", "valid"] } },
375
+ order: [["recordIndex", "ASC"]]
376
+ });
377
+ return rows.map((r) => toDomain2(r.get({ plain: true })));
378
+ }
379
+ async getProcessedRecords(jobId) {
380
+ const rows = await this.Record.findAll({
381
+ where: { jobId, status: "processed" },
382
+ order: [["recordIndex", "ASC"]]
383
+ });
384
+ return rows.map((r) => toDomain2(r.get({ plain: true })));
385
+ }
386
+ async getProgress(jobId) {
387
+ const jobRow = await this.Job.findByPk(jobId);
388
+ const plain = jobRow ? jobRow.get({ plain: true }) : null;
389
+ const { fn, col } = await import("sequelize");
390
+ const counts = await this.Record.findAll({
391
+ attributes: ["status", [fn("COUNT", col("status")), "count"]],
392
+ where: { jobId },
393
+ group: ["status"],
394
+ raw: true
395
+ });
396
+ const countMap = /* @__PURE__ */ new Map();
397
+ for (const row of counts) {
398
+ countMap.set(row.status, parseInt(row.count, 10));
399
+ }
400
+ const processed = countMap.get("processed") ?? 0;
401
+ const failed = (countMap.get("failed") ?? 0) + (countMap.get("invalid") ?? 0);
402
+ const totalRecords = plain?.totalRecords ?? 0;
403
+ const pending = Math.max(0, totalRecords - processed - failed);
404
+ const completed = processed + failed;
405
+ const batches = plain ? parseJson(plain.batches) : [];
406
+ const completedBatches = batches.filter((b) => b.status === "COMPLETED").length;
407
+ const elapsed = plain?.startedAt ? Date.now() - Number(plain.startedAt) : 0;
408
+ return {
409
+ totalRecords,
410
+ processedRecords: processed,
411
+ failedRecords: failed,
412
+ pendingRecords: pending,
413
+ percentage: totalRecords > 0 ? Math.round(completed / totalRecords * 100) : 0,
414
+ currentBatch: completedBatches,
415
+ totalBatches: batches.length,
416
+ elapsedMs: elapsed
417
+ };
418
+ }
419
+ // ── DistributedStateStore methods ───────────────────────────────────
420
+ async claimBatch(jobId, workerId) {
421
+ const jobRow = await this.Job.findByPk(jobId);
422
+ if (!jobRow) {
423
+ return { claimed: false, reason: "JOB_NOT_FOUND" };
424
+ }
425
+ const plain = jobRow.get({ plain: true });
426
+ if (plain.status !== "PROCESSING") {
427
+ return { claimed: false, reason: "JOB_NOT_PROCESSING" };
428
+ }
429
+ return await this.sequelize.transaction(async (transaction) => {
430
+ const pendingBatch = await this.Batch.findOne({
431
+ where: { jobId, status: "PENDING" },
432
+ order: [["batchIndex", "ASC"]],
433
+ transaction,
434
+ lock: true
435
+ });
436
+ if (!pendingBatch) {
437
+ return { claimed: false, reason: "NO_PENDING_BATCHES" };
438
+ }
439
+ const batchPlain = pendingBatch.get({ plain: true });
440
+ const now = Date.now();
441
+ const [affectedRows] = await this.Batch.update(
442
+ {
443
+ status: "PROCESSING",
444
+ workerId,
445
+ claimedAt: now,
446
+ version: batchPlain.version + 1
447
+ },
448
+ {
449
+ where: {
450
+ id: batchPlain.id,
451
+ version: batchPlain.version
452
+ },
453
+ transaction
454
+ }
455
+ );
456
+ if (affectedRows === 0) {
457
+ return { claimed: false, reason: "NO_PENDING_BATCHES" };
458
+ }
459
+ const jobBatches = parseJson(plain.batches);
460
+ const updatedBatches = jobBatches.map((b) => b.id === batchPlain.id ? { ...b, status: "PROCESSING" } : b);
461
+ await jobRow.update({ batches: updatedBatches }, { transaction });
462
+ return {
463
+ claimed: true,
464
+ reservation: {
465
+ jobId,
466
+ batchId: batchPlain.id,
467
+ batchIndex: batchPlain.batchIndex,
468
+ workerId,
469
+ claimedAt: now,
470
+ recordStartIndex: batchPlain.recordStartIndex,
471
+ recordEndIndex: batchPlain.recordEndIndex
472
+ }
473
+ };
474
+ });
475
+ }
476
+ async releaseBatch(jobId, batchId, workerId) {
477
+ await this.sequelize.transaction(async (transaction) => {
478
+ const batch = await this.Batch.findOne({
479
+ where: { id: batchId, jobId, workerId },
480
+ transaction,
481
+ lock: true
482
+ });
483
+ if (!batch) return;
484
+ const batchPlain = batch.get({ plain: true });
485
+ await this.Batch.update(
486
+ {
487
+ status: "PENDING",
488
+ workerId: null,
489
+ claimedAt: null,
490
+ version: batchPlain.version + 1
491
+ },
492
+ {
493
+ where: { id: batchId, version: batchPlain.version },
494
+ transaction
495
+ }
496
+ );
497
+ const jobRow = await this.Job.findByPk(jobId, { transaction });
498
+ if (jobRow) {
499
+ const plain = jobRow.get({ plain: true });
500
+ const jobBatches = parseJson(plain.batches);
501
+ const updatedBatches = jobBatches.map((b) => b.id === batchId ? { ...b, status: "PENDING" } : b);
502
+ await jobRow.update({ batches: updatedBatches }, { transaction });
503
+ }
504
+ });
505
+ }
506
+ async reclaimStaleBatches(jobId, timeoutMs) {
507
+ const cutoff = Date.now() - timeoutMs;
508
+ const { Op } = await import("sequelize");
509
+ return await this.sequelize.transaction(async (transaction) => {
510
+ const staleBatches = await this.Batch.findAll({
511
+ where: {
512
+ jobId,
513
+ status: "PROCESSING",
514
+ claimedAt: { [Op.lt]: cutoff }
515
+ },
516
+ transaction,
517
+ lock: true
518
+ });
519
+ if (staleBatches.length === 0) return 0;
520
+ let reclaimed = 0;
521
+ for (const batch of staleBatches) {
522
+ const batchPlain = batch.get({ plain: true });
523
+ const [affected] = await this.Batch.update(
524
+ {
525
+ status: "PENDING",
526
+ workerId: null,
527
+ claimedAt: null,
528
+ version: batchPlain.version + 1
529
+ },
530
+ {
531
+ where: { id: batchPlain.id, version: batchPlain.version },
532
+ transaction
533
+ }
534
+ );
535
+ reclaimed += affected;
536
+ }
537
+ if (reclaimed > 0) {
538
+ const reclaimedIds = new Set(staleBatches.map((b) => b.get({ plain: true }).id));
539
+ const jobRow = await this.Job.findByPk(jobId, { transaction });
540
+ if (jobRow) {
541
+ const plain = jobRow.get({ plain: true });
542
+ const jobBatches = parseJson(plain.batches);
543
+ const updatedBatches = jobBatches.map((b) => reclaimedIds.has(b.id) ? { ...b, status: "PENDING" } : b);
544
+ await jobRow.update({ batches: updatedBatches }, { transaction });
545
+ }
546
+ }
547
+ return reclaimed;
548
+ });
549
+ }
550
+ async saveBatchRecords(jobId, batchId, records) {
551
+ const rows = records.map((r) => toRow2(jobId, batchId, r));
552
+ await this.Record.bulkCreate(rows);
553
+ }
554
+ async getBatchRecords(jobId, batchId) {
555
+ const rows = await this.Record.findAll({
556
+ where: { jobId, batchId },
557
+ order: [["recordIndex", "ASC"]]
558
+ });
559
+ return rows.map((r) => toDomain2(r.get({ plain: true })));
560
+ }
561
+ async getDistributedStatus(jobId) {
562
+ const { fn, col } = await import("sequelize");
563
+ const counts = await this.Batch.findAll({
564
+ attributes: ["status", [fn("COUNT", col("status")), "count"]],
565
+ where: { jobId },
566
+ group: ["status"],
567
+ raw: true
568
+ });
569
+ const countMap = /* @__PURE__ */ new Map();
570
+ let total = 0;
571
+ for (const row of counts) {
572
+ const count = parseInt(row.count, 10);
573
+ countMap.set(row.status, count);
574
+ total += count;
575
+ }
576
+ const completed = countMap.get("COMPLETED") ?? 0;
577
+ const failed = countMap.get("FAILED") ?? 0;
578
+ const processing = countMap.get("PROCESSING") ?? 0;
579
+ const pending = countMap.get("PENDING") ?? 0;
580
+ return {
581
+ jobId,
582
+ totalBatches: total,
583
+ completedBatches: completed,
584
+ failedBatches: failed,
585
+ processingBatches: processing,
586
+ pendingBatches: pending,
587
+ isComplete: total > 0 && pending === 0 && processing === 0
588
+ };
589
+ }
590
+ async tryFinalizeJob(jobId) {
591
+ return await this.sequelize.transaction(async (transaction) => {
592
+ const jobRow = await this.Job.findByPk(jobId, { transaction, lock: true });
593
+ if (!jobRow) return false;
594
+ const plain = jobRow.get({ plain: true });
595
+ if (plain.status !== "PROCESSING") return false;
596
+ const status = await this.getDistributedStatusInTransaction(jobId, transaction);
597
+ if (!status.isComplete) return false;
598
+ const finalStatus = status.failedBatches > 0 ? "FAILED" : "COMPLETED";
599
+ const [affectedRows] = await this.Job.update(
600
+ {
601
+ status: finalStatus,
602
+ completedAt: Date.now()
603
+ },
604
+ {
605
+ where: { id: jobId, status: "PROCESSING" },
606
+ transaction
607
+ }
608
+ );
609
+ return affectedRows > 0;
610
+ });
611
+ }
612
+ /**
613
+ * Internal helper to get distributed status within an existing transaction.
614
+ * Avoids creating a nested transaction in tryFinalizeJob.
615
+ */
616
+ async getDistributedStatusInTransaction(jobId, transaction) {
617
+ const { fn, col } = await import("sequelize");
618
+ const counts = await this.Batch.findAll({
619
+ attributes: ["status", [fn("COUNT", col("status")), "count"]],
620
+ where: { jobId },
621
+ group: ["status"],
622
+ raw: true,
623
+ transaction
624
+ });
625
+ const countMap = /* @__PURE__ */ new Map();
626
+ let total = 0;
627
+ for (const row of counts) {
628
+ const count = parseInt(row.count, 10);
629
+ countMap.set(row.status, count);
630
+ total += count;
631
+ }
632
+ const completed = countMap.get("COMPLETED") ?? 0;
633
+ const failed = countMap.get("FAILED") ?? 0;
634
+ const processing = countMap.get("PROCESSING") ?? 0;
635
+ const pending = countMap.get("PENDING") ?? 0;
636
+ return {
637
+ jobId,
638
+ totalBatches: total,
639
+ completedBatches: completed,
640
+ failedBatches: failed,
641
+ processingBatches: processing,
642
+ pendingBatches: pending,
643
+ isComplete: total > 0 && pending === 0 && processing === 0
644
+ };
645
+ }
646
+ };
647
+ // Annotate the CommonJS export names for ESM import in node:
648
+ 0 && (module.exports = {
649
+ SequelizeStateStore
650
+ });
651
+ //# sourceMappingURL=index.cjs.map