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