@peter.naydenov/cuts 1.6.0 → 2.0.1

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 (67) hide show
  1. package/Changelog.md +9 -1
  2. package/Migration.guide.md +93 -0
  3. package/README.md +52 -8
  4. package/coverage/lcov-report/base.css +224 -0
  5. package/coverage/lcov-report/block-navigation.js +87 -0
  6. package/coverage/lcov-report/favicon.png +0 -0
  7. package/coverage/lcov-report/index.html +131 -0
  8. package/coverage/lcov-report/prettify.css +1 -0
  9. package/coverage/lcov-report/prettify.js +2 -0
  10. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  11. package/coverage/lcov-report/sorter.js +210 -0
  12. package/coverage/lcov-report/src/findInstructions.js.html +352 -0
  13. package/coverage/lcov-report/src/index.html +146 -0
  14. package/coverage/lcov-report/src/main.js.html +610 -0
  15. package/coverage/lcov-report/src/methods/hide.js.html +244 -0
  16. package/coverage/lcov-report/src/methods/index.html +206 -0
  17. package/coverage/lcov-report/src/methods/jump.js.html +148 -0
  18. package/coverage/lcov-report/src/methods/jumpBack.js.html +157 -0
  19. package/coverage/lcov-report/src/methods/jumpsReset.js.html +133 -0
  20. package/coverage/lcov-report/src/methods/listShortcuts.js.html +148 -0
  21. package/coverage/lcov-report/src/methods/setScenes.js.html +313 -0
  22. package/coverage/lcov-report/src/methods/show.js.html +466 -0
  23. package/coverage/lcov-report/src/setInstruction.js.html +157 -0
  24. package/coverage/lcov.info +461 -0
  25. package/cuts.png +0 -0
  26. package/cypress/support/component-index.html +11 -0
  27. package/dist/cuts.cjs +1 -1
  28. package/dist/cuts.esm.mjs +1 -1
  29. package/dist/cuts.umd.js +1 -1
  30. package/package.json +15 -15
  31. package/src/main.js +6 -4
  32. package/test/01-general.cy.js +348 -0
  33. package/test/blue.vue +13 -0
  34. package/test/dummy.vue +34 -0
  35. package/test/gray.vue +12 -0
  36. package/test/red.vue +11 -0
  37. package/tsconfig.json +14 -10
  38. package/types/main.d.ts +5 -5
  39. package/types/main.d.ts.map +1 -1
  40. package/types/methods/jumpBack.d.ts +1 -1
  41. package/types/methods/jumpBack.d.ts.map +1 -1
  42. package/types/methods/setScenes.d.ts +3 -3
  43. package/types/methods/setScenes.d.ts.map +1 -1
  44. package/types/methods/show.d.ts +1 -1
  45. package/types/methods/show.d.ts.map +1 -1
  46. package/types/src/findInstructions.d.ts +12 -0
  47. package/types/src/findInstructions.d.ts.map +1 -0
  48. package/types/src/main.d.ts +31 -0
  49. package/types/src/main.d.ts.map +1 -0
  50. package/types/src/methods/hide.d.ts +3 -0
  51. package/types/src/methods/hide.d.ts.map +1 -0
  52. package/types/src/methods/jump.d.ts +5 -0
  53. package/types/src/methods/jump.d.ts.map +1 -0
  54. package/types/src/methods/jumpBack.d.ts +5 -0
  55. package/types/src/methods/jumpBack.d.ts.map +1 -0
  56. package/types/src/methods/jumpsReset.d.ts +3 -0
  57. package/types/src/methods/jumpsReset.d.ts.map +1 -0
  58. package/types/src/methods/listShortcuts.d.ts +3 -0
  59. package/types/src/methods/listShortcuts.d.ts.map +1 -0
  60. package/types/src/methods/setScenes.d.ts +69 -0
  61. package/types/src/methods/setScenes.d.ts.map +1 -0
  62. package/types/src/methods/show.d.ts +8 -0
  63. package/types/src/methods/show.d.ts.map +1 -0
  64. package/types/src/setInstruction.d.ts +3 -0
  65. package/types/src/setInstruction.d.ts.map +1 -0
  66. package/test-vitest/01-findPosition.test.js +0 -119
  67. package/test-vitest/02-cuts.test.js +0 -412
