@gitpod/gitpod-protocol 0.1.5-sje-installation-admin-dashboard.22 → 0.1.5-sje-installer-fun.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 (313) hide show
  1. package/data/gitpod-schema.json +181 -4
  2. package/lib/accounting-protocol.d.ts +17 -10
  3. package/lib/accounting-protocol.d.ts.map +1 -1
  4. package/lib/accounting-protocol.js +30 -32
  5. package/lib/accounting-protocol.js.map +1 -1
  6. package/lib/admin-protocol.d.ts +9 -0
  7. package/lib/admin-protocol.d.ts.map +1 -1
  8. package/lib/admin-protocol.js.map +1 -1
  9. package/lib/analytics.d.ts +4 -5
  10. package/lib/analytics.d.ts.map +1 -1
  11. package/lib/analytics.js.map +1 -1
  12. package/lib/auth.d.ts.map +1 -1
  13. package/lib/blocked-repositories-protocol.d.ts +13 -0
  14. package/lib/blocked-repositories-protocol.d.ts.map +1 -0
  15. package/lib/blocked-repositories-protocol.js +8 -0
  16. package/lib/blocked-repositories-protocol.js.map +1 -0
  17. package/lib/context-url.d.ts +17 -5
  18. package/lib/context-url.d.ts.map +1 -1
  19. package/lib/context-url.js +57 -6
  20. package/lib/context-url.js.map +1 -1
  21. package/lib/context-url.spec.d.ts +2 -0
  22. package/lib/context-url.spec.d.ts.map +1 -1
  23. package/lib/context-url.spec.js +40 -4
  24. package/lib/context-url.spec.js.map +1 -1
  25. package/lib/email-protocol.d.ts +1 -1
  26. package/lib/email-protocol.d.ts.map +1 -1
  27. package/lib/email-protocol.js.map +1 -1
  28. package/lib/encryption/container-module.d.ts.map +1 -1
  29. package/lib/encryption/container-module.js +1 -1
  30. package/lib/encryption/container-module.js.map +1 -1
  31. package/lib/encryption/encryption-engine.d.ts.map +1 -1
  32. package/lib/encryption/encryption-engine.js +7 -7
  33. package/lib/encryption/encryption-engine.js.map +1 -1
  34. package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
  35. package/lib/encryption/encryption-engine.spec.js +2 -3
  36. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  37. package/lib/encryption/encryption-service.d.ts.map +1 -1
  38. package/lib/encryption/encryption-service.js +1 -1
  39. package/lib/encryption/encryption-service.js.map +1 -1
  40. package/lib/encryption/key-provider.d.ts.map +1 -1
  41. package/lib/encryption/key-provider.js +7 -9
  42. package/lib/encryption/key-provider.js.map +1 -1
  43. package/lib/env.d.ts +0 -5
  44. package/lib/env.d.ts.map +1 -1
  45. package/lib/env.js +1 -20
  46. package/lib/env.js.map +1 -1
  47. package/lib/experiments/always-default.d.ts +8 -0
  48. package/lib/experiments/always-default.d.ts.map +1 -0
  49. package/lib/experiments/always-default.js +20 -0
  50. package/lib/experiments/always-default.js.map +1 -0
  51. package/lib/experiments/configcat-server.d.ts +8 -0
  52. package/lib/experiments/configcat-server.d.ts.map +1 -0
  53. package/lib/experiments/configcat-server.js +34 -0
  54. package/lib/experiments/configcat-server.js.map +1 -0
  55. package/lib/experiments/configcat.d.ts +21 -0
  56. package/lib/experiments/configcat.d.ts.map +1 -0
  57. package/lib/experiments/configcat.js +47 -0
  58. package/lib/experiments/configcat.js.map +1 -0
  59. package/lib/experiments/types.d.ts +19 -0
  60. package/lib/experiments/types.d.ts.map +1 -0
  61. package/lib/{theia-plugins.js → experiments/types.js} +2 -2
  62. package/lib/experiments/types.js.map +1 -0
  63. package/lib/gitpod-file-parser.d.ts.map +1 -1
  64. package/lib/gitpod-file-parser.js +6 -6
  65. package/lib/gitpod-file-parser.js.map +1 -1
  66. package/lib/gitpod-file-parser.spec.js +42 -39
  67. package/lib/gitpod-file-parser.spec.js.map +1 -1
  68. package/lib/gitpod-service.d.ts +45 -26
  69. package/lib/gitpod-service.d.ts.map +1 -1
  70. package/lib/gitpod-service.js +39 -32
  71. package/lib/gitpod-service.js.map +1 -1
  72. package/lib/headless-workspace-log.d.ts +1 -0
  73. package/lib/headless-workspace-log.d.ts.map +1 -1
  74. package/lib/headless-workspace-log.js +2 -1
  75. package/lib/headless-workspace-log.js.map +1 -1
  76. package/lib/ide-frontend-service.d.ts +1 -1
  77. package/lib/ide-protocol.d.ts +10 -6
  78. package/lib/ide-protocol.d.ts.map +1 -1
  79. package/lib/index.d.ts +16 -16
  80. package/lib/installation-admin-protocol.d.ts +9 -0
  81. package/lib/installation-admin-protocol.d.ts.map +1 -1
  82. package/lib/installation-admin-protocol.js +3 -2
  83. package/lib/installation-admin-protocol.js.map +1 -1
  84. package/lib/license-protocol.d.ts +7 -0
  85. package/lib/license-protocol.d.ts.map +1 -1
  86. package/lib/license-protocol.js.map +1 -1
  87. package/lib/messaging/browser/connection.d.ts +1 -1
  88. package/lib/messaging/browser/connection.d.ts.map +1 -1
  89. package/lib/messaging/browser/connection.js +19 -19
  90. package/lib/messaging/browser/connection.js.map +1 -1
  91. package/lib/messaging/browser/window-connection.d.ts +4 -4
  92. package/lib/messaging/browser/window-connection.d.ts.map +1 -1
  93. package/lib/messaging/browser/window-connection.js +9 -6
  94. package/lib/messaging/browser/window-connection.js.map +1 -1
  95. package/lib/messaging/client-call-metrics.d.ts +2 -2
  96. package/lib/messaging/client-call-metrics.d.ts.map +1 -1
  97. package/lib/messaging/client-call-metrics.js +20 -20
  98. package/lib/messaging/client-call-metrics.js.map +1 -1
  99. package/lib/messaging/error.d.ts +3 -0
  100. package/lib/messaging/error.d.ts.map +1 -1
  101. package/lib/messaging/error.js +6 -0
  102. package/lib/messaging/error.js.map +1 -1
  103. package/lib/messaging/handler.d.ts.map +1 -1
  104. package/lib/messaging/handler.js +1 -1
  105. package/lib/messaging/node/connection.js +8 -8
  106. package/lib/messaging/node/connection.js.map +1 -1
  107. package/lib/messaging/proxy-factory.d.ts +1 -1
  108. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  109. package/lib/messaging/proxy-factory.js +7 -9
  110. package/lib/messaging/proxy-factory.js.map +1 -1
  111. package/lib/payment-protocol.d.ts.map +1 -1
  112. package/lib/payment-protocol.js +1 -1
  113. package/lib/payment-protocol.js.map +1 -1
  114. package/lib/permission.d.ts +9 -3
  115. package/lib/permission.d.ts.map +1 -1
  116. package/lib/permission.js +34 -25
  117. package/lib/permission.js.map +1 -1
  118. package/lib/plans.d.ts +3 -3
  119. package/lib/plans.d.ts.map +1 -1
  120. package/lib/plans.js +206 -171
  121. package/lib/plans.js.map +1 -1
  122. package/lib/protocol.d.ts +88 -38
  123. package/lib/protocol.d.ts.map +1 -1
  124. package/lib/protocol.js +166 -88
  125. package/lib/protocol.js.map +1 -1
  126. package/lib/snapshot-url.spec.js.map +1 -1
  127. package/lib/team-subscription-protocol.d.ts +21 -3
  128. package/lib/team-subscription-protocol.d.ts.map +1 -1
  129. package/lib/team-subscription-protocol.js +16 -5
  130. package/lib/team-subscription-protocol.js.map +1 -1
  131. package/lib/teams-projects-protocol.d.ts +12 -3
  132. package/lib/teams-projects-protocol.d.ts.map +1 -1
  133. package/lib/teams-projects-protocol.js +8 -1
  134. package/lib/teams-projects-protocol.js.map +1 -1
  135. package/lib/typings/globals.d.ts +2 -2
  136. package/lib/typings/globals.d.ts.map +1 -1
  137. package/lib/util/analytics.d.ts.map +1 -1
  138. package/lib/util/analytics.js +12 -3
  139. package/lib/util/analytics.js.map +1 -1
  140. package/lib/util/async-iterator.d.ts.map +1 -1
  141. package/lib/util/async-iterator.js +3 -3
  142. package/lib/util/async-iterator.js.map +1 -1
  143. package/lib/util/cancelable.js.map +1 -1
  144. package/lib/util/date-time.js +6 -6
  145. package/lib/util/date-time.js.map +1 -1
  146. package/lib/util/debug-app.d.ts +25 -0
  147. package/lib/util/debug-app.d.ts.map +1 -0
  148. package/lib/util/debug-app.js +100 -0
  149. package/lib/util/debug-app.js.map +1 -0
  150. package/lib/util/deferred.js.map +1 -1
  151. package/lib/util/disposable.d.ts.map +1 -1
  152. package/lib/util/disposable.js +2 -2
  153. package/lib/util/disposable.js.map +1 -1
  154. package/lib/util/event.d.ts.map +1 -1
  155. package/lib/util/event.js +5 -3
  156. package/lib/util/event.js.map +1 -1
  157. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  158. package/lib/util/garbage-collected-cache.js +1 -1
  159. package/lib/util/garbage-collected-cache.js.map +1 -1
  160. package/lib/util/generate-workspace-id.d.ts +5 -0
  161. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  162. package/lib/util/generate-workspace-id.js +446 -442
  163. package/lib/util/generate-workspace-id.js.map +1 -1
  164. package/lib/util/generate-workspace-id.spec.js +18 -7
  165. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  166. package/lib/util/gitpod-cookie.d.ts +1 -1
  167. package/lib/util/gitpod-cookie.d.ts.map +1 -1
  168. package/lib/util/gitpod-cookie.js +0 -3
  169. package/lib/util/gitpod-cookie.js.map +1 -1
  170. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  171. package/lib/util/gitpod-host-url.js +31 -29
  172. package/lib/util/gitpod-host-url.js.map +1 -1
  173. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
  174. package/lib/util/gitpod-host-url.spec.js +15 -5
  175. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  176. package/lib/util/grpc.d.ts.map +1 -1
  177. package/lib/util/grpc.js.map +1 -1
  178. package/lib/util/jaeger-client-types.d.ts.map +1 -1
  179. package/lib/util/logging.d.ts +1 -1
  180. package/lib/util/logging.d.ts.map +1 -1
  181. package/lib/util/logging.js +31 -25
  182. package/lib/util/logging.js.map +1 -1
  183. package/lib/util/make-link.js +5 -5
  184. package/lib/util/make-link.js.map +1 -1
  185. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  186. package/lib/util/parse-workspace-id.js +1 -2
  187. package/lib/util/parse-workspace-id.js.map +1 -1
  188. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  189. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  190. package/lib/util/queue.spec.js +9 -6
  191. package/lib/util/queue.spec.js.map +1 -1
  192. package/lib/util/semaphore.d.ts.map +1 -1
  193. package/lib/util/semaphore.js.map +1 -1
  194. package/lib/util/skip-if.d.ts.map +1 -1
  195. package/lib/util/skip-if.js.map +1 -1
  196. package/lib/util/timeutil.d.ts +1 -0
  197. package/lib/util/timeutil.d.ts.map +1 -1
  198. package/lib/util/timeutil.js +9 -3
  199. package/lib/util/timeutil.js.map +1 -1
  200. package/lib/util/timeutil.spec.d.ts.map +1 -1
  201. package/lib/util/timeutil.spec.js.map +1 -1
  202. package/lib/util/tracing.d.ts +8 -8
  203. package/lib/util/tracing.d.ts.map +1 -1
  204. package/lib/util/tracing.js +19 -20
  205. package/lib/util/tracing.js.map +1 -1
  206. package/lib/util/tracing.spec.js +3 -3
  207. package/lib/util/tracing.spec.js.map +1 -1
  208. package/lib/util/workspace-port-authentication.d.ts +7 -7
  209. package/lib/util/workspace-port-authentication.d.ts.map +1 -1
  210. package/lib/util/workspace-port-authentication.js +8 -11
  211. package/lib/util/workspace-port-authentication.js.map +1 -1
  212. package/lib/workspace-cluster.d.ts +10 -8
  213. package/lib/workspace-cluster.d.ts.map +1 -1
  214. package/lib/workspace-cluster.js +16 -1
  215. package/lib/workspace-cluster.js.map +1 -1
  216. package/lib/workspace-instance.d.ts +37 -3
  217. package/lib/workspace-instance.d.ts.map +1 -1
  218. package/lib/wsready.d.ts +1 -1
  219. package/lib/wsready.d.ts.map +1 -1
  220. package/lib/wsready.js +2 -2
  221. package/package.json +10 -7
  222. package/pkg-yarn.lock +8 -6
  223. package/provenance-bundle.jsonl +1 -1
  224. package/src/accounting-protocol.ts +63 -51
  225. package/src/admin-protocol.ts +33 -20
  226. package/src/analytics.ts +26 -28
  227. package/src/auth.ts +2 -2
  228. package/src/blocked-repositories-protocol.ts +13 -0
  229. package/src/context-url.spec.ts +37 -9
  230. package/src/context-url.ts +96 -40
  231. package/src/email-protocol.ts +5 -6
  232. package/src/encryption/container-module.ts +2 -3
  233. package/src/encryption/encryption-engine.spec.ts +9 -8
  234. package/src/encryption/encryption-engine.ts +14 -14
  235. package/src/encryption/encryption-service.ts +4 -5
  236. package/src/encryption/key-provider.ts +16 -19
  237. package/src/env.ts +0 -22
  238. package/src/experiments/always-default.ts +24 -0
  239. package/src/experiments/configcat-server.ts +37 -0
  240. package/src/experiments/configcat.ts +53 -0
  241. package/src/experiments/types.ts +32 -0
  242. package/src/gitpod-file-parser.spec.ts +55 -61
  243. package/src/gitpod-file-parser.ts +16 -17
  244. package/src/gitpod-service.ts +166 -108
  245. package/src/headless-workspace-log.ts +6 -4
  246. package/src/ide-frontend-service.ts +2 -2
  247. package/src/ide-protocol.ts +13 -8
  248. package/src/index.ts +16 -16
  249. package/src/installation-admin-protocol.ts +14 -4
  250. package/src/license-protocol.ts +12 -6
  251. package/src/messaging/browser/connection.ts +45 -47
  252. package/src/messaging/browser/window-connection.ts +39 -29
  253. package/src/messaging/client-call-metrics.ts +70 -71
  254. package/src/messaging/error.ts +10 -3
  255. package/src/messaging/handler.ts +6 -6
  256. package/src/messaging/node/connection.ts +8 -8
  257. package/src/messaging/proxy-factory.ts +23 -30
  258. package/src/oss-allowlist.ts +3 -3
  259. package/src/payment-protocol.ts +2 -2
  260. package/src/permission.ts +40 -32
  261. package/src/plans.ts +236 -189
  262. package/src/protocol.ts +352 -242
  263. package/src/snapshot-url.spec.ts +9 -7
  264. package/src/team-subscription-protocol.ts +57 -23
  265. package/src/teams-projects-protocol.ts +22 -9
  266. package/src/typings/globals.ts +4 -4
  267. package/src/util/analytics.ts +46 -24
  268. package/src/util/async-iterator.ts +4 -5
  269. package/src/util/cancelable.ts +3 -3
  270. package/src/util/date-time.ts +8 -8
  271. package/src/util/debug-app.ts +81 -0
  272. package/src/util/deferred.ts +6 -6
  273. package/src/util/disposable.ts +3 -6
  274. package/src/util/event.ts +9 -11
  275. package/src/util/garbage-collected-cache.ts +3 -6
  276. package/src/util/generate-workspace-id.spec.ts +26 -16
  277. package/src/util/generate-workspace-id.ts +460 -454
  278. package/src/util/gitpod-cookie.ts +8 -9
  279. package/src/util/gitpod-host-url.spec.ts +40 -13
  280. package/src/util/gitpod-host-url.ts +37 -34
  281. package/src/util/grpc.ts +1 -1
  282. package/src/util/jaeger-client-types.ts +2 -2
  283. package/src/util/logging.ts +60 -42
  284. package/src/util/make-link.ts +6 -7
  285. package/src/util/parse-workspace-id.spec.ts +17 -8
  286. package/src/util/parse-workspace-id.ts +5 -6
  287. package/src/util/queue.spec.ts +27 -25
  288. package/src/util/repeat.ts +1 -1
  289. package/src/util/semaphore.ts +4 -6
  290. package/src/util/skip-if.ts +9 -6
  291. package/src/util/timeutil.spec.ts +14 -15
  292. package/src/util/timeutil.ts +21 -11
  293. package/src/util/tracing.spec.ts +28 -23
  294. package/src/util/tracing.ts +58 -54
  295. package/src/util/workspace-port-authentication.ts +10 -13
  296. package/src/workspace-cluster.ts +26 -15
  297. package/src/workspace-instance.ts +68 -20
  298. package/src/wsready.ts +3 -3
  299. package/data/builtin-theia-plugins.json +0 -372
  300. package/lib/messaging/connection-error-handler.d.ts +0 -27
  301. package/lib/messaging/connection-error-handler.d.ts.map +0 -1
  302. package/lib/messaging/connection-error-handler.js +0 -34
  303. package/lib/messaging/connection-error-handler.js.map +0 -1
  304. package/lib/theia-plugins.d.ts +0 -11
  305. package/lib/theia-plugins.d.ts.map +0 -1
  306. package/lib/theia-plugins.js.map +0 -1
  307. package/lib/util/safe-promise.d.ts +0 -11
  308. package/lib/util/safe-promise.d.ts.map +0 -1
  309. package/lib/util/safe-promise.js +0 -31
  310. package/lib/util/safe-promise.js.map +0 -1
  311. package/src/messaging/connection-error-handler.ts +0 -62
  312. package/src/theia-plugins.ts +0 -11
  313. package/src/util/safe-promise.ts +0 -26
