@slicemachine/manager 0.1.1-dev-plugins-m3.8 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_node_modules/common-tags/es/stripIndent/stripIndent.cjs +1 -2
- package/dist/_node_modules/common-tags/es/stripIndent/stripIndent.cjs.map +1 -1
- package/dist/_node_modules/common-tags/es/stripIndent/stripIndent.js +1 -2
- package/dist/_node_modules/common-tags/es/stripIndent/stripIndent.js.map +1 -1
- package/dist/auth/PrismicAuthManager.d.ts +58 -58
- package/dist/auth/createPrismicAuthManager.d.ts +4 -4
- package/dist/auth/createPrismicAuthManagerMiddleware.d.ts +14 -14
- package/dist/client/index.d.ts +6 -6
- package/dist/constants/API_ENDPOINTS.d.ts +8 -8
- package/dist/constants/API_TOKENS.d.ts +5 -5
- package/dist/constants/APPLICATION_MODE.d.ts +5 -5
- package/dist/constants/DEFAULT_SLICE_SCREENSHOT_URL.d.ts +5 -5
- package/dist/constants/SLICE_MACHINE_CONFIG_FILENAME.d.ts +1 -1
- package/dist/constants/SLICE_MACHINE_GITHUB_PACKAGE_NAME.d.ts +1 -1
- package/dist/constants/SLICE_MACHINE_GITHUB_REPOSITORY_NAME.d.ts +1 -1
- package/dist/constants/SLICE_MACHINE_GITHUB_REPOSITORY_ORGANIZATION.d.ts +1 -1
- package/dist/constants/SLICE_MACHINE_NPM_PACKAGE_NAME.d.ts +1 -1
- package/dist/constants/SLICE_MACHINE_USER_AGENT.d.ts +1 -1
- package/dist/constants/TS_CONFIG_FILENAME.d.ts +1 -1
- package/dist/constants/VERSION_KIND.d.ts +6 -6
- package/dist/errors.d.ts +34 -34
- package/dist/index.d.ts +11 -11
- package/dist/lib/DecodeError.d.ts +12 -12
- package/dist/lib/addTrailingSlash.d.ts +1 -1
- package/dist/lib/assertPluginsInitialized.d.ts +2 -2
- package/dist/lib/bufferCodec.d.ts +4 -4
- package/dist/lib/buildPrismicRepositoryAPIEndpoint.d.ts +4 -4
- package/dist/lib/castArray.d.ts +1 -1
- package/dist/lib/checkIsURLAccessible.d.ts +1 -1
- package/dist/lib/createContentDigest.d.ts +9 -9
- package/dist/lib/decode.d.ts +10 -10
- package/dist/lib/decodeHookResult.d.ts +10 -10
- package/dist/lib/decodePackageJSON.d.ts +12 -12
- package/dist/lib/decodeSliceMachineConfig.d.ts +3 -3
- package/dist/lib/fetchGitHubReleaseBodyForRelease.d.ts +21 -21
- package/dist/lib/fetchNPMPackageVersions.d.ts +5 -5
- package/dist/lib/format.d.ts +12 -12
- package/dist/lib/functionCodec.d.ts +2 -2
- package/dist/lib/installDependencies.d.ts +13 -13
- package/dist/lib/locateFileUpward.d.ts +10 -10
- package/dist/lib/markdownToHTML.d.ts +1 -1
- package/dist/lib/mockSlice.d.ts +9 -9
- package/dist/lib/prismicrc.d.ts +10 -10
- package/dist/lib/serializeCookies.d.ts +6 -6
- package/dist/managers/BaseManager.d.ts +33 -33
- package/dist/managers/SliceMachineManager.d.ts +95 -95
- package/dist/managers/createSliceMachineManager.d.ts +5 -5
- package/dist/managers/createSliceMachineManagerClient.d.ts +8 -8
- package/dist/managers/createSliceMachineManagerMiddleware.d.ts +15 -15
- package/dist/managers/customTypes/CustomTypesManager.d.ts +56 -56
- package/dist/managers/plugins/PluginsManager.d.ts +13 -13
- package/dist/managers/prismicRepository/PrismicRepositoryManager.d.ts +30 -30
- package/dist/managers/prismicRepository/types.d.ts +123 -123
- package/dist/managers/project/ProjectManager.d.ts +49 -49
- package/dist/managers/screenshots/ScreenshotsManager.cjs +1 -1
- package/dist/managers/screenshots/ScreenshotsManager.cjs.map +1 -1
- package/dist/managers/screenshots/ScreenshotsManager.d.ts +34 -34
- package/dist/managers/screenshots/ScreenshotsManager.js +1 -1
- package/dist/managers/screenshots/ScreenshotsManager.js.map +1 -1
- package/dist/managers/simulator/SimulatorManager.d.ts +38 -38
- package/dist/managers/slices/SlicesManager.d.ts +128 -128
- package/dist/managers/snippets/SnippetsManager.d.ts +11 -11
- package/dist/managers/telemetry/TelemetryManager.d.ts +30 -30
- package/dist/managers/telemetry/types.d.ts +143 -143
- package/dist/managers/user/UserManager.d.ts +40 -40
- package/dist/managers/versions/VersionsManager.d.ts +19 -19
- package/dist/managers/versions/types.d.ts +5 -5
- package/dist/test/createSliceMachineManagerMSWHandler.d.ts +7 -7
- package/dist/test/index.d.ts +2 -2
- package/dist/types.d.ts +45 -45
- package/package.json +4 -4
- package/src/managers/screenshots/ScreenshotsManager.ts +1 -1
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
import { BaseManager } from "../BaseManager";
|
|
2
|
-
import { PrismicRepository, TransactionalMergeArgs, TransactionalMergeReturnType } from "./types";
|
|
3
|
-
type PrismicRepositoryManagerCheckExistsArgs = {
|
|
4
|
-
domain: string;
|
|
5
|
-
};
|
|
6
|
-
type PrismicRepositoryManagerCreateArgs = {
|
|
7
|
-
domain: string;
|
|
8
|
-
framework: string;
|
|
9
|
-
};
|
|
10
|
-
type PrismicRepositoryManagerDeleteArgs = {
|
|
11
|
-
domain: string;
|
|
12
|
-
password: string;
|
|
13
|
-
};
|
|
14
|
-
type PrismicRepositoryManagerPushDocumentsArgs = {
|
|
15
|
-
domain: string;
|
|
16
|
-
signature: string;
|
|
17
|
-
documents: Record<string, unknown>;
|
|
18
|
-
};
|
|
19
|
-
export declare class PrismicRepositoryManager extends BaseManager {
|
|
20
|
-
readAll(): Promise<PrismicRepository[]>;
|
|
21
|
-
hasWriteAccess(repository: PrismicRepository): boolean;
|
|
22
|
-
checkExists(args: PrismicRepositoryManagerCheckExistsArgs): Promise<boolean>;
|
|
23
|
-
create(args: PrismicRepositoryManagerCreateArgs): Promise<void>;
|
|
24
|
-
delete(args: PrismicRepositoryManagerDeleteArgs): Promise<void>;
|
|
25
|
-
pushDocuments(args: PrismicRepositoryManagerPushDocumentsArgs): Promise<void>;
|
|
26
|
-
pushChanges(args: TransactionalMergeArgs): Promise<TransactionalMergeReturnType>;
|
|
27
|
-
private _decodeLimitOrThrow;
|
|
28
|
-
private _fetch;
|
|
29
|
-
}
|
|
30
|
-
export {};
|
|
1
|
+
import { BaseManager } from "../BaseManager";
|
|
2
|
+
import { PrismicRepository, TransactionalMergeArgs, TransactionalMergeReturnType } from "./types";
|
|
3
|
+
type PrismicRepositoryManagerCheckExistsArgs = {
|
|
4
|
+
domain: string;
|
|
5
|
+
};
|
|
6
|
+
type PrismicRepositoryManagerCreateArgs = {
|
|
7
|
+
domain: string;
|
|
8
|
+
framework: string;
|
|
9
|
+
};
|
|
10
|
+
type PrismicRepositoryManagerDeleteArgs = {
|
|
11
|
+
domain: string;
|
|
12
|
+
password: string;
|
|
13
|
+
};
|
|
14
|
+
type PrismicRepositoryManagerPushDocumentsArgs = {
|
|
15
|
+
domain: string;
|
|
16
|
+
signature: string;
|
|
17
|
+
documents: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
export declare class PrismicRepositoryManager extends BaseManager {
|
|
20
|
+
readAll(): Promise<PrismicRepository[]>;
|
|
21
|
+
hasWriteAccess(repository: PrismicRepository): boolean;
|
|
22
|
+
checkExists(args: PrismicRepositoryManagerCheckExistsArgs): Promise<boolean>;
|
|
23
|
+
create(args: PrismicRepositoryManagerCreateArgs): Promise<void>;
|
|
24
|
+
delete(args: PrismicRepositoryManagerDeleteArgs): Promise<void>;
|
|
25
|
+
pushDocuments(args: PrismicRepositoryManagerPushDocumentsArgs): Promise<void>;
|
|
26
|
+
pushChanges(args: TransactionalMergeArgs): Promise<TransactionalMergeReturnType>;
|
|
27
|
+
private _decodeLimitOrThrow;
|
|
28
|
+
private _fetch;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
import { CustomType, SharedSlice } from "@prismicio/types-internal/lib/customtypes";
|
|
2
|
-
import * as t from "io-ts";
|
|
3
|
-
export declare const PrismicRepositoryUserAgent: {
|
|
4
|
-
readonly SliceMachine: "prismic-cli/sm";
|
|
5
|
-
readonly LegacyZero: "prismic-cli/0";
|
|
6
|
-
};
|
|
7
|
-
export type PrismicRepositoryUserAgents = (typeof PrismicRepositoryUserAgent)[keyof typeof PrismicRepositoryUserAgent];
|
|
8
|
-
export declare const PrismicRepositoryRole: {
|
|
9
|
-
readonly SuperUser: "SuperUser";
|
|
10
|
-
readonly Administrator: "Administrator";
|
|
11
|
-
readonly Owner: "Owner";
|
|
12
|
-
readonly Manager: "Manager";
|
|
13
|
-
readonly Publisher: "Publisher";
|
|
14
|
-
readonly Writer: "Writer";
|
|
15
|
-
readonly Readonly: "Readonly";
|
|
16
|
-
};
|
|
17
|
-
export type PrismicRepositoryRoles = (typeof PrismicRepositoryRole)[keyof typeof PrismicRepositoryRole];
|
|
18
|
-
export declare const PrismicRepository: t.TypeC<{
|
|
19
|
-
domain: t.StringC;
|
|
20
|
-
name: t.StringC;
|
|
21
|
-
role: t.UnionC<[t.KeyofC<{
|
|
22
|
-
readonly SuperUser: "SuperUser";
|
|
23
|
-
readonly Administrator: "Administrator";
|
|
24
|
-
readonly Owner: "Owner";
|
|
25
|
-
readonly Manager: "Manager";
|
|
26
|
-
readonly Publisher: "Publisher";
|
|
27
|
-
readonly Writer: "Writer";
|
|
28
|
-
readonly Readonly: "Readonly";
|
|
29
|
-
}>, t.RecordC<t.StringC, t.KeyofC<{
|
|
30
|
-
readonly SuperUser: "SuperUser";
|
|
31
|
-
readonly Administrator: "Administrator";
|
|
32
|
-
readonly Owner: "Owner";
|
|
33
|
-
readonly Manager: "Manager";
|
|
34
|
-
readonly Publisher: "Publisher";
|
|
35
|
-
readonly Writer: "Writer";
|
|
36
|
-
readonly Readonly: "Readonly";
|
|
37
|
-
}>>]>;
|
|
38
|
-
}>;
|
|
39
|
-
export type PrismicRepository = t.TypeOf<typeof PrismicRepository>;
|
|
40
|
-
export declare enum ChangeTypes {
|
|
41
|
-
SLICE_INSERT = "SLICE_INSERT",
|
|
42
|
-
SLICE_UPDATE = "SLICE_UPDATE",
|
|
43
|
-
SLICE_DELETE = "SLICE_DELETE",
|
|
44
|
-
CUSTOM_TYPE_INSERT = "CUSTOM_TYPE_INSERT",
|
|
45
|
-
CUSTOM_TYPE_UPDATE = "CUSTOM_TYPE_UPDATE",
|
|
46
|
-
CUSTOM_TYPE_DELETE = "CUSTOM_TYPE_DELETE"
|
|
47
|
-
}
|
|
48
|
-
interface Change {
|
|
49
|
-
type: ChangeTypes;
|
|
50
|
-
id: string;
|
|
51
|
-
payload: Record<string, unknown>;
|
|
52
|
-
}
|
|
53
|
-
interface DeleteChange extends Change {
|
|
54
|
-
payload: {
|
|
55
|
-
id: Change["id"];
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
export interface SliceInsertChange extends Change {
|
|
59
|
-
type: ChangeTypes.SLICE_INSERT;
|
|
60
|
-
payload: SharedSlice;
|
|
61
|
-
}
|
|
62
|
-
export interface SliceUpdateChange extends Change {
|
|
63
|
-
type: ChangeTypes.SLICE_UPDATE;
|
|
64
|
-
payload: SharedSlice;
|
|
65
|
-
}
|
|
66
|
-
export interface SliceDeleteChange extends DeleteChange {
|
|
67
|
-
type: ChangeTypes.SLICE_DELETE;
|
|
68
|
-
}
|
|
69
|
-
export interface CustomTypeInsertChange extends Change {
|
|
70
|
-
type: ChangeTypes.CUSTOM_TYPE_INSERT;
|
|
71
|
-
payload: CustomType;
|
|
72
|
-
}
|
|
73
|
-
export interface CustomTypeUpdateChange extends Change {
|
|
74
|
-
type: ChangeTypes.CUSTOM_TYPE_UPDATE;
|
|
75
|
-
payload: CustomType;
|
|
76
|
-
}
|
|
77
|
-
export interface CustomTypeDeleteChange extends DeleteChange {
|
|
78
|
-
type: ChangeTypes.CUSTOM_TYPE_DELETE;
|
|
79
|
-
}
|
|
80
|
-
export type AllChangeTypes = SliceInsertChange | SliceUpdateChange | SliceDeleteChange | CustomTypeInsertChange | CustomTypeUpdateChange | CustomTypeDeleteChange;
|
|
81
|
-
export interface BulkBody extends Record<string, unknown> {
|
|
82
|
-
confirmDeleteDocuments: boolean;
|
|
83
|
-
changes: AllChangeTypes[];
|
|
84
|
-
}
|
|
85
|
-
export declare const RawLimit: t.TypeC<{
|
|
86
|
-
details: t.TypeC<{
|
|
87
|
-
customTypes: t.ArrayC<t.TypeC<{
|
|
88
|
-
id: t.StringC;
|
|
89
|
-
numberOfDocuments: t.NumberC;
|
|
90
|
-
url: t.StringC;
|
|
91
|
-
}>>;
|
|
92
|
-
}>;
|
|
93
|
-
}>;
|
|
94
|
-
export type RawLimit = t.TypeOf<typeof RawLimit>;
|
|
95
|
-
export declare enum LimitType {
|
|
96
|
-
SOFT = "SOFT",
|
|
97
|
-
HARD = "HARD"
|
|
98
|
-
}
|
|
99
|
-
export type Limit = RawLimit & {
|
|
100
|
-
type: LimitType;
|
|
101
|
-
};
|
|
102
|
-
export interface ClientError {
|
|
103
|
-
status: number;
|
|
104
|
-
message: string;
|
|
105
|
-
}
|
|
106
|
-
type ChangeStatus = "NEW" | "MODIFIED" | "DELETED";
|
|
107
|
-
type CustomTypeChange = {
|
|
108
|
-
id: string;
|
|
109
|
-
type: "CustomType";
|
|
110
|
-
status: ChangeStatus;
|
|
111
|
-
};
|
|
112
|
-
type SliceChange = {
|
|
113
|
-
id: string;
|
|
114
|
-
type: "Slice";
|
|
115
|
-
status: ChangeStatus;
|
|
116
|
-
libraryID: string;
|
|
117
|
-
};
|
|
118
|
-
export type TransactionalMergeArgs = {
|
|
119
|
-
confirmDeleteDocuments: boolean;
|
|
120
|
-
changes: (CustomTypeChange | SliceChange)[];
|
|
121
|
-
};
|
|
122
|
-
export type TransactionalMergeReturnType = Limit | null;
|
|
123
|
-
export {};
|
|
1
|
+
import { CustomType, SharedSlice } from "@prismicio/types-internal/lib/customtypes";
|
|
2
|
+
import * as t from "io-ts";
|
|
3
|
+
export declare const PrismicRepositoryUserAgent: {
|
|
4
|
+
readonly SliceMachine: "prismic-cli/sm";
|
|
5
|
+
readonly LegacyZero: "prismic-cli/0";
|
|
6
|
+
};
|
|
7
|
+
export type PrismicRepositoryUserAgents = (typeof PrismicRepositoryUserAgent)[keyof typeof PrismicRepositoryUserAgent];
|
|
8
|
+
export declare const PrismicRepositoryRole: {
|
|
9
|
+
readonly SuperUser: "SuperUser";
|
|
10
|
+
readonly Administrator: "Administrator";
|
|
11
|
+
readonly Owner: "Owner";
|
|
12
|
+
readonly Manager: "Manager";
|
|
13
|
+
readonly Publisher: "Publisher";
|
|
14
|
+
readonly Writer: "Writer";
|
|
15
|
+
readonly Readonly: "Readonly";
|
|
16
|
+
};
|
|
17
|
+
export type PrismicRepositoryRoles = (typeof PrismicRepositoryRole)[keyof typeof PrismicRepositoryRole];
|
|
18
|
+
export declare const PrismicRepository: t.TypeC<{
|
|
19
|
+
domain: t.StringC;
|
|
20
|
+
name: t.StringC;
|
|
21
|
+
role: t.UnionC<[t.KeyofC<{
|
|
22
|
+
readonly SuperUser: "SuperUser";
|
|
23
|
+
readonly Administrator: "Administrator";
|
|
24
|
+
readonly Owner: "Owner";
|
|
25
|
+
readonly Manager: "Manager";
|
|
26
|
+
readonly Publisher: "Publisher";
|
|
27
|
+
readonly Writer: "Writer";
|
|
28
|
+
readonly Readonly: "Readonly";
|
|
29
|
+
}>, t.RecordC<t.StringC, t.KeyofC<{
|
|
30
|
+
readonly SuperUser: "SuperUser";
|
|
31
|
+
readonly Administrator: "Administrator";
|
|
32
|
+
readonly Owner: "Owner";
|
|
33
|
+
readonly Manager: "Manager";
|
|
34
|
+
readonly Publisher: "Publisher";
|
|
35
|
+
readonly Writer: "Writer";
|
|
36
|
+
readonly Readonly: "Readonly";
|
|
37
|
+
}>>]>;
|
|
38
|
+
}>;
|
|
39
|
+
export type PrismicRepository = t.TypeOf<typeof PrismicRepository>;
|
|
40
|
+
export declare enum ChangeTypes {
|
|
41
|
+
SLICE_INSERT = "SLICE_INSERT",
|
|
42
|
+
SLICE_UPDATE = "SLICE_UPDATE",
|
|
43
|
+
SLICE_DELETE = "SLICE_DELETE",
|
|
44
|
+
CUSTOM_TYPE_INSERT = "CUSTOM_TYPE_INSERT",
|
|
45
|
+
CUSTOM_TYPE_UPDATE = "CUSTOM_TYPE_UPDATE",
|
|
46
|
+
CUSTOM_TYPE_DELETE = "CUSTOM_TYPE_DELETE"
|
|
47
|
+
}
|
|
48
|
+
interface Change {
|
|
49
|
+
type: ChangeTypes;
|
|
50
|
+
id: string;
|
|
51
|
+
payload: Record<string, unknown>;
|
|
52
|
+
}
|
|
53
|
+
interface DeleteChange extends Change {
|
|
54
|
+
payload: {
|
|
55
|
+
id: Change["id"];
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export interface SliceInsertChange extends Change {
|
|
59
|
+
type: ChangeTypes.SLICE_INSERT;
|
|
60
|
+
payload: SharedSlice;
|
|
61
|
+
}
|
|
62
|
+
export interface SliceUpdateChange extends Change {
|
|
63
|
+
type: ChangeTypes.SLICE_UPDATE;
|
|
64
|
+
payload: SharedSlice;
|
|
65
|
+
}
|
|
66
|
+
export interface SliceDeleteChange extends DeleteChange {
|
|
67
|
+
type: ChangeTypes.SLICE_DELETE;
|
|
68
|
+
}
|
|
69
|
+
export interface CustomTypeInsertChange extends Change {
|
|
70
|
+
type: ChangeTypes.CUSTOM_TYPE_INSERT;
|
|
71
|
+
payload: CustomType;
|
|
72
|
+
}
|
|
73
|
+
export interface CustomTypeUpdateChange extends Change {
|
|
74
|
+
type: ChangeTypes.CUSTOM_TYPE_UPDATE;
|
|
75
|
+
payload: CustomType;
|
|
76
|
+
}
|
|
77
|
+
export interface CustomTypeDeleteChange extends DeleteChange {
|
|
78
|
+
type: ChangeTypes.CUSTOM_TYPE_DELETE;
|
|
79
|
+
}
|
|
80
|
+
export type AllChangeTypes = SliceInsertChange | SliceUpdateChange | SliceDeleteChange | CustomTypeInsertChange | CustomTypeUpdateChange | CustomTypeDeleteChange;
|
|
81
|
+
export interface BulkBody extends Record<string, unknown> {
|
|
82
|
+
confirmDeleteDocuments: boolean;
|
|
83
|
+
changes: AllChangeTypes[];
|
|
84
|
+
}
|
|
85
|
+
export declare const RawLimit: t.TypeC<{
|
|
86
|
+
details: t.TypeC<{
|
|
87
|
+
customTypes: t.ArrayC<t.TypeC<{
|
|
88
|
+
id: t.StringC;
|
|
89
|
+
numberOfDocuments: t.NumberC;
|
|
90
|
+
url: t.StringC;
|
|
91
|
+
}>>;
|
|
92
|
+
}>;
|
|
93
|
+
}>;
|
|
94
|
+
export type RawLimit = t.TypeOf<typeof RawLimit>;
|
|
95
|
+
export declare enum LimitType {
|
|
96
|
+
SOFT = "SOFT",
|
|
97
|
+
HARD = "HARD"
|
|
98
|
+
}
|
|
99
|
+
export type Limit = RawLimit & {
|
|
100
|
+
type: LimitType;
|
|
101
|
+
};
|
|
102
|
+
export interface ClientError {
|
|
103
|
+
status: number;
|
|
104
|
+
message: string;
|
|
105
|
+
}
|
|
106
|
+
type ChangeStatus = "NEW" | "MODIFIED" | "DELETED";
|
|
107
|
+
type CustomTypeChange = {
|
|
108
|
+
id: string;
|
|
109
|
+
type: "CustomType";
|
|
110
|
+
status: ChangeStatus;
|
|
111
|
+
};
|
|
112
|
+
type SliceChange = {
|
|
113
|
+
id: string;
|
|
114
|
+
type: "Slice";
|
|
115
|
+
status: ChangeStatus;
|
|
116
|
+
libraryID: string;
|
|
117
|
+
};
|
|
118
|
+
export type TransactionalMergeArgs = {
|
|
119
|
+
confirmDeleteDocuments: boolean;
|
|
120
|
+
changes: (CustomTypeChange | SliceChange)[];
|
|
121
|
+
};
|
|
122
|
+
export type TransactionalMergeReturnType = Limit | null;
|
|
123
|
+
export {};
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { ExecaChildProcess } from "execa";
|
|
2
|
-
import { PackageManager, SliceMachineConfig } from "../../types";
|
|
3
|
-
import { BaseManager } from "../BaseManager";
|
|
4
|
-
type ProjectManagerGetSliceMachineConfigPathArgs = {
|
|
5
|
-
ignoreCache?: boolean;
|
|
6
|
-
};
|
|
7
|
-
type ProjectManagerGetRootArgs = {
|
|
8
|
-
ignoreCache?: boolean;
|
|
9
|
-
};
|
|
10
|
-
type ProjectManagerCheckIsTypeScriptArgs = {
|
|
11
|
-
rootOverride?: string;
|
|
12
|
-
};
|
|
13
|
-
type ProjectManagerWriteSliceMachineConfigArgs = {
|
|
14
|
-
config: SliceMachineConfig;
|
|
15
|
-
path?: string;
|
|
16
|
-
};
|
|
17
|
-
type ProjectManagerInitProjectArgs = {
|
|
18
|
-
log?: (message: string) => void;
|
|
19
|
-
};
|
|
20
|
-
type ProjectManagerDetectPackageManager = {
|
|
21
|
-
root?: string;
|
|
22
|
-
};
|
|
23
|
-
type ProjectManagerInstallDependenciesArgs = {
|
|
24
|
-
dependencies: Record<string, string>;
|
|
25
|
-
dev?: boolean;
|
|
26
|
-
packageManager?: PackageManager;
|
|
27
|
-
log?: (message: string) => void;
|
|
28
|
-
};
|
|
29
|
-
type ProjectManagerInstallDependenciesReturnType = {
|
|
30
|
-
execaProcess: ExecaChildProcess;
|
|
31
|
-
};
|
|
32
|
-
export declare class ProjectManager extends BaseManager {
|
|
33
|
-
private _cachedRoot;
|
|
34
|
-
private _cachedSliceMachineConfigPath;
|
|
35
|
-
private _cachedSliceMachineConfig;
|
|
36
|
-
getSliceMachineConfigPath(args?: ProjectManagerGetSliceMachineConfigPathArgs): Promise<string>;
|
|
37
|
-
getRoot(args?: ProjectManagerGetRootArgs): Promise<string>;
|
|
38
|
-
suggestRoot(): Promise<string>;
|
|
39
|
-
suggestSliceMachineConfigPath(): Promise<string>;
|
|
40
|
-
checkIsTypeScript(args?: ProjectManagerCheckIsTypeScriptArgs): Promise<boolean>;
|
|
41
|
-
getSliceMachineConfig(): Promise<SliceMachineConfig>;
|
|
42
|
-
writeSliceMachineConfig(args: ProjectManagerWriteSliceMachineConfigArgs): Promise<void>;
|
|
43
|
-
loadSliceMachineConfig(): Promise<SliceMachineConfig>;
|
|
44
|
-
locateSliceMachineUIDir(): Promise<string>;
|
|
45
|
-
initProject(args?: ProjectManagerInitProjectArgs): Promise<void>;
|
|
46
|
-
detectPackageManager(args?: ProjectManagerDetectPackageManager): Promise<PackageManager>;
|
|
47
|
-
installDependencies(args: ProjectManagerInstallDependenciesArgs): Promise<ProjectManagerInstallDependenciesReturnType>;
|
|
48
|
-
}
|
|
49
|
-
export {};
|
|
1
|
+
import { ExecaChildProcess } from "execa";
|
|
2
|
+
import { PackageManager, SliceMachineConfig } from "../../types";
|
|
3
|
+
import { BaseManager } from "../BaseManager";
|
|
4
|
+
type ProjectManagerGetSliceMachineConfigPathArgs = {
|
|
5
|
+
ignoreCache?: boolean;
|
|
6
|
+
};
|
|
7
|
+
type ProjectManagerGetRootArgs = {
|
|
8
|
+
ignoreCache?: boolean;
|
|
9
|
+
};
|
|
10
|
+
type ProjectManagerCheckIsTypeScriptArgs = {
|
|
11
|
+
rootOverride?: string;
|
|
12
|
+
};
|
|
13
|
+
type ProjectManagerWriteSliceMachineConfigArgs = {
|
|
14
|
+
config: SliceMachineConfig;
|
|
15
|
+
path?: string;
|
|
16
|
+
};
|
|
17
|
+
type ProjectManagerInitProjectArgs = {
|
|
18
|
+
log?: (message: string) => void;
|
|
19
|
+
};
|
|
20
|
+
type ProjectManagerDetectPackageManager = {
|
|
21
|
+
root?: string;
|
|
22
|
+
};
|
|
23
|
+
type ProjectManagerInstallDependenciesArgs = {
|
|
24
|
+
dependencies: Record<string, string>;
|
|
25
|
+
dev?: boolean;
|
|
26
|
+
packageManager?: PackageManager;
|
|
27
|
+
log?: (message: string) => void;
|
|
28
|
+
};
|
|
29
|
+
type ProjectManagerInstallDependenciesReturnType = {
|
|
30
|
+
execaProcess: ExecaChildProcess;
|
|
31
|
+
};
|
|
32
|
+
export declare class ProjectManager extends BaseManager {
|
|
33
|
+
private _cachedRoot;
|
|
34
|
+
private _cachedSliceMachineConfigPath;
|
|
35
|
+
private _cachedSliceMachineConfig;
|
|
36
|
+
getSliceMachineConfigPath(args?: ProjectManagerGetSliceMachineConfigPathArgs): Promise<string>;
|
|
37
|
+
getRoot(args?: ProjectManagerGetRootArgs): Promise<string>;
|
|
38
|
+
suggestRoot(): Promise<string>;
|
|
39
|
+
suggestSliceMachineConfigPath(): Promise<string>;
|
|
40
|
+
checkIsTypeScript(args?: ProjectManagerCheckIsTypeScriptArgs): Promise<boolean>;
|
|
41
|
+
getSliceMachineConfig(): Promise<SliceMachineConfig>;
|
|
42
|
+
writeSliceMachineConfig(args: ProjectManagerWriteSliceMachineConfigArgs): Promise<void>;
|
|
43
|
+
loadSliceMachineConfig(): Promise<SliceMachineConfig>;
|
|
44
|
+
locateSliceMachineUIDir(): Promise<string>;
|
|
45
|
+
initProject(args?: ProjectManagerInitProjectArgs): Promise<void>;
|
|
46
|
+
detectPackageManager(args?: ProjectManagerDetectPackageManager): Promise<PackageManager>;
|
|
47
|
+
installDependencies(args: ProjectManagerInstallDependenciesArgs): Promise<ProjectManagerInstallDependenciesReturnType>;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -97,7 +97,7 @@ class ScreenshotsManager extends BaseManager.BaseManager {
|
|
|
97
97
|
} catch {
|
|
98
98
|
throw new errors.InternalError("Screenshots require Puppeteer but Puppeteer was not found. Check that the `puppeteer` package is installed before trying again.");
|
|
99
99
|
}
|
|
100
|
-
const browser = await puppeteer.launch();
|
|
100
|
+
const browser = await puppeteer.launch({ headless: "new" });
|
|
101
101
|
this._browserContext = await browser.createIncognitoBrowserContext();
|
|
102
102
|
}
|
|
103
103
|
async initS3ACL() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScreenshotsManager.cjs","sources":["../../../../src/managers/screenshots/ScreenshotsManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { fileTypeFromBuffer } from \"file-type\";\nimport fetch, { FormData, Blob, Response } from \"node-fetch\";\n// puppeteer is lazy-loaded in captureSliceSimulatorScreenshot\nimport type { BrowserContext, Viewport } from \"puppeteer\";\n\nimport { checkIsURLAccessible } from \"../../lib/checkIsURLAccessible\";\nimport { createContentDigest } from \"../../lib/createContentDigest\";\nimport { decode } from \"../../lib/decode\";\n\nimport { S3ACL } from \"../../types\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { InternalError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst SLICE_SIMULATOR_WAIT_FOR_SELECTOR = \"#__iframe-ready\";\nconst SLICE_SIMULATOR_WAIT_FOR_SELECTOR_TIMEOUT = 10_000; // ms\nconst SLICE_SIMULATOR_SCREENSHOT_SELECTOR = \"#__iframe-renderer\";\n\nconst DEFAULT_SCREENSHOT_VIEWPORT: Viewport = {\n\twidth: 1200,\n\theight: 800,\n};\n\nfunction assertS3ACLInitialized(\n\ts3ACL: S3ACL | undefined,\n): asserts s3ACL is NonNullable<typeof s3ACL> {\n\tif (s3ACL == undefined) {\n\t\tthrow new Error(\n\t\t\t\"An S3 ACL has not been initialized. Run `SliceMachineManager.screenshots.prototype.initS3ACL()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nfunction assertBrowserContextInitialized(\n\tbrowserContext: BrowserContext | undefined,\n): asserts browserContext is NonNullable<typeof browserContext> {\n\tif (browserContext == undefined) {\n\t\tthrow new Error(\n\t\t\t\"A browser context has not been initialized. Run `SliceMachineManager.screenshots.prototype.initBrowserContext()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\n/**\n * Encodes a part of a Slice Simulator URL to ensure it can be added to a URL\n * safely.\n *\n * The encoding logic must match Slice Machine UI's URL encoding practices.\n * Today, that requires the following:\n *\n * - Replace \"/\" with \"--\" (e.g. a Slice Library ID of \"./slices\" should turn into\n * \".--slices\")\n *\n * @param urlPart - A part of the URL.\n *\n * @returns `urlPart` encoded for use in a URL.\n */\nconst encodeSliceSimulatorURLPart = (urlPart: string): string => {\n\treturn urlPart.replace(/\\//g, \"--\");\n};\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs = {\n\tsliceMachineUIOrigin: string;\n\tlibraryID: string;\n\tsliceID: string;\n\tvariationID: string;\n\tviewport?: Viewport;\n};\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType = {\n\tdata: Buffer;\n};\n\ntype ScreenshotsManagerUploadScreenshotArgs = {\n\tdata: Buffer;\n\tkeyPrefix?: string;\n};\n\ntype ScreenshotsManagerUploadScreenshotReturnType = {\n\turl: string;\n};\n\ntype ScreenshotsManagerDeleteScreenshotFolderArgs = {\n\tsliceID: string;\n};\n\nexport class ScreenshotsManager extends BaseManager {\n\tprivate _browserContext: BrowserContext | undefined;\n\tprivate _s3ACL: S3ACL | undefined;\n\n\tasync initBrowserContext(): Promise<void> {\n\t\tif (this._browserContext) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet puppeteer: typeof import(\"puppeteer\");\n\t\ttry {\n\t\t\t// Lazy-load Puppeteer only once it is needed.\n\t\t\tpuppeteer = await import(\"puppeteer\");\n\t\t} catch {\n\t\t\tthrow new InternalError(\n\t\t\t\t\"Screenshots require Puppeteer but Puppeteer was not found. Check that the `puppeteer` package is installed before trying again.\",\n\t\t\t);\n\t\t}\n\n\t\tconst browser = await puppeteer.launch();\n\n\t\tthis._browserContext = await browser.createIncognitoBrowserContext();\n\t}\n\n\tasync initS3ACL(): Promise<void> {\n\t\tif (this._s3ACL) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst awsACLURL = new URL(\"create\", API_ENDPOINTS.AwsAclProvider);\n\t\tconst awsACLRes = await this._fetch({ url: awsACLURL });\n\n\t\tconst awsACLText = await awsACLRes.text();\n\t\tlet awsACLJSON: unknown;\n\t\ttry {\n\t\t\tawsACLJSON = JSON.parse(awsACLText);\n\t\t} catch (error) {\n\t\t\t// Response is not JSON\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid AWS ACL response from ${awsACLURL}: ${awsACLText}`,\n\t\t\t);\n\t\t}\n\n\t\tconst { value: awsACL, error } = decode(\n\t\t\tt.intersection([\n\t\t\t\tt.type({\n\t\t\t\t\tvalues: t.type({\n\t\t\t\t\t\turl: t.string,\n\t\t\t\t\t\tfields: t.record(t.string, t.string),\n\t\t\t\t\t}),\n\t\t\t\t\timgixEndpoint: t.string,\n\t\t\t\t}),\n\t\t\t\tt.partial({\n\t\t\t\t\tmessage: t.string,\n\t\t\t\t\tMessage: t.string,\n\t\t\t\t\terror: t.string,\n\t\t\t\t}),\n\t\t\t]),\n\t\t\tawsACLJSON,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new Error(`Invalid AWS ACL response from ${awsACLURL}`);\n\t\t}\n\n\t\tconst errorMessage = awsACL.error || awsACL.message || awsACL.Message;\n\t\tif (errorMessage) {\n\t\t\tthrow new Error(`Failed to create an AWS ACL: ${errorMessage}`);\n\t\t}\n\n\t\tthis._s3ACL = {\n\t\t\tuploadEndpoint: awsACL.values.url,\n\t\t\trequiredFormDataFields: awsACL.values.fields,\n\t\t\timgixEndpoint: awsACL.imgixEndpoint,\n\t\t};\n\t}\n\n\t// TODO: Abstract to a generic `captureScreenshot()` method that is\n\t// used within a Slice-specific method in SliceManager.\n\tasync captureSliceSimulatorScreenshot(\n\t\targs: ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs,\n\t): Promise<ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType> {\n\t\tassertBrowserContextInitialized(this._browserContext);\n\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\tif (!sliceMachineConfig.localSliceSimulatorURL) {\n\t\t\t// TODO: Provide a more helpful error message.\n\t\t\tthrow new Error(\n\t\t\t\t\"A local Slice Simulator URL must be configured in your Slice Machine configuration file.\",\n\t\t\t);\n\t\t}\n\n\t\tconst { model } = await this.slices.readSlice({\n\t\t\tlibraryID: args.libraryID,\n\t\t\tsliceID: args.sliceID,\n\t\t});\n\t\tif (!model) {\n\t\t\tthrow new Error(\n\t\t\t\t`Did not find a Slice in library \"${args.libraryID}\" with ID \"${args.sliceID}\".`,\n\t\t\t);\n\t\t}\n\n\t\tconst viewport = args.viewport || DEFAULT_SCREENSHOT_VIEWPORT;\n\n\t\t// TODO: Change `model.name` to `args.sliceID`?\n\t\t// Making that change would require changing the screenshot\n\t\t// page path in Slice Machine UI.\n\t\tconst url = new URL(\n\t\t\t`./${encodeSliceSimulatorURLPart(args.libraryID)}/${model.name}/${\n\t\t\t\targs.variationID\n\t\t\t}/screenshot`,\n\t\t\targs.sliceMachineUIOrigin,\n\t\t);\n\t\turl.searchParams.set(\"screenWidth\", viewport.width.toString());\n\t\turl.searchParams.set(\"screenHeight\", viewport.height.toString());\n\n\t\tconst isURLAccessible = await checkIsURLAccessible(url.toString());\n\n\t\tif (!isURLAccessible) {\n\t\t\tthrow new Error(\n\t\t\t\t`Slice Simulator screenshot URL is not accessible: ${url}`,\n\t\t\t);\n\t\t}\n\n\t\tconst page = await this._browserContext.newPage();\n\t\tpage.setViewport(viewport);\n\n\t\tawait page.goto(url.toString(), { waitUntil: [\"load\", \"networkidle0\"] });\n\t\tawait page.waitForSelector(SLICE_SIMULATOR_WAIT_FOR_SELECTOR, {\n\t\t\ttimeout: SLICE_SIMULATOR_WAIT_FOR_SELECTOR_TIMEOUT,\n\t\t});\n\n\t\tconst element = await page.$(SLICE_SIMULATOR_SCREENSHOT_SELECTOR);\n\t\tif (!element) {\n\t\t\tconst baseURL = new URL(url.pathname, url.origin);\n\n\t\t\tthrow new Error(\n\t\t\t\t`Slice Simulator did not find ${SLICE_SIMULATOR_WAIT_FOR_SELECTOR} on the page. Verify the URL is correct: ${baseURL}`,\n\t\t\t);\n\t\t}\n\n\t\tconst data = (await element.screenshot({\n\t\t\tencoding: \"binary\",\n\t\t\tclip: {\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t},\n\t\t})) as Buffer;\n\n\t\treturn {\n\t\t\tdata,\n\t\t};\n\t}\n\n\tasync uploadScreenshot(\n\t\targs: ScreenshotsManagerUploadScreenshotArgs,\n\t): Promise<ScreenshotsManagerUploadScreenshotReturnType> {\n\t\tassertS3ACLInitialized(this._s3ACL);\n\n\t\tconst formData = new FormData();\n\n\t\tfor (const requiredFormDataFieldKey in this._s3ACL.requiredFormDataFields) {\n\t\t\tformData.append(\n\t\t\t\trequiredFormDataFieldKey,\n\t\t\t\tthis._s3ACL.requiredFormDataFields[requiredFormDataFieldKey],\n\t\t\t);\n\t\t}\n\n\t\tconst contentDigest = createContentDigest(args.data);\n\t\tconst fileType = await fileTypeFromBuffer(args.data);\n\t\tconst fileName = fileType\n\t\t\t? `${contentDigest}.${fileType.ext}`\n\t\t\t: contentDigest;\n\t\tconst key = args.keyPrefix ? `${args.keyPrefix}/${fileName}` : fileName;\n\n\t\tformData.set(\"key\", key);\n\n\t\tif (fileType) {\n\t\t\tformData.set(\"Content-Type\", fileType.mime);\n\t\t}\n\n\t\tformData.set(\"file\", new Blob([args.data], { type: fileType?.mime }));\n\n\t\tconst res = await fetch(this._s3ACL.uploadEndpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: formData,\n\t\t});\n\n\t\tif (res.ok) {\n\t\t\tconst url = new URL(key, this._s3ACL.imgixEndpoint);\n\t\t\turl.searchParams.set(\"auto\", \"compress,format\");\n\n\t\t\treturn {\n\t\t\t\turl: url.toString(),\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Unable to upload screenshot with status code: ${res.status}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync deleteScreenshotFolder(\n\t\targs: ScreenshotsManagerDeleteScreenshotFolderArgs,\n\t): Promise<void> {\n\t\tconst res = await this._fetch({\n\t\t\t// We're sending `args.sliceID` as `sliceName` because it's inconsistently\n\t\t\t// named in the ACL Provider API.\n\t\t\tbody: { sliceName: args.sliceID },\n\t\t\tmethod: \"POST\",\n\t\t\turl: new URL(\"delete-folder\", API_ENDPOINTS.AwsAclProvider),\n\t\t});\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unable to delete screenshot folder with status code: ${res.status}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async _fetch(args: {\n\t\turl: URL;\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: unknown;\n\t}): Promise<Response> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\treturn await fetch(args.url, {\n\t\t\tbody: args.body ? JSON.stringify(args.body) : undefined,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t\tRepository: sliceMachineConfig.repositoryName,\n\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t...(args.body ? { \"Content-Type\": \"application/json\" } : {}),\n\t\t\t},\n\t\t\tmethod: args.method,\n\t\t});\n\t}\n}\n"],"names":["BaseManager","InternalError","API_ENDPOINTS","error","decode","t","checkIsURLAccessible","FormData","createContentDigest","fileTypeFromBuffer","Blob","fetch","SLICE_MACHINE_USER_AGENT"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,MAAM,oCAAoC;AAC1C,MAAM,4CAA4C;AAClD,MAAM,sCAAsC;AAE5C,MAAM,8BAAwC;AAAA,EAC7C,OAAO;AAAA,EACP,QAAQ;;AAGT,SAAS,uBACR,OAAwB;AAExB,MAAI,SAAS,QAAW;AACjB,UAAA,IAAI,MACT,gIAAgI;AAAA,EAEjI;AACF;AAEA,SAAS,gCACR,gBAA0C;AAE1C,MAAI,kBAAkB,QAAW;AAC1B,UAAA,IAAI,MACT,iJAAiJ;AAAA,EAElJ;AACF;AAgBA,MAAM,8BAA8B,CAAC,YAA2B;AACxD,SAAA,QAAQ,QAAQ,OAAO,IAAI;AACnC;AA2BM,MAAO,2BAA2BA,YAAAA,YAAW;AAAA,EAA7C;AAAA;AACG;AACA;AAAA;AAAA,EAER,MAAM,qBAAkB;AACvB,QAAI,KAAK,iBAAiB;AACzB;AAAA,IACA;AAEG,QAAA;AACA,QAAA;AAES,kBAAA,MAAM,OAAO,WAAW;AAAA,IAAA,QACnC;AACK,YAAA,IAAIC,OAAAA,cACT,iIAAiI;AAAA,IAElI;AAEK,UAAA,UAAU,MAAM,UAAU;AAE3B,SAAA,kBAAkB,MAAM,QAAQ;EACtC;AAAA,EAEA,MAAM,YAAS;AACd,QAAI,KAAK,QAAQ;AAChB;AAAA,IACA;AAED,UAAM,YAAY,IAAI,IAAI,UAAUC,4BAAc,cAAc;AAChE,UAAM,YAAY,MAAM,KAAK,OAAO,EAAE,KAAK,WAAW;AAEhD,UAAA,aAAa,MAAM,UAAU;AAC/B,QAAA;AACA,QAAA;AACU,mBAAA,KAAK,MAAM,UAAU;AAAA,aAC1BC;AAER,YAAM,IAAI,MACT,iCAAiC,cAAc,YAAY;AAAA,IAE5D;AAED,UAAM,EAAE,OAAO,QAAQ,MAAU,IAAAC,OAAA,OAChCC,aAAE,aAAa;AAAA,MACdA,aAAE,KAAK;AAAA,QACN,QAAQA,aAAE,KAAK;AAAA,UACd,KAAKA,aAAE;AAAA,UACP,QAAQA,aAAE,OAAOA,aAAE,QAAQA,aAAE,MAAM;AAAA,QAAA,CACnC;AAAA,QACD,eAAeA,aAAE;AAAA,MAAA,CACjB;AAAA,MACDA,aAAE,QAAQ;AAAA,QACT,SAASA,aAAE;AAAA,QACX,SAASA,aAAE;AAAA,QACX,OAAOA,aAAE;AAAA,MAAA,CACT;AAAA,IAAA,CACD,GACD,UAAU;AAGX,QAAI,OAAO;AACJ,YAAA,IAAI,MAAM,iCAAiC,WAAW;AAAA,IAC5D;AAED,UAAM,eAAe,OAAO,SAAS,OAAO,WAAW,OAAO;AAC9D,QAAI,cAAc;AACX,YAAA,IAAI,MAAM,gCAAgC,cAAc;AAAA,IAC9D;AAED,SAAK,SAAS;AAAA,MACb,gBAAgB,OAAO,OAAO;AAAA,MAC9B,wBAAwB,OAAO,OAAO;AAAA,MACtC,eAAe,OAAO;AAAA,IAAA;AAAA,EAExB;AAAA;AAAA;AAAA,EAIA,MAAM,gCACL,MAA2D;AAE3D,oCAAgC,KAAK,eAAe;AAEpD,UAAM,qBAAqB,MAAM,KAAK,QAAQ,sBAAqB;AAE/D,QAAA,CAAC,mBAAmB,wBAAwB;AAEzC,YAAA,IAAI,MACT,0FAA0F;AAAA,IAE3F;AAED,UAAM,EAAE,MAAK,IAAK,MAAM,KAAK,OAAO,UAAU;AAAA,MAC7C,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,IAAA,CACd;AACD,QAAI,CAAC,OAAO;AACX,YAAM,IAAI,MACT,oCAAoC,KAAK,uBAAuB,KAAK,WAAW;AAAA,IAEjF;AAEK,UAAA,WAAW,KAAK,YAAY;AAKlC,UAAM,MAAM,IAAI,IACf,KAAK,4BAA4B,KAAK,SAAS,KAAK,MAAM,QACzD,KAAK,0BAEN,KAAK,oBAAoB;AAE1B,QAAI,aAAa,IAAI,eAAe,SAAS,MAAM,UAAU;AAC7D,QAAI,aAAa,IAAI,gBAAgB,SAAS,OAAO,UAAU;AAE/D,UAAM,kBAAkB,MAAMC,qBAAAA,qBAAqB,IAAI,SAAU,CAAA;AAEjE,QAAI,CAAC,iBAAiB;AACf,YAAA,IAAI,MACT,qDAAqD,KAAK;AAAA,IAE3D;AAED,UAAM,OAAO,MAAM,KAAK,gBAAgB,QAAO;AAC/C,SAAK,YAAY,QAAQ;AAEnB,UAAA,KAAK,KAAK,IAAI,SAAU,GAAE,EAAE,WAAW,CAAC,QAAQ,cAAc,EAAA,CAAG;AACjE,UAAA,KAAK,gBAAgB,mCAAmC;AAAA,MAC7D,SAAS;AAAA,IAAA,CACT;AAED,UAAM,UAAU,MAAM,KAAK,EAAE,mCAAmC;AAChE,QAAI,CAAC,SAAS;AACb,YAAM,UAAU,IAAI,IAAI,IAAI,UAAU,IAAI,MAAM;AAEhD,YAAM,IAAI,MACT,gCAAgC,6EAA6E,SAAS;AAAA,IAEvH;AAEK,UAAA,OAAQ,MAAM,QAAQ,WAAW;AAAA,MACtC,UAAU;AAAA,MACV,MAAM;AAAA,QACL,OAAO,SAAS;AAAA,QAChB,QAAQ,SAAS;AAAA,QACjB,GAAG;AAAA,QACH,GAAG;AAAA,MACH;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,MACN;AAAA,IAAA;AAAA,EAEF;AAAA,EAEA,MAAM,iBACL,MAA4C;AAE5C,2BAAuB,KAAK,MAAM;AAE5B,UAAA,WAAW,IAAIC,QAAAA;AAEV,eAAA,4BAA4B,KAAK,OAAO,wBAAwB;AAC1E,eAAS,OACR,0BACA,KAAK,OAAO,uBAAuB,wBAAwB,CAAC;AAAA,IAE7D;AAEK,UAAA,gBAAgBC,oBAAAA,oBAAoB,KAAK,IAAI;AACnD,UAAM,WAAW,MAAMC,KAAAA,mBAAmB,KAAK,IAAI;AACnD,UAAM,WAAW,WACd,GAAG,iBAAiB,SAAS,QAC7B;AACH,UAAM,MAAM,KAAK,YAAY,GAAG,KAAK,aAAa,aAAa;AAEtD,aAAA,IAAI,OAAO,GAAG;AAEvB,QAAI,UAAU;AACJ,eAAA,IAAI,gBAAgB,SAAS,IAAI;AAAA,IAC1C;AAED,aAAS,IAAI,QAAQ,IAAIC,MAAAA,QAAK,CAAC,KAAK,IAAI,GAAG,EAAE,MAAM,qCAAU,KAAA,CAAM,CAAC;AAEpE,UAAM,MAAM,MAAMC,QAAAA,QAAM,KAAK,OAAO,gBAAgB;AAAA,MACnD,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA,CACN;AAED,QAAI,IAAI,IAAI;AACX,YAAM,MAAM,IAAI,IAAI,KAAK,KAAK,OAAO,aAAa;AAC9C,UAAA,aAAa,IAAI,QAAQ,iBAAiB;AAEvC,aAAA;AAAA,QACN,KAAK,IAAI,SAAU;AAAA,MAAA;AAAA,WAEd;AACN,YAAM,IAAI,MACT,iDAAiD,IAAI,QAAQ;AAAA,IAE9D;AAAA,EACF;AAAA,EAEA,MAAM,uBACL,MAAkD;AAE5C,UAAA,MAAM,MAAM,KAAK,OAAO;AAAA;AAAA;AAAA,MAG7B,MAAM,EAAE,WAAW,KAAK,QAAS;AAAA,MACjC,QAAQ;AAAA,MACR,KAAK,IAAI,IAAI,iBAAiBT,cAAAA,cAAc,cAAc;AAAA,IAAA,CAC1D;AACG,QAAA,CAAC,IAAI,IAAI;AACZ,YAAM,IAAI,MACT,wDAAwD,IAAI,QAAQ;AAAA,IAErE;AAAA,EACF;AAAA,EAEQ,MAAM,OAAO,MAIpB;AACA,UAAM,sBAAsB,MAAM,KAAK,KAAK,uBAAsB;AAClE,UAAM,qBAAqB,MAAM,KAAK,QAAQ,sBAAqB;AAE5D,WAAA,MAAMS,QAAAA,QAAM,KAAK,KAAK;AAAA,MAC5B,MAAM,KAAK,OAAO,KAAK,UAAU,KAAK,IAAI,IAAI;AAAA,MAC9C,SAAS;AAAA,QACR,eAAe,UAAU;AAAA,QACzB,YAAY,mBAAmB;AAAA,QAC/B,cAAcC,yBAAA;AAAA,QACd,GAAI,KAAK,OAAO,EAAE,gBAAgB,uBAAuB;MACzD;AAAA,MACD,QAAQ,KAAK;AAAA,IAAA,CACb;AAAA,EACF;AACA;;"}
|
|
1
|
+
{"version":3,"file":"ScreenshotsManager.cjs","sources":["../../../../src/managers/screenshots/ScreenshotsManager.ts"],"sourcesContent":["import * as t from \"io-ts\";\nimport { fileTypeFromBuffer } from \"file-type\";\nimport fetch, { FormData, Blob, Response } from \"node-fetch\";\n// puppeteer is lazy-loaded in captureSliceSimulatorScreenshot\nimport type { BrowserContext, Viewport } from \"puppeteer\";\n\nimport { checkIsURLAccessible } from \"../../lib/checkIsURLAccessible\";\nimport { createContentDigest } from \"../../lib/createContentDigest\";\nimport { decode } from \"../../lib/decode\";\n\nimport { S3ACL } from \"../../types\";\nimport { SLICE_MACHINE_USER_AGENT } from \"../../constants/SLICE_MACHINE_USER_AGENT\";\nimport { API_ENDPOINTS } from \"../../constants/API_ENDPOINTS\";\nimport { InternalError } from \"../../errors\";\n\nimport { BaseManager } from \"../BaseManager\";\n\nconst SLICE_SIMULATOR_WAIT_FOR_SELECTOR = \"#__iframe-ready\";\nconst SLICE_SIMULATOR_WAIT_FOR_SELECTOR_TIMEOUT = 10_000; // ms\nconst SLICE_SIMULATOR_SCREENSHOT_SELECTOR = \"#__iframe-renderer\";\n\nconst DEFAULT_SCREENSHOT_VIEWPORT: Viewport = {\n\twidth: 1200,\n\theight: 800,\n};\n\nfunction assertS3ACLInitialized(\n\ts3ACL: S3ACL | undefined,\n): asserts s3ACL is NonNullable<typeof s3ACL> {\n\tif (s3ACL == undefined) {\n\t\tthrow new Error(\n\t\t\t\"An S3 ACL has not been initialized. Run `SliceMachineManager.screenshots.prototype.initS3ACL()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\nfunction assertBrowserContextInitialized(\n\tbrowserContext: BrowserContext | undefined,\n): asserts browserContext is NonNullable<typeof browserContext> {\n\tif (browserContext == undefined) {\n\t\tthrow new Error(\n\t\t\t\"A browser context has not been initialized. Run `SliceMachineManager.screenshots.prototype.initBrowserContext()` before re-calling this method.\",\n\t\t);\n\t}\n}\n\n/**\n * Encodes a part of a Slice Simulator URL to ensure it can be added to a URL\n * safely.\n *\n * The encoding logic must match Slice Machine UI's URL encoding practices.\n * Today, that requires the following:\n *\n * - Replace \"/\" with \"--\" (e.g. a Slice Library ID of \"./slices\" should turn into\n * \".--slices\")\n *\n * @param urlPart - A part of the URL.\n *\n * @returns `urlPart` encoded for use in a URL.\n */\nconst encodeSliceSimulatorURLPart = (urlPart: string): string => {\n\treturn urlPart.replace(/\\//g, \"--\");\n};\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs = {\n\tsliceMachineUIOrigin: string;\n\tlibraryID: string;\n\tsliceID: string;\n\tvariationID: string;\n\tviewport?: Viewport;\n};\n\ntype ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType = {\n\tdata: Buffer;\n};\n\ntype ScreenshotsManagerUploadScreenshotArgs = {\n\tdata: Buffer;\n\tkeyPrefix?: string;\n};\n\ntype ScreenshotsManagerUploadScreenshotReturnType = {\n\turl: string;\n};\n\ntype ScreenshotsManagerDeleteScreenshotFolderArgs = {\n\tsliceID: string;\n};\n\nexport class ScreenshotsManager extends BaseManager {\n\tprivate _browserContext: BrowserContext | undefined;\n\tprivate _s3ACL: S3ACL | undefined;\n\n\tasync initBrowserContext(): Promise<void> {\n\t\tif (this._browserContext) {\n\t\t\treturn;\n\t\t}\n\n\t\tlet puppeteer: typeof import(\"puppeteer\");\n\t\ttry {\n\t\t\t// Lazy-load Puppeteer only once it is needed.\n\t\t\tpuppeteer = await import(\"puppeteer\");\n\t\t} catch {\n\t\t\tthrow new InternalError(\n\t\t\t\t\"Screenshots require Puppeteer but Puppeteer was not found. Check that the `puppeteer` package is installed before trying again.\",\n\t\t\t);\n\t\t}\n\n\t\tconst browser = await puppeteer.launch({ headless: \"new\" });\n\n\t\tthis._browserContext = await browser.createIncognitoBrowserContext();\n\t}\n\n\tasync initS3ACL(): Promise<void> {\n\t\tif (this._s3ACL) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst awsACLURL = new URL(\"create\", API_ENDPOINTS.AwsAclProvider);\n\t\tconst awsACLRes = await this._fetch({ url: awsACLURL });\n\n\t\tconst awsACLText = await awsACLRes.text();\n\t\tlet awsACLJSON: unknown;\n\t\ttry {\n\t\t\tawsACLJSON = JSON.parse(awsACLText);\n\t\t} catch (error) {\n\t\t\t// Response is not JSON\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid AWS ACL response from ${awsACLURL}: ${awsACLText}`,\n\t\t\t);\n\t\t}\n\n\t\tconst { value: awsACL, error } = decode(\n\t\t\tt.intersection([\n\t\t\t\tt.type({\n\t\t\t\t\tvalues: t.type({\n\t\t\t\t\t\turl: t.string,\n\t\t\t\t\t\tfields: t.record(t.string, t.string),\n\t\t\t\t\t}),\n\t\t\t\t\timgixEndpoint: t.string,\n\t\t\t\t}),\n\t\t\t\tt.partial({\n\t\t\t\t\tmessage: t.string,\n\t\t\t\t\tMessage: t.string,\n\t\t\t\t\terror: t.string,\n\t\t\t\t}),\n\t\t\t]),\n\t\t\tawsACLJSON,\n\t\t);\n\n\t\tif (error) {\n\t\t\tthrow new Error(`Invalid AWS ACL response from ${awsACLURL}`);\n\t\t}\n\n\t\tconst errorMessage = awsACL.error || awsACL.message || awsACL.Message;\n\t\tif (errorMessage) {\n\t\t\tthrow new Error(`Failed to create an AWS ACL: ${errorMessage}`);\n\t\t}\n\n\t\tthis._s3ACL = {\n\t\t\tuploadEndpoint: awsACL.values.url,\n\t\t\trequiredFormDataFields: awsACL.values.fields,\n\t\t\timgixEndpoint: awsACL.imgixEndpoint,\n\t\t};\n\t}\n\n\t// TODO: Abstract to a generic `captureScreenshot()` method that is\n\t// used within a Slice-specific method in SliceManager.\n\tasync captureSliceSimulatorScreenshot(\n\t\targs: ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs,\n\t): Promise<ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType> {\n\t\tassertBrowserContextInitialized(this._browserContext);\n\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\tif (!sliceMachineConfig.localSliceSimulatorURL) {\n\t\t\t// TODO: Provide a more helpful error message.\n\t\t\tthrow new Error(\n\t\t\t\t\"A local Slice Simulator URL must be configured in your Slice Machine configuration file.\",\n\t\t\t);\n\t\t}\n\n\t\tconst { model } = await this.slices.readSlice({\n\t\t\tlibraryID: args.libraryID,\n\t\t\tsliceID: args.sliceID,\n\t\t});\n\t\tif (!model) {\n\t\t\tthrow new Error(\n\t\t\t\t`Did not find a Slice in library \"${args.libraryID}\" with ID \"${args.sliceID}\".`,\n\t\t\t);\n\t\t}\n\n\t\tconst viewport = args.viewport || DEFAULT_SCREENSHOT_VIEWPORT;\n\n\t\t// TODO: Change `model.name` to `args.sliceID`?\n\t\t// Making that change would require changing the screenshot\n\t\t// page path in Slice Machine UI.\n\t\tconst url = new URL(\n\t\t\t`./${encodeSliceSimulatorURLPart(args.libraryID)}/${model.name}/${\n\t\t\t\targs.variationID\n\t\t\t}/screenshot`,\n\t\t\targs.sliceMachineUIOrigin,\n\t\t);\n\t\turl.searchParams.set(\"screenWidth\", viewport.width.toString());\n\t\turl.searchParams.set(\"screenHeight\", viewport.height.toString());\n\n\t\tconst isURLAccessible = await checkIsURLAccessible(url.toString());\n\n\t\tif (!isURLAccessible) {\n\t\t\tthrow new Error(\n\t\t\t\t`Slice Simulator screenshot URL is not accessible: ${url}`,\n\t\t\t);\n\t\t}\n\n\t\tconst page = await this._browserContext.newPage();\n\t\tpage.setViewport(viewport);\n\n\t\tawait page.goto(url.toString(), { waitUntil: [\"load\", \"networkidle0\"] });\n\t\tawait page.waitForSelector(SLICE_SIMULATOR_WAIT_FOR_SELECTOR, {\n\t\t\ttimeout: SLICE_SIMULATOR_WAIT_FOR_SELECTOR_TIMEOUT,\n\t\t});\n\n\t\tconst element = await page.$(SLICE_SIMULATOR_SCREENSHOT_SELECTOR);\n\t\tif (!element) {\n\t\t\tconst baseURL = new URL(url.pathname, url.origin);\n\n\t\t\tthrow new Error(\n\t\t\t\t`Slice Simulator did not find ${SLICE_SIMULATOR_WAIT_FOR_SELECTOR} on the page. Verify the URL is correct: ${baseURL}`,\n\t\t\t);\n\t\t}\n\n\t\tconst data = (await element.screenshot({\n\t\t\tencoding: \"binary\",\n\t\t\tclip: {\n\t\t\t\twidth: viewport.width,\n\t\t\t\theight: viewport.height,\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t},\n\t\t})) as Buffer;\n\n\t\treturn {\n\t\t\tdata,\n\t\t};\n\t}\n\n\tasync uploadScreenshot(\n\t\targs: ScreenshotsManagerUploadScreenshotArgs,\n\t): Promise<ScreenshotsManagerUploadScreenshotReturnType> {\n\t\tassertS3ACLInitialized(this._s3ACL);\n\n\t\tconst formData = new FormData();\n\n\t\tfor (const requiredFormDataFieldKey in this._s3ACL.requiredFormDataFields) {\n\t\t\tformData.append(\n\t\t\t\trequiredFormDataFieldKey,\n\t\t\t\tthis._s3ACL.requiredFormDataFields[requiredFormDataFieldKey],\n\t\t\t);\n\t\t}\n\n\t\tconst contentDigest = createContentDigest(args.data);\n\t\tconst fileType = await fileTypeFromBuffer(args.data);\n\t\tconst fileName = fileType\n\t\t\t? `${contentDigest}.${fileType.ext}`\n\t\t\t: contentDigest;\n\t\tconst key = args.keyPrefix ? `${args.keyPrefix}/${fileName}` : fileName;\n\n\t\tformData.set(\"key\", key);\n\n\t\tif (fileType) {\n\t\t\tformData.set(\"Content-Type\", fileType.mime);\n\t\t}\n\n\t\tformData.set(\"file\", new Blob([args.data], { type: fileType?.mime }));\n\n\t\tconst res = await fetch(this._s3ACL.uploadEndpoint, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: formData,\n\t\t});\n\n\t\tif (res.ok) {\n\t\t\tconst url = new URL(key, this._s3ACL.imgixEndpoint);\n\t\t\turl.searchParams.set(\"auto\", \"compress,format\");\n\n\t\t\treturn {\n\t\t\t\turl: url.toString(),\n\t\t\t};\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Unable to upload screenshot with status code: ${res.status}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tasync deleteScreenshotFolder(\n\t\targs: ScreenshotsManagerDeleteScreenshotFolderArgs,\n\t): Promise<void> {\n\t\tconst res = await this._fetch({\n\t\t\t// We're sending `args.sliceID` as `sliceName` because it's inconsistently\n\t\t\t// named in the ACL Provider API.\n\t\t\tbody: { sliceName: args.sliceID },\n\t\t\tmethod: \"POST\",\n\t\t\turl: new URL(\"delete-folder\", API_ENDPOINTS.AwsAclProvider),\n\t\t});\n\t\tif (!res.ok) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unable to delete screenshot folder with status code: ${res.status}`,\n\t\t\t);\n\t\t}\n\t}\n\n\tprivate async _fetch(args: {\n\t\turl: URL;\n\t\tmethod?: \"GET\" | \"POST\";\n\t\tbody?: unknown;\n\t}): Promise<Response> {\n\t\tconst authenticationToken = await this.user.getAuthenticationToken();\n\t\tconst sliceMachineConfig = await this.project.getSliceMachineConfig();\n\n\t\treturn await fetch(args.url, {\n\t\t\tbody: args.body ? JSON.stringify(args.body) : undefined,\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${authenticationToken}`,\n\t\t\t\tRepository: sliceMachineConfig.repositoryName,\n\t\t\t\t\"User-Agent\": SLICE_MACHINE_USER_AGENT,\n\t\t\t\t...(args.body ? { \"Content-Type\": \"application/json\" } : {}),\n\t\t\t},\n\t\t\tmethod: args.method,\n\t\t});\n\t}\n}\n"],"names":["BaseManager","InternalError","API_ENDPOINTS","error","decode","t","checkIsURLAccessible","FormData","createContentDigest","fileTypeFromBuffer","Blob","fetch","SLICE_MACHINE_USER_AGENT"],"mappings":"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"}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
/// <reference types="node" />
|
|
2
|
-
import type { Viewport } from "puppeteer";
|
|
3
|
-
import { BaseManager } from "../BaseManager";
|
|
4
|
-
type ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs = {
|
|
5
|
-
sliceMachineUIOrigin: string;
|
|
6
|
-
libraryID: string;
|
|
7
|
-
sliceID: string;
|
|
8
|
-
variationID: string;
|
|
9
|
-
viewport?: Viewport;
|
|
10
|
-
};
|
|
11
|
-
type ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType = {
|
|
12
|
-
data: Buffer;
|
|
13
|
-
};
|
|
14
|
-
type ScreenshotsManagerUploadScreenshotArgs = {
|
|
15
|
-
data: Buffer;
|
|
16
|
-
keyPrefix?: string;
|
|
17
|
-
};
|
|
18
|
-
type ScreenshotsManagerUploadScreenshotReturnType = {
|
|
19
|
-
url: string;
|
|
20
|
-
};
|
|
21
|
-
type ScreenshotsManagerDeleteScreenshotFolderArgs = {
|
|
22
|
-
sliceID: string;
|
|
23
|
-
};
|
|
24
|
-
export declare class ScreenshotsManager extends BaseManager {
|
|
25
|
-
private _browserContext;
|
|
26
|
-
private _s3ACL;
|
|
27
|
-
initBrowserContext(): Promise<void>;
|
|
28
|
-
initS3ACL(): Promise<void>;
|
|
29
|
-
captureSliceSimulatorScreenshot(args: ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs): Promise<ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType>;
|
|
30
|
-
uploadScreenshot(args: ScreenshotsManagerUploadScreenshotArgs): Promise<ScreenshotsManagerUploadScreenshotReturnType>;
|
|
31
|
-
deleteScreenshotFolder(args: ScreenshotsManagerDeleteScreenshotFolderArgs): Promise<void>;
|
|
32
|
-
private _fetch;
|
|
33
|
-
}
|
|
34
|
-
export {};
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type { Viewport } from "puppeteer";
|
|
3
|
+
import { BaseManager } from "../BaseManager";
|
|
4
|
+
type ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs = {
|
|
5
|
+
sliceMachineUIOrigin: string;
|
|
6
|
+
libraryID: string;
|
|
7
|
+
sliceID: string;
|
|
8
|
+
variationID: string;
|
|
9
|
+
viewport?: Viewport;
|
|
10
|
+
};
|
|
11
|
+
type ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType = {
|
|
12
|
+
data: Buffer;
|
|
13
|
+
};
|
|
14
|
+
type ScreenshotsManagerUploadScreenshotArgs = {
|
|
15
|
+
data: Buffer;
|
|
16
|
+
keyPrefix?: string;
|
|
17
|
+
};
|
|
18
|
+
type ScreenshotsManagerUploadScreenshotReturnType = {
|
|
19
|
+
url: string;
|
|
20
|
+
};
|
|
21
|
+
type ScreenshotsManagerDeleteScreenshotFolderArgs = {
|
|
22
|
+
sliceID: string;
|
|
23
|
+
};
|
|
24
|
+
export declare class ScreenshotsManager extends BaseManager {
|
|
25
|
+
private _browserContext;
|
|
26
|
+
private _s3ACL;
|
|
27
|
+
initBrowserContext(): Promise<void>;
|
|
28
|
+
initS3ACL(): Promise<void>;
|
|
29
|
+
captureSliceSimulatorScreenshot(args: ScreenshotsManagerCaptureSliceSimulatorScreenshotArgs): Promise<ScreenshotsManagerCaptureSliceSimulatorScreenshotReturnType>;
|
|
30
|
+
uploadScreenshot(args: ScreenshotsManagerUploadScreenshotArgs): Promise<ScreenshotsManagerUploadScreenshotReturnType>;
|
|
31
|
+
deleteScreenshotFolder(args: ScreenshotsManagerDeleteScreenshotFolderArgs): Promise<void>;
|
|
32
|
+
private _fetch;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -57,7 +57,7 @@ class ScreenshotsManager extends BaseManager {
|
|
|
57
57
|
} catch {
|
|
58
58
|
throw new InternalError("Screenshots require Puppeteer but Puppeteer was not found. Check that the `puppeteer` package is installed before trying again.");
|
|
59
59
|
}
|
|
60
|
-
const browser = await puppeteer.launch();
|
|
60
|
+
const browser = await puppeteer.launch({ headless: "new" });
|
|
61
61
|
this._browserContext = await browser.createIncognitoBrowserContext();
|
|
62
62
|
}
|
|
63
63
|
async initS3ACL() {
|