@proteinjs/db 1.30.0 → 1.31.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.
Files changed (63) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/generated/index.js +1 -1
  3. package/dist/generated/index.js.map +1 -1
  4. package/dist/generated/test/index.d.ts.map +1 -1
  5. package/dist/generated/test/index.js +3 -1
  6. package/dist/generated/test/index.js.map +1 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/src/CursorWindowPager.d.ts +74 -0
  12. package/dist/src/CursorWindowPager.d.ts.map +1 -0
  13. package/dist/src/CursorWindowPager.js +178 -0
  14. package/dist/src/CursorWindowPager.js.map +1 -0
  15. package/dist/src/Db.d.ts +10 -0
  16. package/dist/src/Db.d.ts.map +1 -1
  17. package/dist/src/Db.js +10 -0
  18. package/dist/src/Db.js.map +1 -1
  19. package/dist/src/MigrationRunner.d.ts +58 -1
  20. package/dist/src/MigrationRunner.d.ts.map +1 -1
  21. package/dist/src/MigrationRunner.js +108 -2
  22. package/dist/src/MigrationRunner.js.map +1 -1
  23. package/dist/src/RecordIterator.d.ts +16 -6
  24. package/dist/src/RecordIterator.d.ts.map +1 -1
  25. package/dist/src/RecordIterator.js +50 -37
  26. package/dist/src/RecordIterator.js.map +1 -1
  27. package/dist/src/tables/MigrationTable.d.ts +10 -0
  28. package/dist/src/tables/MigrationTable.d.ts.map +1 -1
  29. package/dist/src/tables/MigrationTable.js +1 -0
  30. package/dist/src/tables/MigrationTable.js.map +1 -1
  31. package/dist/test/CursorWindowPager.test.d.ts +2 -0
  32. package/dist/test/CursorWindowPager.test.d.ts.map +1 -0
  33. package/dist/test/CursorWindowPager.test.js +213 -0
  34. package/dist/test/CursorWindowPager.test.js.map +1 -0
  35. package/dist/test/index.d.ts +2 -0
  36. package/dist/test/index.d.ts.map +1 -1
  37. package/dist/test/index.js +2 -0
  38. package/dist/test/index.js.map +1 -1
  39. package/dist/test/reusable/RecordIteratorTests.d.ts +13 -0
  40. package/dist/test/reusable/RecordIteratorTests.d.ts.map +1 -0
  41. package/dist/test/reusable/RecordIteratorTests.js +448 -0
  42. package/dist/test/reusable/RecordIteratorTests.js.map +1 -0
  43. package/dist/test/util/DbTestEnvironment.d.ts.map +1 -1
  44. package/dist/test/util/DbTestEnvironment.js +2 -1
  45. package/dist/test/util/DbTestEnvironment.js.map +1 -1
  46. package/dist/test/util/tables/recordIteratorTestTables.d.ts +25 -0
  47. package/dist/test/util/tables/recordIteratorTestTables.d.ts.map +1 -0
  48. package/dist/test/util/tables/recordIteratorTestTables.js +38 -0
  49. package/dist/test/util/tables/recordIteratorTestTables.js.map +1 -0
  50. package/generated/index.ts +1 -1
  51. package/generated/test/index.ts +3 -1
  52. package/index.ts +1 -0
  53. package/package.json +3 -3
  54. package/src/CursorWindowPager.ts +153 -0
  55. package/src/Db.ts +10 -0
  56. package/src/MigrationRunner.ts +114 -2
  57. package/src/RecordIterator.ts +34 -24
  58. package/src/tables/MigrationTable.ts +11 -1
  59. package/test/CursorWindowPager.test.ts +185 -0
  60. package/test/index.ts +2 -0
  61. package/test/reusable/RecordIteratorTests.ts +190 -0
  62. package/test/util/DbTestEnvironment.ts +2 -0
  63. package/test/util/tables/recordIteratorTestTables.ts +23 -0
@@ -42,6 +42,7 @@ var Db_1 = require("./Db");
42
42
  var SourceRecordRepo_1 = require("./source/SourceRecordRepo");
43
43
  var MigrationRunnerService_1 = require("./services/MigrationRunnerService");
44
44
  var MigrationTable_1 = require("./tables/MigrationTable");
45
+ var QueryBuilderFactory_1 = require("./QueryBuilderFactory");
45
46
  var logger_1 = require("@proteinjs/logger");