@@ -3,8 +3,7 @@
3
3
  * Licensed under the GNU Affero General Public License (AGPL).
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
- import * as cookie from 'cookie';
7
-
6
+ import * as cookie from "cookie";
8
7
 
9
8
  /**
10
9
  * This cookie indicates whether the connected client is a Gitpod user (= "has logged in within the last year") or not.
@@ -20,20 +19,20 @@ export const VALUE = "true";
20
19
  export function options(domain: string): cookie.CookieSerializeOptions {
21
20
  // Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies
22
21
  return {
23
- path: "/", // make sure we send the cookie to all sub-pages
22
+ path: "/", // make sure we send the cookie to all sub-pages
24
23
  httpOnly: false,
25
24
  secure: false,
26
- maxAge: 60 * 60 * 24 * 365, // 1 year
27
- sameSite: "lax", // default: true. "Lax" needed to ensure we see cookies from users that neavigate to gitpod.io from external sites
28
- domain: `.${domain}`, // explicilty include subdomains to not only cover "gitpod.io", but also "www.gitpod.io" or workspaces
25
+ maxAge: 60 * 60 * 24 * 365, // 1 year
26
+ sameSite: "lax", // default: true. "Lax" needed to ensure we see cookies from users that neavigate to gitpod.io from external sites
27
+ domain: `.${domain}`, // explicilty include subdomains to not only cover "gitpod.io", but also "www.gitpod.io" or workspaces
29
28
  };
30
- };
29
+ }
31
30
 
32
31
  export function generateCookie(domain: string): string {
33
32
  return cookie.serialize(NAME, VALUE, options(domain));
34
- };
33
+ }
35
34
 
36
35
  export function isPresent(cookies: string): boolean {
37
36
  // needs to match the old (gitpod-user=loggedIn) and new (gitpod-user=true) values to ensure a smooth transition during rollout.
38
37
  return !!cookies.match(`${NAME}=`);
39
- };
38
+ }
@@ -4,46 +4,73 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- import * as chai from 'chai';
8
- import { suite, test } from 'mocha-typescript';
9
- import { GitpodHostUrl } from './gitpod-host-url';
7
+ import * as chai from "chai";
8
+ import { suite, test } from "mocha-typescript";
9
+ import { GitpodHostUrl } from "./gitpod-host-url";
10
10
  const expect = chai.expect;
11
11
 
12
12
  @suite
13
13
  export class GitpodHostUrlTest {
14
-
15
14
  @test public parseWorkspaceId_pathBased() {
16
- const actual = GitpodHostUrl.fromWorkspaceUrl("http://35.223.201.195/workspace/bc77e03d-c781-4235-bca0-e24087f5e472/").workspaceId;
15
+ const actual = GitpodHostUrl.fromWorkspaceUrl(
16
+ "http://35.223.201.195/workspace/bc77e03d-c781-4235-bca0-e24087f5e472/",
17
+ ).workspaceId;
17
18
  expect(actual).to.equal("bc77e03d-c781-4235-bca0-e24087f5e472");
18
19
  }
19
20
 
20
21
  @test public parseWorkspaceId_hosts_withEnvVarsInjected() {
21
- const actual = GitpodHostUrl.fromWorkspaceUrl("https://gray-grasshopper-nfbitfia.ws-eu02.gitpod-staging.com/#passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo").workspaceId;
22
+ const actual = GitpodHostUrl.fromWorkspaceUrl(
23
+ "https://gray-grasshopper-nfbitfia.ws-eu02.gitpod-staging.com/#passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo",
24
+ ).workspaceId;
22
25
  expect(actual).to.equal("gray-grasshopper-nfbitfia");
23
26
  }
24
27
 
25
28
  @test public async testWithoutWorkspacePrefix() {
26
- expect(GitpodHostUrl.fromWorkspaceUrl("https://3000-moccasin-ferret-155799b3.ws-eu02.gitpod-staging.com/").withoutWorkspacePrefix().toString()).to.equal("https://gitpod-staging.com/");
29
+ expect(
30
+ GitpodHostUrl.fromWorkspaceUrl("https://3000-moccasin-ferret-155799b3.ws-eu02.gitpod-staging.com/")
31
+ .withoutWorkspacePrefix()
32
+ .toString(),
33
+ ).to.equal("https://gitpod-staging.com/");
27
34
  }
28
35
 
29
36
  @test public async testWithoutWorkspacePrefix2() {
30
- expect(GitpodHostUrl.fromWorkspaceUrl("https://gitpod-staging.com/").withoutWorkspacePrefix().toString()).to.equal("https://gitpod-staging.com/");
37
+ expect(
38
+ GitpodHostUrl.fromWorkspaceUrl("https://gitpod-staging.com/").withoutWorkspacePrefix().toString(),
39
+ ).to.equal("https://gitpod-staging.com/");
31
40
  }
32
41
 
33
42
  @test public async testWithoutWorkspacePrefix3() {
34
- expect(GitpodHostUrl.fromWorkspaceUrl("https://gray-rook-5523v5d8.ws-dev.my-branch-1234.staging.gitpod-dev.com/").withoutWorkspacePrefix().toString()).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
43
+ expect(
44
+ GitpodHostUrl.fromWorkspaceUrl("https://gray-rook-5523v5d8.ws-dev.my-branch-1234.staging.gitpod-dev.com/")
45
+ .withoutWorkspacePrefix()
46
+ .toString(),
47
+ ).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
35
48
  }
36
49
 
37
50
  @test public async testWithoutWorkspacePrefix4() {
38
- expect(GitpodHostUrl.fromWorkspaceUrl("https://my-branch-1234.staging.gitpod-dev.com/").withoutWorkspacePrefix().toString()).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
51
+ expect(
52
+ GitpodHostUrl.fromWorkspaceUrl("https://my-branch-1234.staging.gitpod-dev.com/")
53
+ .withoutWorkspacePrefix()
54
+ .toString(),
55
+ ).to.equal("https://my-branch-1234.staging.gitpod-dev.com/");
39
56
  }
40
57
 
41
58
  @test public async testWithoutWorkspacePrefix5() {
42
- expect(GitpodHostUrl.fromWorkspaceUrl("https://abc-nice-brunch-4224.staging.gitpod-dev.com/").withoutWorkspacePrefix().toString()).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
59
+ expect(
60
+ GitpodHostUrl.fromWorkspaceUrl("https://abc-nice-brunch-4224.staging.gitpod-dev.com/")
61
+ .withoutWorkspacePrefix()
62
+ .toString(),
63
+ ).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
43
64
  }
44
65
 
45
66
  @test public async testWithoutWorkspacePrefix6() {
46
- expect(GitpodHostUrl.fromWorkspaceUrl("https://gray-rook-5523v5d8.ws-dev.abc-nice-brunch-4224.staging.gitpod-dev.com/").withoutWorkspacePrefix().toString()).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
67
+ expect(
68
+ GitpodHostUrl.fromWorkspaceUrl(
69
+ "https://gray-rook-5523v5d8.ws-dev.abc-nice-brunch-4224.staging.gitpod-dev.com/",
70
+ )
71
+ .withoutWorkspacePrefix()
72
+ .toString(),
73
+ ).to.equal("https://abc-nice-brunch-4224.staging.gitpod-dev.com/");
47
74
  }
48
75
  }
49
- module.exports = new GitpodHostUrlTest()
76
+ module.exports = new GitpodHostUrlTest();
@@ -4,15 +4,16 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- const URL = require('url').URL || window.URL;
8
- import { log } from './logging';
7
+ const URL = require("url").URL || window.URL;
8
+ import { log } from "./logging";
9
9
 
10
10
  export interface UrlChange {
11
- (old: URL): Partial<URL>
11
+ (old: URL): Partial<URL>;
12
12
  }
13
13
  export type UrlUpdate = UrlChange | Partial<URL>;
14
14
 
15
- const baseWorkspaceIDRegex = "(([a-f][0-9a-f]{7}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|([0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8,11}))";
15
+ const baseWorkspaceIDRegex =
16
+ "(([a-f][0-9a-f]{7}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})|([0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8,11}))";
16
17
 
17
18
  // this pattern matches v4 UUIDs as well as the new generated workspace ids (e.g. pink-panda-ns35kd21)
18
19
  const workspaceIDRegex = RegExp(`^${baseWorkspaceIDRegex}$`);
@@ -24,15 +25,15 @@ export class GitpodHostUrl {
24
25
  readonly url: URL;
25
26
 
26
27
  constructor(urlParam?: string | URL) {
27
- if (urlParam === undefined || typeof urlParam === 'string') {
28
- this.url = new URL(urlParam || 'https://gitpod.io');
29
- this.url.search = '';
30
- this.url.hash = '';
31
- this.url.pathname = '';
28
+ if (urlParam === undefined || typeof urlParam === "string") {
29
+ this.url = new URL(urlParam || "https://gitpod.io");
30
+ this.url.search = "";
31
+ this.url.hash = "";
32
+ this.url.pathname = "";
32
33
  } else if (urlParam instanceof URL) {
33
34
  this.url = urlParam;
34
35
  } else {
35
- log.error('Unexpected urlParam', { urlParam });
36
+ log.error("Unexpected urlParam", { urlParam });
36
37
  }
37
38
  }
38
39
 
@@ -45,7 +46,7 @@ export class GitpodHostUrl {
45
46
  }
46
47
 
47
48
  withDomainPrefix(prefix: string): GitpodHostUrl {
48
- return this.with(url => ({ host: prefix + url.host }));;
49
+ return this.with((url) => ({ host: prefix + url.host }));
49
50
  }
50
51
 
51
52
  withoutWorkspacePrefix(): GitpodHostUrl {
@@ -58,14 +59,14 @@ export class GitpodHostUrl {
58
59
  }
59
60
 
60
61
  withoutDomainPrefix(removeSegmentsCount: number): GitpodHostUrl {
61
- return this.with(url => ({ host: url.host.split('.').splice(removeSegmentsCount).join('.') }));
62
+ return this.with((url) => ({ host: url.host.split(".").splice(removeSegmentsCount).join(".") }));
62
63
  }
63
64
 
64
65
  with(urlUpdate: UrlUpdate) {
65
- const update = typeof urlUpdate === 'function' ? urlUpdate(this.url) : urlUpdate;
66
- const addSlashToPath = update.pathname && update.pathname.length > 0 && !update.pathname.startsWith('/');
66
+ const update = typeof urlUpdate === "function" ? urlUpdate(this.url) : urlUpdate;
67
+ const addSlashToPath = update.pathname && update.pathname.length > 0 && !update.pathname.startsWith("/");
67
68
  if (addSlashToPath) {
68
- update.pathname = '/' + update.pathname;
69
+ update.pathname = "/" + update.pathname;
69
70
  }
70
71
  const result = Object.assign(new URL(this.toString()), update);
71
72
  return new GitpodHostUrl(result);
@@ -73,50 +74,53 @@ export class GitpodHostUrl {
73
74
 
74
75
  withApi(urlUpdate?: UrlUpdate) {
75
76
  const updated = urlUpdate ? this.with(urlUpdate) : this;
76
- return updated.with(url => ({ pathname: `/api${url.pathname}` }));
77
+ return updated.with((url) => ({ pathname: `/api${url.pathname}` }));
77
78
  }
78
79
 
79
80
  withContext(contextUrl: string) {
80
- return this.with(url => ({ hash: contextUrl }));
81
+ return this.with((url) => ({ hash: contextUrl }));
81
82
  }
82
83
 
83
84
  asWebsocket(): GitpodHostUrl {
84
- return this.with(url => ({ protocol: url.protocol === 'https:' ? 'wss:' : 'ws:' }));
85
+ return this.with((url) => ({ protocol: url.protocol === "https:" ? "wss:" : "ws:" }));
85
86
  }
86
87
 
87
88
  asDashboard(): GitpodHostUrl {
88
- return this.with(url => ({ pathname: '/' }));
89
+ return this.with((url) => ({ pathname: "/" }));
89
90
  }
90
91
 
91
92
  asLogin(): GitpodHostUrl {
92
- return this.with(url => ({ pathname: '/login' }));
93
+ return this.with((url) => ({ pathname: "/login" }));
93
94
  }
94
95
 
95
96
  asUpgradeSubscription(): GitpodHostUrl {
96
- return this.with(url => ({ pathname: '/plans' }));
97
+ return this.with((url) => ({ pathname: "/plans" }));
97
98
  }
98
99
 
99
100
  asAccessControl(): GitpodHostUrl {
100
- return this.with(url => ({ pathname: '/integrations' }));
101
+ return this.with((url) => ({ pathname: "/integrations" }));
101
102
  }
102
103
 
103
104
  asSettings(): GitpodHostUrl {
104
- return this.with(url => ({ pathname: '/settings' }));
105
+ return this.with((url) => ({ pathname: "/settings" }));
105
106
  }
106
107
 
107
108
  asPreferences(): GitpodHostUrl {
108
- return this.with(url => ({ pathname: '/preferences' }));
109
+ return this.with((url) => ({ pathname: "/preferences" }));
109
110
  }
110
111
 
111
112
  asStart(workspaceId = this.workspaceId): GitpodHostUrl {
112
113
  return this.withoutWorkspacePrefix().with({
113
- pathname: '/start/',
114
- hash: '#' + workspaceId
114
+ pathname: "/start/",
115
+ hash: "#" + workspaceId,
115
116
  });
116
117
  }
117
118
 
118
119
  asWorkspaceAuth(instanceID: string, redirect?: boolean): GitpodHostUrl {
119
- return this.with(url => ({ pathname: `/api/auth/workspace-cookie/${instanceID}`, search: redirect ? "redirect" : "" }));
120
+ return this.with((url) => ({
121
+ pathname: `/api/auth/workspace-cookie/${instanceID}`,
122
+ search: redirect ? "redirect" : "",
123
+ }));
120
124
  }
121
125
 
122
126
  toString() {
@@ -125,7 +129,7 @@ export class GitpodHostUrl {
125
129
 
126
130
  toStringWoRootSlash() {
127
131
  let result = this.toString();
128
- if (result.endsWith('/')) {
132
+ if (result.endsWith("/")) {
129
133
  result = result.slice(0, result.length - 1);
130
134
  }
131
135
  return result;
@@ -142,7 +146,7 @@ export class GitpodHostUrl {
142
146
  }
143
147
  }
144
148
 
145
- const pathSegs = this.url.pathname.split("/")
149
+ const pathSegs = this.url.pathname.split("/");
146
150
  if (pathSegs.length > 3 && pathSegs[1] === "workspace") {
147
151
  return pathSegs[2];
148
152
  }
@@ -152,20 +156,19 @@ export class GitpodHostUrl {
152
156
 
153
157
  get blobServe(): boolean {
154
158
  const hostSegments = this.url.host.split(".");
155
- if (hostSegments[0] === 'blobserve') {
159
+ if (hostSegments[0] === "blobserve") {
156
160
  return true;
157
161
  }
158
162
 
159
- const pathSegments = this.url.pathname.split("/")
163
+ const pathSegments = this.url.pathname.split("/");
160
164
  return pathSegments[0] === "blobserve";
161
165
  }
162
166
 
163
167
  asSorry(message: string) {
164
- return this.with({ pathname: '/sorry', hash: message });
168
+ return this.with({ pathname: "/sorry", hash: message });
165
169
  }
166
170
 
167
171
  asApiLogout(): GitpodHostUrl {
168
- return this.withApi(url => ({ pathname: '/logout/' }));
172
+ return this.withApi((url) => ({ pathname: "/logout/" }));
169
173
  }
170
-
171
174
  }
package/src/util/grpc.ts CHANGED
@@ -4,7 +4,7 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- export const defaultGRPCOptions = {
7
+ export const defaultGRPCOptions = {
8
8
  "grpc.keepalive_timeout_ms": 10000,
9
9
  "grpc.keepalive_time_ms": 60000,
10
10
  "grpc.http2.min_time_between_pings_ms": 10000,
@@ -93,10 +93,10 @@ export interface SamplingDecision {
93
93
 
94
94
  // added by TypeFox
95
95
  export interface Sampler {
96
- name(): string
96
+ name(): string;
97
97
  isSampled(operation: string, tags: any): boolean;
98
98
  onCreateSpan(span: opentracing.Span): SamplingDecision;
99
99
  onSetOperationName(span: opentracing.Span, operationName: string): SamplingDecision;
100
100
  onSetTag(span: opentracing.Span, key: string, value: any): SamplingDecision;
101
- close(callback: () => void): void
101
+ close(callback: () => void): void;
102
102
  }
@@ -4,8 +4,9 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
- const inspect: (object: any) => string = require('util').inspect; // undefined in frontend
7
+ const inspect: (object: any) => string = require("util").inspect; // undefined in frontend
8
8
 
9
+ let plainLogging: boolean = false; // set to true during development to get non JSON output
9
10
  let jsonLogging: boolean = false;
10
11
  let component: string | undefined;
11
12
  let version: string | undefined;
@@ -15,19 +16,19 @@ export interface LogContext {
15
16
  sessionId?: string;
16
17
  userId?: string;
17
18
  workspaceId?: string;
18
- };
19
+ }
19
20
  export namespace LogContext {
20
- export function from(params : { userId?: string, user?: any, request?: any } ) {
21
+ export function from(params: { userId?: string; user?: any; request?: any }) {
21
22
  return <LogContext>{
22
23
  sessionId: params.request?.requestID,
23
- userId: params.userId || params.user?.id
24
- }
24
+ userId: params.userId || params.user?.id,
25
+ };
25
26
  }
26
27
  }
27
28
 
28
29
  export interface LogPayload {
29
30
  // placeholder to indicate that only dictionary-style objects should be passed as payload
30
- };
31
+ }
31
32
 
32
33
  export namespace log {
33
34
  export function error(context: LogContext, message: string, error: any, payload: LogPayload): void;
@@ -97,7 +98,11 @@ export namespace log {
97
98
  /**
98
99
  * Do not use in frontend.
99
100
  */
