@gitpod/gitpod-protocol 0.1.5-prs-dazzlev2-test.3 → 0.1.5-release-2022.6.1.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.
Files changed (308) 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/context-url.d.ts +17 -5
  14. package/lib/context-url.d.ts.map +1 -1
  15. package/lib/context-url.js +57 -6
  16. package/lib/context-url.js.map +1 -1
  17. package/lib/context-url.spec.d.ts +2 -0
  18. package/lib/context-url.spec.d.ts.map +1 -1
  19. package/lib/context-url.spec.js +40 -4
  20. package/lib/context-url.spec.js.map +1 -1
  21. package/lib/email-protocol.d.ts +1 -1
  22. package/lib/email-protocol.d.ts.map +1 -1
  23. package/lib/email-protocol.js.map +1 -1
  24. package/lib/encryption/container-module.d.ts.map +1 -1
  25. package/lib/encryption/container-module.js +1 -1
  26. package/lib/encryption/container-module.js.map +1 -1
  27. package/lib/encryption/encryption-engine.d.ts.map +1 -1
  28. package/lib/encryption/encryption-engine.js +7 -7
  29. package/lib/encryption/encryption-engine.js.map +1 -1
  30. package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
  31. package/lib/encryption/encryption-engine.spec.js +2 -3
  32. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  33. package/lib/encryption/encryption-service.d.ts.map +1 -1
  34. package/lib/encryption/encryption-service.js +1 -1
  35. package/lib/encryption/encryption-service.js.map +1 -1
  36. package/lib/encryption/key-provider.d.ts.map +1 -1
  37. package/lib/encryption/key-provider.js +7 -9
  38. package/lib/encryption/key-provider.js.map +1 -1
  39. package/lib/env.d.ts +0 -5
  40. package/lib/env.d.ts.map +1 -1
  41. package/lib/env.js +1 -20
  42. package/lib/env.js.map +1 -1
  43. package/lib/experiments/always-default.d.ts +8 -0
  44. package/lib/experiments/always-default.d.ts.map +1 -0
  45. package/lib/experiments/always-default.js +20 -0
  46. package/lib/experiments/always-default.js.map +1 -0
  47. package/lib/experiments/configcat-server.d.ts +8 -0
  48. package/lib/experiments/configcat-server.d.ts.map +1 -0
  49. package/lib/experiments/configcat-server.js +34 -0
  50. package/lib/experiments/configcat-server.js.map +1 -0
  51. package/lib/experiments/configcat.d.ts +21 -0
  52. package/lib/experiments/configcat.d.ts.map +1 -0
  53. package/lib/experiments/configcat.js +47 -0
  54. package/lib/experiments/configcat.js.map +1 -0
  55. package/lib/experiments/types.d.ts +19 -0
  56. package/lib/experiments/types.d.ts.map +1 -0
  57. package/lib/{theia-plugins.js → experiments/types.js} +2 -2
  58. package/lib/experiments/types.js.map +1 -0
  59. package/lib/gitpod-file-parser.d.ts.map +1 -1
  60. package/lib/gitpod-file-parser.js +6 -6
  61. package/lib/gitpod-file-parser.js.map +1 -1
  62. package/lib/gitpod-file-parser.spec.js +42 -39
  63. package/lib/gitpod-file-parser.spec.js.map +1 -1
  64. package/lib/gitpod-service.d.ts +43 -26
  65. package/lib/gitpod-service.d.ts.map +1 -1
  66. package/lib/gitpod-service.js +39 -32
  67. package/lib/gitpod-service.js.map +1 -1
  68. package/lib/headless-workspace-log.d.ts +1 -0
  69. package/lib/headless-workspace-log.d.ts.map +1 -1
  70. package/lib/headless-workspace-log.js +2 -1
  71. package/lib/headless-workspace-log.js.map +1 -1
  72. package/lib/ide-frontend-service.d.ts +1 -1
  73. package/lib/ide-protocol.d.ts +10 -6
  74. package/lib/ide-protocol.d.ts.map +1 -1
  75. package/lib/index.d.ts +16 -16
  76. package/lib/installation-admin-protocol.d.ts +9 -0
  77. package/lib/installation-admin-protocol.d.ts.map +1 -1
  78. package/lib/installation-admin-protocol.js +3 -2
  79. package/lib/installation-admin-protocol.js.map +1 -1
  80. package/lib/license-protocol.d.ts +7 -0
  81. package/lib/license-protocol.d.ts.map +1 -1
  82. package/lib/license-protocol.js.map +1 -1
  83. package/lib/messaging/browser/connection.d.ts +1 -1
  84. package/lib/messaging/browser/connection.d.ts.map +1 -1
  85. package/lib/messaging/browser/connection.js +19 -19
  86. package/lib/messaging/browser/connection.js.map +1 -1
  87. package/lib/messaging/browser/window-connection.d.ts +4 -4
  88. package/lib/messaging/browser/window-connection.d.ts.map +1 -1
  89. package/lib/messaging/browser/window-connection.js +9 -6
  90. package/lib/messaging/browser/window-connection.js.map +1 -1
  91. package/lib/messaging/client-call-metrics.d.ts +2 -2
  92. package/lib/messaging/client-call-metrics.d.ts.map +1 -1
  93. package/lib/messaging/client-call-metrics.js +20 -20
  94. package/lib/messaging/client-call-metrics.js.map +1 -1
  95. package/lib/messaging/error.d.ts +3 -0
  96. package/lib/messaging/error.d.ts.map +1 -1
  97. package/lib/messaging/error.js +6 -0
  98. package/lib/messaging/error.js.map +1 -1
  99. package/lib/messaging/handler.d.ts.map +1 -1
  100. package/lib/messaging/handler.js +1 -1
  101. package/lib/messaging/node/connection.js +8 -8
  102. package/lib/messaging/node/connection.js.map +1 -1
  103. package/lib/messaging/proxy-factory.d.ts +1 -1
  104. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  105. package/lib/messaging/proxy-factory.js +7 -9
  106. package/lib/messaging/proxy-factory.js.map +1 -1
  107. package/lib/payment-protocol.d.ts.map +1 -1
  108. package/lib/payment-protocol.js +1 -1
  109. package/lib/payment-protocol.js.map +1 -1
  110. package/lib/permission.d.ts +9 -3
  111. package/lib/permission.d.ts.map +1 -1
  112. package/lib/permission.js +34 -25
  113. package/lib/permission.js.map +1 -1
  114. package/lib/plans.d.ts +3 -3
  115. package/lib/plans.d.ts.map +1 -1
  116. package/lib/plans.js +206 -171
  117. package/lib/plans.js.map +1 -1
  118. package/lib/protocol.d.ts +87 -38
  119. package/lib/protocol.d.ts.map +1 -1
  120. package/lib/protocol.js +166 -88
  121. package/lib/protocol.js.map +1 -1
  122. package/lib/snapshot-url.spec.js.map +1 -1
  123. package/lib/team-subscription-protocol.d.ts +21 -3
  124. package/lib/team-subscription-protocol.d.ts.map +1 -1
  125. package/lib/team-subscription-protocol.js +16 -5
  126. package/lib/team-subscription-protocol.js.map +1 -1
  127. package/lib/teams-projects-protocol.d.ts +11 -3
  128. package/lib/teams-projects-protocol.d.ts.map +1 -1
  129. package/lib/teams-projects-protocol.js +8 -1
  130. package/lib/teams-projects-protocol.js.map +1 -1
  131. package/lib/typings/globals.d.ts +2 -2
  132. package/lib/typings/globals.d.ts.map +1 -1
  133. package/lib/util/analytics.d.ts.map +1 -1
  134. package/lib/util/analytics.js +12 -3
  135. package/lib/util/analytics.js.map +1 -1
  136. package/lib/util/async-iterator.d.ts.map +1 -1
  137. package/lib/util/async-iterator.js +3 -3
  138. package/lib/util/async-iterator.js.map +1 -1
  139. package/lib/util/cancelable.js.map +1 -1
  140. package/lib/util/date-time.js +6 -6
  141. package/lib/util/date-time.js.map +1 -1
  142. package/lib/util/debug-app.d.ts +25 -0
  143. package/lib/util/debug-app.d.ts.map +1 -0
  144. package/lib/util/debug-app.js +100 -0
  145. package/lib/util/debug-app.js.map +1 -0
  146. package/lib/util/deferred.js.map +1 -1
  147. package/lib/util/disposable.d.ts.map +1 -1
  148. package/lib/util/disposable.js +2 -2
  149. package/lib/util/disposable.js.map +1 -1
  150. package/lib/util/event.d.ts.map +1 -1
  151. package/lib/util/event.js +5 -3
  152. package/lib/util/event.js.map +1 -1
  153. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  154. package/lib/util/garbage-collected-cache.js +1 -1
  155. package/lib/util/garbage-collected-cache.js.map +1 -1
  156. package/lib/util/generate-workspace-id.d.ts +5 -0
  157. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  158. package/lib/util/generate-workspace-id.js +446 -442
  159. package/lib/util/generate-workspace-id.js.map +1 -1
  160. package/lib/util/generate-workspace-id.spec.js +18 -7
  161. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  162. package/lib/util/gitpod-cookie.d.ts +1 -1
  163. package/lib/util/gitpod-cookie.d.ts.map +1 -1
  164. package/lib/util/gitpod-cookie.js +0 -3
  165. package/lib/util/gitpod-cookie.js.map +1 -1
  166. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  167. package/lib/util/gitpod-host-url.js +31 -29
  168. package/lib/util/gitpod-host-url.js.map +1 -1
  169. package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
  170. package/lib/util/gitpod-host-url.spec.js +15 -5
  171. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  172. package/lib/util/grpc.d.ts.map +1 -1
  173. package/lib/util/grpc.js.map +1 -1
  174. package/lib/util/jaeger-client-types.d.ts.map +1 -1
  175. package/lib/util/logging.d.ts +1 -1
  176. package/lib/util/logging.d.ts.map +1 -1
  177. package/lib/util/logging.js +23 -24
  178. package/lib/util/logging.js.map +1 -1
  179. package/lib/util/make-link.js +5 -5
  180. package/lib/util/make-link.js.map +1 -1
  181. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  182. package/lib/util/parse-workspace-id.js +1 -2
  183. package/lib/util/parse-workspace-id.js.map +1 -1
  184. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  185. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  186. package/lib/util/queue.spec.js +9 -6
  187. package/lib/util/queue.spec.js.map +1 -1
  188. package/lib/util/semaphore.d.ts.map +1 -1
  189. package/lib/util/semaphore.js.map +1 -1
  190. package/lib/util/skip-if.d.ts.map +1 -1
  191. package/lib/util/skip-if.js.map +1 -1
  192. package/lib/util/timeutil.d.ts +1 -0
  193. package/lib/util/timeutil.d.ts.map +1 -1
  194. package/lib/util/timeutil.js +9 -3
  195. package/lib/util/timeutil.js.map +1 -1
  196. package/lib/util/timeutil.spec.d.ts.map +1 -1
  197. package/lib/util/timeutil.spec.js.map +1 -1
  198. package/lib/util/tracing.d.ts +8 -8
  199. package/lib/util/tracing.d.ts.map +1 -1
  200. package/lib/util/tracing.js +19 -20
  201. package/lib/util/tracing.js.map +1 -1
  202. package/lib/util/tracing.spec.js +3 -3
  203. package/lib/util/tracing.spec.js.map +1 -1
  204. package/lib/util/workspace-port-authentication.d.ts +7 -7
  205. package/lib/util/workspace-port-authentication.d.ts.map +1 -1
  206. package/lib/util/workspace-port-authentication.js +8 -11
  207. package/lib/util/workspace-port-authentication.js.map +1 -1
  208. package/lib/workspace-cluster.d.ts +10 -8
  209. package/lib/workspace-cluster.d.ts.map +1 -1
  210. package/lib/workspace-cluster.js +16 -1
  211. package/lib/workspace-cluster.js.map +1 -1
  212. package/lib/workspace-instance.d.ts +37 -3
  213. package/lib/workspace-instance.d.ts.map +1 -1
  214. package/lib/wsready.d.ts +1 -1
  215. package/lib/wsready.d.ts.map +1 -1
  216. package/lib/wsready.js +2 -2
  217. package/package.json +10 -7
  218. package/pkg-yarn.lock +8 -6
  219. package/provenance-bundle.jsonl +1 -1
  220. package/src/accounting-protocol.ts +63 -51
  221. package/src/admin-protocol.ts +33 -20
  222. package/src/analytics.ts +26 -28
  223. package/src/auth.ts +2 -2
  224. package/src/context-url.spec.ts +37 -9
  225. package/src/context-url.ts +96 -40
  226. package/src/email-protocol.ts +5 -6
  227. package/src/encryption/container-module.ts +2 -3
  228. package/src/encryption/encryption-engine.spec.ts +9 -8
  229. package/src/encryption/encryption-engine.ts +14 -14
  230. package/src/encryption/encryption-service.ts +4 -5
  231. package/src/encryption/key-provider.ts +16 -19
  232. package/src/env.ts +0 -22
  233. package/src/experiments/always-default.ts +24 -0
  234. package/src/experiments/configcat-server.ts +37 -0
  235. package/src/experiments/configcat.ts +53 -0
  236. package/src/experiments/types.ts +32 -0
  237. package/src/gitpod-file-parser.spec.ts +55 -61
  238. package/src/gitpod-file-parser.ts +16 -17
  239. package/src/gitpod-service.ts +163 -108
  240. package/src/headless-workspace-log.ts +6 -4
  241. package/src/ide-frontend-service.ts +2 -2
  242. package/src/ide-protocol.ts +13 -8
  243. package/src/index.ts +16 -16
  244. package/src/installation-admin-protocol.ts +14 -4
  245. package/src/license-protocol.ts +12 -6
  246. package/src/messaging/browser/connection.ts +45 -47
  247. package/src/messaging/browser/window-connection.ts +39 -29
  248. package/src/messaging/client-call-metrics.ts +70 -71
  249. package/src/messaging/error.ts +10 -3
  250. package/src/messaging/handler.ts +6 -6
  251. package/src/messaging/node/connection.ts +8 -8
  252. package/src/messaging/proxy-factory.ts +23 -30
  253. package/src/oss-allowlist.ts +3 -3
  254. package/src/payment-protocol.ts +2 -2
  255. package/src/permission.ts +40 -32
  256. package/src/plans.ts +236 -189
  257. package/src/protocol.ts +350 -241
  258. package/src/snapshot-url.spec.ts +9 -7
  259. package/src/team-subscription-protocol.ts +57 -23
  260. package/src/teams-projects-protocol.ts +21 -9
  261. package/src/typings/globals.ts +4 -4
  262. package/src/util/analytics.ts +46 -24
  263. package/src/util/async-iterator.ts +4 -5
  264. package/src/util/cancelable.ts +3 -3
  265. package/src/util/date-time.ts +8 -8
  266. package/src/util/debug-app.ts +81 -0
  267. package/src/util/deferred.ts +6 -6
  268. package/src/util/disposable.ts +3 -6
  269. package/src/util/event.ts +9 -11
  270. package/src/util/garbage-collected-cache.ts +3 -6
  271. package/src/util/generate-workspace-id.spec.ts +26 -16
  272. package/src/util/generate-workspace-id.ts +460 -454
  273. package/src/util/gitpod-cookie.ts +8 -9
  274. package/src/util/gitpod-host-url.spec.ts +40 -13
  275. package/src/util/gitpod-host-url.ts +37 -34
  276. package/src/util/grpc.ts +1 -1
  277. package/src/util/jaeger-client-types.ts +2 -2
  278. package/src/util/logging.ts +49 -40
  279. package/src/util/make-link.ts +6 -7
  280. package/src/util/parse-workspace-id.spec.ts +17 -8
  281. package/src/util/parse-workspace-id.ts +5 -6
  282. package/src/util/queue.spec.ts +27 -25
  283. package/src/util/repeat.ts +1 -1
  284. package/src/util/semaphore.ts +4 -6
  285. package/src/util/skip-if.ts +9 -6
  286. package/src/util/timeutil.spec.ts +14 -15
  287. package/src/util/timeutil.ts +21 -11
  288. package/src/util/tracing.spec.ts +28 -23
  289. package/src/util/tracing.ts +58 -54
  290. package/src/util/workspace-port-authentication.ts +10 -13
  291. package/src/workspace-cluster.ts +26 -15
  292. package/src/workspace-instance.ts +68 -20
  293. package/src/wsready.ts +3 -3
  294. package/data/builtin-theia-plugins.json +0 -372
  295. package/lib/messaging/connection-error-handler.d.ts +0 -27
  296. package/lib/messaging/connection-error-handler.d.ts.map +0 -1
  297. package/lib/messaging/connection-error-handler.js +0 -34
  298. package/lib/messaging/connection-error-handler.js.map +0 -1
  299. package/lib/theia-plugins.d.ts +0 -11
  300. package/lib/theia-plugins.d.ts.map +0 -1
  301. package/lib/theia-plugins.js.map +0 -1
  302. package/lib/util/safe-promise.d.ts +0 -11
  303. package/lib/util/safe-promise.d.ts.map +0 -1
  304. package/lib/util/safe-promise.js +0 -31
  305. package/lib/util/safe-promise.js.map +0 -1
  306. package/src/messaging/connection-error-handler.ts +0 -62
  307. package/src/theia-plugins.ts +0 -11
  308. package/src/util/safe-promise.ts +0 -26
