diff --git a/package-lock.json b/package-lock.json index f349cc47..0be7b0b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "html-react-parser": "^4.2.9", "lru-cache": "^10.0.1", - "next": "13.5.6", + "next": "13.4.19", "react": "18.2.0", "react-dom": "18.2.0", "unescape": "^1.0.1" @@ -139,14 +139,14 @@ "dev": true }, "node_modules/@next/env": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.6.tgz", - "integrity": "sha512-Yac/bV5sBGkkEXmAX5FWPS9Mmo2rthrOPRQQNfycJPkjUAUclomCPH7QFVCDQ4Mp2k2K1SSM6m0zrxYrOwtFQw==" + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.19.tgz", + "integrity": "sha512-FsAT5x0jF2kkhNkKkukhsyYOrRqtSxrEhfliniIq0bwWbuXLgyt3Gv0Ml+b91XwjwArmuP7NxCiGd++GGKdNMQ==" }, "node_modules/@next/swc-darwin-arm64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.6.tgz", - "integrity": "sha512-5nvXMzKtZfvcu4BhtV0KH1oGv4XEW+B+jOfmBdpFI3C7FrB/MfujRpWYSBBO64+qbW8pkZiSyQv9eiwnn5VIQA==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.19.tgz", + "integrity": "sha512-vv1qrjXeGbuF2mOkhkdxMDtv9np7W4mcBtaDnHU+yJG+bBwa6rYsYSCI/9Xm5+TuF5SbZbrWO6G1NfTh1TMjvQ==", "cpu": [ "arm64" ], @@ -159,9 +159,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.5.6.tgz", - "integrity": "sha512-6cgBfxg98oOCSr4BckWjLLgiVwlL3vlLj8hXg2b+nDgm4bC/qVXXLfpLB9FHdoDu4057hzywbxKvmYGmi7yUzA==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.19.tgz", + "integrity": "sha512-jyzO6wwYhx6F+7gD8ddZfuqO4TtpJdw3wyOduR4fxTUCm3aLw7YmHGYNjS0xRSYGAkLpBkH1E0RcelyId6lNsw==", "cpu": [ "x64" ], @@ -174,9 +174,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.5.6.tgz", - "integrity": "sha512-txagBbj1e1w47YQjcKgSU4rRVQ7uF29YpnlHV5xuVUsgCUf2FmyfJ3CPjZUvpIeXCJAoMCFAoGnbtX86BK7+sg==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.19.tgz", + "integrity": "sha512-vdlnIlaAEh6H+G6HrKZB9c2zJKnpPVKnA6LBwjwT2BTjxI7e0Hx30+FoWCgi50e+YO49p6oPOtesP9mXDRiiUg==", "cpu": [ "arm64" ], @@ -189,9 +189,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.5.6.tgz", - "integrity": "sha512-cGd+H8amifT86ZldVJtAKDxUqeFyLWW+v2NlBULnLAdWsiuuN8TuhVBt8ZNpCqcAuoruoSWynvMWixTFcroq+Q==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.19.tgz", + "integrity": "sha512-aU0HkH2XPgxqrbNRBFb3si9Ahu/CpaR5RPmN2s9GiM9qJCiBBlZtRTiEca+DC+xRPyCThTtWYgxjWHgU7ZkyvA==", "cpu": [ "arm64" ], @@ -204,9 +204,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.5.6.tgz", - "integrity": "sha512-Mc2b4xiIWKXIhBy2NBTwOxGD3nHLmq4keFk+d4/WL5fMsB8XdJRdtUlL87SqVCTSaf1BRuQQf1HvXZcy+rq3Nw==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.19.tgz", + "integrity": "sha512-htwOEagMa/CXNykFFeAHHvMJeqZfNQEoQvHfsA4wgg5QqGNqD5soeCer4oGlCol6NGUxknrQO6VEustcv+Md+g==", "cpu": [ "x64" ], @@ -219,9 +219,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.5.6.tgz", - "integrity": "sha512-CFHvP9Qz98NruJiUnCe61O6GveKKHpJLloXbDSWRhqhkJdZD2zU5hG+gtVJR//tyW897izuHpM6Gtf6+sNgJPQ==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.19.tgz", + "integrity": "sha512-4Gj4vvtbK1JH8ApWTT214b3GwUh9EKKQjY41hH/t+u55Knxi/0wesMzwQRhppK6Ddalhu0TEttbiJ+wRcoEj5Q==", "cpu": [ "x64" ], @@ -234,9 +234,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.5.6.tgz", - "integrity": "sha512-aFv1ejfkbS7PUa1qVPwzDHjQWQtknzAZWGTKYIAaS4NMtBlk3VyA6AYn593pqNanlicewqyl2jUhQAaFV/qXsg==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.19.tgz", + "integrity": "sha512-bUfDevQK4NsIAHXs3/JNgnvEY+LRyneDN788W2NYiRIIzmILjba7LaQTfihuFawZDhRtkYCv3JDC3B4TwnmRJw==", "cpu": [ "arm64" ], @@ -249,9 +249,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.5.6.tgz", - "integrity": "sha512-XqqpHgEIlBHvzwG8sp/JXMFkLAfGLqkbVsyN+/Ih1mR8INb6YCc2x/Mbwi6hsAgUnqQztz8cvEbHJUbSl7RHDg==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.19.tgz", + "integrity": "sha512-Y5kikILFAr81LYIFaw6j/NrOtmiM4Sf3GtOc0pn50ez2GCkr+oejYuKGcwAwq3jiTKuzF6OF4iT2INPoxRycEA==", "cpu": [ "ia32" ], @@ -264,9 +264,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.5.6.tgz", - "integrity": "sha512-Cqfe1YmOS7k+5mGu92nl5ULkzpKuxJrP3+4AEuPmrpFZ3BHxTY3TnHmU1On3bFmFFs6FbTcdF58CCUProGpIGQ==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.19.tgz", + "integrity": "sha512-YzA78jBDXMYiINdPdJJwGgPNT3YqBNNGhsthsDoWHL9p24tEJn9ViQf/ZqTbwSpX/RrkPupLfuuTH2sf73JBAw==", "cpu": [ "x64" ], @@ -314,9 +314,9 @@ } }, "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", "dependencies": { "tslib": "^2.4.0" } @@ -2479,34 +2479,35 @@ "dev": true }, "node_modules/next": { - "version": "13.5.6", - "resolved": "https://registry.npmjs.org/next/-/next-13.5.6.tgz", - "integrity": "sha512-Y2wTcTbO4WwEsVb4A8VSnOsG1I9ok+h74q0ZdxkwM3EODqrs4pasq7O0iUxbcS9VtWMicG7f3+HAj0r1+NtKSw==", + "version": "13.4.19", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.19.tgz", + "integrity": "sha512-HuPSzzAbJ1T4BD8e0bs6B9C1kWQ6gv8ykZoRWs5AQoiIuqbGHHdQO7Ljuvg05Q0Z24E2ABozHe6FxDvI6HfyAw==", "dependencies": { - "@next/env": "13.5.6", - "@swc/helpers": "0.5.2", + "@next/env": "13.4.19", + "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.31", + "postcss": "8.4.14", "styled-jsx": "5.1.1", - "watchpack": "2.4.0" + "watchpack": "2.4.0", + "zod": "3.21.4" }, "bin": { "next": "dist/bin/next" }, "engines": { - "node": ">=16.14.0" + "node": ">=16.8.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "13.5.6", - "@next/swc-darwin-x64": "13.5.6", - "@next/swc-linux-arm64-gnu": "13.5.6", - "@next/swc-linux-arm64-musl": "13.5.6", - "@next/swc-linux-x64-gnu": "13.5.6", - "@next/swc-linux-x64-musl": "13.5.6", - "@next/swc-win32-arm64-msvc": "13.5.6", - "@next/swc-win32-ia32-msvc": "13.5.6", - "@next/swc-win32-x64-msvc": "13.5.6" + "@next/swc-darwin-arm64": "13.4.19", + "@next/swc-darwin-x64": "13.4.19", + "@next/swc-linux-arm64-gnu": "13.4.19", + "@next/swc-linux-arm64-musl": "13.4.19", + "@next/swc-linux-x64-gnu": "13.4.19", + "@next/swc-linux-x64-musl": "13.4.19", + "@next/swc-win32-arm64-msvc": "13.4.19", + "@next/swc-win32-ia32-msvc": "13.4.19", + "@next/swc-win32-x64-msvc": "13.4.19" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -2757,9 +2758,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", "funding": [ { "type": "opencollective", @@ -2768,14 +2769,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -3562,6 +3559,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index eae4b875..325341f9 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "dependencies": { "html-react-parser": "^4.2.9", "lru-cache": "^10.0.1", - "next": "13.5.6", + "next": "13.4.12", "react": "18.2.0", "react-dom": "18.2.0", "unescape": "^1.0.1" diff --git a/src/ComponentRegistry.ts b/src/ComponentRegistry.ts index b436ab19..637d3c0b 100644 --- a/src/ComponentRegistry.ts +++ b/src/ComponentRegistry.ts @@ -36,15 +36,12 @@ interface ComponentDictionary { // NB! Always return null or empty object from processor for next is unable to serialize undefined export type DataProcessor = (data: any, context?: Context, config?: any) => Promise>; -// TODO: also access as arguments: dataAsJson, pageAsJson, configAsJson from the first (meta) call here? -// Another option could be to let the component or page controller pass those values to NextJS by a header export type VariablesGetter = (path: string, context?: Context, config?: any) => VariablesGetterResult; export type QueryGetter = (path: string, context?: Context, config?: any) => string; export type VariablesGetterResult = { [variables: string]: any, - path: string, }; export type SelectedQueryMaybeVariablesFunc = string | QueryGetter | diff --git a/src/guillotine/fetchContent.ts b/src/guillotine/fetchContent.ts index 3b7cee14..631de6b4 100644 --- a/src/guillotine/fetchContent.ts +++ b/src/guillotine/fetchContent.ts @@ -11,6 +11,7 @@ import adapterConstants, { FRAGMENT_DEFAULT_REGION_NAME, GET_STATIC_PATHS_QUERY, getContentApiUrl, + getContentBranch, getLocaleProjectConfig, getLocaleProjectConfigs, getRenderMode, @@ -93,7 +94,7 @@ const NO_PROPS_PROCESSOR = async (props: any) => await props ?? {}; const ALIAS_PREFIX = 'request'; -const GUILLOTINE_QUERY_REGEXP = /^\s*query\s*(?:\((.*)*\))?\s*{\s*guillotine\s*{((?:.|\s)+)}\s*}\s*$/; +const GUILLOTINE_QUERY_REGEXP = /^\s*query\s*(?:\(([^)]*)\))?\s*{\s*((?:.|\s)+)\s*}\s*$/; const GRAPHQL_FRAGMENTS_REGEXP = /fragment\s+.+\s+on\s+.+\s*{[\s\w{}().,:"'`]+}/; @@ -112,7 +113,6 @@ export type ContentApiBaseBody = { export const fetchFromApi = async ( apiUrl: string, body: ContentApiBaseBody, - projectConfig: LocaleProjectConfig, headers?: {}, method = 'POST', ) => { @@ -121,7 +121,6 @@ export const fetchFromApi = async ( headers: { 'Accept': 'application/json', 'Content-Type': 'application/json', - 'X-Guillotine-SiteKey': projectConfig.site, }, body: JSON.stringify(body), }; @@ -172,7 +171,6 @@ export const fetchFromApi = async ( export const fetchGuillotine = async ( contentApiUrl: string, body: ContentApiBaseBody, - projectConfig: LocaleProjectConfig, headers?: {}): Promise => { if (typeof body.query !== 'string' || !body.query.trim()) { return { @@ -187,7 +185,6 @@ export const fetchGuillotine = async ( const result = await fetchFromApi( contentApiUrl, body, - projectConfig, headers, ) .then(json => { @@ -228,14 +225,17 @@ export const fetchGuillotine = async ( // /////////////////////////////////////////////////////////////////////////////// Specific fetch wrappers: -const fetchMetaData = async (contentApiUrl: string, xpContentPath: string, projectConfig: LocaleProjectConfig, headers?: {}): Promise => { +const fetchMetaData = async (contentApiUrl: string, xpContentPath: string, projectConfig: LocaleProjectConfig, branch: string, headers?: {}): Promise => { const body: ContentApiBaseBody = { query: getMetaQuery(pageFragmentQuery()), variables: { path: xpContentPath, + siteKey: projectConfig.site, + repo: projectConfig.project, + branch, }, }; - const metaResult = await fetchGuillotine(contentApiUrl, body, projectConfig, headers); + const metaResult = await fetchGuillotine(contentApiUrl, body, headers); if (metaResult.error) { return metaResult; } else { @@ -248,19 +248,25 @@ const fetchMetaData = async (contentApiUrl: string, xpContentPath: string, proje const fetchContentData = async ( contentApiUrl: string, - xpContentPath: string, projectConfig: LocaleProjectConfig, + branch: string, query: string, variables?: {}, headers?: {}, ): Promise => { - const body: ContentApiBaseBody = {query}; + const body: ContentApiBaseBody = { + query, + variables: { + siteKey: projectConfig.site, + repo: projectConfig.project, + branch, + }, + }; if (variables && Object.keys(variables).length > 0) { - body.variables = variables; + body.variables = Object.assign(body.variables, variables); } - const contentResults = await fetchGuillotine(contentApiUrl, body, projectConfig, headers); - + const contentResults = await fetchGuillotine(contentApiUrl, body, headers); if (contentResults.error) { return contentResults; } else { @@ -471,19 +477,19 @@ function combineMultipleQueries(queriesWithVars: ComponentDescriptor[]): QueryAn const args = match[1]; if (args) { args.split(',').forEach(originalParamString => { - const [originalKey, originalVal] = originalParamString.trim().split(':'); + const [originalKey, originalVal] = originalParamString.trim().split(':').map(s => s.trim()); const [prefixedKey, prefixedVal] = [`$${ALIAS_PREFIX}${index}_${originalKey.substr(1)}`, originalVal]; superParams.push(`${prefixedKey}:${prefixedVal}`); // also update param references in query itself ! // query = query.replaceAll(originalKey, prefixedKey); // replaceAll is not supported in older nodejs versions - const origKeyPattern = new RegExp(originalKey.replace(/\$/g, '\\$'), 'g'); + const origKeyPattern = new RegExp(`\\$${originalKey.replace(/^\$/, '')}`, 'g'); query = query.replace(origKeyPattern, prefixedKey); }); } } if (query.length) { - queries.push(`${ALIAS_PREFIX}${index}:guillotine {${query}}`); + queries.push(`${ALIAS_PREFIX}${index}:${query}`); } // Update variables with the same prefixes @@ -633,9 +639,21 @@ function getQueryAndVariables(type: string, } if (query) { + const branch = getContentBranch(context); + const localeConfig = getLocaleProjectConfig(context); + let variables = { + path, + repo: localeConfig.project, + siteKey: localeConfig.site, + branch, + }; + if (getVariables) { + variables = Object.assign(variables, getVariables(path, context, config)); + } + return { query, - variables: getVariables ? getVariables(path, context, config) : {path}, + variables, }; } } @@ -796,9 +814,10 @@ const buildContentFetcher = (config: FetcherConfig(config: FetcherConfig(config: FetcherConfig | GetServerSidePropsResult = { notFound, props, @@ -1055,12 +1072,15 @@ export async function fetchContentPathsForAllLocales(path: string, query: string } export async function fetchContentPathsForLocale(path: string, config: LocaleProjectConfig, query: string = GET_STATIC_PATHS_QUERY, count = 999): Promise { - const contentApiUrl = getContentApiUrl({locale: config.locale}); + const contentApiUrl = getContentApiUrl(); const body: ContentApiBaseBody = { query, variables: { path, count, + repo: config.project, + siteKey: config.site, + branch: getContentBranch(), }, }; return fetchGuillotine(contentApiUrl, body, config).then((results: GuillotineResult) => { diff --git a/src/guillotine/getMetaData.ts b/src/guillotine/getMetaData.ts index 2861430a..f99beaa8 100644 --- a/src/guillotine/getMetaData.ts +++ b/src/guillotine/getMetaData.ts @@ -127,8 +127,8 @@ export const pageFragmentQuery = () => ` }`; export function getMetaQuery(pageFragment?: string): string { - return `query($path:ID!){ - guillotine { + return `query($path:ID!, $siteKey: String, $repo: String, $branch: String){ + guillotine(siteKey: $siteKey, repo: $repo, branch: $branch) { get(key:$path) { _path type diff --git a/src/query/Shortcut.ts b/src/query/Shortcut.ts index db21409f..1abb2d37 100644 --- a/src/query/Shortcut.ts +++ b/src/query/Shortcut.ts @@ -1,11 +1,11 @@ export const getShortcutQuery = ` - query($path:ID!){ - guillotine { + query($path:ID!, $repo: String, $siteKey: String, $branch: String){ + guillotine(siteKey: $siteKey, repo: $repo, branch: $branch) { get(key:$path) { ... on base_Shortcut { data { target { - pageUrl(type: absolute) + pageUrl } } } diff --git a/src/utils.ts b/src/utils.ts index fe3a50a7..ca0d184d 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -61,8 +61,8 @@ export const DEFAULT_LOCALE_HEADER = 'default-locale'; * - media * - paths with '/_' in them */ -export const GET_STATIC_PATHS_QUERY = `query ($count: Int) { - guillotine { +export const GET_STATIC_PATHS_QUERY = `query ($count: Int, $repo: String, $siteKey: String, $branch: String) { + guillotine(siteKey: $siteKey, repo: $repo, branch: $branch) { queryDsl( first: $count, sort: { @@ -233,11 +233,12 @@ export function fixDoubleSlashes(str: string) { return str.replace(/(^|[^:/])\/{2,}/g, '$1/'); } -export function getContentApiUrl(context?: MinimalContext): string { - const project = getLocaleProjectConfig(context).project; - const branch = getRenderMode(context) === RENDER_MODE.NEXT ? 'master' : 'draft'; +export function getContentApiUrl(): string { + return API_URL; +} - return fixDoubleSlashes(`${API_URL}/${project}/${branch}`); +export function getContentBranch(context?: MinimalContext): string { + return getRenderMode(context) === RENDER_MODE.NEXT ? 'master' : 'draft'; } export function addJsessionHeaders(headers: Object = {}, context?: MinimalContext): void {