46
47
  var getMigrationRunner = function () {
47
48
  return typeof self === 'undefined' ? new MigrationRunner() : (0, MigrationRunnerService_1.getMigrationRunnerService)();
@@ -81,6 +82,9 @@ var MigrationRunner = /** @class */ (function () {
81
82
  *
82
83
  * 'ensure' = idempotent: a row already in 'success' status is logged and skipped. A prior
83
84
  * 'failure' row is retried by design — a fixed migration should run on the next boot.
85
+ *
86
+ * Returns the migration with its final run state (the skipped row, or the run's outcome) —
87
+ * the series runner ({@link runPendingMigrations}) gates on it.
84
88
  */
85
89
  MigrationRunner.prototype.ensureMigrationRun = function (id) {
86
90
  return __awaiter(this, void 0, void 0, function () {
@@ -95,13 +99,115 @@ var MigrationRunner = /** @class */ (function () {
95
99
  migrationRow = _a.sent();
96
100
  if ((migrationRow === null || migrationRow === void 0 ? void 0 : migrationRow.status) === 'success') {
97
101
  this.logger.info({ message: "Migration (".concat(id, ") already applied, skipping") });
98
- return [2 /*return*/];
102
+ return [2 /*return*/, migrationRow];
99
103
  }
100
104
  migration = this.resolveMigration(migrationTable, id);
101
105
  return [4 /*yield*/, this.runAndRecord(migrationTable, migration, function () { return db; })];
102
106
  case 2:
103
107
  _a.sent();
104
- return [2 /*return*/];
108
+ return [2 /*return*/, migration];
109
+ }
110
+ });
111
+ });
112
+ };
113
+ /**
114
+ * Deploy-path API (plans/POST_RELEASE_QUEUE.md 27f): the deploy pipeline's migration Job calls
115
+ * this AFTER `new Db().init()` (schema sync + source-record sync — every source-declared
116
+ * migration has a ledger row by then) and BEFORE the rollout advances. Pod boot never calls it:
117
+ * boot stays migration-free (the startupProbe invariant — DbInitStartupTask is schema sync and
118
+ * source records only).
119
+ *
120
+ * Discovery + order: the migration LEDGER (the migration table) is the authority. Rows run in
121
+ * SERIES, oldest-first by the row's `created` (id tiebreak) — a migration that shipped in an
122
+ * earlier release always runs before a later one. Never parallel.
123
+ *
124
+ * Policy:
125
+ * - `manual: true` (the source record's declaration) is EXCLUDED — the explicit non-automatable
126
+ * class keeps the Migrations-page flow ({@link Migration.manual}).
127
+ * - rows already in 'success' are skipped; any other status is pending — including 'running'
128
+ * (a crashed earlier Job): {@link ensureMigrationRun} re-runs it.
129
+ * - rows with no source record are history (a loader deleted after its run) — skipped,
130
+ * reported as `unresolved`.
131
+ * - the FIRST failure STOPS the series (later migrations may build on earlier ones). The
132
+ * caller exits non-zero, the Job fails, the rollout does not advance.
133
+ *
134
+ * EXPAND-CONTRACT INVARIANT (documented at this seam on purpose): every automated migration —
135
+ * and the schema sync that fronts it — must be backward-compatible with the STILL-RUNNING old
136
+ * release, because the old pods keep serving while this runs and keep serving indefinitely if
137
+ * it fails. "Roll back" = do not advance the code; DDL and applied migrations are never
138
+ * un-applied (Spanner DDL is not transactional-reversible). Contractions (drops, rewrites that
139
+ * break the old reader) belong in the `manual` class, run only after every consumer of the old
140
+ * shape is gone.
141
+ */
142
+ MigrationRunner.prototype.runPendingMigrations = function () {
143
+ return __awaiter(this, void 0, void 0, function () {
144
+ var migrationTable, db, qb, ledger, summary, sourceRecordRepo, pending, _i, ledger_1, row, source, i, outcome;
145
+ return __generator(this, function (_a) {
146
+ switch (_a.label) {
147
+ case 0:
148
+ migrationTable = new MigrationTable_1.MigrationTable();
149
+ db = (0, Db_1.getDbAsSystem)();
150
+ qb = new QueryBuilderFactory_1.QueryBuilderFactory().createQueryBuilder(migrationTable).sort([
151
+ { field: 'created', desc: false },
152
+ { field: 'id', desc: false },
153
+ ]);
154
+ return [4 /*yield*/, db.query(migrationTable, qb)];
155
+ case 1:
156
+ ledger = _a.sent();
157
+ summary = {
158
+ applied: [],
159
+ skippedManual: [],
160
+ alreadyApplied: [],
161
+ unresolved: [],
162
+ notAttempted: [],
163
+ };
164
+ sourceRecordRepo = new SourceRecordRepo_1.SourceRecordRepo();
165
+ pending = [];
166
+ for (_i = 0, ledger_1 = ledger; _i < ledger_1.length; _i++) {
167
+ row = ledger_1[_i];
168
+ source = sourceRecordRepo.getSourceRecord(migrationTable.name, row.id);
169
+ if (!source) {
170
+ summary.unresolved.push(row.id);
171
+ continue;
172
+ }
173
+ if (source.manual) {
174
+ summary.skippedManual.push(row.id);
175
+ continue;
176
+ }
177
+ if (row.status === 'success') {
178
+ summary.alreadyApplied.push(row.id);
179
+ continue;
180
+ }
181
+ pending.push(row);
182
+ }
183
+ this.logger.info({
184
+ message: "Running ".concat(pending.length, " pending migration").concat(pending.length === 1 ? '' : 's', " in series, oldest-first"),
185
+ obj: { pending: pending.map(function (row) { return row.id; }), skippedManual: summary.skippedManual },
186
+ });
187
+ i = 0;
188
+ _a.label = 2;
189
+ case 2:
190
+ if (!(i < pending.length)) return [3 /*break*/, 5];
191
+ return [4 /*yield*/, this.ensureMigrationRun(pending[i].id)];
192
+ case 3:
193
+ outcome = _a.sent();
194
+ if (outcome.status === 'success') {
195
+ summary.applied.push(outcome.id);
196
+ return [3 /*break*/, 4];
197
+ }
198
+ summary.failed = {
199
+ id: outcome.id,
200
+ description: outcome.description,
201
+ failureMessage: outcome.failureMessage,
202
+ };
203
+ summary.notAttempted = pending.slice(i + 1).map(function (row) { return row.id; });
204
+ return [3 /*break*/, 5];
205
+ case 4:
206
+ i++;
207
+ return [3 /*break*/, 2];
208
+ case 5:
209
+ this.logger.info({ message: "Migration series finished", obj: summary });
210
+ return [2 /*return*/, summary];
105
211
  }
106
212
  });
107
213
  });
@@ -1 +1 @@
1
- {"version":3,"file":"MigrationRunner.js","sourceRoot":"","sources":["../../src/MigrationRunner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MigrationRunner.js","sourceRoot":"","sources":["../../src/MigrationRunner.ts"],"names":[],"mappings":"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"}
@@ -2,13 +2,23 @@ import { Db } from './Db';
2
2
  import { Table } from './Table';
3
3
  import { Record } from './Record';
4
4
  import { Query } from './services/DbService';
5
+ /**
6
+ * Iterate a table query in cursor-anchored windows (`CursorWindowPager`), `windowSize` rows
7
+ * per query. Cursor windows frame on the last row served instead of a positional offset, so
8
+ * rows inserted or deleted while iterating can never skip or duplicate rows — every row that
9
+ * exists throughout the iteration is yielded exactly once.
10
+ *
11
+ * Ordering: the sort criteria on the consumer's query builder become the cursor axes, with a
12
+ * unique `id` tiebreak appended (ties can't skip across window boundaries); with no sort the
13
+ * iteration runs in plain `id` order. Sort axes should be non-null columns — a window whose
14
+ * tail carries a NULL sort value ends the iteration (a null can't anchor a continuation).
15
+ *
16
+ * The caller's query builder is never mutated: every window builds on a fresh copy.
17
+ */
5
18
  export declare class RecordIterator<T extends Record> implements AsyncIterable<T> {
6
- private db;
7
- private table;
8
- private query;
9
- private pageSize;
10
- private currentPage;
11
- constructor(table: Table<T>, query: Query<T>, pageSize?: number, db?: Db);
19
+ private windowSize;
20
+ private pager;
21
+ constructor(table: Table<T>, query: Query<T>, windowSize?: number, db?: Db);
12
22
  [Symbol.asyncIterator](): AsyncIterator<T>;
13
23
  }
14
24
  //# sourceMappingURL=RecordIterator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RecordIterator.d.ts","sourceRoot":"","sources":["../../src/RecordIterator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAS,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAI7C,qBAAa,cAAc,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,EAAE,CAAK;IACf,OAAO,CAAC,KAAK,CAAW;IACxB,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,GAAE,MAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IAQrE,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;CAqBlD"}
1
+ {"version":3,"file":"RecordIterator.d.ts","sourceRoot":"","sources":["../../src/RecordIterator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAK7C;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,MAAM,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAMrE,OAAO,CAAC,UAAU;IALpB,OAAO,CAAC,KAAK,CAAuB;gBAGlC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACP,UAAU,GAAE,MAAW,EAC/B,EAAE,CAAC,EAAE,EAAE;IAUF,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;CAelD"}
@@ -40,54 +40,67 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
40
40
  };
41
41
  Object.defineProperty(exports, "__esModule", { value: true });
42
42
  exports.RecordIterator = void 0;
43
- var Db_1 = require("./Db");
44
43
  var QueryBuilderFactory_1 = require("./QueryBuilderFactory");
44
+ var db_query_1 = require("@proteinjs/db-query");
45
+ var CursorWindowPager_1 = require("./CursorWindowPager");
46
+ /**
47
+ * Iterate a table query in cursor-anchored windows (`CursorWindowPager`), `windowSize` rows
48
+ * per query. Cursor windows frame on the last row served instead of a positional offset, so
49
+ * rows inserted or deleted while iterating can never skip or duplicate rows — every row that
50
+ * exists throughout the iteration is yielded exactly once.
51
+ *
52
+ * Ordering: the sort criteria on the consumer's query builder become the cursor axes, with a
53
+ * unique `id` tiebreak appended (ties can't skip across window boundaries); with no sort the
54
+ * iteration runs in plain `id` order. Sort axes should be non-null columns — a window whose
55
+ * tail carries a NULL sort value ends the iteration (a null can't anchor a continuation).
56
+ *
57
+ * The caller's query builder is never mutated: every window builds on a fresh copy.
58
+ */
45
59
  var RecordIterator = /** @class */ (function () {
46
- function RecordIterator(table, query, pageSize, db) {
47
- if (pageSize === void 0) { pageSize = 10; }
48
- this.db = db || (0, Db_1.getDb)();
49
- this.table = table;
50
- this.query = new QueryBuilderFactory_1.QueryBuilderFactory().getQueryBuilder(table, query);
51
- this.pageSize = pageSize;
52
- this.currentPage = 0;
60
+ function RecordIterator(table, query, windowSize, db) {
61
+ if (windowSize === void 0) { windowSize = 10; }
62
+ this.windowSize = windowSize;
63
+ // A fresh copy of the consumer's query; its sort criteria lift off the base (the pager
64
+ // owns ordering — cursor axes and ORDER BY have to agree) and the conditions-only base
65
+ // seeds every window's fresh build.
66
+ var base = new QueryBuilderFactory_1.QueryBuilderFactory().createQueryBuilder(table, query);
67
+ var sort = base.removeSortCriteria();
68
+ this.pager = new CursorWindowPager_1.CursorWindowPager(table, function () { return db_query_1.QueryBuilder.fromQueryBuilder(base, table.name); }, sort, { db: db });
53
69
  }
54
70
  RecordIterator.prototype[Symbol.asyncIterator] = function () {
55
71
  return __asyncGenerator(this, arguments, function _a() {
56
- var pagination, results, _i, results_1, item;
57
- return __generator(this, function (_b) {
58
- switch (_b.label) {
72
+ var anchor, window_1, _i, _b, row;
73
+ return __generator(this, function (_c) {
74
+ switch (_c.label) {
59
75
  case 0:
60
- if (!true) return [3 /*break*/, 11];
61
- pagination = { start: this.currentPage * this.pageSize, end: (this.currentPage + 1) * this.pageSize };
62
- this.query.paginate(pagination);
63
- return [4 /*yield*/, __await(this.db.query(this.table, this.query))];
76
+ anchor = null;
77
+ _c.label = 1;
64
78
  case 1:
65
- results = _b.sent();
66
- if (!(results.length === 0)) return [3 /*break*/, 3];
67
- return [4 /*yield*/, __await(void 0)];
68
- case 2: return [2 /*return*/, _b.sent()];
79
+ if (!true) return [3 /*break*/, 10];
80
+ return [4 /*yield*/, __await(this.pager.loadWindow(anchor, this.windowSize))];
81
+ case 2:
82
+ window_1 = _c.sent();
83
+ _i = 0, _b = window_1.rows;
84
+ _c.label = 3;
69
85
  case 3:
70
- _i = 0, results_1 = results;
71
- _b.label = 4;
72
- case 4:
73
- if (!(_i < results_1.length)) return [3 /*break*/, 8];
74
- item = results_1[_i];
75
- return [4 /*yield*/, __await(item)];
76
- case 5: return [4 /*yield*/, _b.sent()];
86
+ if (!(_i < _b.length)) return [3 /*break*/, 7];
87
+ row = _b[_i];
88
+ return [4 /*yield*/, __await(row)];
89
+ case 4: return [4 /*yield*/, _c.sent()];
90
+ case 5:
91
+ _c.sent();
92
+ _c.label = 6;
77
93
  case 6:
78
- _b.sent();
79
- _b.label = 7;
80
- case 7:
81
94
  _i++;
82
- return [3 /*break*/, 4];
83
- case 8:
84
- if (!(results.length < this.pageSize)) return [3 /*break*/, 10];
95
+ return [3 /*break*/, 3];
96
+ case 7:
97
+ if (!!window_1.nextAnchor) return [3 /*break*/, 9];
85
98
  return [4 /*yield*/, __await(void 0)];
86
- case 9: return [2 /*return*/, _b.sent()];
87
- case 10:
88
- this.currentPage++;
89
- return [3 /*break*/, 0];
90
- case 11: return [2 /*return*/];
99
+ case 8: return [2 /*return*/, _c.sent()];
100
+ case 9:
101
+ anchor = window_1.nextAnchor;
102
+ return [3 /*break*/, 1];
103
+ case 10: return [2 /*return*/];
91
104
  }
92
105
  });
93
106
  });
@@ -1 +1 @@
1
- {"version":3,"file":"RecordIterator.js","sourceRoot":"","sources":["../../src/RecordIterator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2BAAiC;AAIjC,6DAA4D;AAG5D;IAOE,wBAAY,KAAe,EAAE,KAAe,EAAE,QAAqB,EAAE,EAAO;QAA9B,yBAAA,EAAA,aAAqB;QACjE,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,IAAA,UAAK,GAAE,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,yCAAmB,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;IAEM,yBAAC,MAAM,CAAC,aAAa,CAAC,GAA7B;;;;;;6BACS,IAAI;wBACH,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;wBAC5G,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;wBAChB,6BAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAA;;wBAArD,OAAO,GAAG,SAA2C;6BAEvD,CAAA,OAAO,CAAC,MAAM,KAAK,CAAC,CAAA,EAApB,wBAAoB;;4BACtB,iCAAO;;8BAGiB,EAAP,mBAAO;;;6BAAP,CAAA,qBAAO,CAAA;wBAAf,IAAI;qDACP,IAAI;4BAAV,gCAAU;;wBAAV,SAAU,CAAC;;;wBADM,IAAO,CAAA;;;6BAItB,CAAA,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAA,EAA9B,yBAA8B;;4BAChC,iCAAO;;wBAGT,IAAI,CAAC,WAAW,EAAE,CAAC;;;;;;KAEtB;IACH,qBAAC;AAAD,CAAC,AApCD,IAoCC;AApCY,wCAAc"}
1
+ {"version":3,"file":"RecordIterator.js","sourceRoot":"","sources":["../../src/RecordIterator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,6DAA4D;AAC5D,gDAAmD;AACnD,yDAAsE;AAEtE;;;;;;;;;;;;GAYG;AACH;IAGE,wBACE,KAAe,EACf,KAAe,EACP,UAAuB,EAC/B,EAAO;QADC,2BAAA,EAAA,eAAuB;QAAvB,eAAU,GAAV,UAAU,CAAa;QAG/B,uFAAuF;QACvF,uFAAuF;QACvF,oCAAoC;QACpC,IAAM,IAAI,GAAG,IAAI,yCAAmB,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxE,IAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,GAAG,IAAI,qCAAiB,CAAI,KAAK,EAAE,cAAM,OAAA,uBAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAA/C,CAA+C,EAAE,IAAI,EAAE,EAAE,EAAE,IAAA,EAAE,CAAC,CAAC;IACpH,CAAC;IAEM,yBAAC,MAAM,CAAC,aAAa,CAAC,GAA7B;;;;;;wBACM,MAAM,GAAwB,IAAI,CAAC;;;6BAChC,IAAI;wBACM,6BAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,GAAA;;wBAA7D,WAAS,SAAoD;8BACtC,EAAX,KAAA,QAAM,CAAC,IAAI;;;6BAAX,CAAA,cAAW,CAAA;wBAAlB,GAAG;qDACN,GAAG;4BAAT,gCAAS;;wBAAT,SAAS,CAAC;;;wBADM,IAAW,CAAA;;;6BAIzB,CAAC,QAAM,CAAC,UAAU,EAAlB,wBAAkB;;4BACpB,iCAAO;;wBAGT,MAAM,GAAG,QAAM,CAAC,UAAU,CAAC;;;;;;KAE9B;IACH,qBAAC;AAAD,CAAC,AAhCD,IAgCC;AAhCY,wCAAc"}
@@ -3,6 +3,15 @@ import { Table } from '../Table';
3
3
  import { SourceRecord } from '../source/SourceRecord';
4
4
  export interface Migration extends SourceRecord {
5
5
  description: string;
6
+ /**
7
+ * The explicit non-automatable class (plans/POST_RELEASE_QUEUE.md 27f): destructive
8
+ * contractions (column/table drops), long backfills over big tables, data-dependent one-offs.
9
+ * `manual: true` EXCLUDES the migration from the deploy-gated auto-run
10
+ * ({@link MigrationRunner.runPendingMigrations}); it keeps the Migrations-page flow
11
+ * (`runMigration`). Absence of the flag = automated — the invariant lives here, in the
12
+ * schema, not in deploy-pipeline prose.
13
+ */
14
+ manual?: boolean;
6
15
  status?: 'proposed' | 'running' | 'success' | 'failure';
7
16
  failureMessage?: string;
8
17
  failureStack?: string;
@@ -28,6 +37,7 @@ export declare class MigrationTable extends Table<Migration> {
28
37
  isLoadedFromSource: import("../Table").Column<boolean | undefined, any>;
29
38
  } & {} & {
30
39
  description: import("../Table").Column<string, any>;
40
+ manual: import("../Table").Column<boolean | undefined, any>;
31
41
  status: import("../Table").Column<"proposed" | "running" | "success" | "failure" | undefined, any>;
32
42
  failureMessage: import("../Table").Column<string | undefined, any>;
33
43
  failureStack: import("../Table").Column<string | undefined, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"MigrationTable.d.ts","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAA2B,MAAM,wBAAwB,CAAC;AAE/E,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CAChC;AAED,qBAAa,cAAe,SAAQ,KAAK,CAAC,SAAS,CAAC;IAC3C,IAAI,SAAe;IAC1B;;;;;OAKG;IACI,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAGnC;IACK,OAAO;;;;;;;;;;;;;;;;MASX;IACI,mBAAmB;;;;;MAKxB;CACH"}
1
+ {"version":3,"file":"MigrationTable.d.ts","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAA2B,MAAM,wBAAwB,CAAC;AAE/E,MAAM,WAAW,SAAU,SAAQ,YAAY;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,GAAG,EAAE,MAAM,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;CAChC;AAED,qBAAa,cAAe,SAAQ,KAAK,CAAC,SAAS,CAAC;IAC3C,IAAI,SAAe;IAC1B;;;;;OAKG;IACI,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAGnC;IACK,OAAO;;;;;;;;;;;;;;;;;MAUX;IACI,mBAAmB;;;;;MAKxB;CACH"}
@@ -72,6 +72,7 @@ var MigrationTable = /** @class */ (function (_super) {
72
72
  };
73
73
  _this.columns = (0, SourceRecord_1.withSourceRecordColumns)({
74
74
  description: new Columns_1.StringColumn('description', {}, 4000),
75
+ manual: new Columns_1.BooleanColumn('manual'),
75
76
  status: new Columns_1.StringColumn('status', { defaultValue: function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
76
77
  return [2 /*return*/, 'proposed'];
77
78
  }); }); } }),
@@ -1 +1 @@
1
- {"version":3,"file":"MigrationTable.js","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,sCAAwE;AACxE,kCAAiC;AACjC,uDAA+E;AAc/E;IAAoC,kCAAgB;IAApD;QAAA,qEA4BC;QA3BQ,UAAI,GAAG,WAAW,CAAC;QAC1B;;;;;WAKG;QACI,UAAI,GAA6B;YACtC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;YAClC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;SACxC,CAAC;QACK,aAAO,GAAG,IAAA,sCAAuB,EAAY;YAClD,WAAW,EAAE,IAAI,sBAAY,CAAC,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC;YACtD,MAAM,EAAE,IAAI,sBAAY,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE;oBAAY,sBAAA,UAAU,EAAA;yBAAA,EAAE,CAAC;YAC5E,cAAc,EAAE,IAAI,sBAAY,CAAC,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC;YAC7D,YAAY,EAAE,IAAI,sBAAY,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,CAAC;YAC1D,SAAS,EAAE,IAAI,wBAAc,CAAC,YAAY,CAAC;YAC3C,OAAO,EAAE,IAAI,wBAAc,CAAC,UAAU,CAAC;YACvC,QAAQ,EAAE,IAAI,sBAAY,CAAC,UAAU,CAAC;YACtC,MAAM,EAAE,IAAI,sBAAY,CAAC,QAAQ,CAAC;SACnC,CAAC,CAAC;QACI,yBAAmB,GAAG;YAC3B,8BAA8B,EAAE,IAAI;YACpC,EAAE,EAAE;gBACF,WAAW,EAAE,IAAI;aAClB;SACF,CAAC;;IACJ,CAAC;IAAD,qBAAC;AAAD,CAAC,AA5BD,CAAoC,aAAK,GA4BxC;AA5BY,wCAAc"}
1
+ {"version":3,"file":"MigrationTable.js","sourceRoot":"","sources":["../../../src/tables/MigrationTable.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,sCAAuF;AACvF,kCAAiC;AACjC,uDAA+E;AAuB/E;IAAoC,kCAAgB;IAApD;QAAA,qEA6BC;QA5BQ,UAAI,GAAG,WAAW,CAAC;QAC1B;;;;;WAKG;QACI,UAAI,GAA6B;YACtC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;YAClC,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE;SACxC,CAAC;QACK,aAAO,GAAG,IAAA,sCAAuB,EAAY;YAClD,WAAW,EAAE,IAAI,sBAAY,CAAC,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC;YACtD,MAAM,EAAE,IAAI,uBAAa,CAAC,QAAQ,CAAC;YACnC,MAAM,EAAE,IAAI,sBAAY,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE;oBAAY,sBAAA,UAAU,EAAA;yBAAA,EAAE,CAAC;YAC5E,cAAc,EAAE,IAAI,sBAAY,CAAC,iBAAiB,EAAE,EAAE,EAAE,IAAI,CAAC;YAC7D,YAAY,EAAE,IAAI,sBAAY,CAAC,eAAe,EAAE,EAAE,EAAE,KAAK,CAAC;YAC1D,SAAS,EAAE,IAAI,wBAAc,CAAC,YAAY,CAAC;YAC3C,OAAO,EAAE,IAAI,wBAAc,CAAC,UAAU,CAAC;YACvC,QAAQ,EAAE,IAAI,sBAAY,CAAC,UAAU,CAAC;YACtC,MAAM,EAAE,IAAI,sBAAY,CAAC,QAAQ,CAAC;SACnC,CAAC,CAAC;QACI,yBAAmB,GAAG;YAC3B,8BAA8B,EAAE,IAAI;YACpC,EAAE,EAAE;gBACF,WAAW,EAAE,IAAI;aAClB;SACF,CAAC;;IACJ,CAAC;IAAD,qBAAC;AAAD,CAAC,AA7BD,CAAoC,aAAK,GA6BxC;AA7BY,wCAAc"}
@@ -0,0 +1,2 @@
1
+ import '../generated/index';
2
+ //# sourceMappingURL=CursorWindowPager.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CursorWindowPager.test.d.ts","sourceRoot":"","sources":["../../test/CursorWindowPager.test.ts"],"names":[],"mappings":"AAaA,OAAO,oBAAoB,CAAC"}
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ /**
43
+ * CursorWindowPager (src/CursorWindowPager.ts) at the pure level: effective-sort derivation
44
+ * (id tiebreak appended, explicit id ends the list, byValues rejected), lexicographic anchor
45
+ * conditions, next-anchor derivation (short-window and null-tail exhaustion), anchor
46
+ * encode/decode fidelity, and fresh-query-per-window construction. The db round trip is a
47
+ * constructor-injected stub — no module mocking, the pager's `options.db` seam IS the
48
+ * injection point.
49
+ */
50
+ var moment_1 = __importDefault(require("moment"));
51
+ var db_query_1 = require("@proteinjs/db-query");
52
+ var db_1 = require("@proteinjs/db");
53
+ // Load the reflection source graph so the house Serializer's custom serializers (moments)
54
+ // are registered — anchor encode/decode fidelity rides them.
55
+ require("../generated/index");
56
+ var table = { name: 'pager_test' };
57
+ var staged = { rows: [] };
58
+ var executed = [];
59
+ var stubDb = {
60
+ query: function (_table, qb) { return __awaiter(void 0, void 0, void 0, function () {
61
+ return __generator(this, function (_a) {
62
+ executed.push(qb);
63
+ return [2 /*return*/, staged.rows];
64
+ });
65
+ }); },
66
+ };
67
+ var createQuery = function () { return new db_query_1.QueryBuilder(table.name); };
68
+ var pager = function (sort) {
69
+ return new db_1.CursorWindowPager(table, createQuery, sort, { db: stubDb });
70
+ };
71
+ var internals = function (instance) { return instance; };
72
+ var graphNodes = function (qb) { return qb.graph.nodes().map(function (id) { return qb.graph.node(id); }); };
73
+ var conditionNodes = function (qb) { return graphNodes(qb).filter(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'CONDITION'; }); };
74
+ var logicalNodes = function (qb) { return graphNodes(qb).filter(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'LOGICAL'; }); };
75
+ var paginationNode = function (qb) { return graphNodes(qb).find(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'PAGINATION'; }); };
76
+ var sortNodes = function (qb) { return graphNodes(qb).filter(function (node) { return (node === null || node === void 0 ? void 0 : node.type) === 'SORT'; }); };
77
+ var row = function (id, seq, at) { return ({
78
+ id: id,
79
+ name: id,
80
+ seq: seq,
81
+ stampedAt: at ? (0, moment_1.default)(at) : at === null ? null : undefined,
82
+ }); };
83
+ beforeEach(function () {
84
+ staged.rows = [];
85
+ executed.length = 0;
86
+ });
87
+ describe('effective sort', function () {
88
+ it('appends the id tiebreak to the consumer sort', function () {
89
+ var instance = pager([{ field: 'seq', desc: true }]);
90
+ expect(internals(instance).effectiveSort).toEqual([
91
+ { field: 'seq', desc: true },
92
+ { field: 'id', desc: false },
93
+ ]);
94
+ });
95
+ it('no sort = pure id order', function () {
96
+ expect(internals(pager()).effectiveSort).toEqual([{ field: 'id', desc: false }]);
97
+ });
98
+ it('an explicit id criterion ends the list (axes after it can never influence order)', function () {
99
+ var instance = pager([
100
+ { field: 'id', desc: true },
101
+ { field: 'seq', desc: false },
102
+ ]);
103
+ expect(internals(instance).effectiveSort).toEqual([{ field: 'id', desc: true }]);
104
+ });
105
+ it('rejects byValues sorts — a CASE ordering has no comparable cursor axis', function () {
106
+ expect(function () { return pager([{ field: 'name', byValues: ['a', 'b'] }]); }).toThrow(/byValues/);
107
+ });
108
+ });
109
+ describe('buildWindowQuery', function () {
110
+ it('the first window carries no cursor conditions — just the effective sort and the window pagination', function () {
111
+ var qb = internals(pager([{ field: 'seq', desc: false }])).buildWindowQuery(null, 30);
112
+ expect(conditionNodes(qb)).toHaveLength(0);
113
+ expect(paginationNode(qb)).toMatchObject({ start: 0, end: 30 });
114
+ expect(sortNodes(qb).map(function (node) { return node.criteria; })).toEqual([
115
+ { field: 'seq', desc: false },
116
+ { field: 'id', desc: false },
117
+ ]);
118
+ });
119
+ it('an anchored window builds the lexicographic continuation: past-on-axis OR (equal-on-axis AND past-on-id)', function () {
120
+ var qb = internals(pager([{ field: 'seq', desc: true }])).buildWindowQuery({ values: [40, 'row-4'] }, 10);
121
+ // Disjunct 1: seq < 40. Disjunct 2: seq = 40 AND id > 'row-4'.
122
+ expect(conditionNodes(qb)).toEqual(expect.arrayContaining([
123
+ expect.objectContaining({ field: 'seq', operator: '<', value: 40 }),
124
+ expect.objectContaining({ field: 'seq', operator: '=', value: 40 }),
125
+ expect.objectContaining({ field: 'id', operator: '>', value: 'row-4' }),
126
+ ]));
127
+ expect(conditionNodes(qb)).toHaveLength(3);
128
+ var operators = logicalNodes(qb).map(function (node) { return node.operator; });
129
+ expect(operators).toContain('OR');
130
+ expect(operators).toContain('AND');
131
+ });
132
+ it('an ascending axis flips the past operator to `>`', function () {
133
+ var qb = internals(pager([{ field: 'seq', desc: false }])).buildWindowQuery({ values: [40, 'row-4'] }, 10);
134
+ expect(conditionNodes(qb)).toEqual(expect.arrayContaining([expect.objectContaining({ field: 'seq', operator: '>', value: 40 })]));
135
+ });
136
+ it('every window builds on a FRESH query — cursor conditions never accumulate', function () {
137
+ var instance = pager([{ field: 'seq', desc: true }]);
138
+ internals(instance).buildWindowQuery({ values: [40, 'row-4'] }, 10);
139
+ var second = internals(instance).buildWindowQuery({ values: [20, 'row-2'] }, 10);
140
+ expect(conditionNodes(second)).toHaveLength(3);
141
+ });
142
+ });
143
+ describe('deriveNextAnchor', function () {
144
+ var instance = pager([{ field: 'seq', desc: false }]);
145
+ it('a short window is exhausted', function () {
146
+ expect(internals(instance).deriveNextAnchor([row('a', 10)], 3)).toBeNull();
147
+ expect(internals(instance).deriveNextAnchor([], 3)).toBeNull();
148
+ });
149
+ it('a full window anchors at its tail row, one value per effective criterion', function () {
150
+ var anchor = internals(instance).deriveNextAnchor([row('a', 10), row('b', 20), row('c', 30)], 3);
151
+ expect(anchor).toEqual({ values: [30, 'c'] });
152
+ });
153
+ it('a full window with a NULL sort-value tail is exhausted (null rows collect at the tail; no anchor)', function () {
154
+ expect(internals(instance).deriveNextAnchor([row('a', 10), row('b', 20), row('c', null)], 3)).toBeNull();
155
+ });
156
+ });
157
+ describe('anchor encode/decode', function () {
158
+ it('round-trips values with type fidelity (moments survive)', function () {
159
+ var at = (0, moment_1.default)('2026-08-10T12:00:00.000Z');
160
+ var encoded = db_1.CursorWindowPager.encodeAnchor({ values: [at, 'row-1'] });
161
+ expect(typeof encoded).toBe('string');
162
+ var decoded = db_1.CursorWindowPager.decodeAnchor(encoded);
163
+ expect(moment_1.default.isMoment(decoded.values[0])).toBe(true);
164
+ expect(decoded.values[0].toISOString()).toBe(at.toISOString());
165
+ expect(decoded.values[1]).toBe('row-1');
166
+ });
167
+ });
168
+ describe('loadWindow', function () {
169
+ it('returns the queried rows with the derived next anchor, querying through the injected db', function () { return __awaiter(void 0, void 0, void 0, function () {
170
+ var instance, window;
171
+ return __generator(this, function (_a) {
172
+ switch (_a.label) {
173
+ case 0:
174
+ instance = pager([{ field: 'seq', desc: false }]);
175
+ staged.rows = [row('a', 10), row('b', 20), row('c', 30)];
176
+ return [4 /*yield*/, instance.loadWindow(null, 3)];
177
+ case 1:
178
+ window = _a.sent();
179
+ expect(window.rows).toBe(staged.rows);
180
+ expect(window.nextAnchor).toEqual({ values: [30, 'c'] });
181
+ expect(executed).toHaveLength(1);
182
+ expect(paginationNode(executed[0])).toMatchObject({ start: 0, end: 3 });
183
+ return [2 /*return*/];
184
+ }
185
+ });
186
+ }); });
187
+ it('returns an exhausted window (null anchor) when the query comes back short', function () { return __awaiter(void 0, void 0, void 0, function () {
188
+ var instance, window;
189
+ return __generator(this, function (_a) {
190
+ switch (_a.label) {
191
+ case 0:
192
+ instance = pager([{ field: 'seq', desc: false }]);
193
+ staged.rows = [row('a', 10)];
194
+ return [4 /*yield*/, instance.loadWindow({ values: [5, 'z'] }, 3)];
195
+ case 1:
196
+ window = _a.sent();
197
+ expect(window.nextAnchor).toBeNull();
198
+ return [2 /*return*/];
199
+ }
200
+ });
201
+ }); });
202
+ it('rejects a nonsensical window size', function () { return __awaiter(void 0, void 0, void 0, function () {
203
+ return __generator(this, function (_a) {
204
+ switch (_a.label) {
205
+ case 0: return [4 /*yield*/, expect(pager().loadWindow(null, 0)).rejects.toThrow(/window size/i)];
206
+ case 1:
207
+ _a.sent();
208
+ return [2 /*return*/];
209
+ }
210
+ });
211
+ }); });
212
+ });
213
+ //# sourceMappingURL=CursorWindowPager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CursorWindowPager.test.js","sourceRoot":"","sources":["../../test/CursorWindowPager.test.ts"],"names":[],"mappings":"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"}
@@ -5,11 +5,13 @@ export * from './reusable/DynamicReferenceColumnTests';
5
5
  export * from './reusable/TransactionTests';
6
6
  export * from './reusable/CascadeDeleteTests';
7
7
  export * from './reusable/PreloadReferencesTests';
8
+ export * from './reusable/RecordIteratorTests';
8
9
  export * from './util/testUser';
9
10
  export * from './util/tables/cascadeDeleteTestTables';
10
11
  export * from './util/tables/columnTypesTestTables';
11
12
  export * from './util/tables/crudTestTables';
12
13
  export * from './util/tables/dynamicReferenceColumnTestTables';
14
+ export * from './util/tables/recordIteratorTestTables';
13
15
  export * from './util/tables/tableManagerTestTables';
14
16
  export * from './util/tables/transactionTestTables';
15
17
  //# sourceMappingURL=index.d.ts.map