@tomei/sso 0.64.1 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.commitlintrc.json +22 -22
 - package/.gitlab-ci.yml +16 -16
 - package/.husky/commit-msg +15 -15
 - package/.husky/pre-commit +7 -7
 - package/.prettierrc +4 -4
 - package/Jenkinsfile +57 -57
 - package/README.md +23 -23
 - package/__tests__/unit/components/group/group.spec.ts +79 -79
 - package/__tests__/unit/components/group-object-privilege/group-object-privilege.spec.ts +88 -88
 - package/__tests__/unit/components/group-privilege/group-privilege.spec.ts +68 -68
 - package/__tests__/unit/components/group-reporting-user/group-reporting-user.spec.ts +66 -66
 - package/__tests__/unit/components/group-system-access/group-system-access.spec.ts +83 -83
 - package/__tests__/unit/components/login-user/l.spec.ts +746 -746
 - package/__tests__/unit/components/login-user/login.spec.ts +1164 -1164
 - package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -31
 - package/__tests__/unit/components/system/system.spec.ts +254 -254
 - package/__tests__/unit/components/system-privilege/system-privilege.spec.ts +83 -83
 - package/__tests__/unit/components/user-group/user-group.spec.ts +86 -86
 - package/__tests__/unit/components/user-object-privilege/user-object-privilege.spec.ts +78 -78
 - package/__tests__/unit/components/user-privilege/user-privilege.spec.ts +72 -72
 - package/__tests__/unit/components/user-system-access/user-system-access.spec.ts +89 -89
 - package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
 - package/__tests__/unit/session/session.service.spec.ts +47 -47
 - package/__tests__/unit/system-privilege/system-privilage.spec.ts +91 -91
 - package/create-sso-user.sql +39 -39
 - package/dist/src/components/login-user/user.js +1 -1
 - package/dist/src/components/login-user/user.js.map +1 -1
 - package/dist/tsconfig.tsbuildinfo +1 -1
 - package/eslint.config.mjs +58 -58
 - package/jest.config.js +14 -14
 - package/migrations/20240314080602-create-user-table.js +124 -124
 - package/migrations/20240314080603-create-user-group-table.js +85 -85
 - package/migrations/20240314080604-create-user-user-group-table.js +55 -55
 - package/migrations/20240314080605-create-login-history-table.js +53 -53
 - package/migrations/20240527064925-create-system-table.js +78 -78
 - package/migrations/20240527064926-create-system-privilege-table.js +71 -71
 - package/migrations/20240527065342-create-group-table.js +93 -93
 - package/migrations/20240527065633-create-group-reporting-user-table.js +76 -76
 - package/migrations/20240528011551-create-group-system-access-table.js +72 -72
 - package/migrations/20240528023018-user-system-access-table.js +75 -75
 - package/migrations/20240528032229-user-privilege-table.js +76 -76
 - package/migrations/20240528063003-create-group-privilege-table.js +76 -76
 - package/migrations/20240528063051-create-group-object-privilege-table.js +84 -84
 - package/migrations/20240528063107-create-user-object-privilege-table.js +84 -84
 - package/migrations/20240528063108-create-api-key-table.js +85 -85
 - package/migrations/20241104104802-create-building-table.js +95 -95
 - package/migrations/20250108091132-add-area-manager-user-id-to-building-table.js +14 -14
 - package/migrations/20250108091133-add-passcode-to-user-table.js +36 -36
 - package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -76
 - package/migrations/20250326043818-crate-user-password-history.js +42 -42
 - package/migrations/20250610070720-added-MFBypassYN-to-sso-user.js +30 -30
 - package/package.json +87 -87
 - package/sampledotenv +7 -7
 - package/src/components/login-user/user.ts +1 -1
 - package/tsconfig.build.json +5 -5
 - package/tsconfig.json +23 -23
 - package/coverage/clover.xml +0 -1380
 - package/coverage/coverage-final.json +0 -39
 - package/coverage/lcov-report/base.css +0 -224
 - package/coverage/lcov-report/block-navigation.js +0 -87
 - package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.repository.ts.html +0 -160
 - package/coverage/lcov-report/components/group-object-privilege/group-object-privilege.ts.html +0 -919
 - package/coverage/lcov-report/components/group-object-privilege/index.html +0 -131
 - package/coverage/lcov-report/components/group-privilege/group-privilege.repository.ts.html +0 -172
 - package/coverage/lcov-report/components/group-privilege/group-privilege.ts.html +0 -337
 - package/coverage/lcov-report/components/group-privilege/index.html +0 -131
 - package/coverage/lcov-report/components/group-system-access/group-system-access.repository.ts.html +0 -214
 - package/coverage/lcov-report/components/group-system-access/group-system-access.ts.html +0 -355
 - package/coverage/lcov-report/components/group-system-access/index.html +0 -131
 - package/coverage/lcov-report/components/password-hash/index.html +0 -116
 - package/coverage/lcov-report/components/password-hash/password-hash.service.ts.html +0 -127
 - package/coverage/lcov-report/components/system-privilege/index.html +0 -116
 - package/coverage/lcov-report/components/system-privilege/system-privilege.repository.ts.html +0 -139
 - package/coverage/lcov-report/components/user-group/index.html +0 -131
 - package/coverage/lcov-report/components/user-group/user-group.repository.ts.html +0 -142
 - package/coverage/lcov-report/components/user-group/user-group.ts.html +0 -2377
 - package/coverage/lcov-report/components/user-object-privilege/index.html +0 -131
 - package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.repository.ts.html +0 -118
 - package/coverage/lcov-report/components/user-object-privilege/user-object-privilege.ts.html +0 -322
 - package/coverage/lcov-report/components/user-privilege/index.html +0 -131
 - package/coverage/lcov-report/components/user-privilege/user-privilege.repository.ts.html +0 -160
 - package/coverage/lcov-report/components/user-privilege/user-privilege.ts.html +0 -2071
 - package/coverage/lcov-report/components/user-system-access/index.html +0 -131
 - package/coverage/lcov-report/components/user-system-access/user-system-access.repository.ts.html +0 -208
 - package/coverage/lcov-report/components/user-system-access/user-system-access.ts.html +0 -2236
 - package/coverage/lcov-report/enum/api-key.enum.ts.html +0 -100
 - package/coverage/lcov-report/enum/group-type.enum.ts.html +0 -109
 - package/coverage/lcov-report/enum/index.html +0 -206
 - package/coverage/lcov-report/enum/index.ts.html +0 -103
 - package/coverage/lcov-report/enum/login-status.enum.ts.html +0 -97
 - package/coverage/lcov-report/enum/object-status.enum.ts.html +0 -97
 - package/coverage/lcov-report/enum/user-status.enum.ts.html +0 -106
 - package/coverage/lcov-report/enum/yn.enum.ts.html +0 -97
 - package/coverage/lcov-report/favicon.png +0 -0
 - package/coverage/lcov-report/index.html +0 -296
 - package/coverage/lcov-report/models/group-object-privilege.entity.ts.html +0 -358
 - package/coverage/lcov-report/models/group-privilege.entity.ts.html +0 -319
 - package/coverage/lcov-report/models/group-reporting-user.entity.ts.html +0 -370
 - package/coverage/lcov-report/models/group-system-access.entity.ts.html +0 -328
 - package/coverage/lcov-report/models/group.entity.ts.html +0 -466
 - package/coverage/lcov-report/models/index.html +0 -296
 - package/coverage/lcov-report/models/staff.entity.ts.html +0 -358
 - package/coverage/lcov-report/models/system-privilege.entity.ts.html +0 -355
 - package/coverage/lcov-report/models/system.entity.ts.html +0 -424
 - package/coverage/lcov-report/models/user-group.entity.ts.html +0 -358
 - package/coverage/lcov-report/models/user-object-privilege.entity.ts.html +0 -355
 - package/coverage/lcov-report/models/user-privilege.entity.ts.html +0 -319
 - package/coverage/lcov-report/models/user-system-access.entity.ts.html +0 -346
 - package/coverage/lcov-report/models/user.entity.ts.html +0 -685
 - package/coverage/lcov-report/prettify.css +0 -1
 - package/coverage/lcov-report/prettify.js +0 -2
 - package/coverage/lcov-report/redis-client/index.html +0 -116
 - package/coverage/lcov-report/redis-client/redis.service.ts.html +0 -310
 - package/coverage/lcov-report/session/index.html +0 -116
 - package/coverage/lcov-report/session/session.service.ts.html +0 -373
 - package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
 - package/coverage/lcov-report/sorter.js +0 -210
 - package/coverage/lcov.info +0 -2223
 - package/coverage/test-report.xml +0 -71
 - package/dist/__tests__/unit/components/group-privilege/group-privilege.test.d.ts +0 -1
 - package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js +0 -71
 - package/dist/__tests__/unit/components/group-privilege/group-privilege.test.js.map +0 -1
 - package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +0 -0
 - package/dist/__tests__/unit/components/login-user/login-user.spec.js +0 -6
 - package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +0 -1
 - package/sonar-project.properties +0 -23
 