package/Changelog.md CHANGED
@@ -1,12 +1,20 @@
1
1
  # Release History
2
2
 
3
3
 
4
- ## 1.6.0 ( 2025-10-?? )
4
+
5
+ ## 2.0.1 ( 2026-03-24 )
6
+ - [x] Dev dependency update. Typescript - v.6.0.2;
7
+ - [x] Rebuild types according the new version of typescript;
8
+
9
+
10
+
11
+ ## 2.0.0 ( 2025-11-09 )
5
12
  - [x] All 'cuts' errors goes to '@app-error' event;
6
13
  - [x] Configuration 'logLevel' default value is 1. If you want to dissable errors logging, set 'logLevel' to 0;
7
14
  - [x] Code cleaning. Removing unused code;
8
15
  - [x] Test code coverage on 85%;
9
16
  - [x] Fix: SSR option for first scene loading;
17
+ - [x] Shortcuts version 4.0.0. New shortcut plugins - 'scroll' and 'hover';
10
18
 
11
19
 
12
20
 
@@ -1 +1,94 @@
1
1
  # Migration Guides
2
+
3
+ ## From version 1.x.x to version 2.x.x
4
+
5
+ Cuts v2.0.0 upgrades to `@peter.naydenov/shortcuts` version 4.x.x. This introduces breaking changes in how click and hover target attributes are configured, and adds new 'Hover' and 'Scroll' plugins.
6
+
7
+ ### Plugin Target Attributes Changes
8
+
9
+ **Breaking Changes:**
10
+ - Plugin `click` parameter `clickTarget` now accepts an **array of attribute names** instead of a single string
11
+ - Plugin `hover` parameter `hoverTarget` now accepts an **array of attribute names** instead of a single string
12
+
13
+ **Migration Required:**
14
+
15
+ ```js
16
+ // Version 1.x.x (old)
17
+ script.enablePlugin(pluginClick, { clickTarget: 'data-button' })
18
+ script.enablePlugin(pluginHover, { hoverTarget: 'data-menu' })
19
+
20
+ // Version 2.x.x (new)
21
+ script.enablePlugin(pluginClick, { clickTarget: ['data-button'] })
22
+ script.enablePlugin(pluginHover, { hoverTarget: ['data-menu'] })
23
+ ```
24
+
25
+ **Default Values Updated:**
26
+ - `clickTarget` default: `['data-click', 'href']` (was `'data-click'`)
27
+ - `hoverTarget` default: `['data-hover']` (was `'data-hover'`)
28
+
29
+ **Benefits:**
30
+ - More flexible target detection
31
+ - Support for multiple attribute patterns
32
+ - Better compatibility with existing HTML patterns
33
+
34
+ ### Per-Context Setup Examples Updated
35
+
36
+ All setup examples in the documentation have been updated to use arrays:
37
+
38
+ ```js
39
+ // Version 2.x.x per-context setup
40
+ const shortcutDefinition = {
41
+ myContext: {
42
+ 'click:setup': () => ({
43
+ clickTarget: ['data-action', 'data-button', 'href'] // Array format
44
+ }),
45
+ 'hover:setup': () => ({
46
+ hoverTarget: ['data-interactive', 'data-hover'] // Array format
47
+ })
48
+ }
49
+ };
50
+ ```
51
+
52
+ ### Package Dependencies Update
53
+
54
+ Update your `package.json`:
55
+
56
+ ```json
57
+ {
58
+ "dependencies": {
59
+ "@peter.naydenov/cuts": "^2.0.0",
60
+ "@peter.naydenov/shortcuts": "^4.0.0"
61
+ }
62
+ }
63
+ ```
64
+
65
+ ### Backward Compatibility
66
+
67
+ No other breaking changes were introduced. All existing cuts API methods remain the same:
68
+ - `script.show()`
69
+ - `script.hide()`
70
+ - `script.jump()`
71
+ - `script.jumpBack()`
72
+ - `script.setScenes()`
73
+ - `script.listShortcuts()`
74
+ - etc.
75
+
76
+ ### Example Migration
77
+
78
+ **Before (v1.x.x):**
79
+ ```js
80
+ import cuts from '@peter.naydenov/cuts'
81
+
82
+ const script = cuts()
83
+ await script.loadPlugins(['Click'])
84
+ script.enablePlugin(pluginClick, { clickTarget: 'data-action' })
85
+ ```
86
+
87
+ **After (v2.x.x):**
88
+ ```js
89
+ import cuts from '@peter.naydenov/cuts'
90
+
91
+ const script = cuts()
92
+ await script.loadPlugins(['Click'])
93
+ script.enablePlugin(pluginClick, { clickTarget: ['data-action'] })
94
+ ```
package/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ <img src="cuts.png" width="100%" alt="Cuts" align="center" />
2
+
3
+
4
+
1
5
  # Cuts (@peter.naydenov/cuts)
