@prismicio/e2e-tests-utils 1.18.0 → 1.19.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/README.md +24 -27
- package/dist/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/clients/apiClient.cjs +38 -38
- package/dist/clients/apiClient.cjs.map +1 -1
- package/dist/clients/apiClient.d.cts +30 -0
- package/dist/clients/apiClient.d.cts.map +1 -0
- package/dist/clients/apiClient.d.ts +23 -23
- package/dist/clients/apiClient.d.ts.map +1 -0
- package/dist/clients/apiClient.js +38 -38
- package/dist/clients/apiClient.js.map +1 -1
- package/dist/clients/assetApi.cjs +81 -93
- package/dist/clients/assetApi.cjs.map +1 -1
- package/dist/clients/assetApi.d.cts +105 -0
- package/dist/clients/assetApi.d.cts.map +1 -0
- package/dist/clients/assetApi.d.ts +96 -97
- package/dist/clients/assetApi.d.ts.map +1 -0
- package/dist/clients/assetApi.js +79 -91
- package/dist/clients/assetApi.js.map +1 -1
- package/dist/clients/authenticationApi.cjs +66 -73
- package/dist/clients/authenticationApi.cjs.map +1 -1
- package/dist/clients/authenticationApi.d.cts +20 -0
- package/dist/clients/authenticationApi.d.cts.map +1 -0
- package/dist/clients/authenticationApi.d.ts +18 -13
- package/dist/clients/authenticationApi.d.ts.map +1 -0
- package/dist/clients/authenticationApi.js +65 -72
- package/dist/clients/authenticationApi.js.map +1 -1
- package/dist/clients/contentApi.cjs +94 -103
- package/dist/clients/contentApi.cjs.map +1 -1
- package/dist/clients/contentApi.d.cts +116 -0
- package/dist/clients/contentApi.d.cts.map +1 -0
- package/dist/clients/contentApi.d.ts +102 -98
- package/dist/clients/contentApi.d.ts.map +1 -0
- package/dist/clients/contentApi.js +94 -103
- package/dist/clients/contentApi.js.map +1 -1
- package/dist/clients/coreApi.cjs +123 -145
- package/dist/clients/coreApi.cjs.map +1 -1
- package/dist/clients/coreApi.d.cts +122 -0
- package/dist/clients/coreApi.d.cts.map +1 -0
- package/dist/clients/coreApi.d.ts +111 -109
- package/dist/clients/coreApi.d.ts.map +1 -0
- package/dist/clients/coreApi.js +122 -144
- package/dist/clients/coreApi.js.map +1 -1
- package/dist/clients/customTypesApi.cjs +90 -99
- package/dist/clients/customTypesApi.cjs.map +1 -1
- package/dist/clients/customTypesApi.d.cts +46 -0
- package/dist/clients/customTypesApi.d.cts.map +1 -0
- package/dist/clients/customTypesApi.d.ts +45 -45
- package/dist/clients/customTypesApi.d.ts.map +1 -0
- package/dist/clients/customTypesApi.js +87 -98
- package/dist/clients/customTypesApi.js.map +1 -1
- package/dist/clients/integrationFields.cjs +96 -87
- package/dist/clients/integrationFields.cjs.map +1 -1
- package/dist/clients/integrationFields.d.cts +30 -0
- package/dist/clients/integrationFields.d.cts.map +1 -0
- package/dist/clients/integrationFields.d.ts +27 -22
- package/dist/clients/integrationFields.d.ts.map +1 -0
- package/dist/clients/integrationFields.js +93 -86
- package/dist/clients/integrationFields.js.map +1 -1
- package/dist/clients/manageV2.cjs +154 -171
- package/dist/clients/manageV2.cjs.map +1 -1
- package/dist/clients/manageV2.d.cts +105 -0
- package/dist/clients/manageV2.d.cts.map +1 -0
- package/dist/clients/manageV2.d.ts +103 -111
- package/dist/clients/manageV2.d.ts.map +1 -0
- package/dist/clients/manageV2.js +149 -169
- package/dist/clients/manageV2.js.map +1 -1
- package/dist/clients/migrationApi.cjs +37 -36
- package/dist/clients/migrationApi.cjs.map +1 -1
- package/dist/clients/migrationApi.d.cts +48 -0
- package/dist/clients/migrationApi.d.cts.map +1 -0
- package/dist/clients/migrationApi.d.ts +45 -39
- package/dist/clients/migrationApi.d.ts.map +1 -0
- package/dist/clients/migrationApi.js +35 -34
- package/dist/clients/migrationApi.js.map +1 -1
- package/dist/clients/wroom.cjs +101 -122
- package/dist/clients/wroom.cjs.map +1 -1
- package/dist/clients/wroom.d.cts +48 -0
- package/dist/clients/wroom.d.cts.map +1 -0
- package/dist/clients/wroom.d.ts +46 -47
- package/dist/clients/wroom.d.ts.map +1 -0
- package/dist/clients/wroom.js +99 -122
- package/dist/clients/wroom.js.map +1 -1
- package/dist/index.cjs +13 -15
- package/dist/index.d.cts +8 -0
- package/dist/index.d.ts +8 -7
- package/dist/index.js +5 -14
- package/dist/managers/repositories.cjs +159 -169
- package/dist/managers/repositories.cjs.map +1 -1
- package/dist/managers/repositories.d.cts +67 -0
- package/dist/managers/repositories.d.cts.map +1 -0
- package/dist/managers/repositories.d.ts +56 -63
- package/dist/managers/repositories.d.ts.map +1 -0
- package/dist/managers/repositories.js +148 -159
- package/dist/managers/repositories.js.map +1 -1
- package/dist/managers/repository.cjs +529 -616
- package/dist/managers/repository.cjs.map +1 -1
- package/dist/managers/repository.d.cts +308 -0
- package/dist/managers/repository.d.cts.map +1 -0
- package/dist/managers/repository.d.ts +303 -307
- package/dist/managers/repository.d.ts.map +1 -0
- package/dist/managers/repository.js +529 -616
- package/dist/managers/repository.js.map +1 -1
- package/dist/types.d.cts +41 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.ts +35 -37
- package/dist/types.d.ts.map +1 -0
- package/dist/utils/cookies.cjs +19 -17
- package/dist/utils/cookies.cjs.map +1 -1
- package/dist/utils/cookies.js +20 -18
- package/dist/utils/cookies.js.map +1 -1
- package/dist/utils/envVariableManager.cjs +33 -34
- package/dist/utils/envVariableManager.cjs.map +1 -1
- package/dist/utils/envVariableManager.js +34 -35
- package/dist/utils/envVariableManager.js.map +1 -1
- package/dist/utils/log.cjs +18 -19
- package/dist/utils/log.cjs.map +1 -1
- package/dist/utils/log.js +18 -21
- package/dist/utils/log.js.map +1 -1
- package/dist/utils/random.cjs +13 -6
- package/dist/utils/random.cjs.map +1 -1
- package/dist/utils/random.js +13 -6
- package/dist/utils/random.js.map +1 -1
- package/dist/utils/strings.cjs +13 -7
- package/dist/utils/strings.cjs.map +1 -1
- package/dist/utils/strings.js +14 -8
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/urls.cjs +21 -10
- package/dist/utils/urls.cjs.map +1 -1
- package/dist/utils/urls.js +22 -12
- package/dist/utils/urls.js.map +1 -1
- package/package.json +42 -67
- package/src/clients/apiClient.ts +16 -21
- package/src/clients/assetApi.ts +75 -82
- package/src/clients/authenticationApi.ts +54 -27
- package/src/clients/contentApi.ts +109 -129
- package/src/clients/coreApi.ts +113 -117
- package/src/clients/customTypesApi.ts +54 -76
- package/src/clients/integrationFields.ts +59 -74
- package/src/clients/manageV2.ts +72 -96
- package/src/clients/migrationApi.ts +35 -39
- package/src/clients/wroom.ts +42 -56
- package/src/index.ts +7 -7
- package/src/managers/repositories.ts +85 -108
- package/src/managers/repository.ts +303 -368
- package/src/types.ts +31 -31
- package/src/utils/cookies.ts +8 -8
- package/src/utils/envVariableManager.ts +15 -15
- package/src/utils/log.ts +17 -21
- package/src/utils/random.ts +5 -6
- package/src/utils/strings.ts +7 -9
- package/src/utils/urls.ts +10 -12
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/utils/cookies.d.ts +0 -8
- package/dist/utils/envVariableManager.d.ts +0 -16
- package/dist/utils/log.d.ts +0 -5
- package/dist/utils/random.d.ts +0 -8
- package/dist/utils/strings.d.ts +0 -11
- package/dist/utils/urls.d.ts +0 -16
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { AuthenticatedApiClient } from "./apiClient.cjs";
|
|
2
|
+
import { APIResponse } from "@playwright/test";
|
|
3
|
+
|
|
4
|
+
//#region src/clients/contentApi.d.ts
|
|
5
|
+
interface ContentApiError {
|
|
6
|
+
type: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
interface ContentApiSearchResponse {
|
|
10
|
+
page: number;
|
|
11
|
+
results_per_page: number;
|
|
12
|
+
results_size: number;
|
|
13
|
+
total_results_size: number;
|
|
14
|
+
total_pages: number;
|
|
15
|
+
next_page: string | null;
|
|
16
|
+
prev_page: string | null;
|
|
17
|
+
results: ContentApiDocument[];
|
|
18
|
+
}
|
|
19
|
+
interface ContentApiDocument {
|
|
20
|
+
id: string;
|
|
21
|
+
uid: string | null;
|
|
22
|
+
url: string | null;
|
|
23
|
+
type: string;
|
|
24
|
+
href: string;
|
|
25
|
+
tags: string[];
|
|
26
|
+
first_publication_date: string;
|
|
27
|
+
last_publication_date: string;
|
|
28
|
+
slugs: string[];
|
|
29
|
+
linked_documents: unknown[];
|
|
30
|
+
lang: string;
|
|
31
|
+
alternate_languages: ContentApiAlternateLanguage[];
|
|
32
|
+
data: Record<string, any>;
|
|
33
|
+
}
|
|
34
|
+
interface ContentApiGraphQLResponse {
|
|
35
|
+
data: Record<string, any>;
|
|
36
|
+
errors?: {
|
|
37
|
+
message: string;
|
|
38
|
+
locations: any;
|
|
39
|
+
}[];
|
|
40
|
+
}
|
|
41
|
+
interface ContentApiRef {
|
|
42
|
+
id: string;
|
|
43
|
+
ref: string;
|
|
44
|
+
label: string;
|
|
45
|
+
isMasterRef?: boolean;
|
|
46
|
+
scheduledAt?: number | undefined;
|
|
47
|
+
}
|
|
48
|
+
interface ContentApiAlternateLanguage {
|
|
49
|
+
id: string;
|
|
50
|
+
type: string;
|
|
51
|
+
lang: string;
|
|
52
|
+
uid?: string;
|
|
53
|
+
}
|
|
54
|
+
type SearchQueryParams = {
|
|
55
|
+
ref?: string;
|
|
56
|
+
query?: string;
|
|
57
|
+
q?: string;
|
|
58
|
+
graphQuery?: string;
|
|
59
|
+
fetchLinks?: string;
|
|
60
|
+
orderings?: string;
|
|
61
|
+
pageSize?: number;
|
|
62
|
+
page?: number;
|
|
63
|
+
lang?: string;
|
|
64
|
+
after?: string;
|
|
65
|
+
routes?: string;
|
|
66
|
+
};
|
|
67
|
+
type ApiVersions = "v1" | "v2";
|
|
68
|
+
/**
|
|
69
|
+
* Client to query the Prismic content api. Uses Playwright to benefit from network request traces
|
|
70
|
+
* in your reports. See api docs: https://prismic.io/docs/rest-api-technical-reference
|
|
71
|
+
*/
|
|
72
|
+
declare class ContentApiClient extends AuthenticatedApiClient {
|
|
73
|
+
private version;
|
|
74
|
+
private accessToken;
|
|
75
|
+
/**
|
|
76
|
+
* @example
|
|
77
|
+
* To instantiate the class:
|
|
78
|
+
*
|
|
79
|
+
* ```js
|
|
80
|
+
* new ContentApiClient("https://my-repo.cdn.prismic.io", {
|
|
81
|
+
* version: "v2",
|
|
82
|
+
* accessToken: "my-secret-token",
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @param baseURL - The api base URL like https://my-repo.cdn.prismic.io
|
|
87
|
+
* @param config - Optional configuration
|
|
88
|
+
*
|
|
89
|
+
* - {@link config.version}: Api version, default is "v2"
|
|
90
|
+
* - {@link config.accessToken}: Access token for the content api -
|
|
91
|
+
* https://prismic.io/docs/access-token
|
|
92
|
+
*/
|
|
93
|
+
constructor(baseURL: string, config?: {
|
|
94
|
+
version?: ApiVersions;
|
|
95
|
+
accessToken?: string;
|
|
96
|
+
});
|
|
97
|
+
get(path: string, params?: SearchQueryParams, headers?: Record<string, string>): Promise<APIResponse>;
|
|
98
|
+
getAsJson<T>(url: string, params?: SearchQueryParams, headers?: Record<string, string>): Promise<T>;
|
|
99
|
+
/** Query the graphql api - https://prismic.io/docs/graphql-technical-reference */
|
|
100
|
+
graphql(ref: string, query: string): Promise<ContentApiGraphQLResponse>;
|
|
101
|
+
getRefs(): Promise<ContentApiRef[]>;
|
|
102
|
+
getMasterRef(): Promise<string>;
|
|
103
|
+
getRefByReleaseID(releaseID: string): Promise<string>;
|
|
104
|
+
/** Search documents from the `/api/v<version>/documents/search` endpoint. */
|
|
105
|
+
search(filters?: SearchQueryParams): Promise<ContentApiSearchResponse>;
|
|
106
|
+
/**
|
|
107
|
+
* Search for a single document by its it, using the `/api/v<version>/documents/search` endpoint
|
|
108
|
+
* and a default filter.
|
|
109
|
+
*/
|
|
110
|
+
searchByID(id: string, filters?: SearchQueryParams): Promise<ContentApiSearchResponse>;
|
|
111
|
+
/** Retrieve a single document or undefined if not found. */
|
|
112
|
+
getDocumentByID(id: string, filters?: SearchQueryParams): Promise<ContentApiDocument | undefined>;
|
|
113
|
+
}
|
|
114
|
+
//#endregion
|
|
115
|
+
export { ContentApiClient, ContentApiDocument, ContentApiError, ContentApiGraphQLResponse, ContentApiRef, ContentApiSearchResponse };
|
|
116
|
+
//# sourceMappingURL=contentApi.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentApi.d.cts","names":[],"sources":["../../src/clients/contentApi.ts"],"mappings":";;;;UAIiB,eAAA;EAChB,IAAA;EACA,OAAO;AAAA;AAAA,UAES,wBAAA;EAChB,IAAA;EACA,gBAAA;EACA,YAAA;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;EACA,OAAA,EAAS,kBAAkB;AAAA;AAAA,UAGX,kBAAA;EAChB,EAAA;EACA,GAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,sBAAA;EACA,qBAAA;EACA,KAAA;EACA,gBAAA;EACA,IAAA;EACA,mBAAA,EAAqB,2BAAA;EAErB,IAAA,EAAM,MAAM;AAAA;AAAA,UAGI,yBAAA;EAEhB,IAAA,EAAM,MAAM;EAEZ,MAAA;IAAW,OAAA;IAAiB,SAAA;EAAA;AAAA;AAAA,UAGZ,aAAA;EAChB,EAAA;EACA,GAAA;EACA,KAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,UAGS,2BAAA;EACT,EAAA;EACA,IAAA;EACA,IAAA;EACA,GAAA;AAAA;AAAA,KAmBI,iBAAA;EACJ,GAAA;EACA,KAAA;EACA,CAAA;EACA,UAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;EACA,MAAA;AAAA;AAAA,KAGI,WAAA;;AAxCO;AACX;;cA6CY,gBAAA,SAAyB,sBAAA;EAAA,QAC7B,OAAA;EAAA,QACA,WAAA;EA3CR;;;;AAEG;AAAA;;;;;;;;;;;;;cA6DS,OAAA,UAAiB,MAAA;IAAU,OAAA,GAAU,WAAA;IAAa,WAAA;EAAA;EASxD,GAAA,CACL,IAAA,UACA,MAAA,GAAS,iBAAA,EACT,OAAA,GAAU,MAAA,mBACR,OAAA,CAAQ,WAAA;EAUL,SAAA,IACL,GAAA,UACA,MAAA,GAAS,iBAAA,EACT,OAAA,GAAU,MAAA,mBACR,OAAA,CAAQ,CAAA;;EAOL,OAAA,CAAQ,GAAA,UAAa,KAAA,WAAgB,OAAA,CAAQ,yBAAA;EAI7C,OAAA,IAAW,OAAA,CAAQ,aAAA;EAMnB,YAAA,IAAgB,OAAA;EAWhB,iBAAA,CAAkB,SAAA,WAAoB,OAAA;EA7Ef;EAwFvB,MAAA,CAAO,OAAA,GAAU,iBAAA,GAAoB,OAAA,CAAQ,wBAAA;EAvDzC;;;;EAuEJ,UAAA,CAAW,EAAA,UAAY,OAAA,GAAU,iBAAA,GAAoB,OAAA,CAAQ,wBAAA;EAxDxD;EA6DL,eAAA,CACL,EAAA,UACA,OAAA,GAAU,iBAAA,GACR,OAAA,CAAQ,kBAAA;AAAA"}
|
|
@@ -1,112 +1,116 @@
|
|
|
1
|
+
import { AuthenticatedApiClient } from "./apiClient.js";
|
|
1
2
|
import { APIResponse } from "@playwright/test";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
|
|
4
|
+
//#region src/clients/contentApi.d.ts
|
|
5
|
+
interface ContentApiError {
|
|
6
|
+
type: string;
|
|
7
|
+
message: string;
|
|
6
8
|
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
interface ContentApiSearchResponse {
|
|
10
|
+
page: number;
|
|
11
|
+
results_per_page: number;
|
|
12
|
+
results_size: number;
|
|
13
|
+
total_results_size: number;
|
|
14
|
+
total_pages: number;
|
|
15
|
+
next_page: string | null;
|
|
16
|
+
prev_page: string | null;
|
|
17
|
+
results: ContentApiDocument[];
|
|
16
18
|
}
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
19
|
+
interface ContentApiDocument {
|
|
20
|
+
id: string;
|
|
21
|
+
uid: string | null;
|
|
22
|
+
url: string | null;
|
|
23
|
+
type: string;
|
|
24
|
+
href: string;
|
|
25
|
+
tags: string[];
|
|
26
|
+
first_publication_date: string;
|
|
27
|
+
last_publication_date: string;
|
|
28
|
+
slugs: string[];
|
|
29
|
+
linked_documents: unknown[];
|
|
30
|
+
lang: string;
|
|
31
|
+
alternate_languages: ContentApiAlternateLanguage[];
|
|
32
|
+
data: Record<string, any>;
|
|
31
33
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
34
|
+
interface ContentApiGraphQLResponse {
|
|
35
|
+
data: Record<string, any>;
|
|
36
|
+
errors?: {
|
|
37
|
+
message: string;
|
|
38
|
+
locations: any;
|
|
39
|
+
}[];
|
|
38
40
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
41
|
+
interface ContentApiRef {
|
|
42
|
+
id: string;
|
|
43
|
+
ref: string;
|
|
44
|
+
label: string;
|
|
45
|
+
isMasterRef?: boolean;
|
|
46
|
+
scheduledAt?: number | undefined;
|
|
45
47
|
}
|
|
46
48
|
interface ContentApiAlternateLanguage {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
id: string;
|
|
50
|
+
type: string;
|
|
51
|
+
lang: string;
|
|
52
|
+
uid?: string;
|
|
51
53
|
}
|
|
52
54
|
type SearchQueryParams = {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
55
|
+
ref?: string;
|
|
56
|
+
query?: string;
|
|
57
|
+
q?: string;
|
|
58
|
+
graphQuery?: string;
|
|
59
|
+
fetchLinks?: string;
|
|
60
|
+
orderings?: string;
|
|
61
|
+
pageSize?: number;
|
|
62
|
+
page?: number;
|
|
63
|
+
lang?: string;
|
|
64
|
+
after?: string;
|
|
65
|
+
routes?: string;
|
|
64
66
|
};
|
|
65
67
|
type ApiVersions = "v1" | "v2";
|
|
66
68
|
/**
|
|
67
|
-
* Client to query the Prismic content api. Uses Playwright to benefit from
|
|
68
|
-
*
|
|
69
|
-
* https://prismic.io/docs/rest-api-technical-reference
|
|
69
|
+
* Client to query the Prismic content api. Uses Playwright to benefit from network request traces
|
|
70
|
+
* in your reports. See api docs: https://prismic.io/docs/rest-api-technical-reference
|
|
70
71
|
*/
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
72
|
+
declare class ContentApiClient extends AuthenticatedApiClient {
|
|
73
|
+
private version;
|
|
74
|
+
private accessToken;
|
|
75
|
+
/**
|
|
76
|
+
* @example
|
|
77
|
+
* To instantiate the class:
|
|
78
|
+
*
|
|
79
|
+
* ```js
|
|
80
|
+
* new ContentApiClient("https://my-repo.cdn.prismic.io", {
|
|
81
|
+
* version: "v2",
|
|
82
|
+
* accessToken: "my-secret-token",
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @param baseURL - The api base URL like https://my-repo.cdn.prismic.io
|
|
87
|
+
* @param config - Optional configuration
|
|
88
|
+
*
|
|
89
|
+
* - {@link config.version}: Api version, default is "v2"
|
|
90
|
+
* - {@link config.accessToken}: Access token for the content api -
|
|
91
|
+
* https://prismic.io/docs/access-token
|
|
92
|
+
*/
|
|
93
|
+
constructor(baseURL: string, config?: {
|
|
94
|
+
version?: ApiVersions;
|
|
95
|
+
accessToken?: string;
|
|
96
|
+
});
|
|
97
|
+
get(path: string, params?: SearchQueryParams, headers?: Record<string, string>): Promise<APIResponse>;
|
|
98
|
+
getAsJson<T>(url: string, params?: SearchQueryParams, headers?: Record<string, string>): Promise<T>;
|
|
99
|
+
/** Query the graphql api - https://prismic.io/docs/graphql-technical-reference */
|
|
100
|
+
graphql(ref: string, query: string): Promise<ContentApiGraphQLResponse>;
|
|
101
|
+
getRefs(): Promise<ContentApiRef[]>;
|
|
102
|
+
getMasterRef(): Promise<string>;
|
|
103
|
+
getRefByReleaseID(releaseID: string): Promise<string>;
|
|
104
|
+
/** Search documents from the `/api/v<version>/documents/search` endpoint. */
|
|
105
|
+
search(filters?: SearchQueryParams): Promise<ContentApiSearchResponse>;
|
|
106
|
+
/**
|
|
107
|
+
* Search for a single document by its it, using the `/api/v<version>/documents/search` endpoint
|
|
108
|
+
* and a default filter.
|
|
109
|
+
*/
|
|
110
|
+
searchByID(id: string, filters?: SearchQueryParams): Promise<ContentApiSearchResponse>;
|
|
111
|
+
/** Retrieve a single document or undefined if not found. */
|
|
112
|
+
getDocumentByID(id: string, filters?: SearchQueryParams): Promise<ContentApiDocument | undefined>;
|
|
111
113
|
}
|
|
112
|
-
|
|
114
|
+
//#endregion
|
|
115
|
+
export { ContentApiClient, ContentApiDocument, ContentApiError, ContentApiGraphQLResponse, ContentApiRef, ContentApiSearchResponse };
|
|
116
|
+
//# sourceMappingURL=contentApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contentApi.d.ts","names":[],"sources":["../../src/clients/contentApi.ts"],"mappings":";;;;UAIiB,eAAA;EAChB,IAAA;EACA,OAAO;AAAA;AAAA,UAES,wBAAA;EAChB,IAAA;EACA,gBAAA;EACA,YAAA;EACA,kBAAA;EACA,WAAA;EACA,SAAA;EACA,SAAA;EACA,OAAA,EAAS,kBAAkB;AAAA;AAAA,UAGX,kBAAA;EAChB,EAAA;EACA,GAAA;EACA,GAAA;EACA,IAAA;EACA,IAAA;EACA,IAAA;EACA,sBAAA;EACA,qBAAA;EACA,KAAA;EACA,gBAAA;EACA,IAAA;EACA,mBAAA,EAAqB,2BAAA;EAErB,IAAA,EAAM,MAAM;AAAA;AAAA,UAGI,yBAAA;EAEhB,IAAA,EAAM,MAAM;EAEZ,MAAA;IAAW,OAAA;IAAiB,SAAA;EAAA;AAAA;AAAA,UAGZ,aAAA;EAChB,EAAA;EACA,GAAA;EACA,KAAA;EACA,WAAA;EACA,WAAA;AAAA;AAAA,UAGS,2BAAA;EACT,EAAA;EACA,IAAA;EACA,IAAA;EACA,GAAA;AAAA;AAAA,KAmBI,iBAAA;EACJ,GAAA;EACA,KAAA;EACA,CAAA;EACA,UAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA;EACA,MAAA;AAAA;AAAA,KAGI,WAAA;;AAxCO;AACX;;cA6CY,gBAAA,SAAyB,sBAAA;EAAA,QAC7B,OAAA;EAAA,QACA,WAAA;EA3CR;;;;AAEG;AAAA;;;;;;;;;;;;;cA6DS,OAAA,UAAiB,MAAA;IAAU,OAAA,GAAU,WAAA;IAAa,WAAA;EAAA;EASxD,GAAA,CACL,IAAA,UACA,MAAA,GAAS,iBAAA,EACT,OAAA,GAAU,MAAA,mBACR,OAAA,CAAQ,WAAA;EAUL,SAAA,IACL,GAAA,UACA,MAAA,GAAS,iBAAA,EACT,OAAA,GAAU,MAAA,mBACR,OAAA,CAAQ,CAAA;;EAOL,OAAA,CAAQ,GAAA,UAAa,KAAA,WAAgB,OAAA,CAAQ,yBAAA;EAI7C,OAAA,IAAW,OAAA,CAAQ,aAAA;EAMnB,YAAA,IAAgB,OAAA;EAWhB,iBAAA,CAAkB,SAAA,WAAoB,OAAA;EA7Ef;EAwFvB,MAAA,CAAO,OAAA,GAAU,iBAAA,GAAoB,OAAA,CAAQ,wBAAA;EAvDzC;;;;EAuEJ,UAAA,CAAW,EAAA,UAAY,OAAA,GAAU,iBAAA,GAAoB,OAAA,CAAQ,wBAAA;EAxDxD;EA6DL,eAAA,CACL,EAAA,UACA,OAAA,GAAU,iBAAA,GACR,OAAA,CAAQ,kBAAA;AAAA"}
|
|
@@ -1,105 +1,96 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => {
|
|
4
|
-
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
|
-
return value;
|
|
6
|
-
};
|
|
7
1
|
import { AuthenticatedApiClient } from "./apiClient.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
throw new Error(`Too many documents returned with the same id ${id}`);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
export {
|
|
103
|
-
ContentApiClient
|
|
2
|
+
//#region src/clients/contentApi.ts
|
|
3
|
+
/**
|
|
4
|
+
* Client to query the Prismic content api. Uses Playwright to benefit from network request traces
|
|
5
|
+
* in your reports. See api docs: https://prismic.io/docs/rest-api-technical-reference
|
|
6
|
+
*/
|
|
7
|
+
var ContentApiClient = class extends AuthenticatedApiClient {
|
|
8
|
+
version;
|
|
9
|
+
accessToken;
|
|
10
|
+
/**
|
|
11
|
+
* @example
|
|
12
|
+
* To instantiate the class:
|
|
13
|
+
*
|
|
14
|
+
* ```js
|
|
15
|
+
* new ContentApiClient("https://my-repo.cdn.prismic.io", {
|
|
16
|
+
* version: "v2",
|
|
17
|
+
* accessToken: "my-secret-token",
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @param baseURL - The api base URL like https://my-repo.cdn.prismic.io
|
|
22
|
+
* @param config - Optional configuration
|
|
23
|
+
*
|
|
24
|
+
* - {@link config.version}: Api version, default is "v2"
|
|
25
|
+
* - {@link config.accessToken}: Access token for the content api -
|
|
26
|
+
* https://prismic.io/docs/access-token
|
|
27
|
+
*/
|
|
28
|
+
constructor(baseURL, config = {}) {
|
|
29
|
+
super(baseURL, config.accessToken || "");
|
|
30
|
+
this.version = config.version || "v2";
|
|
31
|
+
this.accessToken = config.accessToken;
|
|
32
|
+
}
|
|
33
|
+
async get(path, params, headers) {
|
|
34
|
+
const context = await this.getContext();
|
|
35
|
+
const securityParams = this.accessToken ? { access_token: this.accessToken } : {};
|
|
36
|
+
return context.get(path, {
|
|
37
|
+
params: {
|
|
38
|
+
...securityParams,
|
|
39
|
+
...params
|
|
40
|
+
},
|
|
41
|
+
headers
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async getAsJson(url, params, headers) {
|
|
45
|
+
return (await this.get(url, params, headers)).json();
|
|
46
|
+
}
|
|
47
|
+
/** Query the graphql api - https://prismic.io/docs/graphql-technical-reference */
|
|
48
|
+
async graphql(ref, query) {
|
|
49
|
+
return this.getAsJson("graphql", { query }, { "Prismic-ref": ref });
|
|
50
|
+
}
|
|
51
|
+
async getRefs() {
|
|
52
|
+
return (await this.getAsJson(`api/${this.version}`)).refs;
|
|
53
|
+
}
|
|
54
|
+
async getMasterRef() {
|
|
55
|
+
const masterRef = (await this.getRefs()).find(({ isMasterRef }) => isMasterRef === true);
|
|
56
|
+
if (!masterRef) throw "No master ref found";
|
|
57
|
+
return masterRef.ref;
|
|
58
|
+
}
|
|
59
|
+
async getRefByReleaseID(releaseID) {
|
|
60
|
+
const release = (await this.getRefs()).find(({ id }) => id === releaseID);
|
|
61
|
+
if (!release) throw `No ref found for release ${releaseID}`;
|
|
62
|
+
return release.ref;
|
|
63
|
+
}
|
|
64
|
+
/** Search documents from the `/api/v<version>/documents/search` endpoint. */
|
|
65
|
+
async search(filters) {
|
|
66
|
+
let ref = filters?.ref;
|
|
67
|
+
if (!ref) ref = await this.getMasterRef();
|
|
68
|
+
return this.getAsJson(`api/${this.version}/documents/search`, {
|
|
69
|
+
...filters,
|
|
70
|
+
ref
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Search for a single document by its it, using the `/api/v<version>/documents/search` endpoint
|
|
75
|
+
* and a default filter.
|
|
76
|
+
*/
|
|
77
|
+
async searchByID(id, filters) {
|
|
78
|
+
return this.search({
|
|
79
|
+
...filters,
|
|
80
|
+
q: `[[at(document.id, "${id}")]]`
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
/** Retrieve a single document or undefined if not found. */
|
|
84
|
+
async getDocumentByID(id, filters) {
|
|
85
|
+
const data = await this.searchByID(id, filters);
|
|
86
|
+
switch (data.results_size) {
|
|
87
|
+
case 0: return;
|
|
88
|
+
case 1: return data.results[0];
|
|
89
|
+
default: throw new Error(`Too many documents returned with the same id ${id}`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
104
92
|
};
|
|
105
|
-
//#
|
|
93
|
+
//#endregion
|
|
94
|
+
export { ContentApiClient };
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=contentApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contentApi.js","sources":["
|
|
1
|
+
{"version":3,"file":"contentApi.js","names":[],"sources":["../../src/clients/contentApi.ts"],"sourcesContent":["import type { APIResponse } from \"@playwright/test\"\n\nimport { AuthenticatedApiClient } from \"./apiClient\"\n\nexport interface ContentApiError {\n\ttype: string\n\tmessage: string\n}\nexport interface ContentApiSearchResponse {\n\tpage: number\n\tresults_per_page: number\n\tresults_size: number\n\ttotal_results_size: number\n\ttotal_pages: number\n\tnext_page: string | null\n\tprev_page: string | null\n\tresults: ContentApiDocument[]\n}\n\nexport interface ContentApiDocument {\n\tid: string\n\tuid: string | null\n\turl: string | null\n\ttype: string\n\thref: string\n\ttags: string[]\n\tfirst_publication_date: string\n\tlast_publication_date: string\n\tslugs: string[]\n\tlinked_documents: unknown[]\n\tlang: string\n\talternate_languages: ContentApiAlternateLanguage[]\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tdata: Record<string, any>\n}\n\nexport interface ContentApiGraphQLResponse {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tdata: Record<string, any>\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\terrors?: { message: string; locations: any }[]\n}\n\nexport interface ContentApiRef {\n\tid: string\n\tref: string\n\tlabel: string\n\tisMasterRef?: boolean\n\tscheduledAt?: number | undefined\n}\n\ninterface ContentApiAlternateLanguage {\n\tid: string\n\ttype: string\n\tlang: string\n\tuid?: string\n}\n\ninterface ContentApiRepoConfigResponse {\n\trefs: ContentApiRef[]\n\tbookmarks: Record<string, unknown>\n\ttypes: Record<string, string>\n\tlanguages: {\n\t\tid: string\n\t\tname: string\n\t\tis_master: boolean\n\t}[]\n\toauth_initiate: string\n\toauth_token: string\n\ttags: string[]\n\tlicense: string\n\tversion: string\n}\n\ntype SearchQueryParams = {\n\tref?: string\n\tquery?: string\n\tq?: string\n\tgraphQuery?: string\n\tfetchLinks?: string\n\torderings?: string\n\tpageSize?: number\n\tpage?: number\n\tlang?: string\n\tafter?: string\n\troutes?: string\n}\n\ntype ApiVersions = \"v1\" | \"v2\"\n\n/**\n * Client to query the Prismic content api. Uses Playwright to benefit from network request traces\n * in your reports. See api docs: https://prismic.io/docs/rest-api-technical-reference\n */\nexport class ContentApiClient extends AuthenticatedApiClient {\n\tprivate version: ApiVersions\n\tprivate accessToken: string | undefined\n\n\t/**\n\t * @example\n\t * \tTo instantiate the class:\n\t *\n\t * \t```js\n\t * \tnew ContentApiClient(\"https://my-repo.cdn.prismic.io\", {\n\t * \tversion: \"v2\",\n\t * \taccessToken: \"my-secret-token\",\n\t * \t});\n\t * \t```\n\t *\n\t * @param baseURL - The api base URL like https://my-repo.cdn.prismic.io\n\t * @param config - Optional configuration\n\t *\n\t * - {@link config.version}: Api version, default is \"v2\"\n\t * - {@link config.accessToken}: Access token for the content api -\n\t * https://prismic.io/docs/access-token\n\t */\n\tconstructor(baseURL: string, config: { version?: ApiVersions; accessToken?: string } = {}) {\n\t\t// Use an empty string as Authorization header in case it is already set globally in the project Playwright config file.\n\t\t// This is because the content api returns an error in case it gets an non-empty invalid Authorization\n\t\t// even though it actually checks authorization from the access_token query parameter.\n\t\tsuper(baseURL, config.accessToken || \"\")\n\t\tthis.version = config.version || \"v2\"\n\t\tthis.accessToken = config.accessToken\n\t}\n\n\tasync get(\n\t\tpath: string,\n\t\tparams?: SearchQueryParams,\n\t\theaders?: Record<string, string>,\n\t): Promise<APIResponse> {\n\t\tconst context = await this.getContext()\n\t\tconst securityParams = this.accessToken ? { access_token: this.accessToken } : {} as Record<string, never>\n\n\t\treturn context.get(path, {\n\t\t\tparams: { ...securityParams, ...params },\n\t\t\theaders,\n\t\t})\n\t}\n\n\tasync getAsJson<T>(\n\t\turl: string,\n\t\tparams?: SearchQueryParams,\n\t\theaders?: Record<string, string>,\n\t): Promise<T> {\n\t\tconst response = await this.get(url, params, headers)\n\n\t\treturn response.json() as T\n\t}\n\n\t/** Query the graphql api - https://prismic.io/docs/graphql-technical-reference */\n\tasync graphql(ref: string, query: string): Promise<ContentApiGraphQLResponse> {\n\t\treturn this.getAsJson<ContentApiGraphQLResponse>(\"graphql\", { query }, { \"Prismic-ref\": ref })\n\t}\n\n\tasync getRefs(): Promise<ContentApiRef[]> {\n\t\tconst data = await this.getAsJson<ContentApiRepoConfigResponse>(`api/${this.version}`)\n\n\t\treturn data.refs\n\t}\n\n\tasync getMasterRef(): Promise<string> {\n\t\tconst refs = await this.getRefs()\n\n\t\tconst masterRef = refs.find(({ isMasterRef }) => isMasterRef === true)\n\t\tif (!masterRef) {\n\t\t\tthrow \"No master ref found\"\n\t\t}\n\n\t\treturn masterRef.ref\n\t}\n\n\tasync getRefByReleaseID(releaseID: string): Promise<string> {\n\t\tconst refs = await this.getRefs()\n\t\tconst release = refs.find(({ id }) => id === releaseID)\n\t\tif (!release) {\n\t\t\tthrow `No ref found for release ${releaseID}`\n\t\t}\n\n\t\treturn release.ref\n\t}\n\n\t/** Search documents from the `/api/v<version>/documents/search` endpoint. */\n\tasync search(filters?: SearchQueryParams): Promise<ContentApiSearchResponse> {\n\t\tlet ref = filters?.ref\n\t\tif (!ref) {\n\t\t\tref = await this.getMasterRef()\n\t\t}\n\n\t\treturn this.getAsJson<ContentApiSearchResponse>(`api/${this.version}/documents/search`, {\n\t\t\t...filters,\n\t\t\tref,\n\t\t})\n\t}\n\n\t/**\n\t * Search for a single document by its it, using the `/api/v<version>/documents/search` endpoint\n\t * and a default filter.\n\t */\n\tasync searchByID(id: string, filters?: SearchQueryParams): Promise<ContentApiSearchResponse> {\n\t\treturn this.search({ ...filters, q: `[[at(document.id, \"${id}\")]]` })\n\t}\n\n\t/** Retrieve a single document or undefined if not found. */\n\tasync getDocumentByID(\n\t\tid: string,\n\t\tfilters?: SearchQueryParams,\n\t): Promise<ContentApiDocument | undefined> {\n\t\tconst data = await this.searchByID(id, filters)\n\t\tswitch (data.results_size) {\n\t\t\tcase 0:\n\t\t\t\treturn\n\t\t\tcase 1:\n\t\t\t\treturn data.results[0]\n\t\t\tdefault:\n\t\t\t\tthrow new Error(`Too many documents returned with the same id ${id}`)\n\t\t}\n\t}\n}\n"],"mappings":";;;;;;AA8FA,IAAa,mBAAb,cAAsC,uBAAuB;CAC5D;CACA;;;;;;;;;;;;;;;;;;;CAoBA,YAAY,SAAiB,SAA0D,CAAC,GAAG;EAI1F,MAAM,SAAS,OAAO,eAAe,EAAE;EACvC,KAAK,UAAU,OAAO,WAAW;EACjC,KAAK,cAAc,OAAO;CAC3B;CAEA,MAAM,IACL,MACA,QACA,SACuB;EACvB,MAAM,UAAU,MAAM,KAAK,WAAW;EACtC,MAAM,iBAAiB,KAAK,cAAc,EAAE,cAAc,KAAK,YAAY,IAAI,CAAC;EAEhF,OAAO,QAAQ,IAAI,MAAM;GACxB,QAAQ;IAAE,GAAG;IAAgB,GAAG;GAAO;GACvC;EACD,CAAC;CACF;CAEA,MAAM,UACL,KACA,QACA,SACa;EAGb,QAAO,MAFgB,KAAK,IAAI,KAAK,QAAQ,OAAO,EAAA,CAEpC,KAAK;CACtB;;CAGA,MAAM,QAAQ,KAAa,OAAmD;EAC7E,OAAO,KAAK,UAAqC,WAAW,EAAE,MAAM,GAAG,EAAE,eAAe,IAAI,CAAC;CAC9F;CAEA,MAAM,UAAoC;EAGzC,QAAO,MAFY,KAAK,UAAwC,OAAO,KAAK,SAAS,EAAA,CAEzE;CACb;CAEA,MAAM,eAAgC;EAGrC,MAAM,aAAY,MAFC,KAAK,QAAQ,EAAA,CAET,MAAM,EAAE,kBAAkB,gBAAgB,IAAI;EACrE,IAAI,CAAC,WACJ,MAAM;EAGP,OAAO,UAAU;CAClB;CAEA,MAAM,kBAAkB,WAAoC;EAE3D,MAAM,WAAU,MADG,KAAK,QAAQ,EAAA,CACX,MAAM,EAAE,SAAS,OAAO,SAAS;EACtD,IAAI,CAAC,SACJ,MAAM,4BAA4B;EAGnC,OAAO,QAAQ;CAChB;;CAGA,MAAM,OAAO,SAAgE;EAC5E,IAAI,MAAM,SAAS;EACnB,IAAI,CAAC,KACJ,MAAM,MAAM,KAAK,aAAa;EAG/B,OAAO,KAAK,UAAoC,OAAO,KAAK,QAAQ,oBAAoB;GACvF,GAAG;GACH;EACD,CAAC;CACF;;;;;CAMA,MAAM,WAAW,IAAY,SAAgE;EAC5F,OAAO,KAAK,OAAO;GAAE,GAAG;GAAS,GAAG,sBAAsB,GAAG;EAAM,CAAC;CACrE;;CAGA,MAAM,gBACL,IACA,SAC0C;EAC1C,MAAM,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO;EAC9C,QAAQ,KAAK,cAAb;GACC,KAAK,GACJ;GACD,KAAK,GACJ,OAAO,KAAK,QAAQ;GACrB,SACC,MAAM,IAAI,MAAM,gDAAgD,IAAI;EACtE;CACD;AACD"}
|