@websolutespa/bom-mixer-models 3.0.0 → 3.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","names":[],"sources":["../../src/route/route.interceptor.ts"],"sourcesContent":[],"mappings":";;;iBAMsB,YAAA,UAAsB,sCAAmC;iBAMzD,aAAA,UAAuB,sCAAmC;AAN1D,iBA+DA,kBAAA,CA/DY,OAAA,EA+DgB,WA/DhB,EAAA,IAAA,EA+DmC,cA/DnC,CAAA,EA+DoD,OA/DpD,CAAA,MAAA,GAAA,SAAA,CAAA;AAAA,iBA4HZ,gBAAA,CA5HY,OAAA,EA4Hc,WA5Hd,EAAA,IAAA,EA4HiC,cA5HjC,CAAA,EA4H+C,OA5H/C,CA4H+C,YA5H/C,CAAA,OAAA,CAAA,GAAA,SAAA,CAAA"}
1
+ {"version":3,"file":"proxy.d.ts","names":[],"sources":["../../src/route/route.interceptor.ts"],"sourcesContent":[],"mappings":";;;iBAMsB,YAAA,UAAsB,sCAAmC;iBAMzD,aAAA,UAAuB,sCAAmC;AAN1D,iBAuDA,kBAAA,CAvDY,OAAA,EAuDgB,WAvDhB,EAAA,IAAA,EAuDmC,cAvDnC,CAAA,EAuDoD,OAvDpD,CAAA,MAAA,GAAA,SAAA,CAAA;AAAA,iBAmHZ,gBAAA,CAnHY,OAAA,EAmHc,WAnHd,EAAA,IAAA,EAmHiC,cAnHjC,CAAA,EAmH+C,OAnH/C,CAmH+C,YAnH/C,CAAA,OAAA,CAAA,GAAA,SAAA,CAAA"}
@@ -39,15 +39,13 @@ async function detectCountry(request, defaultMarket$1) {
39
39
  return defaultMarket$1 || process.env.DEFAULT_MARKET;
40
40
  }
41
41
  async function getMarkets() {
42
- let routes = [];
43
- if (storeStrategy === StoreStrategy.DecoratedApi) routes = await localApiGet("/market?pagination=false");
44
- else routes = await storeApiGet("/market?pagination=false");
45
- return routes;
42
+ const apiGet = storeStrategy === StoreStrategy.DecoratedApi ? localApiGet : storeApiGet;
43
+ const markets = await apiGet("/market?pagination=false");
44
+ return markets;
46
45
  }
47
46
  async function getRootRoutes() {
48
- let routes = [];
49
- if (storeStrategy === StoreStrategy.DecoratedApi) routes = await localApiGet("/route?where[isRoot][equals]=true");
50
- else routes = await storeApiGet("/route?where[isRoot][equals]=true");
47
+ const apiGet = storeStrategy === StoreStrategy.DecoratedApi ? localApiGet : storeApiGet;
48
+ const routes = await apiGet("/route?where[isRoot][equals]=true");
51
49
  return routes;
52
50
  }
