@slicemachine/manager 0.25.2-beta.11 → 0.25.2-beta.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/_node_modules/execa/index.cjs +8 -70
  2. package/dist/_node_modules/execa/index.cjs.map +1 -1
  3. package/dist/_node_modules/execa/index.js +2 -64
  4. package/dist/_node_modules/execa/index.js.map +1 -1
  5. package/dist/_node_modules/execa/lib/stream.cjs +0 -15
  6. package/dist/_node_modules/execa/lib/stream.cjs.map +1 -1
  7. package/dist/_node_modules/execa/lib/stream.js +1 -16
  8. package/dist/_node_modules/execa/lib/stream.js.map +1 -1
  9. package/dist/client/index.d.ts +0 -1
  10. package/dist/client.cjs +0 -2
  11. package/dist/client.cjs.map +1 -1
  12. package/dist/client.js +0 -2
  13. package/dist/client.js.map +1 -1
  14. package/dist/index.d.ts +0 -1
  15. package/dist/managers/SliceMachineManager.cjs +0 -3
  16. package/dist/managers/SliceMachineManager.cjs.map +1 -1
  17. package/dist/managers/SliceMachineManager.d.ts +0 -2
  18. package/dist/managers/SliceMachineManager.js +0 -3
  19. package/dist/managers/SliceMachineManager.js.map +1 -1
  20. package/dist/managers/telemetry/types.cjs.map +1 -1
  21. package/dist/managers/telemetry/types.d.ts +0 -1
  22. package/dist/managers/telemetry/types.js.map +1 -1
  23. package/package.json +2 -2
  24. package/src/client/index.ts +0 -2
  25. package/src/index.ts +0 -2
  26. package/src/managers/SliceMachineManager.ts +0 -4
  27. package/src/managers/telemetry/types.ts +0 -1
  28. package/dist/constants/GIT_PROVIDER.cjs +0 -7
  29. package/dist/constants/GIT_PROVIDER.cjs.map +0 -1
  30. package/dist/constants/GIT_PROVIDER.d.ts +0 -4
  31. package/dist/constants/GIT_PROVIDER.js +0 -7
  32. package/dist/constants/GIT_PROVIDER.js.map +0 -1
  33. package/dist/constants/GIT_PROVIDER_APP_SLUGS.cjs +0 -26
  34. package/dist/constants/GIT_PROVIDER_APP_SLUGS.cjs.map +0 -1
  35. package/dist/constants/GIT_PROVIDER_APP_SLUGS.d.ts +0 -3
  36. package/dist/constants/GIT_PROVIDER_APP_SLUGS.js +0 -26
  37. package/dist/constants/GIT_PROVIDER_APP_SLUGS.js.map +0 -1
  38. package/dist/managers/git/GitManager.cjs +0 -334
  39. package/dist/managers/git/GitManager.cjs.map +0 -1
  40. package/dist/managers/git/GitManager.d.ts +0 -89
  41. package/dist/managers/git/GitManager.js +0 -316
  42. package/dist/managers/git/GitManager.js.map +0 -1
  43. package/dist/managers/git/buildGitRepoSpecifier.cjs +0 -7
  44. package/dist/managers/git/buildGitRepoSpecifier.cjs.map +0 -1
  45. package/dist/managers/git/buildGitRepoSpecifier.d.ts +0 -19
  46. package/dist/managers/git/buildGitRepoSpecifier.js +0 -7
  47. package/dist/managers/git/buildGitRepoSpecifier.js.map +0 -1
  48. package/dist/managers/git/types.d.ts +0 -20
  49. package/src/constants/GIT_PROVIDER.ts +0 -5
  50. package/src/constants/GIT_PROVIDER_APP_SLUGS.ts +0 -28
  51. package/src/managers/git/GitManager.ts +0 -502
  52. package/src/managers/git/buildGitRepoSpecifier.ts +0 -24
  53. package/src/managers/git/types.ts +0 -26
