@gitpod/gitpod-protocol 0.1.5-server-vscode-oauth2.11 → 0.1.5-server-vscode-oauth2.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/data/gitpod-schema.json +49 -4
- package/lib/accounting-protocol.d.ts +10 -11
- package/lib/accounting-protocol.d.ts.map +1 -1
- package/lib/accounting-protocol.js +26 -36
- package/lib/accounting-protocol.js.map +1 -1
- package/lib/admin-protocol.d.ts +12 -0
- package/lib/admin-protocol.d.ts.map +1 -1
- package/lib/admin-protocol.js.map +1 -1
- package/lib/analytics.d.ts +4 -4
- package/lib/analytics.d.ts.map +1 -1
- package/lib/analytics.js.map +1 -1
- package/lib/auth.d.ts.map +1 -1
- package/lib/context-url.d.ts +18 -5
- package/lib/context-url.d.ts.map +1 -1
- package/lib/context-url.js +59 -6
- package/lib/context-url.js.map +1 -1
- package/lib/context-url.spec.d.ts +2 -0
- package/lib/context-url.spec.d.ts.map +1 -1
- package/lib/context-url.spec.js +40 -4
- package/lib/context-url.spec.js.map +1 -1
- package/lib/email-protocol.d.ts +1 -1
- package/lib/email-protocol.d.ts.map +1 -1
- package/lib/email-protocol.js +2 -2
- package/lib/email-protocol.js.map +1 -1
- package/lib/encryption/container-module.d.ts.map +1 -1
- package/lib/encryption/container-module.js +1 -1
- package/lib/encryption/container-module.js.map +1 -1
- package/lib/encryption/encryption-engine.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.js +8 -8
- package/lib/encryption/encryption-engine.js.map +1 -1
- package/lib/encryption/encryption-engine.spec.d.ts.map +1 -1
- package/lib/encryption/encryption-engine.spec.js +2 -3
- package/lib/encryption/encryption-engine.spec.js.map +1 -1
- package/lib/encryption/encryption-service.d.ts.map +1 -1
- package/lib/encryption/encryption-service.js +4 -4
- package/lib/encryption/encryption-service.js.map +1 -1
- package/lib/encryption/key-provider.d.ts.map +1 -1
- package/lib/encryption/key-provider.js +9 -11
- package/lib/encryption/key-provider.js.map +1 -1
- package/lib/env.d.ts +1 -1
- package/lib/env.d.ts.map +1 -1
- package/lib/env.js +6 -6
- package/lib/env.js.map +1 -1
- package/lib/gitpod-file-parser.d.ts.map +1 -1
- package/lib/gitpod-file-parser.js +7 -7
- package/lib/gitpod-file-parser.js.map +1 -1
- package/lib/gitpod-file-parser.spec.js +42 -39
- package/lib/gitpod-file-parser.spec.js.map +1 -1
- package/lib/gitpod-service.d.ts +57 -31
- package/lib/gitpod-service.d.ts.map +1 -1
- package/lib/gitpod-service.js +26 -27
- package/lib/gitpod-service.js.map +1 -1
- package/lib/headless-workspace-log.d.ts +1 -0
- package/lib/headless-workspace-log.d.ts.map +1 -1
- package/lib/headless-workspace-log.js +2 -1
- package/lib/headless-workspace-log.js.map +1 -1
- package/lib/ide-frontend-service.d.ts +1 -1
- package/lib/ide-protocol.d.ts +105 -0
- package/lib/ide-protocol.d.ts.map +1 -0
- package/lib/ide-protocol.js +8 -0
- package/lib/ide-protocol.js.map +1 -0
- package/lib/index.d.ts +16 -13
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/installation-admin-protocol.d.ts +27 -0
- package/lib/installation-admin-protocol.d.ts.map +1 -0
- package/lib/installation-admin-protocol.js +30 -0
- package/lib/installation-admin-protocol.js.map +1 -0
- package/lib/license-protocol.d.ts.map +1 -1
- package/lib/license-protocol.js.map +1 -1
- package/lib/messaging/browser/connection.d.ts +1 -1
- package/lib/messaging/browser/connection.d.ts.map +1 -1
- package/lib/messaging/browser/connection.js +21 -21
- package/lib/messaging/browser/connection.js.map +1 -1
- package/lib/messaging/browser/window-connection.d.ts +4 -4
- package/lib/messaging/browser/window-connection.d.ts.map +1 -1
- package/lib/messaging/browser/window-connection.js +10 -7
- package/lib/messaging/browser/window-connection.js.map +1 -1
- package/lib/messaging/client-call-metrics.d.ts +2 -2
- package/lib/messaging/client-call-metrics.d.ts.map +1 -1
- package/lib/messaging/client-call-metrics.js +21 -21
- package/lib/messaging/client-call-metrics.js.map +1 -1
- package/lib/messaging/error.d.ts +2 -1
- package/lib/messaging/error.d.ts.map +1 -1
- package/lib/messaging/error.js +4 -2
- package/lib/messaging/error.js.map +1 -1
- package/lib/messaging/handler.d.ts.map +1 -1
- package/lib/messaging/handler.js +1 -1
- package/lib/messaging/node/connection.d.ts +1 -17
- package/lib/messaging/node/connection.d.ts.map +1 -1
- package/lib/messaging/node/connection.js +23 -59
- package/lib/messaging/node/connection.js.map +1 -1
- package/lib/messaging/proxy-factory.d.ts +1 -1
- package/lib/messaging/proxy-factory.d.ts.map +1 -1
- package/lib/messaging/proxy-factory.js +7 -9
- package/lib/messaging/proxy-factory.js.map +1 -1
- package/lib/oss-allowlist.d.ts +14 -0
- package/lib/oss-allowlist.d.ts.map +1 -0
- package/lib/oss-allowlist.js +8 -0
- package/lib/oss-allowlist.js.map +1 -0
- package/lib/payment-protocol.d.ts.map +1 -1
- package/lib/payment-protocol.js +1 -1
- package/lib/payment-protocol.js.map +1 -1
- package/lib/permission.d.ts +9 -3
- package/lib/permission.d.ts.map +1 -1
- package/lib/permission.js +34 -25
- package/lib/permission.js.map +1 -1
- package/lib/plans.d.ts +4 -4
- package/lib/plans.d.ts.map +1 -1
- package/lib/plans.js +206 -171
- package/lib/plans.js.map +1 -1
- package/lib/protocol.d.ts +83 -78
- package/lib/protocol.d.ts.map +1 -1
- package/lib/protocol.js +96 -85
- package/lib/protocol.js.map +1 -1
- package/lib/snapshot-url.d.ts +14 -0
- package/lib/snapshot-url.d.ts.map +1 -0
- package/lib/snapshot-url.js +26 -0
- package/lib/snapshot-url.js.map +1 -0
- package/{src/theia-plugins.ts → lib/snapshot-url.spec.d.ts} +2 -6
- package/lib/snapshot-url.spec.d.ts.map +1 -0
- package/lib/snapshot-url.spec.js +41 -0
- package/lib/snapshot-url.spec.js.map +1 -0
- package/lib/team-subscription-protocol.d.ts +5 -3
- package/lib/team-subscription-protocol.d.ts.map +1 -1
- package/lib/team-subscription-protocol.js +7 -7
- package/lib/team-subscription-protocol.js.map +1 -1
- package/lib/teams-projects-protocol.d.ts +13 -2
- package/lib/teams-projects-protocol.d.ts.map +1 -1
- package/lib/teams-projects-protocol.js +10 -3
- package/lib/teams-projects-protocol.js.map +1 -1
- package/lib/typings/globals.d.ts +2 -2
- package/lib/typings/globals.d.ts.map +1 -1
- package/lib/util/analytics.d.ts.map +1 -1
- package/lib/util/analytics.js +12 -3
- package/lib/util/analytics.js.map +1 -1
- package/lib/util/async-iterator.d.ts.map +1 -1
- package/lib/util/async-iterator.js +3 -3
- package/lib/util/async-iterator.js.map +1 -1
- package/lib/util/cancelable.js.map +1 -1
- package/lib/util/date-time.js +6 -6
- package/lib/util/date-time.js.map +1 -1
- package/lib/util/deferred.js.map +1 -1
- package/lib/util/disposable.d.ts.map +1 -1
- package/lib/util/disposable.js +2 -2
- package/lib/util/disposable.js.map +1 -1
- package/lib/util/event.d.ts.map +1 -1
- package/lib/util/event.js +5 -3
- package/lib/util/event.js.map +1 -1
- package/lib/util/garbage-collected-cache.d.ts +1 -0
- package/lib/util/garbage-collected-cache.d.ts.map +1 -1
- package/lib/util/garbage-collected-cache.js +6 -2
- package/lib/util/garbage-collected-cache.js.map +1 -1
- package/lib/util/generate-workspace-id.d.ts +1 -1
- package/lib/util/generate-workspace-id.d.ts.map +1 -1
- package/lib/util/generate-workspace-id.js +452 -435
- package/lib/util/generate-workspace-id.js.map +1 -1
- package/lib/util/generate-workspace-id.spec.js +29 -1
- package/lib/util/generate-workspace-id.spec.js.map +1 -1
- package/lib/util/gitpod-cookie.d.ts +1 -1
- package/lib/util/gitpod-cookie.d.ts.map +1 -1
- package/lib/util/gitpod-cookie.js +1 -4
- package/lib/util/gitpod-cookie.js.map +1 -1
- package/lib/util/gitpod-host-url.d.ts +1 -1
- package/lib/util/gitpod-host-url.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.js +35 -33
- package/lib/util/gitpod-host-url.js.map +1 -1
- package/lib/util/gitpod-host-url.spec.d.ts.map +1 -1
- package/lib/util/gitpod-host-url.spec.js +15 -5
- package/lib/util/gitpod-host-url.spec.js.map +1 -1
- package/lib/util/grpc.d.ts.map +1 -1
- package/lib/util/grpc.js.map +1 -1
- package/lib/util/jaeger-client-types.d.ts +68 -0
- package/lib/util/jaeger-client-types.d.ts.map +1 -0
- package/lib/{theia-plugins.js → util/jaeger-client-types.js} +1 -1
- package/lib/util/jaeger-client-types.js.map +1 -0
- package/lib/util/logging.d.ts +33 -33
- package/lib/util/logging.d.ts.map +1 -1
- package/lib/util/logging.js +22 -23
- package/lib/util/logging.js.map +1 -1
- package/lib/util/make-link.js +5 -5
- package/lib/util/make-link.js.map +1 -1
- package/lib/util/parse-workspace-id.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.js +2 -3
- package/lib/util/parse-workspace-id.js.map +1 -1
- package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
- package/lib/util/parse-workspace-id.spec.js +12 -12
- package/lib/util/parse-workspace-id.spec.js.map +1 -1
- package/lib/util/queue.spec.js +13 -10
- package/lib/util/queue.spec.js.map +1 -1
- package/lib/util/repeat.d.ts +15 -0
- package/lib/util/repeat.d.ts.map +1 -0
- package/lib/util/repeat.js +55 -0
- package/lib/util/repeat.js.map +1 -0
- package/lib/util/semaphore.d.ts.map +1 -1
- package/lib/util/semaphore.js.map +1 -1
- package/lib/util/skip-if.d.ts.map +1 -1
- package/lib/util/skip-if.js.map +1 -1
- package/lib/util/timeutil.d.ts.map +1 -1
- package/lib/util/timeutil.js +8 -8
- package/lib/util/timeutil.js.map +1 -1
- package/lib/util/timeutil.spec.d.ts.map +1 -1
- package/lib/util/timeutil.spec.js +2 -2
- package/lib/util/timeutil.spec.js.map +1 -1
- package/lib/util/tracing.d.ts +52 -6
- package/lib/util/tracing.d.ts.map +1 -1
- package/lib/util/tracing.js +161 -22
- package/lib/util/tracing.js.map +1 -1
- package/lib/util/tracing.spec.d.ts +7 -0
- package/lib/util/tracing.spec.d.ts.map +1 -0
- package/lib/util/tracing.spec.js +121 -0
- package/lib/util/tracing.spec.js.map +1 -0
- package/lib/util/workspace-port-authentication.d.ts +7 -7
- package/lib/util/workspace-port-authentication.d.ts.map +1 -1
- package/lib/util/workspace-port-authentication.js +8 -11
- package/lib/util/workspace-port-authentication.js.map +1 -1
- package/lib/workspace-cluster.d.ts +10 -8
- package/lib/workspace-cluster.d.ts.map +1 -1
- package/lib/workspace-cluster.js +17 -2
- package/lib/workspace-cluster.js.map +1 -1
- package/lib/workspace-instance.d.ts +23 -4
- package/lib/workspace-instance.d.ts.map +1 -1
- package/lib/wsready.d.ts +1 -1
- package/lib/wsready.d.ts.map +1 -1
- package/lib/wsready.js +2 -2
- package/package.json +21 -14
- package/pkg-yarn.lock +12 -8
- package/provenance-bundle.jsonl +2 -0
- package/src/accounting-protocol.ts +53 -53
- package/src/admin-protocol.ts +35 -18
- package/src/analytics.ts +27 -27
- package/src/auth.ts +2 -2
- package/src/context-url.spec.ts +37 -9
- package/src/context-url.ts +94 -36
- package/src/email-protocol.ts +5 -6
- package/src/encryption/container-module.ts +2 -3
- package/src/encryption/encryption-engine.spec.ts +9 -8
- package/src/encryption/encryption-engine.ts +14 -14
- package/src/encryption/encryption-service.ts +4 -5
- package/src/encryption/key-provider.ts +16 -19
- package/src/env.ts +9 -9
- package/src/gitpod-file-parser.spec.ts +55 -61
- package/src/gitpod-file-parser.ts +16 -17
- package/src/gitpod-service.ts +167 -113
- package/src/headless-workspace-log.ts +6 -4
- package/src/ide-frontend-service.ts +2 -2
- package/src/ide-protocol.ts +119 -0
- package/src/index.ts +16 -13
- package/src/installation-admin-protocol.ts +42 -0
- package/src/license-protocol.ts +5 -6
- package/src/messaging/browser/connection.ts +45 -47
- package/src/messaging/browser/window-connection.ts +39 -29
- package/src/messaging/client-call-metrics.ts +70 -71
- package/src/messaging/error.ts +6 -5
- package/src/messaging/handler.ts +6 -6
- package/src/messaging/node/connection.ts +23 -70
- package/src/messaging/proxy-factory.ts +23 -30
- package/src/oss-allowlist.ts +15 -0
- package/src/payment-protocol.ts +2 -2
- package/src/permission.ts +40 -32
- package/src/plans.ts +236 -189
- package/src/protocol.ts +280 -277
- package/src/snapshot-url.spec.ts +27 -0
- package/src/snapshot-url.ts +27 -0
- package/src/team-subscription-protocol.ts +33 -23
- package/src/teams-projects-protocol.ts +24 -8
- package/src/typings/globals.ts +4 -4
- package/src/util/analytics.ts +46 -24
- package/src/util/async-iterator.ts +4 -5
- package/src/util/cancelable.ts +3 -3
- package/src/util/date-time.ts +8 -8
- package/src/util/deferred.ts +6 -6
- package/src/util/disposable.ts +3 -6
- package/src/util/event.ts +9 -11
- package/src/util/garbage-collected-cache.ts +9 -6
- package/src/util/generate-workspace-id.spec.ts +26 -6
- package/src/util/generate-workspace-id.ts +458 -440
- package/src/util/gitpod-cookie.ts +8 -9
- package/src/util/gitpod-host-url.spec.ts +40 -13
- package/src/util/gitpod-host-url.ts +41 -38
- package/src/util/grpc.ts +1 -1
- package/src/util/jaeger-client-types.ts +102 -0
- package/src/util/logging.ts +81 -71
- package/src/util/make-link.ts +6 -7
- package/src/util/parse-workspace-id.spec.ts +17 -8
- package/src/util/parse-workspace-id.ts +6 -7
- package/src/util/queue.spec.ts +27 -25
- package/src/util/repeat.ts +45 -0
- package/src/util/semaphore.ts +4 -6
- package/src/util/skip-if.ts +9 -6
- package/src/util/timeutil.spec.ts +14 -15
- package/src/util/timeutil.ts +15 -11
- package/src/util/tracing.spec.ts +88 -0
- package/src/util/tracing.ts +202 -31
- package/src/util/workspace-port-authentication.ts +10 -13
- package/src/workspace-cluster.ts +26 -15
- package/src/workspace-instance.ts +48 -24
- package/src/wsready.ts +3 -3
- package/data/builtin-theia-plugins.json +0 -372
- package/lib/messaging/connection-error-handler.d.ts +0 -27
- package/lib/messaging/connection-error-handler.d.ts.map +0 -1
- package/lib/messaging/connection-error-handler.js +0 -34
- package/lib/messaging/connection-error-handler.js.map +0 -1
- package/lib/theia-plugins.d.ts +0 -11
- package/lib/theia-plugins.d.ts.map +0 -1
- package/lib/theia-plugins.js.map +0 -1
- package/lib/util/repeater.d.ts +0 -22
- package/lib/util/repeater.d.ts.map +0 -1
- package/lib/util/repeater.js +0 -65
- package/lib/util/repeater.js.map +0 -1
- package/lib/util/safe-promise.d.ts +0 -11
- package/lib/util/safe-promise.d.ts.map +0 -1
- package/lib/util/safe-promise.js +0 -31
- package/lib/util/safe-promise.js.map +0 -1
- package/src/messaging/connection-error-handler.ts +0 -62
- package/src/util/jaeger-client.d.ts +0 -105
- package/src/util/repeater.ts +0 -49
- package/src/util/safe-promise.ts +0 -26
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
import { User } from
|
|
9
|
-
import { oneMonthLater } from
|
|
7
|
+
import { v4 as uuidv4 } from "uuid";
|
|
8
|
+
import { User } from "./protocol";
|
|
9
|
+
import { oneMonthLater } from "./util/timeutil";
|
|
10
10
|
|
|
11
11
|
/*
|
|
12
12
|
* Subscription and acocunting data
|
|
@@ -33,7 +33,7 @@ export interface AccountEntry {
|
|
|
33
33
|
/**
|
|
34
34
|
* credit: end of validity
|
|
35
35
|
*/
|
|
36
|
-
expiryDate?: string;
|
|
36
|
+
expiryDate?: string; // exclusive
|
|
37
37
|
|
|
38
38
|
kind: AccountEntryKind;
|
|
39
39
|
|
|
@@ -46,26 +46,26 @@ export interface AccountEntry {
|
|
|
46
46
|
description?: object;
|
|
47
47
|
}
|
|
48
48
|
export namespace AccountEntry {
|
|
49
|
-
export function create<T extends AccountEntry>(entry: Omit<T,
|
|
49
|
+
export function create<T extends AccountEntry>(entry: Omit<T, "uid">): T {
|
|
50
50
|
const result = entry as T;
|
|
51
51
|
result.uid = uuidv4();
|
|
52
52
|
return result;
|
|
53
|
-
}
|
|
53
|
+
}
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
export type DebitAccountEntryKind =
|
|
57
|
-
export type AccountEntryKind =
|
|
56
|
+
export type DebitAccountEntryKind = "session" | "expiry" | "loss";
|
|
57
|
+
export type AccountEntryKind = "credit" | DebitAccountEntryKind | "carry" | "open";
|
|
58
58
|
|
|
59
59
|
export interface Credit extends AccountEntry {
|
|
60
|
-
kind:
|
|
60
|
+
kind: "credit";
|
|
61
61
|
expiryDate: string;
|
|
62
62
|
}
|
|
63
63
|
export type Debit = LossDebit | ExpiryDebit | SessionDebit;
|
|
64
64
|
export interface LossDebit extends AccountEntry {
|
|
65
|
-
kind:
|
|
65
|
+
kind: "loss";
|
|
66
66
|
}
|
|
67
67
|
export interface ExpiryDebit extends AccountEntry {
|
|
68
|
-
kind:
|
|
68
|
+
kind: "expiry";
|
|
69
69
|
creditId: undefined;
|
|
70
70
|
}
|
|
71
71
|
export interface SessionDebit extends AccountEntry {
|
|
@@ -80,9 +80,7 @@ export interface CreditDescription {
|
|
|
80
80
|
}
|
|
81
81
|
export namespace CreditDescription {
|
|
82
82
|
export function is(obj: any): obj is CreditDescription {
|
|
83
|
-
return !!obj
|
|
84
|
-
&& obj.hasOwnProperty('subscriptionId')
|
|
85
|
-
&& obj.hasOwnProperty('planId');
|
|
83
|
+
return !!obj && obj.hasOwnProperty("subscriptionId") && obj.hasOwnProperty("planId");
|
|
86
84
|
}
|
|
87
85
|
}
|
|
88
86
|
export interface SessionDescription {
|
|
@@ -90,16 +88,16 @@ export interface SessionDescription {
|
|
|
90
88
|
contextUrl: string;
|
|
91
89
|
workspaceId: string;
|
|
92
90
|
workspaceInstanceId: string;
|
|
93
|
-
private: boolean;
|
|
94
91
|
}
|
|
95
92
|
export namespace SessionDescription {
|
|
96
93
|
export function is(obj: any): obj is SessionDescription {
|
|
97
|
-
return
|
|
98
|
-
&&
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
94
|
+
return (
|
|
95
|
+
!!obj &&
|
|
96
|
+
obj.hasOwnProperty("contextTitle") &&
|
|
97
|
+
obj.hasOwnProperty("contextUrl") &&
|
|
98
|
+
obj.hasOwnProperty("workspaceId") &&
|
|
99
|
+
obj.hasOwnProperty("workspaceInstanceId")
|
|
100
|
+
);
|
|
103
101
|
}
|
|
104
102
|
}
|
|
105
103
|
|
|
@@ -113,11 +111,11 @@ export namespace SessionDescription {
|
|
|
113
111
|
export interface Subscription {
|
|
114
112
|
uid: string;
|
|
115
113
|
userId: string;
|
|
116
|
-
startDate: string;
|
|
114
|
+
startDate: string; // inclusive
|
|
117
115
|
/** When the subscription will end (must be >= cancellationDate!) */
|
|
118
|
-
endDate?: string;
|
|
116
|
+
endDate?: string; // exclusive
|
|
119
117
|
/** When the subscription was cancelled */
|
|
120
|
-
cancellationDate?: string;
|
|
118
|
+
cancellationDate?: string; // exclusive
|
|
121
119
|
/** Number of granted hours */
|
|
122
120
|
amount: number;
|
|
123
121
|
/** Number of granted hours for the first month: If this is set, use this value for the first month */
|
|
@@ -147,8 +145,7 @@ export interface UserPaidSubscription extends Subscription {
|
|
|
147
145
|
}
|
|
148
146
|
export namespace UserPaidSubscription {
|
|
149
147
|
export function is(data: any): data is UserPaidSubscription {
|
|
150
|
-
return !!data
|
|
151
|
-
&& data.hasOwnProperty('paymentReference');
|
|
148
|
+
return !!data && data.hasOwnProperty("paymentReference");
|
|
152
149
|
}
|
|
153
150
|
}
|
|
154
151
|
|
|
@@ -157,41 +154,44 @@ export interface AssignedTeamSubscription extends Subscription {
|
|
|
157
154
|
}
|
|
158
155
|
export namespace AssignedTeamSubscription {
|
|
159
156
|
export function is(data: any): data is AssignedTeamSubscription {
|
|
160
|
-
return !!data
|
|
161
|
-
&& data.hasOwnProperty('teamSubscriptionSlotId');
|
|
157
|
+
return !!data && data.hasOwnProperty("teamSubscriptionSlotId");
|
|
162
158
|
}
|
|
163
159
|
}
|
|
164
160
|
|
|
165
161
|
export namespace Subscription {
|
|
166
|
-
export function create(newSubscription: Omit<Subscription,
|
|
162
|
+
export function create(newSubscription: Omit<Subscription, "uid">) {
|
|
167
163
|
const subscription = newSubscription as Subscription;
|
|
168
164
|
subscription.uid = uuidv4();
|
|
169
165
|
return subscription;
|
|
170
|
-
}
|
|
166
|
+
}
|
|
171
167
|
export function cancelSubscription(s: Subscription, cancellationDate: string, endDate?: string) {
|
|
172
168
|
s.endDate = endDate || cancellationDate;
|
|
173
169
|
s.cancellationDate = cancellationDate;
|
|
174
|
-
}
|
|
170
|
+
}
|
|
175
171
|
export function isSame(s1: Subscription | undefined, s2: Subscription | undefined): boolean {
|
|
176
|
-
return
|
|
177
|
-
|
|
178
|
-
&&
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
172
|
+
return (
|
|
173
|
+
!!s1 &&
|
|
174
|
+
!!s2 &&
|
|
175
|
+
s1.userId === s2.userId &&
|
|
176
|
+
s1.planId === s2.planId &&
|
|
177
|
+
s1.startDate === s2.startDate &&
|
|
178
|
+
s1.endDate === s2.endDate &&
|
|
179
|
+
s1.amount === s2.amount &&
|
|
180
|
+
s1.cancellationDate === s2.cancellationDate &&
|
|
181
|
+
s1.deleted === s2.deleted &&
|
|
182
|
+
((s1.paymentData === undefined && s2.paymentData === undefined) ||
|
|
183
|
+
(!!s1.paymentData &&
|
|
184
|
+
!!s2.paymentData &&
|
|
185
|
+
s1.paymentData.downgradeDate === s2.paymentData.downgradeDate &&
|
|
186
|
+
s1.paymentData.newPlan === s2.paymentData.newPlan))
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
189
|
export function isActive(s: Subscription, date: string): boolean {
|
|
190
190
|
return s.startDate <= date && (s.endDate === undefined || date < s.endDate);
|
|
191
|
-
}
|
|
191
|
+
}
|
|
192
192
|
export function isDowngraded(s: Subscription) {
|
|
193
193
|
return s.paymentData && s.paymentData.downgradeDate;
|
|
194
|
-
}
|
|
194
|
+
}
|
|
195
195
|
export function calculateCurrentPeriod(startDate: string, now: Date) {
|
|
196
196
|
let nextStartDate = startDate;
|
|
197
197
|
do {
|
|
@@ -199,19 +199,19 @@ export namespace Subscription {
|
|
|
199
199
|
nextStartDate = oneMonthLater(startDate, new Date(startDate).getDate());
|
|
200
200
|
} while (nextStartDate < now.toISOString());
|
|
201
201
|
return { startDate, endDate: nextStartDate };
|
|
202
|
-
}
|
|
202
|
+
}
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
export type MaybeSubscription = Subscription | undefined;
|
|
206
206
|
|
|
207
207
|
export interface Period {
|
|
208
|
-
startDate: string;
|
|
209
|
-
endDate: string;
|
|
208
|
+
startDate: string; // inclusive
|
|
209
|
+
endDate: string; // exclusive
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
export type MaybePeriod = Period | undefined;
|
|
213
213
|
|
|
214
|
-
export type AccountEntryFixedPeriod = Omit<AccountEntry,
|
|
214
|
+
export type AccountEntryFixedPeriod = Omit<AccountEntry, "uid"> & { expiryDate: string };
|
|
215
215
|
export interface AccountStatement extends Period {
|
|
216
216
|
userId: string;
|
|
217
217
|
/**
|
|
@@ -223,9 +223,9 @@ export interface AccountStatement extends Period {
|
|
|
223
223
|
/** Remaining valid hours (accumulated from credits) */
|
|
224
224
|
remainingHours: RemainingHours;
|
|
225
225
|
}
|
|
226
|
-
export type RemainingHours = number |
|
|
226
|
+
export type RemainingHours = number | "unlimited";
|
|
227
227
|
|
|
228
228
|
export interface CreditAlert {
|
|
229
|
-
userId: string
|
|
230
|
-
remainingUsageHours: number
|
|
229
|
+
userId: string;
|
|
230
|
+
remainingUsageHours: number;
|
|
231
231
|
}
|
package/src/admin-protocol.ts
CHANGED
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { User, Workspace, NamedWorkspaceFeatureFlag } from "./protocol";
|
|
8
|
+
import { FindPrebuildsParams } from "./gitpod-service";
|
|
9
|
+
import { Project, Team, PrebuildWithStatus, TeamMemberInfo, TeamMemberRole } from "./teams-projects-protocol";
|
|
8
10
|
import { WorkspaceInstance, WorkspaceInstancePhase } from "./workspace-instance";
|
|
9
11
|
import { RoleOrPermission } from "./permission";
|
|
10
12
|
import { AccountStatement } from "./accounting-protocol";
|
|
13
|
+
import { InstallationAdminSettings } from "./installation-admin-protocol";
|
|
11
14
|
|
|
12
15
|
export interface AdminServer {
|
|
13
16
|
adminGetUsers(req: AdminGetListRequest<User>): Promise<AdminGetListResult<User>>;
|
|
@@ -17,11 +20,20 @@ export interface AdminServer {
|
|
|
17
20
|
adminModifyRoleOrPermission(req: AdminModifyRoleOrPermissionRequest): Promise<User>;
|
|
18
21
|
adminModifyPermanentWorkspaceFeatureFlag(req: AdminModifyPermanentWorkspaceFeatureFlagRequest): Promise<User>;
|
|
19
22
|
|
|
23
|
+
adminGetTeamMembers(teamId: string): Promise<TeamMemberInfo[]>;
|
|
24
|
+
adminGetTeams(req: AdminGetListRequest<Team>): Promise<AdminGetListResult<Team>>;
|
|
25
|
+
adminGetTeamById(id: string): Promise<Team | undefined>;
|
|
26
|
+
adminSetTeamMemberRole(teamId: string, userId: string, role: TeamMemberRole): Promise<void>;
|
|
27
|
+
|
|
20
28
|
adminGetWorkspaces(req: AdminGetWorkspacesRequest): Promise<AdminGetListResult<WorkspaceAndInstance>>;
|
|
21
29
|
adminGetWorkspace(id: string): Promise<WorkspaceAndInstance>;
|
|
22
30
|
adminForceStopWorkspace(id: string): Promise<void>;
|
|
23
31
|
adminRestoreSoftDeletedWorkspace(id: string): Promise<void>;
|
|
24
32
|
|
|
33
|
+
adminGetProjectsBySearchTerm(req: AdminGetListRequest<Project>): Promise<AdminGetListResult<Project>>;
|
|
34
|
+
adminGetProjectById(id: string): Promise<Project | undefined>;
|
|
35
|
+
|
|
36
|
+
adminFindPrebuilds(params: FindPrebuildsParams): Promise<PrebuildWithStatus[]>;
|
|
25
37
|
adminSetLicense(key: string): Promise<void>;
|
|
26
38
|
|
|
27
39
|
adminGetAccountStatement(userId: string): Promise<AccountStatement>;
|
|
@@ -29,43 +41,48 @@ export interface AdminServer {
|
|
|
29
41
|
adminIsStudent(userId: string): Promise<boolean>;
|
|
30
42
|
adminAddStudentEmailDomain(userId: string, domain: string): Promise<void>;
|
|
31
43
|
adminGrantExtraHours(userId: string, extraHours: number): Promise<void>;
|
|
44
|
+
|
|
45
|
+
adminGetSettings(): Promise<InstallationAdminSettings>;
|
|
46
|
+
adminUpdateSettings(settings: InstallationAdminSettings): Promise<void>;
|
|
32
47
|
}
|
|
33
48
|
|
|
34
49
|
export interface AdminGetListRequest<T> {
|
|
35
|
-
offset: number
|
|
36
|
-
limit: number
|
|
37
|
-
orderBy: keyof T
|
|
38
|
-
orderDir: "asc" | "desc"
|
|
50
|
+
offset: number;
|
|
51
|
+
limit: number;
|
|
52
|
+
orderBy: keyof T;
|
|
53
|
+
orderDir: "asc" | "desc";
|
|
39
54
|
searchTerm?: string;
|
|
40
55
|
}
|
|
41
56
|
|
|
42
57
|
export interface AdminGetListResult<T> {
|
|
43
|
-
total: number
|
|
44
|
-
rows: T[]
|
|
58
|
+
total: number;
|
|
59
|
+
rows: T[];
|
|
45
60
|
}
|
|
46
61
|
|
|
47
62
|
export interface AdminBlockUserRequest {
|
|
48
|
-
id: string
|
|
49
|
-
blocked: boolean
|
|
63
|
+
id: string;
|
|
64
|
+
blocked: boolean;
|
|
50
65
|
}
|
|
51
66
|
|
|
52
67
|
export interface AdminModifyRoleOrPermissionRequest {
|
|
53
68
|
id: string;
|
|
54
69
|
rpp: {
|
|
55
|
-
r: RoleOrPermission
|
|
56
|
-
add: boolean
|
|
57
|
-
}[]
|
|
70
|
+
r: RoleOrPermission;
|
|
71
|
+
add: boolean;
|
|
72
|
+
}[];
|
|
58
73
|
}
|
|
59
74
|
|
|
60
75
|
export interface AdminModifyPermanentWorkspaceFeatureFlagRequest {
|
|
61
76
|
id: string;
|
|
62
77
|
changes: {
|
|
63
|
-
featureFlag: NamedWorkspaceFeatureFlag
|
|
64
|
-
add: boolean
|
|
65
|
-
}[]
|
|
78
|
+
featureFlag: NamedWorkspaceFeatureFlag;
|
|
79
|
+
add: boolean;
|
|
80
|
+
}[];
|
|
66
81
|
}
|
|
67
82
|
|
|
68
|
-
export interface WorkspaceAndInstance
|
|
83
|
+
export interface WorkspaceAndInstance
|
|
84
|
+
extends Omit<Workspace, "id" | "creationTime">,
|
|
85
|
+
Omit<WorkspaceInstance, "id" | "creationTime"> {
|
|
69
86
|
workspaceId: string;
|
|
70
87
|
workspaceCreationTime: string;
|
|
71
88
|
instanceId: string;
|
|
@@ -78,7 +95,7 @@ export namespace WorkspaceAndInstance {
|
|
|
78
95
|
return {
|
|
79
96
|
id: wai.workspaceId,
|
|
80
97
|
creationTime: wai.workspaceCreationTime,
|
|
81
|
-
...
|
|
98
|
+
...wai,
|
|
82
99
|
};
|
|
83
100
|
}
|
|
84
101
|
|
|
@@ -89,7 +106,7 @@ export namespace WorkspaceAndInstance {
|
|
|
89
106
|
return {
|
|
90
107
|
id: wai.instanceId,
|
|
91
108
|
creationTime: wai.instanceCreationTime,
|
|
92
|
-
...
|
|
109
|
+
...wai,
|
|
93
110
|
};
|
|
94
111
|
}
|
|
95
112
|
}
|
|
@@ -102,4 +119,4 @@ export type AdminGetWorkspacesQuery = {
|
|
|
102
119
|
instanceId?: string;
|
|
103
120
|
workspaceId?: string;
|
|
104
121
|
ownerId?: string;
|
|
105
|
-
};
|
|
122
|
+
};
|
package/src/analytics.ts
CHANGED
|
@@ -4,49 +4,49 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
export const IAnalyticsWriter = Symbol("IAnalyticsWriter");
|
|
9
8
|
|
|
10
9
|
type Identity =
|
|
11
|
-
| { userId: string | number }
|
|
10
|
+
| { userId: string | number; anonymousId?: string | number }
|
|
12
11
|
| { userId?: string | number; anonymousId: string | number };
|
|
13
12
|
|
|
14
13
|
interface Message {
|
|
15
14
|
messageId?: string;
|
|
16
15
|
}
|
|
17
16
|
|
|
18
|
-
export type IdentifyMessage = Message &
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
17
|
+
export type IdentifyMessage = Message &
|
|
18
|
+
Identity & {
|
|
19
|
+
traits?: any;
|
|
20
|
+
timestamp?: Date;
|
|
21
|
+
context?: any;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type TrackMessage = Message &
|
|
25
|
+
Identity & {
|
|
26
|
+
event: string;
|
|
27
|
+
properties?: any;
|
|
28
|
+
timestamp?: Date;
|
|
29
|
+
context?: any;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type PageMessage = Message &
|
|
33
|
+
Identity & {
|
|
34
|
+
properties?: any;
|
|
35
|
+
timestamp?: Date;
|
|
36
|
+
context?: any;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type RemoteTrackMessage = Omit<TrackMessage, "timestamp" | "userId">;
|
|
40
40
|
export type RemotePageMessage = Omit<PageMessage, "timestamp" | "userId"> & {
|
|
41
|
-
|
|
41
|
+
includePII?: boolean;
|
|
42
42
|
};
|
|
43
43
|
|
|
44
|
-
export
|
|
44
|
+
export type RemoteIdentifyMessage = Omit<IdentifyMessage, "timestamp" | "userId">;
|
|
45
45
|
|
|
46
|
+
export interface IAnalyticsWriter {
|
|
46
47
|
identify(msg: IdentifyMessage): void;
|
|
47
48
|
|
|
48
49
|
track(msg: TrackMessage): void;
|
|
49
50
|
|
|
50
51
|
page(msg: PageMessage): void;
|
|
51
|
-
|
|
52
52
|
}
|
package/src/auth.ts
CHANGED
|
@@ -11,14 +11,14 @@ export interface SelectAccountPayload {
|
|
|
11
11
|
authHost: string;
|
|
12
12
|
authName: string;
|
|
13
13
|
authProviderType: string;
|
|
14
|
-
}
|
|
14
|
+
};
|
|
15
15
|
otherUser: {
|
|
16
16
|
name: string;
|
|
17
17
|
avatarUrl: string;
|
|
18
18
|
authHost: string;
|
|
19
19
|
authName: string;
|
|
20
20
|
authProviderType: string;
|
|
21
|
-
}
|
|
21
|
+
};
|
|
22
22
|
}
|
|
23
23
|
export namespace SelectAccountPayload {
|
|
24
24
|
export function is(data: any): data is SelectAccountPayload {
|
package/src/context-url.spec.ts
CHANGED
|
@@ -4,36 +4,64 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import * as chai from
|
|
8
|
-
import { suite, test } from
|
|
9
|
-
import {
|
|
7
|
+
import * as chai from "chai";
|
|
8
|
+
import { suite, test } from "mocha-typescript";
|
|
9
|
+
import { Workspace } from ".";
|
|
10
|
+
import { ContextURL } from "./context-url";
|
|
10
11
|
const expect = chai.expect;
|
|
11
12
|
|
|
13
|
+
type WsContextUrl = Pick<Workspace, "context" | "contextURL">;
|
|
14
|
+
|
|
12
15
|
@suite
|
|
13
16
|
export class ContextUrlTest {
|
|
14
|
-
|
|
15
17
|
@test public parseContextUrl_withEnvVar() {
|
|
16
|
-
const actual = ContextURL.
|
|
18
|
+
const actual = ContextURL.getNormalizedURL({
|
|
19
|
+
contextURL: "passedin=test%20value/https://github.com/gitpod-io/gitpod-test-repo",
|
|
20
|
+
context: {},
|
|
21
|
+
} as WsContextUrl);
|
|
17
22
|
expect(actual?.host).to.equal("github.com");
|
|
18
23
|
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
@test public parseContextUrl_withEnvVar_withoutSchema() {
|
|
22
|
-
const actual = ContextURL.
|
|
27
|
+
const actual = ContextURL.getNormalizedURL({
|
|
28
|
+
contextURL: "passedin=test%20value/github.com/gitpod-io/gitpod-test-repo",
|
|
29
|
+
context: {},
|
|
30
|
+
} as WsContextUrl);
|
|
23
31
|
expect(actual?.host).to.equal("github.com");
|
|
24
32
|
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
25
33
|
}
|
|
26
34
|
|
|
35
|
+
@test public parseContextUrl_withEnvVar_sshUrl() {
|
|
36
|
+
const actual = ContextURL.getNormalizedURL({
|
|
37
|
+
contextURL: "passedin=test%20value/git@github.com:gitpod-io/gitpod-test-repo.git",
|
|
38
|
+
context: {},
|
|
39
|
+
} as WsContextUrl);
|
|
40
|
+
expect(actual?.host).to.equal("github.com");
|
|
41
|
+
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo.git");
|
|
42
|
+
}
|
|
43
|
+
|
|
27
44
|
@test public parseContextUrl_withPrebuild() {
|
|
28
|
-
const actual = ContextURL.
|
|
45
|
+
const actual = ContextURL.getNormalizedURL({
|
|
46
|
+
contextURL: "prebuild/https://github.com/gitpod-io/gitpod-test-repo",
|
|
47
|
+
context: {},
|
|
48
|
+
} as WsContextUrl);
|
|
29
49
|
expect(actual?.host).to.equal("github.com");
|
|
30
50
|
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
31
51
|
}
|
|
32
52
|
|
|
33
53
|
@test public parseContextUrl_withPrebuild_withoutSchema() {
|
|
34
|
-
const actual = ContextURL.
|
|
54
|
+
const actual = ContextURL.getNormalizedURL({
|
|
55
|
+
contextURL: "prebuild/github.com/gitpod-io/gitpod-test-repo",
|
|
56
|
+
context: {},
|
|
57
|
+
} as WsContextUrl);
|
|
35
58
|
expect(actual?.host).to.equal("github.com");
|
|
36
59
|
expect(actual?.pathname).to.equal("/gitpod-io/gitpod-test-repo");
|
|
37
60
|
}
|
|
61
|
+
|
|
62
|
+
@test public parseContextUrl_badUrl() {
|
|
63
|
+
const actual = ContextURL.getNormalizedURL({ contextURL: "[Object object]", context: {} } as WsContextUrl);
|
|
64
|
+
expect(actual).to.be.undefined;
|
|
65
|
+
}
|
|
38
66
|
}
|
|
39
|
-
module.exports = new ContextUrlTest()
|
|
67
|
+
module.exports = new ContextUrlTest();
|
package/src/context-url.ts
CHANGED
|
@@ -4,48 +4,106 @@
|
|
|
4
4
|
* See License-AGPL.txt in the project root for license information.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import { Workspace } from ".";
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The whole point of these methods is to overcome inconsistencies in our data model.
|
|
11
|
+
* Ideally we remove it at some point once we fixed our model, as it:
|
|
12
|
+
* - duplicates logic
|
|
13
|
+
* - but additional burden on clients (using this, copying this to other languages!)
|
|
14
|
+
*
|
|
15
|
+
* TODO(gpl) See if we can get this into `server` code to remove the burden from clients
|
|
16
|
+
*/
|
|
7
17
|
export namespace ContextURL {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
export const INCREMENTAL_PREBUILD_PREFIX = "incremental-prebuild";
|
|
19
|
+
export const PREBUILD_PREFIX = "prebuild";
|
|
20
|
+
export const IMAGEBUILD_PREFIX = "imagebuild";
|
|
21
|
+
export const SNAPSHOT_PREFIX = "snapshot";
|
|
22
|
+
export const REFERRER_PREFIX = "referrer:";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* This function will (try to) return the HTTP(S) URL of the context the user originally created this workspace on.
|
|
26
|
+
* Especially it will not contain any modifiers or be of different scheme than HTTP(S).
|
|
27
|
+
*
|
|
28
|
+
* Use this function if you need to provided a _working_ URL to the original context.
|
|
29
|
+
* @param ws
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
export function getNormalizedURL(ws: Pick<Workspace, "context" | "contextURL"> | undefined): URL | undefined {
|
|
33
|
+
const normalized = normalize(ws);
|
|
34
|
+
if (!normalized) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
return new URL(normalized);
|
|
40
|
+
} catch (err) {
|
|
41
|
+
console.error(`unable to parse URL from normalized contextURL: '${normalized}'`, err);
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
21
44
|
}
|
|
22
45
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
46
|
+
function normalize(ws: Pick<Workspace, "context" | "contextURL"> | undefined): string | undefined {
|
|
47
|
+
if (!ws) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (ws.context.normalizedContextURL) {
|
|
51
|
+
return ws.context.normalizedContextURL;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// fallback: we do not yet set normalizedContextURL on all workspaces, yet, let alone older existing workspaces
|
|
55
|
+
let fallback: string | undefined = undefined;
|
|
56
|
+
try {
|
|
57
|
+
fallback = removePrefixes(ws.contextURL);
|
|
58
|
+
} catch (err) {
|
|
59
|
+
console.error(`unable to remove prefixes from contextURL: '${ws.contextURL}'`, err);
|
|
60
|
+
}
|
|
61
|
+
return fallback;
|
|
26
62
|
}
|
|
27
63
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
64
|
+
/**
|
|
65
|
+
* The field "contextUrl" might contain prefixes like:
|
|
66
|
+
* - envvar1=value1/...
|
|
67
|
+
* - prebuild/...
|
|
68
|
+
* This is the analogon to the (Prefix)ContextParser structure in "server".
|
|
69
|
+
*/
|
|
70
|
+
function removePrefixes(contextUrl: string | undefined): string | undefined {
|
|
71
|
+
if (contextUrl === undefined) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
35
74
|
|
|
75
|
+
const segments = contextUrl.split("/");
|
|
76
|
+
if (segments.length === 1) {
|
|
77
|
+
return segments[0]; // this might be something, we just try
|
|
78
|
+
}
|
|
36
79
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
80
|
+
const segmentsToURL = (offset: number): string => {
|
|
81
|
+
let rest = segments.slice(offset).join("/");
|
|
82
|
+
if (/^git@[^:\/]+:/.test(rest)) {
|
|
83
|
+
rest = rest.replace(/^git@([^:\/]+):/, "https://$1/");
|
|
84
|
+
}
|
|
85
|
+
if (!rest.startsWith("http")) {
|
|
86
|
+
rest = "https://" + rest;
|
|
87
|
+
}
|
|
88
|
+
return rest;
|
|
89
|
+
};
|
|
43
90
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
91
|
+
const firstSegment = segments[0];
|
|
92
|
+
if (
|
|
93
|
+
firstSegment === PREBUILD_PREFIX ||
|
|
94
|
+
firstSegment === INCREMENTAL_PREBUILD_PREFIX ||
|
|
95
|
+
firstSegment === IMAGEBUILD_PREFIX ||
|
|
96
|
+
firstSegment === SNAPSHOT_PREFIX ||
|
|
97
|
+
firstSegment.startsWith(REFERRER_PREFIX)
|
|
98
|
+
) {
|
|
99
|
+
return segmentsToURL(1);
|
|
100
|
+
}
|
|
48
101
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
102
|
+
// check for env vars
|
|
103
|
+
if (firstSegment.indexOf("=") !== -1) {
|
|
104
|
+
return segmentsToURL(1);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return segmentsToURL(0);
|
|
108
|
+
}
|
|
109
|
+
}
|