sensemaking 0.21.0 → 0.22.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 (139) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/chunk/group.d.cts +0 -2
  3. package/dist/cjs/chunk/group.d.ts +0 -2
  4. package/dist/cjs/chunk/group.js +25 -62
  5. package/dist/cjs/chunk/group.js.map +1 -1
  6. package/dist/cjs/chunk/index.d.cts +1 -1
  7. package/dist/cjs/chunk/index.d.ts +1 -1
  8. package/dist/cjs/chunk/index.js +3 -2
  9. package/dist/cjs/chunk/index.js.map +1 -1
  10. package/dist/cjs/chunk/parse.js +46 -29
  11. package/dist/cjs/chunk/parse.js.map +1 -1
  12. package/dist/cjs/chunk/tokens.d.cts +2 -0
  13. package/dist/cjs/chunk/tokens.d.ts +2 -0
  14. package/dist/cjs/chunk/tokens.js +50 -0
  15. package/dist/cjs/chunk/tokens.js.map +1 -0
  16. package/dist/cjs/commands/search.js +1 -1
  17. package/dist/cjs/commands/search.js.map +1 -1
  18. package/dist/cjs/config/validate.js.map +1 -1
  19. package/dist/cjs/index.d.cts +1 -1
  20. package/dist/cjs/index.d.ts +1 -1
  21. package/dist/cjs/index.js.map +1 -1
  22. package/dist/cjs/scan/pool.d.cts +1 -0
  23. package/dist/cjs/scan/pool.d.ts +1 -0
  24. package/dist/cjs/scan/pool.js +2 -1
  25. package/dist/cjs/scan/pool.js.map +1 -1
  26. package/dist/cjs/scan/reparse.d.cts +1 -0
  27. package/dist/cjs/scan/reparse.d.ts +1 -0
  28. package/dist/cjs/scan/reparse.js +6 -3
  29. package/dist/cjs/scan/reparse.js.map +1 -1
  30. package/dist/cjs/store/builder.d.cts +2 -0
  31. package/dist/cjs/store/builder.d.ts +2 -0
  32. package/dist/cjs/store/builder.js.map +1 -1
  33. package/dist/cjs/store/duckdb/connection.d.cts +4 -1
  34. package/dist/cjs/store/duckdb/connection.d.ts +4 -1
  35. package/dist/cjs/store/duckdb/connection.js +1 -0
  36. package/dist/cjs/store/duckdb/connection.js.map +1 -1
  37. package/dist/cjs/store/duckdb/reconcile.js +105 -1
  38. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  39. package/dist/cjs/store/index.d.cts +1 -5
  40. package/dist/cjs/store/index.d.ts +1 -5
  41. package/dist/cjs/store/index.js +9 -46
  42. package/dist/cjs/store/index.js.map +1 -1
  43. package/dist/cjs/store/lock-wait.d.cts +2 -0
  44. package/dist/cjs/store/lock-wait.d.ts +2 -0
  45. package/dist/cjs/store/lock-wait.js +51 -0
  46. package/dist/cjs/store/lock-wait.js.map +1 -0
  47. package/dist/cjs/store/open.d.cts +2 -4
  48. package/dist/cjs/store/open.d.ts +2 -4
  49. package/dist/cjs/store/open.js +29 -66
  50. package/dist/cjs/store/open.js.map +1 -1
  51. package/dist/cjs/store/reconcile.d.cts +3 -0
  52. package/dist/cjs/store/reconcile.d.ts +3 -0
  53. package/dist/cjs/store/reconcile.js +418 -226
  54. package/dist/cjs/store/reconcile.js.map +1 -1
  55. package/dist/cjs/store/sqlite/lexical.js +1 -1
  56. package/dist/cjs/store/sqlite/lexical.js.map +1 -1
  57. package/dist/cjs/store/sqlite/store.js +0 -1
  58. package/dist/cjs/store/sqlite/store.js.map +1 -1
  59. package/dist/cjs/store/stages.d.cts +18 -0
  60. package/dist/cjs/store/stages.d.ts +18 -0
  61. package/dist/cjs/store/stages.js +372 -0
  62. package/dist/cjs/store/stages.js.map +1 -0
  63. package/dist/cjs/store/turso/store.js.map +1 -1
  64. package/dist/cjs/store/types.d.cts +2 -1
  65. package/dist/cjs/store/types.d.ts +2 -1
  66. package/dist/cjs/store/types.js +0 -1
  67. package/dist/cjs/store/types.js.map +1 -1
  68. package/dist/cjs/text/segment.js +7 -5
  69. package/dist/cjs/text/segment.js.map +1 -1
  70. package/dist/cjs/watch.js +162 -107
  71. package/dist/cjs/watch.js.map +1 -1
  72. package/dist/cjs/workers/parse.d.cts +1 -0
  73. package/dist/cjs/workers/parse.d.ts +1 -0
  74. package/dist/cjs/workers/parse.js +4 -1
  75. package/dist/cjs/workers/parse.js.map +1 -1
  76. package/dist/esm/chunk/group.d.ts +0 -2
  77. package/dist/esm/chunk/group.js +14 -24
  78. package/dist/esm/chunk/group.js.map +1 -1
  79. package/dist/esm/chunk/index.d.ts +1 -1
  80. package/dist/esm/chunk/index.js +1 -1
  81. package/dist/esm/chunk/index.js.map +1 -1
  82. package/dist/esm/chunk/parse.js +41 -29
  83. package/dist/esm/chunk/parse.js.map +1 -1
  84. package/dist/esm/chunk/tokens.d.ts +2 -0
  85. package/dist/esm/chunk/tokens.js +15 -0
  86. package/dist/esm/chunk/tokens.js.map +1 -0
  87. package/dist/esm/commands/search.js +1 -1
  88. package/dist/esm/commands/search.js.map +1 -1
  89. package/dist/esm/config/validate.js +2 -2
  90. package/dist/esm/config/validate.js.map +1 -1
  91. package/dist/esm/index.d.ts +1 -1
  92. package/dist/esm/index.js.map +1 -1
  93. package/dist/esm/scan/pool.d.ts +1 -0
  94. package/dist/esm/scan/pool.js +2 -1
  95. package/dist/esm/scan/pool.js.map +1 -1
  96. package/dist/esm/scan/reparse.d.ts +1 -0
  97. package/dist/esm/scan/reparse.js +5 -2
  98. package/dist/esm/scan/reparse.js.map +1 -1
  99. package/dist/esm/store/builder.d.ts +2 -0
  100. package/dist/esm/store/builder.js.map +1 -1
  101. package/dist/esm/store/duckdb/connection.d.ts +4 -1
  102. package/dist/esm/store/duckdb/connection.js +1 -0
  103. package/dist/esm/store/duckdb/connection.js.map +1 -1
  104. package/dist/esm/store/duckdb/reconcile.js +34 -1
  105. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  106. package/dist/esm/store/index.d.ts +1 -5
  107. package/dist/esm/store/index.js +6 -28
  108. package/dist/esm/store/index.js.map +1 -1
  109. package/dist/esm/store/lock-wait.d.ts +2 -0
  110. package/dist/esm/store/lock-wait.js +36 -0
  111. package/dist/esm/store/lock-wait.js.map +1 -0
  112. package/dist/esm/store/open.d.ts +2 -4
  113. package/dist/esm/store/open.js +17 -32
  114. package/dist/esm/store/open.js.map +1 -1
  115. package/dist/esm/store/reconcile.d.ts +3 -0
  116. package/dist/esm/store/reconcile.js +77 -40
  117. package/dist/esm/store/reconcile.js.map +1 -1
  118. package/dist/esm/store/sqlite/lexical.js +1 -1
  119. package/dist/esm/store/sqlite/lexical.js.map +1 -1
  120. package/dist/esm/store/sqlite/store.js +0 -1
  121. package/dist/esm/store/sqlite/store.js.map +1 -1
  122. package/dist/esm/store/stages.d.ts +18 -0
  123. package/dist/esm/store/stages.js +63 -0
  124. package/dist/esm/store/stages.js.map +1 -0
  125. package/dist/esm/store/turso/store.js +1 -1
  126. package/dist/esm/store/turso/store.js.map +1 -1
  127. package/dist/esm/store/types.d.ts +2 -1
  128. package/dist/esm/store/types.js +0 -1
  129. package/dist/esm/store/types.js.map +1 -1
  130. package/dist/esm/text/segment.js +7 -5
  131. package/dist/esm/text/segment.js.map +1 -1
  132. package/dist/esm/watch.js +63 -38
  133. package/dist/esm/watch.js.map +1 -1
  134. package/dist/esm/workers/parse.d.ts +1 -0
  135. package/dist/esm/workers/parse.js +4 -1
  136. package/dist/esm/workers/parse.js.map +1 -1
  137. package/package.json +3 -3
  138. package/skills/sense/SKILL.md +1 -1
  139. package/skills/sense-setup/SKILL.md +1 -1