| 
         @@ -1,373 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
            <!doctype html>
         
     | 
| 
       3 
     | 
    
         
            -
            <html lang="en">
         
     | 
| 
       4 
     | 
    
         
            -
             
     | 
| 
       5 
     | 
    
         
            -
            <head>
         
     | 
| 
       6 
     | 
    
         
            -
                <title>Code coverage report for session/session.service.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">session</a> session.service.ts</h1>
         
     | 
| 
       23 
     | 
    
         
            -
                    <div class='clearfix'>
         
     | 
| 
       24 
     | 
    
         
            -
                        
         
     | 
| 
       25 
     | 
    
         
            -
                        <div class='fl pad1y space-right2'>
         
     | 
| 
       26 
     | 
    
         
            -
                            <span class="strong">55% </span>
         
     | 
| 
       27 
     | 
    
         
            -
                            <span class="quiet">Statements</span>
         
     | 
| 
       28 
     | 
    
         
            -
                            <span class='fraction'>22/40</span>
         
     | 
| 
       29 
     | 
    
         
            -
                        </div>
         
     | 
| 
       30 
     | 
    
         
            -
                    
         
     | 
| 
       31 
     | 
    
         
            -
                        
         
     | 
| 
       32 
     | 
    
         
            -
                        <div class='fl pad1y space-right2'>
         
     | 
| 
       33 
     | 
    
         
            -
                            <span class="strong">63.63% </span>
         
     | 
| 
       34 
     | 
    
         
            -
                            <span class="quiet">Branches</span>
         
     | 
| 
       35 
     | 
    
         
            -
                            <span class='fraction'>7/11</span>
         
     | 
