@slicemachine/manager 0.17.9-alpha.dev-env-default-active.2 → 0.17.9-alpha.fix-telemetry-enabled-check.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/managers/SliceMachineManager.cjs +3 -0
- package/dist/managers/SliceMachineManager.cjs.map +1 -1
- package/dist/managers/SliceMachineManager.d.ts +2 -0
- package/dist/managers/SliceMachineManager.js +3 -0
- package/dist/managers/SliceMachineManager.js.map +1 -1
- package/dist/managers/createSliceMachineManagerMiddleware.cjs +1 -0
- package/dist/managers/createSliceMachineManagerMiddleware.cjs.map +1 -1
- package/dist/managers/createSliceMachineManagerMiddleware.js +1 -0
- package/dist/managers/createSliceMachineManagerMiddleware.js.map +1 -1
- package/dist/managers/git/GitManager.cjs +306 -0
- package/dist/managers/git/GitManager.cjs.map +1 -0
- package/dist/managers/git/GitManager.d.ts +84 -0
- package/dist/managers/git/GitManager.js +288 -0
- package/dist/managers/git/GitManager.js.map +1 -0
- package/dist/managers/git/buildGitRepoSpecifier.cjs +7 -0
- package/dist/managers/git/buildGitRepoSpecifier.cjs.map +1 -0
- package/dist/managers/git/buildGitRepoSpecifier.d.ts +19 -0
- package/dist/managers/git/buildGitRepoSpecifier.js +7 -0
- package/dist/managers/git/buildGitRepoSpecifier.js.map +1 -0
- package/dist/managers/git/types.d.ts +19 -0
- package/dist/managers/telemetry/TelemetryManager.cjs +5 -5
- package/dist/managers/telemetry/TelemetryManager.cjs.map +1 -1
- package/dist/managers/telemetry/TelemetryManager.js +5 -5
- package/dist/managers/telemetry/TelemetryManager.js.map +1 -1
- package/package.json +2 -2
- package/src/managers/SliceMachineManager.ts +4 -0
- package/src/managers/createSliceMachineManagerMiddleware.ts +1 -0
- package/src/managers/git/GitManager.ts +456 -0
- package/src/managers/git/buildGitRepoSpecifier.ts +24 -0
- package/src/managers/git/types.ts +24 -0
- package/src/managers/telemetry/TelemetryManager.ts +8 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitManager.cjs","sources":["../../../../src/managers/git/GitManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as tt from \"io-ts-types\";\n\nimport fetch from \"../../lib/fetch\";\nimport { decode } from \"../../lib/decode\";\n\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\n\nimport {\n\tUnauthenticatedError,\n\tUnauthorizedError,\n\tUnexpectedDataError,\n} from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport { GitRepo, GitRepoSpecifier, Owner } from \"./types\";\nimport { buildGitRepoSpecifier } from \"./buildGitRepoSpecifier\";\n\ntype GitManagerCreateGitHubAuthStateReturnType = {\n\tkey: string;\n\texpiresAt: Date;\n};\n\ntype GitManagerFetchOwnersReturnType = Owner[];\n\ntype GitManagerFetchReposReturnType = GitRepo[];\n\ntype GitManagerFetchReposArgs = {\n\tprovider: \"gitHub\";\n\towner: string;\n\tquery?: string;\n\tpage?: number;\n};\n\ntype GitManagerFetchLinkedReposArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n};\n\ntype GitManagerFetchLinkedReposReturnType = GitRepoSpecifier[];\n\ntype GitManagerLinkRepoArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\ntype GitManagerUnlinkRepoArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\ntype CheckHasWriteAPITokenArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\ntype UpdateWriteAPITokenArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n\ttoken: string;\n};\n\ntype DeleteWriteAPITokenArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\nexport class GitManager extends BaseManager {\n\tasync createGitHubAuthState(): Promise<GitManagerCreateGitHubAuthStateReturnType> {\n\t\tconst url = new URL(\n\t\t\t\"./git/github/create-auth-state\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\tconst res = await this.#fetch(url, { method: \"POST\" });\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to create GitHub auth state.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\tkey: t.string,\n\t\t\t\texpiresAt: tt.DateFromISOString,\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode GitHub auth state: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tasync fetchOwners(): Promise<GitManagerFetchOwnersReturnType> {\n\t\tconst url = new URL(\"./git/owners\", API_ENDPOINTS.SliceMachineV1);\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to fetch owners.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\towners: t.array(\n\t\t\t\t\tt.type({\n\t\t\t\t\t\tprovider: t.literal(\"gitHub\"),\n\t\t\t\t\t\tid: t.string,\n\t\t\t\t\t\tname: t.string,\n\t\t\t\t\t\ttype: t.union([t.literal(\"user\"), t.literal(\"team\"), t.null]),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode owners: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.owners;\n\t}\n\n\tasync fetchRepos(\n\t\targs: GitManagerFetchReposArgs,\n\t): Promise<GitManagerFetchReposReturnType> {\n\t\tconst url = new URL(\"./git/repos\", API_ENDPOINTS.SliceMachineV1);\n\t\turl.searchParams.set(\"provider\", args.provider);\n\t\turl.searchParams.set(\"owner\", args.owner);\n\t\tif (args.query) {\n\t\t\turl.searchParams.set(\"q\", args.query);\n\t\t}\n\t\tif (args.page && args.page > 0) {\n\t\t\turl.searchParams.set(\"page\", args.page.toString());\n\t\t}\n\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to fetch repos.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\trepos: t.array(\n\t\t\t\t\tt.type({\n\t\t\t\t\t\tprovider: t.literal(\"gitHub\"),\n\t\t\t\t\t\tid: t.string,\n\t\t\t\t\t\towner: t.string,\n\t\t\t\t\t\tname: t.string,\n\t\t\t\t\t\turl: t.string,\n\t\t\t\t\t\tpushedAt: tt.DateFromISOString,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode repos: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.repos;\n\t}\n\n\tasync fetchLinkedRepos(\n\t\targs: GitManagerFetchLinkedReposArgs,\n\t): Promise<GitManagerFetchLinkedReposReturnType> {\n\t\tconst url = new URL(\"./git/linked-repos\", API_ENDPOINTS.SliceMachineV1);\n\t\turl.searchParams.set(\"repository\", args.prismic.domain);\n\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to fetch linked repos.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\trepos: t.array(\n\t\t\t\t\tt.type({\n\t\t\t\t\t\tprovider: t.literal(\"gitHub\"),\n\t\t\t\t\t\towner: t.string,\n\t\t\t\t\t\tname: t.string,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode linked repos: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.repos;\n\t}\n\n\tasync linkRepo(args: GitManagerLinkRepoArgs): Promise<void> {\n\t\tconst url = new URL(\"./git/linked-repos\", API_ENDPOINTS.SliceMachineV1);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"PUT\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to link repos.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync unlinkRepo(args: GitManagerUnlinkRepoArgs): Promise<void> {\n\t\tconst url = new URL(\"./git/linked-repos\", API_ENDPOINTS.SliceMachineV1);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"DELETE\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to unlink repos.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync checkHasWriteAPIToken(\n\t\targs: CheckHasWriteAPITokenArgs,\n\t): Promise<boolean> {\n\t\tconst url = new URL(\n\t\t\t\"./git/linked-repos/write-api-token\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\turl.searchParams.set(\"repository\", args.prismic.domain);\n\t\turl.searchParams.set(\n\t\t\t\"git\",\n\t\t\tbuildGitRepoSpecifier({\n\t\t\t\tprovider: args.git.provider,\n\t\t\t\towner: args.git.owner,\n\t\t\t\tname: args.git.name,\n\t\t\t}),\n\t\t);\n\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to check Prismic Write API token.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\thasWriteAPIToken: t.boolean,\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.hasWriteAPIToken;\n\t}\n\n\tasync updateWriteAPIToken(args: UpdateWriteAPITokenArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./git/linked-repos/write-api-token\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"PUT\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t\ttoken: args.token,\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to update Prismic Write API token.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync deleteWriteAPIToken(args: DeleteWriteAPITokenArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./git/linked-repos/write-api-token\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"DELETE\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to delete Prismic Write API token.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #fetch(\n\t\turl: URL,\n\t\tconfig?: {\n\t\t\tmethod?: \"POST\" | \"PUT\" | \"DELETE\";\n\t\t\tbody?: unknown;\n\t\t},\n\t) {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\n\t\treturn await fetch(url, {\n\t\t\tmethod: config?.method,\n\t\t\tbody: config?.body ? JSON.stringify(config.body) : undefined,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t},\n\t\t});\n\t}\n}\n"],"names":["BaseManager","API_ENDPOINTS","UnauthorizedError","decode","t","tt","UnexpectedDataError","UnauthenticatedError","buildGitRepoSpecifier","fetch"],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { BaseManager } from "../BaseManager";
|
|
2
|
+
import { GitRepo, GitRepoSpecifier, Owner } from "./types";
|
|
3
|
+
type GitManagerCreateGitHubAuthStateReturnType = {
|
|
4
|
+
key: string;
|
|
5
|
+
expiresAt: Date;
|
|
6
|
+
};
|
|
7
|
+
type GitManagerFetchOwnersReturnType = Owner[];
|
|
8
|
+
type GitManagerFetchReposReturnType = GitRepo[];
|
|
9
|
+
type GitManagerFetchReposArgs = {
|
|
10
|
+
provider: "gitHub";
|
|
11
|
+
owner: string;
|
|
12
|
+
query?: string;
|
|
13
|
+
page?: number;
|
|
14
|
+
};
|
|
15
|
+
type GitManagerFetchLinkedReposArgs = {
|
|
16
|
+
prismic: {
|
|
17
|
+
domain: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
type GitManagerFetchLinkedReposReturnType = GitRepoSpecifier[];
|
|
21
|
+
type GitManagerLinkRepoArgs = {
|
|
22
|
+
prismic: {
|
|
23
|
+
domain: string;
|
|
24
|
+
};
|
|
25
|
+
git: {
|
|
26
|
+
provider: "gitHub";
|
|
27
|
+
owner: string;
|
|
28
|
+
name: string;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
type GitManagerUnlinkRepoArgs = {
|
|
32
|
+
prismic: {
|
|
33
|
+
domain: string;
|
|
34
|
+
};
|
|
35
|
+
git: {
|
|
36
|
+
provider: "gitHub";
|
|
37
|
+
owner: string;
|
|
38
|
+
name: string;
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
type CheckHasWriteAPITokenArgs = {
|
|
42
|
+
prismic: {
|
|
43
|
+
domain: string;
|
|
44
|
+
};
|
|
45
|
+
git: {
|
|
46
|
+
provider: "gitHub";
|
|
47
|
+
owner: string;
|
|
48
|
+
name: string;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
type UpdateWriteAPITokenArgs = {
|
|
52
|
+
prismic: {
|
|
53
|
+
domain: string;
|
|
54
|
+
};
|
|
55
|
+
git: {
|
|
56
|
+
provider: "gitHub";
|
|
57
|
+
owner: string;
|
|
58
|
+
name: string;
|
|
59
|
+
};
|
|
60
|
+
token: string;
|
|
61
|
+
};
|
|
62
|
+
type DeleteWriteAPITokenArgs = {
|
|
63
|
+
prismic: {
|
|
64
|
+
domain: string;
|
|
65
|
+
};
|
|
66
|
+
git: {
|
|
67
|
+
provider: "gitHub";
|
|
68
|
+
owner: string;
|
|
69
|
+
name: string;
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
export declare class GitManager extends BaseManager {
|
|
73
|
+
#private;
|
|
74
|
+
createGitHubAuthState(): Promise<GitManagerCreateGitHubAuthStateReturnType>;
|
|
75
|
+
fetchOwners(): Promise<GitManagerFetchOwnersReturnType>;
|
|
76
|
+
fetchRepos(args: GitManagerFetchReposArgs): Promise<GitManagerFetchReposReturnType>;
|
|
77
|
+
fetchLinkedRepos(args: GitManagerFetchLinkedReposArgs): Promise<GitManagerFetchLinkedReposReturnType>;
|
|
78
|
+
linkRepo(args: GitManagerLinkRepoArgs): Promise<void>;
|
|
79
|
+
unlinkRepo(args: GitManagerUnlinkRepoArgs): Promise<void>;
|
|
80
|
+
checkHasWriteAPIToken(args: CheckHasWriteAPITokenArgs): Promise<boolean>;
|
|
81
|
+
updateWriteAPIToken(args: UpdateWriteAPITokenArgs): Promise<void>;
|
|
82
|
+
deleteWriteAPIToken(args: DeleteWriteAPITokenArgs): Promise<void>;
|
|
83
|
+
}
|
|
84
|
+
export {};
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
var __accessCheck = (obj, member, msg) => {
|
|
2
|
+
if (!member.has(obj))
|
|
3
|
+
throw TypeError("Cannot " + msg);
|
|
4
|
+
};
|
|
5
|
+
var __privateAdd = (obj, member, value) => {
|
|
6
|
+
if (member.has(obj))
|
|
7
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
8
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
9
|
+
};
|
|
10
|
+
var __privateMethod = (obj, member, method) => {
|
|
11
|
+
__accessCheck(obj, member, "access private method");
|
|
12
|
+
return method;
|
|
13
|
+
};
|
|
14
|
+
var _fetch, fetch_fn;
|
|
15
|
+
import * as t from "io-ts";
|
|
16
|
+
import * as tt from "io-ts-types";
|
|
17
|
+
import fetch from "../../lib/fetch.js";
|
|
18
|
+
import { decode } from "../../lib/decode.js";
|
|
19
|
+
import { API_ENDPOINTS } from "../../constants/API_ENDPOINTS.js";
|
|
20
|
+
import { UnauthorizedError, UnexpectedDataError, UnauthenticatedError } from "../../errors.js";
|
|
21
|
+
import { BaseManager } from "../BaseManager.js";
|
|
22
|
+
import { buildGitRepoSpecifier } from "./buildGitRepoSpecifier.js";
|
|
23
|
+
class GitManager extends BaseManager {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
__privateAdd(this, _fetch);
|
|
27
|
+
}
|
|
28
|
+
async createGitHubAuthState() {
|
|
29
|
+
const url = new URL("./git/github/create-auth-state", API_ENDPOINTS.SliceMachineV1);
|
|
30
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url, { method: "POST" });
|
|
31
|
+
if (!res.ok) {
|
|
32
|
+
switch (res.status) {
|
|
33
|
+
case 401:
|
|
34
|
+
throw new UnauthorizedError();
|
|
35
|
+
default:
|
|
36
|
+
throw new Error("Failed to create GitHub auth state.");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const json = await res.json();
|
|
40
|
+
const { value, error } = decode(t.type({
|
|
41
|
+
key: t.string,
|
|
42
|
+
expiresAt: tt.DateFromISOString
|
|
43
|
+
}), json);
|
|
44
|
+
if (error) {
|
|
45
|
+
throw new UnexpectedDataError(`Failed to decode GitHub auth state: ${error.errors.join(", ")}`, { cause: error });
|
|
46
|
+
}
|
|
47
|
+
return value;
|
|
48
|
+
}
|
|
49
|
+
async fetchOwners() {
|
|
50
|
+
const url = new URL("./git/owners", API_ENDPOINTS.SliceMachineV1);
|
|
51
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url);
|
|
52
|
+
if (!res.ok) {
|
|
53
|
+
switch (res.status) {
|
|
54
|
+
case 401:
|
|
55
|
+
throw new UnauthenticatedError();
|
|
56
|
+
case 403:
|
|
57
|
+
throw new UnauthorizedError();
|
|
58
|
+
default:
|
|
59
|
+
throw new Error("Failed to fetch owners.");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const json = await res.json();
|
|
63
|
+
const { value, error } = decode(t.type({
|
|
64
|
+
owners: t.array(t.type({
|
|
65
|
+
provider: t.literal("gitHub"),
|
|
66
|
+
id: t.string,
|
|
67
|
+
name: t.string,
|
|
68
|
+
type: t.union([t.literal("user"), t.literal("team"), t.null])
|
|
69
|
+
}))
|
|
70
|
+
}), json);
|
|
71
|
+
if (error) {
|
|
72
|
+
throw new UnexpectedDataError(`Failed to decode owners: ${error.errors.join(", ")}`, { cause: error });
|
|
73
|
+
}
|
|
74
|
+
return value.owners;
|
|
75
|
+
}
|
|
76
|
+
async fetchRepos(args) {
|
|
77
|
+
const url = new URL("./git/repos", API_ENDPOINTS.SliceMachineV1);
|
|
78
|
+
url.searchParams.set("provider", args.provider);
|
|
79
|
+
url.searchParams.set("owner", args.owner);
|
|
80
|
+
if (args.query) {
|
|
81
|
+
url.searchParams.set("q", args.query);
|
|
82
|
+
}
|
|
83
|
+
if (args.page && args.page > 0) {
|
|
84
|
+
url.searchParams.set("page", args.page.toString());
|
|
85
|
+
}
|
|
86
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url);
|
|
87
|
+
if (!res.ok) {
|
|
88
|
+
switch (res.status) {
|
|
89
|
+
case 401:
|
|
90
|
+
throw new UnauthenticatedError();
|
|
91
|
+
case 403:
|
|
92
|
+
throw new UnauthorizedError();
|
|
93
|
+
default:
|
|
94
|
+
throw new Error("Failed to fetch repos.");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
const json = await res.json();
|
|
98
|
+
const { value, error } = decode(t.type({
|
|
99
|
+
repos: t.array(t.type({
|
|
100
|
+
provider: t.literal("gitHub"),
|
|
101
|
+
id: t.string,
|
|
102
|
+
owner: t.string,
|
|
103
|
+
name: t.string,
|
|
104
|
+
url: t.string,
|
|
105
|
+
pushedAt: tt.DateFromISOString
|
|
106
|
+
}))
|
|
107
|
+
}), json);
|
|
108
|
+
if (error) {
|
|
109
|
+
throw new UnexpectedDataError(`Failed to decode repos: ${error.errors.join(", ")}`, { cause: error });
|
|
110
|
+
}
|
|
111
|
+
return value.repos;
|
|
112
|
+
}
|
|
113
|
+
async fetchLinkedRepos(args) {
|
|
114
|
+
const url = new URL("./git/linked-repos", API_ENDPOINTS.SliceMachineV1);
|
|
115
|
+
url.searchParams.set("repository", args.prismic.domain);
|
|
116
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url);
|
|
117
|
+
if (!res.ok) {
|
|
118
|
+
switch (res.status) {
|
|
119
|
+
case 401:
|
|
120
|
+
throw new UnauthenticatedError();
|
|
121
|
+
case 403:
|
|
122
|
+
throw new UnauthorizedError();
|
|
123
|
+
default:
|
|
124
|
+
throw new Error("Failed to fetch linked repos.");
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
const json = await res.json();
|
|
128
|
+
const { value, error } = decode(t.type({
|
|
129
|
+
repos: t.array(t.type({
|
|
130
|
+
provider: t.literal("gitHub"),
|
|
131
|
+
owner: t.string,
|
|
132
|
+
name: t.string
|
|
133
|
+
}))
|
|
134
|
+
}), json);
|
|
135
|
+
if (error) {
|
|
136
|
+
throw new UnexpectedDataError(`Failed to decode linked repos: ${error.errors.join(", ")}`, { cause: error });
|
|
137
|
+
}
|
|
138
|
+
return value.repos;
|
|
139
|
+
}
|
|
140
|
+
async linkRepo(args) {
|
|
141
|
+
const url = new URL("./git/linked-repos", API_ENDPOINTS.SliceMachineV1);
|
|
142
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url, {
|
|
143
|
+
method: "PUT",
|
|
144
|
+
body: {
|
|
145
|
+
prismic: {
|
|
146
|
+
domain: args.prismic.domain
|
|
147
|
+
},
|
|
148
|
+
git: {
|
|
149
|
+
provider: args.git.provider,
|
|
150
|
+
owner: args.git.owner,
|
|
151
|
+
name: args.git.name
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
if (!res.ok) {
|
|
156
|
+
switch (res.status) {
|
|
157
|
+
case 401:
|
|
158
|
+
throw new UnauthenticatedError();
|
|
159
|
+
case 403:
|
|
160
|
+
throw new UnauthorizedError();
|
|
161
|
+
default:
|
|
162
|
+
throw new Error("Failed to link repos.");
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async unlinkRepo(args) {
|
|
167
|
+
const url = new URL("./git/linked-repos", API_ENDPOINTS.SliceMachineV1);
|
|
168
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url, {
|
|
169
|
+
method: "DELETE",
|
|
170
|
+
body: {
|
|
171
|
+
prismic: {
|
|
172
|
+
domain: args.prismic.domain
|
|
173
|
+
},
|
|
174
|
+
git: {
|
|
175
|
+
provider: args.git.provider,
|
|
176
|
+
owner: args.git.owner,
|
|
177
|
+
name: args.git.name
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
if (!res.ok) {
|
|
182
|
+
switch (res.status) {
|
|
183
|
+
case 401:
|
|
184
|
+
throw new UnauthenticatedError();
|
|
185
|
+
case 403:
|
|
186
|
+
throw new UnauthorizedError();
|
|
187
|
+
default:
|
|
188
|
+
throw new Error("Failed to unlink repos.");
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
async checkHasWriteAPIToken(args) {
|
|
193
|
+
const url = new URL("./git/linked-repos/write-api-token", API_ENDPOINTS.SliceMachineV1);
|
|
194
|
+
url.searchParams.set("repository", args.prismic.domain);
|
|
195
|
+
url.searchParams.set("git", buildGitRepoSpecifier({
|
|
196
|
+
provider: args.git.provider,
|
|
197
|
+
owner: args.git.owner,
|
|
198
|
+
name: args.git.name
|
|
199
|
+
}));
|
|
200
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url);
|
|
201
|
+
if (!res.ok) {
|
|
202
|
+
switch (res.status) {
|
|
203
|
+
case 401:
|
|
204
|
+
throw new UnauthenticatedError();
|
|
205
|
+
case 403:
|
|
206
|
+
throw new UnauthorizedError();
|
|
207
|
+
default:
|
|
208
|
+
throw new Error("Failed to check Prismic Write API token.");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
const json = await res.json();
|
|
212
|
+
const { value, error } = decode(t.type({
|
|
213
|
+
hasWriteAPIToken: t.boolean
|
|
214
|
+
}), json);
|
|
215
|
+
if (error) {
|
|
216
|
+
throw new UnexpectedDataError(`Failed to decode: ${error.errors.join(", ")}`, { cause: error });
|
|
217
|
+
}
|
|
218
|
+
return value.hasWriteAPIToken;
|
|
219
|
+
}
|
|
220
|
+
async updateWriteAPIToken(args) {
|
|
221
|
+
const url = new URL("./git/linked-repos/write-api-token", API_ENDPOINTS.SliceMachineV1);
|
|
222
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url, {
|
|
223
|
+
method: "PUT",
|
|
224
|
+
body: {
|
|
225
|
+
prismic: {
|
|
226
|
+
domain: args.prismic.domain
|
|
227
|
+
},
|
|
228
|
+
git: {
|
|
229
|
+
provider: args.git.provider,
|
|
230
|
+
owner: args.git.owner,
|
|
231
|
+
name: args.git.name
|
|
232
|
+
},
|
|
233
|
+
token: args.token
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
if (!res.ok) {
|
|
237
|
+
switch (res.status) {
|
|
238
|
+
case 401:
|
|
239
|
+
throw new UnauthenticatedError();
|
|
240
|
+
case 403:
|
|
241
|
+
throw new UnauthorizedError();
|
|
242
|
+
default:
|
|
243
|
+
throw new Error("Failed to update Prismic Write API token.");
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
async deleteWriteAPIToken(args) {
|
|
248
|
+
const url = new URL("./git/linked-repos/write-api-token", API_ENDPOINTS.SliceMachineV1);
|
|
249
|
+
const res = await __privateMethod(this, _fetch, fetch_fn).call(this, url, {
|
|
250
|
+
method: "DELETE",
|
|
251
|
+
body: {
|
|
252
|
+
prismic: {
|
|
253
|
+
domain: args.prismic.domain
|
|
254
|
+
},
|
|
255
|
+
git: {
|
|
256
|
+
provider: args.git.provider,
|
|
257
|
+
owner: args.git.owner,
|
|
258
|
+
name: args.git.name
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
if (!res.ok) {
|
|
263
|
+
switch (res.status) {
|
|
264
|
+
case 401:
|
|
265
|
+
throw new UnauthenticatedError();
|
|
266
|
+
case 403:
|
|
267
|
+
throw new UnauthorizedError();
|
|
268
|
+
default:
|
|
269
|
+
throw new Error("Failed to delete Prismic Write API token.");
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
_fetch = new WeakSet();
|
|
275
|
+
fetch_fn = async function(url, config) {
|
|
276
|
+
const authenticationToken = await this.user.getAuthenticationToken();
|
|
277
|
+
return await fetch(url, {
|
|
278
|
+
method: config == null ? void 0 : config.method,
|
|
279
|
+
body: (config == null ? void 0 : config.body) ? JSON.stringify(config.body) : void 0,
|
|
280
|
+
headers: {
|
|
281
|
+
Authorization: `Bearer ${authenticationToken}`
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
};
|
|
285
|
+
export {
|
|
286
|
+
GitManager
|
|
287
|
+
};
|
|
288
|
+
//# sourceMappingURL=GitManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitManager.js","sources":["../../../../src/managers/git/GitManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport * as tt from \"io-ts-types\";\n\nimport fetch from \"../../lib/fetch\";\nimport { decode } from \"../../lib/decode\";\n\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\n\nimport {\n\tUnauthenticatedError,\n\tUnauthorizedError,\n\tUnexpectedDataError,\n} from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport { GitRepo, GitRepoSpecifier, Owner } from \"./types\";\nimport { buildGitRepoSpecifier } from \"./buildGitRepoSpecifier\";\n\ntype GitManagerCreateGitHubAuthStateReturnType = {\n\tkey: string;\n\texpiresAt: Date;\n};\n\ntype GitManagerFetchOwnersReturnType = Owner[];\n\ntype GitManagerFetchReposReturnType = GitRepo[];\n\ntype GitManagerFetchReposArgs = {\n\tprovider: \"gitHub\";\n\towner: string;\n\tquery?: string;\n\tpage?: number;\n};\n\ntype GitManagerFetchLinkedReposArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n};\n\ntype GitManagerFetchLinkedReposReturnType = GitRepoSpecifier[];\n\ntype GitManagerLinkRepoArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\ntype GitManagerUnlinkRepoArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\ntype CheckHasWriteAPITokenArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\ntype UpdateWriteAPITokenArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n\ttoken: string;\n};\n\ntype DeleteWriteAPITokenArgs = {\n\tprismic: {\n\t\tdomain: string;\n\t};\n\tgit: {\n\t\tprovider: \"gitHub\";\n\t\towner: string;\n\t\tname: string;\n\t};\n};\n\nexport class GitManager extends BaseManager {\n\tasync createGitHubAuthState(): Promise<GitManagerCreateGitHubAuthStateReturnType> {\n\t\tconst url = new URL(\n\t\t\t\"./git/github/create-auth-state\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\tconst res = await this.#fetch(url, { method: \"POST\" });\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to create GitHub auth state.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\tkey: t.string,\n\t\t\t\texpiresAt: tt.DateFromISOString,\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode GitHub auth state: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tasync fetchOwners(): Promise<GitManagerFetchOwnersReturnType> {\n\t\tconst url = new URL(\"./git/owners\", API_ENDPOINTS.SliceMachineV1);\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to fetch owners.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\towners: t.array(\n\t\t\t\t\tt.type({\n\t\t\t\t\t\tprovider: t.literal(\"gitHub\"),\n\t\t\t\t\t\tid: t.string,\n\t\t\t\t\t\tname: t.string,\n\t\t\t\t\t\ttype: t.union([t.literal(\"user\"), t.literal(\"team\"), t.null]),\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode owners: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.owners;\n\t}\n\n\tasync fetchRepos(\n\t\targs: GitManagerFetchReposArgs,\n\t): Promise<GitManagerFetchReposReturnType> {\n\t\tconst url = new URL(\"./git/repos\", API_ENDPOINTS.SliceMachineV1);\n\t\turl.searchParams.set(\"provider\", args.provider);\n\t\turl.searchParams.set(\"owner\", args.owner);\n\t\tif (args.query) {\n\t\t\turl.searchParams.set(\"q\", args.query);\n\t\t}\n\t\tif (args.page && args.page > 0) {\n\t\t\turl.searchParams.set(\"page\", args.page.toString());\n\t\t}\n\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to fetch repos.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\trepos: t.array(\n\t\t\t\t\tt.type({\n\t\t\t\t\t\tprovider: t.literal(\"gitHub\"),\n\t\t\t\t\t\tid: t.string,\n\t\t\t\t\t\towner: t.string,\n\t\t\t\t\t\tname: t.string,\n\t\t\t\t\t\turl: t.string,\n\t\t\t\t\t\tpushedAt: tt.DateFromISOString,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode repos: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.repos;\n\t}\n\n\tasync fetchLinkedRepos(\n\t\targs: GitManagerFetchLinkedReposArgs,\n\t): Promise<GitManagerFetchLinkedReposReturnType> {\n\t\tconst url = new URL(\"./git/linked-repos\", API_ENDPOINTS.SliceMachineV1);\n\t\turl.searchParams.set(\"repository\", args.prismic.domain);\n\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to fetch linked repos.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\trepos: t.array(\n\t\t\t\t\tt.type({\n\t\t\t\t\t\tprovider: t.literal(\"gitHub\"),\n\t\t\t\t\t\towner: t.string,\n\t\t\t\t\t\tname: t.string,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode linked repos: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.repos;\n\t}\n\n\tasync linkRepo(args: GitManagerLinkRepoArgs): Promise<void> {\n\t\tconst url = new URL(\"./git/linked-repos\", API_ENDPOINTS.SliceMachineV1);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"PUT\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to link repos.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync unlinkRepo(args: GitManagerUnlinkRepoArgs): Promise<void> {\n\t\tconst url = new URL(\"./git/linked-repos\", API_ENDPOINTS.SliceMachineV1);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"DELETE\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to unlink repos.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync checkHasWriteAPIToken(\n\t\targs: CheckHasWriteAPITokenArgs,\n\t): Promise<boolean> {\n\t\tconst url = new URL(\n\t\t\t\"./git/linked-repos/write-api-token\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\turl.searchParams.set(\"repository\", args.prismic.domain);\n\t\turl.searchParams.set(\n\t\t\t\"git\",\n\t\t\tbuildGitRepoSpecifier({\n\t\t\t\tprovider: args.git.provider,\n\t\t\t\towner: args.git.owner,\n\t\t\t\tname: args.git.name,\n\t\t\t}),\n\t\t);\n\n\t\tconst res = await this.#fetch(url);\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to check Prismic Write API token.\");\n\t\t\t}\n\t\t}\n\n\t\tconst json = await res.json();\n\t\tconst { value, error } = decode(\n\t\t\tt.type({\n\t\t\t\thasWriteAPIToken: t.boolean,\n\t\t\t}),\n\t\t\tjson,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new UnexpectedDataError(\n\t\t\t\t`Failed to decode: ${error.errors.join(\", \")}`,\n\t\t\t\t{ cause: error },\n\t\t\t);\n\t\t}\n\n\t\treturn value.hasWriteAPIToken;\n\t}\n\n\tasync updateWriteAPIToken(args: UpdateWriteAPITokenArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./git/linked-repos/write-api-token\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"PUT\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t\ttoken: args.token,\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to update Prismic Write API token.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync deleteWriteAPIToken(args: DeleteWriteAPITokenArgs): Promise<void> {\n\t\tconst url = new URL(\n\t\t\t\"./git/linked-repos/write-api-token\",\n\t\t\tAPI_ENDPOINTS.SliceMachineV1,\n\t\t);\n\t\tconst res = await this.#fetch(url, {\n\t\t\tmethod: \"DELETE\",\n\t\t\tbody: {\n\t\t\t\tprismic: {\n\t\t\t\t\tdomain: args.prismic.domain,\n\t\t\t\t},\n\t\t\t\tgit: {\n\t\t\t\t\tprovider: args.git.provider,\n\t\t\t\t\towner: args.git.owner,\n\t\t\t\t\tname: args.git.name,\n\t\t\t\t},\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tswitch (res.status) {\n\t\t\t\tcase 401:\n\t\t\t\t\tthrow new UnauthenticatedError();\n\t\t\t\tcase 403:\n\t\t\t\t\tthrow new UnauthorizedError();\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(\"Failed to delete Prismic Write API token.\");\n\t\t\t}\n\t\t}\n\t}\n\n\tasync #fetch(\n\t\turl: URL,\n\t\tconfig?: {\n\t\t\tmethod?: \"POST\" | \"PUT\" | \"DELETE\";\n\t\t\tbody?: unknown;\n\t\t},\n\t) {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\n\t\treturn await fetch(url, {\n\t\t\tmethod: config?.method,\n\t\t\tbody: config?.body ? JSON.stringify(config.body) : undefined,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t},\n\t\t});\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const buildGitRepoSpecifier = (repoSpecifier) => {
|
|
4
|
+
return `${repoSpecifier.provider}@${repoSpecifier.owner}/${repoSpecifier.name}`;
|
|
5
|
+
};
|
|
6
|
+
exports.buildGitRepoSpecifier = buildGitRepoSpecifier;
|
|
7
|
+
//# sourceMappingURL=buildGitRepoSpecifier.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildGitRepoSpecifier.cjs","sources":["../../../../src/managers/git/buildGitRepoSpecifier.ts"],"sourcesContent":["import { GitRepoSpecifier } from \"./types\";\n\n/**\n * Builds a Git repository specifier from its individual parts.\n *\n * @example\n *\n * ```typescript\n * buildGitRepoSpecifier({\n * \tprovider: \"gitHub\",\n * \towner: \"foo\",\n * \tname: \"bar\",\n * });\n * ```\n *\n * @param repoSpecifier - The Git repository specifier.\n *\n * @returns The specifier in the form of `provider@owner/name`.\n */\nexport const buildGitRepoSpecifier = (\n\trepoSpecifier: GitRepoSpecifier,\n): string => {\n\treturn `${repoSpecifier.provider}@${repoSpecifier.owner}/${repoSpecifier.name}`;\n};\n"],"names":[],"mappings":";;AAmBa,MAAA,wBAAwB,CACpC,kBACW;AACX,SAAO,GAAG,cAAc,YAAY,cAAc,SAAS,cAAc;AAC1E;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { GitRepoSpecifier } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Builds a Git repository specifier from its individual parts.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
*
|
|
7
|
+
* ```typescript
|
|
8
|
+
* buildGitRepoSpecifier({
|
|
9
|
+
* provider: "gitHub",
|
|
10
|
+
* owner: "foo",
|
|
11
|
+
* name: "bar",
|
|
12
|
+
* });
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* @param repoSpecifier - The Git repository specifier.
|
|
16
|
+
*
|
|
17
|
+
* @returns The specifier in the form of `provider@owner/name`.
|
|
18
|
+
*/
|
|
19
|
+
export declare const buildGitRepoSpecifier: (repoSpecifier: GitRepoSpecifier) => string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buildGitRepoSpecifier.js","sources":["../../../../src/managers/git/buildGitRepoSpecifier.ts"],"sourcesContent":["import { GitRepoSpecifier } from \"./types\";\n\n/**\n * Builds a Git repository specifier from its individual parts.\n *\n * @example\n *\n * ```typescript\n * buildGitRepoSpecifier({\n * \tprovider: \"gitHub\",\n * \towner: \"foo\",\n * \tname: \"bar\",\n * });\n * ```\n *\n * @param repoSpecifier - The Git repository specifier.\n *\n * @returns The specifier in the form of `provider@owner/name`.\n */\nexport const buildGitRepoSpecifier = (\n\trepoSpecifier: GitRepoSpecifier,\n): string => {\n\treturn `${repoSpecifier.provider}@${repoSpecifier.owner}/${repoSpecifier.name}`;\n};\n"],"names":[],"mappings":"AAmBa,MAAA,wBAAwB,CACpC,kBACW;AACX,SAAO,GAAG,cAAc,YAAY,cAAc,SAAS,cAAc;AAC1E;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type Owner = {
|
|
2
|
+
provider: "gitHub";
|
|
3
|
+
id: string;
|
|
4
|
+
name: string;
|
|
5
|
+
type: "user" | "team" | null;
|
|
6
|
+
};
|
|
7
|
+
export type GitRepo = {
|
|
8
|
+
provider: "gitHub";
|
|
9
|
+
id: string;
|
|
10
|
+
owner: string;
|
|
11
|
+
name: string;
|
|
12
|
+
url: string;
|
|
13
|
+
pushedAt: Date;
|
|
14
|
+
};
|
|
15
|
+
export type GitRepoSpecifier = {
|
|
16
|
+
provider: "gitHub";
|
|
17
|
+
owner: string;
|
|
18
|
+
name: string;
|
|
19
|
+
};
|
|
@@ -43,7 +43,7 @@ class TelemetryManager extends BaseManager.BaseManager {
|
|
|
43
43
|
return analytics;
|
|
44
44
|
};
|
|
45
45
|
if (isTelemetryEnabled) {
|
|
46
|
-
|
|
46
|
+
this.initExperiment();
|
|
47
47
|
}
|
|
48
48
|
this._anonymousID = crypto.randomUUID();
|
|
49
49
|
this._context = { app: { name: args.appName, version: args.appVersion } };
|
|
@@ -162,13 +162,13 @@ class TelemetryManager extends BaseManager.BaseManager {
|
|
|
162
162
|
async checkIsTelemetryEnabled() {
|
|
163
163
|
let root;
|
|
164
164
|
try {
|
|
165
|
-
root = await this.project.getRoot();
|
|
165
|
+
root = await this.project.getRoot().catch(() => this.project.suggestRoot());
|
|
166
|
+
return prismicrc.readPrismicrc(root).telemetry !== false;
|
|
166
167
|
} catch {
|
|
167
|
-
|
|
168
|
+
return false;
|
|
168
169
|
}
|
|
169
|
-
return prismicrc.readPrismicrc(root).telemetry !== false;
|
|
170
170
|
}
|
|
171
|
-
|
|
171
|
+
initExperiment() {
|
|
172
172
|
try {
|
|
173
173
|
this._experiment = index.__exports.Experiment.initializeRemote(API_TOKENS.API_TOKENS.AmplitudeKey);
|
|
174
174
|
} catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelemetryManager.cjs","sources":["../../../../src/managers/telemetry/TelemetryManager.ts"],"sourcesContent":["import {\n\tExperiment,\n\tRemoteEvaluationClient,\n\tVariant,\n} from \"@amplitude/experiment-node-server\";\nimport { randomUUID } from \"node:crypto\";\nimport { Analytics, GroupParams, TrackParams } from \"@segment/analytics-node\";\n\nimport { readPrismicrc } from \"../../lib/prismicrc\";\n\nimport { API_TOKENS } from \"../../constants/API_TOKENS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tHumanSegmentEventType,\n\tHumanSegmentEventTypes,\n\tSegmentEvents,\n} from \"./types\";\nimport { Environment } from \"../prismicRepository/types\";\n\ntype TelemetryManagerInitTelemetryArgs = {\n\tappName: string;\n\tappVersion: string;\n};\n\ntype TelemetryManagerTrackArgs = SegmentEvents & {\n\t_includeEnvironmentKind?: boolean;\n};\n\ntype TelemetryManagerIdentifyArgs = {\n\tuserID: string;\n\tintercomHash: string;\n};\n\ntype TelemetryManagerGroupArgs = {\n\tmanualLibsCount: number;\n\tdownloadedLibsCount: number;\n\tnpmLibsCount: number;\n\tdownloadedLibs: string[];\n};\n\ntype TelemetryManagerContext = {\n\tapp: {\n\t\tname: string;\n\t\tversion: string;\n\t};\n};\n\nfunction assertTelemetryInitialized(\n\tsegmentClient: (() => Analytics) | undefined,\n): asserts segmentClient is NonNullable<typeof segmentClient> {\n\tif (segmentClient === undefined) {\n\t\tthrow new Error(\n\t\t\t\"Telemetry has not been initialized. Run `SliceMachineManager.telemetry.prototype.initTelemetry()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nexport class TelemetryManager extends BaseManager {\n\tprivate _segmentClient: (() => Analytics) | undefined = undefined;\n\tprivate _anonymousID: string | undefined = undefined;\n\tprivate _userID: string | undefined = undefined;\n\tprivate _context: TelemetryManagerContext | undefined = undefined;\n\tprivate _experiment: RemoteEvaluationClient | undefined = undefined;\n\n\tasync initTelemetry(args: TelemetryManagerInitTelemetryArgs): Promise<void> {\n\t\tconst isTelemetryEnabled = await this.checkIsTelemetryEnabled();\n\n\t\tthis._segmentClient = () => {\n\t\t\tconst analytics = new Analytics({\n\t\t\t\twriteKey: API_TOKENS.SegmentKey,\n\t\t\t\t// Since it's a local app, we do not benefit from event batching the way a server would normally do, all tracking event will be awaited.\n\t\t\t\tmaxEventsInBatch: 1,\n\t\t\t\t// TODO: Verify that this actually does not send data to Segment when false.\n\t\t\t\tdisable: !isTelemetryEnabled,\n\t\t\t});\n\n\t\t\tanalytics.on(\"error\", (error) => {\n\t\t\t\t// noop - We don't care if the tracking event\n\t\t\t\t// failed. Some users or networks intentionally\n\t\t\t\t// block Segment, so we can't block the app if\n\t\t\t\t// a tracking event is unsuccessful.\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(`An error occurred with Segment`, error);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn analytics;\n\t\t};\n\n\t\tif (isTelemetryEnabled) {\n\t\t\tawait this.initExperiment();\n\t\t}\n\n\t\tthis._anonymousID = randomUUID();\n\t\tthis._context = { app: { name: args.appName, version: args.appVersion } };\n\t}\n\n\t// TODO: Should `userId` be automatically populated by the logged in\n\t// user? We already have their info via UserRepository.\n\tasync track(args: TelemetryManagerTrackArgs): Promise<void> {\n\t\tconst { event, repository, ...properties } = args;\n\t\tlet repositoryName = repository;\n\n\t\tif (repositoryName === undefined) {\n\t\t\ttry {\n\t\t\t\trepositoryName = await this.project.getRepositoryName();\n\t\t\t} catch (error) {\n\t\t\t\t// noop, happen only when the user is not in a project\n\t\t\t}\n\t\t}\n\n\t\tlet environmentKind: Environment[\"kind\"] | \"_unknown\" | undefined =\n\t\t\tundefined;\n\t\tif (args._includeEnvironmentKind) {\n\t\t\tif (this.project.checkSupportsEnvironments()) {\n\t\t\t\ttry {\n\t\t\t\t\tconst { activeEnvironment } =\n\t\t\t\t\t\tawait this.project.fetchActiveEnvironment();\n\t\t\t\t\tenvironmentKind = activeEnvironment.kind;\n\t\t\t\t} catch {\n\t\t\t\t\tenvironmentKind = \"_unknown\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Assume only the production environment can be\n\t\t\t\t// used if the project's adapter does not\n\t\t\t\t// support environments.\n\t\t\t\tenvironmentKind = \"prod\";\n\t\t\t}\n\t\t}\n\n\t\tconst payload: {\n\t\t\tevent: HumanSegmentEventTypes;\n\t\t\tuserId?: string;\n\t\t\tanonymousId?: string;\n\t\t\tproperties?: Record<string, unknown>;\n\t\t\tcontext?: Partial<TelemetryManagerContext> & {\n\t\t\t\tgroupId?: {\n\t\t\t\t\tRepository?: string;\n\t\t\t\t};\n\t\t\t};\n\t\t} = {\n\t\t\tevent: HumanSegmentEventType[event],\n\t\t\tproperties: {\n\t\t\t\tnodeVersion: process.versions.node,\n\t\t\t\tenvironmentKind,\n\t\t\t\t...properties,\n\t\t\t},\n\t\t\tcontext: { ...this._context },\n\t\t};\n\n\t\tif (this._userID) {\n\t\t\tpayload.userId = this._userID;\n\t\t} else {\n\t\t\tpayload.anonymousId = this._anonymousID;\n\t\t}\n\n\t\tif (repositoryName) {\n\t\t\tpayload.context ||= {};\n\t\t\tpayload.context.groupId ||= {};\n\t\t\tpayload.context.groupId.Repository = repositoryName;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient().track(\n\t\t\t\tpayload as TrackParams,\n\t\t\t\t(maybeError?: unknown) => {\n\t\t\t\t\tif (maybeError && import.meta.env.DEV) {\n\t\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`An error occurred during Segment tracking`,\n\t\t\t\t\t\t\tmaybeError,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\t// TODO: Should `userID` and `intercomHash` be automatically populated\n\t// by the logged in user? We already have their info via\n\t// UserRepository.\n\tidentify(args: TelemetryManagerIdentifyArgs): Promise<void> {\n\t\tconst payload = {\n\t\t\tuserId: args.userID,\n\t\t\tanonymousId: this._anonymousID,\n\t\t\tintegrations: {\n\t\t\t\tIntercom: {\n\t\t\t\t\tuser_hash: args.intercomHash,\n\t\t\t\t},\n\t\t\t},\n\t\t\tcontext: { ...this._context },\n\t\t};\n\n\t\tthis._userID = args.userID;\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient().identify(payload, (maybeError?: unknown) => {\n\t\t\t\tif (maybeError && import.meta.env.DEV) {\n\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\tconsole.warn(`An error occurred during Segment identify`, maybeError);\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync group(args: TelemetryManagerGroupArgs): Promise<void> {\n\t\tlet repositoryName;\n\n\t\ttry {\n\t\t\trepositoryName = await this.project.getRepositoryName();\n\t\t} catch (error) {\n\t\t\t// noop, happen only when the user is not in a project\n\t\t}\n\n\t\tconst payload: {\n\t\t\tgroupId?: string;\n\t\t\tuserId?: string;\n\t\t\tanonymousId?: string;\n\t\t\ttraits?: Record<string, unknown>;\n\t\t\tcontext?: Partial<TelemetryManagerContext> & {\n\t\t\t\tgroupId?: {\n\t\t\t\t\tRepository?: string;\n\t\t\t\t};\n\t\t\t};\n\t\t} = {\n\t\t\ttraits: args,\n\t\t\tcontext: { ...this._context },\n\t\t};\n\n\t\tif (this._userID) {\n\t\t\tpayload.userId = this._userID;\n\t\t} else {\n\t\t\tpayload.anonymousId = this._anonymousID;\n\t\t}\n\n\t\tif (repositoryName) {\n\t\t\tpayload.groupId = repositoryName;\n\t\t\tpayload.context ||= {};\n\t\t\tpayload.context.groupId ||= {};\n\t\t\tpayload.context.groupId.Repository = repositoryName;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\tthis._segmentClient().group(\n\t\t\t\tpayload as GroupParams,\n\t\t\t\t(maybeError?: unknown) => {\n\t\t\t\t\tif (maybeError && import.meta.env.DEV) {\n\t\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\t\tconsole.warn(`An error occurred during Segment group`, maybeError);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\tasync checkIsTelemetryEnabled(): Promise<boolean> {\n\t\tlet root: string;\n\t\ttry {\n\t\t\troot = await this.project.getRoot();\n\t\t} catch {\n\t\t\troot = await this.project.suggestRoot();\n\t\t}\n\n\t\treturn readPrismicrc(root).telemetry !== false;\n\t}\n\n\tprivate async initExperiment(): Promise<void> {\n\t\ttry {\n\t\t\tthis._experiment = Experiment.initializeRemote(API_TOKENS.AmplitudeKey);\n\t\t} catch (error) {\n\t\t\tif (import.meta.env.DEV) {\n\t\t\t\tconsole.error(\"Error initializing experiment\", error);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getExperimentVariant(variantKey: string): Promise<Variant | undefined> {\n\t\tif (this._experiment) {\n\t\t\ttry {\n\t\t\t\tconst repositoryName = await this.project.getRepositoryName();\n\t\t\t\tconst variants = await this._experiment.fetchV2({\n\t\t\t\t\tuser_id: this._userID,\n\t\t\t\t\tuser_properties: {\n\t\t\t\t\t\tRepository: repositoryName,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn variants[variantKey];\n\t\t\t} catch (error) {\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error fetching experiment variant\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n"],"names":["BaseManager","Analytics","API_TOKENS","randomUUID","HumanSegmentEventType","readPrismicrc","Experiment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TelemetryManager.cjs","sources":["../../../../src/managers/telemetry/TelemetryManager.ts"],"sourcesContent":["import {\n\tExperiment,\n\tRemoteEvaluationClient,\n\tVariant,\n} from \"@amplitude/experiment-node-server\";\nimport { randomUUID } from \"node:crypto\";\nimport { Analytics, GroupParams, TrackParams } from \"@segment/analytics-node\";\n\nimport { readPrismicrc } from \"../../lib/prismicrc\";\n\nimport { API_TOKENS } from \"../../constants/API_TOKENS\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nimport {\n\tHumanSegmentEventType,\n\tHumanSegmentEventTypes,\n\tSegmentEvents,\n} from \"./types\";\nimport { Environment } from \"../prismicRepository/types\";\n\ntype TelemetryManagerInitTelemetryArgs = {\n\tappName: string;\n\tappVersion: string;\n};\n\ntype TelemetryManagerTrackArgs = SegmentEvents & {\n\t_includeEnvironmentKind?: boolean;\n};\n\ntype TelemetryManagerIdentifyArgs = {\n\tuserID: string;\n\tintercomHash: string;\n};\n\ntype TelemetryManagerGroupArgs = {\n\tmanualLibsCount: number;\n\tdownloadedLibsCount: number;\n\tnpmLibsCount: number;\n\tdownloadedLibs: string[];\n};\n\ntype TelemetryManagerContext = {\n\tapp: {\n\t\tname: string;\n\t\tversion: string;\n\t};\n};\n\nfunction assertTelemetryInitialized(\n\tsegmentClient: (() => Analytics) | undefined,\n): asserts segmentClient is NonNullable<typeof segmentClient> {\n\tif (segmentClient === undefined) {\n\t\tthrow new Error(\n\t\t\t\"Telemetry has not been initialized. Run `SliceMachineManager.telemetry.prototype.initTelemetry()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nexport class TelemetryManager extends BaseManager {\n\tprivate _segmentClient: (() => Analytics) | undefined = undefined;\n\tprivate _anonymousID: string | undefined = undefined;\n\tprivate _userID: string | undefined = undefined;\n\tprivate _context: TelemetryManagerContext | undefined = undefined;\n\tprivate _experiment: RemoteEvaluationClient | undefined = undefined;\n\n\tasync initTelemetry(args: TelemetryManagerInitTelemetryArgs): Promise<void> {\n\t\tconst isTelemetryEnabled = await this.checkIsTelemetryEnabled();\n\n\t\tthis._segmentClient = () => {\n\t\t\tconst analytics = new Analytics({\n\t\t\t\twriteKey: API_TOKENS.SegmentKey,\n\t\t\t\t// Since it's a local app, we do not benefit from event batching the way a server would normally do, all tracking event will be awaited.\n\t\t\t\tmaxEventsInBatch: 1,\n\t\t\t\t// TODO: Verify that this actually does not send data to Segment when false.\n\t\t\t\tdisable: !isTelemetryEnabled,\n\t\t\t});\n\n\t\t\tanalytics.on(\"error\", (error) => {\n\t\t\t\t// noop - We don't care if the tracking event\n\t\t\t\t// failed. Some users or networks intentionally\n\t\t\t\t// block Segment, so we can't block the app if\n\t\t\t\t// a tracking event is unsuccessful.\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(`An error occurred with Segment`, error);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn analytics;\n\t\t};\n\n\t\tif (isTelemetryEnabled) {\n\t\t\tthis.initExperiment();\n\t\t}\n\n\t\tthis._anonymousID = randomUUID();\n\t\tthis._context = { app: { name: args.appName, version: args.appVersion } };\n\t}\n\n\t// TODO: Should `userId` be automatically populated by the logged in\n\t// user? We already have their info via UserRepository.\n\tasync track(args: TelemetryManagerTrackArgs): Promise<void> {\n\t\tconst { event, repository, ...properties } = args;\n\t\tlet repositoryName = repository;\n\n\t\tif (repositoryName === undefined) {\n\t\t\ttry {\n\t\t\t\trepositoryName = await this.project.getRepositoryName();\n\t\t\t} catch (error) {\n\t\t\t\t// noop, happen only when the user is not in a project\n\t\t\t}\n\t\t}\n\n\t\tlet environmentKind: Environment[\"kind\"] | \"_unknown\" | undefined =\n\t\t\tundefined;\n\t\tif (args._includeEnvironmentKind) {\n\t\t\tif (this.project.checkSupportsEnvironments()) {\n\t\t\t\ttry {\n\t\t\t\t\tconst { activeEnvironment } =\n\t\t\t\t\t\tawait this.project.fetchActiveEnvironment();\n\t\t\t\t\tenvironmentKind = activeEnvironment.kind;\n\t\t\t\t} catch {\n\t\t\t\t\tenvironmentKind = \"_unknown\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Assume only the production environment can be\n\t\t\t\t// used if the project's adapter does not\n\t\t\t\t// support environments.\n\t\t\t\tenvironmentKind = \"prod\";\n\t\t\t}\n\t\t}\n\n\t\tconst payload: {\n\t\t\tevent: HumanSegmentEventTypes;\n\t\t\tuserId?: string;\n\t\t\tanonymousId?: string;\n\t\t\tproperties?: Record<string, unknown>;\n\t\t\tcontext?: Partial<TelemetryManagerContext> & {\n\t\t\t\tgroupId?: {\n\t\t\t\t\tRepository?: string;\n\t\t\t\t};\n\t\t\t};\n\t\t} = {\n\t\t\tevent: HumanSegmentEventType[event],\n\t\t\tproperties: {\n\t\t\t\tnodeVersion: process.versions.node,\n\t\t\t\tenvironmentKind,\n\t\t\t\t...properties,\n\t\t\t},\n\t\t\tcontext: { ...this._context },\n\t\t};\n\n\t\tif (this._userID) {\n\t\t\tpayload.userId = this._userID;\n\t\t} else {\n\t\t\tpayload.anonymousId = this._anonymousID;\n\t\t}\n\n\t\tif (repositoryName) {\n\t\t\tpayload.context ||= {};\n\t\t\tpayload.context.groupId ||= {};\n\t\t\tpayload.context.groupId.Repository = repositoryName;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient().track(\n\t\t\t\tpayload as TrackParams,\n\t\t\t\t(maybeError?: unknown) => {\n\t\t\t\t\tif (maybeError && import.meta.env.DEV) {\n\t\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`An error occurred during Segment tracking`,\n\t\t\t\t\t\t\tmaybeError,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\t// TODO: Should `userID` and `intercomHash` be automatically populated\n\t// by the logged in user? We already have their info via\n\t// UserRepository.\n\tidentify(args: TelemetryManagerIdentifyArgs): Promise<void> {\n\t\tconst payload = {\n\t\t\tuserId: args.userID,\n\t\t\tanonymousId: this._anonymousID,\n\t\t\tintegrations: {\n\t\t\t\tIntercom: {\n\t\t\t\t\tuser_hash: args.intercomHash,\n\t\t\t\t},\n\t\t\t},\n\t\t\tcontext: { ...this._context },\n\t\t};\n\n\t\tthis._userID = args.userID;\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\t// TODO: Make sure client fails gracefully when no internet connection\n\t\t\tthis._segmentClient().identify(payload, (maybeError?: unknown) => {\n\t\t\t\tif (maybeError && import.meta.env.DEV) {\n\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\tconsole.warn(`An error occurred during Segment identify`, maybeError);\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t}\n\n\tasync group(args: TelemetryManagerGroupArgs): Promise<void> {\n\t\tlet repositoryName;\n\n\t\ttry {\n\t\t\trepositoryName = await this.project.getRepositoryName();\n\t\t} catch (error) {\n\t\t\t// noop, happen only when the user is not in a project\n\t\t}\n\n\t\tconst payload: {\n\t\t\tgroupId?: string;\n\t\t\tuserId?: string;\n\t\t\tanonymousId?: string;\n\t\t\ttraits?: Record<string, unknown>;\n\t\t\tcontext?: Partial<TelemetryManagerContext> & {\n\t\t\t\tgroupId?: {\n\t\t\t\t\tRepository?: string;\n\t\t\t\t};\n\t\t\t};\n\t\t} = {\n\t\t\ttraits: args,\n\t\t\tcontext: { ...this._context },\n\t\t};\n\n\t\tif (this._userID) {\n\t\t\tpayload.userId = this._userID;\n\t\t} else {\n\t\t\tpayload.anonymousId = this._anonymousID;\n\t\t}\n\n\t\tif (repositoryName) {\n\t\t\tpayload.groupId = repositoryName;\n\t\t\tpayload.context ||= {};\n\t\t\tpayload.context.groupId ||= {};\n\t\t\tpayload.context.groupId.Repository = repositoryName;\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\tassertTelemetryInitialized(this._segmentClient);\n\n\t\t\tthis._segmentClient().group(\n\t\t\t\tpayload as GroupParams,\n\t\t\t\t(maybeError?: unknown) => {\n\t\t\t\t\tif (maybeError && import.meta.env.DEV) {\n\t\t\t\t\t\t// TODO: Not sure how we want to deal with that\n\t\t\t\t\t\tconsole.warn(`An error occurred during Segment group`, maybeError);\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve();\n\t\t\t\t},\n\t\t\t);\n\t\t});\n\t}\n\n\tasync checkIsTelemetryEnabled(): Promise<boolean> {\n\t\tlet root: string;\n\t\ttry {\n\t\t\troot = await this.project\n\t\t\t\t.getRoot()\n\t\t\t\t.catch(() => this.project.suggestRoot());\n\n\t\t\treturn readPrismicrc(root).telemetry !== false;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate initExperiment(): void {\n\t\ttry {\n\t\t\tthis._experiment = Experiment.initializeRemote(API_TOKENS.AmplitudeKey);\n\t\t} catch (error) {\n\t\t\tif (import.meta.env.DEV) {\n\t\t\t\tconsole.error(\"Error initializing experiment\", error);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync getExperimentVariant(variantKey: string): Promise<Variant | undefined> {\n\t\tif (this._experiment) {\n\t\t\ttry {\n\t\t\t\tconst repositoryName = await this.project.getRepositoryName();\n\t\t\t\tconst variants = await this._experiment.fetchV2({\n\t\t\t\t\tuser_id: this._userID,\n\t\t\t\t\tuser_properties: {\n\t\t\t\t\t\tRepository: repositoryName,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\t\treturn variants[variantKey];\n\t\t\t} catch (error) {\n\t\t\t\tif (import.meta.env.DEV) {\n\t\t\t\t\tconsole.error(\"Error fetching experiment variant\", error);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n}\n"],"names":["BaseManager","Analytics","API_TOKENS","randomUUID","HumanSegmentEventType","readPrismicrc","Experiment"],"mappings":"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"}
|
|
@@ -41,7 +41,7 @@ class TelemetryManager extends BaseManager {
|
|
|
41
41
|
return analytics;
|
|
42
42
|
};
|
|
43
43
|
if (isTelemetryEnabled) {
|
|
44
|
-
|
|
44
|
+
this.initExperiment();
|
|
45
45
|
}
|
|
46
46
|
this._anonymousID = randomUUID();
|
|
47
47
|
this._context = { app: { name: args.appName, version: args.appVersion } };
|
|
@@ -160,13 +160,13 @@ class TelemetryManager extends BaseManager {
|
|
|
160
160
|
async checkIsTelemetryEnabled() {
|
|
161
161
|
let root;
|
|
162
162
|
try {
|
|
163
|
-
root = await this.project.getRoot();
|
|
163
|
+
root = await this.project.getRoot().catch(() => this.project.suggestRoot());
|
|
164
|
+
return readPrismicrc(root).telemetry !== false;
|
|
164
165
|
} catch {
|
|
165
|
-
|
|
166
|
+
return false;
|
|
166
167
|
}
|
|
167
|
-
return readPrismicrc(root).telemetry !== false;
|
|
168
168
|
}
|
|
169
|
-
|
|
169
|
+
initExperiment() {
|
|
170
170
|
try {
|
|
171
171
|
this._experiment = src.Experiment.initializeRemote(API_TOKENS.AmplitudeKey);
|
|
172
172
|
} catch (error) {
|