2
6
 
3
7
  ![GitHub package.json version (branch)](https://img.shields.io/github/package-json/v/peterNaydenov/cuts/main)
@@ -5,11 +9,22 @@
5
9
  ![npm package minimized gzipped size](https://img.shields.io/bundlejs/size/%40peter.naydenov%2Fcuts)
6
10
 
7
11
 
8
- In filmmaking, a change of scene is typically referred to as a "**cut**". Cuts are an essential part of film editing and are used to create a cohesive narrative by connecting different scenes together.
12
+ `An abstract idea of a cut`: In filmmaking, a change of scene is typically referred to as a "**cut**". Cuts are an essential part of film editing and are used to create a cohesive narrative by connecting different scenes together.
13
+
14
+ ## Description
15
+ Let's define SPA application as a set of scenes (context/visual states) and each scene discribes a visual elements on the page and possible user interaction ( mouse, keyboard, scroll, hover, etc.). **Cuts** controls the flow among scenes in SPA application.
16
+
17
+ Behaviour description is based on '[@peter.naydenov/shortcuts](https://github.com/PeterNaydenov/shortcuts)' and every scene is a different shortcuts context.
9
18
 
10
- Let's define SPA application as a set of scenes (pages/visual states) and each scene discribes a visual elements on the page and possible user interaction ( mouse, keyboard, etc.). **Cuts** controls the flow among scenes in SPA application.
11
19
 
12
- When all interactions can be described in the **Scene** data models, means that the components (react,vue, svelte or any other framework) can be used as simple template engines - to render only html.
20
+
21
+ ## Why Cuts?
22
+ - SPA as a set of many scenes: Every scene can be developed and tested separately;
23
+ - Easy for reshape the flow of the application;
24
+ - Many developers can work toghether on the same project without conflicts;
25
+ - User interaction is easy to read and solve some problems of native DOM events;
26
+ - As user interaction is defined separately from the html markup, you have large choice of frameworks and template engines (react, vue, svelte, [morph](https://github.com/PeterNaydenov/morph), mustache, handlebars, etc.) to build your application visually;
27
+ - As user interaction is defined separately, visual components can be reused many times with different user interaction on each reuse;
13
28
 
14
29
 
15
30
 
@@ -51,10 +66,10 @@ script.show ({ scene : 'sceneName'}) // change the current Scene
51
66
  , jumpsReset : 'Reset the jump stack'
52
67
  , listScenes : 'List of loaded Scene names'
53
68
  , listShortcuts : 'List shortcuts per Scene. Provide the name of the Scene'
54
- , setDependencies : 'Add object to the "dependencies" object. This object will be passed to the Scene "show" method'
69
+ , setDependencies : 'Add object to the "dependencies" object. This object will be passed to the Scene "show" and "hide" methods and events descriptors'
55
70
  , getDependencies : 'Returns the "dependencies" object'
56
- , enablePlugin : 'Enable a shortcut plugin. Available after version 1.1.0'
57
- , disablePlugin : 'Disable a shortcut plugin. Available after version 1.1.0'
71
+ , enablePlugin : 'Enable a shortcut plugin.'
72
+ , disablePlugin : 'Disable a shortcut plugin.'
58
73
  , getState : 'Get the current state of the application'
59
74
  , emit : 'Emit an event'
60
75
  ```
@@ -110,10 +125,39 @@ script.jumpBack ({hops:2}) // Will load scene from the jump stack. Will load 'te
110
125
 
111
126
 
112
127
 
128
+ ## Plugin Configuration
129
+
130
+ Shortcuts has a plugin system. To load them, use the `loadPlugins` method.
131
+
132
+ ```js
133
+ import cuts from '@peter.naydenov/cuts'
134
+
135
+ const
136
+ script = cuts ()
137
+ , [ pluginClick, pluginHover] = await script.loadPlugins(['Click', 'Hover'])
138
+ ;
139
+
140
+ // Enable click plugin
141
+ script.enablePlugin ( pluginClick )
142
+
143
+ // Enable hover plugin
144
+ script.enablePlugin ( pluginHover )
145
+ ```
146
+
147
+
148
+ **Available Plugins in v4.x.x:**
149
+ - **Key**: Keyboard shortcuts
150
+ - **Click**: Mouse click events
151
+ - **Form**: Form input events
152
+ - **Hover**: Mouse hover events (new in v4.0.0)
153
+ - **Scroll**: Scroll events (new in v4.0.0)
154
+
155
+
156
+
113
157
  ## Links
158
+ - [Shortcuts documentation - @peter.naydenov/shortcuts](https://github.com/PeterNaydenov/shortcuts)
114
159
  - [History of changes](https://github.com/PeterNaydenov/cuts/blob/main/Changelog.md)
115
- - [Learn how shortcuts are implemented](https://github.com/PeterNaydenov/shortcuts)
116
-
160
+ - [Migration Guide](https://github.com/PeterNaydenov/cuts/blob/main/Migration.guide.md)
117
161
 
118
162
 
119
163
 
@@ -0,0 +1,224 @@
1
+ body, html {
2
+ margin:0; padding: 0;
3
+ height: 100%;
4
+ }
5
+ body {
6
+ font-family: Helvetica Neue, Helvetica, Arial;
7
+ font-size: 14px;
8
+ color:#333;
9
+ }
10
+ .small { font-size: 12px; }
11
+ *, *:after, *:before {
12
+ -webkit-box-sizing:border-box;
13
+ -moz-box-sizing:border-box;
14
+ box-sizing:border-box;
15
+ }
16
+ h1 { font-size: 20px; margin: 0;}
17
+ h2 { font-size: 14px; }
18
+ pre {
19
+ font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
+ margin: 0;
21
+ padding: 0;
22
+ -moz-tab-size: 2;
23
+ -o-tab-size: 2;
24
+ tab-size: 2;
25
+ }
26
+ a { color:#0074D9; text-decoration:none; }
27
+ a:hover { text-decoration:underline; }
28
+ .strong { font-weight: bold; }
29
+ .space-top1 { padding: 10px 0 0 0; }
30
+ .pad2y { padding: 20px 0; }
31
+ .pad1y { padding: 10px 0; }
32
+ .pad2x { padding: 0 20px; }
33
+ .pad2 { padding: 20px; }
34
+ .pad1 { padding: 10px; }
35
+ .space-left2 { padding-left:55px; }
36
+ .space-right2 { padding-right:20px; }
37
+ .center { text-align:center; }
38
+ .clearfix { display:block; }
39
+ .clearfix:after {
40
+ content:'';
41
+ display:block;
42
+ height:0;
43
+ clear:both;
44
+ visibility:hidden;
45
+ }
46
+ .fl { float: left; }
47
+ @media only screen and (max-width:640px) {
48
+ .col3 { width:100%; max-width:100%; }
49
+ .hide-mobile { display:none!important; }
50
+ }
51
+
52
+ .quiet {
53
+ color: #7f7f7f;
54
+ color: rgba(0,0,0,0.5);
55
+ }
56
+ .quiet a { opacity: 0.7; }
57
+
58
+ .fraction {
59
+ font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
+ font-size: 10px;
61
+ color: #555;
62
+ background: #E8E8E8;
63
+ padding: 4px 5px;
64
+ border-radius: 3px;
65
+ vertical-align: middle;
66
+ }
67
+
68
+ div.path a:link, div.path a:visited { color: #333; }
69
+ table.coverage {
70
+ border-collapse: collapse;
71
+ margin: 10px 0 0 0;
72
+ padding: 0;
73
+ }
74
+
75
+ table.coverage td {
76
+ margin: 0;
77
+ padding: 0;
78
+ vertical-align: top;
79
+ }
80
+ table.coverage td.line-count {
81
+ text-align: right;
82
+ padding: 0 5px 0 20px;
83
+ }
84
+ table.coverage td.line-coverage {
85
+ text-align: right;
86
+ padding-right: 10px;
87
+ min-width:20px;
88
+ }
89
+
90
+ table.coverage td span.cline-any {
91
+ display: inline-block;
92
+ padding: 0 5px;
93
+ width: 100%;
94
+ }
95
+ .missing-if-branch {
96
+ display: inline-block;
97
+ margin-right: 5px;
98
+ border-radius: 3px;
99
+ position: relative;
100
+ padding: 0 4px;
101
+ background: #333;
102
+ color: yellow;
103
+ }
104
+
105
+ .skip-if-branch {
106
+ display: none;
107
+ margin-right: 10px;
108
+ position: relative;
109
+ padding: 0 4px;
110
+ background: #ccc;
111
+ color: white;
112
+ }
113
+ .missing-if-branch .typ, .skip-if-branch .typ {
114
+ color: inherit !important;
115
+ }
116
+ .coverage-summary {
117
+ border-collapse: collapse;
118
+ width: 100%;
119
+ }
120
+ .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
+ .keyline-all { border: 1px solid #ddd; }
122
+ .coverage-summary td, .coverage-summary th { padding: 10px; }
123
+ .coverage-summary tbody { border: 1px solid #bbb; }
124
+ .coverage-summary td { border-right: 1px solid #bbb; }
125
+ .coverage-summary td:last-child { border-right: none; }
126
+ .coverage-summary th {
127
+ text-align: left;
128
+ font-weight: normal;
129
+ white-space: nowrap;
130
+ }
131
+ .coverage-summary th.file { border-right: none !important; }
132
+ .coverage-summary th.pct { }
133
+ .coverage-summary th.pic,
134
+ .coverage-summary th.abs,
135
+ .coverage-summary td.pct,
136
+ .coverage-summary td.abs { text-align: right; }
137
+ .coverage-summary td.file { white-space: nowrap; }
138
+ .coverage-summary td.pic { min-width: 120px !important; }
139
+ .coverage-summary tfoot td { }
140
+
141
+ .coverage-summary .sorter {
142
+ height: 10px;
143
+ width: 7px;
144
+ display: inline-block;
145
+ margin-left: 0.5em;
146
+ background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
+ }
148
+ .coverage-summary .sorted .sorter {
149
+ background-position: 0 -20px;
150
+ }
151
+ .coverage-summary .sorted-desc .sorter {
152
+ background-position: 0 -10px;
153
+ }
154
+ .status-line { height: 10px; }
155
+ /* yellow */
156
+ .cbranch-no { background: yellow !important; color: #111; }
157
+ /* dark red */
158
+ .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
159
+ .low .chart { border:1px solid #C21F39 }
160
+ .highlighted,
161
+ .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
162
+ background: #C21F39 !important;
163
+ }
164
+ /* medium red */
165
+ .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
166
+ /* light red */
167
+ .low, .cline-no { background:#FCE1E5 }
168
+ /* light green */
169
+ .high, .cline-yes { background:rgb(230,245,208) }
170
+ /* medium green */
171
+ .cstat-yes { background:rgb(161,215,106) }
172
+ /* dark green */
173
+ .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
174
+ .high .chart { border:1px solid rgb(77,146,33) }
175
+ /* dark yellow (gold) */
176
+ .status-line.medium, .medium .cover-fill { background: #f9cd0b; }
177
+ .medium .chart { border:1px solid #f9cd0b; }
178
+ /* light yellow */
179
+ .medium { background: #fff4c2; }
180
+
181
+ .cstat-skip { background: #ddd; color: #111; }
182
+ .fstat-skip { background: #ddd; color: #111 !important; }
183
+ .cbranch-skip { background: #ddd !important; color: #111; }
184
+
185
+ span.cline-neutral { background: #eaeaea; }
186
+
187
+ .coverage-summary td.empty {
188
+ opacity: .5;
189
+ padding-top: 4px;
190
+ padding-bottom: 4px;
191
+ line-height: 1;
192
+ color: #888;
193
+ }
194
+
195
+ .cover-fill, .cover-empty {
196
+ display:inline-block;
197
+ height: 12px;
198
+ }
199
+ .chart {
200
+ line-height: 0;
201
+ }
202
+ .cover-empty {
203
+ background: white;
204
+ }
205
+ .cover-full {
206
+ border-right: none !important;
207
+ }
208
+ pre.prettyprint {
209
+ border: none !important;
210
+ padding: 0 !important;
211
+ margin: 0 !important;
212
+ }
213
+ .com { color: #999 !important; }
214
+ .ignore-none { color: #999; font-weight: normal; }
215
+
216
+ .wrapper {
217
+ min-height: 100%;
218
+ height: auto !important;
219
+ height: 100%;
220
+ margin: 0 auto -48px;
221
+ }
222
+ .footer, .push {
223
+ height: 48px;
224
+ }
@@ -0,0 +1,87 @@
1
+ /* eslint-disable */
2
+ var jumpToCode = (function init() {
3
+ // Classes of code we would like to highlight in the file view
4
+ var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
5
+
6
+ // Elements to highlight in the file listing view
7
+ var fileListingElements = ['td.pct.low'];
8
+
9
+ // We don't want to select elements that are direct descendants of another match
10
+ var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
11
+
12
+ // Selector that finds elements on the page to which we can jump
13
+ var selector =
14
+ fileListingElements.join(', ') +
15
+ ', ' +
16
+ notSelector +
17
+ missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
18
+
19
+ // The NodeList of matching elements
20
+ var missingCoverageElements = document.querySelectorAll(selector);
21
+
22
+ var currentIndex;
23
+
24
+ function toggleClass(index) {
25
+ missingCoverageElements
26
+ .item(currentIndex)
27
+ .classList.remove('highlighted');
28
+ missingCoverageElements.item(index).classList.add('highlighted');
29
+ }
30
+
31
+ function makeCurrent(index) {
32
+ toggleClass(index);
33
+ currentIndex = index;
34
+ missingCoverageElements.item(index).scrollIntoView({
35
+ behavior: 'smooth',
36
+ block: 'center',
37
+ inline: 'center'
38
+ });
39
+ }
40
+
41
+ function goToPrevious() {
42
+ var nextIndex = 0;
43
+ if (typeof currentIndex !== 'number' || currentIndex === 0) {
44
+ nextIndex = missingCoverageElements.length - 1;
45
+ } else if (missingCoverageElements.length > 1) {
46
+ nextIndex = currentIndex - 1;
47
+ }
48
+
49
+ makeCurrent(nextIndex);
50
+ }
51
+
52
+ function goToNext() {
53
+ var nextIndex = 0;
54
+
55
+ if (
56
+ typeof currentIndex === 'number' &&
57
+ currentIndex < missingCoverageElements.length - 1
58
+ ) {
59
+ nextIndex = currentIndex + 1;
60
+ }
61
+
62
+ makeCurrent(nextIndex);
63
+ }
64
+
65
+ return function jump(event) {
66
+ if (
67
+ document.getElementById('fileSearch') === document.activeElement &&
68
+ document.activeElement != null
69
+ ) {
70
+ // if we're currently focused on the search input, we don't want to navigate
71
+ return;
72
+ }
73
+
74
+ switch (event.which) {
75
+ case 78: // n
76
+ case 74: // j
77
+ goToNext();
78
+ break;
79
+ case 66: // b
80
+ case 75: // k
81
+ case 80: // p
82
+ goToPrevious();
83
+ break;
84
+ }
85
+ };
86
+ })();
87
+ window.addEventListener('keydown', jumpToCode);
Binary file
@@ -0,0 +1,131 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for All files</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="prettify.css" />
9
+ <link rel="stylesheet" href="base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1>All files</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">85.71% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>198/231</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">80% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>60/75</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">75.51% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>37/49</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">88.38% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>175/198</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line high'></div>
65
+ <div class="pad1">
66
+ <table class="coverage-summary">
67
+ <thead>
68
+ <tr>
69
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
70
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
71
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
72
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
73
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
74
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
75
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
76
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
77
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
78
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
79
+ </tr>
80
+ </thead>
81
+ <tbody><tr>
82
+ <td class="file high" data-value="src"><a href="src/index.html">src</a></td>
83
+ <td data-value="93.33" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 93%"></div><div class="cover-empty" style="width: 7%"></div></div>
85
+ </td>
86
+ <td data-value="93.33" class="pct high">93.33%</td>
87
+ <td data-value="105" class="abs high">98/105</td>
88
+ <td data-value="95.23" class="pct high">95.23%</td>
89
+ <td data-value="21" class="abs high">20/21</td>
90
+ <td data-value="72" class="pct medium">72%</td>
91
+ <td data-value="25" class="abs medium">18/25</td>
92
+ <td data-value="100" class="pct high">100%</td>
93
+ <td data-value="83" class="abs high">83/83</td>
94
+ </tr>
95
+
96
+ <tr>
97
+ <td class="file medium" data-value="src/methods"><a href="src/methods/index.html">src/methods</a></td>
98
+ <td data-value="79.36" class="pic medium">
99
+ <div class="chart"><div class="cover-fill" style="width: 79%"></div><div class="cover-empty" style="width: 21%"></div></div>
100
+ </td>
101
+ <td data-value="79.36" class="pct medium">79.36%</td>
102
+ <td data-value="126" class="abs medium">100/126</td>
103
+ <td data-value="74.07" class="pct medium">74.07%</td>
104
+ <td data-value="54" class="abs medium">40/54</td>
105
+ <td data-value="79.16" class="pct medium">79.16%</td>
106
+ <td data-value="24" class="abs medium">19/24</td>
107
+ <td data-value="80" class="pct high">80%</td>
108
+ <td data-value="115" class="abs high">92/115</td>
109
+ </tr>
110
+
111
+ </tbody>
112
+ </table>
113
+ </div>
114
+ <div class='push'></div><!-- for sticky footer -->
115
+ </div><!-- /wrapper -->
116
+ <div class='footer quiet pad2 space-top1 center small'>
117
+ Code coverage generated by
118
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
+ at 2025-11-09T11:05:03.156Z
120
+ </div>
121
+ <script src="prettify.js"></script>
122
+ <script>
123
+ window.onload = function () {
124
+ prettyPrint();
125
+ };
126
+ </script>
127
+ <script src="sorter.js"></script>
128
+ <script src="block-navigation.js"></script>
129
+ </body>
130
+ </html>
131
+
@@ -0,0 +1 @@
1
+ .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}