| 
       36 
     | 
    
         
            -
                        </div>
         
     | 
| 
       37 
     | 
    
         
            -
                    
         
     | 
| 
       38 
     | 
    
         
            -
                        
         
     | 
| 
       39 
     | 
    
         
            -
                        <div class='fl pad1y space-right2'>
         
     | 
| 
       40 
     | 
    
         
            -
                            <span class="strong">72.72% </span>
         
     | 
| 
       41 
     | 
    
         
            -
                            <span class="quiet">Functions</span>
         
     | 
| 
       42 
     | 
    
         
            -
                            <span class='fraction'>8/11</span>
         
     | 
| 
       43 
     | 
    
         
            -
                        </div>
         
     | 
| 
       44 
     | 
    
         
            -
                    
         
     | 
| 
       45 
     | 
    
         
            -
                        
         
     | 
| 
       46 
     | 
    
         
            -
                        <div class='fl pad1y space-right2'>
         
     | 
| 
       47 
     | 
    
         
            -
                            <span class="strong">55% </span>
         
     | 
| 
       48 
     | 
    
         
            -
                            <span class="quiet">Lines</span>
         
     | 
| 
       49 
     | 
    
         
            -
                            <span class='fraction'>22/40</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 medium'></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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
         
     | 
| 
       163 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       164 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       165 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       166 
     | 
    
         
            -
            <span class="cline-any cline-yes">1x</span>
         
     | 
| 
       167 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       168 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       169 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       170 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       171 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       172 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       173 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       174 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       175 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       176 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       177 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       178 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       179 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       180 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       181 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       182 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       183 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       184 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       185 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       186 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       187 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       188 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       189 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       190 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       191 
     | 
    
         
            -
            <span class="cline-any cline-yes">3x</span>
         
     | 
| 
       192 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       193 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       194 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       195 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       196 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       197 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       198 
     | 
    
         
            -
            <span class="cline-any cline-yes">2x</span>
         
     | 
| 
       199 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       200 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       201 
     | 
    
         
            -
            <span class="cline-any cline-yes">2x</span>
         
     | 
| 
       202 
     | 
    
         
            -
            <span class="cline-any cline-yes">2x</span>
         
     | 
| 
       203 
     | 
    
         
            -
            <span class="cline-any cline-yes">2x</span>
         
     | 
| 
       204 
     | 
    
         
            -
            <span class="cline-any cline-yes">2x</span>
         
     | 
| 
       205 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       206 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       207 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       208 
     | 
    
         
            -
            <span class="cline-any cline-yes">2x</span>
         
     | 
| 
       209 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       210 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       211 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       212 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       213 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       214 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       215 
     | 
    
         
            -
            <span class="cline-any cline-yes">1x</span>
         
     | 
| 
       216 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       217 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       218 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       219 
     | 
    
         
            -
            <span class="cline-any cline-yes">1x</span>
         
     | 
| 
       220 
     | 
    
         
            -
            <span class="cline-any cline-yes">1x</span>
         
     | 
| 
       221 
     | 
    
         
            -
            <span class="cline-any cline-yes">1x</span>
         
     | 
| 
       222 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       223 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       224 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       225 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       226 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       227 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       228 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       229 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       230 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       231 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       232 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       233 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       234 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       235 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       236 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       237 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       238 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       239 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       240 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       241 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       242 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       243 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       244 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       245 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       246 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       247 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       248 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       249 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       250 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       251 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       252 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       253 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       254 
     | 
    
         
            -
            <span class="cline-any cline-no"> </span>
         
     | 
| 
       255 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       256 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       257 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span>
         
     | 
| 
       258 
     | 
    
         
            -
            <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { RedisService } from '../redis-client/redis.service';
         
     | 
| 
       259 
     | 
    
         
            -
            import { ISessionService } from './interfaces/session-service.interface';
         
     | 
| 
       260 
     | 
    
         
            -
            import { IUserSession } from '../interfaces/user-session.interface';
         
     | 
| 
       261 
     | 
    
         
            -
             
         
     | 