100
- export function enableJSONLogging(componentArg: string, versionArg: string | undefined, logLevel?: LogrusLogLevel): void {
101
+ export function enableJSONLogging(
102
+ componentArg: string,
103
+ versionArg: string | undefined,
104
+ logLevel?: LogrusLogLevel,
105
+ ): void {
101
106
  component = componentArg;
102
107
  version = versionArg;
103
108
 
@@ -109,16 +114,16 @@ export namespace log {
109
114
 
110
115
  console.error = function (...args: any[]): void {
111
116
  errorLog(true, args);
112
- }
117
+ };
113
118
  console.warn = function (...args: any[]): void {
114
119
  warnLog(true, args);
115
- }
120
+ };
116
121
  console.info = function (...args: any[]): void {
117
122
  infoLog(true, args);
118
- }
123
+ };
119
124
  console.debug = function (...args: any[]): void {
120
125
  debugLog(true, args);
121
- }
126
+ };
122
127
 
123
128
  console.log = console.info;
124
129
  // FIXME wrap also other console methods (e.g. trace())
@@ -154,26 +159,26 @@ type DoLogFunction = (calledViaConsole: boolean, args: any[]) => void;
154
159
 
155
160
  let errorLog = doErrorLog;
156
161
  function doErrorLog(calledViaConsole: boolean, args: any[]): void {
157
- doLog(calledViaConsole, errorConsoleLog, 'ERROR', args);
162
+ doLog(calledViaConsole, errorConsoleLog, "ERROR", args);
158
163
  }
