@claude-flow/shared 3.0.0-alpha.1 → 3.0.0-alpha.8
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.
- package/.claude-flow/daemon-state.json +135 -0
- package/.claude-flow/data/pending-insights.jsonl +2 -0
- package/.claude-flow/data/ranked-context.json +5 -0
- package/.claude-flow/logs/daemon.log +45 -0
- package/.claude-flow/logs/headless/audit_1777379186972_h5un5x_prompt.log +3210 -0
- package/.claude-flow/logs/headless/audit_1777379186972_h5un5x_result.log +117 -0
- package/.claude-flow/logs/headless/audit_1777379816437_w0eaul_prompt.log +3210 -0
- package/.claude-flow/logs/headless/audit_1777379816437_w0eaul_result.log +53 -0
- package/.claude-flow/logs/headless/audit_1777380440097_621y8m_prompt.log +3210 -0
- package/.claude-flow/logs/headless/audit_1777380440097_621y8m_result.log +75 -0
- package/.claude-flow/logs/headless/optimize_1777379306973_an4lmy_prompt.log +3504 -0
- package/.claude-flow/logs/headless/optimize_1777379306973_an4lmy_result.log +166 -0
- package/.claude-flow/logs/headless/optimize_1777380274732_apxz3s_prompt.log +3504 -0
- package/.claude-flow/logs/headless/optimize_1777380274732_apxz3s_result.log +219 -0
- package/.claude-flow/logs/headless/testgaps_1777379546969_dvf2a1_prompt.log +3189 -0
- package/.claude-flow/logs/headless/testgaps_1777379546969_dvf2a1_result.log +155 -0
- package/.claude-flow/metrics/codebase-map.json +11 -0
- package/.claude-flow/metrics/consolidation.json +6 -0
- package/.claude-flow/sessions/current.json +13 -0
- package/.swarm/hnsw.index +0 -0
- package/.swarm/hnsw.metadata.json +1 -0
- package/.swarm/memory.db +0 -0
- package/.swarm/memory.db-shm +0 -0
- package/.swarm/memory.db-wal +0 -0
- package/.swarm/schema.sql +305 -0
- package/dist/core/config/loader.d.ts.map +1 -1
- package/dist/core/config/loader.js +17 -1
- package/dist/core/config/loader.js.map +1 -1
- package/dist/core/config/schema.d.ts +697 -103
- package/dist/core/config/schema.d.ts.map +1 -1
- package/dist/core/config/schema.js +3 -1
- package/dist/core/config/schema.js.map +1 -1
- package/dist/events/event-store.d.ts.map +1 -1
- package/dist/events/event-store.js +20 -9
- package/dist/events/event-store.js.map +1 -1
- package/dist/events/example-usage.js +1 -1
- package/dist/events/example-usage.js.map +1 -1
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +2 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/rvf-event-log.d.ts +82 -0
- package/dist/events/rvf-event-log.d.ts.map +1 -0
- package/dist/events/rvf-event-log.js +340 -0
- package/dist/events/rvf-event-log.js.map +1 -0
- package/dist/hooks/example-usage.js +3 -3
- package/dist/hooks/example-usage.js.map +1 -1
- package/dist/hooks/executor.d.ts.map +1 -1
- package/dist/hooks/executor.js +7 -4
- package/dist/hooks/executor.js.map +1 -1
- package/dist/hooks/verify-exports.test.js +6 -6
- package/dist/hooks/verify-exports.test.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +3 -6
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/types.d.ts +4 -6
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/plugins/official/hive-mind-plugin.js +2 -2
- package/dist/plugins/official/hive-mind-plugin.js.map +1 -1
- package/dist/plugins/official/maestro-plugin.js +3 -3
- package/dist/plugins/official/maestro-plugin.js.map +1 -1
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +7 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/v3-progress.service.d.ts +124 -0
- package/dist/services/v3-progress.service.d.ts.map +1 -0
- package/dist/services/v3-progress.service.js +402 -0
- package/dist/services/v3-progress.service.js.map +1 -0
- package/package.json +12 -3
- package/ruvector.db +0 -0
- package/src/core/config/loader.ts +17 -1
- package/src/core/config/schema.ts +3 -1
- package/src/events/event-store.ts +18 -9
- package/src/events/example-usage.ts +1 -1
- package/src/events/index.ts +4 -0
- package/src/events/rvf-event-log.ts +427 -0
- package/src/hooks/example-usage.ts +3 -3
- package/src/hooks/executor.ts +7 -5
- package/src/hooks/verify-exports.test.ts +6 -6
- package/src/index.ts +5 -0
- package/src/mcp/server.ts +3 -6
- package/src/mcp/types.ts +4 -6
- package/src/plugins/official/hive-mind-plugin.ts +2 -2
- package/src/plugins/official/maestro-plugin.ts +3 -3
- package/src/services/index.ts +16 -0
- package/src/services/v3-progress.service.ts +505 -0
- package/tmp.json +0 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/.agentic-flow/intelligence.json +0 -16
- package/__tests__/coverage/base.css +0 -224
- package/__tests__/coverage/block-navigation.js +0 -87
- package/__tests__/coverage/coverage-final.json +0 -50
- package/__tests__/coverage/favicon.png +0 -0
- package/__tests__/coverage/index.html +0 -326
- package/__tests__/coverage/lcov-report/base.css +0 -224
- package/__tests__/coverage/lcov-report/block-navigation.js +0 -87
- package/__tests__/coverage/lcov-report/favicon.png +0 -0
- package/__tests__/coverage/lcov-report/index.html +0 -326
- package/__tests__/coverage/lcov-report/prettify.css +0 -1
- package/__tests__/coverage/lcov-report/prettify.js +0 -2
- package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/lcov-report/sorter.js +0 -210
- package/__tests__/coverage/lcov-report/src/core/config/defaults.ts.html +0 -706
- package/__tests__/coverage/lcov-report/src/core/config/index.html +0 -161
- package/__tests__/coverage/lcov-report/src/core/config/loader.ts.html +0 -898
- package/__tests__/coverage/lcov-report/src/core/config/schema.ts.html +0 -649
- package/__tests__/coverage/lcov-report/src/core/config/validator.ts.html +0 -712
- package/__tests__/coverage/lcov-report/src/core/event-bus.ts.html +0 -793
- package/__tests__/coverage/lcov-report/src/core/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/core/interfaces/event.interface.ts.html +0 -886
- package/__tests__/coverage/lcov-report/src/core/interfaces/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/core/orchestrator/event-coordinator.ts.html +0 -451
- package/__tests__/coverage/lcov-report/src/core/orchestrator/health-monitor.ts.html +0 -727
- package/__tests__/coverage/lcov-report/src/core/orchestrator/index.html +0 -176
- package/__tests__/coverage/lcov-report/src/core/orchestrator/lifecycle-manager.ts.html +0 -874
- package/__tests__/coverage/lcov-report/src/core/orchestrator/session-manager.ts.html +0 -922
- package/__tests__/coverage/lcov-report/src/core/orchestrator/task-manager.ts.html +0 -1036
- package/__tests__/coverage/lcov-report/src/events/domain-events.ts.html +0 -1837
- package/__tests__/coverage/lcov-report/src/events/event-store.ts.html +0 -1849
- package/__tests__/coverage/lcov-report/src/events/example-usage.ts.html +0 -964
- package/__tests__/coverage/lcov-report/src/events/index.html +0 -176
- package/__tests__/coverage/lcov-report/src/events/projections.ts.html +0 -1768
- package/__tests__/coverage/lcov-report/src/events/state-reconstructor.ts.html +0 -1132
- package/__tests__/coverage/lcov-report/src/events.ts.html +0 -1186
- package/__tests__/coverage/lcov-report/src/hooks/example-usage.ts.html +0 -1582
- package/__tests__/coverage/lcov-report/src/hooks/executor.ts.html +0 -1222
- package/__tests__/coverage/lcov-report/src/hooks/index.html +0 -191
- package/__tests__/coverage/lcov-report/src/hooks/registry.ts.html +0 -1084
- package/__tests__/coverage/lcov-report/src/hooks/safety/bash-safety.ts.html +0 -1897
- package/__tests__/coverage/lcov-report/src/hooks/safety/file-organization.ts.html +0 -1504
- package/__tests__/coverage/lcov-report/src/hooks/safety/git-commit.ts.html +0 -1954
- package/__tests__/coverage/lcov-report/src/hooks/safety/index.html +0 -146
- package/__tests__/coverage/lcov-report/src/hooks/session-hooks.ts.html +0 -1762
- package/__tests__/coverage/lcov-report/src/hooks/task-hooks.ts.html +0 -1624
- package/__tests__/coverage/lcov-report/src/hooks/types.ts.html +0 -1156
- package/__tests__/coverage/lcov-report/src/index.html +0 -176
- package/__tests__/coverage/lcov-report/src/mcp/connection-pool.ts.html +0 -1399
- package/__tests__/coverage/lcov-report/src/mcp/index.html +0 -176
- package/__tests__/coverage/lcov-report/src/mcp/server.ts.html +0 -2407
- package/__tests__/coverage/lcov-report/src/mcp/session-manager.ts.html +0 -1369
- package/__tests__/coverage/lcov-report/src/mcp/tool-registry.ts.html +0 -1783
- package/__tests__/coverage/lcov-report/src/mcp/transport/http.ts.html +0 -1756
- package/__tests__/coverage/lcov-report/src/mcp/transport/index.html +0 -146
- package/__tests__/coverage/lcov-report/src/mcp/transport/stdio.ts.html +0 -1057
- package/__tests__/coverage/lcov-report/src/mcp/transport/websocket.ts.html +0 -1537
- package/__tests__/coverage/lcov-report/src/mcp/types.ts.html +0 -1780
- package/__tests__/coverage/lcov-report/src/plugin-interface.ts.html +0 -2074
- package/__tests__/coverage/lcov-report/src/plugin-loader.ts.html +0 -1999
- package/__tests__/coverage/lcov-report/src/plugin-registry.ts.html +0 -1897
- package/__tests__/coverage/lcov-report/src/plugins/official/hive-mind-plugin.ts.html +0 -1075
- package/__tests__/coverage/lcov-report/src/plugins/official/index.html +0 -131
- package/__tests__/coverage/lcov-report/src/plugins/official/maestro-plugin.ts.html +0 -1609
- package/__tests__/coverage/lcov-report/src/resilience/bulkhead.ts.html +0 -916
- package/__tests__/coverage/lcov-report/src/resilience/circuit-breaker.ts.html +0 -1063
- package/__tests__/coverage/lcov-report/src/resilience/index.html +0 -161
- package/__tests__/coverage/lcov-report/src/resilience/rate-limiter.ts.html +0 -1345
- package/__tests__/coverage/lcov-report/src/resilience/retry.ts.html +0 -757
- package/__tests__/coverage/lcov-report/src/security/index.html +0 -131
- package/__tests__/coverage/lcov-report/src/security/input-validation.ts.html +0 -880
- package/__tests__/coverage/lcov-report/src/security/secure-random.ts.html +0 -562
- package/__tests__/coverage/lcov-report/src/types/index.html +0 -131
- package/__tests__/coverage/lcov-report/src/types/swarm.types.ts.html +0 -850
- package/__tests__/coverage/lcov-report/src/types/task.types.ts.html +0 -700
- package/__tests__/coverage/lcov-report/src/types.ts.html +0 -1186
- package/__tests__/coverage/lcov-report/src/utils/index.html +0 -116
- package/__tests__/coverage/lcov-report/src/utils/secure-logger.ts.html +0 -856
- package/__tests__/coverage/lcov.info +0 -19877
- package/__tests__/coverage/prettify.css +0 -1
- package/__tests__/coverage/prettify.js +0 -2
- package/__tests__/coverage/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/sorter.js +0 -210
- package/__tests__/coverage/src/core/config/defaults.ts.html +0 -706
- package/__tests__/coverage/src/core/config/index.html +0 -161
- package/__tests__/coverage/src/core/config/loader.ts.html +0 -898
- package/__tests__/coverage/src/core/config/schema.ts.html +0 -649
- package/__tests__/coverage/src/core/config/validator.ts.html +0 -712
- package/__tests__/coverage/src/core/event-bus.ts.html +0 -793
- package/__tests__/coverage/src/core/index.html +0 -116
- package/__tests__/coverage/src/core/interfaces/event.interface.ts.html +0 -886
- package/__tests__/coverage/src/core/interfaces/index.html +0 -116
- package/__tests__/coverage/src/core/orchestrator/event-coordinator.ts.html +0 -451
- package/__tests__/coverage/src/core/orchestrator/health-monitor.ts.html +0 -727
- package/__tests__/coverage/src/core/orchestrator/index.html +0 -176
- package/__tests__/coverage/src/core/orchestrator/lifecycle-manager.ts.html +0 -874
- package/__tests__/coverage/src/core/orchestrator/session-manager.ts.html +0 -922
- package/__tests__/coverage/src/core/orchestrator/task-manager.ts.html +0 -1036
- package/__tests__/coverage/src/events/domain-events.ts.html +0 -1837
- package/__tests__/coverage/src/events/event-store.ts.html +0 -1849
- package/__tests__/coverage/src/events/example-usage.ts.html +0 -964
- package/__tests__/coverage/src/events/index.html +0 -176
- package/__tests__/coverage/src/events/projections.ts.html +0 -1768
- package/__tests__/coverage/src/events/state-reconstructor.ts.html +0 -1132
- package/__tests__/coverage/src/events.ts.html +0 -1186
- package/__tests__/coverage/src/hooks/example-usage.ts.html +0 -1582
- package/__tests__/coverage/src/hooks/executor.ts.html +0 -1222
- package/__tests__/coverage/src/hooks/index.html +0 -191
- package/__tests__/coverage/src/hooks/registry.ts.html +0 -1084
- package/__tests__/coverage/src/hooks/safety/bash-safety.ts.html +0 -1897
- package/__tests__/coverage/src/hooks/safety/file-organization.ts.html +0 -1504
- package/__tests__/coverage/src/hooks/safety/git-commit.ts.html +0 -1954
- package/__tests__/coverage/src/hooks/safety/index.html +0 -146
- package/__tests__/coverage/src/hooks/session-hooks.ts.html +0 -1762
- package/__tests__/coverage/src/hooks/task-hooks.ts.html +0 -1624
- package/__tests__/coverage/src/hooks/types.ts.html +0 -1156
- package/__tests__/coverage/src/index.html +0 -176
- package/__tests__/coverage/src/mcp/connection-pool.ts.html +0 -1399
- package/__tests__/coverage/src/mcp/index.html +0 -176
- package/__tests__/coverage/src/mcp/server.ts.html +0 -2407
- package/__tests__/coverage/src/mcp/session-manager.ts.html +0 -1369
- package/__tests__/coverage/src/mcp/tool-registry.ts.html +0 -1783
- package/__tests__/coverage/src/mcp/transport/http.ts.html +0 -1756
- package/__tests__/coverage/src/mcp/transport/index.html +0 -146
- package/__tests__/coverage/src/mcp/transport/stdio.ts.html +0 -1057
- package/__tests__/coverage/src/mcp/transport/websocket.ts.html +0 -1537
- package/__tests__/coverage/src/mcp/types.ts.html +0 -1780
- package/__tests__/coverage/src/plugin-interface.ts.html +0 -2074
- package/__tests__/coverage/src/plugin-loader.ts.html +0 -1999
- package/__tests__/coverage/src/plugin-registry.ts.html +0 -1897
- package/__tests__/coverage/src/plugins/official/hive-mind-plugin.ts.html +0 -1075
- package/__tests__/coverage/src/plugins/official/index.html +0 -131
- package/__tests__/coverage/src/plugins/official/maestro-plugin.ts.html +0 -1609
- package/__tests__/coverage/src/resilience/bulkhead.ts.html +0 -916
- package/__tests__/coverage/src/resilience/circuit-breaker.ts.html +0 -1063
- package/__tests__/coverage/src/resilience/index.html +0 -161
- package/__tests__/coverage/src/resilience/rate-limiter.ts.html +0 -1345
- package/__tests__/coverage/src/resilience/retry.ts.html +0 -757
- package/__tests__/coverage/src/security/index.html +0 -131
- package/__tests__/coverage/src/security/input-validation.ts.html +0 -880
- package/__tests__/coverage/src/security/secure-random.ts.html +0 -562
- package/__tests__/coverage/src/types/index.html +0 -131
- package/__tests__/coverage/src/types/swarm.types.ts.html +0 -850
- package/__tests__/coverage/src/types/task.types.ts.html +0 -700
- package/__tests__/coverage/src/types.ts.html +0 -1186
- package/__tests__/coverage/src/utils/index.html +0 -116
- package/__tests__/coverage/src/utils/secure-logger.ts.html +0 -856
|
@@ -1,880 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<!doctype html>
|
|
3
|
-
<html lang="en">
|
|
4
|
-
|
|
5
|
-
<head>
|
|
6
|
-
<title>Code coverage report for src/security/input-validation.ts</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><a href="../../index.html">All files</a> / <a href="index.html">src/security</a> input-validation.ts</h1>
|
|
23
|
-
<div class='clearfix'>
|
|
24
|
-
|
|
25
|
-
<div class='fl pad1y space-right2'>
|
|
26
|
-
<span class="strong">0% </span>
|
|
27
|
-
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>0/265</span>
|
|
29
|
-
</div>
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">0% </span>
|
|
34
|
-
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>0/1</span>
|
|
36
|
-
</div>
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
<div class='fl pad1y space-right2'>
|
|
40
|
-
<span class="strong">0% </span>
|
|
41
|
-
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>0/1</span>
|
|
43
|
-
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<div class='fl pad1y space-right2'>
|
|
47
|
-
<span class="strong">0% </span>
|
|
48
|
-
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>0/265</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 low'></div>
|
|
65
|
-
<pre><table class="coverage">
|
|
66
|
-
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
-
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
-
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
-
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
-
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
-
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
-
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
-
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
-
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
-
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
-
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
-
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
-
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
-
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
-
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
-
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
-
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
-
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
-
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
-
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
-
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
-
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
-
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
-
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
-
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
-
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
-
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
-
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
-
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
-
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
-
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
-
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
-
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
-
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
-
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
-
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
-
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
-
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
-
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
-
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
-
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
-
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
-
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
-
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
-
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
-
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
-
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
-
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
-
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
-
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
-
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
-
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
-
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
-
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
-
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
-
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
-
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
-
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
-
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
-
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
-
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
-
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
-
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
-
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
-
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
-
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
-
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
-
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
-
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
-
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
-
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
-
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
-
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
-
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
-
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
-
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
-
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
-
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
-
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
-
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
-
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
-
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
-
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
-
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
-
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
-
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
-
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
-
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
-
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
-
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
-
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
-
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
-
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
-
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
-
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
-
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
-
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
-
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
-
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
-
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
-
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
-
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
-
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
-
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
-
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
-
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
-
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
-
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
-
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
-
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
-
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
-
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
-
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
-
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
-
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
-
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
-
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
-
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
-
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
-
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
-
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
-
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
-
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
-
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
-
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
-
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
-
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
-
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
-
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
-
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
-
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
-
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
-
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
-
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
-
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
-
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
-
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
-
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
-
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
-
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
-
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
-
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
-
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
-
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
-
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
-
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
-
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
-
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
-
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
-
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
-
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
-
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
-
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
-
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
-
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
-
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
-
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
-
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
-
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
-
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
-
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
-
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
-
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
-
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
-
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
-
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
-
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
-
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
-
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
-
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
-
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
-
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
-
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
-
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
-
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
-
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
-
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
-
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
-
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
-
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
-
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
-
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
-
<a name='L185'></a><a href='#L185'>185</a>
|
|
251
|
-
<a name='L186'></a><a href='#L186'>186</a>
|
|
252
|
-
<a name='L187'></a><a href='#L187'>187</a>
|
|
253
|
-
<a name='L188'></a><a href='#L188'>188</a>
|
|
254
|
-
<a name='L189'></a><a href='#L189'>189</a>
|
|
255
|
-
<a name='L190'></a><a href='#L190'>190</a>
|
|
256
|
-
<a name='L191'></a><a href='#L191'>191</a>
|
|
257
|
-
<a name='L192'></a><a href='#L192'>192</a>
|
|
258
|
-
<a name='L193'></a><a href='#L193'>193</a>
|
|
259
|
-
<a name='L194'></a><a href='#L194'>194</a>
|
|
260
|
-
<a name='L195'></a><a href='#L195'>195</a>
|
|
261
|
-
<a name='L196'></a><a href='#L196'>196</a>
|
|
262
|
-
<a name='L197'></a><a href='#L197'>197</a>
|
|
263
|
-
<a name='L198'></a><a href='#L198'>198</a>
|
|
264
|
-
<a name='L199'></a><a href='#L199'>199</a>
|
|
265
|
-
<a name='L200'></a><a href='#L200'>200</a>
|
|
266
|
-
<a name='L201'></a><a href='#L201'>201</a>
|
|
267
|
-
<a name='L202'></a><a href='#L202'>202</a>
|
|
268
|
-
<a name='L203'></a><a href='#L203'>203</a>
|
|
269
|
-
<a name='L204'></a><a href='#L204'>204</a>
|
|
270
|
-
<a name='L205'></a><a href='#L205'>205</a>
|
|
271
|
-
<a name='L206'></a><a href='#L206'>206</a>
|
|
272
|
-
<a name='L207'></a><a href='#L207'>207</a>
|
|
273
|
-
<a name='L208'></a><a href='#L208'>208</a>
|
|
274
|
-
<a name='L209'></a><a href='#L209'>209</a>
|
|
275
|
-
<a name='L210'></a><a href='#L210'>210</a>
|
|
276
|
-
<a name='L211'></a><a href='#L211'>211</a>
|
|
277
|
-
<a name='L212'></a><a href='#L212'>212</a>
|
|
278
|
-
<a name='L213'></a><a href='#L213'>213</a>
|
|
279
|
-
<a name='L214'></a><a href='#L214'>214</a>
|
|
280
|
-
<a name='L215'></a><a href='#L215'>215</a>
|
|
281
|
-
<a name='L216'></a><a href='#L216'>216</a>
|
|
282
|
-
<a name='L217'></a><a href='#L217'>217</a>
|
|
283
|
-
<a name='L218'></a><a href='#L218'>218</a>
|
|
284
|
-
<a name='L219'></a><a href='#L219'>219</a>
|
|
285
|
-
<a name='L220'></a><a href='#L220'>220</a>
|
|
286
|
-
<a name='L221'></a><a href='#L221'>221</a>
|
|
287
|
-
<a name='L222'></a><a href='#L222'>222</a>
|
|
288
|
-
<a name='L223'></a><a href='#L223'>223</a>
|
|
289
|
-
<a name='L224'></a><a href='#L224'>224</a>
|
|
290
|
-
<a name='L225'></a><a href='#L225'>225</a>
|
|
291
|
-
<a name='L226'></a><a href='#L226'>226</a>
|
|
292
|
-
<a name='L227'></a><a href='#L227'>227</a>
|
|
293
|
-
<a name='L228'></a><a href='#L228'>228</a>
|
|
294
|
-
<a name='L229'></a><a href='#L229'>229</a>
|
|
295
|
-
<a name='L230'></a><a href='#L230'>230</a>
|
|
296
|
-
<a name='L231'></a><a href='#L231'>231</a>
|
|
297
|
-
<a name='L232'></a><a href='#L232'>232</a>
|
|
298
|
-
<a name='L233'></a><a href='#L233'>233</a>
|
|
299
|
-
<a name='L234'></a><a href='#L234'>234</a>
|
|
300
|
-
<a name='L235'></a><a href='#L235'>235</a>
|
|
301
|
-
<a name='L236'></a><a href='#L236'>236</a>
|
|
302
|
-
<a name='L237'></a><a href='#L237'>237</a>
|
|
303
|
-
<a name='L238'></a><a href='#L238'>238</a>
|
|
304
|
-
<a name='L239'></a><a href='#L239'>239</a>
|
|
305
|
-
<a name='L240'></a><a href='#L240'>240</a>
|
|
306
|
-
<a name='L241'></a><a href='#L241'>241</a>
|
|
307
|
-
<a name='L242'></a><a href='#L242'>242</a>
|
|
308
|
-
<a name='L243'></a><a href='#L243'>243</a>
|
|
309
|
-
<a name='L244'></a><a href='#L244'>244</a>
|
|
310
|
-
<a name='L245'></a><a href='#L245'>245</a>
|
|
311
|
-
<a name='L246'></a><a href='#L246'>246</a>
|
|
312
|
-
<a name='L247'></a><a href='#L247'>247</a>
|
|
313
|
-
<a name='L248'></a><a href='#L248'>248</a>
|
|
314
|
-
<a name='L249'></a><a href='#L249'>249</a>
|
|
315
|
-
<a name='L250'></a><a href='#L250'>250</a>
|
|
316
|
-
<a name='L251'></a><a href='#L251'>251</a>
|
|
317
|
-
<a name='L252'></a><a href='#L252'>252</a>
|
|
318
|
-
<a name='L253'></a><a href='#L253'>253</a>
|
|
319
|
-
<a name='L254'></a><a href='#L254'>254</a>
|
|
320
|
-
<a name='L255'></a><a href='#L255'>255</a>
|
|
321
|
-
<a name='L256'></a><a href='#L256'>256</a>
|
|
322
|
-
<a name='L257'></a><a href='#L257'>257</a>
|
|
323
|
-
<a name='L258'></a><a href='#L258'>258</a>
|
|
324
|
-
<a name='L259'></a><a href='#L259'>259</a>
|
|
325
|
-
<a name='L260'></a><a href='#L260'>260</a>
|
|
326
|
-
<a name='L261'></a><a href='#L261'>261</a>
|
|
327
|
-
<a name='L262'></a><a href='#L262'>262</a>
|
|
328
|
-
<a name='L263'></a><a href='#L263'>263</a>
|
|
329
|
-
<a name='L264'></a><a href='#L264'>264</a>
|
|
330
|
-
<a name='L265'></a><a href='#L265'>265</a>
|
|
331
|
-
<a name='L266'></a><a href='#L266'>266</a></td><td class="line-coverage quiet"><span class="cline-any cline-no"> </span>
|
|
332
|
-
<span class="cline-any cline-no"> </span>
|
|
333
|
-
<span class="cline-any cline-no"> </span>
|
|
334
|
-
<span class="cline-any cline-no"> </span>
|
|
335
|
-
<span class="cline-any cline-no"> </span>
|
|
336
|
-
<span class="cline-any cline-no"> </span>
|
|
337
|
-
<span class="cline-any cline-no"> </span>
|
|
338
|
-
<span class="cline-any cline-no"> </span>
|
|
339
|
-
<span class="cline-any cline-no"> </span>
|
|
340
|
-
<span class="cline-any cline-no"> </span>
|
|
341
|
-
<span class="cline-any cline-no"> </span>
|
|
342
|
-
<span class="cline-any cline-no"> </span>
|
|
343
|
-
<span class="cline-any cline-no"> </span>
|
|
344
|
-
<span class="cline-any cline-no"> </span>
|
|
345
|
-
<span class="cline-any cline-no"> </span>
|
|
346
|
-
<span class="cline-any cline-no"> </span>
|
|
347
|
-
<span class="cline-any cline-no"> </span>
|
|
348
|
-
<span class="cline-any cline-no"> </span>
|
|
349
|
-
<span class="cline-any cline-no"> </span>
|
|
350
|
-
<span class="cline-any cline-no"> </span>
|
|
351
|
-
<span class="cline-any cline-no"> </span>
|
|
352
|
-
<span class="cline-any cline-no"> </span>
|
|
353
|
-
<span class="cline-any cline-no"> </span>
|
|
354
|
-
<span class="cline-any cline-no"> </span>
|
|
355
|
-
<span class="cline-any cline-no"> </span>
|
|
356
|
-
<span class="cline-any cline-no"> </span>
|
|
357
|
-
<span class="cline-any cline-no"> </span>
|
|
358
|
-
<span class="cline-any cline-no"> </span>
|
|
359
|
-
<span class="cline-any cline-no"> </span>
|
|
360
|
-
<span class="cline-any cline-no"> </span>
|
|
361
|
-
<span class="cline-any cline-no"> </span>
|
|
362
|
-
<span class="cline-any cline-no"> </span>
|
|
363
|
-
<span class="cline-any cline-no"> </span>
|
|
364
|
-
<span class="cline-any cline-no"> </span>
|
|
365
|
-
<span class="cline-any cline-no"> </span>
|
|
366
|
-
<span class="cline-any cline-no"> </span>
|
|
367
|
-
<span class="cline-any cline-no"> </span>
|
|
368
|
-
<span class="cline-any cline-no"> </span>
|
|
369
|
-
<span class="cline-any cline-no"> </span>
|
|
370
|
-
<span class="cline-any cline-no"> </span>
|
|
371
|
-
<span class="cline-any cline-no"> </span>
|
|
372
|
-
<span class="cline-any cline-no"> </span>
|
|
373
|
-
<span class="cline-any cline-no"> </span>
|
|
374
|
-
<span class="cline-any cline-no"> </span>
|
|
375
|
-
<span class="cline-any cline-no"> </span>
|
|
376
|
-
<span class="cline-any cline-no"> </span>
|
|
377
|
-
<span class="cline-any cline-no"> </span>
|
|
378
|
-
<span class="cline-any cline-no"> </span>
|
|
379
|
-
<span class="cline-any cline-no"> </span>
|
|
380
|
-
<span class="cline-any cline-no"> </span>
|
|
381
|
-
<span class="cline-any cline-no"> </span>
|
|
382
|
-
<span class="cline-any cline-no"> </span>
|
|
383
|
-
<span class="cline-any cline-no"> </span>
|
|
384
|
-
<span class="cline-any cline-no"> </span>
|
|
385
|
-
<span class="cline-any cline-no"> </span>
|
|
386
|
-
<span class="cline-any cline-no"> </span>
|
|
387
|
-
<span class="cline-any cline-no"> </span>
|
|
388
|
-
<span class="cline-any cline-no"> </span>
|
|
389
|
-
<span class="cline-any cline-no"> </span>
|
|
390
|
-
<span class="cline-any cline-no"> </span>
|
|
391
|
-
<span class="cline-any cline-no"> </span>
|
|
392
|
-
<span class="cline-any cline-no"> </span>
|
|
393
|
-
<span class="cline-any cline-no"> </span>
|
|
394
|
-
<span class="cline-any cline-no"> </span>
|
|
395
|
-
<span class="cline-any cline-no"> </span>
|
|
396
|
-
<span class="cline-any cline-no"> </span>
|
|
397
|
-
<span class="cline-any cline-no"> </span>
|
|
398
|
-
<span class="cline-any cline-no"> </span>
|
|
399
|
-
<span class="cline-any cline-no"> </span>
|
|
400
|
-
<span class="cline-any cline-no"> </span>
|
|
401
|
-
<span class="cline-any cline-no"> </span>
|
|
402
|
-
<span class="cline-any cline-no"> </span>
|
|
403
|
-
<span class="cline-any cline-no"> </span>
|
|
404
|
-
<span class="cline-any cline-no"> </span>
|
|
405
|
-
<span class="cline-any cline-no"> </span>
|
|
406
|
-
<span class="cline-any cline-no"> </span>
|
|
407
|
-
<span class="cline-any cline-no"> </span>
|
|
408
|
-
<span class="cline-any cline-no"> </span>
|
|
409
|
-
<span class="cline-any cline-no"> </span>
|
|
410
|
-
<span class="cline-any cline-no"> </span>
|
|
411
|
-
<span class="cline-any cline-no"> </span>
|
|
412
|
-
<span class="cline-any cline-no"> </span>
|
|
413
|
-
<span class="cline-any cline-no"> </span>
|
|
414
|
-
<span class="cline-any cline-no"> </span>
|
|
415
|
-
<span class="cline-any cline-no"> </span>
|
|
416
|
-
<span class="cline-any cline-no"> </span>
|
|
417
|
-
<span class="cline-any cline-no"> </span>
|
|
418
|
-
<span class="cline-any cline-no"> </span>
|
|
419
|
-
<span class="cline-any cline-no"> </span>
|
|
420
|
-
<span class="cline-any cline-no"> </span>
|
|
421
|
-
<span class="cline-any cline-no"> </span>
|
|
422
|
-
<span class="cline-any cline-no"> </span>
|
|
423
|
-
<span class="cline-any cline-no"> </span>
|
|
424
|
-
<span class="cline-any cline-no"> </span>
|
|
425
|
-
<span class="cline-any cline-no"> </span>
|
|
426
|
-
<span class="cline-any cline-no"> </span>
|
|
427
|
-
<span class="cline-any cline-no"> </span>
|
|
428
|
-
<span class="cline-any cline-no"> </span>
|
|
429
|
-
<span class="cline-any cline-no"> </span>
|
|
430
|
-
<span class="cline-any cline-no"> </span>
|
|
431
|
-
<span class="cline-any cline-no"> </span>
|
|
432
|
-
<span class="cline-any cline-no"> </span>
|
|
433
|
-
<span class="cline-any cline-no"> </span>
|
|
434
|
-
<span class="cline-any cline-no"> </span>
|
|
435
|
-
<span class="cline-any cline-no"> </span>
|
|
436
|
-
<span class="cline-any cline-no"> </span>
|
|
437
|
-
<span class="cline-any cline-no"> </span>
|
|
438
|
-
<span class="cline-any cline-no"> </span>
|
|
439
|
-
<span class="cline-any cline-no"> </span>
|
|
440
|
-
<span class="cline-any cline-no"> </span>
|
|
441
|
-
<span class="cline-any cline-no"> </span>
|
|
442
|
-
<span class="cline-any cline-no"> </span>
|
|
443
|
-
<span class="cline-any cline-no"> </span>
|
|
444
|
-
<span class="cline-any cline-no"> </span>
|
|
445
|
-
<span class="cline-any cline-no"> </span>
|
|
446
|
-
<span class="cline-any cline-no"> </span>
|
|
447
|
-
<span class="cline-any cline-no"> </span>
|
|
448
|
-
<span class="cline-any cline-no"> </span>
|
|
449
|
-
<span class="cline-any cline-no"> </span>
|
|
450
|
-
<span class="cline-any cline-no"> </span>
|
|
451
|
-
<span class="cline-any cline-no"> </span>
|
|
452
|
-
<span class="cline-any cline-no"> </span>
|
|
453
|
-
<span class="cline-any cline-no"> </span>
|
|
454
|
-
<span class="cline-any cline-no"> </span>
|
|
455
|
-
<span class="cline-any cline-no"> </span>
|
|
456
|
-
<span class="cline-any cline-no"> </span>
|
|
457
|
-
<span class="cline-any cline-no"> </span>
|
|
458
|
-
<span class="cline-any cline-no"> </span>
|
|
459
|
-
<span class="cline-any cline-no"> </span>
|
|
460
|
-
<span class="cline-any cline-no"> </span>
|
|
461
|
-
<span class="cline-any cline-no"> </span>
|
|
462
|
-
<span class="cline-any cline-no"> </span>
|
|
463
|
-
<span class="cline-any cline-no"> </span>
|
|
464
|
-
<span class="cline-any cline-no"> </span>
|
|
465
|
-
<span class="cline-any cline-no"> </span>
|
|
466
|
-
<span class="cline-any cline-no"> </span>
|
|
467
|
-
<span class="cline-any cline-no"> </span>
|
|
468
|
-
<span class="cline-any cline-no"> </span>
|
|
469
|
-
<span class="cline-any cline-no"> </span>
|
|
470
|
-
<span class="cline-any cline-no"> </span>
|
|
471
|
-
<span class="cline-any cline-no"> </span>
|
|
472
|
-
<span class="cline-any cline-no"> </span>
|
|
473
|
-
<span class="cline-any cline-no"> </span>
|
|
474
|
-
<span class="cline-any cline-no"> </span>
|
|
475
|
-
<span class="cline-any cline-no"> </span>
|
|
476
|
-
<span class="cline-any cline-no"> </span>
|
|
477
|
-
<span class="cline-any cline-no"> </span>
|
|
478
|
-
<span class="cline-any cline-no"> </span>
|
|
479
|
-
<span class="cline-any cline-no"> </span>
|
|
480
|
-
<span class="cline-any cline-no"> </span>
|
|
481
|
-
<span class="cline-any cline-no"> </span>
|
|
482
|
-
<span class="cline-any cline-no"> </span>
|
|
483
|
-
<span class="cline-any cline-no"> </span>
|
|
484
|
-
<span class="cline-any cline-no"> </span>
|
|
485
|
-
<span class="cline-any cline-no"> </span>
|
|
486
|
-
<span class="cline-any cline-no"> </span>
|
|
487
|
-
<span class="cline-any cline-no"> </span>
|
|
488
|
-
<span class="cline-any cline-no"> </span>
|
|
489
|
-
<span class="cline-any cline-no"> </span>
|
|
490
|
-
<span class="cline-any cline-no"> </span>
|
|
491
|
-
<span class="cline-any cline-no"> </span>
|
|
492
|
-
<span class="cline-any cline-no"> </span>
|
|
493
|
-
<span class="cline-any cline-no"> </span>
|
|
494
|
-
<span class="cline-any cline-no"> </span>
|
|
495
|
-
<span class="cline-any cline-no"> </span>
|
|
496
|
-
<span class="cline-any cline-no"> </span>
|
|
497
|
-
<span class="cline-any cline-no"> </span>
|
|
498
|
-
<span class="cline-any cline-no"> </span>
|
|
499
|
-
<span class="cline-any cline-no"> </span>
|
|
500
|
-
<span class="cline-any cline-no"> </span>
|
|
501
|
-
<span class="cline-any cline-no"> </span>
|
|
502
|
-
<span class="cline-any cline-no"> </span>
|
|
503
|
-
<span class="cline-any cline-no"> </span>
|
|
504
|
-
<span class="cline-any cline-no"> </span>
|
|
505
|
-
<span class="cline-any cline-no"> </span>
|
|
506
|
-
<span class="cline-any cline-no"> </span>
|
|
507
|
-
<span class="cline-any cline-no"> </span>
|
|
508
|
-
<span class="cline-any cline-no"> </span>
|
|
509
|
-
<span class="cline-any cline-no"> </span>
|
|
510
|
-
<span class="cline-any cline-no"> </span>
|
|
511
|
-
<span class="cline-any cline-no"> </span>
|
|
512
|
-
<span class="cline-any cline-no"> </span>
|
|
513
|
-
<span class="cline-any cline-no"> </span>
|
|
514
|
-
<span class="cline-any cline-no"> </span>
|
|
515
|
-
<span class="cline-any cline-no"> </span>
|
|
516
|
-
<span class="cline-any cline-no"> </span>
|
|
517
|
-
<span class="cline-any cline-no"> </span>
|
|
518
|
-
<span class="cline-any cline-no"> </span>
|
|
519
|
-
<span class="cline-any cline-no"> </span>
|
|
520
|
-
<span class="cline-any cline-no"> </span>
|
|
521
|
-
<span class="cline-any cline-no"> </span>
|
|
522
|
-
<span class="cline-any cline-no"> </span>
|
|
523
|
-
<span class="cline-any cline-no"> </span>
|
|
524
|
-
<span class="cline-any cline-no"> </span>
|
|
525
|
-
<span class="cline-any cline-no"> </span>
|
|
526
|
-
<span class="cline-any cline-no"> </span>
|
|
527
|
-
<span class="cline-any cline-no"> </span>
|
|
528
|
-
<span class="cline-any cline-no"> </span>
|
|
529
|
-
<span class="cline-any cline-no"> </span>
|
|
530
|
-
<span class="cline-any cline-no"> </span>
|
|
531
|
-
<span class="cline-any cline-no"> </span>
|
|
532
|
-
<span class="cline-any cline-no"> </span>
|
|
533
|
-
<span class="cline-any cline-no"> </span>
|
|
534
|
-
<span class="cline-any cline-no"> </span>
|
|
535
|
-
<span class="cline-any cline-no"> </span>
|
|
536
|
-
<span class="cline-any cline-no"> </span>
|
|
537
|
-
<span class="cline-any cline-no"> </span>
|
|
538
|
-
<span class="cline-any cline-no"> </span>
|
|
539
|
-
<span class="cline-any cline-no"> </span>
|
|
540
|
-
<span class="cline-any cline-no"> </span>
|
|
541
|
-
<span class="cline-any cline-no"> </span>
|
|
542
|
-
<span class="cline-any cline-no"> </span>
|
|
543
|
-
<span class="cline-any cline-no"> </span>
|
|
544
|
-
<span class="cline-any cline-no"> </span>
|
|
545
|
-
<span class="cline-any cline-no"> </span>
|
|
546
|
-
<span class="cline-any cline-no"> </span>
|
|
547
|
-
<span class="cline-any cline-no"> </span>
|
|
548
|
-
<span class="cline-any cline-no"> </span>
|
|
549
|
-
<span class="cline-any cline-no"> </span>
|
|
550
|
-
<span class="cline-any cline-no"> </span>
|
|
551
|
-
<span class="cline-any cline-no"> </span>
|
|
552
|
-
<span class="cline-any cline-no"> </span>
|
|
553
|
-
<span class="cline-any cline-no"> </span>
|
|
554
|
-
<span class="cline-any cline-no"> </span>
|
|
555
|
-
<span class="cline-any cline-no"> </span>
|
|
556
|
-
<span class="cline-any cline-no"> </span>
|
|
557
|
-
<span class="cline-any cline-no"> </span>
|
|
558
|
-
<span class="cline-any cline-no"> </span>
|
|
559
|
-
<span class="cline-any cline-no"> </span>
|
|
560
|
-
<span class="cline-any cline-no"> </span>
|
|
561
|
-
<span class="cline-any cline-no"> </span>
|
|
562
|
-
<span class="cline-any cline-no"> </span>
|
|
563
|
-
<span class="cline-any cline-no"> </span>
|
|
564
|
-
<span class="cline-any cline-no"> </span>
|
|
565
|
-
<span class="cline-any cline-no"> </span>
|
|
566
|
-
<span class="cline-any cline-no"> </span>
|
|
567
|
-
<span class="cline-any cline-no"> </span>
|
|
568
|
-
<span class="cline-any cline-no"> </span>
|
|
569
|
-
<span class="cline-any cline-no"> </span>
|
|
570
|
-
<span class="cline-any cline-no"> </span>
|
|
571
|
-
<span class="cline-any cline-no"> </span>
|
|
572
|
-
<span class="cline-any cline-no"> </span>
|
|
573
|
-
<span class="cline-any cline-no"> </span>
|
|
574
|
-
<span class="cline-any cline-no"> </span>
|
|
575
|
-
<span class="cline-any cline-no"> </span>
|
|
576
|
-
<span class="cline-any cline-no"> </span>
|
|
577
|
-
<span class="cline-any cline-no"> </span>
|
|
578
|
-
<span class="cline-any cline-no"> </span>
|
|
579
|
-
<span class="cline-any cline-no"> </span>
|
|
580
|
-
<span class="cline-any cline-no"> </span>
|
|
581
|
-
<span class="cline-any cline-no"> </span>
|
|
582
|
-
<span class="cline-any cline-no"> </span>
|
|
583
|
-
<span class="cline-any cline-no"> </span>
|
|
584
|
-
<span class="cline-any cline-no"> </span>
|
|
585
|
-
<span class="cline-any cline-no"> </span>
|
|
586
|
-
<span class="cline-any cline-no"> </span>
|
|
587
|
-
<span class="cline-any cline-no"> </span>
|
|
588
|
-
<span class="cline-any cline-no"> </span>
|
|
589
|
-
<span class="cline-any cline-no"> </span>
|
|
590
|
-
<span class="cline-any cline-no"> </span>
|
|
591
|
-
<span class="cline-any cline-no"> </span>
|
|
592
|
-
<span class="cline-any cline-no"> </span>
|
|
593
|
-
<span class="cline-any cline-no"> </span>
|
|
594
|
-
<span class="cline-any cline-no"> </span>
|
|
595
|
-
<span class="cline-any cline-no"> </span>
|
|
596
|
-
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" >/**<span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" ></span></span></span>
|
|
597
|
-
<span class="cstat-no" title="statement not covered" > * Input Validation Utilities</span>
|
|
598
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
599
|
-
<span class="cstat-no" title="statement not covered" > * Secure input validation and sanitization.</span>
|
|
600
|
-
<span class="cstat-no" title="statement not covered" > *</span>
|
|
601
|
-
<span class="cstat-no" title="statement not covered" > * @module v3/shared/security/input-validation</span>
|
|
602
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
603
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
604
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
605
|
-
<span class="cstat-no" title="statement not covered" > * Validation result</span>
|
|
606
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
607
|
-
<span class="cstat-no" title="statement not covered" >export interface ValidationResult {</span>
|
|
608
|
-
<span class="cstat-no" title="statement not covered" > valid: boolean;</span>
|
|
609
|
-
<span class="cstat-no" title="statement not covered" > error?: string;</span>
|
|
610
|
-
<span class="cstat-no" title="statement not covered" > sanitized?: unknown;</span>
|
|
611
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
612
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
613
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
614
|
-
<span class="cstat-no" title="statement not covered" > * Validation options</span>
|
|
615
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
616
|
-
<span class="cstat-no" title="statement not covered" >export interface ValidationOptions {</span>
|
|
617
|
-
<span class="cstat-no" title="statement not covered" > maxLength?: number;</span>
|
|
618
|
-
<span class="cstat-no" title="statement not covered" > minLength?: number;</span>
|
|
619
|
-
<span class="cstat-no" title="statement not covered" > pattern?: RegExp;</span>
|
|
620
|
-
<span class="cstat-no" title="statement not covered" > allowedChars?: RegExp;</span>
|
|
621
|
-
<span class="cstat-no" title="statement not covered" > required?: boolean;</span>
|
|
622
|
-
<span class="cstat-no" title="statement not covered" > trim?: boolean;</span>
|
|
623
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
624
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
625
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
626
|
-
<span class="cstat-no" title="statement not covered" > * Default validation options</span>
|
|
627
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
628
|
-
<span class="cstat-no" title="statement not covered" >const DEFAULT_OPTIONS: ValidationOptions = {</span>
|
|
629
|
-
<span class="cstat-no" title="statement not covered" > maxLength: 10000,</span>
|
|
630
|
-
<span class="cstat-no" title="statement not covered" > minLength: 0,</span>
|
|
631
|
-
<span class="cstat-no" title="statement not covered" > required: false,</span>
|
|
632
|
-
<span class="cstat-no" title="statement not covered" > trim: true,</span>
|
|
633
|
-
<span class="cstat-no" title="statement not covered" >};</span>
|
|
634
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
635
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
636
|
-
<span class="cstat-no" title="statement not covered" > * Validate and sanitize string input</span>
|
|
637
|
-
<span class="cstat-no" title="statement not covered" > * @param input Input string</span>
|
|
638
|
-
<span class="cstat-no" title="statement not covered" > * @param options Validation options</span>
|
|
639
|
-
<span class="cstat-no" title="statement not covered" > * @returns Validation result</span>
|
|
640
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
641
|
-
<span class="cstat-no" title="statement not covered" >export function validateInput(</span>
|
|
642
|
-
<span class="cstat-no" title="statement not covered" > input: unknown,</span>
|
|
643
|
-
<span class="cstat-no" title="statement not covered" > options: ValidationOptions = {}</span>
|
|
644
|
-
<span class="cstat-no" title="statement not covered" >): ValidationResult {</span>
|
|
645
|
-
<span class="cstat-no" title="statement not covered" > const opts = { ...DEFAULT_OPTIONS, ...options };</span>
|
|
646
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
647
|
-
<span class="cstat-no" title="statement not covered" > // Check if input exists</span>
|
|
648
|
-
<span class="cstat-no" title="statement not covered" > if (input === null || input === undefined) {</span>
|
|
649
|
-
<span class="cstat-no" title="statement not covered" > if (opts.required) {</span>
|
|
650
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Input is required' };</span>
|
|
651
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
652
|
-
<span class="cstat-no" title="statement not covered" > return { valid: true, sanitized: null };</span>
|
|
653
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
654
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
655
|
-
<span class="cstat-no" title="statement not covered" > // Convert to string</span>
|
|
656
|
-
<span class="cstat-no" title="statement not covered" > if (typeof input !== 'string') {</span>
|
|
657
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Input must be a string' };</span>
|
|
658
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
659
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
660
|
-
<span class="cstat-no" title="statement not covered" > let sanitized = input;</span>
|
|
661
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
662
|
-
<span class="cstat-no" title="statement not covered" > // Trim whitespace</span>
|
|
663
|
-
<span class="cstat-no" title="statement not covered" > if (opts.trim) {</span>
|
|
664
|
-
<span class="cstat-no" title="statement not covered" > sanitized = sanitized.trim();</span>
|
|
665
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
666
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
667
|
-
<span class="cstat-no" title="statement not covered" > // Check length</span>
|
|
668
|
-
<span class="cstat-no" title="statement not covered" > if (opts.minLength && sanitized.length < opts.minLength) {</span>
|
|
669
|
-
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
670
|
-
<span class="cstat-no" title="statement not covered" > valid: false,</span>
|
|
671
|
-
<span class="cstat-no" title="statement not covered" > error: `Input must be at least ${opts.minLength} characters`,</span>
|
|
672
|
-
<span class="cstat-no" title="statement not covered" > };</span>
|
|
673
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
674
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
675
|
-
<span class="cstat-no" title="statement not covered" > if (opts.maxLength && sanitized.length > opts.maxLength) {</span>
|
|
676
|
-
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
677
|
-
<span class="cstat-no" title="statement not covered" > valid: false,</span>
|
|
678
|
-
<span class="cstat-no" title="statement not covered" > error: `Input must be at most ${opts.maxLength} characters`,</span>
|
|
679
|
-
<span class="cstat-no" title="statement not covered" > };</span>
|
|
680
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
681
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
682
|
-
<span class="cstat-no" title="statement not covered" > // Check pattern</span>
|
|
683
|
-
<span class="cstat-no" title="statement not covered" > if (opts.pattern && !opts.pattern.test(sanitized)) {</span>
|
|
684
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Input does not match required pattern' };</span>
|
|
685
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
686
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
687
|
-
<span class="cstat-no" title="statement not covered" > // Check allowed characters</span>
|
|
688
|
-
<span class="cstat-no" title="statement not covered" > if (opts.allowedChars && !opts.allowedChars.test(sanitized)) {</span>
|
|
689
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Input contains invalid characters' };</span>
|
|
690
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
691
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
692
|
-
<span class="cstat-no" title="statement not covered" > return { valid: true, sanitized };</span>
|
|
693
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
694
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
695
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
696
|
-
<span class="cstat-no" title="statement not covered" > * Sanitize string by removing dangerous characters</span>
|
|
697
|
-
<span class="cstat-no" title="statement not covered" > * @param input Input string</span>
|
|
698
|
-
<span class="cstat-no" title="statement not covered" > * @returns Sanitized string</span>
|
|
699
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
700
|
-
<span class="cstat-no" title="statement not covered" >export function sanitizeString(input: string): string {</span>
|
|
701
|
-
<span class="cstat-no" title="statement not covered" > return input</span>
|
|
702
|
-
<span class="cstat-no" title="statement not covered" > .replace(/[<>]/g, '') // Remove HTML tags</span>
|
|
703
|
-
<span class="cstat-no" title="statement not covered" > .replace(/[\x00-\x1f\x7f]/g, '') // Remove control characters</span>
|
|
704
|
-
<span class="cstat-no" title="statement not covered" > .replace(/[\u2028\u2029]/g, '') // Remove line/paragraph separators</span>
|
|
705
|
-
<span class="cstat-no" title="statement not covered" > .trim();</span>
|
|
706
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
707
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
708
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
709
|
-
<span class="cstat-no" title="statement not covered" > * Validate file path (prevent path traversal)</span>
|
|
710
|
-
<span class="cstat-no" title="statement not covered" > * @param path File path</span>
|
|
711
|
-
<span class="cstat-no" title="statement not covered" > * @param allowedBase Allowed base directory</span>
|
|
712
|
-
<span class="cstat-no" title="statement not covered" > * @returns Validation result</span>
|
|
713
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
714
|
-
<span class="cstat-no" title="statement not covered" >export function validatePath(</span>
|
|
715
|
-
<span class="cstat-no" title="statement not covered" > path: string,</span>
|
|
716
|
-
<span class="cstat-no" title="statement not covered" > allowedBase?: string</span>
|
|
717
|
-
<span class="cstat-no" title="statement not covered" >): ValidationResult {</span>
|
|
718
|
-
<span class="cstat-no" title="statement not covered" > // Normalize and check for path traversal</span>
|
|
719
|
-
<span class="cstat-no" title="statement not covered" > const normalized = path</span>
|
|
720
|
-
<span class="cstat-no" title="statement not covered" > .replace(/\\/g, '/') // Normalize Windows paths</span>
|
|
721
|
-
<span class="cstat-no" title="statement not covered" > .replace(/\/+/g, '/'); // Remove duplicate slashes</span>
|
|
722
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
723
|
-
<span class="cstat-no" title="statement not covered" > // Check for dangerous patterns</span>
|
|
724
|
-
<span class="cstat-no" title="statement not covered" > if (normalized.includes('..') || normalized.includes('~')) {</span>
|
|
725
|
-
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
726
|
-
<span class="cstat-no" title="statement not covered" > valid: false,</span>
|
|
727
|
-
<span class="cstat-no" title="statement not covered" > error: 'Path contains directory traversal characters',</span>
|
|
728
|
-
<span class="cstat-no" title="statement not covered" > };</span>
|
|
729
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
730
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
731
|
-
<span class="cstat-no" title="statement not covered" > // Check for absolute paths outside allowed base</span>
|
|
732
|
-
<span class="cstat-no" title="statement not covered" > if (allowedBase && !normalized.startsWith(allowedBase)) {</span>
|
|
733
|
-
<span class="cstat-no" title="statement not covered" > const isAbsolute = normalized.startsWith('/') || /^[a-zA-Z]:/.test(normalized);</span>
|
|
734
|
-
<span class="cstat-no" title="statement not covered" > if (isAbsolute) {</span>
|
|
735
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Path is outside allowed directory' };</span>
|
|
736
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
737
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
738
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
739
|
-
<span class="cstat-no" title="statement not covered" > // Check for null bytes</span>
|
|
740
|
-
<span class="cstat-no" title="statement not covered" > if (normalized.includes('\0')) {</span>
|
|
741
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Path contains null bytes' };</span>
|
|
742
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
743
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
744
|
-
<span class="cstat-no" title="statement not covered" > // Check length</span>
|
|
745
|
-
<span class="cstat-no" title="statement not covered" > if (normalized.length > 4096) {</span>
|
|
746
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Path is too long' };</span>
|
|
747
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
748
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
749
|
-
<span class="cstat-no" title="statement not covered" > return { valid: true, sanitized: normalized };</span>
|
|
750
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
751
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
752
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
753
|
-
<span class="cstat-no" title="statement not covered" > * Validate command (prevent command injection)</span>
|
|
754
|
-
<span class="cstat-no" title="statement not covered" > * @param command Command string</span>
|
|
755
|
-
<span class="cstat-no" title="statement not covered" > * @param allowedCommands Optional whitelist of allowed commands</span>
|
|
756
|
-
<span class="cstat-no" title="statement not covered" > * @returns Validation result</span>
|
|
757
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
758
|
-
<span class="cstat-no" title="statement not covered" >export function validateCommand(</span>
|
|
759
|
-
<span class="cstat-no" title="statement not covered" > command: string,</span>
|
|
760
|
-
<span class="cstat-no" title="statement not covered" > allowedCommands?: string[]</span>
|
|
761
|
-
<span class="cstat-no" title="statement not covered" >): ValidationResult {</span>
|
|
762
|
-
<span class="cstat-no" title="statement not covered" > // Extract base command</span>
|
|
763
|
-
<span class="cstat-no" title="statement not covered" > const parts = command.trim().split(/\s+/);</span>
|
|
764
|
-
<span class="cstat-no" title="statement not covered" > const baseCommand = parts[0]?.toLowerCase();</span>
|
|
765
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
766
|
-
<span class="cstat-no" title="statement not covered" > if (!baseCommand) {</span>
|
|
767
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Empty command' };</span>
|
|
768
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
769
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
770
|
-
<span class="cstat-no" title="statement not covered" > // Check whitelist if provided</span>
|
|
771
|
-
<span class="cstat-no" title="statement not covered" > if (allowedCommands && !allowedCommands.includes(baseCommand)) {</span>
|
|
772
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: `Command '${baseCommand}' is not allowed` };</span>
|
|
773
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
774
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
775
|
-
<span class="cstat-no" title="statement not covered" > // Check for dangerous shell characters</span>
|
|
776
|
-
<span class="cstat-no" title="statement not covered" > const dangerousPatterns = [</span>
|
|
777
|
-
<span class="cstat-no" title="statement not covered" > /[;&|`$]/, // Shell operators</span>
|
|
778
|
-
<span class="cstat-no" title="statement not covered" > /\$\(/, // Command substitution</span>
|
|
779
|
-
<span class="cstat-no" title="statement not covered" > /`.*`/, // Backtick substitution</span>
|
|
780
|
-
<span class="cstat-no" title="statement not covered" > /\|\|/, // OR operator</span>
|
|
781
|
-
<span class="cstat-no" title="statement not covered" > /&&/, // AND operator</span>
|
|
782
|
-
<span class="cstat-no" title="statement not covered" > />\s*>/, // Append redirection</span>
|
|
783
|
-
<span class="cstat-no" title="statement not covered" > /<\s*</, // Here document</span>
|
|
784
|
-
<span class="cstat-no" title="statement not covered" > /\r|\n/, // Newlines (command chaining)</span>
|
|
785
|
-
<span class="cstat-no" title="statement not covered" > ];</span>
|
|
786
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
787
|
-
<span class="cstat-no" title="statement not covered" > for (const pattern of dangerousPatterns) {</span>
|
|
788
|
-
<span class="cstat-no" title="statement not covered" > if (pattern.test(command)) {</span>
|
|
789
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Command contains dangerous characters' };</span>
|
|
790
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
791
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
792
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
793
|
-
<span class="cstat-no" title="statement not covered" > return { valid: true, sanitized: command };</span>
|
|
794
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
795
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
796
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
797
|
-
<span class="cstat-no" title="statement not covered" > * Validate tags for safe SQL usage</span>
|
|
798
|
-
<span class="cstat-no" title="statement not covered" > * @param tags Array of tag strings</span>
|
|
799
|
-
<span class="cstat-no" title="statement not covered" > * @returns Validation result with sanitized tags</span>
|
|
800
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
801
|
-
<span class="cstat-no" title="statement not covered" >export function validateTags(tags: unknown): ValidationResult {</span>
|
|
802
|
-
<span class="cstat-no" title="statement not covered" > if (!Array.isArray(tags)) {</span>
|
|
803
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Tags must be an array' };</span>
|
|
804
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
805
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
806
|
-
<span class="cstat-no" title="statement not covered" > const sanitized: string[] = [];</span>
|
|
807
|
-
<span class="cstat-no" title="statement not covered" > const tagPattern = /^[a-zA-Z0-9_\-.:]+$/;</span>
|
|
808
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
809
|
-
<span class="cstat-no" title="statement not covered" > for (const tag of tags) {</span>
|
|
810
|
-
<span class="cstat-no" title="statement not covered" > if (typeof tag !== 'string') {</span>
|
|
811
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Each tag must be a string' };</span>
|
|
812
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
813
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
814
|
-
<span class="cstat-no" title="statement not covered" > const trimmed = tag.trim();</span>
|
|
815
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
816
|
-
<span class="cstat-no" title="statement not covered" > if (trimmed.length === 0) {</span>
|
|
817
|
-
<span class="cstat-no" title="statement not covered" > continue; // Skip empty tags</span>
|
|
818
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
819
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
820
|
-
<span class="cstat-no" title="statement not covered" > if (trimmed.length > 100) {</span>
|
|
821
|
-
<span class="cstat-no" title="statement not covered" > return { valid: false, error: 'Tag is too long (max 100 characters)' };</span>
|
|
822
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
823
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
824
|
-
<span class="cstat-no" title="statement not covered" > if (!tagPattern.test(trimmed)) {</span>
|
|
825
|
-
<span class="cstat-no" title="statement not covered" > return {</span>
|
|
826
|
-
<span class="cstat-no" title="statement not covered" > valid: false,</span>
|
|
827
|
-
<span class="cstat-no" title="statement not covered" > error: `Invalid tag: '${trimmed}'. Tags can only contain alphanumeric characters, underscores, hyphens, dots, and colons`,</span>
|
|
828
|
-
<span class="cstat-no" title="statement not covered" > };</span>
|
|
829
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
830
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
831
|
-
<span class="cstat-no" title="statement not covered" > sanitized.push(trimmed);</span>
|
|
832
|
-
<span class="cstat-no" title="statement not covered" > }</span>
|
|
833
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
834
|
-
<span class="cstat-no" title="statement not covered" > return { valid: true, sanitized };</span>
|
|
835
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
836
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
837
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
838
|
-
<span class="cstat-no" title="statement not covered" > * Check if string is a valid identifier</span>
|
|
839
|
-
<span class="cstat-no" title="statement not covered" > * @param id Identifier string</span>
|
|
840
|
-
<span class="cstat-no" title="statement not covered" > * @returns True if valid</span>
|
|
841
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
842
|
-
<span class="cstat-no" title="statement not covered" >export function isValidIdentifier(id: string): boolean {</span>
|
|
843
|
-
<span class="cstat-no" title="statement not covered" > return /^[a-zA-Z_][a-zA-Z0-9_\-]*$/.test(id) && id.length <= 256;</span>
|
|
844
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
845
|
-
<span class="cstat-no" title="statement not covered" ></span>
|
|
846
|
-
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
847
|
-
<span class="cstat-no" title="statement not covered" > * Escape string for safe SQL usage (use parameterized queries instead when possible)</span>
|
|
848
|
-
<span class="cstat-no" title="statement not covered" > * This is a LAST RESORT - always prefer parameterized queries</span>
|
|
849
|
-
<span class="cstat-no" title="statement not covered" > * @param value String to escape</span>
|
|
850
|
-
<span class="cstat-no" title="statement not covered" > * @returns Escaped string</span>
|
|
851
|
-
<span class="cstat-no" title="statement not covered" > */</span>
|
|
852
|
-
<span class="cstat-no" title="statement not covered" >export function escapeForSql(value: string): string {</span>
|
|
853
|
-
<span class="cstat-no" title="statement not covered" > return value</span>
|
|
854
|
-
<span class="cstat-no" title="statement not covered" > .replace(/'/g, "''") // Escape single quotes</span>
|
|
855
|
-
<span class="cstat-no" title="statement not covered" > .replace(/\\/g, '\\\\') // Escape backslashes</span>
|
|
856
|
-
<span class="cstat-no" title="statement not covered" > .replace(/\x00/g, '') // Remove null bytes</span>
|
|
857
|
-
<span class="cstat-no" title="statement not covered" > .replace(/\n/g, '\\n') // Escape newlines</span>
|
|
858
|
-
<span class="cstat-no" title="statement not covered" > .replace(/\r/g, '\\r') // Escape carriage returns</span>
|
|
859
|
-
<span class="cstat-no" title="statement not covered" > .replace(/\x1a/g, '\\Z'); // Escape ctrl+Z (EOF in Windows)</span>
|
|
860
|
-
<span class="cstat-no" title="statement not covered" >}</span>
|
|
861
|
-
</pre></td></tr></table></pre>
|
|
862
|
-
|
|
863
|
-
<div class='push'></div><!-- for sticky footer -->
|
|
864
|
-
</div><!-- /wrapper -->
|
|
865
|
-
<div class='footer quiet pad2 space-top1 center small'>
|
|
866
|
-
Code coverage generated by
|
|
867
|
-
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
868
|
-
at 2026-01-05T21:16:55.471Z
|
|
869
|
-
</div>
|
|
870
|
-
<script src="../../prettify.js"></script>
|
|
871
|
-
<script>
|
|
872
|
-
window.onload = function () {
|
|
873
|
-
prettyPrint();
|
|
874
|
-
};
|
|
875
|
-
</script>
|
|
876
|
-
<script src="../../sorter.js"></script>
|
|
877
|
-
<script src="../../block-navigation.js"></script>
|
|
878
|
-
</body>
|
|
879
|
-
</html>
|
|
880
|
-
|