@kcuf/sls-logger-base 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -0
  3. package/coverage/base.css +224 -0
  4. package/coverage/block-navigation.js +87 -0
  5. package/coverage/clover.xml +417 -0
  6. package/coverage/coverage-final.json +20 -0
  7. package/coverage/favicon.png +0 -0
  8. package/coverage/index.html +176 -0
  9. package/coverage/prettify.css +1 -0
  10. package/coverage/prettify.js +2 -0
  11. package/coverage/sort-arrow-sprite.png +0 -0
  12. package/coverage/sorter.js +196 -0
  13. package/coverage/src/class/index.html +146 -0
  14. package/coverage/src/class/index.ts.html +85 -0
  15. package/coverage/src/class/sls-logger.ts.html +457 -0
  16. package/coverage/src/class/sls-pipe.ts.html +400 -0
  17. package/coverage/src/const/index.html +116 -0
  18. package/coverage/src/const/index.ts.html +127 -0
  19. package/coverage/src/factory/create-logger.ts.html +166 -0
  20. package/coverage/src/factory/generate-create-logger.ts.html +184 -0
  21. package/coverage/src/factory/index.html +131 -0
  22. package/coverage/src/index.html +116 -0
  23. package/coverage/src/index.ts.html +118 -0
  24. package/coverage/src/util/build-post-body.ts.html +166 -0
  25. package/coverage/src/util/convert-error-to-plain.ts.html +133 -0
  26. package/coverage/src/util/convert-log-info.ts.html +214 -0
  27. package/coverage/src/util/create-sls-log-quick.ts.html +157 -0
  28. package/coverage/src/util/flatten-object.ts.html +283 -0
  29. package/coverage/src/util/flatten-should-ignore.ts.html +151 -0
  30. package/coverage/src/util/get-log-once-key.ts.html +115 -0
  31. package/coverage/src/util/get-silent-countdown.ts.html +97 -0
  32. package/coverage/src/util/index.html +281 -0
  33. package/coverage/src/util/index.ts.html +112 -0
  34. package/coverage/src/util/merge-default-params.ts.html +148 -0
  35. package/coverage/src/util/merge-should-ignore.ts.html +115 -0
  36. package/coverage/src/util/resolve-default-params.ts.html +103 -0
  37. package/dist/cjs/class/index.js +13 -0
  38. package/dist/cjs/class/sls-logger.js +118 -0
  39. package/dist/cjs/class/sls-pipe.js +110 -0
  40. package/dist/cjs/const/index.js +18 -0
  41. package/dist/cjs/factory/create-logger.js +22 -0
  42. package/dist/cjs/factory/generate-create-logger.js +30 -0
  43. package/dist/cjs/index.js +20 -0
  44. package/dist/cjs/types/common.js +5 -0
  45. package/dist/cjs/types/factory.js +5 -0
  46. package/dist/cjs/types/index.js +38 -0
  47. package/dist/cjs/types/options.js +5 -0
  48. package/dist/cjs/util/build-post-body.js +25 -0
  49. package/dist/cjs/util/convert-error-to-plain.js +21 -0
  50. package/dist/cjs/util/convert-log-info.js +44 -0
  51. package/dist/cjs/util/create-sls-log-quick.js +34 -0
  52. package/dist/cjs/util/flatten-object.js +60 -0
  53. package/dist/cjs/util/flatten-should-ignore.js +22 -0
  54. package/dist/cjs/util/get-log-once-key.js +15 -0
  55. package/dist/cjs/util/get-silent-countdown.js +10 -0
  56. package/dist/cjs/util/index.js +69 -0
  57. package/dist/cjs/util/merge-default-params.js +21 -0
  58. package/dist/cjs/util/merge-should-ignore.js +14 -0
  59. package/dist/cjs/util/resolve-default-params.js +9 -0
  60. package/dist/esm/class/index.js +2 -0
  61. package/dist/esm/class/index.js.map +1 -0
  62. package/dist/esm/class/sls-logger.js +114 -0
  63. package/dist/esm/class/sls-logger.js.map +1 -0
  64. package/dist/esm/class/sls-pipe.js +106 -0
  65. package/dist/esm/class/sls-pipe.js.map +1 -0
  66. package/dist/esm/const/index.js +13 -0
  67. package/dist/esm/const/index.js.map +1 -0
  68. package/dist/esm/factory/create-logger.js +18 -0
  69. package/dist/esm/factory/create-logger.js.map +1 -0
  70. package/dist/esm/factory/generate-create-logger.js +25 -0
  71. package/dist/esm/factory/generate-create-logger.js.map +1 -0
  72. package/dist/esm/index.js +3 -0
  73. package/dist/esm/index.js.map +1 -0
  74. package/dist/esm/types/common.js +2 -0
  75. package/dist/esm/types/common.js.map +1 -0
  76. package/dist/esm/types/factory.js +2 -0
  77. package/dist/esm/types/factory.js.map +1 -0
  78. package/dist/esm/types/index.js +4 -0
  79. package/dist/esm/types/index.js.map +1 -0
  80. package/dist/esm/types/options.js +2 -0
  81. package/dist/esm/types/options.js.map +1 -0
  82. package/dist/esm/util/build-post-body.js +20 -0
  83. package/dist/esm/util/build-post-body.js.map +1 -0
  84. package/dist/esm/util/convert-error-to-plain.js +16 -0
  85. package/dist/esm/util/convert-error-to-plain.js.map +1 -0
  86. package/dist/esm/util/convert-log-info.js +39 -0
  87. package/dist/esm/util/convert-log-info.js.map +1 -0
  88. package/dist/esm/util/create-sls-log-quick.js +28 -0
  89. package/dist/esm/util/create-sls-log-quick.js.map +1 -0
  90. package/dist/esm/util/flatten-object.js +55 -0
  91. package/dist/esm/util/flatten-object.js.map +1 -0
  92. package/dist/esm/util/flatten-should-ignore.js +17 -0
  93. package/dist/esm/util/flatten-should-ignore.js.map +1 -0
  94. package/dist/esm/util/get-log-once-key.js +10 -0
  95. package/dist/esm/util/get-log-once-key.js.map +1 -0
  96. package/dist/esm/util/get-silent-countdown.js +5 -0
  97. package/dist/esm/util/get-silent-countdown.js.map +1 -0
  98. package/dist/esm/util/index.js +10 -0
  99. package/dist/esm/util/index.js.map +1 -0
  100. package/dist/esm/util/merge-default-params.js +16 -0
  101. package/dist/esm/util/merge-default-params.js.map +1 -0
  102. package/dist/esm/util/merge-should-ignore.js +9 -0
  103. package/dist/esm/util/merge-should-ignore.js.map +1 -0
  104. package/dist/esm/util/resolve-default-params.js +4 -0
  105. package/dist/esm/util/resolve-default-params.js.map +1 -0
  106. package/dist/types/class/index.d.ts +1 -0
  107. package/dist/types/class/sls-logger.d.ts +15 -0
  108. package/dist/types/class/sls-pipe.d.ts +27 -0
  109. package/dist/types/const/index.d.ts +11 -0
  110. package/dist/types/factory/create-logger.d.ts +5 -0
  111. package/dist/types/factory/generate-create-logger.d.ts +7 -0
  112. package/dist/types/index.d.ts +3 -0
  113. package/dist/types/types/common.d.ts +32 -0
  114. package/dist/types/types/factory.d.ts +30 -0
  115. package/dist/types/types/index.d.ts +3 -0
  116. package/dist/types/types/options.d.ts +123 -0
  117. package/dist/types/util/build-post-body.d.ts +8 -0
  118. package/dist/types/util/convert-error-to-plain.d.ts +4 -0
  119. package/dist/types/util/convert-log-info.d.ts +8 -0
  120. package/dist/types/util/create-sls-log-quick.d.ts +2 -0
  121. package/dist/types/util/flatten-object.d.ts +13 -0
  122. package/dist/types/util/flatten-should-ignore.d.ts +2 -0
  123. package/dist/types/util/get-log-once-key.d.ts +1 -0
  124. package/dist/types/util/get-silent-countdown.d.ts +1 -0
  125. package/dist/types/util/index.d.ts +9 -0
  126. package/dist/types/util/merge-default-params.d.ts +5 -0
  127. package/dist/types/util/merge-should-ignore.d.ts +2 -0
  128. package/dist/types/util/resolve-default-params.d.ts +2 -0
  129. package/package.json +55 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2019 Alibaba Cloud
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,71 @@
1
+ # @kcuf/sls-logger-base
2
+
3
+ 阿里云 SLS WebTracking 基础实现,将最终发送消息的方法抽象出去,使其能够很方便地应用于 Web、小程序、Node 等具体环境。
4
+
5
+ ## Features
6
+
7
+ * ⏱️ 默认 5s 的静默时间,让行应用初始化期间的业务请求,提升业务性能
8
+ * 🗳️ 利用 POST 批量提交日志,避免同一时间内大量的网络请求
9
+ * 📌 支持设定 TOPIC 前缀
10
+ * 🧽 支持采样率
11
+ * 🎈 支持自定义忽略策略(可用于避免不合法的日志上报等)
12
+
13
+ ## APIs
14
+
15
+ * `createLogger(sender: LogSender, options: CreateLoggerOptions): SlsLogger` 生成 sls 方法的工厂方法,该方法挂载 6 个快速方法
16
+ * `generateCreateLogger(sender: LogSender, options: GenerateCreateLoggerOptions): CreateLogger` 生成上边的方法的工厂方法
17
+
18
+ ## 如何使用
19
+
20
+ 业务代码不会直接用到这个包,因为它不会真正发送日志,只有设定 `sender(topic, body, headers)` 才行,可以用以下封入 `sender` 的包:
21
+
22
+ * Web 端:`@kcuf/sls-logger-web`
23
+ * Node 端:`@kcuf/sls-logger-node` TODO
24
+ * 小程序 端:`@kcuf/sls-logger-mp` TODO
25
+
26
+ 业务代码最终使用的是 `createLogger` 的产物,即 `sls` 方法,你可以这样调用:
27
+
28
+ ```ts
29
+ sls(topic);
30
+ sls(topic, payload);
31
+ sls(options, topic);
32
+ sls(options, topic, payload);
33
+ ```
34
+
35
+ 以上,`options` 可用于覆盖创建 `sls` 的时候的 `topicPrefix`、`sampling` 等工厂默认的参数,也可以立即发送日志,默认所有的日志会在一定的时间内积压,以避免和业务逻辑竞争。
36
+
37
+ ## 记录的数据
38
+
39
+ 这是一个基础的库,不具有平台性或业务性,因此除了最基础的日志信息之外,不记录任何数据,以下是日志中的默认数据:
40
+
41
+ * `_TOPIC`:虽然有 `__topic__`,但这个值可能被系统篡改,因此会冗余一个 `_TOPIC`
42
+ * `_GROUP`:可用于对日志进行分类,取值 `DEBUG LOG INFO WARN ERROR FATAL`,默认 `LOG`(有需要可以自定义)
43
+
44
+ ## FAQ
45
+
46
+ ### 为什么调用 `sls(..)` 后要等一段时间才见发送日志?
47
+
48
+ 1. 为了让行业务请求,加载完成后会有默认 5s 的静默时间,这段时间内,不会发送请求
49
+ 2. 每条日志都不会立即发送,而是进入一个队列,并刷新等待时间(默认 200ms),等到空闲的时候才进行批量发送
50
+
51
+ ### 有的日志很重要,不想因为静默时间或等待时间漏掉,需要立即上报,怎么办?
52
+
53
+ 利用 `instant` 参数:
54
+
55
+ ```ts
56
+ sls({
57
+ instant: true
58
+ }, topic, payload);
59
+ ```
60
+
61
+ ### 不想全量,如何进行采样上报?
62
+
63
+ 两个方式:
64
+
65
+ 1. 在 `createLogger` 的时候设置采样率,这样它生的 `sls` 将全部采样
66
+ 2. 调用 `sls` 的时候传入采样率,这样只会针对这一次调用进行采样
67
+
68
+ ## 参考
69
+
70
+ * [POST 发送日志参考文档](https://help.aliyun.com/document_detail/2771303.html)
71
+ * [Web Tracking](https://help.aliyun.com/document_detail/31752.html)
@@ -0,0 +1,224 @@
1
+ body, html {
2
+ margin:0; padding: 0;
3
+ height: 100%;
4
+ }
5
+ body {
6
+ font-family: Helvetica Neue, Helvetica, Arial;
7
+ font-size: 14px;
8
+ color:#333;
9
+ }
10
+ .small { font-size: 12px; }
11
+ *, *:after, *:before {
12
+ -webkit-box-sizing:border-box;
13
+ -moz-box-sizing:border-box;
14
+ box-sizing:border-box;
15
+ }
16
+ h1 { font-size: 20px; margin: 0;}
17
+ h2 { font-size: 14px; }
18
+ pre {
19
+ font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace;
20
+ margin: 0;
21
+ padding: 0;
22
+ -moz-tab-size: 2;
23
+ -o-tab-size: 2;
24
+ tab-size: 2;
25
+ }
26
+ a { color:#0074D9; text-decoration:none; }
27
+ a:hover { text-decoration:underline; }
28
+ .strong { font-weight: bold; }
29
+ .space-top1 { padding: 10px 0 0 0; }
30
+ .pad2y { padding: 20px 0; }
31
+ .pad1y { padding: 10px 0; }
32
+ .pad2x { padding: 0 20px; }
33
+ .pad2 { padding: 20px; }
34
+ .pad1 { padding: 10px; }
35
+ .space-left2 { padding-left:55px; }
36
+ .space-right2 { padding-right:20px; }
37
+ .center { text-align:center; }
38
+ .clearfix { display:block; }
39
+ .clearfix:after {
40
+ content:'';
41
+ display:block;
42
+ height:0;
43
+ clear:both;
44
+ visibility:hidden;
45
+ }
46
+ .fl { float: left; }
47
+ @media only screen and (max-width:640px) {
48
+ .col3 { width:100%; max-width:100%; }
49
+ .hide-mobile { display:none!important; }
50
+ }
51
+
52
+ .quiet {
53
+ color: #7f7f7f;
54
+ color: rgba(0,0,0,0.5);
55
+ }
56
+ .quiet a { opacity: 0.7; }
57
+
58
+ .fraction {
59
+ font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace;
60
+ font-size: 10px;
61
+ color: #555;
62
+ background: #E8E8E8;
63
+ padding: 4px 5px;
64
+ border-radius: 3px;
65
+ vertical-align: middle;
66
+ }
67
+
68
+ div.path a:link, div.path a:visited { color: #333; }
69
+ table.coverage {
70
+ border-collapse: collapse;
71
+ margin: 10px 0 0 0;
72
+ padding: 0;
73
+ }
74
+
75
+ table.coverage td {
76
+ margin: 0;
77
+ padding: 0;
78
+ vertical-align: top;
79
+ }
80
+ table.coverage td.line-count {
81
+ text-align: right;
82
+ padding: 0 5px 0 20px;
83
+ }
84
+ table.coverage td.line-coverage {
85
+ text-align: right;
86
+ padding-right: 10px;
87
+ min-width:20px;
88
+ }
89
+
90
+ table.coverage td span.cline-any {
91
+ display: inline-block;
92
+ padding: 0 5px;
93
+ width: 100%;
94
+ }
95
+ .missing-if-branch {
96
+ display: inline-block;
97
+ margin-right: 5px;
98
+ border-radius: 3px;
99
+ position: relative;
100
+ padding: 0 4px;
101
+ background: #333;
102
+ color: yellow;
103
+ }
104
+
105
+ .skip-if-branch {
106
+ display: none;
107
+ margin-right: 10px;
108
+ position: relative;
109
+ padding: 0 4px;
110
+ background: #ccc;
111
+ color: white;
112
+ }
113
+ .missing-if-branch .typ, .skip-if-branch .typ {
114
+ color: inherit !important;
115
+ }
116
+ .coverage-summary {
117
+ border-collapse: collapse;
118
+ width: 100%;
119
+ }
120
+ .coverage-summary tr { border-bottom: 1px solid #bbb; }
121
+ .keyline-all { border: 1px solid #ddd; }
122
+ .coverage-summary td, .coverage-summary th { padding: 10px; }
123
+ .coverage-summary tbody { border: 1px solid #bbb; }
124
+ .coverage-summary td { border-right: 1px solid #bbb; }
125
+ .coverage-summary td:last-child { border-right: none; }
126
+ .coverage-summary th {
127
+ text-align: left;
128
+ font-weight: normal;
129
+ white-space: nowrap;
130
+ }
131
+ .coverage-summary th.file { border-right: none !important; }
132
+ .coverage-summary th.pct { }
133
+ .coverage-summary th.pic,
134
+ .coverage-summary th.abs,
135
+ .coverage-summary td.pct,
136
+ .coverage-summary td.abs { text-align: right; }
137
+ .coverage-summary td.file { white-space: nowrap; }
138
+ .coverage-summary td.pic { min-width: 120px !important; }
139
+ .coverage-summary tfoot td { }
140
+
141
+ .coverage-summary .sorter {
142
+ height: 10px;
143
+ width: 7px;
144
+ display: inline-block;
145
+ margin-left: 0.5em;
146
+ background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent;
147
+ }
148
+ .coverage-summary .sorted .sorter {
149
+ background-position: 0 -20px;
150
+ }
151
+ .coverage-summary .sorted-desc .sorter {
152
+ background-position: 0 -10px;
153
+ }
154
+ .status-line { height: 10px; }
155
+ /* yellow */
156
+ .cbranch-no { background: yellow !important; color: #111; }
157
+ /* dark red */
158
+ .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 }
159
+ .low .chart { border:1px solid #C21F39 }
160
+ .highlighted,
161
+ .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{
162
+ background: #C21F39 !important;
163
+ }
164
+ /* medium red */
165
+ .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE }
166
+ /* light red */
167
+ .low, .cline-no { background:#FCE1E5 }
168
+ /* light green */
169
+ .high, .cline-yes { background:rgb(230,245,208) }
170
+ /* medium green */
171
+ .cstat-yes { background:rgb(161,215,106) }
172
+ /* dark green */
173
+ .status-line.high, .high .cover-fill { background:rgb(77,146,33) }
174
+ .high .chart { border:1px solid rgb(77,146,33) }
175
+ /* dark yellow (gold) */
176
+ .status-line.medium, .medium .cover-fill { background: #f9cd0b; }
177
+ .medium .chart { border:1px solid #f9cd0b; }
178
+ /* light yellow */
179
+ .medium { background: #fff4c2; }
180
+
181
+ .cstat-skip { background: #ddd; color: #111; }
182
+ .fstat-skip { background: #ddd; color: #111 !important; }
183
+ .cbranch-skip { background: #ddd !important; color: #111; }
184
+
185
+ span.cline-neutral { background: #eaeaea; }
186
+
187
+ .coverage-summary td.empty {
188
+ opacity: .5;
189
+ padding-top: 4px;
190
+ padding-bottom: 4px;
191
+ line-height: 1;
192
+ color: #888;
193
+ }
194
+
195
+ .cover-fill, .cover-empty {
196
+ display:inline-block;
197
+ height: 12px;
198
+ }
199
+ .chart {
200
+ line-height: 0;
201
+ }
202
+ .cover-empty {
203
+ background: white;
204
+ }
205
+ .cover-full {
206
+ border-right: none !important;
207
+ }
208
+ pre.prettyprint {
209
+ border: none !important;
210
+ padding: 0 !important;
211
+ margin: 0 !important;
212
+ }
213
+ .com { color: #999 !important; }
214
+ .ignore-none { color: #999; font-weight: normal; }
215
+
216
+ .wrapper {
217
+ min-height: 100%;
218
+ height: auto !important;
219
+ height: 100%;
220
+ margin: 0 auto -48px;
221
+ }
222
+ .footer, .push {
223
+ height: 48px;
224
+ }
@@ -0,0 +1,87 @@
1
+ /* eslint-disable */
2
+ var jumpToCode = (function init() {
3
+ // Classes of code we would like to highlight in the file view
4
+ var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no'];
5
+
6
+ // Elements to highlight in the file listing view
7
+ var fileListingElements = ['td.pct.low'];
8
+
9
+ // We don't want to select elements that are direct descendants of another match
10
+ var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > `
11
+
12
+ // Selecter that finds elements on the page to which we can jump
13
+ var selector =
14
+ fileListingElements.join(', ') +
15
+ ', ' +
16
+ notSelector +
17
+ missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b`
18
+
19
+ // The NodeList of matching elements
20
+ var missingCoverageElements = document.querySelectorAll(selector);
21
+
22
+ var currentIndex;
23
+
24
+ function toggleClass(index) {
25
+ missingCoverageElements
26
+ .item(currentIndex)
27
+ .classList.remove('highlighted');
28
+ missingCoverageElements.item(index).classList.add('highlighted');
29
+ }
30
+
31
+ function makeCurrent(index) {
32
+ toggleClass(index);
33
+ currentIndex = index;
34
+ missingCoverageElements.item(index).scrollIntoView({
35
+ behavior: 'smooth',
36
+ block: 'center',
37
+ inline: 'center'
38
+ });
39
+ }
40
+
41
+ function goToPrevious() {
42
+ var nextIndex = 0;
43
+ if (typeof currentIndex !== 'number' || currentIndex === 0) {
44
+ nextIndex = missingCoverageElements.length - 1;
45
+ } else if (missingCoverageElements.length > 1) {
46
+ nextIndex = currentIndex - 1;
47
+ }
48
+
49
+ makeCurrent(nextIndex);
50
+ }
51
+
52
+ function goToNext() {
53
+ var nextIndex = 0;
54
+
55
+ if (
56
+ typeof currentIndex === 'number' &&
57
+ currentIndex < missingCoverageElements.length - 1
58
+ ) {
59
+ nextIndex = currentIndex + 1;
60
+ }
61
+
62
+ makeCurrent(nextIndex);
63
+ }
64
+
65
+ return function jump(event) {
66
+ if (
67
+ document.getElementById('fileSearch') === document.activeElement &&
68
+ document.activeElement != null
69
+ ) {
70
+ // if we're currently focused on the search input, we don't want to navigate
71
+ return;
72
+ }
73
+
74
+ switch (event.which) {
75
+ case 78: // n
76
+ case 74: // j
77
+ goToNext();
78
+ break;
79
+ case 66: // b
80
+ case 75: // k
81
+ case 80: // p
82
+ goToPrevious();
83
+ break;
84
+ }
85
+ };
86
+ })();
87
+ window.addEventListener('keydown', jumpToCode);