refactor: extract filename via lastIndexOf instead of split/pop#13263
refactor: extract filename via lastIndexOf instead of split/pop#13263huang47 wants to merge 6 commits into
Conversation
🎨 Storybook: 🚧 Building...🎭 Playwright: ✅ 1689 passed, 0 failed · 2 flaky📊 Browser Reports
📦 Bundle: 7.76 MB gzipDetailsSummary
Category Glance App Entry Points — 47.3 kBMain entry bundles and manifests
Status: 1 added Graph Workspace — 1.25 MBGraph editor runtime, canvas, workflow orchestration
Status: 1 added Views & Navigation — 97.7 kBTop-level views, pages, and routed surfaces
Status: 12 added Panels & Settings — 546 kBConfiguration panels, inspectors, and settings screens
Status: 27 added User & Accounts — 26.9 kBAuthentication, profile, and account management bundles
Status: 10 added Editors & Dialogs — 117 kBModals, dialogs, drawers, and in-app editors
Status: 5 added UI Components — 57.2 kBReusable component library chunks
Status: 13 added Data & Services — 269 kBStores, services, APIs, and repositories
Status: 16 added Utilities & Hooks — 3.36 MBHelpers, composables, and utility bundles
Status: 32 added Vendor & Third-Party — 15.3 MBExternal libraries and shared vendor chunks
Status: 16 added Other — 11.7 MBBundles that do not match a named category
Status: 165 added ⚡ Performance Report
Absolute values
Raw data{
"timestamp": "2026-06-30T06:24:05.320Z",
"gitSha": "5e1f192da3145b34d544525e455c1460761c4610",
"branch": "shihchi/refactor-string-extraction",
"measurements": [
{
"name": "canvas-idle",
"durationMs": 2039.7690000000068,
"styleRecalcs": 9,
"styleRecalcDurationMs": 7.935000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 400.111,
"heapDeltaBytes": -2311620,
"heapUsedBytes": 56387428,
"domNodes": 18,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 22.630999999999997,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-idle",
"durationMs": 2039.6029999999996,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.708,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 429.76399999999995,
"heapDeltaBytes": 1337072,
"heapUsedBytes": 58086556,
"domNodes": 18,
"jsHeapTotalBytes": 18350080,
"scriptDurationMs": 24.653000000000002,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1859.2879999999923,
"styleRecalcs": 73,
"styleRecalcDurationMs": 39.269999999999996,
"layouts": 12,
"layoutDurationMs": 3.5770000000000004,
"taskDurationMs": 853.715,
"heapDeltaBytes": -6662732,
"heapUsedBytes": 52057684,
"domNodes": 55,
"jsHeapTotalBytes": 24903680,
"scriptDurationMs": 131.358,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-mouse-sweep",
"durationMs": 1776.7640000000142,
"styleRecalcs": 72,
"styleRecalcDurationMs": 34.603,
"layouts": 12,
"layoutDurationMs": 3.0889999999999995,
"taskDurationMs": 752.87,
"heapDeltaBytes": -7062220,
"heapUsedBytes": 51749944,
"domNodes": 54,
"jsHeapTotalBytes": 25165824,
"scriptDurationMs": 124.77799999999999,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1721.9780000000355,
"styleRecalcs": 32,
"styleRecalcDurationMs": 17.647999999999996,
"layouts": 6,
"layoutDurationMs": 0.5889999999999999,
"taskDurationMs": 331.254,
"heapDeltaBytes": 1883292,
"heapUsedBytes": 60639148,
"domNodes": 78,
"jsHeapTotalBytes": 26214400,
"scriptDurationMs": 23.555,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "canvas-zoom-sweep",
"durationMs": 1722.0869999999877,
"styleRecalcs": 32,
"styleRecalcDurationMs": 17.903999999999996,
"layouts": 6,
"layoutDurationMs": 0.619,
"taskDurationMs": 336.036,
"heapDeltaBytes": 1917248,
"heapUsedBytes": 60701428,
"domNodes": 78,
"jsHeapTotalBytes": 25427968,
"scriptDurationMs": 25.687,
"eventListeners": 19,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "dom-widget-clipping",
"durationMs": 653.8999999999646,
"styleRecalcs": 10,
"styleRecalcDurationMs": 8.760000000000002,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 408.2710000000001,
"heapDeltaBytes": 7539048,
"heapUsedBytes": 66278092,
"domNodes": 16,
"jsHeapTotalBytes": 19136512,
"scriptDurationMs": 65.84899999999999,
"eventListeners": 2,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "dom-widget-clipping",
"durationMs": 576.1119999999664,
"styleRecalcs": 13,
"styleRecalcDurationMs": 9.397,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 347.357,
"heapDeltaBytes": 7410096,
"heapUsedBytes": 66116496,
"domNodes": 22,
"jsHeapTotalBytes": 18874368,
"scriptDurationMs": 60.869,
"eventListeners": 0,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666682,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-idle",
"durationMs": 2022.90899999997,
"styleRecalcs": 9,
"styleRecalcDurationMs": 10.116,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 620.9720000000001,
"heapDeltaBytes": -9620656,
"heapUsedBytes": 62195396,
"domNodes": 18,
"jsHeapTotalBytes": 9580544,
"scriptDurationMs": 113.453,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-idle",
"durationMs": 2043.5109999999668,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.100999999999997,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 598.1229999999999,
"heapDeltaBytes": -9526568,
"heapUsedBytes": 62214940,
"domNodes": 18,
"jsHeapTotalBytes": 11677696,
"scriptDurationMs": 110.10400000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-pan",
"durationMs": 2128.6079999999856,
"styleRecalcs": 70,
"styleRecalcDurationMs": 20.322000000000003,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1166.5390000000002,
"heapDeltaBytes": 10811512,
"heapUsedBytes": 83833932,
"domNodes": 18,
"jsHeapTotalBytes": 11329536,
"scriptDurationMs": 410.749,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "large-graph-pan",
"durationMs": 2176.7620000000534,
"styleRecalcs": 70,
"styleRecalcDurationMs": 20.945999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 1198.536,
"heapDeltaBytes": 11366344,
"heapUsedBytes": 84151244,
"domNodes": 18,
"jsHeapTotalBytes": 10543104,
"scriptDurationMs": 430.701,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333335,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "large-graph-zoom",
"durationMs": 3136.91799999998,
"styleRecalcs": 66,
"styleRecalcDurationMs": 19.808,
"layouts": 60,
"layoutDurationMs": 7.802,
"taskDurationMs": 1336.47,
"heapDeltaBytes": 13899960,
"heapUsedBytes": 68900572,
"domNodes": 14,
"jsHeapTotalBytes": 6553600,
"scriptDurationMs": 495.05400000000003,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "large-graph-zoom",
"durationMs": 3168.1219999999257,
"styleRecalcs": 65,
"styleRecalcDurationMs": 25.167,
"layouts": 60,
"layoutDurationMs": 8.203,
"taskDurationMs": 1411.712,
"heapDeltaBytes": 15993100,
"heapUsedBytes": 71660168,
"domNodes": 12,
"jsHeapTotalBytes": 6291456,
"scriptDurationMs": 512.295,
"eventListeners": 8,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "minimap-idle",
"durationMs": 2020.6959999999867,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.717,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 557.137,
"heapDeltaBytes": -9285616,
"heapUsedBytes": 63849440,
"domNodes": 18,
"jsHeapTotalBytes": 8007680,
"scriptDurationMs": 107.66,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "minimap-idle",
"durationMs": 2004.666000000043,
"styleRecalcs": 9,
"styleRecalcDurationMs": 9.312000000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 580.0970000000001,
"heapDeltaBytes": 10670288,
"heapUsedBytes": 71928788,
"domNodes": 18,
"jsHeapTotalBytes": 5767168,
"scriptDurationMs": 107.73100000000001,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66999999999998,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 580.3869999999733,
"styleRecalcs": 47,
"styleRecalcDurationMs": 11.783,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 366.31100000000004,
"heapDeltaBytes": 7836828,
"heapUsedBytes": 66793064,
"domNodes": 20,
"jsHeapTotalBytes": 18350080,
"scriptDurationMs": 119.652,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-dom-widget-clipping",
"durationMs": 576.8199999999979,
"styleRecalcs": 47,
"styleRecalcDurationMs": 12.573999999999998,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 389.18399999999997,
"heapDeltaBytes": 8409028,
"heapUsedBytes": 67189240,
"domNodes": 20,
"jsHeapTotalBytes": 19922944,
"scriptDurationMs": 125.05,
"eventListeners": 6,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1997.1869999999967,
"styleRecalcs": 10,
"styleRecalcDurationMs": 9.117,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 352.60999999999996,
"heapDeltaBytes": -2200120,
"heapUsedBytes": 56900376,
"domNodes": 20,
"jsHeapTotalBytes": 26476544,
"scriptDurationMs": 13.07,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-idle",
"durationMs": 1995.5750000000307,
"styleRecalcs": 10,
"styleRecalcDurationMs": 10.007,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 417.204,
"heapDeltaBytes": -2158196,
"heapUsedBytes": 56574720,
"domNodes": 20,
"jsHeapTotalBytes": 26738688,
"scriptDurationMs": 19.986000000000004,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.699999999999818
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1679.4519999999693,
"styleRecalcs": 76,
"styleRecalcDurationMs": 38.853,
"layouts": 16,
"layoutDurationMs": 4.0600000000000005,
"taskDurationMs": 722.158,
"heapDeltaBytes": -10349932,
"heapUsedBytes": 48481436,
"domNodes": 64,
"jsHeapTotalBytes": 24641536,
"scriptDurationMs": 96.80699999999999,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "subgraph-mouse-sweep",
"durationMs": 1683.4610000000225,
"styleRecalcs": 75,
"styleRecalcDurationMs": 35.436,
"layouts": 16,
"layoutDurationMs": 4.286999999999999,
"taskDurationMs": 716.519,
"heapDeltaBytes": -10443928,
"heapUsedBytes": 48309660,
"domNodes": 63,
"jsHeapTotalBytes": 25952256,
"scriptDurationMs": 97.74199999999999,
"eventListeners": 4,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "subgraph-transition-enter",
"durationMs": 1084.9190000000135,
"styleRecalcs": 16,
"styleRecalcDurationMs": 29.56600000000001,
"layouts": 4,
"layoutDurationMs": 14.112000000000004,
"taskDurationMs": 785.522,
"heapDeltaBytes": 4528112,
"heapUsedBytes": 81171648,
"domNodes": 13833,
"jsHeapTotalBytes": 16777216,
"scriptDurationMs": 32.435,
"eventListeners": 2531,
"totalBlockingTimeMs": 179,
"frameDurationMs": 16.66333333333332,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "viewport-pan-sweep",
"durationMs": 8221.059000000025,
"styleRecalcs": 251,
"styleRecalcDurationMs": 57.13999999999999,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 3936.553,
"heapDeltaBytes": -3851324,
"heapUsedBytes": 68061268,
"domNodes": 20,
"jsHeapTotalBytes": 16834560,
"scriptDurationMs": 1291.981,
"eventListeners": 20,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.670000000000012,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "viewport-pan-sweep",
"durationMs": 8229.542999999921,
"styleRecalcs": 252,
"styleRecalcDurationMs": 58.257,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 4107.612,
"heapDeltaBytes": 1108772,
"heapUsedBytes": 73064256,
"domNodes": 22,
"jsHeapTotalBytes": 19718144,
"scriptDurationMs": 1375.422,
"eventListeners": 20,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-idle",
"durationMs": 12923.325999999975,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12904.417,
"heapDeltaBytes": -21591404,
"heapUsedBytes": 162549548,
"domNodes": -3302,
"jsHeapTotalBytes": 17010688,
"scriptDurationMs": 538.823,
"eventListeners": -16374,
"totalBlockingTimeMs": 0,
"frameDurationMs": 18.886666666666617,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "vue-large-graph-idle",
"durationMs": 12959.347999999976,
"styleRecalcs": 0,
"styleRecalcDurationMs": 0,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 12941.554999999998,
"heapDeltaBytes": -15042280,
"heapUsedBytes": 167956212,
"domNodes": -3302,
"jsHeapTotalBytes": 16486400,
"scriptDurationMs": 536.6880000000001,
"eventListeners": -16373,
"totalBlockingTimeMs": 0,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.80000000000291
},
{
"name": "vue-large-graph-pan",
"durationMs": 15418.141999999989,
"styleRecalcs": 77,
"styleRecalcDurationMs": 20.12900000000001,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 15390.277000000002,
"heapDeltaBytes": -11643364,
"heapUsedBytes": 182158536,
"domNodes": -3302,
"jsHeapTotalBytes": 17973248,
"scriptDurationMs": 842.007,
"eventListeners": -16372,
"totalBlockingTimeMs": 47,
"frameDurationMs": 17.220000000000073,
"p95FrameDurationMs": 16.700000000000728
},
{
"name": "vue-large-graph-pan",
"durationMs": 15321.467999999983,
"styleRecalcs": 74,
"styleRecalcDurationMs": 20.203000000000028,
"layouts": 0,
"layoutDurationMs": 0,
"taskDurationMs": 15297.601999999997,
"heapDeltaBytes": -33665828,
"heapUsedBytes": 180913216,
"domNodes": -3302,
"jsHeapTotalBytes": 16662528,
"scriptDurationMs": 868.512,
"eventListeners": -16370,
"totalBlockingTimeMs": 35,
"frameDurationMs": 17.223333333333358,
"p95FrameDurationMs": 16.799999999999272
},
{
"name": "workflow-execution",
"durationMs": 453.4580000000119,
"styleRecalcs": 19,
"styleRecalcDurationMs": 25.567000000000004,
"layouts": 5,
"layoutDurationMs": 1.5050000000000003,
"taskDurationMs": 124.66300000000001,
"heapDeltaBytes": 5400860,
"heapUsedBytes": 65222876,
"domNodes": 168,
"jsHeapTotalBytes": 3407872,
"scriptDurationMs": 18.536000000000005,
"eventListeners": 69,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666682,
"p95FrameDurationMs": 16.800000000000182
},
{
"name": "workflow-execution",
"durationMs": 462.3839999999291,
"styleRecalcs": 18,
"styleRecalcDurationMs": 24.595,
"layouts": 4,
"layoutDurationMs": 1.1179999999999999,
"taskDurationMs": 117.15400000000001,
"heapDeltaBytes": 5149892,
"heapUsedBytes": 65028192,
"domNodes": 155,
"jsHeapTotalBytes": 2883584,
"scriptDurationMs": 18.436,
"eventListeners": 71,
"totalBlockingTimeMs": 0,
"frameDurationMs": 16.666666666666668,
"p95FrameDurationMs": 16.700000000000728
}
]
} |
📝 WalkthroughWalkthroughTwo stores now use ChangesSlash Parsing Updates
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 6✅ Passed checks (6 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Codecov Report✅ All modified and coverable lines are covered by tests. @@ Coverage Diff @@
## codex/coverage-gate-infra #13263 +/- ##
=============================================================
+ Coverage 78.24% 78.25% +0.01%
=============================================================
Files 1633 1633
Lines 114228 114103 -125
Branches 39071 38390 -681
=============================================================
- Hits 89382 89297 -85
+ Misses 23937 23901 -36
+ Partials 909 905 -4
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 10 files with indirect coverage changes 🚀 New features to boost your workflow:
|
1bea28e to
0b91930
Compare
|
Added the covering test(s) for the refactored lines so codecov/patch sees them (the broader suite still lives in the coverage PRs). |
|
@coderabbitai review |
✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/stores/nodeBookmarkStore.test.ts`:
- Around line 30-37: The node bookmark test currently only verifies child count,
so it can miss incorrect slash parsing in the category-to-folder logic. Update
the affected tests in nodeBookmarkStore.test.ts to assert the actual parsed
category/tree placement produced by the bookmark flow, or replace the
buildNodeDefTree mock with one that preserves category semantics. Use the
existing useNodeDefStore, buildNodeDefTree, and createDummyFolderNodeDef test
setup to validate the parent folder path, not just the number of children.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 6932052c-f766-4406-bb7b-2c95092c5397
📒 Files selected for processing (3)
src/stores/modelStore.tssrc/stores/nodeBookmarkStore.test.tssrc/stores/nodeBookmarkStore.ts
0b91930 to
ea3299e
Compare
|
Addressed the CodeRabbit finding:
The source refactor is behavior-preserving across no-slash, nested, leading-slash, and empty inputs (trailing-slash handled earlier by the folder check). |
|
@coderabbitai review |
✅ Action performedReview finished.
|
Add a COVERAGE_CRITICAL gate that measures coverage over a curated allow-list of critical files and wire it into the unit CI job. Thresholds are locked to the current main baseline (statements 58 / branches 47 / functions 54 / lines 58); later PRs ratchet them upward as tests land.
Replace split('/').pop() ?? '' with slice(lastIndexOf('/') + 1) in modelStore
and nodeBookmarkStore. Equivalent across no-slash/trailing-slash/empty inputs and
drops the nullish fallback branch.
ea3299e to
ea91c63
Compare
|
@coderabbitai review Created by Codex |
|
✅ Action performedReview finished.
|
|
@coderabbitai approve Created by Codex |
Rate Limit Exceeded
|
|
@coderabbitai approve Created by Codex |
|
✅ Action performedComments resolved and changes approved. |
|
Replaced by #13345 so the draft PR uses an origin-backed branch. |
Summary
Behavior-preserving refactor: extract the trailing path segment with
slice(lastIndexOf('/') + 1)instead ofsplit('/').pop() ?? ''.Changes
modelStore.ts(simplified_file_name) andnodeBookmarkStore.ts(bookmarkname/category) — same output for no-slash, trailing-slash and empty-string inputs, while removing the?? ''nullish branch.Review Focus
Pure equivalence. Verified by the existing
modelStore/nodeBookmarkStoresuites (in the store-coverage PRs) — 33 tests pass against this new source.nodeBookmarkStoreis on the critical allow-list, so dropping the un-coverable?? ''branch also nudges its branch-coverage up.