159
164
 
160
165
  let warnLog = doWarnLog;
161
166
  function doWarnLog(calledViaConsole: boolean, args: any[]): void {
162
- doLog(calledViaConsole, warnConsoleLog, 'WARNING', args);
167
+ doLog(calledViaConsole, warnConsoleLog, "WARNING", args);
163
168
  }
164
169
 
165
170
  let infoLog = doInfoLog;
166
171
  function doInfoLog(calledViaConsole: boolean, args: any[]): void {
167
- doLog(calledViaConsole, infoConsoleLog, 'INFO', args);
172
+ doLog(calledViaConsole, infoConsoleLog, "INFO", args);
168
173
  }
169
174
 
170
175
  let debugLog = doDebugLog;
171
176
  function doDebugLog(calledViaConsole: boolean, args: any[]): void {
172
- doLog(calledViaConsole, debugConsoleLog, 'DEBUG', args);
177
+ doLog(calledViaConsole, debugConsoleLog, "DEBUG", args);
173
178
  }
174
179
 
175
180
  // Ref: https://github.com/sirupsen/logrus#level-logging
176
- export type LogrusLogLevel = keyof (typeof LogrusLogLevels);
181
+ export type LogrusLogLevel = keyof typeof LogrusLogLevels;
177
182
  export const LogrusLogLevels = {
178
183
  trace: true,
179
184
  debug: true,
@@ -182,7 +187,7 @@ export const LogrusLogLevels = {
182
187
  error: true,
183
188
  fatal: true,
184
189
  panic: true,
185
- }
190
+ };
186
191
  export namespace LogrusLogLevel {
187
192
  export function isGreatherOrEqual(lvl: LogrusLogLevel | undefined, ref: LogrusLogLevel | undefined): boolean {
188
193
  if (lvl === undefined) {
@@ -194,8 +199,7 @@ export namespace LogrusLogLevel {
194
199
  return getLevelArity(lvl) >= getLevelArity(ref);
195
200
  }
196
201
  function getLevelArity(lvl: LogrusLogLevel): number {
197
- return Object.keys(LogrusLogLevels)
198
- .findIndex((l) => l === lvl);
202
+ return Object.keys(LogrusLogLevels).findIndex((l) => l === lvl);
199
203
  }
200
204
  export function getFromEnv(): LogrusLogLevel | undefined {
201
205
  const lvlStr = process.env.LOG_LEVEL;
@@ -203,7 +207,7 @@ export namespace LogrusLogLevel {
203
207
  return undefined;
204
208
  }
205
209
  const lvl = lvlStr as LogrusLogLevel;
206
- const exists = LogrusLogLevels[lvl]
210
+ const exists = LogrusLogLevels[lvl];
207
211
  if (!exists) {
208
212
  return undefined;
209
213
  }
@@ -212,12 +216,12 @@ export namespace LogrusLogLevel {
212
216
  }
213
217
 
214
218
  // Source: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
215
- type GoogleLogSeverity = 'EMERGENCY' | 'ALERT' | 'CRITICAL' | 'ERROR' | 'WARNING' | 'INFO' | 'DEBUG';
219
+ type GoogleLogSeverity = "EMERGENCY" | "ALERT" | "CRITICAL" | "ERROR" | "WARNING" | "INFO" | "DEBUG";
216
220
  namespace GoogleLogSeverity {
217
221
  export const isGreaterOrEqualThanWarning = (severity: GoogleLogSeverity) => {
218
222
  switch (severity) {
219
- case 'INFO':
220
- case 'DEBUG':
223
+ case "INFO":
224
+ case "DEBUG":
221
225
  return false;
222
226
  default:
223
227
  return true;
@@ -245,7 +249,7 @@ function doLog(calledViaConsole: boolean, consoleLog: ConsoleLog, severity: Goog
245
249
  // console.xyz(Error, ...any) / log.xyz(Error) / log.xyz(Error, LogPayload)
246
250
  error = args[0];
247
251
  payloadArgs = args.slice(1);
248
- } else if (typeof args[0] === 'string') {
252
+ } else if (typeof args[0] === "string") {
249
253
  message = args[0];
250
254
  if (args.length < 2 || !(args[1] instanceof Error)) {
251
255
  // console.xyz(string) / console.xyz(string, !Error, ...any) / log.xyz(string) / log.xyz(string, LogPayload)
@@ -265,7 +269,7 @@ function doLog(calledViaConsole: boolean, consoleLog: ConsoleLog, severity: Goog
265
269
  // log.xyz(LogContext, Error) / log.xyz(LogContext, Error, LogPayload)
266
270
  error = args[1];
267
271
  payloadArgs = args.slice(2);
268
- } else if (typeof args[1] === 'string') {
272
+ } else if (typeof args[1] === "string") {
269
273
  message = args[1];
270
274
  if (args.length < 3 || !(args[2] instanceof Error)) {
271
275
  // log.xyz(LogContext, string) / log.xyz(LogContext, string, LogPayload)
@@ -288,9 +292,14 @@ function doLog(calledViaConsole: boolean, consoleLog: ConsoleLog, severity: Goog
288
292
  }
289
293
  }
290
294
 
291
- function makeLogItem(severity: GoogleLogSeverity, context: LogContext | undefined, message: string | undefined,
292
- error: Error | undefined, payloadArgs: any[], calledViaConsole: boolean): string | undefined {
293
-
295
+ function makeLogItem(
296
+ severity: GoogleLogSeverity,
297
+ context: LogContext | undefined,
298
+ message: string | undefined,
299
+ error: Error | undefined,
300
+ payloadArgs: any[],
301
+ calledViaConsole: boolean,
302
+ ): string | undefined {
294
303
  if (context !== undefined && Object.keys(context).length == 0) {
295
304
  context = undefined;
296
305
  }
@@ -301,33 +310,40 @@ function makeLogItem(severity: GoogleLogSeverity, context: LogContext | undefine
301
310
  }
302
311
 
303
312
  const payload: any = payloadArgs.length == 0 ? undefined : payloadArgs.length == 1 ? payloadArgs[0] : payloadArgs;
304
- const logItem: any = {
313
+ const logItem = {
305
314
  // undefined fields get eliminated in JSON.stringify()
306
315
  ...reportedErrorEvent,
307
316
  component,
308
317
  severity,
309
318
  time: new Date().toISOString(),
310
- environment: process.env.KUBE_STAGE,
311
319
  context,
312
320
  message,
313
321
  error,
314
322
  payload,
315
- loggedViaConsole: calledViaConsole ? true : undefined
323
+ loggedViaConsole: calledViaConsole ? true : undefined,
316
324
  };
325
+ if (plainLogging) {
326
+ return `[${logItem.severity}] [${logItem.component}] ${logItem.message}
327
+ ${JSON.stringify(payload || "", undefined, " ")}
328
+ ${error || ""}
329
+ `.trim();
330
+ }
317
331
  let result: string = stringifyLogItem(logItem);
318
332
 
319
333
  if (result.length > maxAllowedLogItemLength && payload !== undefined) {
320
334
  delete logItem.payload;
321
- logItem.payloadStub = `Payload stripped as log item was longer than ${maxAllowedLogItemLength} characters`;
335
+ (<any>(
336
+ logItem
337
+ )).payloadStub = `Payload stripped as log item was longer than ${maxAllowedLogItemLength} characters`;
322
338
 
323
339
  result = stringifyLogItem(logItem);
324
340
 
325
341
  if (result.length <= maxAllowedLogItemLength) {
326
- log.warn('Log item too large, stripping payload', { logItemStub: makeLogItemStub(logItem) });
342
+ log.warn("Log item too large, stripping payload", { logItemStub: makeLogItemStub(logItem) });
327
343
  }
328
344
  }
329
345
  if (result.length > maxAllowedLogItemLength) {
330
- log.error('Log item too large w/o payload, discarding', { logItemStub: makeLogItemStub(logItem) });
346
+ log.error("Log item too large w/o payload, discarding", { logItemStub: makeLogItemStub(logItem) });
331
347
  return undefined;
332
348
  }
333
349
 
@@ -341,10 +357,10 @@ function makeReportedErrorEvent(error: Error | undefined) {
341
357
  // Serves as marker only
342
358
  "@type": "type.googleapis.com/google.devtools.clouderrorreporting.v1beta1.ReportedErrorEvent",
343
359
  // This is useful for filtering in the UI
344
- "serviceContext": {
345
- "service": component || "<ts-not-set>",
346
- "version": version || "<ts-not-set>",
347
- }
360
+ serviceContext: {
361
+ service: component || "<ts-not-set>",
362
+ version: version || "<ts-not-set>",
363
+ },
348
364
  };
349
365
 
350
366
  if (error) {
@@ -364,9 +380,9 @@ function makeLogItemStub(logItem: any): any {
364
380
  severity: logItem.severity,
365
381
  time: logItem.time,
366
382
  environment: logItem.environment,
367
- region: logItem.region
383
+ region: logItem.region,
368
384
  };
369
- if (typeof (logItem.message) === 'string') {
385
+ if (typeof logItem.message === "string") {
370
386
  if (logItem.message.length <= maxMessageStubLength) {
371
387
  result.message = logItem.message;
372
388
  } else {
@@ -400,10 +416,12 @@ function stringifyLogItem(logItem: any): string {
400
416
  * Jsonifies Errors properly, not as {} only.
401
417
  */
402
418
  function jsonStringifyWithErrors(value: any): string {
403
- return JSON.stringify(value, (key: string, value: any): any => { return value instanceof Error ? value.stack : value });
419
+ return JSON.stringify(value, (key: string, value: any): any => {
420
+ return value instanceof Error ? value.stack : value;
421
+ });
404
422
  }
405
423
 
406
- type ConsoleLog = (message?: any, ...optionalArgs: any[]) => void; // signature of console.xyz
424
+ type ConsoleLog = (message?: any, ...optionalArgs: any[]) => void; // signature of console.xyz
407
425
  const logConsoleLog: ConsoleLog = console.log;
408
426
  const errorConsoleLog: ConsoleLog = console.error;
409
427
  const warnConsoleLog: ConsoleLog = console.warn;
@@ -5,18 +5,17 @@
5
5
  */
6
6
 
7
7
  function isOpenNewTab(event: MouseEvent): boolean {
8
- return event.metaKey || (event.ctrlKey);
8
+ return event.metaKey || event.ctrlKey;
9
9
  }
10
10
 
11
11
  export function makeLink(node: HTMLElement, url: string, hover: string): void {
12
- node.onclick = event => {
13
- let target = '_self';
12
+ node.onclick = (event) => {
13
+ let target = "_self";
14
14
  if (isOpenNewTab(event)) {
15
- target = '_blank';
15
+ target = "_blank";
16
16
  }
17
17
  window.open(url, target);
18
- }
19
- node.style.cursor = 'pointer';
18
+ };
19
+ node.style.cursor = "pointer";
20
20
  node.title = hover;
21
21
  }
22
-