@proteinjs/db 1.29.3 → 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 +23 -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 +68 -0
  20. package/dist/src/MigrationRunner.d.ts.map +1 -1
  21. package/dist/src/MigrationRunner.js +153 -7
  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 +153 -7
  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)();
@@ -70,19 +71,157 @@ var MigrationRunner = /** @class */ (function () {
70
71
  */
71
72
  MigrationRunner.prototype.runMigration = function (id) {
72
73
  var migrationTable = new MigrationTable_1.MigrationTable();
73
- var migration = new SourceRecordRepo_1.SourceRecordRepo().getSourceRecord(migrationTable.name, id);
74
- if (!migration) {
75
- throw new Error("Unable to find migration source record for id: ".concat(id));
76
- }
77
- return this.runAndRecord(migrationTable, migration);
74
+ var migration = this.resolveMigration(migrationTable, id);
75
+ return this.runAndRecord(migrationTable, migration, Db_1.getDb);
76
+ };
77
+ /**
78
+ * Boot-path API: at server boot no user session exists, so `getDb()` (which `runMigration`
79
+ * records through) fail-closes on the migration table's doors. This method reads and records
80
+ * run state through `getDbAsSystem()` instead — it is the seam a future migrations-auto-run
81
+ * rides (deploy-coupled migrations call it during server startup).
82
+ *
83
+ * 'ensure' = idempotent: a row already in 'success' status is logged and skipped. A prior
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.
88
+ */
89
+ MigrationRunner.prototype.ensureMigrationRun = function (id) {
90
+ return __awaiter(this, void 0, void 0, function () {
91
+ var migrationTable, db, migrationRow, migration;
92
+ return __generator(this, function (_a) {
93
+ switch (_a.label) {
94
+ case 0:
95
+ migrationTable = new MigrationTable_1.MigrationTable();
96
+ db = (0, Db_1.getDbAsSystem)();
97
+ return [4 /*yield*/, db.get(migrationTable, { id: id })];
98
+ case 1:
99
+ migrationRow = _a.sent();
100
+ if ((migrationRow === null || migrationRow === void 0 ? void 0 : migrationRow.status) === 'success') {
101
+ this.logger.info({ message: "Migration (".concat(id, ") already applied, skipping") });
102
+ return [2 /*return*/, migrationRow];
103
+ }
104
+ migration = this.resolveMigration(migrationTable, id);
105
+ return [4 /*yield*/, this.runAndRecord(migrationTable, migration, function () { return db; })];
106
+ case 2:
107
+ _a.sent();
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];
211
+ }
212
+ });
213
+ });
78
214
  };
79
- MigrationRunner.prototype.runAndRecord = function (migrationTable, migration) {
215
+ // The db is taken as a provider, resolved inside this async body: on the service path,
216
+ // constructing the Db is itself run infrastructure — its failure must REJECT the detached
217
+ // promise, not throw synchronously from runMigration (only a bogus id may reach the client).
218
+ MigrationRunner.prototype.runAndRecord = function (migrationTable, migration, getRunDb) {
80
219
  return __awaiter(this, void 0, void 0, function () {
81
220
  var db, _a, error_1;
82
221
  return __generator(this, function (_b) {
83
222
  switch (_b.label) {
84
223
  case 0:
85
- db = (0, Db_1.getDb)();
224
+ db = getRunDb();
86
225
  migration.status = 'running';
87
226
  migration.startTime = (0, moment_1.moment)();
88
227
  return [4 /*yield*/, db.update(migrationTable, migration)];
@@ -123,6 +262,13 @@ var MigrationRunner = /** @class */ (function () {
123
262
  });
124
263
  });
125
264
  };
265
+ MigrationRunner.prototype.resolveMigration = function (migrationTable, id) {
266
+ var migration = new SourceRecordRepo_1.SourceRecordRepo().getSourceRecord(migrationTable.name, id);
267
+ if (!migration) {
268
+ throw new Error("Unable to find migration source record for id: ".concat(id));
269
+ }
270
+ return migration;
271
+ };
126
272
  MigrationRunner.prototype.duration = function (start, end) {
127
273
  var duration = moment_1.moment.duration(end.diff(start));
128
274
  var parts = [];
@@ -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"}