@remkoj/optimizely-graph-client 2.0.4 → 2.1.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 +136 -135
- 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 +4 -3
- package/dist/admin-api/client/index.js.map +1 -1
- package/dist/admin-api/client/models/{ContentTypeDefinition_V2.d.ts → ContentSource_V2.d.ts} +1 -1
- package/dist/admin-api/client/models/ContentSource_V2.js +2 -0
- package/dist/admin-api/client/models/ContentSource_V2.js.map +1 -0
- package/dist/admin-api/client/models/{ContentTypeDefinition_V3.d.ts → ContentSource_V3.d.ts} +2 -1
- package/dist/admin-api/client/models/ContentSource_V3.js +2 -0
- package/dist/admin-api/client/models/ContentSource_V3.js.map +1 -0
- package/dist/admin-api/client/models/FilterMap.d.ts +2 -2
- package/dist/admin-api/client/models/OperationMap.d.ts +1 -1
- package/dist/admin-api/client/models/Partial_Record_string_OperationMap__.d.ts +5 -0
- package/dist/admin-api/client/models/Partial_Record_string_OperationMap__.js +2 -0
- package/dist/admin-api/client/models/Partial_Record_string_OperationMap__.js.map +1 -0
- package/dist/admin-api/client/models/SourceInfo.d.ts +1 -0
- package/dist/admin-api/client/models/SourceMetadata.d.ts +4 -0
- package/dist/admin-api/client/models/SourceMetadata.js +2 -0
- package/dist/admin-api/client/models/SourceMetadata.js.map +1 -0
- package/dist/admin-api/client/models/Webhook.d.ts +2 -0
- package/dist/admin-api/client/models/WebhookPayload.d.ts +2 -2
- package/dist/admin-api/client/services/DefinitionV2Service.d.ts +2 -2
- package/dist/admin-api/client/services/DefinitionV2Service.js.map +1 -1
- package/dist/admin-api/client/services/DefinitionV3Service.d.ts +16 -6
- package/dist/admin-api/client/services/DefinitionV3Service.js +21 -2
- package/dist/admin-api/client/services/DefinitionV3Service.js.map +1 -1
- package/dist/client/client.d.ts +2 -1
- package/dist/client/client.js +3 -0
- package/dist/client/client.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +2 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/types.d.ts +10 -0
- package/dist/client/types.js +5 -0
- package/dist/client/types.js.map +1 -1
- package/dist/client/utils.d.ts +16 -0
- package/dist/client/utils.js +20 -0
- package/dist/client/utils.js.map +1 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +13 -1
- package/dist/config.js.map +1 -1
- package/dist/services/channel-repository/repository.d.ts +1 -1
- package/dist/services/channel-repository/repository.js +4 -2
- package/dist/services/channel-repository/repository.js.map +1 -1
- package/dist/services/routing/queries/cms12/getAllRoutes.d.ts +32 -0
- package/dist/services/routing/queries/cms12/getAllRoutes.js +34 -0
- package/dist/services/routing/queries/cms12/getAllRoutes.js.map +1 -0
- package/dist/services/routing/queries/cms12/getRouteById.d.ts +13 -0
- package/dist/services/routing/queries/cms12/getRouteById.js +39 -0
- package/dist/services/routing/queries/cms12/getRouteById.js.map +1 -0
- package/dist/services/routing/queries/cms12/getRouteByPath.d.ts +12 -0
- package/dist/services/routing/queries/cms12/getRouteByPath.js +31 -0
- package/dist/services/routing/queries/cms12/getRouteByPath.js.map +1 -0
- package/dist/services/routing/queries/cms12/index.d.ts +14 -0
- package/dist/services/routing/queries/cms12/index.js +118 -0
- package/dist/services/routing/queries/cms12/index.js.map +1 -0
- package/dist/services/routing/queries/cms13/getAllRoutes.js.map +1 -0
- package/dist/services/routing/queries/cms13/getRouteById.js.map +1 -0
- package/dist/services/routing/queries/{getRouteByPath.js → cms13/getRouteByPath.js} +1 -1
- package/dist/services/routing/queries/cms13/getRouteByPath.js.map +1 -0
- package/dist/services/routing/queries/cms13/index.d.ts +12 -0
- package/dist/services/routing/queries/cms13/index.js +91 -0
- package/dist/services/routing/queries/cms13/index.js.map +1 -0
- package/dist/services/routing/queries/index.d.ts +1 -0
- package/dist/services/routing/queries/index.js +2 -0
- package/dist/services/routing/queries/index.js.map +1 -0
- package/dist/services/routing/queries/types.d.ts +7 -0
- package/dist/services/routing/queries/types.js +2 -0
- package/dist/services/routing/queries/types.js.map +1 -0
- package/dist/services/routing/resolver.d.ts +11 -9
- package/dist/services/routing/resolver.js +24 -85
- package/dist/services/routing/resolver.js.map +1 -1
- package/dist/services/routing/types.d.ts +32 -0
- package/dist/types.d.ts +5 -0
- package/package.json +3 -3
- package/dist/admin-api/client/models/ContentTypeDefinition_V2.js +0 -2
- package/dist/admin-api/client/models/ContentTypeDefinition_V2.js.map +0 -1
- package/dist/admin-api/client/models/ContentTypeDefinition_V3.js +0 -2
- package/dist/admin-api/client/models/ContentTypeDefinition_V3.js.map +0 -1
- package/dist/admin-api/client/models/Partial_Record_FieldKeys_OperationMap__.d.ts +0 -8
- package/dist/admin-api/client/models/Partial_Record_FieldKeys_OperationMap__.js +0 -2
- package/dist/admin-api/client/models/Partial_Record_FieldKeys_OperationMap__.js.map +0 -1
- package/dist/services/routing/queries/getAllRoutes.js.map +0 -1
- package/dist/services/routing/queries/getRouteById.js.map +0 -1
- package/dist/services/routing/queries/getRouteByPath.js.map +0 -1
- /package/dist/services/routing/queries/{getAllRoutes.d.ts → cms13/getAllRoutes.d.ts} +0 -0
- /package/dist/services/routing/queries/{getAllRoutes.js → cms13/getAllRoutes.js} +0 -0
- /package/dist/services/routing/queries/{getRouteById.d.ts → cms13/getRouteById.d.ts} +0 -0
- /package/dist/services/routing/queries/{getRouteById.js → cms13/getRouteById.js} +0 -0
- /package/dist/services/routing/queries/{getRouteByPath.d.ts → cms13/getRouteByPath.d.ts} +0 -0
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as GetAllRoutes from './getAllRoutes.js';
|
|
2
|
+
import * as GetRouteById from './getRouteById.js';
|
|
3
|
+
import * as GetRouteByPath from './getRouteByPath.js';
|
|
4
|
+
export class OptimizelyCms13Client {
|
|
5
|
+
async getRoutes(client, siteId) {
|
|
6
|
+
client.updateFlags({ queryCache: false /*, cache: false*/ }, true);
|
|
7
|
+
let page = await client.request(GetAllRoutes.query, { domain: siteId }).catch(e => {
|
|
8
|
+
if (client.debug)
|
|
9
|
+
console.error("[RouteResolver] Error while fetching routes", e);
|
|
10
|
+
return undefined;
|
|
11
|
+
});
|
|
12
|
+
let results = page?.Content?.items ?? [];
|
|
13
|
+
const totalCount = page?.Content?.total ?? 0;
|
|
14
|
+
const cursor = page?.Content?.cursor ?? '';
|
|
15
|
+
if (totalCount > 0 && cursor !== '' && totalCount > results.length)
|
|
16
|
+
while ((page?.Content?.items?.length ?? 0) > 0 && results.length < totalCount) {
|
|
17
|
+
page = await client.request({
|
|
18
|
+
document: GetAllRoutes.query,
|
|
19
|
+
variables: {
|
|
20
|
+
cursor,
|
|
21
|
+
domain: siteId
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
results = results.concat(page.Content?.items ?? []);
|
|
25
|
+
}
|
|
26
|
+
client.restoreFlags();
|
|
27
|
+
return results.map(this.tryConvertResponse.bind(this)).filter(this.isNotNullOrUndefined);
|
|
28
|
+
}
|
|
29
|
+
async getRouteByPath(client, path, siteId) {
|
|
30
|
+
if (client.debug)
|
|
31
|
+
console.log(`⚪ [RouteResolver] Resolving content info for ${path} on ${siteId ? siteId : "all domains"}`);
|
|
32
|
+
const resultSet = await client.request({
|
|
33
|
+
document: GetRouteByPath.query,
|
|
34
|
+
variables: { path: path, domain: siteId }
|
|
35
|
+
});
|
|
36
|
+
if ((resultSet.getRouteByPath?.items?.length ?? 0) === 0) {
|
|
37
|
+
if (client.debug)
|
|
38
|
+
console.warn("🟠 [RouteResolver] No items in the resultset");
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
if ((resultSet.getRouteByPath?.items?.length ?? 0) > 1)
|
|
42
|
+
throw new Error("🔴 [RouteResolver] Ambiguous URL provided, did you omit the domain in a multi-site setup?");
|
|
43
|
+
if (client.debug)
|
|
44
|
+
console.log(`⚪ [RouteResolver] Resolved content info for ${path} to: ${JSON.stringify(resultSet.getRouteByPath.items[0])}`);
|
|
45
|
+
return this.convertResponse(resultSet.getRouteByPath.items[0]);
|
|
46
|
+
}
|
|
47
|
+
async getRouteById(client, contentId, locale, version) {
|
|
48
|
+
const variables = { key: contentId, version: version?.toString(), locale: locale?.replaceAll('-', '_') };
|
|
49
|
+
if (client.debug)
|
|
50
|
+
console.log("Resolving content by id:", JSON.stringify(variables));
|
|
51
|
+
const resultSet = await client.request({
|
|
52
|
+
document: GetRouteById.query,
|
|
53
|
+
variables
|
|
54
|
+
});
|
|
55
|
+
if (resultSet.Content?.total >= 1) {
|
|
56
|
+
if (client.debug && resultSet.Content?.total > 1)
|
|
57
|
+
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('; ')}`);
|
|
58
|
+
return this.convertResponse(resultSet.Content.items[0]);
|
|
59
|
+
}
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
convertResponse(item) {
|
|
63
|
+
if (!item)
|
|
64
|
+
throw new Error("RouteResolver.convertResponse(): mandatory parameter \"item\" not provided!");
|
|
65
|
+
const itemUrl = new URL(item._metadata?.url?.path ?? '/', item._metadata?.url?.domain ?? 'https://example.com');
|
|
66
|
+
return {
|
|
67
|
+
locale: item._metadata.locale,
|
|
68
|
+
path: item._metadata.url.path,
|
|
69
|
+
url: itemUrl,
|
|
70
|
+
slug: item._metadata?.slug ?? "",
|
|
71
|
+
changed: item.changed ? new Date(item.changed) : null,
|
|
72
|
+
contentType: item._metadata.types.reverse(),
|
|
73
|
+
version: item._metadata.version,
|
|
74
|
+
key: item._metadata.key
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
tryConvertResponse(item) {
|
|
78
|
+
try {
|
|
79
|
+
return this.convertResponse(item);
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
console.error(`Unable to convert ${JSON.stringify(item)} to Route`, e);
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
isNotNullOrUndefined(input) {
|
|
87
|
+
return input != null && input != undefined;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export default OptimizelyCms13Client;
|
|
91
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/services/routing/queries/cms13/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/routing/queries/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Route } from '../types.js';
|
|
2
|
+
import { type IOptiGraphClient as GraphQLClient } from '../../../client/types.js';
|
|
3
|
+
export interface OptimizelyCmsRoutingApi {
|
|
4
|
+
getRoutes(client: GraphQLClient, siteId?: string): Promise<Route[]>;
|
|
5
|
+
getRouteByPath(client: GraphQLClient, path: string, siteId?: string): Promise<undefined | Route>;
|
|
6
|
+
getRouteById(client: GraphQLClient, contentId: string, locale?: string, version?: string | number): Promise<undefined | Route>;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/routing/queries/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,14 +1,18 @@
|
|
|
1
|
-
import { type IOptiGraphClient } from '../../client/index.js';
|
|
2
|
-
import type
|
|
3
|
-
import type { Route } from "./types.js";
|
|
1
|
+
import { type IOptiGraphClient, OptiCmsSchema } from '../../client/index.js';
|
|
2
|
+
import { type OptimizelyGraphConfig } from '../../types.js';
|
|
3
|
+
import type { Route, IRouteResolver } from "./types.js";
|
|
4
4
|
import type { ContentLinkWithLocale } from '../types.js';
|
|
5
|
-
import * as GetAllRoutes from './queries/getAllRoutes.js';
|
|
6
5
|
/**
|
|
7
6
|
*
|
|
8
7
|
*/
|
|
9
|
-
export declare class RouteResolver {
|
|
8
|
+
export declare class RouteResolver implements IRouteResolver {
|
|
10
9
|
private _cgClient;
|
|
11
10
|
private _defaultUrlBase;
|
|
11
|
+
private _resolverMode;
|
|
12
|
+
private _resolver;
|
|
13
|
+
protected get client(): IOptiGraphClient;
|
|
14
|
+
protected get urlBase(): string | URL;
|
|
15
|
+
protected get schema(): OptiCmsSchema;
|
|
12
16
|
/**
|
|
13
17
|
* Create a new Route Resolver
|
|
14
18
|
*
|
|
@@ -19,7 +23,8 @@ export declare class RouteResolver {
|
|
|
19
23
|
* constructor when reading routes from Optimizely
|
|
20
24
|
* Graph
|
|
21
25
|
*/
|
|
22
|
-
constructor(clientOrConfig?: IOptiGraphClient | OptimizelyGraphConfig, urlBase?: string | URL);
|
|
26
|
+
constructor(clientOrConfig?: IOptiGraphClient | OptimizelyGraphConfig, urlBase?: string | URL, resolverMode?: OptiCmsSchema);
|
|
27
|
+
private getResolver;
|
|
23
28
|
/**
|
|
24
29
|
* Retrieve all registered routes for the provided domain - all domains if none specified
|
|
25
30
|
*
|
|
@@ -45,8 +50,5 @@ export declare class RouteResolver {
|
|
|
45
50
|
* @returns The ContentLink, with locale information
|
|
46
51
|
*/
|
|
47
52
|
routeToContentLink(route: Route): ContentLinkWithLocale;
|
|
48
|
-
protected convertResponse(item: GetAllRoutes.Route): Route;
|
|
49
|
-
protected tryConvertResponse(item: GetAllRoutes.Route): Route | undefined;
|
|
50
|
-
protected isNotNullOrUndefined<T>(input: T | null | undefined): input is T;
|
|
51
53
|
}
|
|
52
54
|
export default RouteResolver;
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
// Import GraphQL Client
|
|
2
|
-
import createClient, {
|
|
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';
|
|
2
|
+
import createClient, { isOptiGraphClient, OptiCmsSchema } from '../../client/index.js';
|
|
7
3
|
// Main router class
|
|
8
4
|
/**
|
|
9
5
|
*
|
|
10
6
|
*/
|
|
11
7
|
export class RouteResolver {
|
|
8
|
+
get client() {
|
|
9
|
+
return this._cgClient;
|
|
10
|
+
}
|
|
11
|
+
get urlBase() {
|
|
12
|
+
return this._defaultUrlBase;
|
|
13
|
+
}
|
|
14
|
+
get schema() {
|
|
15
|
+
return this._resolverMode;
|
|
16
|
+
}
|
|
12
17
|
/**
|
|
13
18
|
* Create a new Route Resolver
|
|
14
19
|
*
|
|
@@ -19,9 +24,18 @@ export class RouteResolver {
|
|
|
19
24
|
* constructor when reading routes from Optimizely
|
|
20
25
|
* Graph
|
|
21
26
|
*/
|
|
22
|
-
constructor(clientOrConfig, urlBase = "https://example.com") {
|
|
23
|
-
this._cgClient =
|
|
27
|
+
constructor(clientOrConfig, urlBase = "https://example.com", resolverMode) {
|
|
28
|
+
this._cgClient = isOptiGraphClient(clientOrConfig) ? clientOrConfig : createClient(clientOrConfig);
|
|
24
29
|
this._defaultUrlBase = urlBase;
|
|
30
|
+
this._resolverMode = resolverMode ?? this._cgClient.currentOptiCmsSchema;
|
|
31
|
+
}
|
|
32
|
+
async getResolver() {
|
|
33
|
+
if (!this._resolver) {
|
|
34
|
+
if (this._resolverMode == OptiCmsSchema.CMS12)
|
|
35
|
+
return new (await import('./queries/cms12/index.js')).default;
|
|
36
|
+
this._resolver = new (await import('./queries/cms13/index.js')).default;
|
|
37
|
+
}
|
|
38
|
+
return this._resolver;
|
|
25
39
|
}
|
|
26
40
|
/**
|
|
27
41
|
* Retrieve all registered routes for the provided domain - all domains if none specified
|
|
@@ -30,63 +44,15 @@ export class RouteResolver {
|
|
|
30
44
|
* @returns The list of routes
|
|
31
45
|
*/
|
|
32
46
|
async getRoutes(domain) {
|
|
33
|
-
this.
|
|
34
|
-
let page = await this._cgClient.request(GetAllRoutes.query, { domain }).catch(e => {
|
|
35
|
-
if (this._cgClient.debug)
|
|
36
|
-
console.error("[RouteResolver] Error while fetching routes", e);
|
|
37
|
-
return undefined;
|
|
38
|
-
});
|
|
39
|
-
let results = page?.Content?.items ?? [];
|
|
40
|
-
const totalCount = page?.Content?.total ?? 0;
|
|
41
|
-
const cursor = page?.Content?.cursor ?? '';
|
|
42
|
-
if (totalCount > 0 && cursor !== '' && totalCount > results.length)
|
|
43
|
-
while ((page?.Content?.items?.length ?? 0) > 0 && results.length < totalCount) {
|
|
44
|
-
page = await this._cgClient.request({
|
|
45
|
-
document: GetAllRoutes.query,
|
|
46
|
-
variables: {
|
|
47
|
-
cursor,
|
|
48
|
-
domain
|
|
49
|
-
}
|
|
50
|
-
});
|
|
51
|
-
results = results.concat(page.Content?.items ?? []);
|
|
52
|
-
}
|
|
53
|
-
this._cgClient.restoreFlags();
|
|
54
|
-
return results.map(this.tryConvertResponse.bind(this)).filter(this.isNotNullOrUndefined);
|
|
47
|
+
return (await this.getResolver()).getRoutes(this._cgClient, domain);
|
|
55
48
|
}
|
|
56
49
|
async getContentInfoByPath(path, domain) {
|
|
57
50
|
const queryPath = typeof path == 'object' && path != null ? path.pathname : path;
|
|
58
51
|
const queryDomain = typeof path == 'object' && path != null ? path.protocol + '//' + path.host : domain;
|
|
59
|
-
|
|
60
|
-
console.log(`⚪ [RouteResolver] Resolving content info for ${path} on ${domain ? domain : "all domains"}`);
|
|
61
|
-
const resultSet = await this._cgClient.request({
|
|
62
|
-
document: GetRouteByPath.query,
|
|
63
|
-
variables: { path: queryPath, domain: queryDomain }
|
|
64
|
-
});
|
|
65
|
-
if ((resultSet.getRouteByPath?.items?.length ?? 0) === 0) {
|
|
66
|
-
if (this._cgClient.debug)
|
|
67
|
-
console.warn("🟠 [RouteResolver] No items in the resultset");
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
if ((resultSet.getRouteByPath?.items?.length ?? 0) > 1)
|
|
71
|
-
throw new Error("🔴 [RouteResolver] Ambiguous URL provided, did you omit the domain in a multi-site setup?");
|
|
72
|
-
if (this._cgClient.debug)
|
|
73
|
-
console.log(`⚪ [RouteResolver] Resolved content info for ${path} to: ${JSON.stringify(resultSet.getRouteByPath.items[0])}`);
|
|
74
|
-
return this.convertResponse(resultSet.getRouteByPath.items[0]);
|
|
52
|
+
return (await this.getResolver()).getRouteByPath(this._cgClient, queryPath, queryDomain);
|
|
75
53
|
}
|
|
76
54
|
async getContentInfoById(key, locale, version) {
|
|
77
|
-
|
|
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;
|
|
55
|
+
return (await this.getResolver()).getRouteById(this._cgClient, key, locale, version);
|
|
90
56
|
}
|
|
91
57
|
/**
|
|
92
58
|
* Extract a content link from a route definition
|
|
@@ -101,33 +67,6 @@ export class RouteResolver {
|
|
|
101
67
|
locale: route.locale
|
|
102
68
|
};
|
|
103
69
|
}
|
|
104
|
-
convertResponse(item) {
|
|
105
|
-
if (!item)
|
|
106
|
-
throw new Error("RouteResolver.convertResponse(): mandatory parameter \"item\" not provided!");
|
|
107
|
-
const itemUrl = new URL(item._metadata?.url?.path ?? '/', item._metadata?.url?.domain ?? this._defaultUrlBase);
|
|
108
|
-
return {
|
|
109
|
-
locale: item._metadata.locale,
|
|
110
|
-
path: item._metadata.url.path,
|
|
111
|
-
url: itemUrl,
|
|
112
|
-
slug: item._metadata?.slug ?? "",
|
|
113
|
-
changed: item.changed ? new Date(item.changed) : null,
|
|
114
|
-
contentType: item._metadata.types.reverse(),
|
|
115
|
-
version: item._metadata.version,
|
|
116
|
-
key: item._metadata.key
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
tryConvertResponse(item) {
|
|
120
|
-
try {
|
|
121
|
-
return this.convertResponse(item);
|
|
122
|
-
}
|
|
123
|
-
catch (e) {
|
|
124
|
-
console.error(`Unable to convert ${JSON.stringify(item)} to Route`, e);
|
|
125
|
-
return undefined;
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
isNotNullOrUndefined(input) {
|
|
129
|
-
return input != null && input != undefined;
|
|
130
|
-
}
|
|
131
70
|
}
|
|
132
71
|
export default RouteResolver;
|
|
133
72
|
//# sourceMappingURL=resolver.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/services/routing/resolver.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,YAAY,EAAE,EAAyB,
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/services/routing/resolver.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,OAAO,YAAY,EAAE,EAAyB,iBAAiB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAU7G,oBAAoB;AACpB;;GAEG;AACH,MAAM,OAAO,aAAa;IAMtB,IAAc,MAAM;QAEhB,OAAO,IAAI,CAAC,SAAS,CAAA;IACzB,CAAC;IAED,IAAc,OAAO;QAEjB,OAAO,IAAI,CAAC,eAAe,CAAA;IAC/B,CAAC;IAED,IAAc,MAAM;QAEhB,OAAO,IAAI,CAAC,aAAa,CAAA;IAC7B,CAAC;IAED;;;;;;;;;OASG;IACH,YACI,cAAyD,EACzD,UAAwB,qBAAqB,EAC7C,YAA4B;QAE5B,IAAI,CAAC,SAAS,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;QAClG,IAAI,CAAC,eAAe,GAAG,OAAO,CAAA;QAC9B,IAAI,CAAC,aAAa,GAAG,YAAY,IAAI,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAA;IAC5E,CAAC;IAEO,KAAK,CAAC,WAAW;QAErB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAClB,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,KAAK;gBACzC,OAAO,IAAI,CAAC,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAA;YACjE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC,OAAO,CAAA;QAC3E,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAA;IACzB,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,SAAS,CAAC,MAAe;QAElC,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;IACvE,CAAC;IAYM,KAAK,CAAC,oBAAoB,CAAC,IAAkB,EAAE,MAAe;QAEjE,MAAM,SAAS,GAAK,OAAO,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA;QAClF,MAAM,WAAW,GAAG,OAAO,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAA;QAEvG,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;IAC5F,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAAC,GAAW,EAAE,MAAe,EAAE,OAAyB;QAEnF,OAAO,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAC,MAAM,EAAC,OAAO,CAAC,CAAA;IACtF,CAAC;IAED;;;;;OAKG;IACI,kBAAkB,CAAC,KAAY;QAElC,OAAO;YACH,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;SACvB,CAAA;IACL,CAAC;CACJ;AAED,eAAe,aAAa,CAAA"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ContentLinkWithLocale } from '../types.js';
|
|
1
2
|
export type Route = {
|
|
2
3
|
locale: string;
|
|
3
4
|
path: string;
|
|
@@ -8,3 +9,34 @@ export type Route = {
|
|
|
8
9
|
version?: string | null;
|
|
9
10
|
key: string;
|
|
10
11
|
};
|
|
12
|
+
/**
|
|
13
|
+
* Main Router pattern, allow for implementation specific overrides
|
|
14
|
+
*/
|
|
15
|
+
export interface IRouteResolver {
|
|
16
|
+
/**
|
|
17
|
+
* Retrieve all registered routes for the provided domain - all domains if none specified
|
|
18
|
+
*
|
|
19
|
+
* @param domain The domain to filter on
|
|
20
|
+
* @returns The list of routes
|
|
21
|
+
*/
|
|
22
|
+
getRoutes(domainOrChannelId?: string): Promise<Route[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a path to route information, either from string or from URL
|
|
25
|
+
* object.
|
|
26
|
+
*
|
|
27
|
+
* @param path The path to resolve for
|
|
28
|
+
* @param domain The domain to filter the results by
|
|
29
|
+
* @returns The route information for the path
|
|
30
|
+
*/
|
|
31
|
+
getContentInfoByPath(path: URL): Promise<undefined | Route>;
|
|
32
|
+
getContentInfoByPath(path: string, domain?: string): Promise<undefined | Route>;
|
|
33
|
+
getContentInfoByPath(path: URL | string, domain?: string): 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
|
+
getContentInfoById(key: string, locale?: string, version?: string | number): Promise<undefined | Route>;
|
|
42
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { OptiCmsSchema } from "./client/types.js";
|
|
1
2
|
export type OptimizelyGraphConfigInternal = {
|
|
2
3
|
/**
|
|
3
4
|
* Optimizely Graph AppKey, it is recommended to not let this key leave the server side
|
|
@@ -35,6 +36,10 @@ export type OptimizelyGraphConfigInternal = {
|
|
|
35
36
|
* Publishing token to validate webhooks - if implemented
|
|
36
37
|
*/
|
|
37
38
|
publish?: string;
|
|
39
|
+
/**
|
|
40
|
+
* The CMS Schema version that is used
|
|
41
|
+
*/
|
|
42
|
+
opti_cms_schema: OptiCmsSchema;
|
|
38
43
|
};
|
|
39
44
|
export type OptimizelyGraphConfig = Partial<Omit<OptimizelyGraphConfigInternal, 'single_key'>> & Pick<OptimizelyGraphConfigInternal, 'single_key'>;
|
|
40
45
|
/**
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remkoj/optimizely-graph-client",
|
|
3
3
|
"license": "Apache-2.0",
|
|
4
|
-
"version": "2.0
|
|
4
|
+
"version": "2.1.0",
|
|
5
5
|
"packageManager": "yarn@4.1.1",
|
|
6
6
|
"repository": "https://github.com/remkoj/optimizely-dxp-clients.git",
|
|
7
7
|
"author": "Remko Jantzen <693172+remkoj@users.noreply.github.com>",
|
|
@@ -52,13 +52,13 @@
|
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/crypto-js": "^4.2.2",
|
|
55
|
-
"@types/node": "^22.
|
|
55
|
+
"@types/node": "^22.7.4",
|
|
56
56
|
"graphql": "^16.9.0",
|
|
57
57
|
"graphql-request": "^6.1.0",
|
|
58
58
|
"openapi-typescript-codegen": "^0.29.0",
|
|
59
59
|
"prop-types": "^15.8.1",
|
|
60
60
|
"scheduler": "^0.23.2",
|
|
61
|
-
"typescript": "^5.
|
|
61
|
+
"typescript": "^5.6.2"
|
|
62
62
|
},
|
|
63
63
|
"dependencies": {
|
|
64
64
|
"crypto-js": "^4.2.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContentTypeDefinition_V2.js","sourceRoot":"","sources":["../../../../src/admin-api/client/models/ContentTypeDefinition_V2.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ContentTypeDefinition_V3.js","sourceRoot":"","sources":["../../../../src/admin-api/client/models/ContentTypeDefinition_V3.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Partial_Record_FieldKeys_OperationMap__.js","sourceRoot":"","sources":["../../../../src/admin-api/client/models/Partial_Record_FieldKeys_OperationMap__.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"getAllRoutes.js","sourceRoot":"","sources":["../../../../src/services/routing/queries/getAllRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAiCrC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCtB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BtB,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BtB,CAAA"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|