| 
       262 
     | 
    
         
            -
            export class SessionService implements ISessionService {
         
     | 
| 
       263 
     | 
    
         
            -
              private static _RedisService: RedisService;
         
     | 
| 
       264 
     | 
    
         
            -
              private environment: string = '';
         
     | 
| 
       265 
     | 
    
         
            -
             
         
     | 
| 
       266 
     | 
    
         
            -
              private constructor() {}
         
     | 
| 
       267 
     | 
    
         
            -
             
         
     | 
| 
       268 
     | 
    
         
            -
              static async init(redisClient?: any): Promise<SessionService> {
         
     | 
| 
       269 
     | 
    
         
            -
                const sessionService = new SessionService();
         
     | 
| 
       270 
     | 
    
         
            -
                SessionService._RedisService = await RedisService.init(redisClient);
         
     | 
| 
       271 
     | 
    
         
            -
                if (process.env.NODE_ENV == 'test') {
         
     | 
| 
       272 
     | 
    
         
            -
                  sessionService.environment = 'test:';
         
     | 
| 
       273 
     | 
    
         
            -
                } else <span class="cstat-no" title="statement not covered" ><span class="missing-if-branch" title="else path not taken" >E</span>if (process.env.NODE_ENV == 'staging') {</span>
         
     | 
| 
       274 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      sessionService.environment = 'staging:';</span>
         
     | 
| 
       275 
     | 
    
         
            -
                }
         
     | 
| 
       276 
     | 
    
         
            -
                return sessionService;
         
     | 
| 
       277 
     | 
    
         
            -
              }
         
     | 
| 
       278 
     | 
    
         
            -
             
         
     | 
| 
       279 
     | 
    
         
            -
              async setUserSession(
         
     | 
| 
       280 
     | 
    
         
            -
                userId: string,
         
     | 
| 
       281 
     | 
    
         
            -
                sessionData: IUserSession,
         
     | 
| 
       282 
     | 
    
         
            -
                sessionName: string = 'tomei-sid',
         
     | 
| 
       283 
     | 
    
         
            -
                duration: number = 60 * 60, //1 hour
         
     | 
| 
       284 
     | 
    
         
            -
              ): Promise<void> {
         
     | 
| 
       285 
     | 
    
         
            -
                try {
         
     | 
| 
       286 
     | 
    
         
            -
                  const key = `${this.environment}${sessionName}:${userId}`;
         
     | 
| 
       287 
     | 
    
         
            -
                  await SessionService._RedisService.set(key, sessionData, duration);
         
     | 
| 
       288 
     | 
    
         
            -
                } catch (error) {
         
     | 
| 
       289 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      throw error;</span>
         
     | 
| 
       290 
     | 
    
         
            -
                }
         
     | 
| 
       291 
     | 
    
         
            -
              }
         
     | 
| 
       292 
     | 
    
         
            -
             
         
     | 
| 
       293 
     | 
    
         
            -
              async retrieveUserSession(
         
     | 
| 
       294 
     | 
    
         
            -
                userId: string,
         
     | 
| 
       295 
     | 
    
         
            -
                sessionName: string = 'tomei-sid',
         
     | 
| 
       296 
     | 
    
         
            -
              ): Promise<IUserSession> {
         
     | 
| 
       297 
     | 
    
         
            -
                try {
         
     | 
| 
       298 
     | 
    
         
            -
                  const key = `${this.environment}${sessionName}:${userId}`;
         
     | 
| 
       299 
     | 
    
         
            -
                  const stringData = await SessionService._RedisService.get(key);
         
     | 
| 
       300 
     | 
    
         
            -
                  <span class="missing-if-branch" title="if path not taken" >I</span>if (!stringData)
         
     | 
| 
       301 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >        return {</span>
         
     | 
| 
       302 
     | 
    
         
            -
                      systemLogins: [],
         
     | 
| 
       303 
     | 
    
         
            -
                    };
         
     | 
| 
       304 
     | 
    
         
            -
                  return JSON.parse(stringData);
         
     | 
| 
       305 
     | 
    
         
            -
                } catch (error) {
         
     | 
| 
       306 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      throw error;</span>
         
     | 
| 
       307 
     | 
    
         
            -
                }
         
     | 
| 
       308 
     | 
    
         
            -
              }
         
     | 
| 
       309 
     | 
    
         
            -
             
         
     | 
| 
       310 
     | 
    
         
            -
              async refreshDuration(
         
     | 
| 
       311 
     | 
    
         
            -
                userid: string,
         
     | 
| 
       312 
     | 
    
         
            -
                sessionName: string = 'tomei-sid',
         
     | 
| 
       313 
     | 
    
         
            -
                duration: number = 60 * 60,
         
     | 
| 
       314 
     | 
    
         
            -
              ): Promise<void> {
         
     | 
| 
       315 
     | 
    
         
            -
                try {
         
     | 
| 
       316 
     | 
    
         
            -
                  const userSession = await this.retrieveUserSession(userid, sessionName);
         
     | 
| 
       317 
     | 
    
         
            -
                  await this.setUserSession(userid, userSession, sessionName, duration);
         
     | 
| 
       318 
     | 
    
         
            -
                } catch (error) {
         
     | 
| 
       319 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      throw error;</span>
         
     | 
| 
       320 
     | 
    
         
            -
                }
         
     | 
| 
       321 
     | 
    
         
            -
              }
         
     | 
| 
       322 
     | 
    
         
            -
             
         
     | 
| 
       323 
     | 
    
         
            -
              async <span class="fstat-no" title="function not covered" >setAuthorizationCode(</span>
         
     | 
| 
       324 
     | 
    
         
            -
                token: string,
         
     | 
| 
       325 
     | 
    
         
            -
                value: string,
         
     | 
| 
       326 
     | 
    
         
            -
                expire: number,
         
     | 
| 
       327 
     | 
    
         
            -
              ): Promise<void> {
         
     | 
| 
       328 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >    try {</span>
         
     | 
| 
       329 
     | 
    
         
            -
                  const key = <span class="cstat-no" title="statement not covered" >`${this.environment}tomei-auth-code:${token}`;</span>
         
     | 
| 
       330 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      await SessionService._RedisService.set(key, value, expire);</span>
         
     | 
| 
       331 
     | 
    
         
            -
                } catch (error) {
         
     | 
| 
       332 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      throw error;</span>
         
     | 
| 
       333 
     | 
    
         
            -
                }
         
     | 
| 
       334 
     | 
    
         
            -
              }
         
     | 
| 
       335 
     | 
    
         
            -
             
         
     | 
| 
       336 
     | 
    
         
            -
              async <span class="fstat-no" title="function not covered" >retrieveAuthorizationCode(</span>token: string): Promise<string> {
         
     | 
| 
       337 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >    try {</span>
         
     | 
| 
       338 
     | 
    
         
            -
                  const key = <span class="cstat-no" title="statement not covered" >`${this.environment}tomei-auth-code:${token}`;</span>
         
     | 
| 
       339 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      return await SessionService._RedisService.get(key);</span>
         
     | 
| 
       340 
     | 
    
         
            -
                } catch (error) {
         
     | 
| 
       341 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      throw error;</span>
         
     | 
| 
       342 
     | 
    
         
            -
                }
         
     | 
| 
       343 
     | 
    
         
            -
              }
         
     | 
| 
       344 
     | 
    
         
            -
             
         
     | 
| 
       345 
     | 
    
         
            -
              async <span class="fstat-no" title="function not covered" >deleteAuthorizationCode(</span>token: string): Promise<void> {
         
     | 
| 
       346 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >    try {</span>
         
     | 
| 
       347 
     | 
    
         
            -
                  const key = <span class="cstat-no" title="statement not covered" >`${this.environment}tomei-auth-code:${token}`;</span>
         
     | 
| 
       348 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      await SessionService._RedisService.del(key);</span>
         
     | 
| 
       349 
     | 
    
         
            -
                } catch (error) {
         
     | 
| 
       350 
     | 
    
         
            -
            <span class="cstat-no" title="statement not covered" >      throw error;</span>
         
     | 
| 
       351 
     | 
    
         
            -
                }
         
     | 
| 
       352 
     | 
    
         
            -
              }
         
     | 
| 
       353 
     | 
    
         
            -
            }
         
     | 