package/src/protocol.ts CHANGED
@@ -7,26 +7,27 @@
7
7
  import { WorkspaceInstance, PortVisibility } from "./workspace-instance";
8
8
  import { RoleOrPermission } from "./permission";
9
9
  import { Project } from "./teams-projects-protocol";
10
+ import { createHash } from "crypto";
10
11
 
11
12
  export interface UserInfo {
12
- name?: string
13
+ name?: string;
13
14
  }
14
15
 
15
16
  export interface User {
16
17
  /** The user id */
17
- id: string
18
+ id: string;
18
19
 
19
20
  /** The timestamp when the user entry was created */
20
- creationDate: string
21
+ creationDate: string;
21
22
 
22
- avatarUrl?: string
23
+ avatarUrl?: string;
23
24
 
24
- name?: string
25
+ name?: string;
25
26
 
26
27
  /** Optional for backwards compatibility */
27
- fullName?: string
28
+ fullName?: string;
28
29
 
29
- identities: Identity[]
30
+ identities: Identity[];
30
31
 
31
32
  /**
32
33
  * Whether the user has been blocked to use our service, because of TOS violation for example.
@@ -48,34 +49,38 @@ export interface User {
48
49
 
49
50
  export namespace User {
50
51
  export function is(data: any): data is User {
51
- return data
52
- && data.hasOwnProperty('id')
53
- && data.hasOwnProperty('identities')
52
+ return data && data.hasOwnProperty("id") && data.hasOwnProperty("identities");
54
53
  }
55
54
  export function getIdentity(user: User, authProviderId: string): Identity | undefined {
56
- return user.identities.find(id => id.authProviderId === authProviderId);
55
+ return user.identities.find((id) => id.authProviderId === authProviderId);
57
56
  }
58
57
  export function censor(user: User): User {
59
58
  const res = { ...user };
60
- delete (res.additionalData);
61
- res.identities = res.identities.map(i => {
62
- delete (i.tokens);
59
+ delete res.additionalData;
60
+ res.identities = res.identities.map((i) => {
61
+ delete i.tokens;
63
62
 
64
63
  // The user field is not in the Identity shape, but actually exists on DBIdentity.
65
64
  // Trying to push this object out via JSON RPC will fail because of the cyclic nature
66
65
  // of this field.
67
- delete ((i as any).user);
66
+ delete (i as any).user;
68
67
  return i;
69
68
  });
70
69
  return res;
71
70
  }
72
- export function getPrimaryEmail(user: User): string {
73
- const identities = user.identities.filter(i => !!i.primaryEmail);
71
+
72
+ /**
73
+ * Tries to return the primaryEmail of the first identity this user signed up with.
74
+ * @param user
75
+ * @returns A primaryEmail, or undefined if there is none.
76
+ */
77
+ export function getPrimaryEmail(user: User): string | undefined {
78
+ const identities = user.identities.filter((i) => !!i.primaryEmail);
74
79
  if (identities.length <= 0) {
75
- throw new Error(`No identity with primary email for user: ${user.id}!`);
80
+ return undefined;
76
81
  }
77
82
 
78
- return identities[0].primaryEmail!;
83
+ return identities[0].primaryEmail || undefined;
79
84
  }
80
85
  export function getName(user: User): string | undefined {
81
86
  const name = user.fullName || user.name;
@@ -90,6 +95,47 @@ export namespace User {
90
95
  }
91
96
  return undefined;
92
97
  }
98
+
99
+ export function hasPreferredIde(user: User) {
100
+ return (
101
+ typeof user?.additionalData?.ideSettings?.defaultIde !== "undefined" ||
102
+ typeof user?.additionalData?.ideSettings?.useLatestVersion !== "undefined"
103
+ );
104
+ }
105
+
106
+ export function isOnboardingUser(user: User) {
107
+ return !hasPreferredIde(user);
108
+ }
109
+
110
+ export function migrationIDESettings(user: User) {
111
+ if (
112
+ !user?.additionalData?.ideSettings ||
113
+ Object.keys(user.additionalData.ideSettings).length === 0 ||
114
+ user.additionalData.ideSettings.settingVersion === "2.0"
115
+ ) {
116
+ return;
117
+ }
118
+ const newIDESettings: IDESettings = {
119
+ settingVersion: "2.0",
120
+ };
121
+ const ideSettings = user.additionalData.ideSettings;
122
+ if (ideSettings.useDesktopIde) {
123
+ if (ideSettings.defaultDesktopIde === "code-desktop") {
124
+ newIDESettings.defaultIde = "code-desktop";
125
+ } else if (ideSettings.defaultDesktopIde === "code-desktop-insiders") {
126
+ newIDESettings.defaultIde = "code-desktop";
127
+ newIDESettings.useLatestVersion = true;
128
+ } else {
129
+ newIDESettings.defaultIde = ideSettings.defaultDesktopIde;
130
+ newIDESettings.useLatestVersion = ideSettings.useLatestVersion;
131
+ }
132
+ } else {
133
+ const useLatest = ideSettings.defaultIde === "code-latest";
134
+ newIDESettings.defaultIde = "code";
135
+ newIDESettings.useLatestVersion = useLatest;
136
+ }
137
+ user.additionalData.ideSettings = newIDESettings;
138
+ }
93
139
  }
