@remkoj/optimizely-graph-client 1.0.3 → 2.0.0-pre1
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/admin-api/client/OptimizelyGraphAdminApi.js +1 -1
- package/dist/admin-api/client/core/OpenAPI.js +1 -1
- package/dist/admin-api/client/index.d.ts +1 -0
- package/dist/admin-api/client/index.js +1 -0
- package/dist/admin-api/client/index.js.map +1 -1
- package/dist/admin-api/client/models/DeleteMode.d.ts +5 -0
- package/dist/admin-api/client/models/DeleteMode.js +11 -0
- package/dist/admin-api/client/models/DeleteMode.js.map +1 -0
- package/dist/admin-api/client/models/PropertyType_V3.d.ts +2 -0
- package/dist/admin-api/client/services/DefinitionV3Service.d.ts +25 -11
- package/dist/admin-api/client/services/DefinitionV3Service.js +25 -12
- package/dist/admin-api/client/services/DefinitionV3Service.js.map +1 -1
- package/dist/admin-api/client/services/LogsService.d.ts +1 -1
- package/dist/admin-api/client/services/LogsService.js +1 -1
- package/dist/admin-api/client/services/ResourcesService.d.ts +20 -2
- package/dist/admin-api/client/services/ResourcesService.js +40 -2
- package/dist/admin-api/client/services/ResourcesService.js.map +1 -1
- package/dist/admin-api/client/services/WebhooksService.d.ts +10 -8
- package/dist/admin-api/client/services/WebhooksService.js +10 -8
- package/dist/admin-api/client/services/WebhooksService.js.map +1 -1
- package/dist/admin-api/index.d.ts +37 -2
- package/dist/admin-api/index.js +69 -14
- package/dist/admin-api/index.js.map +1 -1
- package/dist/admin-api/request/OptiHttpRequest.d.ts +18 -0
- package/dist/admin-api/request/OptiHttpRequest.js +27 -0
- package/dist/admin-api/request/OptiHttpRequest.js.map +1 -0
- package/dist/admin-api/request/index.d.ts +2 -0
- package/dist/admin-api/request/index.js +3 -0
- package/dist/admin-api/request/index.js.map +1 -0
- package/dist/admin-api/request/request.d.ts +14 -0
- package/dist/admin-api/request/request.js +70 -0
- package/dist/admin-api/request/request.js.map +1 -0
- package/dist/admin-api/types.d.ts +12 -0
- package/dist/admin-api/types.js +2 -0
- package/dist/admin-api/types.js.map +1 -0
- package/dist/client/client.d.ts +1 -1
- package/dist/client/client.js +4 -2
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts +21 -0
- package/dist/{client/hmac-fetch.js → hmac-fetch.js} +3 -3
- package/dist/hmac-fetch.js.map +1 -0
- package/dist/services/channel-repository/definition.d.ts +7 -1
- package/dist/services/channel-repository/definition.js +14 -0
- package/dist/services/channel-repository/definition.js.map +1 -1
- package/dist/services/channel-repository/repository.js +3 -3
- package/dist/services/channel-repository/repository.js.map +1 -1
- package/dist/services/channel-repository/types.d.ts +9 -5
- package/dist/services/index.d.ts +5 -3
- package/dist/services/index.js +2 -1
- package/dist/services/index.js.map +1 -1
- package/dist/services/routing/index.d.ts +4 -83
- package/dist/services/routing/index.js +2 -242
- package/dist/services/routing/index.js.map +1 -1
- package/dist/services/routing/queries/getAllRoutes.d.ts +28 -0
- package/dist/services/routing/queries/getAllRoutes.js +31 -0
- package/dist/services/routing/queries/getAllRoutes.js.map +1 -0
- package/dist/services/routing/queries/getRouteById.d.ts +13 -0
- package/dist/services/routing/queries/getRouteById.js +24 -0
- package/dist/services/routing/queries/getRouteById.js.map +1 -0
- package/dist/services/routing/queries/getRouteByPath.d.ts +12 -0
- package/dist/services/routing/queries/getRouteByPath.js +30 -0
- package/dist/services/routing/queries/getRouteByPath.js.map +1 -0
- package/dist/services/routing/resolver.d.ts +45 -0
- package/dist/services/routing/resolver.js +137 -0
- package/dist/services/routing/resolver.js.map +1 -0
- package/dist/services/routing/types.d.ts +3 -18
- package/dist/services/types.d.ts +14 -0
- package/dist/services/types.js +2 -0
- package/dist/services/types.js.map +1 -0
- package/dist/services/utils.d.ts +69 -0
- package/dist/services/utils.js +135 -0
- package/dist/services/utils.js.map +1 -0
- package/package.json +12 -7
- package/dist/admin-api/request.d.ts +0 -5
- package/dist/admin-api/request.js +0 -32
- package/dist/admin-api/request.js.map +0 -1
- package/dist/client/hmac-fetch.js.map +0 -1
- /package/dist/{client/hmac-fetch.d.ts → hmac-fetch.d.ts} +0 -0
|
@@ -1,243 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export class RouteResolver {
|
|
4
|
-
/**
|
|
5
|
-
* Create a new Route Resolver
|
|
6
|
-
*
|
|
7
|
-
* @param client ContentGraph configuration override
|
|
8
|
-
* @param apolloConfig Apollo Client configuration override
|
|
9
|
-
*/
|
|
10
|
-
constructor(clientOrConfig) {
|
|
11
|
-
this._cgClient = isContentGraphClient(clientOrConfig) ? clientOrConfig : createClient(clientOrConfig);
|
|
12
|
-
}
|
|
13
|
-
async getRoutes(siteId) {
|
|
14
|
-
this._cgClient.updateFlags({ queryCache: false }, true);
|
|
15
|
-
let page = await this._cgClient.request(GetAllRoutes.query, { siteId, typeFilter: "Page" });
|
|
16
|
-
let results = page?.Content?.items ?? [];
|
|
17
|
-
const totalCount = page?.Content?.total ?? 0;
|
|
18
|
-
const cursor = page?.Content?.cursor ?? '';
|
|
19
|
-
if (totalCount > 0 && cursor !== '' && totalCount > results.length)
|
|
20
|
-
while ((page?.Content?.items?.length ?? 0) > 0 && results.length < totalCount) {
|
|
21
|
-
page = await this._cgClient.request({
|
|
22
|
-
document: GetAllRoutes.query,
|
|
23
|
-
variables: {
|
|
24
|
-
cursor,
|
|
25
|
-
siteId,
|
|
26
|
-
typeFilter: "Page"
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
results = results.concat(page.Content?.items ?? []);
|
|
30
|
-
}
|
|
31
|
-
this._cgClient.restoreFlags();
|
|
32
|
-
return results.map(this.tryConvertResponse.bind(this)).filter(this.isNotNullOrUndefined);
|
|
33
|
-
}
|
|
34
|
-
async getContentInfoByPath(path, siteId) {
|
|
35
|
-
if (this._cgClient.debug)
|
|
36
|
-
console.log(`Resolving content info for ${path} on ${siteId ? "site " + siteId : "all sites"}`);
|
|
37
|
-
const resultSet = await this._cgClient.request({
|
|
38
|
-
document: GetRouteByPath.query,
|
|
39
|
-
variables: {
|
|
40
|
-
path,
|
|
41
|
-
siteId
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
if ((resultSet.Content?.items?.length ?? 0) === 0) {
|
|
45
|
-
if (this._cgClient.debug)
|
|
46
|
-
console.warn("No items in the resultset");
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
if ((resultSet.Content?.items?.length ?? 0) > 1)
|
|
50
|
-
throw new Error("Ambiguous URL provided, did you omit the siteId in a multi-channel setup?");
|
|
51
|
-
if (this._cgClient.debug)
|
|
52
|
-
console.log(`Resolved content info for ${path} to:`, resultSet.Content.items[0]);
|
|
53
|
-
return this.convertResponse(resultSet.Content.items[0]);
|
|
54
|
-
}
|
|
55
|
-
async getContentInfoById(contentId, locale) {
|
|
56
|
-
const [id, workId] = this.parseIdString(contentId);
|
|
57
|
-
const variables = {
|
|
58
|
-
id,
|
|
59
|
-
workId,
|
|
60
|
-
locale: locale.replaceAll('-', '_')
|
|
61
|
-
};
|
|
62
|
-
if (this._cgClient.debug)
|
|
63
|
-
console.log("Resolving content by id:", JSON.stringify(variables));
|
|
64
|
-
const resultSet = await this._cgClient.request({
|
|
65
|
-
document: GetRouteById.query,
|
|
66
|
-
variables
|
|
67
|
-
});
|
|
68
|
-
if (resultSet.Content?.total >= 1) {
|
|
69
|
-
if (this._cgClient.debug && resultSet.Content?.total > 1)
|
|
70
|
-
console.warn(`Received multiple entries with this ID, returning the first one from: ${(resultSet.Content?.items || []).map(x => { return `${x.contentLink.id}_${x.contentLink.workId}_${x.locale.name}`; }).join('; ')}`);
|
|
71
|
-
return this.convertResponse(resultSet.Content.items[0]);
|
|
72
|
-
}
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
routeToContentLink(route) {
|
|
76
|
-
return {
|
|
77
|
-
id: route.id,
|
|
78
|
-
workId: route.workId,
|
|
79
|
-
guidValue: route.guid,
|
|
80
|
-
locale: route.language
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
parseIdString(id) {
|
|
84
|
-
let cId = -1;
|
|
85
|
-
let workId = null;
|
|
86
|
-
if (id.indexOf("_") > 0) {
|
|
87
|
-
[cId, workId] = id.split("_").map(x => {
|
|
88
|
-
try {
|
|
89
|
-
return Number.parseInt(x, 10);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
return -1;
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
if (workId < 0)
|
|
96
|
-
workId = null;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
try {
|
|
100
|
-
cId = Number.parseInt(id, 10);
|
|
101
|
-
}
|
|
102
|
-
catch {
|
|
103
|
-
cId = -1;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
return [cId, workId];
|
|
107
|
-
}
|
|
108
|
-
convertResponse(item) {
|
|
109
|
-
return {
|
|
110
|
-
// Take the GQL response
|
|
111
|
-
...item,
|
|
112
|
-
// Then add/override the needed fields
|
|
113
|
-
url: new URL(item.url),
|
|
114
|
-
id: item.contentLink?.id || 0,
|
|
115
|
-
workId: item.contentLink?.workId,
|
|
116
|
-
guid: item.contentLink?.guidValue || "",
|
|
117
|
-
language: item.locale.name,
|
|
118
|
-
published: item.published ? new Date(item.published) : null,
|
|
119
|
-
changed: item.changed ? new Date(item.changed) : null
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
tryConvertResponse(item) {
|
|
123
|
-
try {
|
|
124
|
-
return this.convertResponse(item);
|
|
125
|
-
}
|
|
126
|
-
catch (e) {
|
|
127
|
-
console.error(`Unable to convert ${JSON.stringify(item)} to Route`, e);
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
isNotNullOrUndefined(input) {
|
|
132
|
-
return input != null && input != undefined;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
export default RouteResolver;
|
|
136
|
-
export var GetAllRoutes;
|
|
137
|
-
(function (GetAllRoutes) {
|
|
138
|
-
GetAllRoutes.query = gql `query GetAllRoutes($cursor: String, $pageSize: Int = 100, $typeFilter: [String] = "Page", $siteId: String = null)
|
|
139
|
-
{
|
|
140
|
-
Content(
|
|
141
|
-
where: {
|
|
142
|
-
_and: {
|
|
143
|
-
_and: {
|
|
144
|
-
RelativePath: { exist: true }
|
|
145
|
-
ContentType: { in: $typeFilter }
|
|
146
|
-
SiteId: { eq: $siteId }
|
|
147
|
-
}
|
|
148
|
-
RelativePath: { notIn: [""] }
|
|
149
|
-
}
|
|
150
|
-
},
|
|
151
|
-
limit: $pageSize,
|
|
152
|
-
cursor: $cursor
|
|
153
|
-
) {
|
|
154
|
-
items {
|
|
155
|
-
path: RelativePath
|
|
156
|
-
locale:Language { name: Name }
|
|
157
|
-
contentLink: ContentLink { id: Id, workId: WorkId, guidValue: GuidValue }
|
|
158
|
-
name: Name
|
|
159
|
-
contentType: ContentType
|
|
160
|
-
slug: RouteSegment
|
|
161
|
-
changed: Changed
|
|
162
|
-
published: StartPublish
|
|
163
|
-
siteId: SiteId
|
|
164
|
-
url: Url
|
|
165
|
-
},
|
|
166
|
-
cursor,
|
|
167
|
-
total
|
|
168
|
-
}
|
|
169
|
-
}`;
|
|
170
|
-
})(GetAllRoutes || (GetAllRoutes = {}));
|
|
171
|
-
export var GetRouteByPath;
|
|
172
|
-
(function (GetRouteByPath) {
|
|
173
|
-
GetRouteByPath.query = gql `query GetRouteByPath($path: String!, $siteId: String) {
|
|
174
|
-
Content(
|
|
175
|
-
where: {
|
|
176
|
-
_and: {
|
|
177
|
-
RelativePath: {
|
|
178
|
-
eq: $path
|
|
179
|
-
},
|
|
180
|
-
SiteId: {
|
|
181
|
-
eq:$siteId
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
)
|
|
186
|
-
{
|
|
187
|
-
total,
|
|
188
|
-
items {
|
|
189
|
-
route: RelativePath
|
|
190
|
-
url: Url
|
|
191
|
-
locale:Language { name: Name }
|
|
192
|
-
contentLink: ContentLink { id: Id, workId: WorkId, guidValue: GuidValue }
|
|
193
|
-
name: Name,
|
|
194
|
-
contentType: ContentType,
|
|
195
|
-
slug: RouteSegment,
|
|
196
|
-
changed: Changed,
|
|
197
|
-
published: StartPublish
|
|
198
|
-
siteId: SiteId
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
}`;
|
|
202
|
-
})(GetRouteByPath || (GetRouteByPath = {}));
|
|
203
|
-
export var GetRouteById;
|
|
204
|
-
(function (GetRouteById) {
|
|
205
|
-
GetRouteById.query = gql `query GetRouteById($id: Int!, $workId: Int, $locale: [Locales]!) {
|
|
206
|
-
Content(
|
|
207
|
-
where: {
|
|
208
|
-
ContentLink: {
|
|
209
|
-
Id: {
|
|
210
|
-
eq: $id
|
|
211
|
-
}
|
|
212
|
-
WorkId: {
|
|
213
|
-
eq: $workId
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
},
|
|
217
|
-
locale: $locale
|
|
218
|
-
limit: 1,
|
|
219
|
-
orderBy: {
|
|
220
|
-
ContentLink: {
|
|
221
|
-
WorkId: DESC
|
|
222
|
-
}
|
|
223
|
-
Status: ASC
|
|
224
|
-
}
|
|
225
|
-
)
|
|
226
|
-
{
|
|
227
|
-
total,
|
|
228
|
-
items {
|
|
229
|
-
route: RelativePath
|
|
230
|
-
url: Url
|
|
231
|
-
locale:Language { name: Name }
|
|
232
|
-
contentLink: ContentLink { id: Id, workId: WorkId, guidValue: GuidValue }
|
|
233
|
-
name: Name,
|
|
234
|
-
contentType: ContentType,
|
|
235
|
-
slug: RouteSegment,
|
|
236
|
-
changed: Changed,
|
|
237
|
-
published: StartPublish
|
|
238
|
-
siteId: SiteId
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}`;
|
|
242
|
-
})(GetRouteById || (GetRouteById = {}));
|
|
1
|
+
export * from "./resolver.js";
|
|
2
|
+
export { RouteResolver as default } from "./resolver.js";
|
|
243
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/routing/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/routing/index.ts"],"names":[],"mappings":"AAEA,cAAc,eAAe,CAAA;AAC7B,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type Route = {
|
|
2
|
+
_metadata: {
|
|
3
|
+
key: string;
|
|
4
|
+
version: string;
|
|
5
|
+
locale: string;
|
|
6
|
+
displayName: string;
|
|
7
|
+
types: Array<string>;
|
|
8
|
+
url: {
|
|
9
|
+
path: string;
|
|
10
|
+
domain: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
changed: string;
|
|
14
|
+
};
|
|
15
|
+
export type Result = {
|
|
16
|
+
Content: {
|
|
17
|
+
items: Route[];
|
|
18
|
+
cursor: string;
|
|
19
|
+
total: number;
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
export type Variables = {
|
|
23
|
+
cursor?: string;
|
|
24
|
+
pageSize?: number;
|
|
25
|
+
typeFilter?: string | string[];
|
|
26
|
+
domain?: string;
|
|
27
|
+
};
|
|
28
|
+
export declare const query: string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { gql } from "graphql-request";
|
|
2
|
+
export const query = gql `query GetAllRoutes($cursor: String, $pageSize: Int = 100, $typeFilter: [String] = "Page", $domain: String) {
|
|
3
|
+
Content(
|
|
4
|
+
where: {
|
|
5
|
+
_metadata: {
|
|
6
|
+
url: { hierarchical: { exist: true }, base: { eq: $domain } }
|
|
7
|
+
types: { in: $typeFilter }
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
limit: $pageSize
|
|
11
|
+
cursor: $cursor
|
|
12
|
+
) {
|
|
13
|
+
items {
|
|
14
|
+
_metadata {
|
|
15
|
+
key
|
|
16
|
+
version
|
|
17
|
+
locale
|
|
18
|
+
displayName
|
|
19
|
+
types
|
|
20
|
+
url {
|
|
21
|
+
path: hierarchical
|
|
22
|
+
domain: base
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
changed: _modified
|
|
26
|
+
}
|
|
27
|
+
cursor
|
|
28
|
+
total
|
|
29
|
+
}
|
|
30
|
+
}`;
|
|
31
|
+
//# sourceMappingURL=getAllRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAllRoutes.js","sourceRoot":"","sources":["../../../../src/services/routing/queries/getAllRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAgCrC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BtB,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type Route } from "./getAllRoutes.js";
|
|
2
|
+
export type Variables = {
|
|
3
|
+
key: string;
|
|
4
|
+
version?: string | null;
|
|
5
|
+
locale?: Array<string | null> | string | null;
|
|
6
|
+
};
|
|
7
|
+
export type Result = {
|
|
8
|
+
Content: {
|
|
9
|
+
total: number;
|
|
10
|
+
items: Route[];
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export declare const query: string;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { gql } from "graphql-request";
|
|
2
|
+
export const query = gql `query GetRouteById($key: String!, $version: String, $locale: [Locales]) {
|
|
3
|
+
Content(
|
|
4
|
+
where: { _metadata: { key: { eq: $key }, version: { eq: $workId } } }
|
|
5
|
+
locale: $locale
|
|
6
|
+
) {
|
|
7
|
+
total
|
|
8
|
+
items {
|
|
9
|
+
_metadata {
|
|
10
|
+
key
|
|
11
|
+
version
|
|
12
|
+
locale
|
|
13
|
+
displayName
|
|
14
|
+
types
|
|
15
|
+
url {
|
|
16
|
+
path: hierarchical
|
|
17
|
+
domain: base
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
changed: _modified
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}`;
|
|
24
|
+
//# sourceMappingURL=getRouteById.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRouteById.js","sourceRoot":"","sources":["../../../../src/services/routing/queries/getRouteById.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAgBrC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;EAqBtB,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { gql } from "graphql-request";
|
|
2
|
+
export const query = gql `query GetRouteByPath($path: String!, $domain: String) {
|
|
3
|
+
Content(
|
|
4
|
+
where: {
|
|
5
|
+
_metadata: {
|
|
6
|
+
url: {
|
|
7
|
+
hierarchical: { eq: $path }
|
|
8
|
+
base: { eq: $domain }
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
) {
|
|
13
|
+
total
|
|
14
|
+
items {
|
|
15
|
+
_metadata {
|
|
16
|
+
key
|
|
17
|
+
version
|
|
18
|
+
locale
|
|
19
|
+
displayName
|
|
20
|
+
types
|
|
21
|
+
url {
|
|
22
|
+
path: hierarchical
|
|
23
|
+
domain: base
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
changed: _modified
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}`;
|
|
30
|
+
//# sourceMappingURL=getRouteByPath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getRouteByPath.js","sourceRoot":"","sources":["../../../../src/services/routing/queries/getRouteByPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAerC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BtB,CAAA"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type IOptiGraphClient } from '../../client/index.js';
|
|
2
|
+
import type { OptimizelyGraphConfig } from '../../types.js';
|
|
3
|
+
import type { Route } from "./types.js";
|
|
4
|
+
import type { ContentLinkWithLocale } from '../types.js';
|
|
5
|
+
import * as GetAllRoutes from './queries/getAllRoutes.js';
|
|
6
|
+
/**
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
export declare class RouteResolver {
|
|
10
|
+
private _cgClient;
|
|
11
|
+
/**
|
|
12
|
+
* Create a new Route Resolver
|
|
13
|
+
*
|
|
14
|
+
* @param client ContentGraph configuration override
|
|
15
|
+
* @param apolloConfig Apollo Client configuration override
|
|
16
|
+
*/
|
|
17
|
+
constructor(clientOrConfig?: IOptiGraphClient | OptimizelyGraphConfig);
|
|
18
|
+
/**
|
|
19
|
+
* Retrieve all registered routes for the provided domain - all domains if none specified
|
|
20
|
+
*
|
|
21
|
+
* @param domain The domain to filter on
|
|
22
|
+
* @returns The list of routes
|
|
23
|
+
*/
|
|
24
|
+
getRoutes(domain?: string): Promise<Route[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Retrieve route details by path
|
|
27
|
+
*
|
|
28
|
+
* @param path
|
|
29
|
+
* @param domain
|
|
30
|
+
* @returns The route information for the path
|
|
31
|
+
*/
|
|
32
|
+
getContentInfoByPath(path: string, domain?: string): Promise<undefined | Route>;
|
|
33
|
+
getContentInfoById(key: string, locale?: string, version?: string | number): Promise<undefined | Route>;
|
|
34
|
+
/**
|
|
35
|
+
* Extract a content link from a route definition
|
|
36
|
+
*
|
|
37
|
+
* @param route The route to parse
|
|
38
|
+
* @returns The ContentLink, with locale information
|
|
39
|
+
*/
|
|
40
|
+
routeToContentLink(route: Route): ContentLinkWithLocale;
|
|
41
|
+
protected convertResponse(item: GetAllRoutes.Route): Route;
|
|
42
|
+
protected tryConvertResponse(item: GetAllRoutes.Route): Route | undefined;
|
|
43
|
+
protected isNotNullOrUndefined<T>(input: T | null | undefined): input is T;
|
|
44
|
+
}
|
|
45
|
+
export default RouteResolver;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// Import GraphQL Client
|
|
2
|
+
import createClient, { isContentGraphClient } from '../../client/index.js';
|
|
3
|
+
// Import GraphQL Queries
|
|
4
|
+
import * as GetRouteById from './queries/getRouteById.js';
|
|
5
|
+
import * as GetAllRoutes from './queries/getAllRoutes.js';
|
|
6
|
+
import * as GetRouteByPath from './queries/getRouteByPath.js';
|
|
7
|
+
// Main router class
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
*/
|
|
11
|
+
export class RouteResolver {
|
|
12
|
+
/**
|
|
13
|
+
* Create a new Route Resolver
|
|
14
|
+
*
|
|
15
|
+
* @param client ContentGraph configuration override
|
|
16
|
+
* @param apolloConfig Apollo Client configuration override
|
|
17
|
+
*/
|
|
18
|
+
constructor(clientOrConfig) {
|
|
19
|
+
this._cgClient = isContentGraphClient(clientOrConfig) ? clientOrConfig : createClient(clientOrConfig);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Retrieve all registered routes for the provided domain - all domains if none specified
|
|
23
|
+
*
|
|
24
|
+
* @param domain The domain to filter on
|
|
25
|
+
* @returns The list of routes
|
|
26
|
+
*/
|
|
27
|
+
async getRoutes(domain) {
|
|
28
|
+
this._cgClient.updateFlags({ queryCache: false }, true);
|
|
29
|
+
let page = await this._cgClient.request(GetAllRoutes.query, { domain }).catch(e => {
|
|
30
|
+
if (this._cgClient.debug)
|
|
31
|
+
console.error("[RouteResolver] Error while fetching routes", e);
|
|
32
|
+
return undefined;
|
|
33
|
+
});
|
|
34
|
+
let results = page?.Content?.items ?? [];
|
|
35
|
+
const totalCount = page?.Content?.total ?? 0;
|
|
36
|
+
const cursor = page?.Content?.cursor ?? '';
|
|
37
|
+
if (totalCount > 0 && cursor !== '' && totalCount > results.length)
|
|
38
|
+
while ((page?.Content?.items?.length ?? 0) > 0 && results.length < totalCount) {
|
|
39
|
+
page = await this._cgClient.request({
|
|
40
|
+
document: GetAllRoutes.query,
|
|
41
|
+
variables: {
|
|
42
|
+
cursor,
|
|
43
|
+
domain
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
results = results.concat(page.Content?.items ?? []);
|
|
47
|
+
}
|
|
48
|
+
this._cgClient.restoreFlags();
|
|
49
|
+
return results.map(this.tryConvertResponse.bind(this)).filter(this.isNotNullOrUndefined);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Retrieve route details by path
|
|
53
|
+
*
|
|
54
|
+
* @param path
|
|
55
|
+
* @param domain
|
|
56
|
+
* @returns The route information for the path
|
|
57
|
+
*/
|
|
58
|
+
async getContentInfoByPath(path, domain) {
|
|
59
|
+
if (this._cgClient.debug)
|
|
60
|
+
console.log(`Resolving content info for ${path} on ${domain ? domain : "all domains"}`);
|
|
61
|
+
const resultSet = await this._cgClient.request({
|
|
62
|
+
document: GetRouteByPath.query,
|
|
63
|
+
variables: { path, domain }
|
|
64
|
+
});
|
|
65
|
+
if ((resultSet.Content?.items?.length ?? 0) === 0) {
|
|
66
|
+
if (this._cgClient.debug)
|
|
67
|
+
console.warn("No items in the resultset");
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
if ((resultSet.Content?.items?.length ?? 0) > 1)
|
|
71
|
+
throw new Error("Ambiguous URL provided, did you omit the siteId in a multi-channel setup?");
|
|
72
|
+
if (this._cgClient.debug)
|
|
73
|
+
console.log(`Resolved content info for ${path} to:`, resultSet.Content.items[0]);
|
|
74
|
+
return this.convertResponse(resultSet.Content.items[0]);
|
|
75
|
+
}
|
|
76
|
+
async getContentInfoById(key, locale, version) {
|
|
77
|
+
const variables = { key, version: version?.toString(), locale: locale?.replaceAll('-', '_') };
|
|
78
|
+
if (this._cgClient.debug)
|
|
79
|
+
console.log("Resolving content by id:", JSON.stringify(variables));
|
|
80
|
+
const resultSet = await this._cgClient.request({
|
|
81
|
+
document: GetRouteById.query,
|
|
82
|
+
variables
|
|
83
|
+
});
|
|
84
|
+
if (resultSet.Content?.total >= 1) {
|
|
85
|
+
if (this._cgClient.debug && resultSet.Content?.total > 1)
|
|
86
|
+
console.warn(`Received multiple entries with this ID, returning the first one from: ${(resultSet.Content?.items || []).map(x => { return `${x._metadata.key} (version: ${x._metadata.version}, locale: ${x._metadata.locale})`; }).join('; ')}`);
|
|
87
|
+
return this.convertResponse(resultSet.Content.items[0]);
|
|
88
|
+
}
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Extract a content link from a route definition
|
|
93
|
+
*
|
|
94
|
+
* @param route The route to parse
|
|
95
|
+
* @returns The ContentLink, with locale information
|
|
96
|
+
*/
|
|
97
|
+
routeToContentLink(route) {
|
|
98
|
+
return {
|
|
99
|
+
key: route.key,
|
|
100
|
+
version: route.version,
|
|
101
|
+
locale: route.locale
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
convertResponse(item) {
|
|
105
|
+
let itemUrl = new URL('http://localhost');
|
|
106
|
+
try {
|
|
107
|
+
itemUrl = new URL(item._metadata.url.path, item._metadata.url.domain);
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
//Ignore
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
locale: item._metadata.locale,
|
|
114
|
+
path: item._metadata.url.path,
|
|
115
|
+
url: itemUrl,
|
|
116
|
+
slug: "",
|
|
117
|
+
changed: item.changed ? new Date(item.changed) : null,
|
|
118
|
+
contentType: item._metadata.types,
|
|
119
|
+
version: item._metadata.version,
|
|
120
|
+
key: item._metadata.key
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
tryConvertResponse(item) {
|
|
124
|
+
try {
|
|
125
|
+
return this.convertResponse(item);
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
console.error(`Unable to convert ${JSON.stringify(item)} to Route`, e);
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
isNotNullOrUndefined(input) {
|
|
133
|
+
return input != null && input != undefined;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export default RouteResolver;
|
|
137
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/services/routing/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,25 +1,10 @@
|
|
|
1
|
-
export type ContentLink = {
|
|
2
|
-
id: number;
|
|
3
|
-
workId?: number | null;
|
|
4
|
-
guidValue?: string | null;
|
|
5
|
-
} | {
|
|
6
|
-
id?: number | null;
|
|
7
|
-
workId?: number | null;
|
|
8
|
-
guidValue: string;
|
|
9
|
-
};
|
|
10
|
-
export type ContentLinkWithLocale = ContentLink & {
|
|
11
|
-
locale?: string;
|
|
12
|
-
};
|
|
13
1
|
export type Route = {
|
|
14
|
-
|
|
2
|
+
locale: string;
|
|
15
3
|
path: string;
|
|
16
4
|
url: URL;
|
|
17
5
|
slug: string;
|
|
18
6
|
changed: Date | null;
|
|
19
|
-
published: Date | null;
|
|
20
7
|
contentType: string[];
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
guid: string;
|
|
24
|
-
siteId: string;
|
|
8
|
+
version?: string | null;
|
|
9
|
+
key: string;
|
|
25
10
|
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type ContentLink = {
|
|
2
|
+
key: string;
|
|
3
|
+
version?: string | null;
|
|
4
|
+
};
|
|
5
|
+
export type InlineContentLink = {
|
|
6
|
+
key?: null | undefined;
|
|
7
|
+
version?: null;
|
|
8
|
+
};
|
|
9
|
+
export type ContentLinkWithLocale<LocaleType = string> = ContentLink & {
|
|
10
|
+
locale?: LocaleType;
|
|
11
|
+
};
|
|
12
|
+
export type InlineContentLinkWithLocale<LocaleType = string> = InlineContentLink & {
|
|
13
|
+
locale?: LocaleType;
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/services/types.ts"],"names":[],"mappings":""}
|