@@ -1,502 +0,0 @@
1
- import * as t from "io-ts";
2
- import * as tt from "io-ts-types";
3
- import { execaCommandSync } from "execa";
4
-
5
- import fetch from "../../lib/fetch";
6
- import { decode } from "../../lib/decode";
7
-
8
- import { API_ENDPOINTS } from "../../constants/API_ENDPOINTS";
9
- import { GitProvider, GIT_PROVIDER } from "../../constants/GIT_PROVIDER";
10
-
11
- import {
12
- UnauthenticatedError,
13
- UnauthorizedError,
14
- UnexpectedDataError,
15
- UnsupportedError,
16
- } from "../../errors";
17
-
18
- import { BaseManager } from "../BaseManager";
19
-
20
- import { GitOwner, GitRepo, GitRepoSpecifier } from "./types";
21
- import { buildGitRepoSpecifier } from "./buildGitRepoSpecifier";
22
- import { GIT_PROVIDER_APP_SLUGS } from "../../constants/GIT_PROVIDER_APP_SLUGS";
23
-
24
- type GitManagerCreateGitHubAuthStateReturnType = {
25
- key: string;
26
- expiresAt: Date;
27
- };
28
-
29
- type GitManagerFetchOwnersReturnType = GitOwner[];
30
-
31
- type GitManagerFetchReposReturnType = GitRepo[];
32
-
33
- type GitManagerFetchReposArgs = {
34
- provider: GitProvider;
35
- owner: string;
36
- query?: string;
37
- page?: number;
38
- };
39
-
40
- type GitManagerFetchLinkedReposArgs = {
41
- prismic: {
42
- domain: string;
43
- };
44
- };
45
-
46
- type GitManagerFetchLinkedReposReturnType = GitRepoSpecifier[];
47
-
48
- type GitManagerLinkRepoArgs = {
49
- prismic: {
50
- domain: string;
51
- };
52
- git: {
53
- provider: GitProvider;
54
- owner: string;
55
- name: string;
56
- };
57
- };
58
-
59
- type GitManagerUnlinkRepoArgs = {
60
- prismic: {
61
- domain: string;
62
- };
63
- git: {
64
- provider: GitProvider;
65
- owner: string;
66
- name: string;
67
- };
68
- };
69
-
70
- type CheckHasWriteAPITokenArgs = {
71
- prismic: {
72
- domain: string;
73
- };
74
- git: {
75
- provider: GitProvider;
76
- owner: string;
77
- name: string;
78
- };
79
- };
80
-
81
- type UpdateWriteAPITokenArgs = {
82
- prismic: {
83
- domain: string;
84
- };
85
- git: {
86
- provider: GitProvider;
87
- owner: string;
88
- name: string;
89
- };
90
- token: string;
91
- };
92
-
93
- type DeleteWriteAPITokenArgs = {
94
- prismic: {
95
- domain: string;
96
- };
97
- git: {
98
- provider: GitProvider;
99
- owner: string;
100
- name: string;
101
- };
102
- };
103
-
104
- export class GitManager extends BaseManager {
105
- async createGitHubAuthState(): Promise<GitManagerCreateGitHubAuthStateReturnType> {
106
- const url = new URL(
107
- "./git/github/create-auth-state",
108
- API_ENDPOINTS.SliceMachineV1,
109
- );
110
- const res = await this.#fetch(url, { method: "POST" });
111
-
112
- if (!res.ok) {
113
- switch (res.status) {
114
- case 401:
115
- throw new UnauthorizedError();
116
- default:
117
- throw new Error("Failed to create GitHub auth state.");
118
- }
119
- }
120
-
121
- const json = await res.json();
122
- const { value, error } = decode(
123
- t.type({
124
- key: t.string,
125
- expiresAt: tt.DateFromISOString,
126
- }),
127
- json,
128
- );
129
-
130
- if (error) {
131
- throw new UnexpectedDataError(
132
- `Failed to decode GitHub auth state: ${error.errors.join(", ")}`,
133
- { cause: error },
134
- );
135
- }
136
-
137
- return value;
138
- }
139
-
140
- async fetchOwners(): Promise<GitManagerFetchOwnersReturnType> {
141
- const url = new URL("./git/owners", API_ENDPOINTS.SliceMachineV1);
142
- const res = await this.#fetch(url);
143
-
144
- if (!res.ok) {
145
- switch (res.status) {
146
- case 401:
147
- throw new UnauthenticatedError();
148
- case 403:
149
- throw new UnauthorizedError();
150
- default:
151
- throw new Error("Failed to fetch owners.");
152
- }
153
- }
154
-
155
- const json = await res.json();
156
- const { value, error } = decode(
157
- t.type({
158
- owners: t.array(
159
- t.type({
160
- provider: t.literal(GIT_PROVIDER.GitHub),
161
- id: t.string,
162
- name: t.string,
163
- type: t.union([t.literal("user"), t.literal("team"), t.null]),
164
- }),
165
- ),
166
- }),
167
- json,
168
- );
169
-
170
- if (error) {
171
- throw new UnexpectedDataError(
172
- `Failed to decode owners: ${error.errors.join(", ")}`,
173
- { cause: error },
174
- );
175
- }
176
-
177
- return value.owners;
178
- }
179
-
180
- async fetchRepos(
181
- args: GitManagerFetchReposArgs,
182
- ): Promise<GitManagerFetchReposReturnType> {
183
- const url = new URL("./git/repos", API_ENDPOINTS.SliceMachineV1);
184
- url.searchParams.set("provider", args.provider);
185
- url.searchParams.set("owner", args.owner);
186
- if (args.query) {
187
- url.searchParams.set("q", args.query);
188
- }
189
- if (args.page && args.page > 0) {
190
- url.searchParams.set("page", args.page.toString());
191
- }
192
-
193
- const res = await this.#fetch(url);
194
-
195
- if (!res.ok) {
196
- switch (res.status) {
197
- case 401:
198
- throw new UnauthenticatedError();
199
- case 403:
200
- throw new UnauthorizedError();
201
- default:
202
- throw new Error("Failed to fetch repos.");
203
- }
204
- }
205
-
206
- const json = await res.json();
207
- const { value, error } = decode(
208
- t.type({
209
- repos: t.array(
210
- t.type({
211
- provider: t.literal(GIT_PROVIDER.GitHub),
212
- id: t.string,
213
- owner: t.string,
214
- name: t.string,
215
- url: t.string,
216
- pushedAt: tt.DateFromISOString,
217
- }),
218
- ),
219
- }),
220
- json,
221
- );
222
-
223
- if (error) {
224
- throw new UnexpectedDataError(
225
- `Failed to decode repos: ${error.errors.join(", ")}`,
226
- { cause: error },
227
- );
228
- }
229
-
230
- return value.repos;
231
- }
232
-
233
- async fetchLinkedRepos(
234
- args: GitManagerFetchLinkedReposArgs,
235
- ): Promise<GitManagerFetchLinkedReposReturnType> {
236
- const url = new URL("./git/linked-repos", API_ENDPOINTS.SliceMachineV1);
237
- url.searchParams.set("repository", args.prismic.domain);
238
-
239
- const res = await this.#fetch(url);
240
-
241
- if (!res.ok) {
242
- switch (res.status) {
243
- case 401:
244
- throw new UnauthenticatedError();
245
- case 403:
246
- throw new UnauthorizedError();
247
- default:
248
- throw new Error("Failed to fetch linked repos.");
249
- }
250
- }
251
-
252
- const json = await res.json();
253
- const { value, error } = decode(
254
- t.type({
255
- repos: t.array(
256
- t.type({
257
- provider: t.literal(GIT_PROVIDER.GitHub),
258
- owner: t.string,
259
- name: t.string,
260
- }),
261
- ),
262
- }),
263
- json,
264
- );
265
-
266
- if (error) {
267
- throw new UnexpectedDataError(
268
- `Failed to decode linked repos: ${error.errors.join(", ")}`,
269
- { cause: error },
270
- );
271
- }
272
-
273
- return value.repos;
274
- }
275
-
276
- async linkRepo(args: GitManagerLinkRepoArgs): Promise<void> {
277
- const url = new URL("./git/linked-repos", API_ENDPOINTS.SliceMachineV1);
278
- const res = await this.#fetch(url, {
279
- method: "PUT",
280
- body: {
281
- prismic: {
282
- domain: args.prismic.domain,
283
- },
284
- git: {
285
- provider: args.git.provider,
286
- owner: args.git.owner,
287
- name: args.git.name,
288
- },
289
- },
290
- });
291
-
292
- if (!res.ok) {
293
- switch (res.status) {
294
- case 401:
295
- throw new UnauthenticatedError();
296
- case 403:
297
- throw new UnauthorizedError();
298
- default:
299
- throw new Error("Failed to link repos.");
300
- }
301
- }
302
- }
303
-
304
- async unlinkRepo(args: GitManagerUnlinkRepoArgs): Promise<void> {
305
- const url = new URL("./git/linked-repos", API_ENDPOINTS.SliceMachineV1);
306
- const res = await this.#fetch(url, {
307
- method: "DELETE",
308
- body: {
309
- prismic: {
310
- domain: args.prismic.domain,
311
- },
312
- git: {
313
- provider: args.git.provider,
314
- owner: args.git.owner,
315
- name: args.git.name,
316
- },
317
- },
318
- });
319
-
320
- if (!res.ok) {
321
- switch (res.status) {
322
- case 401:
323
- throw new UnauthenticatedError();
324
- case 403:
325
- throw new UnauthorizedError();
326
- default:
327
- throw new Error("Failed to unlink repos.");
328
- }
329
- }
330
- }
331
-
332
- async checkHasWriteAPIToken(
333
- args: CheckHasWriteAPITokenArgs,
334
- ): Promise<boolean> {
335
- const url = new URL(
336
- "./git/linked-repos/write-api-token",
337
- API_ENDPOINTS.SliceMachineV1,
338
- );
339
- url.searchParams.set("repository", args.prismic.domain);
340
- url.searchParams.set(
341
- "git",
342
- buildGitRepoSpecifier({
343
- provider: args.git.provider,
344
- owner: args.git.owner,
345
- name: args.git.name,
346
- }),
347
- );
348
-
349
- const res = await this.#fetch(url);
350
-
351
- if (!res.ok) {
352
- switch (res.status) {
353
- case 401:
354
- throw new UnauthenticatedError();
355
- case 403:
356
- throw new UnauthorizedError();
357
- default:
358
- throw new Error("Failed to check Prismic Write API token.");
359
- }
360
- }
361
-
362
- const json = await res.json();
363
- const { value, error } = decode(
364
- t.type({
365
- hasWriteAPIToken: t.boolean,
366
- }),
367
- json,
368
- );
369
-
370
- if (error) {
371
- throw new UnexpectedDataError(
372
- `Failed to decode: ${error.errors.join(", ")}`,
373
- { cause: error },
374
- );
375
- }
376
-
377
- return value.hasWriteAPIToken;
378
- }
379
-
380
- async updateWriteAPIToken(args: UpdateWriteAPITokenArgs): Promise<void> {
381
- const url = new URL(
382
- "./git/linked-repos/write-api-token",
383
- API_ENDPOINTS.SliceMachineV1,
384
- );
385
- const res = await this.#fetch(url, {
386
- method: "PUT",
387
- body: {
388
- prismic: {
389
- domain: args.prismic.domain,
390
- },
391
- git: {
392
- provider: args.git.provider,
393
- owner: args.git.owner,
394
- name: args.git.name,
395
- },
396
- token: args.token,
397
- },
398
- });
399
-
400
- if (!res.ok) {
401
- switch (res.status) {
402
- case 401:
403
- throw new UnauthenticatedError();
404
- case 403:
405
- throw new UnauthorizedError();
406
- default:
407
- throw new Error("Failed to update Prismic Write API token.");
408
- }
409
- }
410
- }
411
-
412
- async deleteWriteAPIToken(args: DeleteWriteAPITokenArgs): Promise<void> {
413
- const url = new URL(
414
- "./git/linked-repos/write-api-token",
415
- API_ENDPOINTS.SliceMachineV1,
416
- );
417
- const res = await this.#fetch(url, {
418
- method: "DELETE",
419
- body: {
420
- prismic: {
421
- domain: args.prismic.domain,
422
- },
423
- git: {
424
- provider: args.git.provider,
425
- owner: args.git.owner,
426
- name: args.git.name,
427
- },
428
- },
429
- });
430
-
431
- if (!res.ok) {
432
- switch (res.status) {
433
- case 401:
434
- throw new UnauthenticatedError();
435
- case 403:
436
- throw new UnauthorizedError();
437
- default:
438
- throw new Error("Failed to delete Prismic Write API token.");
439
- }
440
- }
441
- }
442
-
443
- async getProviderAppInstallURL(args: {
444
- provider: GitProvider;
445
- }): Promise<string> {
446
- const appSlug = GIT_PROVIDER_APP_SLUGS[args.provider];
447
-
448
- switch (args.provider) {
449
- case GIT_PROVIDER.GitHub: {
450
- const state = await this.createGitHubAuthState();
451
-
452
- const url = new URL(
453
- `https://github.com/apps/${appSlug}/installations/new`,
454
- );
455
- url.searchParams.set("state", state.key);
456
-
457
- return url.toString();
458
- }
459
-
460
- default: {
461
- throw new UnsupportedError(
462
- `Git provider not supported: ${args.provider}.`,
463
- );
464
- }
465
- }
466
- }
467
-
468
- async detectGitProvider(): Promise<string> {
469
- try {
470
- const remoteUrl = execaCommandSync("git remote get-url origin");
471
- const domainRegex = /(?:https?:\/\/|git@)([^:/]+)[/:]/i;
472
- const match = remoteUrl.stdout.match(domainRegex);
473
- const domain = match?.[1] ?? "";
474
-
475
- return domain;
476
- } catch (error) {
477
- if (import.meta.env.DEV) {
478
- console.error("Failed to detect Git provider:", error);
479
- }
480
-
481
- return "_unknown";
482
- }
483
- }
484
-
485
- async #fetch(
486
- url: URL,
487
- config?: {
488
- method?: "POST" | "PUT" | "DELETE";
489
- body?: unknown;
490
- },
491
- ) {
492
- const authenticationToken = await this.user.getAuthenticationToken();
493
-
494
- return await fetch(url, {
495
- method: config?.method,
496
- body: config?.body ? JSON.stringify(config.body) : undefined,
497
- headers: {
498
- Authorization: `Bearer ${authenticationToken}`,
499
- },
500
- });
501
- }
502
- }
@@ -1,24 +0,0 @@
1
- import { GitRepoSpecifier } from "./types";
2
-
3
- /**
4
- * Builds a Git repository specifier from its individual parts.
5
- *
6
- * @example
7
- *
8
- * ```typescript
9
- * buildGitRepoSpecifier({
10
- * provider: "gitHub",
11
- * owner: "foo",
12
- * name: "bar",
13
- * });
14
- * ```
15
- *
16
- * @param repoSpecifier - The Git repository specifier.
17
- *
18
- * @returns The specifier in the form of `provider@owner/name`.
19
- */
20
- export const buildGitRepoSpecifier = (
21
- repoSpecifier: GitRepoSpecifier,
22
- ): string => {
23
- return `${repoSpecifier.provider}@${repoSpecifier.owner}/${repoSpecifier.name}`;
24
- };
@@ -1,26 +0,0 @@
1
- import { GitProvider } from "../../constants/GIT_PROVIDER";
2
-
3
- export type GitOwner = {
4
- provider: GitProvider;
5
- id: string;
6
- name: string;
7
- // If type is null, the owner's type could not be determined. This can
8
- // happen if a Git provider uses an owner type that we do not support.
9
- // Owners with a null type should still be usable like any other owner.
10
- type: "user" | "team" | null;
11
- };
12
-
13
- export type GitRepo = {
14
- provider: GitProvider;
15
- id: string;
16
- owner: string;
17
- name: string;
18
- url: string;
19
- pushedAt: Date;
20
- };
21
-
22
- export type GitRepoSpecifier = {
23
- provider: GitProvider;
24
- owner: string;
25
- name: string;
26
- };