@remkoj/optimizely-cms-nextjs 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/metadata.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import createClient, { isContentGraphClient } from '@remkoj/optimizely-graph-client';
2
2
  import { isOptimizelyNextPageWithMetaData } from './page';
3
- const DEBUG = process.env.DXP_DEBUG == '1';
4
3
  export class MetaDataResolver {
5
4
  _cgClient;
6
5
  constructor(clientOrConfig) {
@@ -16,16 +15,16 @@ export class MetaDataResolver {
16
15
  * @returns A Promise for the metadata of the given content type & instance
17
16
  */
18
17
  async resolve(factory, contentLink, contentType, locale) {
19
- if (DEBUG)
18
+ if (this._cgClient.debug)
20
19
  console.log("[MetaDataResolver] Resolving metadata for:", contentLink, contentType, locale);
21
- if (locale.includes("-"))
20
+ if (locale && locale.includes("-"))
22
21
  throw new Error("Invalid character detected within the locale");
23
22
  const Component = factory.resolve(contentType);
24
23
  if (!Component)
25
24
  return {};
26
25
  if (isOptimizelyNextPageWithMetaData(Component) && Component.getMetaData) {
27
26
  const meta = await Component.getMetaData(contentLink, locale, this._cgClient);
28
- if (DEBUG)
27
+ if (this._cgClient.debug)
29
28
  console.log("[MetaDataResolver] Resolved metadata to:", meta);
30
29
  return meta;
31
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,oBAAoB,EAAqD,MAAM,iCAAiC,CAAA;AAEvI,OAAO,EAAE,gCAAgC,EAAE,MAAM,QAAQ,CAAA;AAEzD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAA;AAE1C,MAAM,OAAO,gBAAgB;IAEjB,SAAS,CAAmB;IAEpC,YAAmB,cAAyD;QAExE,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;IACzG,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,OAAO,CAAC,OAAyB,EAAE,WAAwB,EAAE,WAAqB,EAAE,MAAc;QAE3G,IAAI,KAAK;YACL,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QAE/F,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QAEnE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC9C,IAAI,CAAC,SAAS;YACV,OAAO,EAAE,CAAA;QAEb,IAAI,gCAAgC,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7E,IAAI,KAAK;gBACL,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,IAAI,CAAC,CAAA;YACjE,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,EAAE,CAAA;IACb,CAAC;CACJ;AAED,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../src/metadata.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,oBAAoB,EAAqD,MAAM,iCAAiC,CAAA;AAEvI,OAAO,EAAE,gCAAgC,EAAE,MAAM,QAAQ,CAAA;AAEzD,MAAM,OAAO,gBAAgB;IAEjB,SAAS,CAAmB;IAEpC,YAAmB,cAAyD;QAExE,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;IACzG,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,OAAO,CAAC,OAAyB,EAAE,WAAwB,EAAE,WAAqB,EAAE,MAAsB;QAEnH,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK;YACpB,OAAO,CAAC,GAAG,CAAC,4CAA4C,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;QAE/F,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;QAEnE,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC9C,IAAI,CAAC,SAAS;YACV,OAAO,EAAE,CAAA;QAEb,IAAI,gCAAgC,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC;YACvE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;YAC7E,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK;gBACpB,OAAO,CAAC,GAAG,CAAC,0CAA0C,EAAE,IAAI,CAAC,CAAA;YACjE,OAAO,IAAI,CAAA;QACf,CAAC;QACD,OAAO,EAAE,CAAA;IACb,CAAC;CACJ;AAED,eAAe,gBAAgB,CAAA"}
package/dist/ope/data.js CHANGED
@@ -2,26 +2,26 @@ import { gql } from 'graphql-request';
2
2
  export const getContentById = async (client, variables) => {
3
3
  return await client.request(gqlQuery, variables);
4
4
  };
5
- const gqlQuery = gql `query getContentByIdBase($id: Int, $workId: Int, $guidValue: String, $locale: [Locales!], $isCommonDraft: Boolean) {
6
- Content(
5
+ const gqlQuery = gql `query getContentByIdBase($key: String!, $version: String, $locale: [Locales!], $path: String, $domain: String) {
6
+ content: Content(
7
7
  where: {
8
- ContentLink: { Id: { eq: $id }, WorkId: { eq: $workId }, GuidValue: { eq: $guidValue } }
9
- IsCommonDraft: { eq: $isCommonDraft }
8
+ _or: [
9
+ { _metadata: { key: { eq: $key }, version: { eq: $version } } }
10
+ { _metadata: { url: { hierarchical: { eq: $path }, base: { eq: $domain } }, version: { eq: $version } } }
11
+ ]
10
12
  }
11
13
  locale: $locale
12
14
  ) {
13
15
  total
14
16
  items {
15
- contentType: ContentType
16
- id: ContentLink {
17
- id: Id
18
- workId: WorkId
19
- guidValue: GuidValue
17
+ _metadata {
18
+ key
19
+ locale
20
+ types
21
+ displayName
22
+ version
20
23
  }
21
- locale: Language {
22
- name: Name
23
- }
24
- path: RelativePath
24
+ _type: __typename
25
25
  }
26
26
  }
27
27
  }`;
@@ -1 +1 @@
1
- {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/ope/data.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAErC,MAAM,CAAC,MAAM,cAAc,GAA0B,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE;IAE7E,OAAO,MAAM,MAAM,CAAC,OAAO,CAA8C,QAAQ,EAAE,SAAS,CAAC,CAAA;AACjG,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;EAsBlB,CAAA"}
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../src/ope/data.ts"],"names":[],"mappings":"AACA,OAAO,EAAuB,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAE1D,MAAM,CAAC,MAAM,cAAc,GAA0B,KAAK,EAAuB,MAAqB,EAAE,SAAwC,EAAE,EAAE;IAEhJ,OAAO,MAAM,MAAM,CAAC,OAAO,CAAgE,QAAQ,EAAE,SAAS,CAAC,CAAA;AACnH,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;EAsBlB,CAAA"}
@@ -1,6 +1,5 @@
1
1
  import 'server-only';
2
2
  import type { EditPageComponent, EditViewOptions } from './types';
3
- import { type Services } from '@remkoj/optimizely-graph-client';
4
3
  import { type ComponentFactory } from '@remkoj/optimizely-cms-react/rsc';
5
4
  /**
6
5
  * Create the EditPage component needed by Next.JS to render the "On Page
@@ -8,10 +7,9 @@ import { type ComponentFactory } from '@remkoj/optimizely-cms-react/rsc';
8
7
  *
9
8
  * @param dxpUrl The domain of the CMS instance
10
9
  * @param client The Apollo GraphQL client to use
11
- * @param channel The static site definition to use
12
10
  * @param factory The component factory to be used
13
11
  * @param options The optional options to use to control the edit page
14
12
  * @returns The React Component that can be used by Next.JS to render the page
15
13
  */
16
- export declare function createEditPageComponent(channel: Readonly<Services.ChannelDefinition>, factory: ComponentFactory, options?: Partial<EditViewOptions>): EditPageComponent;
14
+ export declare function createEditPageComponent(factory: ComponentFactory, options?: Partial<EditViewOptions>): EditPageComponent;
17
15
  export default createEditPageComponent;
package/dist/ope/page.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import 'server-only';
3
3
  import { AuthMode } from '@remkoj/optimizely-graph-client';
4
+ import { contentLinkToString } from '@remkoj/optimizely-graph-client/utils';
4
5
  import { Utils } from '@remkoj/optimizely-cms-react';
5
6
  import { CmsContent, getServerContext } from '@remkoj/optimizely-cms-react/rsc';
6
7
  import { notFound } from 'next/navigation';
@@ -9,29 +10,81 @@ import { getAuthorizedServerClient } from '../client';
9
10
  import React from 'react';
10
11
  import Script from 'next/script';
11
12
  import { getContentById } from './data';
13
+ function readValue(variableName, defaultValue) {
14
+ try {
15
+ const stringValue = process?.env ? process.env[variableName] : undefined;
16
+ return stringValue || defaultValue;
17
+ }
18
+ catch {
19
+ return defaultValue;
20
+ }
21
+ }
22
+ function readValueAsInt(variableName, defaultValue) {
23
+ const stringValue = readValue(variableName);
24
+ if (!stringValue)
25
+ return defaultValue;
26
+ try {
27
+ return parseInt(stringValue);
28
+ }
29
+ catch {
30
+ return defaultValue;
31
+ }
32
+ }
12
33
  const defaultOptions = {
13
34
  refreshDelay: 2000,
14
35
  refreshNotice: () => _jsx("div", { className: 'optly-refresh-notice', children: "Updating preview, please wait...." }),
15
36
  errorNotice: props => _jsxs("div", { className: 'optly-error-notice', children: [_jsx("div", { className: 'optly-error-title', children: props.title }), _jsx("div", { className: 'optly-error-message', children: props.message })] }),
16
37
  layout: props => _jsx("div", { className: 'optly-edit-page', "data-locale": props.locale, children: props.children }),
17
38
  loader: getContentById,
18
- clientFactory: (token) => getAuthorizedServerClient(token)
39
+ clientFactory: (token) => getAuthorizedServerClient(token),
40
+ communicationInjectorPath: '/util/javascript/communicationinjector.js'
19
41
  };
42
+ // Helper function to read the ContentID & WorkID
43
+ function getContentRequest(path = "", searchParams) {
44
+ try {
45
+ if (searchParams.preview_token == AuthMode.HMAC || searchParams.preview_token == AuthMode.Basic) {
46
+ console.error("[OnPageEdit] 🦺 Edit mode requested with developer tokens, falling back to URL parsing to determine content");
47
+ const fullPath = Array.isArray(path) ? path.map(p => decodeURIComponent(p)).join('/') : decodeURI(path);
48
+ const [cmsPath, contentString] = fullPath.split(',,', 3);
49
+ const [contentKey, contentVersion] = (contentString ?? '').split('_', 3);
50
+ const contentPath = (cmsPath.startsWith('/') ? cmsPath.substring(1) : cmsPath).replace(/^(ui\/){0,1}(CMS\/){0,1}(Content\/){0,1}/gi, "");
51
+ const firstSlug = contentPath.split('/')[0];
52
+ const contentLocale = firstSlug?.length == 2 || firstSlug?.length == 5 ? firstSlug : undefined;
53
+ return {
54
+ key: contentKey,
55
+ version: contentVersion,
56
+ locale: contentLocale,
57
+ path: '/' + contentPath + (contentPath.endsWith('/') ? '' : '/')
58
+ };
59
+ }
60
+ else {
61
+ const tokenInfo = JSON.parse(atob(searchParams.preview_token.split('.')[1]));
62
+ return {
63
+ key: tokenInfo.key,
64
+ version: tokenInfo.ver,
65
+ locale: tokenInfo.loc,
66
+ path: ''
67
+ };
68
+ }
69
+ }
70
+ catch {
71
+ return undefined;
72
+ }
73
+ }
20
74
  /**
21
75
  * Create the EditPage component needed by Next.JS to render the "On Page
22
76
  * Editing" variant of the content item selected by the editor.
23
77
  *
24
78
  * @param dxpUrl The domain of the CMS instance
25
79
  * @param client The Apollo GraphQL client to use
26
- * @param channel The static site definition to use
27
80
  * @param factory The component factory to be used
28
81
  * @param options The optional options to use to control the edit page
29
82
  * @returns The React Component that can be used by Next.JS to render the page
30
83
  */
31
- export function createEditPageComponent(channel, factory, options) {
32
- const { layout: PageLayout, refreshNotice: RefreshNotice, refreshDelay, errorNotice: ErrorNotice, loader: getContentById, clientFactory } = { ...defaultOptions, ...options };
33
- const dxpUrl = channel.getCmsUrl();
34
- async function EditPage({ params, searchParams }) {
84
+ export function createEditPageComponent(factory, options) {
85
+ const envRefreshDelay = readValueAsInt("OPTIMIZELY_CONTENTGRAPH_UPDATE_DELAY", defaultOptions.refreshDelay);
86
+ const { layout: PageLayout, refreshNotice: RefreshNotice, refreshDelay, errorNotice: ErrorNotice, loader: getContentById, clientFactory, communicationInjectorPath } = { ...defaultOptions, refreshDelay: envRefreshDelay, ...options };
87
+ async function EditPage({ params: { path }, searchParams }) {
35
88
  // Create context
36
89
  const context = getServerContext();
37
90
  // Validate the search parameters
@@ -49,85 +102,56 @@ export function createEditPageComponent(channel, factory, options) {
49
102
  }
50
103
  if (context.isDebug)
51
104
  console.log(`[OnPageEdit] Valid edit mode request: EpiEditMode=${searchParams.epieditmode}`);
52
- // Helper function to read the ContentID & WorkID
53
- function getContentIds() {
54
- try {
55
- // When using HMAC authentication, fall back to information in the URL
56
- if (validDev) {
57
- const contentString = slugs.join('/').split(',,').pop() ?? '';
58
- const [contentId, workId] = contentString.split('_', 3);
59
- return [Number.parseInt(contentId), workId ? Number.parseInt(workId) : null];
60
- }
61
- // Normally take the information from the token
62
- const jwt = JSON.parse(Buffer.from((token || '..').split('.', 3)[1], 'base64').toString());
63
- const contentId = Number.parseInt(jwt?.c_id || '-1', 10);
64
- const workId = Number.parseInt(jwt?.c_ver || '0') || null;
65
- if ((jwt.exp * 1000) < Date.now())
66
- console.warn("[OnPageEdit] Token has expired, it is unlikely that you are able to fetch content with it");
67
- return [contentId, workId];
68
- }
69
- catch {
70
- return [-1, null];
71
- }
72
- }
73
105
  // Build context
74
106
  const client = clientFactory(token);
75
107
  context.setOptimizelyGraphClient(client);
76
108
  context.setComponentFactory(factory);
77
109
  context.setInEditMode(epiEditMode == 'true');
78
110
  // Get information from the Request URI
79
- const requestPath = ('/' + params.path.map(decodeURIComponent).join('/')).replace(/^(\/ui){0,1}(\/cms){0,1}(\/content){0,1}\//i, '');
80
- const slugs = requestPath.split('/');
81
- const locale = channel.locales.some(x => x.slug == slugs[0]) ? slugs[0] : channel.defaultLocale;
82
- if (context.isDebug)
83
- console.log(`[OnPageEdit] Inferred content locale from path: ${locale}`);
84
- const [contentId, workId] = getContentIds();
85
- context.setLocale(channel.localeToGraphLocale(locale));
86
- const contentLink = {
87
- id: contentId,
88
- workId: workId,
89
- guidValue: null,
90
- locale: locale
91
- };
92
- const variables = {
93
- ...contentLink,
94
- locale: contentLink.locale,
95
- isCommonDraft: !contentLink.workId ? true : null
96
- };
111
+ const contentRequest = getContentRequest(path, searchParams);
112
+ if (!contentRequest) {
113
+ console.error("[OnPageEdit] Unable to resolve requested content");
114
+ return notFound();
115
+ }
97
116
  if (context.isDebug) {
98
- console.log("[OnPageEdit] Requested content:", JSON.stringify(variables));
117
+ console.log("[OnPageEdit] Requested content:", JSON.stringify(contentRequest));
99
118
  console.log("[OnPageEdit] Creating GraphQL Client:", token);
100
119
  }
101
120
  try {
102
- const contentInfo = await getContentById(client, variables);
103
- const contentItem = (contentInfo?.Content?.items ?? [])[0];
104
- const contentType = Utils.normalizeContentType(contentItem?.contentType);
121
+ const contentInfo = await getContentById(client, contentRequest);
122
+ if ((contentInfo?.content?.total ?? 0) > 1) {
123
+ console.warn("[OnPageEdit] Content request " + JSON.stringify(contentRequest) + " yielded more then one item, picking first matching");
124
+ }
125
+ const contentItem = (contentInfo?.content?.items ?? [])[0];
126
+ const contentType = Utils.normalizeContentType(contentItem?._metadata.types);
105
127
  // Return a 404 if the content item or type could not be resolved
106
128
  if (!contentItem) {
107
- console.warn(`[OnPageEdit] The content item for ${JSON.stringify(variables)} could not be loaded from Optimizely Graph`);
129
+ console.warn(`[OnPageEdit] The content item for ${JSON.stringify(contentRequest)} could not be loaded from Optimizely Graph`);
108
130
  return notFound();
109
131
  }
110
132
  if (!contentType) {
111
- console.warn(`[OnPageEdit] The content item for ${JSON.stringify(variables)} did not contain content type information`);
133
+ console.warn(`[OnPageEdit] The content item for ${JSON.stringify(contentRequest)} did not contain content type information`);
112
134
  return notFound();
113
135
  }
136
+ const contentLink = {
137
+ key: contentItem._metadata.key,
138
+ locale: contentItem._metadata.locale,
139
+ version: contentItem._metadata.version
140
+ };
114
141
  if (context.isDebug) {
115
- const contentItemId = contentItem?.id;
116
142
  console.log("[OnPageEdit] Resolved content:", JSON.stringify({
117
- id: contentItemId?.id,
118
- workId: contentItemId?.workId,
119
- guidValue: contentItemId?.guidValue,
120
- locale: contentItem.locale?.name,
121
- type: (contentItem.contentType ?? []).slice(0, -1).join('/')
143
+ ...contentLink,
144
+ type: (contentItem.contentType ?? []).join('/')
122
145
  }));
123
146
  }
124
147
  // Store the editable content so it can be tested
125
148
  context.setEditableContentId(contentLink);
149
+ if (contentLink.locale)
150
+ context.setLocale(contentLink.locale);
126
151
  // Render the content, with edit mode context
127
- const isPage = contentItem.contentType?.some(x => x?.toLowerCase() == "page") ?? false;
128
- const loadedContentId = Utils.normalizeContentLinkWithLocale({ ...contentItem?.id, locale: contentItem?.locale?.name });
152
+ const isPage = contentType.some(x => x?.toLowerCase() == "page") ?? false;
129
153
  const Layout = isPage ? PageLayout : React.Fragment;
130
- const output = _jsxs(_Fragment, { children: [context.inEditMode && _jsx(Script, { src: `${dxpUrl}/ui/CMS/latest/clientresources/communicationinjector.js`, strategy: 'afterInteractive' }), _jsxs(Layout, { locale: locale, children: [_jsx(OnPageEdit, { timeout: refreshDelay, mode: context.inEditMode ? 'edit' : 'preview', className: 'bg-slate-900 absolute top-0 left-0 w-screen h-screen opacity-60 z-50', children: _jsx(RefreshNotice, {}) }), _jsx(CmsContent, { contentType: contentType, contentLink: contentLink, fragmentData: contentItem })] }), _jsxs("div", { className: 'optly-contentLink', children: ["ID: ", loadedContentId?.id ?? "-", " | Version: ", loadedContentId?.workId ?? "-", " | Global ID: ", loadedContentId?.guidValue ?? "-", " | Locale: ", loadedContentId?.locale ?? ""] })] });
154
+ const output = _jsxs(_Fragment, { children: [_jsx(Script, { src: new URL(communicationInjectorPath, client.siteInfo.cmsURL).href, strategy: 'afterInteractive' }), _jsxs(Layout, { locale: contentItem.locale?.name ?? '', children: [_jsx(OnPageEdit, { timeout: refreshDelay, mode: context.inEditMode ? 'edit' : 'preview', children: _jsx(RefreshNotice, {}) }), _jsx(CmsContent, { contentType: contentType, contentLink: contentLink, fragmentData: contentItem })] }), _jsxs("div", { className: 'optly-contentLink', children: ["ContentItem: ", contentLink ? contentLinkToString(contentLink) : "Invalid content link returned from Optimizely Graph"] })] });
131
155
  return output;
132
156
  }
133
157
  catch (e) {
@@ -1 +1 @@
1
- {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/ope/page.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/ope/page.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import type { ComponentType, PropsWithChildren } from 'react';
2
- import type { ClientFactory } from '@remkoj/optimizely-graph-client';
3
- import type { GraphQLClient } from 'graphql-request';
1
+ import { type ComponentType, type PropsWithChildren } from 'react';
2
+ import { type ClientFactory } from '@remkoj/optimizely-graph-client';
3
+ import { type GraphQLClient } from 'graphql-request';
4
+ import { type ContentQueryProps } from '@remkoj/optimizely-cms-react';
5
+ export { type ContentQueryProps } from '@remkoj/optimizely-cms-react';
4
6
  type ServerPageProps = {
5
7
  params: Record<string, string | Array<string>>;
6
8
  searchParams: Record<string, string>;
@@ -44,30 +46,35 @@ export type EditViewOptions = {
44
46
  * The base content loader to be used for the edit view
45
47
  */
46
48
  loader: GetContentByIdMethod;
49
+ /**
50
+ * The factory used to create a new Optimizely Graph Client
51
+ */
47
52
  clientFactory: ClientFactory;
53
+ /**
54
+ * If provided, this allows to override the CommunicationInjector
55
+ * path.
56
+ */
57
+ communicationInjectorPath: string;
48
58
  };
49
- export type GetContentByIdVariables = {
50
- id?: number;
51
- workId?: number | null;
52
- guidValue?: string | null;
53
- locale?: string | Array<string>;
54
- isCommonDraft?: boolean | null;
55
- };
56
- export type GetContentByIdData = {
57
- Content: {
58
- items: {
59
- contentType?: Array<string | null> | null;
60
- id: {
61
- id?: number | null;
62
- workId?: number | null;
63
- guidValue?: string | null;
59
+ export type GetContentByIdData<LocaleType = string> = {
60
+ content: {
61
+ total: number;
62
+ items: Array<{
63
+ _metadata: {
64
+ key: string;
65
+ locale: LocaleType;
66
+ types: Array<string>;
67
+ displayName: string;
68
+ version?: string | null;
69
+ url?: {
70
+ base?: string | null;
71
+ hierarchical?: string | null;
72
+ default?: string | null;
73
+ } | null;
64
74
  };
65
- locale?: {
66
- name?: string | null;
67
- } | null;
68
- path?: string | null;
69
- }[];
75
+ _type: string;
76
+ [fieldName: string]: any;
77
+ }>;
70
78
  };
71
79
  };
72
- export type GetContentByIdMethod = (client: GraphQLClient, variables: GetContentByIdVariables) => Promise<GetContentByIdData>;
73
- export {};
80
+ export type GetContentByIdMethod = <LocaleType = string>(client: GraphQLClient, variables: ContentQueryProps<LocaleType>) => Promise<GetContentByIdData<LocaleType>>;
@@ -1,10 +1,27 @@
1
- import { type NextRequest, NextResponse } from 'next/server';
2
- import { type IOptiGraphClient } from "@remkoj/optimizely-graph-client";
3
- export type PublishApiResponse = {
4
- status: "success" | "no-publish";
5
- paths?: string[];
6
- } | {
7
- error: string;
1
+ import { type NextRequest, NextResponse } from "next/server";
2
+ import { revalidatePath } from "next/cache";
3
+ import { type IOptiGraphClient, type OptimizelyGraphConfig, type ClientFactory } from "@remkoj/optimizely-graph-client";
4
+ type PublishScopes = NonNullable<Parameters<typeof revalidatePath>[1]>;
5
+ type OptiGraphClientFactory = IOptiGraphClient | OptimizelyGraphConfig | ClientFactory;
6
+ type PublishApiOptions = {
7
+ /**
8
+ * The list of paths that your implementation uses with Optimizely CMS managed
9
+ * content
10
+ */
11
+ paths: Array<string>;
12
+ /**
13
+ * The scopes for which to revalidate the cache
14
+ */
15
+ scopes?: Array<PublishScopes>;
16
+ /**
17
+ * The tags to revalidate the cache for
18
+ */
19
+ tags?: Array<string>;
20
+ /**
21
+ * The Optimizely Graph client to use for Graph Operations needed to publish
22
+ * content
23
+ */
24
+ client?: OptiGraphClientFactory;
8
25
  };
9
- export declare function createPublishApi(client?: IOptiGraphClient): (req: NextRequest) => Promise<NextResponse<PublishApiResponse>>;
26
+ export declare function createPublishApi(options: PublishApiOptions): (request: NextRequest) => Promise<NextResponse>;
10
27
  export default createPublishApi;
@@ -1,11 +1,14 @@
1
- import { NextResponse } from 'next/server';
1
+ import { NextResponse } from "next/server";
2
+ import { revalidatePath, revalidateTag } from "next/cache";
3
+ import { isContentGraphClient, ContentGraphClient } from "@remkoj/optimizely-graph-client";
2
4
  import { getServerClient } from '../client';
3
- import { revalidatePath } from 'next/cache';
4
- const editPaths = ['/ui/[[...path]]'];
5
- const publishedPaths = ['/[lang]', '/[lang]/[[...path]]', '/sitemap', '/sitemap.xml'];
6
- const paths = [...editPaths, ...publishedPaths];
7
- export function createPublishApi(client) {
8
- const graphClient = client ?? getServerClient();
5
+ export function createPublishApi(options) {
6
+ const defaultOptions = {
7
+ paths: [],
8
+ client: getServerClient,
9
+ scopes: ['page', 'layout'],
10
+ tags: []
11
+ };
9
12
  function tryJsonParse(data) {
10
13
  if (typeof (data) != 'string')
11
14
  return null;
@@ -16,14 +19,19 @@ export function createPublishApi(client) {
16
19
  return null;
17
20
  }
18
21
  }
19
- const publishHandler = async (req) => {
20
- // Validate access
21
- const xAuthToken = req.headers.get("X-OPTLY-PUBLISH") ??
22
- req.nextUrl.searchParams.get("token") ??
22
+ const { client: clientFactory, paths, scopes, tags } = {
23
+ ...defaultOptions,
24
+ ...options
25
+ };
26
+ const client = typeof clientFactory == 'function' ? clientFactory() : (isContentGraphClient(clientFactory) ? clientFactory : new ContentGraphClient(clientFactory));
27
+ return async function (request) {
28
+ // Authorize the request
29
+ const xAuthToken = request.headers.get("X-OPTLY-PUBLISH") ??
30
+ request.nextUrl.searchParams.get("token") ??
23
31
  undefined;
24
- const serverToken = graphClient.siteInfo.publishToken;
32
+ const serverToken = client.siteInfo.publishToken;
25
33
  if (!serverToken || serverToken == "") {
26
- console.error("No authentication configured, publishing has been disabled");
34
+ console.error("[Publish-API] No authentication configured, publishing has been disabled");
27
35
  return NextResponse.json({ error: "Not authorized" }, { status: 401 });
28
36
  }
29
37
  if (serverToken != xAuthToken) {
@@ -31,24 +39,24 @@ export function createPublishApi(client) {
31
39
  return NextResponse.json({ error: "Not authorized" }, { status: 401 });
32
40
  }
33
41
  // Get request data
34
- const requestBody = tryJsonParse(await req.text());
35
- // Don't publish if we're in selective mode and there's no data
36
- if (!requestBody) {
37
- console.log("Not flushing due to missing request body");
38
- return NextResponse.json({ status: "no-publish" });
39
- }
40
- const action = requestBody.type?.action;
41
- const subject = requestBody.type?.subject;
42
- // Only publish on updated documents
43
- if (subject != "doc" || action != "updated") {
44
- console.log("Not flushing due to incorrect subject or type", JSON.stringify(requestBody));
45
- return NextResponse.json({ status: "no-publish" });
46
- }
47
- paths.forEach(p => revalidatePath(p, 'page'));
48
- console.log("Publishing => Revalidated (paths)", paths);
49
- return NextResponse.json({ status: "success", paths });
42
+ const requestBody = tryJsonParse(await request.text());
43
+ console.log("[Publish-API] Graph Event: " + JSON.stringify(requestBody, undefined, 4));
44
+ // Keep track of what has been revalidated
45
+ const revalidated = [];
46
+ // Flush all
47
+ scopes.forEach(scope => {
48
+ paths.forEach(path => {
49
+ revalidatePath(path, scope);
50
+ revalidated.push({ path, scope });
51
+ });
52
+ });
53
+ tags.forEach(tag => {
54
+ revalidateTag(tag);
55
+ revalidated.push({ tag });
56
+ });
57
+ // Return result
58
+ return NextResponse.json({ success: true, revalidated });
50
59
  };
51
- return publishHandler;
52
60
  }
53
61
  export default createPublishApi;
54
62
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publish/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publish/index.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -2,5 +2,5 @@ import type { IOptiGraphClient } from "@remkoj/optimizely-graph-client";
2
2
  import type { CmsComponent, ContentLink } from "@remkoj/optimizely-cms-react";
3
3
  import type { Metadata } from 'next';
4
4
  export type OptimizelyNextPage<T = {}> = CmsComponent<T> & {
5
- getMetaData?: (contentLink: ContentLink, locale: string, client: IOptiGraphClient) => Promise<Metadata>;
5
+ getMetaData?: (contentLink: ContentLink, locale: string | null | undefined, client: IOptiGraphClient) => Promise<Metadata>;
6
6
  };