94
140
 
95
141
  export interface AdditionalUserData {
@@ -98,10 +144,10 @@ export interface AdditionalUserData {
98
144
  featurePreview?: boolean;
99
145
  ideSettings?: IDESettings;
100
146
  // key is the name of the news, string the iso date when it was seen
101
- whatsNewSeen?: { [key: string]: string }
147
+ whatsNewSeen?: { [key: string]: string };
102
148
  // key is the name of the OAuth client i.e. local app, string the iso date when it was approved
103
149
  // TODO(rl): provide a management UX to allow rescinding of approval
104
- oauthClientsApproved?: { [key: string]: string }
150
+ oauthClientsApproved?: { [key: string]: string };
105
151
  // to remember GH Orgs the user installed/updated the GH App for
106
152
  knownGitHubOrgs?: string[];
107
153
 
@@ -116,10 +162,14 @@ export interface EmailNotificationSettings {
116
162
  }
117
163
 
118
164
  export type IDESettings = {
119
- defaultIde?: string
120
- useDesktopIde?: boolean
121
- defaultDesktopIde?: string
122
- }
165
+ settingVersion?: string;
166
+ defaultIde?: string;
167
+ // DEPRECATED: Use defaultIde after `settingVersion: 2.0`, no more specialify desktop or browser.
168
+ useDesktopIde?: boolean;
169
+ // DEPRECATED: Same with useDesktopIde.
170
+ defaultDesktopIde?: string;
171
+ useLatestVersion?: boolean;
172
+ };
123
173
 
124
174
  export interface UserPlatform {
125
175
  uid: string;
@@ -151,8 +201,12 @@ export interface UserFeatureSettings {
151
201
  * The values of this type MUST MATCH enum values in WorkspaceFeatureFlag from ws-manager/client/core_pb.d.ts
152
202
  * If they don't we'll break things during workspace startup.
153
203
  */
154
- export const WorkspaceFeatureFlags = { "full_workspace_backup": undefined, "fixed_resources": undefined };
155
- export type NamedWorkspaceFeatureFlag = keyof (typeof WorkspaceFeatureFlags);
204
+ export const WorkspaceFeatureFlags = {
205
+ full_workspace_backup: undefined,
206
+ fixed_resources: undefined,
207
+ persistent_volume_claim: undefined,
208
+ };
209
+ export type NamedWorkspaceFeatureFlag = keyof typeof WorkspaceFeatureFlags;
156
210
 
157
211
  export interface EnvVarWithValue {
158
212
  name: string;
@@ -165,7 +219,7 @@ export interface ProjectEnvVarWithValue extends EnvVarWithValue {
165
219
  censored: boolean;
166
220
  }
167
221
 
168
- export type ProjectEnvVar = Omit<ProjectEnvVarWithValue, 'value'>;
222
+ export type ProjectEnvVar = Omit<ProjectEnvVarWithValue, "value">;
169
223
 
170
224
  export interface UserEnvVarValue extends EnvVarWithValue {
171
225
  id?: string;
@@ -178,6 +232,44 @@ export interface UserEnvVar extends UserEnvVarValue {
178
232
  }
179
233
 
180
234
  export namespace UserEnvVar {
235
+ /**
236
+ * @param variable
237
+ * @returns Either a string containing an error message or undefined.
238
+ */
239
+ export function validate(variable: UserEnvVarValue): string | undefined {
240
+ const name = variable.name;
241
+ const pattern = variable.repositoryPattern;
242
+ if (name.trim() === "") {
243
+ return "Name must not be empty.";
244
+ }
245
+ if (name.length > 255) {
246
+ return "Name too long. Maximum name length is 255 characters.";
247
+ }
248
+ if (!/^[a-zA-Z_]+[a-zA-Z0-9_]*$/.test(name)) {
249
+ return "Name must match /^[a-zA-Z_]+[a-zA-Z0-9_]*$/.";
250
+ }
251
+ if (variable.value.trim() === "") {
252
+ return "Value must not be empty.";
253
+ }
254
+ if (variable.value.length > 32767) {
255
+ return "Value too long. Maximum value length is 32767 characters.";
256
+ }
257
+ if (pattern.trim() === "") {
258
+ return "Scope must not be empty.";
259
+ }
260
+ const split = pattern.split("/");
261
+ if (split.length < 2) {
262
+ return "A scope must use the form 'organization/repo'.";
263
+ }
264
+ for (const name of split) {
265
+ if (name !== "*") {
266
+ if (!/^[a-zA-Z0-9_\-.\*]+$/.test(name)) {
267
+ return "Invalid scope segment. Only ASCII characters, numbers, -, _, . or * are allowed.";
268
+ }
269
+ }
270
+ }
271
+ return undefined;
272
+ }
181
273
 
182
274
  // DEPRECATED: Use ProjectEnvVar instead of repositoryPattern - https://github.com/gitpod-com/gitpod/issues/5322
183
275
  export function normalizeRepoPattern(pattern: string) {
@@ -198,7 +290,7 @@ export namespace UserEnvVar {
198
290
  if (repoPattern == "*") {
199
291
  score += 1;
200
292
  }
201
- if (ownerPattern == '*') {
293
+ if (ownerPattern == "*") {
202
294
  score += 2;
203
295
  }
204
296
  if (ownerPattern == "#" || repoPattern == "#") {
@@ -209,20 +301,20 @@ export namespace UserEnvVar {
209
301
 
210
302
  // DEPRECATED: Use ProjectEnvVar instead of repositoryPattern - https://github.com/gitpod-com/gitpod/issues/5322
211
303
  export function filter<T extends UserEnvVarValue>(vars: T[], owner: string, repo: string): T[] {
212
- let result = vars.filter(e => {
304
+ let result = vars.filter((e) => {
213
305
  const [ownerPattern, repoPattern] = splitRepositoryPattern(e.repositoryPattern);
214
- if (ownerPattern !== '*' && ownerPattern !== '#' && (!!owner && ownerPattern !== owner.toLocaleLowerCase())) {
306
+ if (ownerPattern !== "*" && ownerPattern !== "#" && !!owner && ownerPattern !== owner.toLocaleLowerCase()) {
215
307
  return false;
216
308
  }
217
- if (repoPattern !== '*' && repoPattern !== '#' && (!!repo && repoPattern !== repo.toLocaleLowerCase())) {
309
+ if (repoPattern !== "*" && repoPattern !== "#" && !!repo && repoPattern !== repo.toLocaleLowerCase()) {
218
310
  return false;
219
311
  }
220
312
  return true;
221
313
  });
222
314
 
223
315
  const resmap = new Map<string, T[]>();
224
- result.forEach(e => {
225
- const l = (resmap.get(e.name) || []);
316
+ result.forEach((e) => {
317
+ const l = resmap.get(e.name) || [];
226
318
  l.push(e);
227
319
  resmap.set(e.name, l);
228
320
  });
@@ -257,46 +349,45 @@ export namespace UserEnvVar {
257
349
 
258
350
  // DEPRECATED: Use ProjectEnvVar instead of repositoryPattern - https://github.com/gitpod-com/gitpod/issues/5322
259
351
  export function splitRepositoryPattern(repositoryPattern: string): string[] {
260
- const patterns = repositoryPattern.split('/');
261
- const repoPattern = patterns.pop() || "";
262
- const ownerPattern = patterns.join('/');
352
+ const patterns = repositoryPattern.split("/");
353
+ const repoPattern = patterns.slice(1).join("/");
354
+ const ownerPattern = patterns[0];
263
355
  return [ownerPattern, repoPattern];
264
356
  }
265
357
  }
266
358
 
267
359
  export interface GitpodToken {
268
-
269
360
  /** Hash value (SHA256) of the token (primary key). */
270
- tokenHash: string
361
+ tokenHash: string;
271
362
 
272
363
  /** Human readable name of the token */
273
- name?: string
364
+ name?: string;
274
365
 
275
366
  /** Token kind */
276
- type: GitpodTokenType
367
+ type: GitpodTokenType;
277
368
 
278
369
  /** The user the token belongs to. */
279
- user: User
370
+ user: User;
280
371
 
281
372
  /** Scopes (e.g. limition to read-only) */
282
- scopes: string[]
373
+ scopes: string[];
283
374
 
284
375
  /** Created timestamp */
285
- created: string
376
+ created: string;
286
377
 
287
378
  // token is deleted on the database and about to be collected by db-sync
288
- deleted?: boolean
379
+ deleted?: boolean;
289
380
  }
290
381
 
291
382
  export enum GitpodTokenType {
292
383
  API_AUTH_TOKEN = 0,
293
- MACHINE_AUTH_TOKEN = 1
384
+ MACHINE_AUTH_TOKEN = 1,
294
385
  }
295
386
 
296
387
  export interface OneTimeSecret {
297
- id: string
388
+ id: string;
298
389
 
299
- value: string
390
+ value: string;
300
391
 
301
392
  expirationTime: string;
302
393
 
@@ -328,13 +419,12 @@ export type IdentityLookup = Pick<Identity, "authProviderId" | "authId">;
328
419
 
329
420
  export namespace Identity {
330
421
  export function is(data: any): data is Identity {
331
- return data.hasOwnProperty('authProviderId')
332
- && data.hasOwnProperty('authId')
333
- && data.hasOwnProperty('authName')
422
+ return (
423
+ data.hasOwnProperty("authProviderId") && data.hasOwnProperty("authId") && data.hasOwnProperty("authName")
424
+ );
334
425
  }
335
426
  export function equals(id1: IdentityLookup, id2: IdentityLookup) {
336
- return id1.authProviderId === id2.authProviderId
337
- && id1.authId === id2.authId
427
+ return id1.authProviderId === id2.authProviderId && id1.authId === id2.authId;
338
428
  }
339
429
  }
340
430
 
@@ -398,7 +488,14 @@ export interface Snapshot {
398
488
  message?: string;
399
489
  }
400
490
 
401
- export type SnapshotState = 'pending' | 'available' | 'error';
491
+ export interface VolumeSnapshot {
492
+ id: string;
493
+ workspaceId: string;
494
+ creationTime: string;
495
+ volumeHandle: string;
496
+ }
497
+
498
+ export type SnapshotState = "pending" | "available" | "error";
402
499
 
403
500
  export interface LayoutData {
404
501
  workspaceId: string;
@@ -427,13 +524,13 @@ export interface Workspace {
427
524
  * The resolved, fix name of the workspace image. We only use this
428
525
  * to access the logs during an image build.
429
526
  */
430
- imageNameResolved?: string
527
+ imageNameResolved?: string;
431
528
 
432
529
  /**
433
530
  * The resolved/built fixed named of the base image. This field is only set if the workspace
434
531
  * already has its base image built.
435
532
  */
436
- baseImageNameResolved?: string
533
+ baseImageNameResolved?: string;
437
534
 
438
535
  shareable?: boolean;
439
536
  pinned?: boolean;
@@ -470,17 +567,16 @@ export type WorkspaceSoftDeletion = "user" | "gc";
470
567
  export type WorkspaceType = "regular" | "prebuild" | "probe";
471
568
 
472
569
  export namespace Workspace {
473
-
474
570
  export function getFullRepositoryName(ws: Workspace): string | undefined {
475
571
  if (CommitContext.is(ws.context)) {
476
- return ws.context.repository.owner + '/' + ws.context.repository.name
572
+ return ws.context.repository.owner + "/" + ws.context.repository.name;
477
573
  }
478
574
  return undefined;
479
575
  }
480
576
 
481
577
  export function getFullRepositoryUrl(ws: Workspace): string | undefined {
482
578
  if (CommitContext.is(ws.context)) {
483
- return `https://${ws.context.repository.host}/${getFullRepositoryName(ws)}`
579
+ return `https://${ws.context.repository.host}/${getFullRepositoryName(ws)}`;
484
580
  }
485
581
  return undefined;
486
582
  }
@@ -514,59 +610,50 @@ export namespace Workspace {
514
610
  }
515
611
  }
516
612
 
517
- export interface PreparePluginUploadParams {
518
- fullPluginName: string;
519
- }
520
-
521
- export interface ResolvePluginsParams {
522
- config?: WorkspaceConfig
523
- builtins?: ResolvedPlugins
524
- vsxRegistryUrl?: string
525
- }
526
-
527
- export interface InstallPluginsParams {
528
- pluginIds: string[]
529
- }
530
-
531
- export interface UninstallPluginParams {
532
- pluginId: string;
533
- }
534
-
535
613
  export interface GuessGitTokenScopesParams {
536
- host: string
537
- repoUrl: string
538
- gitCommand: string
539
- currentToken: GitToken
614
+ host: string;
615
+ repoUrl: string;
616
+ gitCommand: string;
617
+ currentToken: GitToken;
540
618
  }
541
619
 
542
620
  export interface GitToken {
543
- token: string
544
- user: string
545
- scopes: string[]
621
+ token: string;
622
+ user: string;
623
+ scopes: string[];
546
624
  }
547
625
 
548
626
  export interface GuessedGitTokenScopes {
549
- message?: string
550
- scopes?: string[]
627
+ message?: string;
628
+ scopes?: string[];
551
629
  }
552
630
 
553
- export type ResolvedPluginKind = 'user' | 'workspace' | 'builtin';
554
-
555
- export interface ResolvedPlugins {
556
- [pluginId: string]: ResolvedPlugin | undefined
631
+ export interface VSCodeConfig {
632
+ extensions?: string[];
557
633
  }
558
634
 
559
- export interface ResolvedPlugin {
560
- fullPluginName: string;
561
- url: string;
562
- kind: ResolvedPluginKind;
635
+ export interface JetBrainsConfig {
636
+ intellij?: JetBrainsProductConfig;
637
+ goland?: JetBrainsProductConfig;
638
+ pycharm?: JetBrainsProductConfig;
639
+ phpstorm?: JetBrainsProductConfig;
640
+ }
641
+ export interface JetBrainsProductConfig {
642
+ prebuilds?: JetBrainsPrebuilds;
643
+ vmoptions?: string;
644
+ }
645
+ export interface JetBrainsPrebuilds {
646
+ version?: "stable" | "latest" | "both";
563
647
  }
564
648
 
565
- export interface VSCodeConfig {
566
- extensions?: string[];
649
+ export interface RepositoryCloneInformation {
650
+ url: string;
651
+ checkoutLocation?: string;
567
652
  }
568
653
 
569
654
  export interface WorkspaceConfig {
655
+ mainConfiguration?: string;
656
+ additionalRepositories?: RepositoryCloneInformation[];
570
657
  image?: ImageConfig;
571
658
  ports?: PortConfig[];
572
659
  tasks?: TaskConfig[];
@@ -575,6 +662,7 @@ export interface WorkspaceConfig {
575
662
  gitConfig?: { [config: string]: string };
576
663
  github?: GithubAppConfig;
577
664
  vscode?: VSCodeConfig;
665
+ jetbrains?: JetBrainsConfig;
578
666
 
579
667
  /** deprecated. Enabled by default **/
580
668
  experimentalNetwork?: boolean;
@@ -589,7 +677,7 @@ export interface WorkspaceConfig {
589
677
  * additional-content - config comes from additional content, usually provided through the project's configuration
590
678
  * default - our static catch-all default config
591
679
  */
592
- _origin?: 'repo' | 'project-db' | 'definitely-gp' | 'derived' | 'additional-content' | 'default';
680
+ _origin?: "repo" | "project-db" | "definitely-gp" | "derived" | "additional-content" | "default";
593
681
 
594
682
  /**
595
683
  * Set of automatically infered feature flags. That's not something the user can set, but
@@ -599,34 +687,33 @@ export interface WorkspaceConfig {
599
687
  }
600
688
 
601
689
  export interface GithubAppConfig {
602
- prebuilds?: GithubAppPrebuildConfig
690
+ prebuilds?: GithubAppPrebuildConfig;
603
691
  }
604
692
  export interface GithubAppPrebuildConfig {
605
- master?: boolean
606
- branches?: boolean
607
- pullRequests?: boolean
608
- pullRequestsFromForks?: boolean
609
- addCheck?: boolean | 'prevent-merge-on-error'
610
- addBadge?: boolean
611
- addLabel?: boolean | string
612
- addComment?: boolean
693
+ master?: boolean;
694
+ branches?: boolean;
695
+ pullRequests?: boolean;
696
+ pullRequestsFromForks?: boolean;
697
+ addCheck?: boolean | "prevent-merge-on-error";
698
+ addBadge?: boolean;
699
+ addLabel?: boolean | string;
700
+ addComment?: boolean;
613
701
  }
614
702
  export namespace GithubAppPrebuildConfig {
615
703
  export function is(obj: boolean | GithubAppPrebuildConfig): obj is GithubAppPrebuildConfig {
616
- return !(typeof obj === 'boolean');
704
+ return !(typeof obj === "boolean");
617
705
  }
618
706
  }
619
707
 
620
708
  export type WorkspaceImageSource = WorkspaceImageSourceDocker | WorkspaceImageSourceReference;
621
709
  export interface WorkspaceImageSourceDocker {
622
- dockerFilePath: string
623
- dockerFileHash: string
624
- dockerFileSource?: Commit
710
+ dockerFilePath: string;
711
+ dockerFileHash: string;
712
+ dockerFileSource?: Commit;
625
713
  }
626
714
  export namespace WorkspaceImageSourceDocker {
627
715
  export function is(obj: object): obj is WorkspaceImageSourceDocker {
628
- return 'dockerFileHash' in obj
629
- && 'dockerFilePath' in obj;
716
+ return "dockerFileHash" in obj && "dockerFilePath" in obj;
630
717
  }
631
718
  }
632
719
  export interface WorkspaceImageSourceReference {
@@ -635,21 +722,23 @@ export interface WorkspaceImageSourceReference {
635
722
  }
636
723
  export namespace WorkspaceImageSourceReference {
637
724
  export function is(obj: object): obj is WorkspaceImageSourceReference {
638
- return 'baseImageResolved' in obj;
725
+ return "baseImageResolved" in obj;
639
726
  }
640
727
  }
641
728
 
642
- export type PrebuiltWorkspaceState
729
+ export type PrebuiltWorkspaceState =
643
730
  // the prebuild is queued and may start at anytime
644
- = "queued"
731
+ | "queued"
645
732
  // the workspace prebuild is currently running (i.e. there's a workspace pod deployed)
646
733
  | "building"
647
- // the prebuild failed due to some issue with the system (e.g. missed a message, could not start workspace)
734
+ // the prebuild was aborted
648
735
  | "aborted"
649
736
  // the prebuild timed out
650
737
  | "timeout"
651
- // the prebuild has finished and a snapshot is available
652
- | "available";
738
+ // the prebuild has finished (even if a headless task failed) and a snapshot is available
739
+ | "available"
740
+ // the prebuild (headless workspace) failed due to some system error
741
+ | "failed";
653
742
 
654
743
  export interface PrebuiltWorkspace {
655
744
  id: string;
@@ -660,13 +749,16 @@ export interface PrebuiltWorkspace {
660
749
  buildWorkspaceId: string;
661
750
  creationTime: string;
662
751
  state: PrebuiltWorkspaceState;
752
+ statusVersion: number;
663
753
  error?: string;
664
754
  snapshot?: string;
665
755
  }
666
756
 
667
757
  export namespace PrebuiltWorkspace {
668
758
  export function isDone(pws: PrebuiltWorkspace) {
669
- return pws.state === "available" || pws.state === "timeout" || pws.state === 'aborted';
759
+ return (
760
+ pws.state === "available" || pws.state === "timeout" || pws.state === "aborted" || pws.state === "failed"
761
+ );
670
762
  }
671
763
 
672
764
  export function isAvailable(pws: PrebuiltWorkspace) {
@@ -685,18 +777,22 @@ export interface PrebuiltWorkspaceUpdatable {
685
777
  repo: string;
686
778
  isResolved: boolean;
687
779
  installationId: string;
780
+ /**
781
+ * the commitSHA of the commit that triggered the prebuild
782
+ */
783
+ commitSHA?: string;
688
784
  issue?: string;
689
785
  contextUrl?: string;
690
786
  }
691
787
 
692
788
  export interface WhitelistedRepository {
693
- url: string
694
- name: string
695
- description?: string
696
- avatar?: string
789
+ url: string;
790
+ name: string;
791
+ description?: string;
792
+ avatar?: string;
697
793
  }
698
794
 
699
- export type PortOnOpen = 'open-browser' | 'open-preview' | 'notify' | 'ignore';
795
+ export type PortOnOpen = "open-browser" | "open-preview" | "notify" | "ignore";
700
796
 
701
797
  export interface PortConfig {
702
798
  port: number;
@@ -707,7 +803,7 @@ export interface PortConfig {
707
803
  }
708
804
  export namespace PortConfig {
709
805
  export function is(config: any): config is PortConfig {
710
- return config && ('port' in config) && (typeof config.port === 'number');
806
+ return config && "port" in config && typeof config.port === "number";
711
807
  }
712
808
  }
713
809
 
@@ -717,7 +813,7 @@ export interface PortRangeConfig {
717
813
  }
718
814
  export namespace PortRangeConfig {
719
815
  export function is(config: any): config is PortRangeConfig {
720
- return config && ('port' in config) && (typeof config.port === 'string' || config.port instanceof String);
816
+ return config && "port" in config && (typeof config.port === "string" || config.port instanceof String);
721
817
  }
722
818
  }
723
819
 
@@ -728,32 +824,31 @@ export interface TaskConfig {
728
824
  prebuild?: string;
729
825
  command?: string;
730
826
  env?: { [env: string]: any };
731
- openIn?: 'bottom' | 'main' | 'left' | 'right';
732
- openMode?: 'split-top' | 'split-left' | 'split-right' | 'split-bottom' | 'tab-before' | 'tab-after';
827
+ openIn?: "bottom" | "main" | "left" | "right";
828
+ openMode?: "split-top" | "split-left" | "split-right" | "split-bottom" | "tab-before" | "tab-after";
733
829
  }
734
830
 
735
831
  export namespace TaskConfig {
736
832
  export function is(config: any): config is TaskConfig {
737
- return config
738
- && ('command' in config || 'init' in config || 'before' in config);
833
+ return config && ("command" in config || "init" in config || "before" in config);
739
834
  }
740
835
  }
741
836
 
742
837
  export namespace WorkspaceImageBuild {
743
- export type Phase = 'BaseImage' | 'GitpodLayer' | 'Error' | 'Done';
838
+ export type Phase = "BaseImage" | "GitpodLayer" | "Error" | "Done";
744
839
  export interface StateInfo {
745
- phase: Phase
746
- currentStep?: number
747
- maxSteps?: number
840
+ phase: Phase;
841
+ currentStep?: number;
842
+ maxSteps?: number;
748
843
  }
749
844
  export interface LogContent {
750
- text: string
751
- upToLine?: number
752
- isDiff?: boolean
845
+ text: string;
846
+ upToLine?: number;
847
+ isDiff?: boolean;
753
848
  }
754
849
  export type LogCallback = (info: StateInfo, content: LogContent | undefined) => void;
755
850
  export namespace LogLine {
756
- export const DELIMITER = '\r\n';
851
+ export const DELIMITER = "\r\n";
757
852
  export const DELIMITER_REGEX = /\r?\n/;
758
853
  }
759
854
  }
@@ -762,20 +857,18 @@ export type ImageConfig = ImageConfigString | ImageConfigFile;
762
857
  export type ImageConfigString = string;
763
858
  export namespace ImageConfigString {
764
859
  export function is(config: ImageConfig | undefined): config is ImageConfigString {
765
- return typeof config === 'string';
860
+ return typeof config === "string";
766
861
  }
767
-
768
862
  }
769
863
  export interface ImageConfigFile {
770
864
  // Path to the Dockerfile relative to repository root
771
- file: string,
865
+ file: string;
772
866
  // Path to the docker build context relative to repository root
773
- context?: string
867
+ context?: string;
774
868
  }
775
869
  export namespace ImageConfigFile {
776
870
  export function is(config: ImageConfig | undefined): config is ImageConfigFile {
777
- return typeof config === 'object'
778
- && 'file' in config;
871
+ return typeof config === "object" && "file" in config;
779
872
  }
780
873
  }
781
874
  export interface ExternalImageConfigFile extends ImageConfigFile {
@@ -783,14 +876,13 @@ export interface ExternalImageConfigFile extends ImageConfigFile {
783
876
  }
784
877
  export namespace ExternalImageConfigFile {
785
878
  export function is(config: any | undefined): config is ExternalImageConfigFile {
786
- return typeof config === 'object'
787
- && 'file' in config
788
- && 'externalSource' in config;
879
+ return typeof config === "object" && "file" in config && "externalSource" in config;
789
880
  }
790
881
  }
791
882
 
792
883
  export interface WorkspaceContext {
793
884
  title: string;
885
+ ref?: string;
794
886
  /** This contains the URL portion of the contextURL (which might contain other modifiers as well). It's optional because it's not set for older workspaces. */
795
887
  normalizedContextURL?: string;
796
888
  forceCreateNewWorkspace?: boolean;
@@ -799,8 +891,7 @@ export interface WorkspaceContext {
799
891
 
800
892
  export namespace WorkspaceContext {
801
893
  export function is(context: any): context is WorkspaceContext {
802
- return context
803
- && 'title' in context;
894
+ return context && "title" in context;
804
895
  }
805
896
  }
806
897
 
@@ -809,22 +900,17 @@ export interface WithSnapshot {
809
900
  }
810
901
  export namespace WithSnapshot {
811
902
  export function is(context: any): context is WithSnapshot {
812
- return context
813
- && 'snapshotBucketId' in context;
903
+ return context && "snapshotBucketId" in context;
814
904
  }
815
905
  }
816
906
 
817
- export interface WithPrebuild {
818
- snapshotBucketId: string;
907
+ export interface WithPrebuild extends WithSnapshot {
819
908
  prebuildWorkspaceId: string;
820
909
  wasPrebuilt: true;
821
910
  }
822
911
  export namespace WithPrebuild {
823
912
  export function is(context: any): context is WithPrebuild {
824
- return context
825
- && 'snapshotBucketId' in context
826
- && 'prebuildWorkspaceId' in context
827
- && 'wasPrebuilt' in context;
913
+ return context && WithSnapshot.is(context) && "prebuildWorkspaceId" in context && "wasPrebuilt" in context;
828
914
  }
829
915
  }
830
916
 
@@ -838,16 +924,14 @@ export interface WithDefaultConfig {
838
924
 
839
925
  export namespace WithDefaultConfig {
840
926
  export function is(context: any): context is WithDefaultConfig {
841
- return context
842
- && 'withDefaultConfig' in context
843
- && context.withDefaultConfig;
927
+ return context && "withDefaultConfig" in context && context.withDefaultConfig;
844
928
  }
845
929
 
846
930
  export function mark(ctx: WorkspaceContext): WorkspaceContext & WithDefaultConfig {
847
931
  return {
848
932
  ...ctx,
849
- withDefaultConfig: true
850
- }
933
+ withDefaultConfig: true,
934
+ };
851
935
  }
852
936
  }
853
937
 
@@ -857,23 +941,24 @@ export interface SnapshotContext extends WorkspaceContext, WithSnapshot {
857
941
 
858
942
  export namespace SnapshotContext {
859
943
  export function is(context: any): context is SnapshotContext {
860
- return context
861
- && WithSnapshot.is(context)
862
- && 'snapshotId' in context;
944
+ return context && WithSnapshot.is(context) && "snapshotId" in context;
863
945
  }
864
946
  }
865
947
 
866
948
  export interface StartPrebuildContext extends WorkspaceContext {
867
949
  actual: WorkspaceContext;
868
950
  commitHistory?: string[];
951
+ additionalRepositoryCommitHistories?: {
952
+ cloneUrl: string;
953
+ commitHistory: string[];
954
+ }[];
869
955
  project?: Project;
870
956
  branch?: string;
871
957
  }
872
958
 
873
959
  export namespace StartPrebuildContext {
874
960
  export function is(context: any): context is StartPrebuildContext {
875
- return context
876
- && 'actual' in context;
961
+ return context && "actual" in context;
877
962
  }
878
963
  }
879
964
 
@@ -885,21 +970,18 @@ export interface PrebuiltWorkspaceContext extends WorkspaceContext {
885
970
 
886
971
  export namespace PrebuiltWorkspaceContext {
887
972
  export function is(context: any): context is PrebuiltWorkspaceContext {
888
- return context
889
- && 'originalContext' in context
890
- && 'prebuiltWorkspace' in context;
973
+ return context && "originalContext" in context && "prebuiltWorkspace" in context;
891
974
  }
892
975
  }
893
976
 
894
977
  export interface WithReferrerContext extends WorkspaceContext {
895
- referrer: string
896
- referrerIde?: string
978
+ referrer: string;
979
+ referrerIde?: string;
897
980
  }
898
981
 
899
982
  export namespace WithReferrerContext {
900
983
  export function is(context: any): context is WithReferrerContext {
901
- return context
902
- && 'referrer' in context;
984
+ return context && "referrer" in context;
903
985
  }
904
986
  }
905
987
 
@@ -909,21 +991,18 @@ export interface WithEnvvarsContext extends WorkspaceContext {
909
991
 
910
992
  export namespace WithEnvvarsContext {
911
993
  export function is(context: any): context is WithEnvvarsContext {
912
- return context
913
- && 'envvars' in context
994
+ return context && "envvars" in context;
914
995
  }
915
996
  }
916
997
 
917
998
  export interface WorkspaceProbeContext extends WorkspaceContext {
918
- responseURL: string
919
- responseToken: string
999
+ responseURL: string;
1000
+ responseToken: string;
920
1001
  }
921
1002
 
922
1003
  export namespace WorkspaceProbeContext {
923
1004
  export function is(context: any): context is WorkspaceProbeContext {
924
- return context
925
- && 'responseURL' in context
926
- && 'responseToken' in context;
1005
+ return context && "responseURL" in context && "responseToken" in context;
927
1006
  }
928
1007
  }
929
1008
 
@@ -935,32 +1014,30 @@ export namespace RefType {
935
1014
  }
936
1015
  // This fallback is meant to handle the cases where (for historic reasons) ref is present but refType is missing
937
1016
  return commit.refType || "branch";
938
- }
1017
+ };
939
1018
  }
940
1019
 
941
1020
  export interface Commit {
942
- repository: Repository
943
- revision: string
1021
+ repository: Repository;
1022
+ revision: string;
944
1023
 
945
1024
  // Might contain either a branch or a tag (determined by refType)
946
- ref?: string
1025
+ ref?: string;
947
1026
 
948
1027
  // refType is only set if ref is present (and not for old workspaces, before this feature was added)
949
- refType?: RefType
1028
+ refType?: RefType;
950
1029
  }
951
1030
 
952
1031
  export interface AdditionalContentContext extends WorkspaceContext {
953
-
954
1032
  /**
955
1033
  * utf-8 encoded contents that will be copied on top of the workspace's filesystem
956
1034
  */
957
- additionalFiles: {[filePath: string]: string};
958
-
1035
+ additionalFiles: { [filePath: string]: string };
959
1036
  }
960
1037
 
961
1038
  export namespace AdditionalContentContext {
962
1039
  export function is(ctx: any): ctx is AdditionalContentContext {
963
- return 'additionalFiles' in ctx;
1040
+ return "additionalFiles" in ctx;
964
1041
  }
965
1042
 
966
1043
  export function hasDockerConfig(ctx: any, config: WorkspaceConfig): boolean {
@@ -968,16 +1045,49 @@ export namespace AdditionalContentContext {
968
1045
  }
969
1046
  }
970
1047
 
971
- export interface CommitContext extends WorkspaceContext, Commit {
1048
+ export interface CommitContext extends WorkspaceContext, GitCheckoutInfo {
972
1049
  /** @deprecated Moved to .repository.cloneUrl, left here for backwards-compatibility for old workspace contextes in the DB */
973
- cloneUrl?: string
1050
+ cloneUrl?: string;
1051
+
1052
+ /**
1053
+ * The clone and checkout information for additional repositories in case of multi-repo projects.
1054
+ */
1055
+ additionalRepositoryCheckoutInfo?: GitCheckoutInfo[];
1056
+ }
1057
+
1058
+ export namespace CommitContext {
1059
+ /**
1060
+ * Creates a hash for all the commits of the CommitContext and all sub-repo commit infos.
1061
+ * The hash is max 255 chars long.
1062
+ * @param commitContext
1063
+ * @returns hash for commitcontext
1064
+ */
1065
+ export function computeHash(commitContext: CommitContext): string {
1066
+ // for single commits we use the revision to be backward compatible.
1067
+ if (
1068
+ !commitContext.additionalRepositoryCheckoutInfo ||
1069
+ commitContext.additionalRepositoryCheckoutInfo.length === 0
1070
+ ) {
1071
+ return commitContext.revision;
1072
+ }
1073
+ const hasher = createHash("sha256");
1074
+ hasher.update(commitContext.revision);
1075
+ for (const info of commitContext.additionalRepositoryCheckoutInfo) {
1076
+ hasher.update(info.revision);
1077
+ }
1078
+ return hasher.digest("hex");
1079
+ }
1080
+ }
1081
+
1082
+ export interface GitCheckoutInfo extends Commit {
1083
+ checkoutLocation?: string;
1084
+ upstreamRemoteURI?: string;
1085
+ localBranch?: string;
974
1086
  }
975
1087
 
976
1088
  export namespace CommitContext {
977
1089
  export function is(commit: any): commit is CommitContext {
978
- return WorkspaceContext.is(commit)
979
- && 'repository' in commit
980
- && 'revision' in commit
1090
+ return WorkspaceContext.is(commit) && "repository" in commit && "revision" in commit;
981
1091
  }
982
1092
  }
983
1093
 
@@ -985,17 +1095,14 @@ export interface PullRequestContext extends CommitContext {
985
1095
  nr: number;
986
1096
  ref: string;
987
1097
  base: {
988
- repository: Repository
989
- ref: string
990
- }
1098
+ repository: Repository;
1099
+ ref: string;
1100
+ };
991
1101
  }
992
1102
 
993
1103
  export namespace PullRequestContext {
994
1104
  export function is(ctx: any): ctx is PullRequestContext {
995
- return CommitContext.is(ctx)
996
- && 'nr' in ctx
997
- && 'ref' in ctx
998
- && 'base' in ctx
1105
+ return CommitContext.is(ctx) && "nr" in ctx && "ref" in ctx && "base" in ctx;
999
1106
  }
1000
1107
  }
1001
1108
 
@@ -1007,10 +1114,7 @@ export interface IssueContext extends CommitContext {
1007
1114
 
1008
1115
  export namespace IssueContext {
1009
1116
  export function is(ctx: any): ctx is IssueContext {
1010
- return CommitContext.is(ctx)
1011
- && 'nr' in ctx
1012
- && 'ref' in ctx
1013
- && 'localBranch' in ctx
1117
+ return CommitContext.is(ctx) && "nr" in ctx && "ref" in ctx && "localBranch" in ctx;
1014
1118
  }
1015
1119
  }
1016
1120
 
@@ -1021,9 +1125,7 @@ export interface NavigatorContext extends CommitContext {
1021
1125
 
1022
1126
  export namespace NavigatorContext {
1023
1127
  export function is(ctx: any): ctx is NavigatorContext {
1024
- return CommitContext.is(ctx)
1025
- && 'path' in ctx
1026
- && 'isFile' in ctx
1128
+ return CommitContext.is(ctx) && "path" in ctx && "isFile" in ctx;
1027
1129
  }
1028
1130
  }
1029
1131
 
@@ -1032,6 +1134,8 @@ export interface Repository {
1032
1134
  owner: string;
1033
1135
  name: string;
1034
1136
  cloneUrl: string;
1137
+ /* Optional kind to differentiate between repositories of orgs/groups/projects and personal repos. */
1138
+ repoKind?: string;
1035
1139
  description?: string;
1036
1140
  avatarUrl?: string;
1037
1141
  webUrl?: string;
@@ -1040,8 +1144,8 @@ export interface Repository {
1040
1144
  private?: boolean;
1041
1145
  fork?: {
1042
1146
  // The direct parent of this fork
1043
- parent: Repository
1044
- }
1147
+ parent: Repository;
1148
+ };
1045
1149
  }
1046
1150
  export interface Branch {
1047
1151
  name: string;
@@ -1066,21 +1170,19 @@ export namespace Repository {
1066
1170
  export interface WorkspaceInstancePortsChangedEvent {
1067
1171
  type: "PortsChanged";
1068
1172
  instanceID: string;
1069
- portsOpened: number[]
1070
- portsClosed: number[]
1173
+ portsOpened: number[];
1174
+ portsClosed: number[];
1071
1175
  }
1072
1176
 
1073
1177
  export namespace WorkspaceInstancePortsChangedEvent {
1074
-
1075
1178
  export function is(data: any): data is WorkspaceInstancePortsChangedEvent {
1076
1179
  return data && data.type == "PortsChanged";
1077
1180
  }
1078
-
1079
1181
  }
1080
1182
 
1081
1183
  export interface WorkspaceInfo {
1082
- workspace: Workspace
1083
- latestInstance?: WorkspaceInstance
1184
+ workspace: Workspace;
1185
+ latestInstance?: WorkspaceInstance;
1084
1186
  }
1085
1187
 
1086
1188
  export namespace WorkspaceInfo {
@@ -1096,35 +1198,36 @@ export interface WorkspaceCreationResult {
1096
1198
  workspaceURL?: string;
1097
1199
  existingWorkspaces?: WorkspaceInfo[];
1098
1200
  runningWorkspacePrebuild?: {
1099
- prebuildID: string
1100
- workspaceID: string
1101
- instanceID: string
1102
- starting: RunningWorkspacePrebuildStarting
1103
- sameCluster: boolean
1104
- }
1201
+ prebuildID: string;
1202
+ workspaceID: string;
1203
+ instanceID: string;
1204
+ starting: RunningWorkspacePrebuildStarting;
1205
+ sameCluster: boolean;
1206
+ };
1105
1207
  runningPrebuildWorkspaceID?: string;
1106
1208
  }
1107
- export type RunningWorkspacePrebuildStarting = 'queued' | 'starting' | 'running';
1209
+ export type RunningWorkspacePrebuildStarting = "queued" | "starting" | "running";
1108
1210
 
1109
1211
  export enum CreateWorkspaceMode {
1110
1212
  // Default returns a running prebuild if there is any, otherwise creates a new workspace (using a prebuild if one is available)
1111
- Default = 'default',
1213
+ Default = "default",
1112
1214
  // ForceNew creates a new workspace irrespective of any running prebuilds. This mode is guaranteed to actually create a workspace - but may degrade user experience as currently runnig prebuilds are ignored.
1113
- ForceNew = 'force-new',
1215
+ ForceNew = "force-new",
1114
1216
  // UsePrebuild polls the database waiting for a currently running prebuild to become available. This mode exists to handle the db-sync delay.
1115
- UsePrebuild = 'use-prebuild',
1217
+ UsePrebuild = "use-prebuild",
1116
1218
  // SelectIfRunning returns a list of currently running workspaces for the context URL if there are any, otherwise falls back to Default mode
1117
- SelectIfRunning = 'select-if-running',
1219
+ SelectIfRunning = "select-if-running",
1118
1220
  }
1119
1221
 
1120
1222
  export namespace WorkspaceCreationResult {
1121
1223
  export function is(data: any): data is WorkspaceCreationResult {
1122
- return data && (
1123
- 'createdWorkspaceId' in data
1124
- || 'existingWorkspaces' in data
1125
- || 'runningWorkspacePrebuild' in data
1126
- || 'runningPrebuildWorkspaceID' in data
1127
- )
1224
+ return (
1225
+ data &&
1226
+ ("createdWorkspaceId" in data ||
1227
+ "existingWorkspaces" in data ||
1228
+ "runningWorkspacePrebuild" in data ||
1229
+ "runningPrebuildWorkspaceID" in data)
1230
+ );
1128
1231
  }
1129
1232
  }
1130
1233
 
@@ -1158,7 +1261,7 @@ export interface AuthProviderInfo {
1158
1261
  readonly default: string[];
1159
1262
  readonly publicRepo: string[];
1160
1263
  readonly privateRepo: string[];
1161
- }
1264
+ };
1162
1265
  }
1163
1266
 
1164
1267
  export interface AuthProviderEntry {
@@ -1170,6 +1273,8 @@ export interface AuthProviderEntry {
1170
1273
  readonly status: AuthProviderEntry.Status;
1171
1274
 
1172
1275
  readonly oauth: OAuth2Config;
1276
+ /** A random string that is to change whenever oauth changes (enforced on DB level) */
1277
+ readonly oauthRevision?: string;
1173
1278
  }
1174
1279
 
1175
1280
  export interface OAuth2Config {
@@ -1182,23 +1287,27 @@ export interface OAuth2Config {
1182
1287
  readonly scopeSeparator?: string;
1183
1288
 
1184
1289
  readonly settingsUrl?: string;
1185
- readonly authorizationParams?: { [key: string]: string }
1290
+ readonly authorizationParams?: { [key: string]: string };
1186
1291
  readonly configURL?: string;
1187
1292
  }
1188
1293
 
1189
1294
  export namespace AuthProviderEntry {
1190
1295
  export type Type = "GitHub" | "GitLab" | string;
1191
1296
  export type Status = "pending" | "verified";
1192
- export type NewEntry = Pick<AuthProviderEntry, "ownerId" | "host" | "type"> & { clientId?: string, clientSecret?: string };
1193
- export type UpdateEntry = Pick<AuthProviderEntry, "id" | "ownerId"> & Pick<OAuth2Config, "clientId" | "clientSecret">;
1297
+ export type NewEntry = Pick<AuthProviderEntry, "ownerId" | "host" | "type"> & {
1298
+ clientId?: string;
1299
+ clientSecret?: string;
1300
+ };
1301
+ export type UpdateEntry = Pick<AuthProviderEntry, "id" | "ownerId"> &
1302
+ Pick<OAuth2Config, "clientId" | "clientSecret">;
1194
1303
  export function redact(entry: AuthProviderEntry): AuthProviderEntry {
1195
1304
  return {
1196
1305
  ...entry,
1197
1306
  oauth: {
1198
1307
  ...entry.oauth,
1199
- clientSecret: "redacted"
1200
- }
1201
- }
1308
+ clientSecret: "redacted",
1309
+ },
1310
+ };
1202
1311
  }
1203
1312
  }
1204
1313