53
51
  async function routeAutoDetection(request, next) {
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.js","names":["request: NextRequest","defaultLocale?: string","defaultLocale","defaultMarket?: string","defaultMarket","routes: IMarket[]","routes: IRoute[]","next: NextFetchEvent","route: string | undefined","countries: string[]","x","market","route: IRoute | undefined","response","error: any","error","hrefBeforeRedirect: string | null"],"sources":["../../src/route/route.interceptor.ts"],"sourcesContent":["import { IMarket, IRoute, asEquatable, defaultLocale, defaultMarket, getHost, isDevelopment } from '@websolutespa/bom-core';\r\nimport { StoreStrategy, localApiGet, localApiPost, storeApiGet, storeApiPost, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { NextFetchEvent, NextRequest, NextResponse } from 'next/server';\r\nimport { getPublicUrl, resolveHref } from '../page/page';\r\nimport { resolveRoute } from './route';\r\n\r\nexport async function detectLocale(request: NextRequest, defaultLocale?: string) {\r\n const acceptLanguage = request.headers.get('accept-language')?.split(',')[0];\r\n const detectedLocale = request.cookies.get('NEXT_LOCALE')?.value || acceptLanguage || defaultLocale || process.env.DEFAULT_LOCALE;\r\n return detectedLocale as string;\r\n}\r\n\r\nexport async function detectCountry(request: NextRequest, defaultMarket?: string) {\r\n let ip = request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip');\r\n if (ip) {\r\n ip = ip.split(',')[0];\r\n }\r\n const isValidIp = ip?.match(/^(\\d+?)\\.(\\d+?)\\.(\\d+?)\\.(\\d+?)$/);\r\n let detectedCountry = '';\r\n try {\r\n const token = process.env.IPINFO_TOKEN;\r\n if (token) {\r\n const url = isValidIp ?\r\n `https://api.ipinfo.io/lite/${ip}/country_code?token=${token}` :\r\n `https://api.ipinfo.io/lite/me/country_code?token=${token}`;\r\n const response = await fetch(url);\r\n if (response.ok) {\r\n const data = await response.text();\r\n detectedCountry = data.toLowerCase();\r\n }\r\n } else {\r\n const url = `https://geoip.websolute.it/Ip2Location/get_info.aspx?ipaddress=${isValidIp ? ip : ''}`;\r\n const response = await fetch(url);\r\n if (response.ok) {\r\n const xml = await response.text();\r\n detectedCountry = (\r\n ((xml.split('<CountryCode><![CDATA[')[1] || '').split(']]></CountryCode>')[0] || '')\r\n ).replace('-', '').toLowerCase();\r\n // console.log('detectedCountry', detectedCountry);\r\n }\r\n }\r\n // console.log('routeInterceptor.detectCountry', detectedCountry);\r\n return detectedCountry || defaultMarket || process.env.DEFAULT_MARKET;\r\n } catch (error) {\r\n console.log('routeInterceptor.detectCountry.error', error);\r\n }\r\n return (defaultMarket || process.env.DEFAULT_MARKET) as string;\r\n}\r\n\r\nasync function getMarkets() {\r\n let routes: IMarket[] = [];\r\n if (storeStrategy === StoreStrategy.DecoratedApi) {\r\n routes = await localApiGet('/market?pagination=false');\r\n } else {\r\n routes = await storeApiGet('/market?pagination=false');\r\n }\r\n return routes;\r\n}\r\n\r\nasync function getRootRoutes() {\r\n let routes: IRoute[] = [];\r\n if (storeStrategy === StoreStrategy.DecoratedApi) {\r\n routes = await localApiGet('/route?where[isRoot][equals]=true');\r\n } else {\r\n routes = await storeApiGet('/route?where[isRoot][equals]=true');\r\n }\r\n return routes;\r\n}\r\n\r\nexport async function routeAutoDetection(request: NextRequest, next: NextFetchEvent): Promise<string | undefined> {\r\n let route: string | undefined;\r\n const url = request.nextUrl;\r\n // console.log('routeInterceptor.routeAutoDetection', url);\r\n if (url.pathname === '/') {\r\n const cookie = request.cookies.get('detectedRoute');\r\n if (cookie?.value) {\r\n return cookie.value;\r\n }\r\n // console.log('routeInterceptor.routeAutoDetection', url.pathname);\r\n const rootRoutes = await getRootRoutes();\r\n // console.log('routeInterceptor.routeAutoDetection.rootRoutes', rootRoutes);\r\n const defaultRoute = rootRoutes.find(x => x.id === '/');\r\n // console.log('routeInterceptor.routeAutoDetection.defaultRoute', defaultRoute);\r\n if (defaultRoute) {\r\n return;\r\n }\r\n const markets = await getMarkets();\r\n // console.log('routeInterceptor.routeAutoDetection.markets', markets);\r\n const market = markets.find(x => x.isDefault) || markets.find(x => x.id === defaultMarket) || markets[0];\r\n // console.log('routeInterceptor.routeAutoDetection.market', market);\r\n const detectedCountry = await detectCountry(request, market.id);\r\n // console.log('routeInterceptor.routeAutoDetection.detectedCountry', detectedCountry);\r\n const detectedMarket = detectedCountry ? (\r\n markets.filter(x => Array.isArray(x.countries)).find(x => {\r\n const countries: string[] = (x.countries || []).map(x => typeof x === 'string' ? x : x.id as string);\r\n return countries.includes(detectedCountry);\r\n }) ||\r\n markets.find(x => !Array.isArray(x.countries))\r\n ) : undefined;\r\n // console.log('routeInterceptor.routeAutoDetection.detectedMarket', detectedMarket);\r\n let detectedMarketRoutes = rootRoutes.filter(x => x.market === detectedMarket?.id);\r\n if (detectedMarketRoutes.length === 0) {\r\n detectedMarketRoutes = rootRoutes.filter(x => x.market === market.id);\r\n }\r\n // console.log('routeInterceptor.routeAutoDetection.detectedMarketRoutes', detectedMarketRoutes);\r\n const defaultMarketLocale = market.defaultLanguage ? (\r\n typeof market.defaultLanguage === 'string' ? market.defaultLanguage : market.defaultLanguage.id\r\n ) as string : defaultLocale;\r\n // console.log('routeInterceptor.routeAutoDetection.defaultMarketLocale', defaultMarketLocale);\r\n const detectedLocale = await detectLocale(request, defaultMarketLocale);\r\n // console.log('routeInterceptor.routeAutoDetection.detectedLocale', detectedLocale);\r\n const detectedLocaleRoutes = detectedMarketRoutes.filter(x => x.locale === detectedLocale);\r\n const detectedRoute =\r\n detectedLocaleRoutes.length > 0 ?\r\n detectedLocaleRoutes[0]! :\r\n detectedMarketRoutes.find(x => {\r\n const market = markets.find(m => m.id === x.market)!;\r\n const marketLocale = (market.defaultLanguage ? asEquatable(market.defaultLanguage as string) : defaultMarketLocale);\r\n return x.locale === marketLocale;\r\n })!;\r\n // console.log('routeInterceptor.routeAutoDetection.detectedRoute', detectedRoute);\r\n if (detectedRoute && detectedRoute.id !== url.pathname) {\r\n console.log('routeInterceptor.routeAutoDetection', detectedLocale, detectedCountry, detectedRoute.id);\r\n route = detectedRoute.id;\r\n }\r\n // console.log('routeInterceptor.routeAutoDetection', locale, detectedCountry, rootRoutes);\r\n }\r\n return route;\r\n}\r\n\r\nexport async function routeInterceptor(request: NextRequest, next: NextFetchEvent) {\r\n let route: IRoute | undefined;\r\n let url = request.nextUrl;\r\n const hrefBeforeRedirect = getHrefBeforeRedirect(request);\r\n // console.log('routeInterceptor._live', request.nextUrl.searchParams.get('_live'));\r\n try {\r\n const redirectUrl = await routeAutoDetection(request, next);\r\n // console.log('routeInterceptor.routeAutoDetection', redirectUrl);\r\n if (redirectUrl) {\r\n const response = NextResponse.redirect(resolveHref(redirectUrl), isDevelopment ? 307 : 301);\r\n response.cookies.set({\r\n expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000),\r\n httpOnly: true,\r\n name: 'detectedRoute',\r\n path: '/',\r\n sameSite: 'lax',\r\n secure: true,\r\n value: redirectUrl,\r\n });\r\n return response;\r\n }\r\n // console.log('routeInterceptor request.cookies', request.cookies);\r\n // console.log('routeInterceptor', url.pathname);\r\n if (storeStrategy === StoreStrategy.DecoratedApi) {\r\n route = await localApiPost('/route', { pathname: url.pathname, href: url.href, hrefBeforeRedirect });\r\n } else {\r\n route = await storeApiPost('/route', { pathname: url.pathname, href: url.href, hrefBeforeRedirect });\r\n }\r\n // console.log('route', route);\r\n if (!route) {\r\n console.log('routeInterceptor.route.notfound', url.pathname);\r\n return;\r\n }\r\n } catch (error: any) {\r\n if (error.status >= 300 && error.status < 400) {\r\n console.log('routeInterceptor.3xx', url.pathname, error.status, error.statusText);\r\n try {\r\n const { redirectUrl } = await error.json();\r\n // console.log('redirectUrl', redirectUrl);\r\n const response = NextResponse.redirect(redirectUrl, error.status);\r\n return response;\r\n } catch (error) {\r\n const publicUrl = getPublicUrl();\r\n console.log('routeInterceptor.3xx.error', `cannot parse response, redirecting to ${publicUrl}`);\r\n const response = NextResponse.redirect(publicUrl, 307);\r\n return response;\r\n }\r\n } else if (error.status === 410) {\r\n console.log('routeInterceptor.410', url.pathname, error.status, error.statusText);\r\n url = request.nextUrl.clone();\r\n url.pathname = `/${error.status}`;\r\n const response = NextResponse.rewrite(url, {\r\n status: error.status,\r\n statusText: error.statusText,\r\n request,\r\n });\r\n return response;\r\n } else if (error.status >= 400 && error.status < 500) {\r\n console.log('routeInterceptor.4xx', url.pathname, error.status, error.statusText);\r\n const response = NextResponse.next({\r\n status: error.status,\r\n statusText: error.statusText,\r\n request,\r\n });\r\n return response;\r\n }\r\n console.log('routeInterceptor.error', url.pathname, error.url, error.status, error.statusText || error);\r\n return;\r\n }\r\n // console.log('routeInterceptor.route.found', url.pathname, '->', route);\r\n url = request.nextUrl.clone();\r\n const resolvedPathname = resolveRoute(route);\r\n // console.log('resolvedPathname', resolvedPathname);\r\n url.pathname = resolvedPathname;\r\n // console.log('routeInterceptor.route', route.schema, route.page, route.market, route.locale);\r\n const response = NextResponse.rewrite(url);\r\n // const response = NextResponse.redirect(url);\r\n return response;\r\n}\r\n\r\nfunction getHrefBeforeRedirect(request: NextRequest): string | null {\r\n let hrefBeforeRedirect: string | null = null;\r\n const urlBeforeRedirect = request.nextUrl.clone();\r\n const host = getHost(request.headers);\r\n if (host) {\r\n urlBeforeRedirect.host = host;\r\n urlBeforeRedirect.port = host.split(':')[1] || '';\r\n hrefBeforeRedirect = urlBeforeRedirect.href;\r\n }\r\n return hrefBeforeRedirect;\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"proxy.js","names":["request: NextRequest","defaultLocale?: string","defaultLocale","defaultMarket?: string","defaultMarket","markets: IMarket[]","routes: IRoute[]","next: NextFetchEvent","route: string | undefined","countries: string[]","x","market","route: IRoute | undefined","response","error: any","error","hrefBeforeRedirect: string | null"],"sources":["../../src/route/route.interceptor.ts"],"sourcesContent":["import { IMarket, IRoute, asEquatable, defaultLocale, defaultMarket, getHost, isDevelopment } from '@websolutespa/bom-core';\r\nimport { StoreStrategy, localApiGet, localApiPost, storeApiGet, storeApiPost, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { NextFetchEvent, NextRequest, NextResponse } from 'next/server';\r\nimport { getPublicUrl, resolveHref } from '../page/page';\r\nimport { resolveRoute } from './route';\r\n\r\nexport async function detectLocale(request: NextRequest, defaultLocale?: string) {\r\n const acceptLanguage = request.headers.get('accept-language')?.split(',')[0];\r\n const detectedLocale = request.cookies.get('NEXT_LOCALE')?.value || acceptLanguage || defaultLocale || process.env.DEFAULT_LOCALE;\r\n return detectedLocale as string;\r\n}\r\n\r\nexport async function detectCountry(request: NextRequest, defaultMarket?: string) {\r\n let ip = request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip');\r\n if (ip) {\r\n ip = ip.split(',')[0];\r\n }\r\n const isValidIp = ip?.match(/^(\\d+?)\\.(\\d+?)\\.(\\d+?)\\.(\\d+?)$/);\r\n let detectedCountry = '';\r\n try {\r\n const token = process.env.IPINFO_TOKEN;\r\n if (token) {\r\n const url = isValidIp ?\r\n `https://api.ipinfo.io/lite/${ip}/country_code?token=${token}` :\r\n `https://api.ipinfo.io/lite/me/country_code?token=${token}`;\r\n const response = await fetch(url);\r\n if (response.ok) {\r\n const data = await response.text();\r\n detectedCountry = data.toLowerCase();\r\n }\r\n } else {\r\n const url = `https://geoip.websolute.it/Ip2Location/get_info.aspx?ipaddress=${isValidIp ? ip : ''}`;\r\n const response = await fetch(url);\r\n if (response.ok) {\r\n const xml = await response.text();\r\n detectedCountry = (\r\n ((xml.split('<CountryCode><![CDATA[')[1] || '').split(']]></CountryCode>')[0] || '')\r\n ).replace('-', '').toLowerCase();\r\n // console.log('detectedCountry', detectedCountry);\r\n }\r\n }\r\n // console.log('routeInterceptor.detectCountry', detectedCountry);\r\n return detectedCountry || defaultMarket || process.env.DEFAULT_MARKET;\r\n } catch (error) {\r\n console.log('routeInterceptor.detectCountry.error', error);\r\n }\r\n return (defaultMarket || process.env.DEFAULT_MARKET) as string;\r\n}\r\n\r\nasync function getMarkets() {\r\n const apiGet = storeStrategy === StoreStrategy.DecoratedApi ? localApiGet : storeApiGet;\r\n const markets: IMarket[] = await apiGet('/market?pagination=false');\r\n return markets;\r\n}\r\n\r\nasync function getRootRoutes() {\r\n const apiGet = storeStrategy === StoreStrategy.DecoratedApi ? localApiGet : storeApiGet;\r\n const routes: IRoute[] = await apiGet('/route?where[isRoot][equals]=true');\r\n return routes;\r\n}\r\n\r\nexport async function routeAutoDetection(request: NextRequest, next: NextFetchEvent): Promise<string | undefined> {\r\n let route: string | undefined;\r\n const url = request.nextUrl;\r\n if (url.pathname === '/') {\r\n const cookie = request.cookies.get('detectedRoute');\r\n if (cookie?.value) {\r\n return cookie.value;\r\n }\r\n // console.log('routeInterceptor.routeAutoDetection', url.pathname);\r\n const rootRoutes = await getRootRoutes();\r\n // console.log('routeInterceptor.routeAutoDetection.rootRoutes', rootRoutes);\r\n const defaultRoute = rootRoutes.find(x => x.id === '/');\r\n // console.log('routeInterceptor.routeAutoDetection.defaultRoute', defaultRoute);\r\n if (defaultRoute) {\r\n return;\r\n }\r\n const markets = await getMarkets();\r\n // console.log('routeInterceptor.routeAutoDetection.markets', markets);\r\n const market = markets.find(x => x.isDefault) || markets.find(x => x.id === defaultMarket) || markets[0];\r\n // console.log('routeInterceptor.routeAutoDetection.market', market);\r\n const detectedCountry = await detectCountry(request, market.id);\r\n // console.log('routeInterceptor.routeAutoDetection.detectedCountry', detectedCountry);\r\n const detectedMarket = detectedCountry ? (\r\n markets.filter(x => Array.isArray(x.countries)).find(x => {\r\n const countries: string[] = (x.countries || []).map(x => typeof x === 'string' ? x : x.id as string);\r\n return countries.includes(detectedCountry);\r\n }) ||\r\n markets.find(x => !Array.isArray(x.countries))\r\n ) : undefined;\r\n // console.log('routeInterceptor.routeAutoDetection.detectedMarket', detectedMarket);\r\n let detectedMarketRoutes = rootRoutes.filter(x => x.market === detectedMarket?.id);\r\n if (detectedMarketRoutes.length === 0) {\r\n detectedMarketRoutes = rootRoutes.filter(x => x.market === market.id);\r\n }\r\n // console.log('routeInterceptor.routeAutoDetection.detectedMarketRoutes', detectedMarketRoutes);\r\n const defaultMarketLocale = market.defaultLanguage ? (\r\n typeof market.defaultLanguage === 'string' ? market.defaultLanguage : market.defaultLanguage.id\r\n ) as string : defaultLocale;\r\n // console.log('routeInterceptor.routeAutoDetection.defaultMarketLocale', defaultMarketLocale);\r\n const detectedLocale = await detectLocale(request, defaultMarketLocale);\r\n // console.log('routeInterceptor.routeAutoDetection.detectedLocale', detectedLocale);\r\n const detectedLocaleRoutes = detectedMarketRoutes.filter(x => x.locale === detectedLocale);\r\n const detectedRoute =\r\n detectedLocaleRoutes.length > 0 ?\r\n detectedLocaleRoutes[0]! :\r\n detectedMarketRoutes.find(x => {\r\n const market = markets.find(m => m.id === x.market)!;\r\n const marketLocale = (market.defaultLanguage ? asEquatable(market.defaultLanguage as string) : defaultMarketLocale);\r\n return x.locale === marketLocale;\r\n })!;\r\n // console.log('routeInterceptor.routeAutoDetection.detectedRoute', detectedRoute);\r\n if (detectedRoute && detectedRoute.id !== url.pathname) {\r\n console.log('routeInterceptor.routeAutoDetection', detectedLocale, detectedCountry, detectedRoute.id);\r\n route = detectedRoute.id;\r\n }\r\n // console.log('routeInterceptor.routeAutoDetection', locale, detectedCountry, rootRoutes);\r\n }\r\n return route;\r\n}\r\n\r\nexport async function routeInterceptor(request: NextRequest, next: NextFetchEvent) {\r\n let route: IRoute | undefined;\r\n let url = request.nextUrl;\r\n const hrefBeforeRedirect = getHrefBeforeRedirect(request);\r\n // console.log('routeInterceptor._live', request.nextUrl.searchParams.get('_live'));\r\n try {\r\n const redirectUrl = await routeAutoDetection(request, next);\r\n // console.log('routeInterceptor.routeAutoDetection', redirectUrl);\r\n if (redirectUrl) {\r\n const response = NextResponse.redirect(resolveHref(redirectUrl), isDevelopment ? 307 : 301);\r\n response.cookies.set({\r\n expires: new Date(Date.now() + 1 * 24 * 60 * 60 * 1000),\r\n httpOnly: true,\r\n name: 'detectedRoute',\r\n path: '/',\r\n sameSite: 'lax',\r\n secure: true,\r\n value: redirectUrl,\r\n });\r\n return response;\r\n }\r\n // console.log('routeInterceptor request.cookies', request.cookies);\r\n // console.log('routeInterceptor', url.pathname);\r\n if (storeStrategy === StoreStrategy.DecoratedApi) {\r\n route = await localApiPost('/route', { pathname: url.pathname, href: url.href, hrefBeforeRedirect });\r\n } else {\r\n route = await storeApiPost('/route', { pathname: url.pathname, href: url.href, hrefBeforeRedirect });\r\n }\r\n // console.log('route', route);\r\n if (!route) {\r\n console.log('routeInterceptor.route.notfound', url.pathname);\r\n return;\r\n }\r\n } catch (error: any) {\r\n if (error.status >= 300 && error.status < 400) {\r\n console.log('routeInterceptor.3xx', url.pathname, error.status, error.statusText);\r\n try {\r\n const { redirectUrl } = await error.json();\r\n // console.log('redirectUrl', redirectUrl);\r\n const response = NextResponse.redirect(redirectUrl, error.status);\r\n return response;\r\n } catch (error) {\r\n const publicUrl = getPublicUrl();\r\n console.log('routeInterceptor.3xx.error', `cannot parse response, redirecting to ${publicUrl}`);\r\n const response = NextResponse.redirect(publicUrl, 307);\r\n return response;\r\n }\r\n } else if (error.status === 410) {\r\n console.log('routeInterceptor.410', url.pathname, error.status, error.statusText);\r\n url = request.nextUrl.clone();\r\n url.pathname = `/${error.status}`;\r\n const response = NextResponse.rewrite(url, {\r\n status: error.status,\r\n statusText: error.statusText,\r\n request,\r\n });\r\n return response;\r\n } else if (error.status >= 400 && error.status < 500) {\r\n console.log('routeInterceptor.4xx', url.pathname, error.status, error.statusText);\r\n const response = NextResponse.next({\r\n status: error.status,\r\n statusText: error.statusText,\r\n request,\r\n });\r\n return response;\r\n }\r\n console.log('routeInterceptor.error', url.pathname, error.url, error.status, error.statusText || error);\r\n return;\r\n }\r\n // console.log('routeInterceptor.route.found', url.pathname, '->', route);\r\n url = request.nextUrl.clone();\r\n const resolvedPathname = resolveRoute(route);\r\n // console.log('resolvedPathname', resolvedPathname);\r\n url.pathname = resolvedPathname;\r\n // console.log('routeInterceptor.route', route.schema, route.page, route.market, route.locale);\r\n const response = NextResponse.rewrite(url);\r\n // const response = NextResponse.redirect(url);\r\n return response;\r\n}\r\n\r\nfunction getHrefBeforeRedirect(request: NextRequest): string | null {\r\n let hrefBeforeRedirect: string | null = null;\r\n const urlBeforeRedirect = request.nextUrl.clone();\r\n const host = getHost(request.headers);\r\n if (host) {\r\n urlBeforeRedirect.host = host;\r\n urlBeforeRedirect.port = host.split(':')[1] || '';\r\n hrefBeforeRedirect = urlBeforeRedirect.href;\r\n }\r\n return hrefBeforeRedirect;\r\n}\r\n"],"mappings":"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"}
@@ -90,7 +90,7 @@ declare function getErrorPageLayout(): Promise<{
90
90
  type PartialPageProps<T extends ICategorized, B> = Omit<PageProps<T>, 'page'> & Partial<Pick<PageProps<T>, 'page'>> & B;
91
91
  declare function getPageProps<T extends ICategorized, B = any>(props: PartialPageProps<T, B>, extraComponents?: IComponent[]): Promise<PageProps<T> & B>;
92
92
  declare function getPublicUrl(): string;
93
- declare function resolveHref(href?: string | null): string;
93
+ declare function resolveHref(href?: string): string;
94
94
  //# sourceMappingURL=page.service.d.ts.map
95
95
  //#endregion
96
96
  //#region src/province/province.service.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","names":[],"sources":["../../src/address/address.service.ts","../../src/app/app.service.ts","../../src/captions/captions.handler.ts","../../src/category/category.service.ts","../../src/consent_preference/consent_preference.service.ts","../../src/country/country.service.ts","../../src/label/label.service.ts","../../src/layout/layout.service.ts","../../src/lazy/lazy.service.ts","../../src/locale/locale.service.ts","../../src/market/market.service.ts","../../src/menu/menu.service.ts","../../src/page/page.service.ts","../../src/province/province.service.ts","../../src/redirect/redirect.service.ts","../../src/region/region.service.ts","../../src/route/route-revalidate.handler.ts","../../src/route/route.service.ts","../../src/session/session.service.ts","../../src/sitemap/sitemap.handler.ts","../../src/sitemap/sitemap.service.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","names":[],"sources":["../../src/address/address.service.ts","../../src/app/app.service.ts","../../src/captions/captions.handler.ts","../../src/category/category.service.ts","../../src/consent_preference/consent_preference.service.ts","../../src/country/country.service.ts","../../src/label/label.service.ts","../../src/layout/layout.service.ts","../../src/lazy/lazy.service.ts","../../src/locale/locale.service.ts","../../src/market/market.service.ts","../../src/menu/menu.service.ts","../../src/page/page.service.ts","../../src/province/province.service.ts","../../src/redirect/redirect.service.ts","../../src/region/region.service.ts","../../src/route/route-revalidate.handler.ts","../../src/route/route.service.ts","../../src/session/session.service.ts","../../src/sitemap/sitemap.handler.ts","../../src/sitemap/sitemap.service.ts"],"sourcesContent":[],"mappings":"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"}
@@ -535,8 +535,7 @@ function getPublicUrl() {
535
535
  const publicUrl = process.env && process.env.NEXT_PUBLIC_URL ? process.env.NEXT_PUBLIC_URL : "";
536
536
  return publicUrl;
537
537
  }
538
- function resolveHref(href) {
539
- href = href || "";
538
+ function resolveHref(href = "") {
540
539
  return href.startsWith("http") ? href : `${getPublicUrl()}${href}`;
541
540
  }
542
541
 
@@ -572,12 +571,21 @@ function routeRevalidateHandler() {
572
571
  const bearer = authorization && authorization.replace("Bearer ", "");
573
572
  if (bearer !== process.env.MIXER_SECRET) return response.status(401).json({ message: "Invalid token" });
574
573
  try {
575
- const { href } = request.body;
576
- const routes = await getRoutes({ where: { id: { equals: href } } });
577
- if (routes.length === 0) return response.status(404).send(`routeRevalidateHandler.notFound ${href}`);
574
+ const { href, schema, page } = request.body || {};
575
+ let where;
576
+ if (href) where = { id: { equals: href } };
577
+ else if (schema && page) where = {
578
+ schema: { equals: schema },
579
+ page: { equals: page }
580
+ };
581
+ else return response.status(400).send("Missing href or schema and page");
582
+ const routes = await getRoutes({ where });
583
+ if (routes.length === 0) {
584
+ const notFoundTarget = href || `${schema}:${page}`;
585
+ return response.status(404).send(`routeRevalidateHandler.notFound ${notFoundTarget}`);
586
+ }
578
587
  for (const route of routes) {
579
588
  const resolvedRoute = resolveRoute(route);
580
- console.log("route.revalidating", resolvedRoute);
581
589
  await response.revalidate(resolvedRoute);
582
590
  }
583
591
  return response.json({ revalidated: true });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","names":["locale?: string","id: IEquatable","params: QueryParams","locale?: string","id: IEquatable","params: QueryParams","locale?: string","id: IEquatable","params: QueryParams","locale: string","params: QueryParams","getCaptionsVttProps: GetServerSideProps","params: QueryParams","id: IEquatable","item: ICategorized","categories: ICategory[]","id: IEquatable","params: QueryParams","params: QueryParams","id: IEquatable","labels: ILabel[]","id: string","params: QueryParams","id: IEquatable","params: QueryParams","id: IEquatable","params: QueryParams","id: IEquatable","params: QueryParams","id: string","schemas: string[]","market?: string","locale?: string","items: {\r\n [key: string]: string;\r\n }","templates: string[]","schema: string","template?: string","x: any","fallback: 'blocking' | true | false","segments: ICategory[]","route: IRoute","routes: IRoute[]","tree: IRouteLink[]","route","market: string","locale: string","categories: ICategory[]","rootCategory: ICategory","category: ICategory","items: IRouteLink[]","market: string","locale: string","markets: IMarket[]","locales: ILocale[]","labels: ILabel[]","routeLink: IRouteLink","menu: Record<string, ILocalizedMenu>","LAZY_PROPS: ILazyStaticProps","key: string","getComponentProps: ILazyStaticPropsFunc<T>","props: PageProps","extraComponents?: IComponent[]","decoratedComponents: ILazyComponent[]","schema: string","id: IEquatable","params?: QueryParams","market?: string","locale?: string","options?: {\r\n depth?: number;\r\n draftMode?: boolean;\r\n preview?: boolean;\r\n previewData?: any;\r\n}","x: IRoute","segments: ICategory[]","breadcrumb: IRouteLink[]","parentRoute: IRouteLink | undefined","market: string","locale: string","routes: IRoute[]","error: any","page?: IPage","page: IPage","props: PartialPageProps<T, B>","extraComponents?: IComponent[]","href?: string | null","locale?: string","id: IEquatable","params: QueryParams","layout: ILayout","key: string","request: NextApiRequest","response: NextApiResponse","request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n }","response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>","sessionOptions: SessionOptions","origin: string","markets: IMarket[]","locales: ILocale[]","routes: IRoute[]","sitemaps: ISiteMap[]","date: Date | string | undefined","markets","locales","canonical: IRouteCanonical","string: string","escape: string","canonicalRoutes: IRouteCanonical[]","marketId?: string","localeId?: string","defaultMarket","defaultLocale","isCanonicalRoute: (route: IRoute) => boolean","getCanonicalAlternates: (canonical: IRoute) => IRoute[]","routeToRouteCanonical: (canonical: IRoute) => IRouteCanonical","getSiteMapIndexProps: GetServerSideProps","getSiteMapXMLProps: GetServerSideProps","getSiteMapXSLProps: GetServerSideProps"],"sources":["../../src/country/country.service.ts","../../src/province/province.service.ts","../../src/region/region.service.ts","../../src/address/address.service.ts","../../src/app/app.service.ts","../../src/captions/captions.handler.ts","../../src/category/category.service.ts","../../src/consent_preference/consent_preference.service.ts","../../src/label/label.service.ts","../../src/locale/locale.service.ts","../../src/market/market.service.ts","../../src/menu/menu.service.ts","../../src/route/route.service.ts","../../src/layout/layout.service.ts","../../src/lazy/lazy.service.ts","../../src/page/page.service.ts","../../src/redirect/redirect.service.ts","../../src/route/route-revalidate.handler.ts","../../src/session/session.service.ts","../../src/sitemap/sitemap.service.ts","../../src/sitemap/sitemap.handler.ts"],"sourcesContent":["import { IEquatable, INamedEntity, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getCountries(locale?: string): Promise<INamedEntity[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.i18n_country!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getCountry(id: IEquatable, params: QueryParams = {}): Promise<INamedEntity | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.i18n_country!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getCountriesPagination(params: QueryParams = {}): Promise<IPaginationResult<INamedEntity>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.i18n_country!.findPaged<INamedEntity>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable, INamedEntity, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getProvinces(locale?: string): Promise<INamedEntity[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.i18n_province!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getProvince(id: IEquatable, params: QueryParams = {}): Promise<INamedEntity | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.i18n_province!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getProvincesPagination(params: QueryParams = {}): Promise<IPaginationResult<INamedEntity>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.i18n_province!.findPaged<INamedEntity>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable, INamedEntity, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getRegions(locale?: string): Promise<INamedEntity[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.i18n_region!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getRegion(id: IEquatable, params: QueryParams = {}): Promise<INamedEntity | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.i18n_region!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRegionsPagination(params: QueryParams = {}): Promise<IPaginationResult<INamedEntity>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.i18n_region!.findPaged<INamedEntity>(params);\r\n return pagination;\r\n}\r\n","import { IOption } from '@websolutespa/bom-core';\r\nimport { getCountries } from '../country/country.service';\r\nimport { getProvinces } from '../province/province.service';\r\nimport { getRegions } from '../region/region.service';\r\nimport { IAddressOptions } from './address';\r\n\r\nexport async function getAddressOptions(locale: string): Promise<IAddressOptions> {\r\n const countries = await getCountries(locale) as IOption[];\r\n const provinces = await getProvinces(locale) as IOption[];\r\n const regions = await getRegions(locale) as IOption[];\r\n return {\r\n countries,\r\n regions,\r\n provinces,\r\n };\r\n}\r\n","import { IApp, IAppExtended, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getApp<T extends IAppExtended = IAppExtended>(params: QueryParams = {}): Promise<IApp<T> | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.app.findGlobal(params);\r\n return item as IApp<T>;\r\n}\r\n","import { GetServerSideProps } from 'next';\r\n// import { ILocale } from '@websolutespa/bom-core';\r\n// import { getLocales } from '@websolutespa/bom-mixer-models/server';\r\n\r\nexport const getCaptionsVttProps: GetServerSideProps = async (context) => {\r\n const { req, res, params, query } = context;\r\n const locale = query?.locale;\r\n const title = query?.title;\r\n /*\r\n let locales: ILocale[] = await getLocales();\r\n locales = locales.filter(x => x.isActive !== false);\r\n const defaultLocale = locales.find(x => locale ? x.id === locale : x.isDefault) || locales[0];\r\n */\r\n const captions = /* html */`WEBVTT\r\n\r\n00:00:01.000 --> 00:00:03.000\r\n- This video has no audio.\r\n\r\n${title ? `\r\n00:00:04.000 --> 00:00:06.000\r\n- The title of the video is \"${title}\".\r\n` : ''}`;\r\n res.setHeader('Content-Type', 'text/plain; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(captions);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n","import { ICategorized, ICategory, IEquatable, QueryParams, getCategorySegments } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getCategories(params: QueryParams = {}): Promise<ICategory[]> {\r\n const store = await getStore<IModelStore>();\r\n const categories = await store.category!.findMany(params);\r\n return categories;\r\n}\r\n\r\nexport async function getCategory(id: IEquatable, params: QueryParams = {}): Promise<ICategory | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.category!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getSegments(item: ICategorized, params: QueryParams = {}): Promise<ICategory[]> {\r\n const categories: ICategory[] = await getCategories(params);\r\n return getCategorySegments(categories, item);\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\nimport { IConsentPreference } from './consent_preference';\r\n\r\nexport async function getConsentPreference(id: IEquatable, params: QueryParams = {}): Promise<IConsentPreference | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.consent_preference!.findOne<IConsentPreference>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getConsentPreferences(params: QueryParams = {}): Promise<IConsentPreference[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.consent_preference!.findMany<IConsentPreference>(params);\r\n return items;\r\n}\r\n\r\nexport async function getConsentPreferencesPagination(params: QueryParams = {}): Promise<IPaginationResult<IConsentPreference>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.consent_preference!.findPaged<IConsentPreference>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable, ILabel, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLabels(params: QueryParams = {}): Promise<ILabel[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.label!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLabel(id: IEquatable, params: QueryParams = {}): Promise<ILabel | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.label!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport function resolveLabel(labels: ILabel[], id: string): string {\r\n const label = labels.find(x => x.id === id);\r\n return label && label.text ? label.text.toString() : id;\r\n}\r\n\r\n/*\r\nexport function localizedLabel(labels: Label[], id: string, locale: string, defaultLocale: string): Promise<Label> {\r\n const label = labels.find(x => x.id === id);\r\n if (label) {\r\n return store.localizeValue(label, locale, defaultLocale);\r\n }\r\n}\r\n*/\r\n","import { IEquatable, ILocale, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLocales(params: QueryParams = {}): Promise<ILocale[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.locale!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLocale(id: IEquatable, params: QueryParams = {}): Promise<ILocale | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.locale!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMarket, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMarkets(params: QueryParams = {}): Promise<IMarket[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.market!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMarket(id: IEquatable, params: QueryParams = {}): Promise<IMarket | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.market!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMenus(params: QueryParams = {}): Promise<IMenu[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.menu!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMenu(id: IEquatable, params: QueryParams = {}): Promise<IMenu | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.menu!.findOne(id, params);\r\n return item;\r\n}\r\n","import { asCategoryId, defaultLocale, defaultMarket, findRouteOfCategory, getRootCategory, ICategory, IRoute, IRouteLink, QueryParams } from '@websolutespa/bom-core';\r\nimport { buildStrategy, BuildStrategy, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\nimport { newRouteLink, routeToRouteLink } from './route';\r\n\r\nexport type StaticPath = { params: { [key: string]: string } };\r\n\r\nexport async function getRoutes(params: QueryParams = {}): Promise<IRoute[]> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany(params);\r\n return routes;\r\n}\r\n\r\nexport async function getRoute(id: string): Promise<IRoute | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const route = await store.route!.findOne(id);\r\n // console.log('RouteService.getRoute', id, '->', route);\r\n return route;\r\n}\r\n\r\nexport async function getRoutesForSchemas(schemas: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n schema: {\r\n in: schemas,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n items[route.schema] = route.id;\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getRoutesForTemplates(templates: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n template: {\r\n in: templates,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n if (route.template) {\r\n items[route.template] = route.id;\r\n }\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getStaticPathsForSchema(\r\n schema: string,\r\n template?: string\r\n): Promise<StaticPath[]> {\r\n if (buildStrategy === BuildStrategy.Runtime) {\r\n return [];\r\n }\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: template ? ({\r\n and: [{\r\n template: {\r\n equals: template,\r\n },\r\n }, {\r\n schema: {\r\n equals: schema,\r\n },\r\n }],\r\n }) : ({\r\n schema: {\r\n equals: schema,\r\n },\r\n }),\r\n });\r\n return routes.map((x: any) => ({ params: { id: x.page.toString(), market: x.market, locale: x.locale } }));\r\n}\r\n\r\nexport async function getStaticPathsForSchemaAndFallback(\r\n schema: string,\r\n fallback: 'blocking' | true | false = 'blocking',\r\n template?: string\r\n) {\r\n if (\r\n buildStrategy === BuildStrategy.Runtime ||\r\n (fallback === 'blocking' && storeStrategy !== StoreStrategy.Mock)\r\n ) {\r\n return { paths: [], fallback };\r\n }\r\n const paths = await getStaticPathsForSchema(schema, template);\r\n return {\r\n paths,\r\n fallback,\r\n // fallback: 'blocking', // runs before initial render\r\n // fallback: true, // runs in the background\r\n };\r\n}\r\n\r\nexport async function getBreadcrumbFromSegments(segments: ICategory[], route: IRoute): Promise<IRouteLink[]> {\r\n const market = route.market || defaultMarket;\r\n const locale = route.locale || defaultLocale;\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const tree: IRouteLink[] = segments.map(segment => {\r\n const route = findRouteOfCategory(routes, segment.id);\r\n return {\r\n segment,\r\n route,\r\n };\r\n }).filter(x => Boolean(x.route)).map(x => {\r\n const category = x.segment;\r\n const route = x.route;\r\n // console.log(route, category);\r\n const routeLink = newRouteLink(category, route, locale);\r\n return routeLink;\r\n });\r\n if (!route.isDefault) {\r\n tree.push(routeToRouteLink(route));\r\n }\r\n // console.log(tree);\r\n return tree;\r\n}\r\n\r\nexport async function getRouteLinkTree(market: string, locale: string): Promise<IRouteLink | undefined> {\r\n const store = await getStore<IModelStore>();\r\n // console.log('getRouteLinkTree.store', store);\r\n const routes = await store.route!.findMany({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n // console.log('getRouteLinkTree.routes', routes.map(x => x.id));\r\n const categories = await store.category!.findMany({ market, locale });\r\n // console.log('getRouteLinkTree.categories', categories.map(x => x.id));\r\n const rootCategory = getRootCategory(categories);\r\n // console.log('getRouteLinkTree.rootCategory', rootCategory?.id);\r\n if (rootCategory) {\r\n const root = getRouteLinkCategory(locale, routes, categories, rootCategory, rootCategory);\r\n // console.log('getRouteLinkTree', root);\r\n return root as IRouteLink;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getRouteLinkCategory(\r\n locale: string,\r\n routes: IRoute[],\r\n categories: ICategory[],\r\n rootCategory: ICategory,\r\n category: ICategory\r\n): IRouteLink | IRouteLink[] | undefined {\r\n const route = findRouteOfCategory(routes, category.id);\r\n const otherCategories = categories.filter(x => x.id !== category.id);\r\n const childCategories = otherCategories.filter(x => asCategoryId(x.category) === category.id);\r\n // console.log('childCategories', category.id, childCategories.map(x => x.id));\r\n const routeLink = newRouteLink(category, route, locale);\r\n // console.log('getRouteLinkCategory', href, category.id, route);\r\n const items: IRouteLink[] = [];\r\n for (const childCategory of childCategories) {\r\n const itemOrItems = getRouteLinkCategory(locale, routes, otherCategories, rootCategory, childCategory);\r\n if (Array.isArray(itemOrItems)) {\r\n items.push(...itemOrItems);\r\n } else if (itemOrItems) {\r\n items.push(itemOrItems);\r\n }\r\n }\r\n if (\r\n !route ||\r\n (category.isHidden && category.id !== rootCategory.id)\r\n ) {\r\n return items;\r\n }\r\n routeLink.items = items;\r\n return routeLink;\r\n}\r\n","import { IApp, IAppExtended, ILabel, ILayout, ILocale, ILocalizedMenu, IMarket, IRouteLink } from '@websolutespa/bom-core';\r\nimport { getApp } from '../app/app.service';\r\nimport { getLabels } from '../label/label.service';\r\nimport { getLocales } from '../locale/locale.service';\r\nimport { getMarkets } from '../market/market.service';\r\nimport { getMenus } from '../menu/menu.service';\r\nimport { getRouteLinkTree } from '../route/route.service';\r\n\r\nexport async function getLayout<T extends IAppExtended = IAppExtended>(market: string, locale: string): Promise<ILayout<T>> {\r\n const markets: IMarket[] = await getMarkets({ locale });\r\n // console.log('markets', markets);\r\n const locales: ILocale[] = await getLocales({ locale });\r\n // console.log('locales', locales);\r\n const labels: ILabel[] = await getLabels({ locale });\r\n // console.log('labels', labels);\r\n const app = (await getApp<T>({ locale }) || {}) as IApp<T>;\r\n const tree = await getRouteLinkTree(market, locale);\r\n // console.log('tree', tree);\r\n const firstLevelRoutes = tree?.items || [];\r\n // console.log('firstLevelRoutes', firstLevelRoutes);\r\n const flatTopLevelRoutes = tree ? [tree, ...firstLevelRoutes] : [];\r\n // console.log('flatTopLevelRoutes', flatTopLevelRoutes);\r\n const topLevelRoutes = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (!object[routeLink.schema] || routeLink.schema === routeLink.category) {\r\n object[routeLink.schema] = routeLink;\r\n }\r\n return object;\r\n }, {} as Record<string, IRouteLink>);\r\n // console.log('topLevelRoutes', topLevelRoutes);\r\n const topLevelHrefs = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (routeLink.href && (!object[routeLink.schema] || routeLink.schema === routeLink.category)) {\r\n object[routeLink.schema] = routeLink.href;\r\n }\r\n return object;\r\n }, {} as Record<string, string>);\r\n // console.log('topLevelHrefs', topLevelHrefs);\r\n const menu: Record<string, ILocalizedMenu> = {};\r\n // console.log('menu', menu);\r\n const menus = await getMenus({ market, locale });\r\n menus.forEach(x => {\r\n menu[x.id] = x as ILocalizedMenu;\r\n });\r\n // console.log('menus', menus);\r\n // console.log('getLayout');\r\n return {\r\n labels,\r\n locale,\r\n locales,\r\n market,\r\n markets,\r\n app,\r\n menu,\r\n topLevelHrefs,\r\n topLevelRoutes,\r\n tree,\r\n };\r\n}\r\n","import { IComponent, PageProps } from '@websolutespa/bom-core';\r\nimport { ILazyComponent, ILazyStaticProps, ILazyStaticPropsFunc } from './lazy';\r\n\r\nexport const LAZY_PROPS: ILazyStaticProps = {};\r\n\r\nexport async function withLazyProps<T>(key: string, getComponentProps: ILazyStaticPropsFunc<T>) {\r\n LAZY_PROPS[key] = getComponentProps;\r\n}\r\n\r\nexport async function getDecoratedComponents(props: PageProps, extraComponents?: IComponent[]) {\r\n const page = props.page;\r\n const components = [\r\n ...(page.components || []),\r\n ...(extraComponents || []),\r\n ];\r\n const decoratedComponents: ILazyComponent[] = [];\r\n for (const component of components) {\r\n const key = (component.blockType || component.schema || 'unkown_type') as keyof typeof LAZY_PROPS;\r\n const getComponentProps = LAZY_PROPS[key];\r\n if (typeof getComponentProps === 'function') {\r\n const decoratedComponent = await getComponentProps({ ...(props as PageProps), component });\r\n decoratedComponents.push(decoratedComponent);\r\n } else {\r\n decoratedComponents.push(component);\r\n }\r\n }\r\n page.components = decoratedComponents;\r\n}\r\n","import { asCategoryId, asServerProps, defaultLocale, defaultMarket, ICategorized, ICategory, IComponent, IEquatable, ILayout, IPage, IRoute, IRouteLink, PageProps, QueryParams, SchemaType } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { Redirect } from 'next';\r\nimport { getSegments } from '../category/category.service';\r\nimport { resolveLabel } from '../label/label.service';\r\nimport { getLayout } from '../layout/layout.service';\r\nimport { getDecoratedComponents } from '../lazy/lazy.service';\r\nimport { getBreadcrumbFromSegments, getRoutes } from '../route/route.service';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function findOnePage<T extends ICategorized = ICategorized>(schema: string, id: IEquatable, params?: QueryParams): Promise<T | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const collection = store[schema];\r\n if (!collection) {\r\n throw `PageService.findOnePage: Collection not found [${schema}]`;\r\n }\r\n const page = await collection.findOne<T>(id, params);\r\n if (page) {\r\n return page;\r\n } else {\r\n console.log('PageService.findOnePage.notfound', schema, params);\r\n return;\r\n }\r\n}\r\n\r\nexport async function findManyPages<T extends ICategorized = ICategorized>(schema: string, params?: QueryParams): Promise<T[]> {\r\n const store = await getStore<IModelStore>();\r\n const collection = store[schema];\r\n if (!collection) {\r\n throw `PageService.findManyPages: Collection not found [${schema}]`;\r\n }\r\n const pages = await collection.findMany<T>(params);\r\n return pages;\r\n}\r\n\r\nexport async function getPage<T extends ICategorized = ICategorized>(schema: string, id: IEquatable, market?: string, locale?: string, options?: {\r\n depth?: number;\r\n draftMode?: boolean;\r\n preview?: boolean;\r\n previewData?: any;\r\n}): Promise<IPage<T> | undefined> {\r\n const { depth = 3, draftMode = false, previewData } = options || {};\r\n const draft = draftMode === true;\r\n // console.log('getPage', { schema, id, market, locale, depth, draft, draftMode });\r\n const page = await findOnePage<T>(schema, id, { market, locale, depth, draft });\r\n // console.log(page, market, locale);\r\n if (page) {\r\n const routes = await getPageRoutes(schema, id);\r\n const currentRoute = routes.find((x: IRoute) => x.market === market && x.locale === locale);\r\n const alternates = routes; // routes.filter((x: IRoute) => x.market !== market || x.locale !== locale);\r\n const segments: ICategory[] = await getSegments(page, { market, locale });\r\n // console.log('getPage.currentRoute', currentRoute?.category);\r\n // console.log('getPage.segments', segments.map(x => x.id));\r\n const breadcrumb: IRouteLink[] =\r\n currentRoute ?\r\n await getBreadcrumbFromSegments(segments, currentRoute) :\r\n [];\r\n // console.log('getPage.breadcrumb', breadcrumb.map(x => x.href));\r\n const parentRoute: IRouteLink | undefined = breadcrumb.length > 1 ? breadcrumb[breadcrumb.length - 2] : undefined;\r\n /*\r\n console.log('segments', segments);\r\n console.log('currentRoute', currentRoute);\r\n console.log('breadcrumb', breadcrumb);\r\n console.log('parentRoute', parentRoute);\r\n */\r\n const pageResult = {\r\n ...page,\r\n href: currentRoute?.id, // !!! route?\r\n alternates,\r\n breadcrumb,\r\n parentRoute,\r\n } as IPage<T>;\r\n return pageResult;\r\n } else {\r\n console.log('PageService.getPage.notfound', schema, id, locale);\r\n return;\r\n }\r\n}\r\n\r\nexport async function getSchemaRoutes(schema: string, market: string, locale: string): Promise<IRoute[]> {\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n schema: {\r\n equals: schema,\r\n },\r\n },\r\n });\r\n return routes;\r\n}\r\n\r\nexport async function getNotFoundRoute(market: string, locale: string): Promise<IRoute | undefined> {\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n schema: {\r\n equals: 'notfound',\r\n },\r\n },\r\n });\r\n if (routes.length > 0) {\r\n return routes[0];\r\n }\r\n return;\r\n}\r\n\r\nexport async function NotFound(market: string, locale: string): Promise<{ redirect: Redirect } | void> {\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n schema: {\r\n equals: 'notfound',\r\n },\r\n },\r\n });\r\n if (routes.length > 0) {\r\n return {\r\n redirect: {\r\n destination: routes[0]!.id,\r\n permanent: false,\r\n },\r\n };\r\n }\r\n return;\r\n}\r\n\r\nexport async function getPageRoutes(schema: string, id: IEquatable): Promise<IRoute[]> {\r\n const store = await getStore<IModelStore>();\r\n let routes: IRoute[] = [];\r\n try {\r\n routes = await store.route!.findMany({\r\n where: {\r\n page: {\r\n equals: id,\r\n },\r\n schema: {\r\n equals: schema,\r\n },\r\n },\r\n });\r\n } catch (error: any) {\r\n console.error('No routes found for page ' + schema + ':' + id);\r\n }\r\n return routes;\r\n}\r\n\r\nexport async function getPageCategory<T extends ICategorized>(schema: string, page?: IPage, market?: string, locale?: string): Promise<T | undefined> {\r\n if (!page) {\r\n return;\r\n }\r\n const store = await getStore<IModelStore>();\r\n const pages = await findManyPages<T>(schema, {\r\n where: {\r\n category: {\r\n equals: asCategoryId(page.category),\r\n },\r\n }, market, locale,\r\n });\r\n const category = pages.length ? pages[0] : null;\r\n // console.log(page, market, locale, category);\r\n if (category) {\r\n const routes = await store.route!.findMany({\r\n where: {\r\n schema: {\r\n equals: schema,\r\n },\r\n page: {\r\n equals: category.id,\r\n },\r\n },\r\n });\r\n const currentRoute = routes.find((x: IRoute) => x.market === market && x.locale === locale);\r\n if (!currentRoute) {\r\n throw ('No route found for page ' + schema + ':' + category.id + ' in market ' + market + ' and locale ' + locale);\r\n }\r\n return {\r\n ...category,\r\n href: currentRoute.id,\r\n } as T;\r\n } else {\r\n console.log('PageService.getPageCategory.notfound', schema, locale);\r\n return;\r\n }\r\n}\r\n\r\nexport async function getErrorPageLayout(): Promise<{ layout: ILayout, page: IPage }> {\r\n const layout = await getLayout(defaultMarket, defaultLocale);\r\n // console.log('getErrorPageLayout', 'layout', layout);\r\n const title = resolveLabel(layout.labels, 'notfound.title');\r\n // console.log('getErrorPageLayout', 'title', title);\r\n const abstract = resolveLabel(layout.labels, 'notfound.abstract');\r\n // console.log('getErrorPageLayout', 'abstract', abstract);\r\n const category = layout.tree ? {\r\n id: layout.tree.category,\r\n title: layout.tree.title,\r\n href: layout.tree.href,\r\n slug: '',\r\n } : {\r\n id: 'homepage',\r\n title: 'Homepage',\r\n slug: '',\r\n href: '/',\r\n };\r\n // console.log('getErrorPageLayout', 'category', category);\r\n const page: IPage = {\r\n abstract,\r\n alternates: [],\r\n breadcrumb: [],\r\n category,\r\n slug: '',\r\n href: '',\r\n id: 'notfound',\r\n locale: layout.locale,\r\n market: layout.market,\r\n markets: [],\r\n meta: {\r\n title,\r\n description: abstract,\r\n keywords: '',\r\n robots: 'all',\r\n },\r\n schema: 'notfound' as SchemaType,\r\n title,\r\n };\r\n // console.log('getErrorPageLayout', 'page', page);\r\n return { layout, page };\r\n}\r\n\r\nexport type PartialPageProps<T extends ICategorized, B> = Omit<PageProps<T>, 'page'> & Partial<Pick<PageProps<T>, 'page'>> & B;\r\n\r\nexport async function getPageProps<T extends ICategorized, B = any>(\r\n props: PartialPageProps<T, B>,\r\n extraComponents?: IComponent[]\r\n) {\r\n if (props.page) {\r\n await getDecoratedComponents(props as PageProps<T> & B, extraComponents);\r\n }\r\n return asServerProps(props) as PageProps<T> & B;\r\n}\r\n\r\nexport function getPublicUrl() {\r\n const publicUrl = process.env && process.env.NEXT_PUBLIC_URL ? process.env.NEXT_PUBLIC_URL : '';\r\n return publicUrl;\r\n}\r\n\r\nexport function resolveHref(href?: string | null) {\r\n href = href || '';\r\n return href.startsWith('http') ? href : `${getPublicUrl()}${href}`;\r\n}\r\n","import { IEquatable, ILayout, IPaginationResult, IRedirect, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getRedirects(locale?: string): Promise<IRedirect[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.redirect!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getRedirect(id: IEquatable, params: QueryParams = {}): Promise<IRedirect | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.redirect!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRedirectsPagination(params: QueryParams = {}): Promise<IPaginationResult<IRedirect>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.redirect!.findPaged<IRedirect>(params);\r\n return pagination;\r\n}\r\n\r\nexport function redirectTo(layout: ILayout, key: string = 'not_found') {\r\n return {\r\n redirect: {\r\n permanent: false,\r\n destination: layout.topLevelHrefs[key] || '/',\r\n },\r\n };\r\n}\r\n","\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { resolveRoute } from './route';\r\nimport { getRoutes } from './route.service';\r\n\r\nexport function routeRevalidateHandler() {\r\n return apiHandler({\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n // console.log(request.headers);\r\n const authorization = request.headers.authorization;\r\n const bearer = authorization && authorization.replace('Bearer ', '');\r\n // Check for secret to confirm this is a valid request\r\n if (bearer !== process.env.MIXER_SECRET) {\r\n return response.status(401).json({ message: 'Invalid token' });\r\n }\r\n try {\r\n /* { \"id\": 1, \"schema\": \"product\", \"href\": \"/product/xxxx\" } */\r\n const { href } = request.body;\r\n const routes = await getRoutes({\r\n where: {\r\n id: { equals: href },\r\n },\r\n });\r\n if (routes.length === 0) {\r\n // console.log('route.notfound', href);\r\n return response.status(404).send(`routeRevalidateHandler.notFound ${href}`);\r\n }\r\n // console.log('routes', routes);\r\n for (const route of routes) {\r\n // console.log('route.found', route);\r\n const resolvedRoute = resolveRoute(route);\r\n console.log('route.revalidating', resolvedRoute);\r\n await response.revalidate(resolvedRoute);\r\n }\r\n return response.json({ revalidated: true });\r\n } catch (error) {\r\n // If there was an error, Next.js will continue\r\n // to show the last successfully generated page\r\n return response.status(500).send('Error revalidating');\r\n }\r\n },\r\n });\r\n}\r\n","import { isDevelopment } from '@websolutespa/bom-core';\r\nimport { IncomingMessage, ServerResponse } from 'http';\r\nimport { getIronSession, IronSession, SessionOptions } from 'iron-session';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { NextRequest, NextResponse } from 'next/server';\r\n\r\nfunction getSessionSecret() {\r\n const secret = process.env.MIXER_SECRET || '';\r\n if (!secret) {\r\n throw 'getSessionSecret MIXER_SECRET not defined';\r\n }\r\n return secret;\r\n}\r\n\r\nexport async function getSession<T extends object = Record<string, any>>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<IronSession<T>> {\r\n const cookieName = 'websolutespa-next-js';\r\n const password = getSessionSecret();\r\n const sessionOptions: SessionOptions = {\r\n cookieName,\r\n password,\r\n // secure: true should be used in production (HTTPS) but can't be used in development (HTTP)\r\n cookieOptions: {\r\n secure: !isDevelopment,\r\n },\r\n };\r\n const session = await getIronSession<T>(request, response, sessionOptions);\r\n return session;\r\n}\r\n\r\nexport type SessionWithToken<T extends object = Record<string, any>> = T & Partial<{\r\n token: string;\r\n exp: number;\r\n}>;\r\n\r\nexport async function getSessionToken<T extends SessionWithToken>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<string | undefined> {\r\n const session = await getSession<T>(request, response);\r\n if (session.token && session.exp && session.exp > Math.floor(new Date().getTime() / 1000)) {\r\n return session.token;\r\n } else {\r\n session.token = undefined;\r\n session.exp = undefined;\r\n await session.save();\r\n session.destroy();\r\n return;\r\n }\r\n}\r\n","import { ILocale, IMarket, IRoute, IRouteCanonical, eachMarketLocale } from '@websolutespa/bom-core';\r\nimport { getLocales } from '../locale/locale.service';\r\nimport { getMarkets } from '../market/market.service';\r\nimport { getRoutes } from '../route/route.service';\r\n\r\nexport type ISiteMap = {\r\n id: string;\r\n updatedAt?: Date;\r\n};\r\n\r\nexport async function getSiteMapIndex(origin: string): Promise<string> {\r\n let markets: IMarket[] = await getMarkets();\r\n let locales: ILocale[] = await getLocales();\r\n markets = markets.filter(x => x.isActive !== false);\r\n locales = locales.filter(x => x.isActive !== false);\r\n const routes: IRoute[] = await getRoutes();\r\n const sitemaps: ISiteMap[] = [];\r\n const getTime = (date: Date | string | undefined) => {\r\n return typeof date !== 'undefined' ? (typeof date === 'string' ? new Date(date) : date).getTime() : 0;\r\n };\r\n eachMarketLocale(markets, locales, (market, locale, markets, locales) => {\r\n const sitemapRoutes = routes.filter(x => x.market === market.id && x.locale === locale.id);\r\n sitemapRoutes.sort((a, b) => getTime(a.updatedAt) - getTime(b.updatedAt));\r\n // console.log(sitemapRoutes.shift(), sitemapRoutes.pop());\r\n sitemaps.push({\r\n id: `/${market.id}/${locale.id}/sitemap.xml`,\r\n updatedAt: sitemapRoutes.length > 0 ? sitemapRoutes[sitemapRoutes.length - 1]!.updatedAt : undefined,\r\n });\r\n });\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><?xml-stylesheet type=\"text/xsl\" href=\"${origin}/sitemap.xsl\"?>\r\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n${sitemaps.map(sitemap => `\r\n <sitemap>\r\n <loc>${escapeHtml(encodeURI(`${origin}${sitemap.id}`))}</loc>${sitemap.updatedAt ? `\r\n <lastmod>${escapeHtml(String(sitemap.updatedAt))}</lastmod>` : ''}\r\n </sitemap>\r\n`).join('')}\r\n</sitemapindex>`;\r\n}\r\n\r\nfunction getSiteMapXMLLastMod(canonical: IRouteCanonical): string {\r\n return canonical.updatedAt ? `\r\n <lastmod>${escapeHtml(String(canonical.updatedAt))}</lastmod>` : '';\r\n}\r\n\r\nfunction getSiteMapXMLImage(canonical: IRouteCanonical): string {\r\n return canonical.media ? `\r\n <image:image>\r\n <image:loc>${escapeHtml(encodeURI(`${canonical.media.src || canonical.media.url}`))}</image:loc>\r\n </image:image>` : '';\r\n}\r\n\r\nfunction getSiteMapXMLAlternates(origin: string, canonical: IRouteCanonical): string {\r\n return canonical.alternates.map(alternate => `\r\n <xhtml:link href=\"${escapeHtml(encodeURI(`${origin}${alternate.id}`))}\" hreflang=\"${alternate.locale}-${alternate.market}\" rel=\"alternate\" />`).join('');\r\n}\r\n\r\nfunction getSiteMapXMLUrl(origin: string, canonical: IRouteCanonical): string {\r\n return `\r\n <url>\r\n <loc>${escapeHtml(encodeURI(`${origin}${canonical.id}`))}</loc>${getSiteMapXMLLastMod(canonical)}${getSiteMapXMLAlternates(origin, canonical)}${getSiteMapXMLImage(canonical)}\r\n </url>`;\r\n}\r\n\r\n/*\r\nCharacter\t Escape Code\r\nAmpersand\t &\t &amp;\r\nSingle Quote\t'\t &apos;\r\nDouble Quote\t\"\t &quot;\r\nGreater Than\t>\t &gt;\r\nLess Than\t <\t &lt;\r\n*/\r\n\r\nexport function escapeHtml(string: string) {\r\n const matchHtmlRegExp = /[\"'&<>]/;\r\n const str = '' + string;\r\n const match = matchHtmlRegExp.exec(str);\r\n if (!match) {\r\n return str;\r\n }\r\n let escape: string;\r\n let html = '';\r\n let index = 0;\r\n let lastIndex = 0;\r\n for (index = match.index; index < str.length; index++) {\r\n switch (str.charCodeAt(index)) {\r\n case 34: // \"\r\n escape = '&quot;';\r\n break;\r\n case 38: // &\r\n escape = '&amp;';\r\n break;\r\n case 39: // '\r\n escape = '&#39;';\r\n break;\r\n case 60: // <\r\n escape = '&lt;';\r\n break;\r\n case 62: // >\r\n escape = '&gt;';\r\n break;\r\n default:\r\n continue;\r\n }\r\n if (lastIndex !== index) {\r\n html += str.substring(lastIndex, index);\r\n }\r\n lastIndex = index + 1;\r\n html += escape;\r\n }\r\n return lastIndex !== index\r\n ? html + str.substring(lastIndex, index)\r\n : html;\r\n}\r\n\r\nfunction getSiteMapXMLUrls(origin: string, canonicalRoutes: IRouteCanonical[]): string {\r\n return canonicalRoutes.map((canonicalRoute) => getSiteMapXMLUrl(origin, canonicalRoute)).join('');\r\n}\r\n\r\nexport async function getSiteMapXML(origin: string, marketId?: string, localeId?: string): Promise<string> {\r\n let markets: IMarket[] = await getMarkets();\r\n let locales: ILocale[] = await getLocales();\r\n markets = markets.filter(x => x.isActive !== false);\r\n locales = locales.filter(x => x.isActive !== false);\r\n const defaultMarket = markets.find(x => marketId ? x.id === marketId : x.isDefault) || markets[0]!;\r\n const defaultLocale = locales.find(x => localeId ? x.id === localeId : x.isDefault) || locales[0]!;\r\n const defaultMarketLocale = defaultMarket && defaultMarket.defaultLanguage ? defaultMarket.defaultLanguage : defaultLocale.id;\r\n const routes: IRoute[] = await getRoutes();\r\n const isCanonicalRoute: (route: IRoute) => boolean = (marketId && localeId) ? (route) => {\r\n return route.noindex !== true && route.market === defaultMarket.id && route.locale === defaultLocale.id;\r\n } : (route) => {\r\n return route.noindex !== true && route.market === defaultMarket.id && route.locale === defaultMarketLocale;\r\n };\r\n const getCanonicalAlternates: (canonical: IRoute) => IRoute[] = (marketId && localeId) ? (canonical) => {\r\n return [];\r\n } : (canonical) => {\r\n return routes.filter(alternate => {\r\n return alternate !== canonical && alternate.schema === canonical.schema && alternate.page === canonical.page;\r\n });\r\n };\r\n const routeToRouteCanonical: (canonical: IRoute) => IRouteCanonical = (canonical) => {\r\n const alternates = getCanonicalAlternates(canonical);\r\n return { ...canonical, alternates };\r\n };\r\n const canonicalRoutes: IRouteCanonical[] = routes.filter(isCanonicalRoute).map(routeToRouteCanonical);\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><?xml-stylesheet type=\"text/xsl\" href=\"${origin}/sitemap.xsl\"?>\r\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\r\n xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"\r\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">\r\n${getSiteMapXMLUrls(origin, canonicalRoutes)}\r\n</urlset>\r\n `;\r\n}\r\n\r\nexport async function getSiteMapXSL(localeId?: string): Promise<string> {\r\n let locales: ILocale[] = await getLocales();\r\n locales = locales.filter(x => x.isActive !== false);\r\n const locale = locales.find(x => localeId ? x.id === localeId : x.isDefault) || locales[0]!;\r\n return /* html */`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\t<xsl:stylesheet version=\"2.0\"\r\n\t\txmlns:html=\"http://www.w3.org/TR/REC-html40\"\r\n\t\txmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\r\n\t\txmlns:sitemap=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\r\n\t\txmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\r\n\t<xsl:output method=\"html\" version=\"1.0\" encoding=\"UTF-8\" indent=\"yes\"/>\r\n\t<xsl:template match=\"/\">\r\n\t\t<html lang=\"${locale.id}\" xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\t\t<head>\r\n\t\t\t<title>XML Sitemap</title>\r\n\t\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t\t\t<style type=\"text/css\">\r\n html {\r\n padding: 0;\r\n background: #09090A;\r\n\t\t\t\t\tcolor: #fefefe;\r\n }\r\n\t\t\t\tbody {\r\n padding: 15px;\r\n\t\t\t\t\tfont-family: Inter,-apple-system,'Helvetica Neue','Segoe UI',Roboto,Arial,'Noto Sans',sans-serif;\r\n\t\t\t\t\tfont-size: 13px;\r\n background: #09090A;\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t}\r\n\t\t\t\t.container {\r\n\t\t\t\t\tmargin: 0 auto;\r\n\t\t\t\t\tmax-width: 1280px;\r\n\t\t\t\t}\r\n\t\t\t\ta {\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t\ttext-decoration: none;\r\n\t\t\t\t}\r\n\t\t\t\ta:visited {\r\n\t\t\t\t\tcolor: #9e9e9e;\r\n\t\t\t\t}\r\n\t\t\t\ta:hover {\r\n\t\t\t\t\ttext-decoration: underline;\r\n\t\t\t\t}\r\n\t\t\t\ttable {\r\n width: 100%;\r\n margin: 10px 0;\r\n\t\t\t\t\tborder: none;\r\n\t\t\t\t\tborder-collapse: collapse;\r\n\t\t\t\t}\r\n\t\t\t\ttd,\r\n th {\r\n\t\t\t\t\ttext-align: left;\r\n\t\t\t\t\tfont-size: 12px;\r\n padding: 3px;\r\n\t\t\t\t}\r\n\t\t\t\tth:not(:last-child),\r\n td:not(:last-child) {\r\n\t\t\t\t\tpadding-right: 30px;\r\n\t\t\t\t}\r\n\t\t\t\tthead th {\r\n\t\t\t\t\tborder-bottom: 1px solid #0e0e0f;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tr:nth-child(odd) td {\r\n\t\t\t\t\tbackground-color: #0e0e0f;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tbody tr:hover td {\r\n\t\t\t\t\tbackground-color: #1A1A1B;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tbody tr:hover td,\r\n #sitemap tbody tr:hover td a {\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg {\r\n margin: 0;\r\n\t\t\t\t\tpadding: 0 0 10px 0;\r\n\t\t\t\t\tline-height: 1.2em;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg a {\r\n\t\t\t\t\tcolor: #00ea4e;\r\n\t\t\t\t\tfont-weight: 600;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg a:visited {\r\n\t\t\t\t\tcolor: #00ea4e;\r\n\t\t\t\t}\r\n\t\t\t</style>\r\n\t\t</head>\r\n\t\t<body>\r\n\t\t<div class=\"container\">\r\n\t\t\t<h1>XML Sitemap</h1>\r\n\t\t\t<p class=\"wysiwyg\">\r\n This is an XML Sitemap meant for consumption by search engines, generated by <a href=\"https://github.com/websolutespa/bom\" target=\"_blank\" rel=\"noopener\">Mixer</a>.\r\n </p>\r\n <p class=\"wysiwyg\">\r\n\t\t\t\tYou can find more information about XML sitemaps on <a href=\"https://sitemaps.org\" target=\"_blank\" rel=\"noopener\">sitemaps.org</a>.\r\n\t\t\t</p>\r\n\t\t\t<xsl:if test=\"count(sitemap:sitemapindex/sitemap:sitemap) &gt; 0\">\r\n\t\t\t\t<p class=\"wysiwyg\">\r\n\t\t\t\t\tThis sitemap index file contains <xsl:value-of select=\"count(sitemap:sitemapindex/sitemap:sitemap)\"/> sitemaps.\r\n\t\t\t\t</p>\r\n\t\t\t\t<table id=\"sitemap\" cellpadding=\"3\">\r\n\t\t\t\t\t<thead>\r\n <tr>\r\n <th width=\"75%\">Sitemap</th>\r\n <th width=\"25%\" title=\"Last Modification Time\">Updated At</th>\r\n </tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t<xsl:for-each select=\"sitemap:sitemapindex/sitemap:sitemap\">\r\n\t\t\t\t\t\t<xsl:variable name=\"sitemapURL\">\r\n\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t</xsl:variable>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<a href=\"{$sitemapURL}\"><xsl:value-of select=\"sitemap:loc\"/></a>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</xsl:for-each>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</xsl:if>\r\n\t\t\t<xsl:if test=\"count(sitemap:sitemapindex/sitemap:sitemap) &lt; 1\">\r\n\t\t\t\t<p class=\"wysiwyg\">\r\n\t\t\t\t\tThis sitemap contains <xsl:value-of select=\"count(sitemap:urlset/sitemap:url)\"/> URLs.\r\n\t\t\t\t</p>\r\n\t\t\t\t<table id=\"sitemap\" cellpadding=\"3\">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<th width=\"75%\">URL</th>\r\n\t\t\t\t\t\t<th width=\"15%\" title=\"Last Modification Time\">Updated At</th>\r\n\t\t\t\t\t\t<th width=\"10%\">Images</th>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t<xsl:variable name=\"lower\" select=\"'abcdefghijklmnopqrstuvwxyz'\"/>\r\n\t\t\t\t\t<xsl:variable name=\"upper\" select=\"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\"/>\r\n\t\t\t\t\t<xsl:for-each select=\"sitemap:urlset/sitemap:url\">\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:variable name=\"itemURL\">\r\n\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t\t\t</xsl:variable>\r\n\t\t\t\t\t\t\t\t<a href=\"{$itemURL}\">\r\n\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"count(image:image)\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</xsl:for-each>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</xsl:if>\r\n\t\t</div>\r\n\t\t</body>\r\n\t\t</html>\r\n\t</xsl:template>\r\n\t</xsl:stylesheet>`;\r\n}\r\n","import { IContextParams, getOrigin } from '@websolutespa/bom-core';\r\nimport { GetServerSideProps } from 'next';\r\nimport { getSiteMapIndex, getSiteMapXML, getSiteMapXSL } from './sitemap.service';\r\n\r\nexport const getSiteMapIndexProps: GetServerSideProps = async (context) => {\r\n const { req, res } = context;\r\n // console.log('getSiteMapIndexProps', req.headers.location, req.headers.host, req.headers.origin, req.headers.protocol);\r\n const sitemap = await getSiteMapIndex(getOrigin(req.headers));\r\n res.setHeader('Content-Type', 'application/xml; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(sitemap);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n\r\nexport const getSiteMapXMLProps: GetServerSideProps = async (context) => {\r\n const { req, res } = context;\r\n // console.log('getSiteMapXMLProps', req.headers.location, req.headers.host, req.headers.origin, req.headers.protocol);\r\n const params = context.params as IContextParams;\r\n const market = params?.market;\r\n const locale = params?.locale;\r\n const sitemap = await getSiteMapXML(getOrigin(req.headers), market, locale);\r\n res.setHeader('Content-Type', 'application/xml; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(sitemap);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n\r\nexport const getSiteMapXSLProps: GetServerSideProps = async (context) => {\r\n const { req, res } = context;\r\n // console.log('getSiteMapXSLProps', req.headers.location, req.headers.host, req.headers.origin, req.headers.protocol);\r\n const params = context.params as IContextParams;\r\n const market = params?.market;\r\n const locale = params?.locale;\r\n const sitemap = await getSiteMapXSL(locale);\r\n res.setHeader('Content-Type', 'application/xml; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(sitemap);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"server.js","names":["locale?: string","id: IEquatable","params: QueryParams","locale?: string","id: IEquatable","params: QueryParams","locale?: string","id: IEquatable","params: QueryParams","locale: string","params: QueryParams","getCaptionsVttProps: GetServerSideProps","params: QueryParams","id: IEquatable","item: ICategorized","categories: ICategory[]","id: IEquatable","params: QueryParams","params: QueryParams","id: IEquatable","labels: ILabel[]","id: string","params: QueryParams","id: IEquatable","params: QueryParams","id: IEquatable","params: QueryParams","id: IEquatable","params: QueryParams","id: string","schemas: string[]","market?: string","locale?: string","items: {\r\n [key: string]: string;\r\n }","templates: string[]","schema: string","template?: string","x: any","fallback: 'blocking' | true | false","segments: ICategory[]","route: IRoute","routes: IRoute[]","tree: IRouteLink[]","route","market: string","locale: string","categories: ICategory[]","rootCategory: ICategory","category: ICategory","items: IRouteLink[]","market: string","locale: string","markets: IMarket[]","locales: ILocale[]","labels: ILabel[]","routeLink: IRouteLink","menu: Record<string, ILocalizedMenu>","LAZY_PROPS: ILazyStaticProps","key: string","getComponentProps: ILazyStaticPropsFunc<T>","props: PageProps","extraComponents?: IComponent[]","decoratedComponents: ILazyComponent[]","schema: string","id: IEquatable","params?: QueryParams","market?: string","locale?: string","options?: {\r\n depth?: number;\r\n draftMode?: boolean;\r\n preview?: boolean;\r\n previewData?: any;\r\n}","x: IRoute","segments: ICategory[]","breadcrumb: IRouteLink[]","parentRoute: IRouteLink | undefined","market: string","locale: string","routes: IRoute[]","error: any","page?: IPage","page: IPage","props: PartialPageProps<T, B>","extraComponents?: IComponent[]","href: string","locale?: string","id: IEquatable","params: QueryParams","layout: ILayout","key: string","request: NextApiRequest","response: NextApiResponse","where: Where","request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n }","response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>","sessionOptions: SessionOptions","origin: string","markets: IMarket[]","locales: ILocale[]","routes: IRoute[]","sitemaps: ISiteMap[]","date: Date | string | undefined","markets","locales","canonical: IRouteCanonical","string: string","escape: string","canonicalRoutes: IRouteCanonical[]","marketId?: string","localeId?: string","defaultMarket","defaultLocale","isCanonicalRoute: (route: IRoute) => boolean","getCanonicalAlternates: (canonical: IRoute) => IRoute[]","routeToRouteCanonical: (canonical: IRoute) => IRouteCanonical","getSiteMapIndexProps: GetServerSideProps","getSiteMapXMLProps: GetServerSideProps","getSiteMapXSLProps: GetServerSideProps"],"sources":["../../src/country/country.service.ts","../../src/province/province.service.ts","../../src/region/region.service.ts","../../src/address/address.service.ts","../../src/app/app.service.ts","../../src/captions/captions.handler.ts","../../src/category/category.service.ts","../../src/consent_preference/consent_preference.service.ts","../../src/label/label.service.ts","../../src/locale/locale.service.ts","../../src/market/market.service.ts","../../src/menu/menu.service.ts","../../src/route/route.service.ts","../../src/layout/layout.service.ts","../../src/lazy/lazy.service.ts","../../src/page/page.service.ts","../../src/redirect/redirect.service.ts","../../src/route/route-revalidate.handler.ts","../../src/session/session.service.ts","../../src/sitemap/sitemap.service.ts","../../src/sitemap/sitemap.handler.ts"],"sourcesContent":["import { IEquatable, INamedEntity, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getCountries(locale?: string): Promise<INamedEntity[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.i18n_country!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getCountry(id: IEquatable, params: QueryParams = {}): Promise<INamedEntity | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.i18n_country!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getCountriesPagination(params: QueryParams = {}): Promise<IPaginationResult<INamedEntity>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.i18n_country!.findPaged<INamedEntity>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable, INamedEntity, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getProvinces(locale?: string): Promise<INamedEntity[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.i18n_province!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getProvince(id: IEquatable, params: QueryParams = {}): Promise<INamedEntity | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.i18n_province!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getProvincesPagination(params: QueryParams = {}): Promise<IPaginationResult<INamedEntity>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.i18n_province!.findPaged<INamedEntity>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable, INamedEntity, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getRegions(locale?: string): Promise<INamedEntity[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.i18n_region!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getRegion(id: IEquatable, params: QueryParams = {}): Promise<INamedEntity | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.i18n_region!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRegionsPagination(params: QueryParams = {}): Promise<IPaginationResult<INamedEntity>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.i18n_region!.findPaged<INamedEntity>(params);\r\n return pagination;\r\n}\r\n","import { IOption } from '@websolutespa/bom-core';\r\nimport { getCountries } from '../country/country.service';\r\nimport { getProvinces } from '../province/province.service';\r\nimport { getRegions } from '../region/region.service';\r\nimport { IAddressOptions } from './address';\r\n\r\nexport async function getAddressOptions(locale: string): Promise<IAddressOptions> {\r\n const countries = await getCountries(locale) as IOption[];\r\n const provinces = await getProvinces(locale) as IOption[];\r\n const regions = await getRegions(locale) as IOption[];\r\n return {\r\n countries,\r\n regions,\r\n provinces,\r\n };\r\n}\r\n","import { IApp, IAppExtended, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getApp<T extends IAppExtended = IAppExtended>(params: QueryParams = {}): Promise<IApp<T> | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.app.findGlobal(params);\r\n return item as IApp<T>;\r\n}\r\n","import { GetServerSideProps } from 'next';\r\n// import { ILocale } from '@websolutespa/bom-core';\r\n// import { getLocales } from '@websolutespa/bom-mixer-models/server';\r\n\r\nexport const getCaptionsVttProps: GetServerSideProps = async (context) => {\r\n const { req, res, params, query } = context;\r\n const locale = query?.locale;\r\n const title = query?.title;\r\n /*\r\n let locales: ILocale[] = await getLocales();\r\n locales = locales.filter(x => x.isActive !== false);\r\n const defaultLocale = locales.find(x => locale ? x.id === locale : x.isDefault) || locales[0];\r\n */\r\n const captions = /* html */`WEBVTT\r\n\r\n00:00:01.000 --> 00:00:03.000\r\n- This video has no audio.\r\n\r\n${title ? `\r\n00:00:04.000 --> 00:00:06.000\r\n- The title of the video is \"${title}\".\r\n` : ''}`;\r\n res.setHeader('Content-Type', 'text/plain; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(captions);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n","import { ICategorized, ICategory, IEquatable, QueryParams, getCategorySegments } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getCategories(params: QueryParams = {}): Promise<ICategory[]> {\r\n const store = await getStore<IModelStore>();\r\n const categories = await store.category!.findMany(params);\r\n return categories;\r\n}\r\n\r\nexport async function getCategory(id: IEquatable, params: QueryParams = {}): Promise<ICategory | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.category!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getSegments(item: ICategorized, params: QueryParams = {}): Promise<ICategory[]> {\r\n const categories: ICategory[] = await getCategories(params);\r\n return getCategorySegments(categories, item);\r\n}\r\n","import { IEquatable, IPaginationResult, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\nimport { IConsentPreference } from './consent_preference';\r\n\r\nexport async function getConsentPreference(id: IEquatable, params: QueryParams = {}): Promise<IConsentPreference | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.consent_preference!.findOne<IConsentPreference>(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getConsentPreferences(params: QueryParams = {}): Promise<IConsentPreference[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.consent_preference!.findMany<IConsentPreference>(params);\r\n return items;\r\n}\r\n\r\nexport async function getConsentPreferencesPagination(params: QueryParams = {}): Promise<IPaginationResult<IConsentPreference>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.consent_preference!.findPaged<IConsentPreference>(params);\r\n return pagination;\r\n}\r\n","import { IEquatable, ILabel, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLabels(params: QueryParams = {}): Promise<ILabel[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.label!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLabel(id: IEquatable, params: QueryParams = {}): Promise<ILabel | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.label!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport function resolveLabel(labels: ILabel[], id: string): string {\r\n const label = labels.find(x => x.id === id);\r\n return label && label.text ? label.text.toString() : id;\r\n}\r\n\r\n/*\r\nexport function localizedLabel(labels: Label[], id: string, locale: string, defaultLocale: string): Promise<Label> {\r\n const label = labels.find(x => x.id === id);\r\n if (label) {\r\n return store.localizeValue(label, locale, defaultLocale);\r\n }\r\n}\r\n*/\r\n","import { IEquatable, ILocale, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getLocales(params: QueryParams = {}): Promise<ILocale[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.locale!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getLocale(id: IEquatable, params: QueryParams = {}): Promise<ILocale | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.locale!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMarket, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMarkets(params: QueryParams = {}): Promise<IMarket[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.market!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMarket(id: IEquatable, params: QueryParams = {}): Promise<IMarket | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.market!.findOne(id, params);\r\n return item;\r\n}\r\n","import { IEquatable, IMenu, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getMenus(params: QueryParams = {}): Promise<IMenu[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.menu!.findMany(params);\r\n return items;\r\n}\r\n\r\nexport async function getMenu(id: IEquatable, params: QueryParams = {}): Promise<IMenu | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.menu!.findOne(id, params);\r\n return item;\r\n}\r\n","import { asCategoryId, defaultLocale, defaultMarket, findRouteOfCategory, getRootCategory, ICategory, IRoute, IRouteLink, QueryParams } from '@websolutespa/bom-core';\r\nimport { buildStrategy, BuildStrategy, StoreStrategy, storeStrategy } from '@websolutespa/bom-mixer-store';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\nimport { newRouteLink, routeToRouteLink } from './route';\r\n\r\nexport type StaticPath = { params: { [key: string]: string } };\r\n\r\nexport async function getRoutes(params: QueryParams = {}): Promise<IRoute[]> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany(params);\r\n return routes;\r\n}\r\n\r\nexport async function getRoute(id: string): Promise<IRoute | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const route = await store.route!.findOne(id);\r\n // console.log('RouteService.getRoute', id, '->', route);\r\n return route;\r\n}\r\n\r\nexport async function getRoutesForSchemas(schemas: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n schema: {\r\n in: schemas,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n items[route.schema] = route.id;\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getRoutesForTemplates(templates: string[], market?: string, locale?: string): Promise<{ [key: string]: string; }> {\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: {\r\n template: {\r\n in: templates,\r\n },\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const items: {\r\n [key: string]: string;\r\n } = {};\r\n routes.forEach(route => {\r\n if (route.template) {\r\n items[route.template] = route.id;\r\n }\r\n });\r\n return items;\r\n}\r\n\r\nexport async function getStaticPathsForSchema(\r\n schema: string,\r\n template?: string\r\n): Promise<StaticPath[]> {\r\n if (buildStrategy === BuildStrategy.Runtime) {\r\n return [];\r\n }\r\n const store = await getStore<IModelStore>();\r\n const routes = await store.route!.findMany({\r\n where: template ? ({\r\n and: [{\r\n template: {\r\n equals: template,\r\n },\r\n }, {\r\n schema: {\r\n equals: schema,\r\n },\r\n }],\r\n }) : ({\r\n schema: {\r\n equals: schema,\r\n },\r\n }),\r\n });\r\n return routes.map((x: any) => ({ params: { id: x.page.toString(), market: x.market, locale: x.locale } }));\r\n}\r\n\r\nexport async function getStaticPathsForSchemaAndFallback(\r\n schema: string,\r\n fallback: 'blocking' | true | false = 'blocking',\r\n template?: string\r\n) {\r\n if (\r\n buildStrategy === BuildStrategy.Runtime ||\r\n (fallback === 'blocking' && storeStrategy !== StoreStrategy.Mock)\r\n ) {\r\n return { paths: [], fallback };\r\n }\r\n const paths = await getStaticPathsForSchema(schema, template);\r\n return {\r\n paths,\r\n fallback,\r\n // fallback: 'blocking', // runs before initial render\r\n // fallback: true, // runs in the background\r\n };\r\n}\r\n\r\nexport async function getBreadcrumbFromSegments(segments: ICategory[], route: IRoute): Promise<IRouteLink[]> {\r\n const market = route.market || defaultMarket;\r\n const locale = route.locale || defaultLocale;\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n const tree: IRouteLink[] = segments.map(segment => {\r\n const route = findRouteOfCategory(routes, segment.id);\r\n return {\r\n segment,\r\n route,\r\n };\r\n }).filter(x => Boolean(x.route)).map(x => {\r\n const category = x.segment;\r\n const route = x.route;\r\n // console.log(route, category);\r\n const routeLink = newRouteLink(category, route, locale);\r\n return routeLink;\r\n });\r\n if (!route.isDefault) {\r\n tree.push(routeToRouteLink(route));\r\n }\r\n // console.log(tree);\r\n return tree;\r\n}\r\n\r\nexport async function getRouteLinkTree(market: string, locale: string): Promise<IRouteLink | undefined> {\r\n const store = await getStore<IModelStore>();\r\n // console.log('getRouteLinkTree.store', store);\r\n const routes = await store.route!.findMany({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n },\r\n });\r\n // console.log('getRouteLinkTree.routes', routes.map(x => x.id));\r\n const categories = await store.category!.findMany({ market, locale });\r\n // console.log('getRouteLinkTree.categories', categories.map(x => x.id));\r\n const rootCategory = getRootCategory(categories);\r\n // console.log('getRouteLinkTree.rootCategory', rootCategory?.id);\r\n if (rootCategory) {\r\n const root = getRouteLinkCategory(locale, routes, categories, rootCategory, rootCategory);\r\n // console.log('getRouteLinkTree', root);\r\n return root as IRouteLink;\r\n }\r\n return undefined;\r\n}\r\n\r\nexport function getRouteLinkCategory(\r\n locale: string,\r\n routes: IRoute[],\r\n categories: ICategory[],\r\n rootCategory: ICategory,\r\n category: ICategory\r\n): IRouteLink | IRouteLink[] | undefined {\r\n const route = findRouteOfCategory(routes, category.id);\r\n const otherCategories = categories.filter(x => x.id !== category.id);\r\n const childCategories = otherCategories.filter(x => asCategoryId(x.category) === category.id);\r\n // console.log('childCategories', category.id, childCategories.map(x => x.id));\r\n const routeLink = newRouteLink(category, route, locale);\r\n // console.log('getRouteLinkCategory', href, category.id, route);\r\n const items: IRouteLink[] = [];\r\n for (const childCategory of childCategories) {\r\n const itemOrItems = getRouteLinkCategory(locale, routes, otherCategories, rootCategory, childCategory);\r\n if (Array.isArray(itemOrItems)) {\r\n items.push(...itemOrItems);\r\n } else if (itemOrItems) {\r\n items.push(itemOrItems);\r\n }\r\n }\r\n if (\r\n !route ||\r\n (category.isHidden && category.id !== rootCategory.id)\r\n ) {\r\n return items;\r\n }\r\n routeLink.items = items;\r\n return routeLink;\r\n}\r\n","import { IApp, IAppExtended, ILabel, ILayout, ILocale, ILocalizedMenu, IMarket, IRouteLink } from '@websolutespa/bom-core';\r\nimport { getApp } from '../app/app.service';\r\nimport { getLabels } from '../label/label.service';\r\nimport { getLocales } from '../locale/locale.service';\r\nimport { getMarkets } from '../market/market.service';\r\nimport { getMenus } from '../menu/menu.service';\r\nimport { getRouteLinkTree } from '../route/route.service';\r\n\r\nexport async function getLayout<T extends IAppExtended = IAppExtended>(market: string, locale: string): Promise<ILayout<T>> {\r\n const markets: IMarket[] = await getMarkets({ locale });\r\n // console.log('markets', markets);\r\n const locales: ILocale[] = await getLocales({ locale });\r\n // console.log('locales', locales);\r\n const labels: ILabel[] = await getLabels({ locale });\r\n // console.log('labels', labels);\r\n const app = (await getApp<T>({ locale }) || {}) as IApp<T>;\r\n const tree = await getRouteLinkTree(market, locale);\r\n // console.log('tree', tree);\r\n const firstLevelRoutes = tree?.items || [];\r\n // console.log('firstLevelRoutes', firstLevelRoutes);\r\n const flatTopLevelRoutes = tree ? [tree, ...firstLevelRoutes] : [];\r\n // console.log('flatTopLevelRoutes', flatTopLevelRoutes);\r\n const topLevelRoutes = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (!object[routeLink.schema] || routeLink.schema === routeLink.category) {\r\n object[routeLink.schema] = routeLink;\r\n }\r\n return object;\r\n }, {} as Record<string, IRouteLink>);\r\n // console.log('topLevelRoutes', topLevelRoutes);\r\n const topLevelHrefs = flatTopLevelRoutes.reduce((object, routeLink: IRouteLink) => {\r\n if (routeLink.href && (!object[routeLink.schema] || routeLink.schema === routeLink.category)) {\r\n object[routeLink.schema] = routeLink.href;\r\n }\r\n return object;\r\n }, {} as Record<string, string>);\r\n // console.log('topLevelHrefs', topLevelHrefs);\r\n const menu: Record<string, ILocalizedMenu> = {};\r\n // console.log('menu', menu);\r\n const menus = await getMenus({ market, locale });\r\n menus.forEach(x => {\r\n menu[x.id] = x as ILocalizedMenu;\r\n });\r\n // console.log('menus', menus);\r\n // console.log('getLayout');\r\n return {\r\n labels,\r\n locale,\r\n locales,\r\n market,\r\n markets,\r\n app,\r\n menu,\r\n topLevelHrefs,\r\n topLevelRoutes,\r\n tree,\r\n };\r\n}\r\n","import { IComponent, PageProps } from '@websolutespa/bom-core';\r\nimport { ILazyComponent, ILazyStaticProps, ILazyStaticPropsFunc } from './lazy';\r\n\r\nexport const LAZY_PROPS: ILazyStaticProps = {};\r\n\r\nexport async function withLazyProps<T>(key: string, getComponentProps: ILazyStaticPropsFunc<T>) {\r\n LAZY_PROPS[key] = getComponentProps;\r\n}\r\n\r\nexport async function getDecoratedComponents(props: PageProps, extraComponents?: IComponent[]) {\r\n const page = props.page;\r\n const components = [\r\n ...(page.components || []),\r\n ...(extraComponents || []),\r\n ];\r\n const decoratedComponents: ILazyComponent[] = [];\r\n for (const component of components) {\r\n const key = (component.blockType || component.schema || 'unkown_type') as keyof typeof LAZY_PROPS;\r\n const getComponentProps = LAZY_PROPS[key];\r\n if (typeof getComponentProps === 'function') {\r\n const decoratedComponent = await getComponentProps({ ...(props as PageProps), component });\r\n decoratedComponents.push(decoratedComponent);\r\n } else {\r\n decoratedComponents.push(component);\r\n }\r\n }\r\n page.components = decoratedComponents;\r\n}\r\n","import { asCategoryId, asServerProps, defaultLocale, defaultMarket, ICategorized, ICategory, IComponent, IEquatable, ILayout, IPage, IRoute, IRouteLink, PageProps, QueryParams, SchemaType } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { Redirect } from 'next';\r\nimport { getSegments } from '../category/category.service';\r\nimport { resolveLabel } from '../label/label.service';\r\nimport { getLayout } from '../layout/layout.service';\r\nimport { getDecoratedComponents } from '../lazy/lazy.service';\r\nimport { getBreadcrumbFromSegments, getRoutes } from '../route/route.service';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function findOnePage<T extends ICategorized = ICategorized>(schema: string, id: IEquatable, params?: QueryParams): Promise<T | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const collection = store[schema];\r\n if (!collection) {\r\n throw `PageService.findOnePage: Collection not found [${schema}]`;\r\n }\r\n const page = await collection.findOne<T>(id, params);\r\n if (page) {\r\n return page;\r\n } else {\r\n console.log('PageService.findOnePage.notfound', schema, params);\r\n return;\r\n }\r\n}\r\n\r\nexport async function findManyPages<T extends ICategorized = ICategorized>(schema: string, params?: QueryParams): Promise<T[]> {\r\n const store = await getStore<IModelStore>();\r\n const collection = store[schema];\r\n if (!collection) {\r\n throw `PageService.findManyPages: Collection not found [${schema}]`;\r\n }\r\n const pages = await collection.findMany<T>(params);\r\n return pages;\r\n}\r\n\r\nexport async function getPage<T extends ICategorized = ICategorized>(schema: string, id: IEquatable, market?: string, locale?: string, options?: {\r\n depth?: number;\r\n draftMode?: boolean;\r\n preview?: boolean;\r\n previewData?: any;\r\n}): Promise<IPage<T> | undefined> {\r\n const { depth = 3, draftMode = false, previewData } = options || {};\r\n const draft = draftMode === true;\r\n // console.log('getPage', { schema, id, market, locale, depth, draft, draftMode });\r\n const page = await findOnePage<T>(schema, id, { market, locale, depth, draft });\r\n // console.log(page, market, locale);\r\n if (page) {\r\n const routes = await getPageRoutes(schema, id);\r\n const currentRoute = routes.find((x: IRoute) => x.market === market && x.locale === locale);\r\n const alternates = routes; // routes.filter((x: IRoute) => x.market !== market || x.locale !== locale);\r\n const segments: ICategory[] = await getSegments(page, { market, locale });\r\n // console.log('getPage.currentRoute', currentRoute?.category);\r\n // console.log('getPage.segments', segments.map(x => x.id));\r\n const breadcrumb: IRouteLink[] =\r\n currentRoute ?\r\n await getBreadcrumbFromSegments(segments, currentRoute) :\r\n [];\r\n // console.log('getPage.breadcrumb', breadcrumb.map(x => x.href));\r\n const parentRoute: IRouteLink | undefined = breadcrumb.length > 1 ? breadcrumb[breadcrumb.length - 2] : undefined;\r\n /*\r\n console.log('segments', segments);\r\n console.log('currentRoute', currentRoute);\r\n console.log('breadcrumb', breadcrumb);\r\n console.log('parentRoute', parentRoute);\r\n */\r\n const pageResult = {\r\n ...page,\r\n href: currentRoute?.id, // !!! route?\r\n alternates,\r\n breadcrumb,\r\n parentRoute,\r\n } as IPage<T>;\r\n return pageResult;\r\n } else {\r\n console.log('PageService.getPage.notfound', schema, id, locale);\r\n return;\r\n }\r\n}\r\n\r\nexport async function getSchemaRoutes(schema: string, market: string, locale: string): Promise<IRoute[]> {\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n schema: {\r\n equals: schema,\r\n },\r\n },\r\n });\r\n return routes;\r\n}\r\n\r\nexport async function getNotFoundRoute(market: string, locale: string): Promise<IRoute | undefined> {\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n schema: {\r\n equals: 'notfound',\r\n },\r\n },\r\n });\r\n if (routes.length > 0) {\r\n return routes[0];\r\n }\r\n return;\r\n}\r\n\r\nexport async function NotFound(market: string, locale: string): Promise<{ redirect: Redirect } | void> {\r\n const routes: IRoute[] = await getRoutes({\r\n where: {\r\n market: {\r\n equals: market,\r\n },\r\n locale: {\r\n equals: locale,\r\n },\r\n schema: {\r\n equals: 'notfound',\r\n },\r\n },\r\n });\r\n if (routes.length > 0) {\r\n return {\r\n redirect: {\r\n destination: routes[0]!.id,\r\n permanent: false,\r\n },\r\n };\r\n }\r\n return;\r\n}\r\n\r\nexport async function getPageRoutes(schema: string, id: IEquatable): Promise<IRoute[]> {\r\n const store = await getStore<IModelStore>();\r\n let routes: IRoute[] = [];\r\n try {\r\n routes = await store.route!.findMany({\r\n where: {\r\n page: {\r\n equals: id,\r\n },\r\n schema: {\r\n equals: schema,\r\n },\r\n },\r\n });\r\n } catch (error: any) {\r\n console.error('No routes found for page ' + schema + ':' + id);\r\n }\r\n return routes;\r\n}\r\n\r\nexport async function getPageCategory<T extends ICategorized>(schema: string, page?: IPage, market?: string, locale?: string): Promise<T | undefined> {\r\n if (!page) {\r\n return;\r\n }\r\n const store = await getStore<IModelStore>();\r\n const pages = await findManyPages<T>(schema, {\r\n where: {\r\n category: {\r\n equals: asCategoryId(page.category),\r\n },\r\n }, market, locale,\r\n });\r\n const category = pages.length ? pages[0] : null;\r\n // console.log(page, market, locale, category);\r\n if (category) {\r\n const routes = await store.route!.findMany({\r\n where: {\r\n schema: {\r\n equals: schema,\r\n },\r\n page: {\r\n equals: category.id,\r\n },\r\n },\r\n });\r\n const currentRoute = routes.find((x: IRoute) => x.market === market && x.locale === locale);\r\n if (!currentRoute) {\r\n throw ('No route found for page ' + schema + ':' + category.id + ' in market ' + market + ' and locale ' + locale);\r\n }\r\n return {\r\n ...category,\r\n href: currentRoute.id,\r\n } as T;\r\n } else {\r\n console.log('PageService.getPageCategory.notfound', schema, locale);\r\n return;\r\n }\r\n}\r\n\r\nexport async function getErrorPageLayout(): Promise<{ layout: ILayout, page: IPage }> {\r\n const layout = await getLayout(defaultMarket, defaultLocale);\r\n // console.log('getErrorPageLayout', 'layout', layout);\r\n const title = resolveLabel(layout.labels, 'notfound.title');\r\n // console.log('getErrorPageLayout', 'title', title);\r\n const abstract = resolveLabel(layout.labels, 'notfound.abstract');\r\n // console.log('getErrorPageLayout', 'abstract', abstract);\r\n const category = layout.tree ? {\r\n id: layout.tree.category,\r\n title: layout.tree.title,\r\n href: layout.tree.href,\r\n slug: '',\r\n } : {\r\n id: 'homepage',\r\n title: 'Homepage',\r\n slug: '',\r\n href: '/',\r\n };\r\n // console.log('getErrorPageLayout', 'category', category);\r\n const page: IPage = {\r\n abstract,\r\n alternates: [],\r\n breadcrumb: [],\r\n category,\r\n slug: '',\r\n href: '',\r\n id: 'notfound',\r\n locale: layout.locale,\r\n market: layout.market,\r\n markets: [],\r\n meta: {\r\n title,\r\n description: abstract,\r\n keywords: '',\r\n robots: 'all',\r\n },\r\n schema: 'notfound' as SchemaType,\r\n title,\r\n };\r\n // console.log('getErrorPageLayout', 'page', page);\r\n return { layout, page };\r\n}\r\n\r\nexport type PartialPageProps<T extends ICategorized, B> = Omit<PageProps<T>, 'page'> & Partial<Pick<PageProps<T>, 'page'>> & B;\r\n\r\nexport async function getPageProps<T extends ICategorized, B = any>(\r\n props: PartialPageProps<T, B>,\r\n extraComponents?: IComponent[]\r\n) {\r\n if (props.page) {\r\n await getDecoratedComponents(props as PageProps<T> & B, extraComponents);\r\n }\r\n return asServerProps(props) as PageProps<T> & B;\r\n}\r\n\r\nexport function getPublicUrl() {\r\n const publicUrl = process.env && process.env.NEXT_PUBLIC_URL ? process.env.NEXT_PUBLIC_URL : '';\r\n return publicUrl;\r\n}\r\n\r\nexport function resolveHref(href: string = '') {\r\n return href.startsWith('http') ? href : `${getPublicUrl()}${href}`;\r\n}\r\n","import { IEquatable, ILayout, IPaginationResult, IRedirect, QueryParams } from '@websolutespa/bom-core';\r\nimport { getStore } from '@websolutespa/bom-mixer-store/server';\r\nimport { IModelStore } from '../store/store';\r\n\r\nexport async function getRedirects(locale?: string): Promise<IRedirect[]> {\r\n const store = await getStore<IModelStore>();\r\n const items = await store.redirect!.findMany({ locale });\r\n return items;\r\n}\r\n\r\nexport async function getRedirect(id: IEquatable, params: QueryParams = {}): Promise<IRedirect | undefined> {\r\n const store = await getStore<IModelStore>();\r\n const item = await store.redirect!.findOne(id, params);\r\n return item;\r\n}\r\n\r\nexport async function getRedirectsPagination(params: QueryParams = {}): Promise<IPaginationResult<IRedirect>> {\r\n const store = await getStore<IModelStore>();\r\n const pagination = await store.redirect!.findPaged<IRedirect>(params);\r\n return pagination;\r\n}\r\n\r\nexport function redirectTo(layout: ILayout, key: string = 'not_found') {\r\n return {\r\n redirect: {\r\n permanent: false,\r\n destination: layout.topLevelHrefs[key] || '/',\r\n },\r\n };\r\n}\r\n","\r\nimport { Where } from '@websolutespa/bom-core';\r\nimport { apiHandler } from '@websolutespa/bom-mixer-store/server';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { resolveRoute } from './route';\r\nimport { getRoutes } from './route.service';\r\n\r\nexport function routeRevalidateHandler() {\r\n return apiHandler({\r\n post: async (request: NextApiRequest, response: NextApiResponse) => {\r\n // console.log(request.headers);\r\n const authorization = request.headers.authorization;\r\n const bearer = authorization && authorization.replace('Bearer ', '');\r\n // Check for secret to confirm this is a valid request\r\n if (bearer !== process.env.MIXER_SECRET) {\r\n return response.status(401).json({ message: 'Invalid token' });\r\n }\r\n try {\r\n /* { \"id\": 1, \"schema\": \"product\", \"href\": \"/product/xxxx\" } */\r\n const { href, schema, page } = request.body || {};\r\n\r\n let where: Where;\r\n if (href) {\r\n where = { id: { equals: href } };\r\n } else if (schema && page) {\r\n where = { schema: { equals: schema }, page: { equals: page } };\r\n } else {\r\n return response.status(400).send('Missing href or schema and page');\r\n }\r\n\r\n const routes = await getRoutes({ where });\r\n if (routes.length === 0) {\r\n // console.log('route.notfound', href);\r\n const notFoundTarget = href || `${schema}:${page}`;\r\n return response.status(404).send(`routeRevalidateHandler.notFound ${notFoundTarget}`);\r\n }\r\n // console.log('routes', routes);\r\n for (const route of routes) {\r\n // console.log('route.found', route);\r\n const resolvedRoute = resolveRoute(route);\r\n // console.log('route.revalidating', resolvedRoute);\r\n await response.revalidate(resolvedRoute);\r\n\r\n // @TODO: CDN cache purge\r\n }\r\n return response.json({ revalidated: true });\r\n } catch (error) {\r\n // If there was an error, Next.js will continue\r\n // to show the last successfully generated page\r\n return response.status(500).send('Error revalidating');\r\n }\r\n },\r\n });\r\n}\r\n","import { isDevelopment } from '@websolutespa/bom-core';\r\nimport { IncomingMessage, ServerResponse } from 'http';\r\nimport { getIronSession, IronSession, SessionOptions } from 'iron-session';\r\nimport { NextApiRequest, NextApiResponse } from 'next';\r\nimport { NextRequest, NextResponse } from 'next/server';\r\n\r\nfunction getSessionSecret() {\r\n const secret = process.env.MIXER_SECRET || '';\r\n if (!secret) {\r\n throw 'getSessionSecret MIXER_SECRET not defined';\r\n }\r\n return secret;\r\n}\r\n\r\nexport async function getSession<T extends object = Record<string, any>>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<IronSession<T>> {\r\n const cookieName = 'websolutespa-next-js';\r\n const password = getSessionSecret();\r\n const sessionOptions: SessionOptions = {\r\n cookieName,\r\n password,\r\n // secure: true should be used in production (HTTPS) but can't be used in development (HTTP)\r\n cookieOptions: {\r\n secure: !isDevelopment,\r\n },\r\n };\r\n const session = await getIronSession<T>(request, response, sessionOptions);\r\n return session;\r\n}\r\n\r\nexport type SessionWithToken<T extends object = Record<string, any>> = T & Partial<{\r\n token: string;\r\n exp: number;\r\n}>;\r\n\r\nexport async function getSessionToken<T extends SessionWithToken>(\r\n request: NextRequest | NextApiRequest | IncomingMessage & {\r\n cookies: Partial<{ [key: string]: string }>;\r\n },\r\n response: NextResponse | NextApiResponse | ServerResponse<IncomingMessage>\r\n): Promise<string | undefined> {\r\n const session = await getSession<T>(request, response);\r\n if (session.token && session.exp && session.exp > Math.floor(new Date().getTime() / 1000)) {\r\n return session.token;\r\n } else {\r\n session.token = undefined;\r\n session.exp = undefined;\r\n await session.save();\r\n session.destroy();\r\n return;\r\n }\r\n}\r\n","import { ILocale, IMarket, IRoute, IRouteCanonical, eachMarketLocale } from '@websolutespa/bom-core';\r\nimport { getLocales } from '../locale/locale.service';\r\nimport { getMarkets } from '../market/market.service';\r\nimport { getRoutes } from '../route/route.service';\r\n\r\nexport type ISiteMap = {\r\n id: string;\r\n updatedAt?: Date;\r\n};\r\n\r\nexport async function getSiteMapIndex(origin: string): Promise<string> {\r\n let markets: IMarket[] = await getMarkets();\r\n let locales: ILocale[] = await getLocales();\r\n markets = markets.filter(x => x.isActive !== false);\r\n locales = locales.filter(x => x.isActive !== false);\r\n const routes: IRoute[] = await getRoutes();\r\n const sitemaps: ISiteMap[] = [];\r\n const getTime = (date: Date | string | undefined) => {\r\n return typeof date !== 'undefined' ? (typeof date === 'string' ? new Date(date) : date).getTime() : 0;\r\n };\r\n eachMarketLocale(markets, locales, (market, locale, markets, locales) => {\r\n const sitemapRoutes = routes.filter(x => x.market === market.id && x.locale === locale.id);\r\n sitemapRoutes.sort((a, b) => getTime(a.updatedAt) - getTime(b.updatedAt));\r\n // console.log(sitemapRoutes.shift(), sitemapRoutes.pop());\r\n sitemaps.push({\r\n id: `/${market.id}/${locale.id}/sitemap.xml`,\r\n updatedAt: sitemapRoutes.length > 0 ? sitemapRoutes[sitemapRoutes.length - 1]!.updatedAt : undefined,\r\n });\r\n });\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><?xml-stylesheet type=\"text/xsl\" href=\"${origin}/sitemap.xsl\"?>\r\n<sitemapindex xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\r\n${sitemaps.map(sitemap => `\r\n <sitemap>\r\n <loc>${escapeHtml(encodeURI(`${origin}${sitemap.id}`))}</loc>${sitemap.updatedAt ? `\r\n <lastmod>${escapeHtml(String(sitemap.updatedAt))}</lastmod>` : ''}\r\n </sitemap>\r\n`).join('')}\r\n</sitemapindex>`;\r\n}\r\n\r\nfunction getSiteMapXMLLastMod(canonical: IRouteCanonical): string {\r\n return canonical.updatedAt ? `\r\n <lastmod>${escapeHtml(String(canonical.updatedAt))}</lastmod>` : '';\r\n}\r\n\r\nfunction getSiteMapXMLImage(canonical: IRouteCanonical): string {\r\n return canonical.media ? `\r\n <image:image>\r\n <image:loc>${escapeHtml(encodeURI(`${canonical.media.src || canonical.media.url}`))}</image:loc>\r\n </image:image>` : '';\r\n}\r\n\r\nfunction getSiteMapXMLAlternates(origin: string, canonical: IRouteCanonical): string {\r\n return canonical.alternates.map(alternate => `\r\n <xhtml:link href=\"${escapeHtml(encodeURI(`${origin}${alternate.id}`))}\" hreflang=\"${alternate.locale}-${alternate.market}\" rel=\"alternate\" />`).join('');\r\n}\r\n\r\nfunction getSiteMapXMLUrl(origin: string, canonical: IRouteCanonical): string {\r\n return `\r\n <url>\r\n <loc>${escapeHtml(encodeURI(`${origin}${canonical.id}`))}</loc>${getSiteMapXMLLastMod(canonical)}${getSiteMapXMLAlternates(origin, canonical)}${getSiteMapXMLImage(canonical)}\r\n </url>`;\r\n}\r\n\r\n/*\r\nCharacter\t Escape Code\r\nAmpersand\t &\t &amp;\r\nSingle Quote\t'\t &apos;\r\nDouble Quote\t\"\t &quot;\r\nGreater Than\t>\t &gt;\r\nLess Than\t <\t &lt;\r\n*/\r\n\r\nexport function escapeHtml(string: string) {\r\n const matchHtmlRegExp = /[\"'&<>]/;\r\n const str = '' + string;\r\n const match = matchHtmlRegExp.exec(str);\r\n if (!match) {\r\n return str;\r\n }\r\n let escape: string;\r\n let html = '';\r\n let index = 0;\r\n let lastIndex = 0;\r\n for (index = match.index; index < str.length; index++) {\r\n switch (str.charCodeAt(index)) {\r\n case 34: // \"\r\n escape = '&quot;';\r\n break;\r\n case 38: // &\r\n escape = '&amp;';\r\n break;\r\n case 39: // '\r\n escape = '&#39;';\r\n break;\r\n case 60: // <\r\n escape = '&lt;';\r\n break;\r\n case 62: // >\r\n escape = '&gt;';\r\n break;\r\n default:\r\n continue;\r\n }\r\n if (lastIndex !== index) {\r\n html += str.substring(lastIndex, index);\r\n }\r\n lastIndex = index + 1;\r\n html += escape;\r\n }\r\n return lastIndex !== index\r\n ? html + str.substring(lastIndex, index)\r\n : html;\r\n}\r\n\r\nfunction getSiteMapXMLUrls(origin: string, canonicalRoutes: IRouteCanonical[]): string {\r\n return canonicalRoutes.map((canonicalRoute) => getSiteMapXMLUrl(origin, canonicalRoute)).join('');\r\n}\r\n\r\nexport async function getSiteMapXML(origin: string, marketId?: string, localeId?: string): Promise<string> {\r\n let markets: IMarket[] = await getMarkets();\r\n let locales: ILocale[] = await getLocales();\r\n markets = markets.filter(x => x.isActive !== false);\r\n locales = locales.filter(x => x.isActive !== false);\r\n const defaultMarket = markets.find(x => marketId ? x.id === marketId : x.isDefault) || markets[0]!;\r\n const defaultLocale = locales.find(x => localeId ? x.id === localeId : x.isDefault) || locales[0]!;\r\n const defaultMarketLocale = defaultMarket && defaultMarket.defaultLanguage ? defaultMarket.defaultLanguage : defaultLocale.id;\r\n const routes: IRoute[] = await getRoutes();\r\n const isCanonicalRoute: (route: IRoute) => boolean = (marketId && localeId) ? (route) => {\r\n return route.noindex !== true && route.market === defaultMarket.id && route.locale === defaultLocale.id;\r\n } : (route) => {\r\n return route.noindex !== true && route.market === defaultMarket.id && route.locale === defaultMarketLocale;\r\n };\r\n const getCanonicalAlternates: (canonical: IRoute) => IRoute[] = (marketId && localeId) ? (canonical) => {\r\n return [];\r\n } : (canonical) => {\r\n return routes.filter(alternate => {\r\n return alternate !== canonical && alternate.schema === canonical.schema && alternate.page === canonical.page;\r\n });\r\n };\r\n const routeToRouteCanonical: (canonical: IRoute) => IRouteCanonical = (canonical) => {\r\n const alternates = getCanonicalAlternates(canonical);\r\n return { ...canonical, alternates };\r\n };\r\n const canonicalRoutes: IRouteCanonical[] = routes.filter(isCanonicalRoute).map(routeToRouteCanonical);\r\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?><?xml-stylesheet type=\"text/xsl\" href=\"${origin}/sitemap.xsl\"?>\r\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\r\n xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"\r\n xmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\">\r\n${getSiteMapXMLUrls(origin, canonicalRoutes)}\r\n</urlset>\r\n `;\r\n}\r\n\r\nexport async function getSiteMapXSL(localeId?: string): Promise<string> {\r\n let locales: ILocale[] = await getLocales();\r\n locales = locales.filter(x => x.isActive !== false);\r\n const locale = locales.find(x => localeId ? x.id === localeId : x.isDefault) || locales[0]!;\r\n return /* html */`<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n\t<xsl:stylesheet version=\"2.0\"\r\n\t\txmlns:html=\"http://www.w3.org/TR/REC-html40\"\r\n\t\txmlns:image=\"http://www.google.com/schemas/sitemap-image/1.1\"\r\n\t\txmlns:sitemap=\"http://www.sitemaps.org/schemas/sitemap/0.9\"\r\n\t\txmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\r\n\t<xsl:output method=\"html\" version=\"1.0\" encoding=\"UTF-8\" indent=\"yes\"/>\r\n\t<xsl:template match=\"/\">\r\n\t\t<html lang=\"${locale.id}\" xmlns=\"http://www.w3.org/1999/xhtml\">\r\n\t\t<head>\r\n\t\t\t<title>XML Sitemap</title>\r\n\t\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\r\n\t\t\t<style type=\"text/css\">\r\n html {\r\n padding: 0;\r\n background: #09090A;\r\n\t\t\t\t\tcolor: #fefefe;\r\n }\r\n\t\t\t\tbody {\r\n padding: 15px;\r\n\t\t\t\t\tfont-family: Inter,-apple-system,'Helvetica Neue','Segoe UI',Roboto,Arial,'Noto Sans',sans-serif;\r\n\t\t\t\t\tfont-size: 13px;\r\n background: #09090A;\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t}\r\n\t\t\t\t.container {\r\n\t\t\t\t\tmargin: 0 auto;\r\n\t\t\t\t\tmax-width: 1280px;\r\n\t\t\t\t}\r\n\t\t\t\ta {\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t\ttext-decoration: none;\r\n\t\t\t\t}\r\n\t\t\t\ta:visited {\r\n\t\t\t\t\tcolor: #9e9e9e;\r\n\t\t\t\t}\r\n\t\t\t\ta:hover {\r\n\t\t\t\t\ttext-decoration: underline;\r\n\t\t\t\t}\r\n\t\t\t\ttable {\r\n width: 100%;\r\n margin: 10px 0;\r\n\t\t\t\t\tborder: none;\r\n\t\t\t\t\tborder-collapse: collapse;\r\n\t\t\t\t}\r\n\t\t\t\ttd,\r\n th {\r\n\t\t\t\t\ttext-align: left;\r\n\t\t\t\t\tfont-size: 12px;\r\n padding: 3px;\r\n\t\t\t\t}\r\n\t\t\t\tth:not(:last-child),\r\n td:not(:last-child) {\r\n\t\t\t\t\tpadding-right: 30px;\r\n\t\t\t\t}\r\n\t\t\t\tthead th {\r\n\t\t\t\t\tborder-bottom: 1px solid #0e0e0f;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tr:nth-child(odd) td {\r\n\t\t\t\t\tbackground-color: #0e0e0f;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tbody tr:hover td {\r\n\t\t\t\t\tbackground-color: #1A1A1B;\r\n\t\t\t\t}\r\n\t\t\t\t#sitemap tbody tr:hover td,\r\n #sitemap tbody tr:hover td a {\r\n\t\t\t\t\tcolor: #fefefe;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg {\r\n margin: 0;\r\n\t\t\t\t\tpadding: 0 0 10px 0;\r\n\t\t\t\t\tline-height: 1.2em;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg a {\r\n\t\t\t\t\tcolor: #00ea4e;\r\n\t\t\t\t\tfont-weight: 600;\r\n\t\t\t\t}\r\n\t\t\t\t.wysiwyg a:visited {\r\n\t\t\t\t\tcolor: #00ea4e;\r\n\t\t\t\t}\r\n\t\t\t</style>\r\n\t\t</head>\r\n\t\t<body>\r\n\t\t<div class=\"container\">\r\n\t\t\t<h1>XML Sitemap</h1>\r\n\t\t\t<p class=\"wysiwyg\">\r\n This is an XML Sitemap meant for consumption by search engines, generated by <a href=\"https://github.com/websolutespa/bom\" target=\"_blank\" rel=\"noopener\">Mixer</a>.\r\n </p>\r\n <p class=\"wysiwyg\">\r\n\t\t\t\tYou can find more information about XML sitemaps on <a href=\"https://sitemaps.org\" target=\"_blank\" rel=\"noopener\">sitemaps.org</a>.\r\n\t\t\t</p>\r\n\t\t\t<xsl:if test=\"count(sitemap:sitemapindex/sitemap:sitemap) &gt; 0\">\r\n\t\t\t\t<p class=\"wysiwyg\">\r\n\t\t\t\t\tThis sitemap index file contains <xsl:value-of select=\"count(sitemap:sitemapindex/sitemap:sitemap)\"/> sitemaps.\r\n\t\t\t\t</p>\r\n\t\t\t\t<table id=\"sitemap\" cellpadding=\"3\">\r\n\t\t\t\t\t<thead>\r\n <tr>\r\n <th width=\"75%\">Sitemap</th>\r\n <th width=\"25%\" title=\"Last Modification Time\">Updated At</th>\r\n </tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t<xsl:for-each select=\"sitemap:sitemapindex/sitemap:sitemap\">\r\n\t\t\t\t\t\t<xsl:variable name=\"sitemapURL\">\r\n\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t</xsl:variable>\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<a href=\"{$sitemapURL}\"><xsl:value-of select=\"sitemap:loc\"/></a>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</xsl:for-each>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</xsl:if>\r\n\t\t\t<xsl:if test=\"count(sitemap:sitemapindex/sitemap:sitemap) &lt; 1\">\r\n\t\t\t\t<p class=\"wysiwyg\">\r\n\t\t\t\t\tThis sitemap contains <xsl:value-of select=\"count(sitemap:urlset/sitemap:url)\"/> URLs.\r\n\t\t\t\t</p>\r\n\t\t\t\t<table id=\"sitemap\" cellpadding=\"3\">\r\n\t\t\t\t\t<thead>\r\n\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t<th width=\"75%\">URL</th>\r\n\t\t\t\t\t\t<th width=\"15%\" title=\"Last Modification Time\">Updated At</th>\r\n\t\t\t\t\t\t<th width=\"10%\">Images</th>\r\n\t\t\t\t\t</tr>\r\n\t\t\t\t\t</thead>\r\n\t\t\t\t\t<tbody>\r\n\t\t\t\t\t<xsl:variable name=\"lower\" select=\"'abcdefghijklmnopqrstuvwxyz'\"/>\r\n\t\t\t\t\t<xsl:variable name=\"upper\" select=\"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'\"/>\r\n\t\t\t\t\t<xsl:for-each select=\"sitemap:urlset/sitemap:url\">\r\n\t\t\t\t\t\t<tr>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:variable name=\"itemURL\">\r\n\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t\t\t</xsl:variable>\r\n\t\t\t\t\t\t\t\t<a href=\"{$itemURL}\">\r\n\t\t\t\t\t\t\t\t\t<xsl:value-of select=\"sitemap:loc\"/>\r\n\t\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"concat(substring(sitemap:lastmod,0,11),concat(' ', substring(sitemap:lastmod,12,5)),concat(' ', substring(sitemap:lastmod,20,6)))\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t\t<td>\r\n\t\t\t\t\t\t\t\t<xsl:value-of select=\"count(image:image)\"/>\r\n\t\t\t\t\t\t\t</td>\r\n\t\t\t\t\t\t</tr>\r\n\t\t\t\t\t</xsl:for-each>\r\n\t\t\t\t\t</tbody>\r\n\t\t\t\t</table>\r\n\t\t\t</xsl:if>\r\n\t\t</div>\r\n\t\t</body>\r\n\t\t</html>\r\n\t</xsl:template>\r\n\t</xsl:stylesheet>`;\r\n}\r\n","import { IContextParams, getOrigin } from '@websolutespa/bom-core';\r\nimport { GetServerSideProps } from 'next';\r\nimport { getSiteMapIndex, getSiteMapXML, getSiteMapXSL } from './sitemap.service';\r\n\r\nexport const getSiteMapIndexProps: GetServerSideProps = async (context) => {\r\n const { req, res } = context;\r\n // console.log('getSiteMapIndexProps', req.headers.location, req.headers.host, req.headers.origin, req.headers.protocol);\r\n const sitemap = await getSiteMapIndex(getOrigin(req.headers));\r\n res.setHeader('Content-Type', 'application/xml; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(sitemap);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n\r\nexport const getSiteMapXMLProps: GetServerSideProps = async (context) => {\r\n const { req, res } = context;\r\n // console.log('getSiteMapXMLProps', req.headers.location, req.headers.host, req.headers.origin, req.headers.protocol);\r\n const params = context.params as IContextParams;\r\n const market = params?.market;\r\n const locale = params?.locale;\r\n const sitemap = await getSiteMapXML(getOrigin(req.headers), market, locale);\r\n res.setHeader('Content-Type', 'application/xml; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(sitemap);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n\r\nexport const getSiteMapXSLProps: GetServerSideProps = async (context) => {\r\n const { req, res } = context;\r\n // console.log('getSiteMapXSLProps', req.headers.location, req.headers.host, req.headers.origin, req.headers.protocol);\r\n const params = context.params as IContextParams;\r\n const market = params?.market;\r\n const locale = params?.locale;\r\n const sitemap = await getSiteMapXSL(locale);\r\n res.setHeader('Content-Type', 'application/xml; charset=UTF-8');\r\n res.setHeader('X-Frame-Options', 'SAMEORIGIN');\r\n res.setHeader('X-Robots-Tag', 'noindex, follow');\r\n res.write(sitemap);\r\n res.end();\r\n return {\r\n props: {},\r\n };\r\n};\r\n"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -24,7 +24,7 @@ type IApplication = IAppProps<IApplicationProps>;
24
24
 
25
25
  //#endregion
26
26
  //#region src/gtm/gtm.service.d.ts
27
- [6, () => Record, sideEffect()];
27
+ [9, () => Record, sideEffect()];
28
28
  declare function pushDataLayer(record: Record<string, any>): void;
29
29
  //# sourceMappingURL=gtm.service.d.ts.map
30
30
  //#endregion