@@ -2,9 +2,17 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "reconcile", {
6
- enumerable: true,
7
- get: function() {
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get CORE_FRONTMATTER_COLUMNS () {
13
+ return CORE_FRONTMATTER_COLUMNS;
14
+ },
15
+ get reconcile () {
8
16
  return reconcile;
9
17
  }
10
18
  });
@@ -12,7 +20,9 @@ var _indexts = require("../features/index.js");
12
20
  var _progressts = require("../output/progress.js");
13
21
  var _indexts1 = require("../scan/index.js");
14
22
  var _reparsets = require("../scan/reparse.js");
23
+ var _lockwaitts = require("./lock-wait.js");
15
24
  var _sharedts = require("./shared.js");
25
+ var _stagests = require("./stages.js");
16
26
  var _transactionts = require("./transaction.js");
17
27
  function _array_like_to_array(arr, len) {
18
28
  if (len == null || len > arr.length) len = arr.length;
@@ -186,13 +196,6 @@ function _unsupported_iterable_to_array(o, minLen) {
186
196
  if (n === "Map" || n === "Set") return Array.from(n);
187
197
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
188
198
  }
189
- // One reconcile algorithm shared by every store, parameterised by a per-engine ReconcileDialect
190
- // (types.ts). Ordering is universal, not a dialect concern: ALTER, then the frontmatter upsert,
191
- // then reconcileContent, then preset_files, then the vanished-frontmatter delete, then feature hooks
192
- // -- a vanished path's content delete (inside reconcileContent) must precede its frontmatter
193
- // delete, since sqlite's delete SQL resolves the row via its frontmatter rowid.
194
- // Feature-owned columns (`_rank`) must stay out of the upsert: a reparse would null the last
195
- // computed value on every touch, not just the reconciles that recompute it.
196
199
  var CORE_FRONTMATTER_COLUMNS = new Set([
197
200
  'path',
198
201
  '_mtime',
@@ -202,23 +205,56 @@ var CORE_FRONTMATTER_COLUMNS = new Set([
202
205
  ]);
203
206
  function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
204
207
  return _async_to_generator(function() {
205
- var files, currentSet, existingStmt, existingRows, existing, vanished, toReparse, features, seenColumns, report, _ref, parsedDocs, warnings, newColumns, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, col, allColumns, writableColumns, insertSql, added, delta, addedSet, reparsedExisting, touched, txStart, durationMs;
208
+ var start, features, stages, elapsed, files, currentSet, existingRows, existing, vanished, toReparse, seenColumns, report, _ref, parsedDocs, warnings, newColumns, workerParseMs, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, col, allColumns, writableColumns, insertSql, added, delta, addedSet, reparsedExisting, touched, txStart, durationMs;
206
209
  return _ts_generator(this, function(_state) {
207
210
  switch(_state.label){
208
211
  case 0:
209
- files = (0, _indexts1.listFiles)(cfg, baseDir);
210
- currentSet = new Set(files.map(function(f) {
211
- return f.relPath;
212
+ start = process.hrtime.bigint();
213
+ features = (0, _indexts.activeFeatures)(cfg);
214
+ stages = (0, _stagests.stageRecorder)(features.map(function(f) {
215
+ return f.name;
212
216
  }));
217
+ elapsed = function elapsed() {
218
+ return Number(process.hrtime.bigint() - start) / 1e6;
219
+ };
213
220
  return [
214
221
  4,
215
- conn.prepare('SELECT "path", "_mtime", "_size" FROM frontmatter')
222
+ stages.time('list', function() {
223
+ return (0, _indexts1.listFiles)(cfg, baseDir);
224
+ })
216
225
  ];
217
226
  case 1:
218
- existingStmt = _state.sent();
227
+ files = _state.sent();
228
+ currentSet = new Set(files.map(function(f) {
229
+ return f.relPath;
230
+ }));
219
231
  return [
220
232
  4,
221
- existingStmt.all()
233
+ stages.time('existing', function() {
234
+ return _async_to_generator(function() {
235
+ var existingStmt;
236
+ return _ts_generator(this, function(_state) {
237
+ switch(_state.label){
238
+ case 0:
239
+ return [
240
+ 4,
241
+ conn.prepare('SELECT "path", "_mtime", "_size" FROM frontmatter')
242
+ ];
243
+ case 1:
244
+ existingStmt = _state.sent();
245
+ return [
246
+ 4,
247
+ existingStmt.all()
248
+ ];
249
+ case 2:
250
+ return [
251
+ 2,
252
+ _state.sent()
253
+ ];
254
+ }
255
+ });
256
+ })();
257
+ })
222
258
  ];
223
259
  case 2:
224
260
  existingRows = _state.sent();
@@ -247,10 +283,10 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
247
283
  2,
248
284
  {
249
285
  parsed: 0,
250
- warnings: []
286
+ warnings: [],
287
+ stages: stages.take(elapsed(), 0)
251
288
  }
252
289
  ];
253
- features = (0, _indexts.activeFeatures)(cfg);
254
290
  return [
255
291
  4,
256
292
  (0, _sharedts.getColumns)(conn)
@@ -262,12 +298,14 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
262
298
  report = (0, _progressts.progress)('reparsing files', toReparse.length);
263
299
  return [
264
300
  4,
265
- (0, _reparsets.reparseFiles)(toReparse, features, cfg, seenColumns, report.tick, {
266
- pool: pool
301
+ stages.time('parse', function() {
302
+ return (0, _reparsets.reparseFiles)(toReparse, features, cfg, seenColumns, report.tick, {
303
+ pool: pool
304
+ });
267
305
  })
268
306
  ];
269
307
  case 4:
270
- _ref = _state.sent(), parsedDocs = _ref.docs, warnings = _ref.warnings, newColumns = _ref.newColumns;
308
+ _ref = _state.sent(), parsedDocs = _ref.docs, warnings = _ref.warnings, newColumns = _ref.newColumns, workerParseMs = _ref.workerParseMs;
271
309
  report.finish();
272
310
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
273
311
  try {
@@ -334,7 +372,7 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
334
372
  4,
335
373
  (0, _transactionts.withTransaction)(conn, function() {
336
374
  return _async_to_generator(function() {
337
- var _feature_remove, _feature_afterReconcile, present, missingColumns, contentTouched, currentPathsStmt, currentPaths, _, staleAdded, rows, presetRows, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator, _step, doc, _iterator1, _step1, presetName, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, feature, err, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _loop, _iterator3, _step3, err, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, feature1, err;
375
+ var present, missingColumns, contentTouched, toRow, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, err, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _loop1, _iterator1, _step1, err, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _loop2, _iterator2, _step2, err;
338
376
  return _ts_generator(this, function(_state) {
339
377
  switch(_state.label){
340
378
  case 0:
@@ -353,7 +391,9 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
353
391
  ];
354
392
  return [
355
393
  4,
356
- dialect.addColumns(conn, missingColumns)
394
+ stages.time('alter', function() {
395
+ return dialect.addColumns(conn, missingColumns);
396
+ })
357
397
  ];
358
398
  case 2:
359
399
  _state.sent();
@@ -367,37 +407,55 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
367
407
  contentTouched = touched;
368
408
  if (!(added.length > 0)) return [
369
409
  3,
370
- 6
410
+ 5
371
411
  ];
372
412
  return [
373
413
  4,
374
- conn.prepare('SELECT "path" FROM frontmatter')
414
+ stages.time('added-recheck', function() {
415
+ return _async_to_generator(function() {
416
+ var currentPathsStmt, currentPaths, _, staleAdded;
417
+ return _ts_generator(this, function(_state) {
418
+ switch(_state.label){
419
+ case 0:
420
+ return [
421
+ 4,
422
+ conn.prepare('SELECT "path" FROM frontmatter')
423
+ ];
424
+ case 1:
425
+ currentPathsStmt = _state.sent();
426
+ _ = Set.bind;
427
+ return [
428
+ 4,
429
+ currentPathsStmt.all()
430
+ ];
431
+ case 2:
432
+ currentPaths = new (_.apply(Set, [
433
+ void 0,
434
+ _state.sent().map(function(r) {
435
+ return r.path;
436
+ })
437
+ ]));
438
+ staleAdded = added.filter(function(p) {
439
+ return currentPaths.has(p);
440
+ });
441
+ return [
442
+ 2,
443
+ staleAdded.length > 0 ? _to_consumable_array(touched).concat(_to_consumable_array(staleAdded)) : touched
444
+ ];
445
+ }
446
+ });
447
+ })();
448
+ })
375
449
  ];
376
450
  case 4:
377
- currentPathsStmt = _state.sent();
378
- _ = Set.bind;
379
- return [
380
- 4,
381
- currentPathsStmt.all()
382
- ];
451
+ contentTouched = _state.sent();
452
+ _state.label = 5;
383
453
  case 5:
384
- currentPaths = new (_.apply(Set, [
385
- void 0,
386
- _state.sent().map(function(r) {
387
- return r.path;
388
- })
389
- ]));
390
- staleAdded = added.filter(function(p) {
391
- return currentPaths.has(p);
392
- });
393
- if (staleAdded.length > 0) contentTouched = _to_consumable_array(touched).concat(_to_consumable_array(staleAdded));
394
- _state.label = 6;
395
- case 6:
396
454
  if (!(parsedDocs.length > 0)) return [
397
455
  3,
398
- 8
456
+ 7
399
457
  ];
400
- rows = parsedDocs.map(function(doc) {
458
+ toRow = function toRow(doc) {
401
459
  return writableColumns.map(function(col) {
402
460
  var _doc_data_col;
403
461
  if (col === 'path') return doc.relPath;
@@ -408,185 +466,290 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
408
466
  if (col === '_parse_error') return doc.parseError;
409
467
  return (_doc_data_col = doc.data[col]) !== null && _doc_data_col !== void 0 ? _doc_data_col : null;
410
468
  });
411
- });
469
+ };
470
+ // A path in `added` has no existing frontmatter row, so it can never conflict: where a
471
+ // dialect offers a faster append-only path (insertNew), only the rest go through the upsert.
412
472
  return [
413
473
  4,
414
- conn.runBatch(insertSql, rows)
474
+ stages.time('fm-upsert', function() {
475
+ return _async_to_generator(function() {
476
+ var newDocs, updateDocs;
477
+ return _ts_generator(this, function(_state) {
478
+ switch(_state.label){
479
+ case 0:
480
+ if (!dialect.insertNew) return [
481
+ 3,
482
+ 5
483
+ ];
484
+ newDocs = parsedDocs.filter(function(d) {
485
+ return addedSet.has(d.relPath);
486
+ });
487
+ updateDocs = parsedDocs.filter(function(d) {
488
+ return !addedSet.has(d.relPath);
489
+ });
490
+ if (!(newDocs.length > 0)) return [
491
+ 3,
492
+ 2
493
+ ];
494
+ return [
495
+ 4,
496
+ dialect.insertNew(conn, 'frontmatter', writableColumns, newDocs.map(toRow))
497
+ ];
498
+ case 1:
499
+ _state.sent();
500
+ _state.label = 2;
501
+ case 2:
502
+ if (!(updateDocs.length > 0)) return [
503
+ 3,
504
+ 4
505
+ ];
506
+ return [
507
+ 4,
508
+ conn.runBatch(insertSql, updateDocs.map(toRow))
509
+ ];
510
+ case 3:
511
+ _state.sent();
512
+ _state.label = 4;
513
+ case 4:
514
+ return [
515
+ 3,
516
+ 7
517
+ ];
518
+ case 5:
519
+ return [
520
+ 4,
521
+ conn.runBatch(insertSql, parsedDocs.map(toRow))
522
+ ];
523
+ case 6:
524
+ _state.sent();
525
+ _state.label = 7;
526
+ case 7:
527
+ return [
528
+ 2
529
+ ];
530
+ }
531
+ });
532
+ })();
533
+ })
415
534
  ];
416
- case 7:
535
+ case 6:
417
536
  _state.sent();
418
- _state.label = 8;
419
- case 8:
537
+ _state.label = 7;
538
+ case 7:
420
539
  // After the upsert, so every doc already has the frontmatter row sqlite's content rowid
421
540
  // couples to. ON CONFLICT DO UPDATE preserves that rowid, so a reparse keeps its identity.
422
541
  return [
423
542
  4,
424
- dialect.reconcileContent(conn, contentTouched, parsedDocs, delta, cfg)
543
+ stages.time('text-index', function() {
544
+ return dialect.reconcileContent(conn, contentTouched, parsedDocs, delta, cfg);
545
+ })
546
+ ];
547
+ case 8:
548
+ _state.sent();
549
+ // A preset edit forces a full rebuild, so an unchanged doc's coverage is already correct;
550
+ // new docs have nothing to clear, which keeps cold builds linear.
551
+ return [
552
+ 4,
553
+ stages.time('presets', function() {
554
+ return _async_to_generator(function() {
555
+ var presetRows, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator, _step, doc, _iterator1, _step1, presetName;
556
+ return _ts_generator(this, function(_state) {
557
+ switch(_state.label){
558
+ case 0:
559
+ if (!(touched.length > 0)) return [
560
+ 3,
561
+ 2
562
+ ];
563
+ return [
564
+ 4,
565
+ conn.runBatch('DELETE FROM preset_files WHERE "path" = ?', touched.map(function(p) {
566
+ return [
567
+ p
568
+ ];
569
+ }))
570
+ ];
571
+ case 1:
572
+ _state.sent();
573
+ _state.label = 2;
574
+ case 2:
575
+ presetRows = [];
576
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined, _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
577
+ try {
578
+ for(_iterator = parsedDocs[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step = _iterator.next()).done); _iteratorNormalCompletion1 = true){
579
+ doc = _step.value;
580
+ try {
581
+ for(_iterator1 = doc.presets[Symbol.iterator](); !(_iteratorNormalCompletion = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion = true){
582
+ presetName = _step1.value;
583
+ presetRows.push([
584
+ doc.relPath,
585
+ presetName
586
+ ]);
587
+ }
588
+ } catch (err) {
589
+ _didIteratorError = true;
590
+ _iteratorError = err;
591
+ } finally{
592
+ try {
593
+ if (!_iteratorNormalCompletion && _iterator1.return != null) {
594
+ _iterator1.return();
595
+ }
596
+ } finally{
597
+ if (_didIteratorError) {
598
+ throw _iteratorError;
599
+ }
600
+ }
601
+ }
602
+ }
603
+ } catch (err) {
604
+ _didIteratorError1 = true;
605
+ _iteratorError1 = err;
606
+ } finally{
607
+ try {
608
+ if (!_iteratorNormalCompletion1 && _iterator.return != null) {
609
+ _iterator.return();
610
+ }
611
+ } finally{
612
+ if (_didIteratorError1) {
613
+ throw _iteratorError1;
614
+ }
615
+ }
616
+ }
617
+ if (!(presetRows.length > 0)) return [
618
+ 3,
619
+ 4
620
+ ];
621
+ return [
622
+ 4,
623
+ conn.runBatch('INSERT INTO preset_files ("path", preset) VALUES (?, ?) ON CONFLICT("path", preset) DO NOTHING', presetRows)
624
+ ];
625
+ case 3:
626
+ _state.sent();
627
+ _state.label = 4;
628
+ case 4:
629
+ return [
630
+ 2
631
+ ];
632
+ }
633
+ });
634
+ })();
635
+ })
425
636
  ];
426
637
  case 9:
427
638
  _state.sent();
428
- if (!(touched.length > 0)) return [
639
+ if (!(vanished.length > 0)) return [
429
640
  3,
430
641
  11
431
642
  ];
432
643
  return [
433
644
  4,
434
- conn.runBatch('DELETE FROM preset_files WHERE "path" = ?', touched.map(function(p) {
435
- return [
436
- p
437
- ];
438
- }))
645
+ stages.time('vanished', function() {
646
+ return conn.runBatch('DELETE FROM frontmatter WHERE "path" = ?', vanished.map(function(p) {
647
+ return [
648
+ p
649
+ ];
650
+ }));
651
+ })
439
652
  ];
440
653
  case 10:
441
654
  _state.sent();
442
655
  _state.label = 11;
443
656
  case 11:
444
- presetRows = [];
445
- _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined, _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
446
- try {
447
- for(_iterator = parsedDocs[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step = _iterator.next()).done); _iteratorNormalCompletion1 = true){
448
- doc = _step.value;
449
- try {
450
- for(_iterator1 = doc.presets[Symbol.iterator](); !(_iteratorNormalCompletion = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion = true){
451
- presetName = _step1.value;
452
- presetRows.push([
453
- doc.relPath,
454
- presetName
455
- ]);
456
- }
457
- } catch (err) {
458
- _didIteratorError = true;
459
- _iteratorError = err;
460
- } finally{
461
- try {
462
- if (!_iteratorNormalCompletion && _iterator1.return != null) {
463
- _iterator1.return();
464
- }
465
- } finally{
466
- if (_didIteratorError) {
467
- throw _iteratorError;
468
- }
469
- }
470
- }
471
- }
472
- } catch (err) {
473
- _didIteratorError1 = true;
474
- _iteratorError1 = err;
475
- } finally{
476
- try {
477
- if (!_iteratorNormalCompletion1 && _iterator.return != null) {
478
- _iterator.return();
479
- }
480
- } finally{
481
- if (_didIteratorError1) {
482
- throw _iteratorError1;
483
- }
484
- }
485
- }
486
- if (!(presetRows.length > 0)) return [
657
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
658
+ if (!(touched.length > 0)) return [
487
659
  3,
488
- 13
489
- ];
490
- return [
491
- 4,
492
- conn.runBatch('INSERT INTO preset_files ("path", preset) VALUES (?, ?) ON CONFLICT("path", preset) DO NOTHING', presetRows)
660
+ 19
493
661
  ];
662
+ _state.label = 12;
494
663
  case 12:
495
- _state.sent();
664
+ _state.trys.push([
665
+ 12,
666
+ 17,
667
+ 18,
668
+ 19
669
+ ]);
670
+ _loop = function() {
671
+ var feature;
672
+ return _ts_generator(this, function(_state) {
673
+ switch(_state.label){
674
+ case 0:
675
+ feature = _step.value;
676
+ return [
677
+ 4,
678
+ stages.time((0, _stagests.featureStage)(feature.name, 'remove'), function() {
679
+ var _feature_remove;
680
+ return (_feature_remove = feature.remove) === null || _feature_remove === void 0 ? void 0 : _feature_remove.call(feature, conn, touched, delta);
681
+ })
682
+ ];
683
+ case 1:
684
+ _state.sent();
685
+ return [
686
+ 2
687
+ ];
688
+ }
689
+ });
690
+ };
691
+ _iterator = features[Symbol.iterator]();
496
692
  _state.label = 13;
497
693
  case 13:
498
- if (!(vanished.length > 0)) return [
694
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
499
695
  3,
500
- 15
696
+ 16
501
697
  ];
502
698
  return [
503
- 4,
504
- conn.runBatch('DELETE FROM frontmatter WHERE "path" = ?', vanished.map(function(p) {
505
- return [
506
- p
507
- ];
508
- }))
699
+ 5,
700
+ _ts_values(_loop())
509
701
  ];
510
702
  case 14:
511
703
  _state.sent();
512
704
  _state.label = 15;
513
705
  case 15:
514
- _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
515
- if (!(touched.length > 0)) return [
516
- 3,
517
- 23
518
- ];
519
- _state.label = 16;
520
- case 16:
521
- _state.trys.push([
522
- 16,
523
- 21,
524
- 22,
525
- 23
526
- ]);
527
- _iterator2 = features[Symbol.iterator]();
528
- _state.label = 17;
529
- case 17:
530
- if (!!(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done)) return [
531
- 3,
532
- 20
533
- ];
534
- feature = _step2.value;
535
- return [
536
- 4,
537
- (_feature_remove = feature.remove) === null || _feature_remove === void 0 ? void 0 : _feature_remove.call(feature, conn, touched, delta)
538
- ];
539
- case 18:
540
- _state.sent();
541
- _state.label = 19;
542
- case 19:
543
- _iteratorNormalCompletion2 = true;
706
+ _iteratorNormalCompletion = true;
544
707
  return [
545
708
  3,
546
- 17
709
+ 13
547
710
  ];
548
- case 20:
711
+ case 16:
549
712
  return [
550
713
  3,
551
- 23
714
+ 19
552
715
  ];
553
- case 21:
716
+ case 17:
554
717
  err = _state.sent();
555
- _didIteratorError2 = true;
556
- _iteratorError2 = err;
718
+ _didIteratorError = true;
719
+ _iteratorError = err;
557
720
  return [
558
721
  3,
559
- 23
722
+ 19
560
723
  ];
561
- case 22:
724
+ case 18:
562
725
  try {
563
- if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
564
- _iterator2.return();
726
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
727
+ _iterator.return();
565
728
  }
566
729
  } finally{
567
- if (_didIteratorError2) {
568
- throw _iteratorError2;
730
+ if (_didIteratorError) {
731
+ throw _iteratorError;
569
732
  }
570
733
  }
571
734
  return [
572
735
  7
573
736
  ];
574
- case 23:
575
- _iteratorNormalCompletion3 = true, _didIteratorError3 = false, _iteratorError3 = undefined;
576
- _state.label = 24;
577
- case 24:
737
+ case 19:
738
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
739
+ _state.label = 20;
740
+ case 20:
578
741
  _state.trys.push([
579
- 24,
580
- 29,
581
- 30,
582
- 31
742
+ 20,
743
+ 25,
744
+ 26,
745
+ 27
583
746
  ]);
584
- _loop = function() {
585
- var feature, _feature_store, docsForFeature;
747
+ _loop1 = function() {
748
+ var feature, docsForFeature;
586
749
  return _ts_generator(this, function(_state) {
587
750
  switch(_state.label){
588
751
  case 0:
589
- feature = _step3.value;
752
+ feature = _step1.value;
590
753
  docsForFeature = parsedDocs.map(function(doc) {
591
754
  return {
592
755
  path: doc.relPath,
@@ -595,7 +758,10 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
595
758
  });
596
759
  return [
597
760
  4,
598
- (_feature_store = feature.store) === null || _feature_store === void 0 ? void 0 : _feature_store.call(feature, conn, docsForFeature, delta)
761
+ stages.time((0, _stagests.featureStage)(feature.name, 'store'), function() {
762
+ var _feature_store;
763
+ return (_feature_store = feature.store) === null || _feature_store === void 0 ? void 0 : _feature_store.call(feature, conn, docsForFeature, delta);
764
+ })
599
765
  ];
600
766
  case 1:
601
767
  _state.sent();
@@ -605,110 +771,130 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
605
771
  }
606
772
  });
607
773
  };
608
- _iterator3 = features[Symbol.iterator]();
609
- _state.label = 25;
610
- case 25:
611
- if (!!(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done)) return [
774
+ _iterator1 = features[Symbol.iterator]();
775
+ _state.label = 21;
776
+ case 21:
777
+ if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
612
778
  3,
613
- 28
779
+ 24
614
780
  ];
615
781
  return [
616
782
  5,
617
- _ts_values(_loop())
783
+ _ts_values(_loop1())
618
784
  ];
619
- case 26:
785
+ case 22:
620
786
  _state.sent();
621
- _state.label = 27;
622
- case 27:
623
- _iteratorNormalCompletion3 = true;
787
+ _state.label = 23;
788
+ case 23:
789
+ _iteratorNormalCompletion1 = true;
624
790
  return [
625
791
  3,
626
- 25
792
+ 21
627
793
  ];
628
- case 28:
794
+ case 24:
629
795
  return [
630
796
  3,
631
- 31
797
+ 27
632
798
  ];
633
- case 29:
799
+ case 25:
634
800
  err = _state.sent();
635
- _didIteratorError3 = true;
636
- _iteratorError3 = err;
801
+ _didIteratorError1 = true;
802
+ _iteratorError1 = err;
637
803
  return [
638
804
  3,
639
- 31
805
+ 27
640
806
  ];
641
- case 30:
807
+ case 26:
642
808
  try {
643
- if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
644
- _iterator3.return();
809
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
810
+ _iterator1.return();
645
811
  }
646
812
  } finally{
647
- if (_didIteratorError3) {
648
- throw _iteratorError3;
813
+ if (_didIteratorError1) {
814
+ throw _iteratorError1;
649
815
  }
650
816
  }
651
817
  return [
652
818
  7
653
819
  ];
654
- case 31:
655
- _iteratorNormalCompletion4 = true, _didIteratorError4 = false, _iteratorError4 = undefined;
656
- _state.label = 32;
657
- case 32:
820
+ case 27:
821
+ _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
822
+ _state.label = 28;
823
+ case 28:
658
824
  _state.trys.push([
659
- 32,
660
- 37,
661
- 38,
662
- 39
825
+ 28,
826
+ 33,
827
+ 34,
828
+ 35
663
829
  ]);
664
- _iterator4 = features[Symbol.iterator]();
665
- _state.label = 33;
666
- case 33:
667
- if (!!(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done)) return [
830
+ _loop2 = function() {
831
+ var feature;
832
+ return _ts_generator(this, function(_state) {
833
+ switch(_state.label){
834
+ case 0:
835
+ feature = _step2.value;
836
+ return [
837
+ 4,
838
+ stages.time((0, _stagests.featureStage)(feature.name, 'after'), function() {
839
+ var _feature_afterReconcile;
840
+ return (_feature_afterReconcile = feature.afterReconcile) === null || _feature_afterReconcile === void 0 ? void 0 : _feature_afterReconcile.call(feature, conn, delta);
841
+ })
842
+ ];
843
+ case 1:
844
+ _state.sent();
845
+ return [
846
+ 2
847
+ ];
848
+ }
849
+ });
850
+ };
851
+ _iterator2 = features[Symbol.iterator]();
852
+ _state.label = 29;
853
+ case 29:
854
+ if (!!(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done)) return [
668
855
  3,
669
- 36
856
+ 32
670
857
  ];
671
- feature1 = _step4.value;
672
858
  return [
673
- 4,
674
- (_feature_afterReconcile = feature1.afterReconcile) === null || _feature_afterReconcile === void 0 ? void 0 : _feature_afterReconcile.call(feature1, conn, delta)
859
+ 5,
860
+ _ts_values(_loop2())
675
861
  ];
676
- case 34:
862
+ case 30:
677
863
  _state.sent();
678
- _state.label = 35;
679
- case 35:
680
- _iteratorNormalCompletion4 = true;
864
+ _state.label = 31;
865
+ case 31:
866
+ _iteratorNormalCompletion2 = true;
681
867
  return [
682
868
  3,
683
- 33
869
+ 29
684
870
  ];
685
- case 36:
871
+ case 32:
686
872
  return [
687
873
  3,
688
- 39
874
+ 35
689
875
  ];
690
- case 37:
876
+ case 33:
691
877
  err = _state.sent();
692
- _didIteratorError4 = true;
693
- _iteratorError4 = err;
878
+ _didIteratorError2 = true;
879
+ _iteratorError2 = err;
694
880
  return [
695
881
  3,
696
- 39
882
+ 35
697
883
  ];
698
- case 38:
884
+ case 34:
699
885
  try {
700
- if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
701
- _iterator4.return();
886
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
887
+ _iterator2.return();
702
888
  }
703
889
  } finally{
704
- if (_didIteratorError4) {
705
- throw _iteratorError4;
890
+ if (_didIteratorError2) {
891
+ throw _iteratorError2;
706
892
  }
707
893
  }
708
894
  return [
709
895
  7
710
896
  ];
711
- case 39:
897
+ case 35:
712
898
  return [
713
899
  2
714
900
  ];
@@ -720,13 +906,18 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
720
906
  case 5:
721
907
  _state.sent();
722
908
  durationMs = Date.now() - txStart;
909
+ // Every store, not just the ones with a PRAGMA to derive: connectUnlocked's lock-wait budget needs it too.
910
+ (0, _lockwaitts.recordLockWaitMs)(baseDir, durationMs);
723
911
  if (!dialect.recordDuration) return [
724
912
  3,
725
913
  7
726
914
  ];
727
915
  return [
728
916
  4,
729
- dialect.recordDuration(conn, durationMs)
917
+ stages.time('meta', function() {
918
+ var _dialect_recordDuration;
919
+ return (_dialect_recordDuration = dialect.recordDuration) === null || _dialect_recordDuration === void 0 ? void 0 : _dialect_recordDuration.call(dialect, conn, durationMs);
920
+ })
730
921
  ];
731
922
  case 6:
732
923
  _state.sent();
@@ -736,7 +927,8 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
736
927
  2,
737
928
  {
738
929
  parsed: parsedDocs.length,
739
- warnings: warnings
930
+ warnings: warnings,
931
+ stages: stages.take(elapsed(), durationMs, workerParseMs)
740
932
  }
741
933
  ];
742
934
  }