@photostructure/fs-metadata 0.5.0 → 0.5.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 (130) hide show
  1. package/C++_REVIEW_TODO.md +1 -1
  2. package/CHANGELOG.md +11 -2
  3. package/CLAUDE.md +269 -92
  4. package/CONTRIBUTING.md +41 -0
  5. package/README.md +20 -1
  6. package/WINDOWS_DEBUG_GUIDE.md +89 -0
  7. package/binding.gyp +3 -2
  8. package/dist/index.cjs +1440 -0
  9. package/dist/index.cjs.map +1 -0
  10. package/dist/index.d.cts +360 -0
  11. package/dist/index.d.mts +360 -0
  12. package/dist/index.d.ts +360 -0
  13. package/dist/index.mjs +1398 -0
  14. package/dist/index.mjs.map +1 -0
  15. package/jest.config.cjs +1 -0
  16. package/package.json +25 -27
  17. package/prebuilds/darwin-arm64/@photostructure+fs-metadata.glibc.node +0 -0
  18. package/prebuilds/linux-arm64/@photostructure+fs-metadata.glibc.node +0 -0
  19. package/prebuilds/linux-arm64/@photostructure+fs-metadata.musl.node +0 -0
  20. package/prebuilds/linux-x64/@photostructure+fs-metadata.glibc.node +0 -0
  21. package/prebuilds/linux-x64/@photostructure+fs-metadata.musl.node +0 -0
  22. package/prebuilds/win32-x64/@photostructure+fs-metadata.glibc.node +0 -0
  23. package/scripts/check-memory.mjs +53 -173
  24. package/scripts/clang-tidy.ts +241 -0
  25. package/scripts/prebuild-linux-glibc.sh +108 -0
  26. package/scripts/precommit.ts +45 -0
  27. package/scripts/sanitizers-test.sh +157 -0
  28. package/scripts/{configure.mjs → setup-native.mjs} +4 -1
  29. package/scripts/valgrind-test.mjs +1 -1
  30. package/scripts/{valgrind.sh → valgrind-test.sh} +15 -0
  31. package/src/binding.cpp +1 -1
  32. package/src/common/error_utils.h +17 -0
  33. package/src/common/metadata_worker.h +4 -1
  34. package/src/darwin/hidden.cpp +13 -6
  35. package/src/darwin/volume_metadata.cpp +2 -2
  36. package/src/darwin/volume_mount_points.cpp +8 -1
  37. package/src/linux/blkid_cache.cpp +8 -2
  38. package/src/linux/volume_metadata.cpp +1 -1
  39. package/src/platform.ts +25 -0
  40. package/src/test-utils/benchmark-harness.ts +192 -0
  41. package/src/test-utils/debuglog-child.ts +30 -2
  42. package/src/test-utils/debuglog-enabled-child.ts +38 -8
  43. package/src/test-utils/jest-setup.ts +14 -0
  44. package/src/test-utils/worker-thread-helper.cjs +92 -0
  45. package/src/windows/hidden.cpp +20 -11
  46. package/coverage/base.css +0 -224
  47. package/coverage/block-navigation.js +0 -87
  48. package/coverage/favicon.png +0 -0
  49. package/coverage/index.html +0 -131
  50. package/coverage/lcov-report/base.css +0 -224
  51. package/coverage/lcov-report/block-navigation.js +0 -87
  52. package/coverage/lcov-report/favicon.png +0 -0
  53. package/coverage/lcov-report/index.html +0 -131
  54. package/coverage/lcov-report/prettify.css +0 -1
  55. package/coverage/lcov-report/prettify.js +0 -2
  56. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  57. package/coverage/lcov-report/sorter.js +0 -196
  58. package/coverage/lcov-report/src/array.ts.html +0 -217
  59. package/coverage/lcov-report/src/async.ts.html +0 -547
  60. package/coverage/lcov-report/src/debuglog.ts.html +0 -187
  61. package/coverage/lcov-report/src/defer.ts.html +0 -175
  62. package/coverage/lcov-report/src/dirname.ts.html +0 -124
  63. package/coverage/lcov-report/src/error.ts.html +0 -322
  64. package/coverage/lcov-report/src/fs.ts.html +0 -316
  65. package/coverage/lcov-report/src/glob.ts.html +0 -472
  66. package/coverage/lcov-report/src/hidden.ts.html +0 -724
  67. package/coverage/lcov-report/src/index.html +0 -521
  68. package/coverage/lcov-report/src/index.ts.html +0 -676
  69. package/coverage/lcov-report/src/linux/dev_disk.ts.html +0 -316
  70. package/coverage/lcov-report/src/linux/index.html +0 -146
  71. package/coverage/lcov-report/src/linux/mount_points.ts.html +0 -364
  72. package/coverage/lcov-report/src/linux/mtab.ts.html +0 -493
  73. package/coverage/lcov-report/src/mount_point.ts.html +0 -106
  74. package/coverage/lcov-report/src/number.ts.html +0 -148
  75. package/coverage/lcov-report/src/object.ts.html +0 -265
  76. package/coverage/lcov-report/src/options.ts.html +0 -475
  77. package/coverage/lcov-report/src/path.ts.html +0 -268
  78. package/coverage/lcov-report/src/platform.ts.html +0 -112
  79. package/coverage/lcov-report/src/random.ts.html +0 -205
  80. package/coverage/lcov-report/src/remote_info.ts.html +0 -553
  81. package/coverage/lcov-report/src/stack_path.ts.html +0 -298
  82. package/coverage/lcov-report/src/string.ts.html +0 -382
  83. package/coverage/lcov-report/src/string_enum.ts.html +0 -208
  84. package/coverage/lcov-report/src/system_volume.ts.html +0 -301
  85. package/coverage/lcov-report/src/unc.ts.html +0 -274
  86. package/coverage/lcov-report/src/units.ts.html +0 -274
  87. package/coverage/lcov-report/src/uuid.ts.html +0 -157
  88. package/coverage/lcov-report/src/volume_health_status.ts.html +0 -259
  89. package/coverage/lcov-report/src/volume_metadata.ts.html +0 -787
  90. package/coverage/lcov-report/src/volume_mount_points.ts.html +0 -388
  91. package/coverage/lcov.info +0 -3581
  92. package/coverage/prettify.css +0 -1
  93. package/coverage/prettify.js +0 -2
  94. package/coverage/sort-arrow-sprite.png +0 -0
  95. package/coverage/sorter.js +0 -196
  96. package/coverage/src/array.ts.html +0 -217
  97. package/coverage/src/async.ts.html +0 -547
  98. package/coverage/src/debuglog.ts.html +0 -187
  99. package/coverage/src/defer.ts.html +0 -175
  100. package/coverage/src/dirname.ts.html +0 -124
  101. package/coverage/src/error.ts.html +0 -322
  102. package/coverage/src/fs.ts.html +0 -316
  103. package/coverage/src/glob.ts.html +0 -472
  104. package/coverage/src/hidden.ts.html +0 -724
  105. package/coverage/src/index.html +0 -521
  106. package/coverage/src/index.ts.html +0 -676
  107. package/coverage/src/linux/dev_disk.ts.html +0 -316
  108. package/coverage/src/linux/index.html +0 -146
  109. package/coverage/src/linux/mount_points.ts.html +0 -364
  110. package/coverage/src/linux/mtab.ts.html +0 -493
  111. package/coverage/src/mount_point.ts.html +0 -106
  112. package/coverage/src/number.ts.html +0 -148
  113. package/coverage/src/object.ts.html +0 -265
  114. package/coverage/src/options.ts.html +0 -475
  115. package/coverage/src/path.ts.html +0 -268
  116. package/coverage/src/platform.ts.html +0 -112
  117. package/coverage/src/random.ts.html +0 -205
  118. package/coverage/src/remote_info.ts.html +0 -553
  119. package/coverage/src/stack_path.ts.html +0 -298
  120. package/coverage/src/string.ts.html +0 -382
  121. package/coverage/src/string_enum.ts.html +0 -208
  122. package/coverage/src/system_volume.ts.html +0 -301
  123. package/coverage/src/unc.ts.html +0 -274
  124. package/coverage/src/units.ts.html +0 -274
  125. package/coverage/src/uuid.ts.html +0 -157
  126. package/coverage/src/volume_health_status.ts.html +0 -259
  127. package/coverage/src/volume_metadata.ts.html +0 -787
  128. package/coverage/src/volume_mount_points.ts.html +0 -388
  129. package/scripts/clang-tidy.mjs +0 -73
  130. package/scripts/run-asan.sh +0 -92
