Skip to content

Commit 2f14d7a

Browse files
authored
decouple gitpod-protocol from public-api (#19151)
to prevent rebuilding of components which dependent on gitpod-protocol, but not public-api on an API change
1 parent b73c20a commit 2f14d7a

40 files changed

+167
-109
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ dist/
22
components/*/lib/
33
components/ee/*/lib/
44
components/*/typescript/lib/
5+
components/*/typescript-*/lib/
56
components/local-app-api/*/lib/
67
components/supervisor/frontend/lib/
78
src-gen/

components/dashboard/BUILD.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ packages:
2020
deps:
2121
- components/gitpod-protocol:lib
2222
- components/public-api/typescript:lib
23+
- components/public-api/typescript-common:lib
2324
config:
2425
commands:
2526
build:

components/dashboard/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
"@connectrpc/connect-web": "1.1.2",
1010
"@gitpod/gitpod-protocol": "0.1.5",
1111
"@gitpod/public-api": "0.1.5",
12+
"@gitpod/public-api-common": "0.1.5",
1213
"@radix-ui/react-dropdown-menu": "^2.0.6",
1314
"@radix-ui/react-label": "^2.0.2",
1415
"@radix-ui/react-popover": "^1.0.7",

components/dashboard/src/service/json-rpc-workspace-client.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { getGitpodService } from "./service";
2424
import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/v1/pagination_pb";
2525
import { generateAsyncGenerator } from "@gitpod/gitpod-protocol/lib/generate-async-generator";
2626
import { WorkspaceInstance } from "@gitpod/gitpod-protocol";
27-
import { parsePagination } from "@gitpod/gitpod-protocol/lib/public-api-pagination";
27+
import { parsePagination } from "@gitpod/public-api-common/lib/public-api-pagination";
2828
import { validate as uuidValidate } from "uuid";
2929
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
3030

components/dashboard/src/service/metrics.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { MetricsReporter } from "@gitpod/public-api/lib/metrics";
7+
import { MetricsReporter } from "@gitpod/gitpod-protocol/lib/metrics";
88
import { getExperimentsClient } from "../experiments/client";
99
import { v4 } from "uuid";
1010
const commit = require("./config.json").commit;

components/dashboard/src/service/public-api.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { MethodKind, ServiceType } from "@bufbuild/protobuf";
99
import { CallOptions, Code, ConnectError, PromiseClient, createPromiseClient } from "@connectrpc/connect";
1010
import { createConnectTransport } from "@connectrpc/connect-web";
1111
import { Disposable, User } from "@gitpod/gitpod-protocol";
12-
import { PublicAPIConverter } from "@gitpod/gitpod-protocol/lib/public-api-converter";
12+
import { PublicAPIConverter } from "@gitpod/public-api-common/lib/public-api-converter";
1313
import { Project as ProtocolProject } from "@gitpod/gitpod-protocol/lib/teams-projects-protocol";
1414
import { HelloService } from "@gitpod/public-api/lib/gitpod/experimental/v1/dummy_connect";
1515
import { OIDCService } from "@gitpod/public-api/lib/gitpod/experimental/v1/oidc_connect";
@@ -21,7 +21,7 @@ import { OrganizationService } from "@gitpod/public-api/lib/gitpod/v1/organizati
2121
import { WorkspaceService } from "@gitpod/public-api/lib/gitpod/v1/workspace_connect";
2222
import { ConfigurationService } from "@gitpod/public-api/lib/gitpod/v1/configuration_connect";
2323
import { PrebuildService } from "@gitpod/public-api/lib/gitpod/v1/prebuild_connect";
24-
import { getMetricsInterceptor } from "@gitpod/public-api/lib/metrics";
24+
import { getMetricsInterceptor } from "@gitpod/gitpod-protocol/lib/metrics";
2525
import { getExperimentsClient } from "../experiments/client";
2626
import { JsonRpcOrganizationClient } from "./json-rpc-organization-client";
2727
import { JsonRpcWorkspaceClient } from "./json-rpc-workspace-client";

components/dashboard/src/user-settings/Integrations.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
* See License.AGPL.txt in the project root for license information.
55
*/
66

7-
import { User, getScopesForAuthProviderType } from "@gitpod/gitpod-protocol";
7+
import { User } from "@gitpod/gitpod-protocol";
8+
import { getScopesForAuthProviderType } from "@gitpod/public-api-common/lib/auth-providers";
89
import { SelectAccountPayload } from "@gitpod/gitpod-protocol/lib/auth";
910
import { useQuery } from "@tanstack/react-query";
1011
import React, { useCallback, useContext, useEffect, useMemo, useState } from "react";

components/gitpod-protocol/BUILD.yaml

-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ packages:
1414
- .eslintrc
1515
- mocha.opts
1616
- package.json
17-
deps:
18-
- components/public-api/typescript:lib
1917
config:
2018
packaging: library
2119
yarnLock: ${coreYarnLockBase}/yarn.lock

components/gitpod-protocol/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@
5959
"exit": true
6060
},
6161
"dependencies": {
62+
"@bufbuild/protobuf": "^1.3.3",
6263
"@connectrpc/connect": "1.1.2",
63-
"@gitpod/public-api": "0.1.5",
6464
"@types/react": "17.0.32",
6565
"abort-controller-x": "^0.4.0",
6666
"ajv": "^6.5.4",

components/gitpod-protocol/src/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,3 @@ export * from "./teams-projects-protocol";
1818
export * from "./snapshot-url";
1919
export * from "./webhook-event";
2020
export * from "./redis";
21-
export * from "./auth-providers";

components/gitpod-protocol/src/messaging/error.ts

-25
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,6 @@
55
*/
66

77
import { scrubber } from "../util/scrubbing";
8-
import { PlainMessage } from "@bufbuild/protobuf";
9-
import {
10-
InvalidGitpodYMLError as InvalidGitpodYMLErrorData,
11-
RepositoryNotFoundError as RepositoryNotFoundErrorData,
12-
RepositoryUnauthorizedError as RepositoryUnauthorizedErrorData,
13-
} from "@gitpod/public-api/lib/gitpod/v1/error_pb";
148

159
export class ApplicationError extends Error {
1610
constructor(readonly code: ErrorCode, readonly message: string, readonly data?: any) {
@@ -27,25 +21,6 @@ export class ApplicationError extends Error {
2721
}
2822
}
2923

30-
export class RepositoryNotFoundError extends ApplicationError {
31-
constructor(readonly info: PlainMessage<RepositoryNotFoundErrorData>) {
32-
// on gRPC we remap to PRECONDITION_FAILED, all error code for backwards compatibility with the dashboard
33-
super(ErrorCodes.NOT_FOUND, "Repository not found.", info);
34-
}
35-
}
36-
export class UnauthorizedRepositoryAccessError extends ApplicationError {
37-
constructor(readonly info: PlainMessage<RepositoryUnauthorizedErrorData>) {
38-
// on gRPC we remap to PRECONDITION_FAILED, all error code for backwards compatibility with the dashboard
39-
super(ErrorCodes.NOT_AUTHENTICATED, "Repository unauthorized.", info);
40-
}
41-
}
42-
export class InvalidGitpodYMLError extends ApplicationError {
43-
constructor(readonly info: PlainMessage<InvalidGitpodYMLErrorData>) {
44-
// on gRPC we remap to PRECONDITION_FAILED, all error code for backwards compatibility with the dashboard
45-
super(ErrorCodes.INVALID_GITPOD_YML, "Invalid gitpod.yml: " + info.violations.join(","), info);
46-
}
47-
}
48-
4924
export namespace ApplicationError {
5025
export function hasErrorCode(e: any): e is Error & { code: ErrorCode; data?: any } {
5126
return ErrorCode.is(e["code"]);

components/public-api/typescript/src/metrics.ts renamed to components/gitpod-protocol/src/metrics.ts

+2
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ export class MetricsReporter {
331331
while (this.pendingRequests.length) {
332332
const request = this.pendingRequests.shift();
333333
if (request) {
334+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
334335
this.send(request);
335336
}
336337
}
@@ -393,6 +394,7 @@ export class MetricsReporter {
393394
[key: string]: string | undefined;
394395
},
395396
): void {
397+
// eslint-disable-next-line @typescript-eslint/no-floating-promises
396398
this.asyncReportError(error, data);
397399
}
398400

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
packages:
2+
- name: lib
3+
type: yarn
4+
srcs:
5+
- src/**
6+
- package.json
7+
- tsconfig.json
8+
deps:
9+
- components/gitpod-protocol:lib
10+
- components/public-api/typescript:lib
11+
config:
12+
packaging: library
13+
commands:
14+
# leeway executes the build and test step in the wrong order, so we need to call a special script that builds before testing
15+
test: ["yarn", "test:leeway"]
16+
yarnLock: ${coreYarnLockBase}/../yarn.lock
17+
tsconfig: tsconfig.json
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
{
2+
"name": "@gitpod/public-api-common",
3+
"version": "0.1.5",
4+
"license": "AGPL-3.0",
5+
"files": [
6+
"lib"
7+
],
8+
"exports": {
9+
"./lib/*": {
10+
"types": "./lib/*.d.ts",
11+
"import": "./lib/esm/*.js",
12+
"require": "./lib/*.js"
13+
}
14+
},
15+
"scripts": {
16+
"build": "yarn run build:cjs && yarn run build:esm",
17+
"build:cjs": "tsc",
18+
"build:esm": "tsc --module es2015 --outDir ./lib/esm",
19+
"test": "mocha './**/*.spec.js' --exclude './node_modules/**' --exclude './lib/esm/**' --exit",
20+
"test:leeway": "yarn build && yarn test"
21+
},
22+
"dependencies": {
23+
"@gitpod/gitpod-protocol": "0.1.5",
24+
"@gitpod/public-api": "0.1.5",
25+
"@connectrpc/connect": "1.1.2",
26+
"@bufbuild/protobuf": "^1.3.3"
27+
},
28+
"devDependencies": {
29+
"@types/chai-subset": "^1.3.3",
30+
"@types/mocha": "^10.0.1",
31+
"@types/node": "^16.11.6",
32+
"chai": "^4.3.4",
33+
"mocha": "^10.2.0",
34+
"typescript": "~4.4.2"
35+
}
36+
}

components/gitpod-protocol/src/public-api-converter.spec.ts renamed to components/public-api/typescript-common/src/public-api-converter.spec.ts

+8-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,11 @@ import {
1515
} from "@gitpod/public-api/lib/gitpod/v1/workspace_pb";
1616
import { expect } from "chai";
1717
import { PartialConfiguration, PublicAPIConverter } from "./public-api-converter";
18-
import { OrgMemberInfo, Project, PrebuildSettings as PrebuildSettingsProtocol } from "./teams-projects-protocol";
18+
import {
19+
OrgMemberInfo,
20+
Project,
21+
PrebuildSettings as PrebuildSettingsProtocol,
22+
} from "@gitpod/gitpod-protocol/lib/teams-projects-protocol";
1923
import { OrganizationRole } from "@gitpod/public-api/lib/gitpod/v1/organization_pb";
2024
import {
2125
BranchMatchingStrategy,
@@ -31,7 +35,7 @@ import {
3135
UserEnvVarValue,
3236
UserSSHPublicKey,
3337
WithEnvvarsContext,
34-
} from "./protocol";
38+
} from "@gitpod/gitpod-protocol/lib/protocol";
3539
import {
3640
AuthProvider,
3741
AuthProviderDescription,
@@ -42,13 +46,8 @@ import {
4246
EnvironmentVariableAdmission,
4347
UserEnvironmentVariable,
4448
} from "@gitpod/public-api/lib/gitpod/v1/envvar_pb";
45-
import {
46-
ApplicationError,
47-
ErrorCodes,
48-
InvalidGitpodYMLError,
49-
RepositoryNotFoundError,
50-
UnauthorizedRepositoryAccessError,
51-
} from "./messaging/error";
49+
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
50+
import { InvalidGitpodYMLError, RepositoryNotFoundError, UnauthorizedRepositoryAccessError } from "./public-api-errors";
5251
import { Code, ConnectError } from "@connectrpc/connect";
5352
import {
5453
FailedPreconditionDetails,

components/gitpod-protocol/src/public-api-converter.ts renamed to components/public-api/typescript-common/src/public-api-converter.ts

+7-12
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,15 @@ import {
5858
UserEnvironmentVariable,
5959
} from "@gitpod/public-api/lib/gitpod/v1/envvar_pb";
6060
import { SCMToken, SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
61-
import { ContextURL } from "./context-url";
61+
import { ContextURL } from "@gitpod/gitpod-protocol/lib/context-url";
6262
import {
6363
Prebuild,
6464
PrebuildStatus,
6565
PrebuildPhase,
6666
PrebuildPhase_Phase,
6767
} from "@gitpod/public-api/lib/gitpod/v1/prebuild_pb";
68-
import {
69-
ApplicationError,
70-
ErrorCodes,
71-
InvalidGitpodYMLError,
72-
RepositoryNotFoundError,
73-
UnauthorizedRepositoryAccessError,
74-
} from "./messaging/error";
68+
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
69+
import { InvalidGitpodYMLError, RepositoryNotFoundError, UnauthorizedRepositoryAccessError } from "./public-api-errors";
7570
import {
7671
AuthProviderEntry as AuthProviderProtocol,
7772
AuthProviderInfo,
@@ -89,7 +84,7 @@ import {
8984
Token,
9085
SuggestedRepository as SuggestedRepositoryProtocol,
9186
UserSSHPublicKeyValue,
92-
} from "./protocol";
87+
} from "@gitpod/gitpod-protocol/lib//protocol";
9388
import {
9489
OrgMemberInfo,
9590
OrgMemberRole,
@@ -99,16 +94,16 @@ import {
9994
PrebuildWithStatus,
10095
Project,
10196
Organization as ProtocolOrganization,
102-
} from "./teams-projects-protocol";
97+
} from "@gitpod/gitpod-protocol/lib//teams-projects-protocol";
10398
import {
10499
ConfigurationIdeConfig,
105100
PortProtocol,
106101
WorkspaceInstance,
107102
WorkspaceInstanceConditions,
108103
WorkspaceInstancePort,
109-
} from "./workspace-instance";
104+
} from "@gitpod/gitpod-protocol/lib//workspace-instance";
110105
import { Author, Commit } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
111-
import type { DeepPartial } from "./util/deep-partial";
106+
import type { DeepPartial } from "@gitpod/gitpod-protocol/lib/util/deep-partial";
112107

113108
export type PartialConfiguration = DeepPartial<Configuration> & Pick<Configuration, "id">;
114109

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3+
* Licensed under the GNU Affero General Public License (AGPL).
4+
* See License.AGPL.txt in the project root for license information.
5+
*/
6+
7+
import { PlainMessage } from "@bufbuild/protobuf";
8+
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
9+
import {
10+
InvalidGitpodYMLError as InvalidGitpodYMLErrorData,
11+
RepositoryNotFoundError as RepositoryNotFoundErrorData,
12+
RepositoryUnauthorizedError as RepositoryUnauthorizedErrorData,
13+
} from "@gitpod/public-api/lib/gitpod/v1/error_pb";
14+
15+
export class RepositoryNotFoundError extends ApplicationError {
16+
constructor(readonly info: PlainMessage<RepositoryNotFoundErrorData>) {
17+
// on gRPC we remap to PRECONDITION_FAILED, all error code for backwards compatibility with the dashboard
18+
super(ErrorCodes.NOT_FOUND, "Repository not found.", info);
19+
}
20+
}
21+
export class UnauthorizedRepositoryAccessError extends ApplicationError {
22+
constructor(readonly info: PlainMessage<RepositoryUnauthorizedErrorData>) {
23+
// on gRPC we remap to PRECONDITION_FAILED, all error code for backwards compatibility with the dashboard
24+
super(ErrorCodes.NOT_AUTHENTICATED, "Repository unauthorized.", info);
25+
}
26+
}
27+
export class InvalidGitpodYMLError extends ApplicationError {
28+
constructor(readonly info: PlainMessage<InvalidGitpodYMLErrorData>) {
29+
// on gRPC we remap to PRECONDITION_FAILED, all error code for backwards compatibility with the dashboard
30+
super(ErrorCodes.INVALID_GITPOD_YML, "Invalid gitpod.yml: " + info.violations.join(","), info);
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"compilerOptions": {
3+
"rootDir": "src",
4+
"experimentalDecorators": true,
5+
"outDir": "lib",
6+
"declarationDir": "lib",
7+
"lib": [
8+
"es6",
9+
"esnext.asynciterable",
10+
"DOM"
11+
],
12+
"strict": true,
13+
"noEmitOnError": false,
14+
"noUnusedLocals": true,
15+
"emitDecoratorMetadata": true,
16+
"strictPropertyInitialization": false,
17+
"downlevelIteration": true,
18+
"module": "CommonJS",
19+
"moduleResolution": "node",
20+
"target": "es6",
21+
"jsx": "react",
22+
"sourceMap": true,
23+
"declaration": true,
24+
"declarationMap": true,
25+
"skipLibCheck": true,
26+
"useUnknownInCatchVariables": false
27+
},
28+
"include": [
29+
"src"
30+
]
31+
}

components/public-api/typescript/package.json

+2-20
Original file line numberDiff line numberDiff line change
@@ -28,34 +28,16 @@
2828
"scripts": {
2929
"build": "yarn run build:cjs && yarn run build:esm",
3030
"build:cjs": "tsc",
31-
"build:esm": "tsc --module es2015 --outDir ./lib/esm",
32-
"watch": "leeway exec --package .:lib --transitive-dependencies --filter-type yarn --components --parallel -- tsc -w --preserveWatchOutput",
33-
"test": "mocha './**/*.spec.ts' --exclude './node_modules/**' --exit",
34-
"test:brk": "yarn test --inspect-brk"
35-
},
36-
"mocha": {
37-
"require": [
38-
"ts-node/register",
39-
"reflect-metadata/Reflect",
40-
"source-map-support/register"
41-
],
42-
"extensions": [
43-
"ts"
44-
],
45-
"exit": true
31+
"build:esm": "tsc --module es2015 --outDir ./lib/esm"
4632
},
4733
"dependencies": {
4834
"@connectrpc/connect-node": "1.1.2",
4935
"@connectrpc/connect": "1.1.2",
50-
"@bufbuild/protobuf": "^1.3.3",
51-
"prom-client": "^14.2.0"
36+
"@bufbuild/protobuf": "^1.3.3"
5237
},
5338
"devDependencies": {
5439
"@connectrpc/protoc-gen-connect-es": "1.1.2",
5540
"@bufbuild/protoc-gen-es": "1.3.3",
56-
"@testdeck/mocha": "0.1.2",
57-
"@types/chai": "^4.1.2",
58-
"@types/node": "^16.11.0",
5941
"typescript": "~4.4.2"
6042
}
6143
}

0 commit comments

Comments
 (0)