| 
       354 
     | 
    
         
            -
             </pre></td></tr></table></pre>
         
     | 
| 
       355 
     | 
    
         
            -
             
     | 
| 
       356 
     | 
    
         
            -
                            <div class='push'></div><!-- for sticky footer -->
         
     | 
| 
       357 
     | 
    
         
            -
                        </div><!-- /wrapper -->
         
     | 
| 
       358 
     | 
    
         
            -
                        <div class='footer quiet pad2 space-top1 center small'>
         
     | 
| 
       359 
     | 
    
         
            -
                            Code coverage generated by
         
     | 
| 
       360 
     | 
    
         
            -
                            <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
         
     | 
| 
       361 
     | 
    
         
            -
                            at 2025-09-18T18:22:10.462Z
         
     | 
| 
       362 
     | 
    
         
            -
                        </div>
         
     | 
| 
       363 
     | 
    
         
            -
                    <script src="../prettify.js"></script>
         
     | 
| 
       364 
     | 
    
         
            -
                    <script>
         
     | 
| 
       365 
     | 
    
         
            -
                        window.onload = function () {
         
     | 
| 
       366 
     | 
    
         
            -
                            prettyPrint();
         
     | 
| 
       367 
     | 
    
         
            -
                        };
         
     | 
| 
       368 
     | 
    
         
            -
                    </script>
         
     | 
| 
       369 
     | 
    
         
            -
                    <script src="../sorter.js"></script>
         
     | 
| 
       370 
     | 
    
         
            -
                    <script src="../block-navigation.js"></script>
         
     | 
| 
       371 
     | 
    
         
            -
                </body>
         
     | 
| 
       372 
     | 
    
         
            -
            </html>
         
     | 
| 
       373 
     | 
    
         
            -
                
         
     | 
| 
         Binary file 
     | 
| 
         @@ -1,210 +0,0 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            /* eslint-disable */
         
     | 