@@ -1,10 +1,40 @@
1
1
  import { debug } from "../debuglog";
2
2
 
3
- // This will be run with NODE_DEBUG set, so debug should be enabled
4
- debug("test message %s %d", "hello", 42);
5
- debug("simple message");
6
- debug("object %o", { key: "value" });
7
-
8
- // Signal successful completion
9
- console.log("DONE");
10
- process.exit(0);
3
+ // Ensure clean process state on Windows
4
+ process.on("uncaughtException", (err) => {
5
+ const errorMessage = err instanceof Error ? err.message : String(err);
6
+ process.stderr.write(
7
+ `Uncaught exception in debuglog-enabled-child: ${errorMessage}\n`,
8
+ );
9
+ process.exit(1);
10
+ });
11
+
12
+ process.on("unhandledRejection", (reason) => {
13
+ const errorMessage =
14
+ reason instanceof Error ? reason.message : String(reason);
15
+ process.stderr.write(
16
+ `Unhandled rejection in debuglog-enabled-child: ${errorMessage}\n`,
17
+ );
18
+ process.exit(1);
19
+ });
20
+
21
+ try {
22
+ // This will be run with NODE_DEBUG set, so debug should be enabled
23
+ debug("test message %s %d", "hello", 42);
24
+ debug("simple message");
25
+ debug("object %o", { key: "value" });
26
+
27
+ // Signal successful completion using stdout.write for clean output
28
+ process.stdout.write("DONE");
29
+ process.exit(0);
30
+ } catch (err) {
31
+ const errorMessage = err instanceof Error ? err.message : String(err);
32
+ process.stderr.write(`Error in debuglog-enabled-child: ${errorMessage}\n`);
33
+
34
+ // Also log stack trace for debugging
35
+ if (err instanceof Error && err.stack) {
36
+ process.stderr.write(`Stack trace:\n${err.stack}\n`);
37
+ }
38
+
39
+ process.exit(1);
40
+ }
@@ -0,0 +1,14 @@
1
+ // Jest setup file - runs before all tests
2
+ // Configures global test environment and timeouts
3
+
4
+ import { jest } from "@jest/globals";
5
+ import { getTestTimeout } from "./test-timeout-config";
6
+
7
+ // Configure Jest timeout globally for all tests
8
+ jest.setTimeout(getTestTimeout());
9
+
10
+ // Set consistent timezone for tests (similar to PhotoStructure approach)
11
+ process.env["TZ"] = "America/Los_Angeles";
12
+
13
+ // Ensure test environment
14
+ process.env["NODE_ENV"] = "test";
@@ -0,0 +1,92 @@
1
+ // Worker thread helper for tests
2
+ // This file is CommonJS format for compatibility with worker threads
3
+ /* eslint-disable @typescript-eslint/no-require-imports */
4
+ /* eslint-disable no-undef */
5
+
6
+ const { parentPort, workerData } = require('node:worker_threads');
7
+ const path = require('node:path');
8
+
9
+ // Use eval with the worker data to create the module functions
10
+ const createModule = () => {
11
+ const nodeGypBuild = require('node-gyp-build');
12
+ const binding = nodeGypBuild(path.join(__dirname, '../..'));
13
+
14
+ // Platform detection
15
+ const platform = process.platform;
16
+ const isLinux = platform === 'linux';
17
+
18
+ // For Linux, we need a simplified implementation since the main one is complex
19
+ if (isLinux) {
20
+ return {
21
+ getVolumeMountPoints: async () => {
22
+ // Return the same mount points as the main thread would
23
+ // This is a simplified version for testing
24
+ return [
25
+ { mountPoint: '/', fstype: 'ext4', isSystemVolume: true },
26
+ { mountPoint: '/boot', fstype: 'ext4', isSystemVolume: true },
27
+ { mountPoint: '/boot/efi', fstype: 'vfat', isSystemVolume: true },
28
+ { mountPoint: '/home', fstype: 'ext4', isSystemVolume: false }
29
+ ];
30
+ },
31
+ getVolumeMetadata: async (mountPoint, options) => {
32
+ return binding.getVolumeMetadata({ mountPoint, ...options });
33
+ },
34
+ isHidden: async (filePath) => {
35
+ const basename = path.basename(filePath);
36
+ return basename.startsWith('.');
37
+ },
38
+ setHidden: async (/* filePath, hidden */) => {
39
+ // Linux doesn't support hidden attribute
40
+ return;
41
+ }
42
+ };
43
+ }
44
+
45
+ // For Windows and macOS, use the native binding directly
46
+ return {
47
+ getVolumeMountPoints: async () => {
48
+ return binding.getVolumeMountPoints();
49
+ },
50
+ getVolumeMetadata: async (mountPoint, options) => {
51
+ return binding.getVolumeMetadata({ mountPoint, ...options });
52
+ },
53
+ isHidden: binding.isHidden,
54
+ setHidden: binding.setHidden
55
+ };
56
+ };
57
+
58
+ const fsMetadata = createModule();
59
+
60
+ async function runWorkerTask() {
61
+ try {
62
+ const { task, ...params } = workerData;
63
+ let result;
64
+
65
+ switch (task) {
66
+ case 'getVolumeMountPoints':
67
+ result = await fsMetadata.getVolumeMountPoints();
68
+ break;
69
+ case 'getVolumeMetadata':
70
+ result = await fsMetadata.getVolumeMetadata(params.mountPoint, params.options);
71
+ break;
72
+ case 'isHidden':
73
+ result = await fsMetadata.isHidden(params.path);
74
+ break;
75
+ case 'setHidden':
76
+ result = await fsMetadata.setHidden(params.path, params.hidden);
77
+ break;
78
+ default:
79
+ throw new Error('Unknown task: ' + task);
80
+ }
81
+
82
+ parentPort.postMessage({ success: true, result });
83
+ } catch (error) {
84
+ parentPort.postMessage({ success: false, error: error.message });
85
+ }
86
+
87
+ // Close the parent port to signal we're done
88
+ // This allows the worker to exit naturally
89
+ parentPort.close();
90
+ }
91
+
92
+ runWorkerTask();
@@ -66,7 +66,7 @@ class GetHiddenWorker : public Napi::AsyncWorker {
66
66
 
67
67
  public:
68
68
  GetHiddenWorker(Napi::Env env, std::string p, Napi::Promise::Deferred def)
69
- : Napi::AsyncWorker(env), path(std::move(p)), deferred(std::move(def)) {}
69
+ : Napi::AsyncWorker(env), path(std::move(p)), deferred(def) {}
70
70
 
71
71
  void Execute() override {
72
72
  try {
@@ -86,9 +86,15 @@ public:
86
86
  }
87
87
  }
88
88
 
89
- void OnOK() override { deferred.Resolve(Napi::Boolean::New(Env(), result)); }
89
+ void OnOK() override {
90
+ Napi::HandleScope scope(Env());
91
+ deferred.Resolve(Napi::Boolean::New(Env(), result));
92
+ }
90
93
 
91
- void OnError(const Napi::Error &e) override { deferred.Reject(e.Value()); }
94
+ void OnError(const Napi::Error &e) override {
95
+ Napi::HandleScope scope(Env());
96
+ deferred.Reject(e.Value());
97
+ }
92
98
  };