| 
       2 
     | 
    
         
            -
            var addSorting = (function() {
         
     | 
| 
       3 
     | 
    
         
            -
                'use strict';
         
     | 
| 
       4 
     | 
    
         
            -
                var cols,
         
     | 
| 
       5 
     | 
    
         
            -
                    currentSort = {
         
     | 
| 
       6 
     | 
    
         
            -
                        index: 0,
         
     | 
| 
       7 
     | 
    
         
            -
                        desc: false
         
     | 
| 
       8 
     | 
    
         
            -
                    };
         
     | 
| 
       9 
     | 
    
         
            -
             
     | 
| 
       10 
     | 
    
         
            -
                // returns the summary table element
         
     | 
| 
       11 
     | 
    
         
            -
                function getTable() {
         
     | 
| 
       12 
     | 
    
         
            -
                    return document.querySelector('.coverage-summary');
         
     | 
| 
       13 
     | 
    
         
            -
                }
         
     | 
| 
       14 
     | 
    
         
            -
                // returns the thead element of the summary table
         
     | 
| 
       15 
     | 
    
         
            -
                function getTableHeader() {
         
     | 
| 
       16 
     | 
    
         
            -
                    return getTable().querySelector('thead tr');
         
     | 
| 
       17 
     | 
    
         
            -
                }
         
     | 
| 
       18 
     | 
    
         
            -
                // returns the tbody element of the summary table
         
     | 
| 
       19 
     | 
    
         
            -
                function getTableBody() {
         
     | 
| 
       20 
     | 
    
         
            -
                    return getTable().querySelector('tbody');
         
     | 
| 
       21 
     | 
    
         
            -
                }
         
     | 
| 
       22 
     | 
    
         
            -
                // returns the th element for nth column
         
     | 
| 
       23 
     | 
    
         
            -
                function getNthColumn(n) {
         
     | 
| 
       24 
     | 
    
         
            -
                    return getTableHeader().querySelectorAll('th')[n];
         
     | 
| 
       25 
     | 
    
         
            -
                }
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
       27 
     | 
    
         
            -
                function onFilterInput() {
         
     | 
| 
       28 
     | 
    
         
            -
                    const searchValue = document.getElementById('fileSearch').value;
         
     | 
| 
       29 
     | 
    
         
            -
                    const rows = document.getElementsByTagName('tbody')[0].children;
         
     | 
| 
       30 
     | 
    
         
            -
             
     | 
| 
       31 
     | 
    
         
            -
                    // Try to create a RegExp from the searchValue. If it fails (invalid regex),
         
     | 
| 
       32 
     | 
    
         
            -
                    // it will be treated as a plain text search
         
     | 
| 
       33 
     | 
    
         
            -
                    let searchRegex;
         
     | 
| 
       34 
     | 
    
         
            -
                    try {
         
     | 
| 
       35 
     | 
    
         
            -
                        searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive
         
     | 
| 
       36 
     | 
    
         
            -
                    } catch (error) {
         
     | 
| 
       37 
     | 
    
         
            -
                        searchRegex = null;
         
     | 
| 
       38 
     | 
    
         
            -
                    }
         
     | 
| 
       39 
     | 
    
         
            -
             
     | 
| 
       40 
     | 
    
         
            -
                    for (let i = 0; i < rows.length; i++) {
         
     | 
| 
       41 
     | 
    
         
            -
                        const row = rows[i];
         
     | 
| 
       42 
     | 
    
         
            -
                        let isMatch = false;
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
     | 
    
         
            -
                        if (searchRegex) {
         
     | 
| 
       45 
     | 
    
         
            -
                            // If a valid regex was created, use it for matching
         
     | 
| 
       46 
     | 
    
         
            -
                            isMatch = searchRegex.test(row.textContent);
         
     | 
| 
       47 
     | 
    
         
            -
                        } else {
         
     | 
| 
       48 
     | 
    
         
            -
                            // Otherwise, fall back to the original plain text search
         
     | 
| 
       49 
     | 
    
         
            -
                            isMatch = row.textContent
         
     | 
| 
       50 
     | 
    
         
            -
                                .toLowerCase()
         
     | 
| 
       51 
     | 
    
         
            -
                                .includes(searchValue.toLowerCase());
         
     | 
| 
       52 
     | 
    
         
            -
                        }
         
     | 
| 
       53 
     | 
    
         
            -
             
     | 
| 
       54 
     | 
    
         
            -
                        row.style.display = isMatch ? '' : 'none';
         
     | 
| 
       55 
     | 
    
         
            -
                    }
         
     | 
| 
       56 
     | 
    
         
            -
                }
         
     | 
| 
       57 
     | 
    
         
            -
             
     | 
| 
       58 
     | 
    
         
            -
                // loads the search box
         
     | 
| 
       59 
     | 
    
         
            -
                function addSearchBox() {
         
     | 
| 
       60 
     | 
    
         
            -
                    var template = document.getElementById('filterTemplate');
         
     | 
| 
       61 
     | 
    
         
            -
                    var templateClone = template.content.cloneNode(true);
         
     | 
| 
       62 
     | 
    
         
            -
                    templateClone.getElementById('fileSearch').oninput = onFilterInput;
         
     | 
| 
       63 
     | 
    
         
            -
                    template.parentElement.appendChild(templateClone);
         
     | 
| 
       64 
     | 
    
         
            -
                }
         
     | 
| 
       65 
     | 
    
         
            -
             
     | 
| 
       66 
     | 
    
         
            -
                // loads all columns
         
     | 
| 
       67 
     | 
    
         
            -
                function loadColumns() {
         
     | 
| 
       68 
     | 
    
         
            -
                    var colNodes = getTableHeader().querySelectorAll('th'),
         
     | 
| 
       69 
     | 
    
         
            -
                        colNode,
         
     | 
| 
       70 
     | 
    
         
            -
                        cols = [],
         
     | 
| 
       71 
     | 
    
         
            -
                        col,
         
     | 
| 
       72 
     | 
    
         
            -
                        i;
         
     | 
| 
       73 
     | 
    
         
            -
             
     | 
| 
       74 
     | 
    
         
            -
                    for (i = 0; i < colNodes.length; i += 1) {
         
     | 
| 
       75 
     | 
    
         
            -
                        colNode = colNodes[i];
         
     | 
| 
       76 
     | 
    
         
            -
                        col = {
         
     | 
| 
       77 
     | 
    
         
            -
                            key: colNode.getAttribute('data-col'),
         
     | 
| 
       78 
     | 
    
         
            -
                            sortable: !colNode.getAttribute('data-nosort'),
         
     | 
| 
       79 
     | 
    
         
            -
                            type: colNode.getAttribute('data-type') || 'string'
         
     | 
| 
       80 
     | 
    
         
            -
                        };
         
     | 
| 
       81 
     | 
    
         
            -
                        cols.push(col);
         
     | 
| 
       82 
     | 
    
         
            -
                        if (col.sortable) {
         
     | 
| 
       83 
     | 
    
         
            -
                            col.defaultDescSort = col.type === 'number';
         
     | 
| 
       84 
     | 
    
         
            -
                            colNode.innerHTML =
         
     | 
| 
       85 
     | 
    
         
            -
                                colNode.innerHTML + '<span class="sorter"></span>';
         
     | 
| 
       86 
     | 
    
         
            -
                        }
         
     | 
| 
       87 
     | 
    
         
            -
                    }
         
     | 
| 
       88 
     | 
    
         
            -
                    return cols;
         
     | 
| 
       89 
     | 
    
         
            -
                }
         
     | 
| 
       90 
     | 
    
         
            -
                // attaches a data attribute to every tr element with an object
         
     | 
| 
       91 
     | 
    
         
            -
                // of data values keyed by column name
         
     | 
| 
       92 
     | 
    
         
            -
                function loadRowData(tableRow) {
         
     | 
| 
       93 
     | 
    
         
            -
                    var tableCols = tableRow.querySelectorAll('td'),
         
     | 
| 
       94 
     | 
    
         
            -
                        colNode,
         
     | 
| 
       95 
     | 
    
         
            -
                        col,
         
     | 
| 
       96 
     | 
    
         
            -
                        data = {},
         
     | 
| 
       97 
     | 
    
         
            -
                        i,
         
     | 
| 
       98 
     | 
    
         
            -
                        val;
         
     | 
| 
       99 
     | 
    
         
            -
                    for (i = 0; i < tableCols.length; i += 1) {
         
     | 
| 
       100 
     | 
    
         
            -
                        colNode = tableCols[i];
         
     | 
| 
       101 
     | 
    
         
            -
                        col = cols[i];
         
     | 
| 
       102 
     | 
    
         
            -
                        val = colNode.getAttribute('data-value');
         
     | 
| 
       103 
     | 
    
         
            -
                        if (col.type === 'number') {
         
     | 
| 
       104 
     | 
    
         
            -
                            val = Number(val);
         
     | 
| 
       105 
     | 
    
         
            -
                        }
         
     | 
| 
       106 
     | 
    
         
            -
                        data[col.key] = val;
         
     | 
| 
       107 
     | 
    
         
            -
                    }
         
     | 
| 
       108 
     | 
    
         
            -
                    return data;
         
     | 
| 
       109 
     | 
    
         
            -
                }
         
     | 
| 
       110 
     | 
    
         
            -
                // loads all row data
         
     | 
| 
       111 
     | 
    
         
            -
                function loadData() {
         
     | 
| 
       112 
     | 
    
         
            -
                    var rows = getTableBody().querySelectorAll('tr'),
         
     | 
| 
       113 
     | 
    
         
            -
                        i;
         
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
                    for (i = 0; i < rows.length; i += 1) {
         
     | 
| 
       116 
     | 
    
         
            -
                        rows[i].data = loadRowData(rows[i]);
         
     | 
| 
       117 
     | 
    
         
            -
                    }
         
     | 
| 
       118 
     | 
    
         
            -
                }
         
     | 
| 
       119 
     | 
    
         
            -
                // sorts the table using the data for the ith column
         
     | 
| 
       120 
     | 
    
         
            -
                function sortByIndex(index, desc) {
         
     | 
| 
       121 
     | 
    
         
            -
                    var key = cols[index].key,
         
     | 
| 
       122 
     | 
    
         
            -
                        sorter = function(a, b) {
         
     | 
| 
       123 
     | 
    
         
            -
                            a = a.data[key];
         
     | 
| 
       124 
     | 
    
         
            -
                            b = b.data[key];
         
     | 
| 
       125 
     | 
    
         
            -
                            return a < b ? -1 : a > b ? 1 : 0;
         
     | 
| 
       126 
     | 
    
         
            -
                        },
         
     | 
| 
       127 
     | 
    
         
            -
                        finalSorter = sorter,
         
     | 
| 
       128 
     | 
    
         
            -
                        tableBody = document.querySelector('.coverage-summary tbody'),
         
     | 
| 
       129 
     | 
    
         
            -
                        rowNodes = tableBody.querySelectorAll('tr'),
         
     | 
| 
       130 
     | 
    
         
            -
                        rows = [],
         
     | 
| 
       131 
     | 
    
         
            -
                        i;
         
     | 
| 
       132 
     | 
    
         
            -
             
     | 
| 
       133 
     | 
    
         
            -
                    if (desc) {
         
     | 
| 
       134 
     | 
    
         
            -
                        finalSorter = function(a, b) {
         
     | 
| 
       135 
     | 
    
         
            -
                            return -1 * sorter(a, b);
         
     | 
| 
       136 
     | 
    
         
            -
                        };
         
     | 
| 
       137 
     | 
    
         
            -
                    }
         
     | 
| 
       138 
     | 
    
         
            -
             
     | 
| 
       139 
     | 
    
         
            -
                    for (i = 0; i < rowNodes.length; i += 1) {
         
     | 
| 
       140 
     | 
    
         
            -
                        rows.push(rowNodes[i]);
         
     | 
| 
       141 
     | 
    
         
            -
                        tableBody.removeChild(rowNodes[i]);
         
     | 
| 
       142 
     | 
    
         
            -
                    }
         
     | 
| 
       143 
     | 
    
         
            -
             
     | 
| 
       144 
     | 
    
         
            -
                    rows.sort(finalSorter);
         
     | 
| 
       145 
     | 
    
         
            -
             
     | 
| 
       146 
     | 
    
         
            -
                    for (i = 0; i < rows.length; i += 1) {
         
     | 
| 
       147 
     | 
    
         
            -
                        tableBody.appendChild(rows[i]);
         
     | 
| 
       148 
     | 
    
         
            -
                    }
         
     | 
| 
       149 
     | 
    
         
            -
                }
         
     | 
| 
       150 
     | 
    
         
            -
                // removes sort indicators for current column being sorted
         
     | 
| 
       151 
     | 
    
         
            -
                function removeSortIndicators() {
         
     | 
| 
       152 
     | 
    
         
            -
                    var col = getNthColumn(currentSort.index),
         
     | 
| 
       153 
     | 
    
         
            -
                        cls = col.className;
         
     | 
| 
       154 
     | 
    
         
            -
             
     | 
| 
       155 
     | 
    
         
            -
                    cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, '');
         
     | 
| 
       156 
     | 
    
         
            -
                    col.className = cls;
         
     | 
| 
       157 
     | 
    
         
            -
                }
         
     | 
| 
       158 
     | 
    
         
            -
                // adds sort indicators for current column being sorted
         
     | 
| 
       159 
     | 
    
         
            -
                function addSortIndicators() {
         
     | 
| 
       160 
     | 
    
         
            -
                    getNthColumn(currentSort.index).className += currentSort.desc
         
     | 
| 
       161 
     | 
    
         
            -
                        ? ' sorted-desc'
         
     | 
| 
       162 
     | 
    
         
            -
                        : ' sorted';
         
     | 
| 
       163 
     | 
    
         
            -
                }
         
     | 
| 
       164 
     | 
    
         
            -
                // adds event listeners for all sorter widgets
         
     | 
| 
       165 
     | 
    
         
            -
                function enableUI() {
         
     | 
| 
       166 
     | 
    
         
            -
                    var i,
         
     | 
| 
       167 
     | 
    
         
            -
                        el,
         
     | 
| 
       168 
     | 
    
         
            -
                        ithSorter = function ithSorter(i) {
         
     | 
| 
       169 
     | 
    
         
            -
                            var col = cols[i];
         
     | 
| 
       170 
     | 
    
         
            -
             
     | 
| 
       171 
     | 
    
         
            -
                            return function() {
         
     | 
| 
       172 
     | 
    
         
            -
                                var desc = col.defaultDescSort;
         
     | 
| 
       173 
     | 
    
         
            -
             
     | 
| 
       174 
     | 
    
         
            -
                                if (currentSort.index === i) {
         
     | 
| 
       175 
     | 
    
         
            -
                                    desc = !currentSort.desc;
         
     | 
| 
       176 
     | 
    
         
            -
                                }
         
     | 
| 
       177 
     | 
    
         
            -
                                sortByIndex(i, desc);
         
     | 
| 
       178 
     | 
    
         
            -
                                removeSortIndicators();
         
     | 
| 
       179 
     | 
    
         
            -
                                currentSort.index = i;
         
     | 
| 
       180 
     | 
    
         
            -
                                currentSort.desc = desc;
         
     | 
| 
       181 
     | 
    
         
            -
                                addSortIndicators();
         
     | 
| 
       182 
     | 
    
         
            -
                            };
         
     | 
| 
       183 
     | 
    
         
            -
                        };
         
     | 
| 
       184 
     | 
    
         
            -
                    for (i = 0; i < cols.length; i += 1) {
         
     | 
| 
       185 
     | 
    
         
            -
                        if (cols[i].sortable) {
         
     | 
| 
       186 
     | 
    
         
            -
                            // add the click event handler on the th so users
         
     | 
| 
       187 
     | 
    
         
            -
                            // dont have to click on those tiny arrows
         
     | 
| 
       188 
     | 
    
         
            -
                            el = getNthColumn(i).querySelector('.sorter').parentElement;
         
     | 
| 
       189 
     | 
    
         
            -
                            if (el.addEventListener) {
         
     | 
| 
       190 
     | 
    
         
            -
                                el.addEventListener('click', ithSorter(i));
         
     | 
| 
       191 
     | 
    
         
            -
                            } else {
         
     | 
| 
       192 
     | 
    
         
            -
                                el.attachEvent('onclick', ithSorter(i));
         
     | 
| 
       193 
     | 
    
         
            -
                            }
         
     | 
| 
       194 
     | 
    
         
            -
                        }
         
     | 
| 
       195 
     | 
    
         
            -
                    }
         
     | 
| 
       196 
     | 
    
         
            -
                }
         
     | 
| 
       197 
     | 
    
         
            -
                // adds sorting functionality to the UI
         
     | 
| 
       198 
     | 
    
         
            -
                return function() {
         
     | 
| 
       199 
     | 
    
         
            -
                    if (!getTable()) {
         
     | 
| 
       200 
     | 
    
         
            -
                        return;
         
     | 
| 
       201 
     | 
    
         
            -
                    }
         
     | 
| 
       202 
     | 
    
         
            -
                    cols = loadColumns();
         
     | 
| 
       203 
     | 
    
         
            -
                    loadData();
         
     | 
| 
       204 
     | 
    
         
            -
                    addSearchBox();
         
     | 
| 
       205 
     | 
    
         
            -
                    addSortIndicators();
         
     | 
| 
       206 
     | 
    
         
            -
                    enableUI();
         
     | 
| 
       207 
     | 
    
         
            -
                };
         
     | 
| 
       208 
     | 
    
         
            -
            })();
         
     | 
| 
       209 
     | 
    
         
            -
             
     | 
| 
       210 
     | 
    
         
            -
            window.addEventListener('load', addSorting);
         
     |