93
99
 
94
100
  class SetHiddenWorker : public Napi::AsyncWorker {
@@ -99,8 +105,7 @@ class SetHiddenWorker : public Napi::AsyncWorker {
99
105
  public:
100
106
  SetHiddenWorker(Napi::Env env, std::string p, bool v,
101
107
  Napi::Promise::Deferred def)
102
- : Napi::AsyncWorker(env), path(std::move(p)), value(v),
103
- deferred(std::move(def)) {}
108
+ : Napi::AsyncWorker(env), path(std::move(p)), value(v), deferred(def) {}
104
109
 
105
110
  void Execute() override {
106
111
  try {
@@ -120,9 +125,15 @@ public:
120
125
  }
121
126
  }
122
127
 
123
- void OnOK() override { deferred.Resolve(Napi::Boolean::New(Env(), true)); }
128
+ void OnOK() override {
129
+ Napi::HandleScope scope(Env());
130
+ deferred.Resolve(Napi::Boolean::New(Env(), true));
131
+ }
124
132
 
125
- void OnError(const Napi::Error &e) override { deferred.Reject(e.Value()); }
133
+ void OnError(const Napi::Error &e) override {
134
+ Napi::HandleScope scope(Env());
135
+ deferred.Reject(e.Value());
136
+ }
126
137
  };
127
138
 
128
139
  Napi::Promise GetHiddenAttribute(const Napi::CallbackInfo &info) {
@@ -135,8 +146,7 @@ Napi::Promise GetHiddenAttribute(const Napi::CallbackInfo &info) {
135
146
  }
136
147
 
137
148
  std::string path = info[0].As<Napi::String>();
138
- auto *worker =
139
- new GetHiddenWorker(env, std::move(path), std::move(deferred));
149
+ auto *worker = new GetHiddenWorker(env, std::move(path), deferred);
140
150
  worker->Queue();
141
151
 
142
152
  return deferred.Promise();
@@ -158,8 +168,7 @@ Napi::Promise SetHiddenAttribute(const Napi::CallbackInfo &info) {
158
168
  std::string path = info[0].As<Napi::String>();
159
169
  bool value = info[1].As<Napi::Boolean>();
160
170
 
161
- auto *worker =
162
- new SetHiddenWorker(env, std::move(path), value, std::move(deferred));
171
+ auto *worker = new SetHiddenWorker(env, std::move(path), value, deferred);
163
172
  worker->Queue();
164
173
 
165
174
  return deferred.Promise();
package/coverage/base.css DELETED
@@ -1,224 +0,0 @@
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
- }
@@ -1,87 +0,0 @@
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
- // Selecter 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
@@ -1,131 +0,0 @@
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">94.31% </span>
27
- <span class="quiet">Statements</span>
28
- <span class='fraction'>2439/2586</span>
29
- </div>
30
-
31
-
32
- <div class='fl pad1y space-right2'>
33
- <span class="strong">86.49% </span>
34
- <span class="quiet">Branches</span>
35
- <span class='fraction'>429/496</span>
36
- </div>
37
-
38
-
39
- <div class='fl pad1y space-right2'>
40
- <span class="strong">92.72% </span>
41
- <span class="quiet">Functions</span>
42
- <span class='fraction'>102/110</span>
43
- </div>
44
-
45
-
46
- <div class='fl pad1y space-right2'>
47
- <span class="strong">94.31% </span>
48
- <span class="quiet">Lines</span>
49
- <span class='fraction'>2439/2586</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="95.13" class="pic high">
84
- <div class="chart"><div class="cover-fill" style="width: 95%"></div><div class="cover-empty" style="width: 5%"></div></div>
85
- </td>
86
- <td data-value="95.13" class="pct high">95.13%</td>
87
- <td data-value="2280" class="abs high">2169/2280</td>
88
- <td data-value="87.33" class="pct high">87.33%</td>
89
- <td data-value="458" class="abs high">400/458</td>
90
- <td data-value="93" class="pct high">93%</td>
91
- <td data-value="100" class="abs high">93/100</td>
92
- <td data-value="95.13" class="pct high">95.13%</td>
93
- <td data-value="2280" class="abs high">2169/2280</td>
94
- </tr>
95
-
96
- <tr>
97
- <td class="file high" data-value="src/linux"><a href="src/linux/index.html">src/linux</a></td>
98
- <td data-value="88.23" class="pic high">
99
- <div class="chart"><div class="cover-fill" style="width: 88%"></div><div class="cover-empty" style="width: 12%"></div></div>
100
- </td>
101
- <td data-value="88.23" class="pct high">88.23%</td>
102
- <td data-value="306" class="abs high">270/306</td>
103
- <td data-value="76.31" class="pct high">76.31%</td>
104
- <td data-value="38" class="abs high">29/38</td>
105
- <td data-value="90" class="pct high">90%</td>
106
- <td data-value="10" class="abs high">9/10</td>
107
- <td data-value="88.23" class="pct high">88.23%</td>
108
- <td data-value="306" class="abs high">270/306</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-06-01T20:18:02.872Z
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
-