@websolutespa/bom-next 3.0.2 → 4.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +37 -7
- package/README.md +28 -0
- package/dist/_virtual/{_rolldown/runtime.js → rolldown_runtime.js} +7 -4
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +17 -6
- package/dist/client/client.js.map +1 -1
- package/dist/client/extra.d.ts +3 -3
- package/dist/client/extra.d.ts.map +1 -1
- package/dist/client/extra.js +10 -5
- package/dist/client/extra.js.map +1 -1
- package/dist/client/label.d.ts +3 -3
- package/dist/client/label.d.ts.map +1 -1
- package/dist/client/label.js +10 -5
- package/dist/client/label.js.map +1 -1
- package/dist/client/layout.d.ts +3 -3
- package/dist/client/layout.d.ts.map +1 -1
- package/dist/client/layout.js +10 -5
- package/dist/client/layout.js.map +1 -1
- package/dist/client/local.collection.d.ts.map +1 -1
- package/dist/client/local.collection.js +4 -2
- package/dist/client/local.collection.js.map +1 -1
- package/dist/client/metadata.d.ts +3 -3
- package/dist/client/metadata.d.ts.map +1 -1
- package/dist/client/metadata.js +48 -40
- package/dist/client/metadata.js.map +1 -1
- package/dist/client/page.d.ts +3 -3
- package/dist/client/page.d.ts.map +1 -1
- package/dist/client/page.js +10 -5
- package/dist/client/page.js.map +1 -1
- package/dist/client/useApi.d.ts +7 -7
- package/dist/client/useApi.d.ts.map +1 -1
- package/dist/client/useApi.js +2 -1
- package/dist/client/useApi.js.map +1 -1
- package/dist/client/useCollectionApi.d.ts +6 -6
- package/dist/client/useCollectionApi.d.ts.map +1 -1
- package/dist/client/useCollectionApi.js +4 -2
- package/dist/client/useCollectionApi.js.map +1 -1
- package/dist/client/useExtra.d.ts.map +1 -1
- package/dist/client/useExtra.js +5 -2
- package/dist/client/useExtra.js.map +1 -1
- package/dist/client/useHttp.d.ts.map +1 -1
- package/dist/client/useHttp.js +9 -6
- package/dist/client/useHttp.js.map +1 -1
- package/dist/client/useLabel.d.ts.map +1 -1
- package/dist/client/useLabel.js +5 -2
- package/dist/client/useLabel.js.map +1 -1
- package/dist/client/useLayout.d.ts.map +1 -1
- package/dist/client/useLayout.js +5 -2
- package/dist/client/useLayout.js.map +1 -1
- package/dist/client/useLink.d.ts.map +1 -1
- package/dist/client/useLink.js +7 -3
- package/dist/client/useLink.js.map +1 -1
- package/dist/client/useMetaData.d.ts.map +1 -1
- package/dist/client/useMetaData.js +5 -2
- package/dist/client/useMetaData.js.map +1 -1
- package/dist/client/usePage.d.ts.map +1 -1
- package/dist/client/usePage.js +5 -2
- package/dist/client/usePage.js.map +1 -1
- package/dist/client/useUser.d.ts.map +1 -1
- package/dist/client/useUser.js +5 -2
- package/dist/client/useUser.js.map +1 -1
- package/dist/client/user.d.ts.map +1 -1
- package/dist/client/user.js +17 -11
- package/dist/client/user.js.map +1 -1
- package/dist/exports/client.js +2 -1
- package/dist/exports/instrumentation.js +2 -1
- package/dist/exports/proxy.js +2 -1
- package/dist/exports/server.d.ts +5 -4
- package/dist/exports/server.js +7 -5
- package/dist/index.d.ts +3 -3
- package/dist/index.js +3 -2
- package/dist/instrumentation/client.d.ts.map +1 -1
- package/dist/instrumentation/client.js +2 -1
- package/dist/instrumentation/client.js.map +1 -1
- package/dist/instrumentation/sentry/capture.requestError.js +4 -1
- package/dist/instrumentation/sentry/capture.requestError.js.map +1 -1
- package/dist/instrumentation/sentry/capture.routerTransitionStart.js +2 -1
- package/dist/instrumentation/sentry/capture.routerTransitionStart.js.map +1 -1
- package/dist/instrumentation/sentry/config.client.js +10 -2
- package/dist/instrumentation/sentry/config.client.js.map +1 -0
- package/dist/instrumentation/sentry/config.edge.js +10 -2
- package/dist/instrumentation/sentry/config.edge.js.map +1 -0
- package/dist/instrumentation/sentry/config.server.js +10 -2
- package/dist/instrumentation/sentry/config.server.js.map +1 -0
- package/dist/instrumentation/server.d.ts.map +1 -1
- package/dist/instrumentation/server.js +8 -5
- package/dist/instrumentation/server.js.map +1 -1
- package/dist/instrumentation/types.d.ts.map +1 -1
- package/dist/lib/breadcrumb.d.ts.map +1 -1
- package/dist/lib/breadcrumb.js +6 -1
- package/dist/lib/breadcrumb.js.map +1 -1
- package/dist/lib/const.d.ts +14 -2
- package/dist/lib/const.d.ts.map +1 -1
- package/dist/lib/const.js +24 -2
- package/dist/lib/const.js.map +1 -1
- package/dist/lib/http.d.ts +9 -0
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js +27 -4
- package/dist/lib/http.js.map +1 -1
- package/dist/lib/label.d.ts.map +1 -1
- package/dist/lib/label.js +4 -3
- package/dist/lib/label.js.map +1 -1
- package/dist/lib/layout.defaults.d.ts.map +1 -1
- package/dist/lib/layout.defaults.js +1 -1
- package/dist/lib/layout.defaults.js.map +1 -1
- package/dist/lib/link.d.ts.map +1 -1
- package/dist/lib/link.js +2 -1
- package/dist/lib/link.js.map +1 -1
- package/dist/lib/meta-data.d.ts.map +1 -1
- package/dist/lib/open-graph.d.ts.map +1 -1
- package/dist/lib/pagination.d.ts.map +1 -1
- package/dist/lib/pagination.js +4 -2
- package/dist/lib/pagination.js.map +1 -1
- package/dist/lib/route.d.ts.map +1 -1
- package/dist/lib/route.js +9 -3
- package/dist/lib/route.js.map +1 -1
- package/dist/lib/store.d.ts.map +1 -1
- package/dist/lib/store.js +31 -31
- package/dist/lib/store.js.map +1 -1
- package/dist/lib/structured-data.d.ts.map +1 -1
- package/dist/lib/twitter-card.d.ts.map +1 -1
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +3 -2
- package/dist/lib/utils.js.map +1 -1
- package/dist/mock.d.ts.map +1 -1
- package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js +3 -2
- package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js.map +1 -1
- package/dist/node_modules/deepmerge/dist/cjs.js +17 -9
- package/dist/node_modules/deepmerge/dist/cjs.js.map +1 -1
- package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js +2 -2
- package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js.map +1 -1
- package/dist/node_modules/dom-serializer/lib/esm/index.js +10 -15
- package/dist/node_modules/dom-serializer/lib/esm/index.js.map +1 -1
- package/dist/node_modules/domelementtype/lib/esm/index.js +12 -12
- package/dist/node_modules/domelementtype/lib/esm/index.js.map +1 -1
- package/dist/node_modules/domhandler/lib/esm/index.js +4 -3
- package/dist/node_modules/domhandler/lib/esm/index.js.map +1 -1
- package/dist/node_modules/domhandler/lib/esm/node.js +8 -7
- package/dist/node_modules/domhandler/lib/esm/node.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/decode.js +33 -32
- package/dist/node_modules/entities/lib/esm/decode.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/decode_codepoint.js +5 -5
- package/dist/node_modules/entities/lib/esm/decode_codepoint.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/escape.js +14 -6
- package/dist/node_modules/entities/lib/esm/escape.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js +2 -2
- package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js.map +1 -1
- package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js +2 -2
- package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js.map +1 -1
- package/dist/node_modules/html-to-text/lib/html-to-text.js +45 -33
- package/dist/node_modules/html-to-text/lib/html-to-text.js.map +1 -1
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js +25 -25
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js.map +1 -1
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js +76 -73
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js.map +1 -1
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js +4 -3
- package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js.map +1 -1
- package/dist/node_modules/leac/lib/leac.js +72 -72
- package/dist/node_modules/leac/lib/leac.js.map +1 -1
- package/dist/node_modules/parseley/lib/parseley.js +37 -33
- package/dist/node_modules/parseley/lib/parseley.js.map +1 -1
- package/dist/node_modules/peberminta/lib/core.js +4 -4
- package/dist/node_modules/peberminta/lib/core.js.map +1 -1
- package/dist/node_modules/selderee/lib/selderee.js +16 -10
- package/dist/node_modules/selderee/lib/selderee.js.map +1 -1
- package/dist/proxy/protected-route.d.ts.map +1 -1
- package/dist/proxy/protected-route.js +11 -6
- package/dist/proxy/protected-route.js.map +1 -1
- package/dist/proxy/proxy.d.ts +5 -4
- package/dist/proxy/proxy.d.ts.map +1 -1
- package/dist/proxy/proxy.js +26 -6
- package/dist/proxy/proxy.js.map +1 -1
- package/dist/proxy/route-auto-detection.d.ts.map +1 -1
- package/dist/proxy/route-auto-detection.js +26 -14
- package/dist/proxy/route-auto-detection.js.map +1 -1
- package/dist/proxy/route-proxy.d.ts.map +1 -1
- package/dist/proxy/route-proxy.js +22 -5
- package/dist/proxy/route-proxy.js.map +1 -1
- package/dist/server/context.d.ts +31 -15
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +156 -69
- package/dist/server/context.js.map +1 -1
- package/dist/server/handlers/auth.handler.d.ts.map +1 -1
- package/dist/server/handlers/auth.handler.js +4 -2
- package/dist/server/handlers/auth.handler.js.map +1 -1
- package/dist/server/handlers/captions.handler.d.ts.map +1 -1
- package/dist/server/handlers/captions.handler.js +4 -2
- package/dist/server/handlers/captions.handler.js.map +1 -1
- package/dist/server/handlers/collection.handler.d.ts.map +1 -1
- package/dist/server/handlers/collection.handler.js +2 -1
- package/dist/server/handlers/collection.handler.js.map +1 -1
- package/dist/server/handlers/error-response.js +6 -2
- package/dist/server/handlers/error-response.js.map +1 -1
- package/dist/server/handlers/index.handler.d.ts.map +1 -1
- package/dist/server/handlers/index.handler.js +2 -1
- package/dist/server/handlers/index.handler.js.map +1 -1
- package/dist/server/handlers/preview.handler.d.ts.map +1 -1
- package/dist/server/handlers/preview.handler.js +6 -3
- package/dist/server/handlers/preview.handler.js.map +1 -1
- package/dist/server/handlers/registry.handler.d.ts.map +1 -1
- package/dist/server/handlers/registry.handler.js +14 -9
- package/dist/server/handlers/registry.handler.js.map +1 -1
- package/dist/server/handlers/route.handler.d.ts.map +1 -1
- package/dist/server/handlers/route.handler.js +12 -3
- package/dist/server/handlers/route.handler.js.map +1 -1
- package/dist/server/handlers/sitemap.handler.d.ts.map +1 -1
- package/dist/server/handlers/sitemap.handler.js +12 -9
- package/dist/server/handlers/sitemap.handler.js.map +1 -1
- package/dist/server/handlers/static-params.handler.d.ts.map +1 -1
- package/dist/server/handlers/static-params.handler.js +13 -8
- package/dist/server/handlers/static-params.handler.js.map +1 -1
- package/dist/server/handlers/vars.handler.d.ts.map +1 -1
- package/dist/server/handlers/vars.handler.js +5 -4
- package/dist/server/handlers/vars.handler.js.map +1 -1
- package/dist/server/helpers.d.ts +50 -0
- package/dist/server/helpers.d.ts.map +1 -0
- package/dist/server/helpers.js +60 -0
- package/dist/server/helpers.js.map +1 -0
- package/dist/server/layout.js +69 -34
- package/dist/server/layout.js.map +1 -1
- package/dist/server/lazy.d.ts +1 -0
- package/dist/server/lazy.d.ts.map +1 -1
- package/dist/server/lazy.js +3 -2
- package/dist/server/lazy.js.map +1 -1
- package/dist/server/local-api.d.ts.map +1 -1
- package/dist/server/local-api.js +12 -6
- package/dist/server/local-api.js.map +1 -1
- package/dist/server/metadata.d.ts +8 -5
- package/dist/server/metadata.d.ts.map +1 -1
- package/dist/server/metadata.js +21 -7
- package/dist/server/metadata.js.map +1 -1
- package/dist/server/mixer-payload.d.ts +1 -1
- package/dist/server/mixer-payload.d.ts.map +1 -1
- package/dist/server/mixer.d.ts +48 -6
- package/dist/server/mixer.d.ts.map +1 -1
- package/dist/server/mixer.js +235 -68
- package/dist/server/mixer.js.map +1 -1
- package/dist/server/page.d.ts +21 -5
- package/dist/server/page.d.ts.map +1 -1
- package/dist/server/page.js +74 -15
- package/dist/server/page.js.map +1 -1
- package/dist/server/utils.d.ts.map +1 -1
- package/dist/server/utils.js +4 -2
- package/dist/server/utils.js.map +1 -1
- package/dist/server/utmz.d.ts.map +1 -1
- package/dist/server/utmz.js +1 -1
- package/dist/server/utmz.js.map +1 -1
- package/dist/types.d.ts +79 -8
- package/dist/types.d.ts.map +1 -1
- package/package.json +16 -15
- package/src/exports/server.ts +1 -0
- package/src/lib/const.ts +15 -0
- package/src/lib/http.ts +15 -4
- package/src/proxy/proxy.ts +11 -4
- package/src/server/context.test.ts +467 -0
- package/src/server/context.ts +237 -78
- package/src/server/context.type-test.ts +106 -0
- package/src/server/helpers.ts +58 -0
- package/src/server/layout.ts +45 -39
- package/src/server/lazy.ts +1 -1
- package/src/server/metadata.ts +15 -7
- package/src/server/mixer.ts +57 -9
- package/src/server/page.ts +62 -17
- package/src/types.ts +109 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sitemap.handler.js","names":[],"sources":["../../../src/server/handlers/sitemap.handler.ts"],"sourcesContent":["import { IRoute, IRouteCanonical, defaultLocale, defaultMarket, eachMarketLocale } from '@websolutespa/bom-core';\r\nimport { NextRequest } from 'next/server';\r\nimport { SanitizedConfig } from 'payload';\r\nimport { getPayload } from '../mixer';\r\nimport { getHandlerErrorResponse } from './error-response';\r\n\r\nconst origin = process.env.NEXT_PUBLIC_URL || '';\r\n\r\nexport type ISiteMap = {\r\n id: string;\r\n updatedAt?: string | Date;\r\n};\r\n\r\nexport function getSiteMapIndex(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest) {\r\n try {\r\n const { getContext } = await getPayload({ config });\r\n const { markets, locales, routes } = await getContext(defaultMarket, defaultLocale);\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 const body = `<?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 return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapIndex.error', response.status, error);\r\n return response;\r\n }\r\n };\r\n}\r\n\r\nexport function getSiteMapXML(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest, {\r\n params: getParams,\r\n }: {\r\n params: Promise<{ market?: string; locale?: string; }>;\r\n }) {\r\n try {\r\n const params = await getParams;\r\n const market = params?.market || defaultMarket;\r\n const locale = params?.locale || defaultLocale;\r\n const { getContext } = await getPayload({ config });\r\n const { markets, locales, routes } = await getContext(market, locale);\r\n const selectedMarket = markets.find(x => market ? x.id === market : x.isDefault) || markets[0]!;\r\n const selectedLocale = locales.find(x => locale ? x.id === locale : x.isDefault) || locales[0]!;\r\n const selectedMarketLocale = selectedMarket && selectedMarket.defaultLanguage ? selectedMarket.defaultLanguage : selectedLocale.id;\r\n const isCanonicalRoute: (route: IRoute) => boolean = (market && locale) ? (route) => {\r\n return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedLocale.id;\r\n } : (route) => {\r\n return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedMarketLocale;\r\n };\r\n const getCanonicalAlternates: (canonical: IRoute) => IRoute[] = (market && locale) ? (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 const body = `<?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 return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapXml.error', response.status, error);\r\n return response;\r\n }\r\n };\r\n}\r\n\r\nexport function getSiteMapXSL(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest, {\r\n params: getParams,\r\n }: {\r\n params: Promise<{ market?: string; locale?: string; }>;\r\n }) {\r\n try {\r\n const params = await getParams;\r\n const locale = params?.locale || defaultLocale;\r\n const body = /* 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}\" 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) > 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) < 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 return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapXsl.error', response.status, error);\r\n return response;\r\n }\r\n };\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\n Character\t Escape Code\r\n Ampersand\t &\t &\r\n Single Quote\t'\t '\r\n Double Quote\t\"\t "\r\n Greater Than\t>\t >\r\n Less Than\t <\t <\r\n */\r\n\r\nfunction 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 = '"';\r\n break;\r\n case 38: // &\r\n escape = '&';\r\n break;\r\n case 39: // '\r\n escape = ''';\r\n break;\r\n case 60: // <\r\n escape = '<';\r\n break;\r\n case 62: // >\r\n escape = '>';\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sitemap.handler.js","names":["config: Promise<SanitizedConfig>","request: NextRequest","sitemaps: ISiteMap[]","date: Date | string | undefined","markets","locales","error: unknown","isCanonicalRoute: (route: IRoute) => boolean","getCanonicalAlternates: (canonical: IRoute) => IRoute[]","routeToRouteCanonical: (canonical: IRoute) => IRouteCanonical","canonicalRoutes: IRouteCanonical[]","canonical: IRouteCanonical","origin: string","origin","string: string","escape: string"],"sources":["../../../src/server/handlers/sitemap.handler.ts"],"sourcesContent":["import { IRoute, IRouteCanonical, defaultLocale, defaultMarket, eachMarketLocale } from '@websolutespa/bom-core';\r\nimport { NextRequest } from 'next/server';\r\nimport { SanitizedConfig } from 'payload';\r\nimport { getPayload } from '../mixer';\r\nimport { getHandlerErrorResponse } from './error-response';\r\n\r\nconst origin = process.env.NEXT_PUBLIC_URL || '';\r\n\r\nexport type ISiteMap = {\r\n id: string;\r\n updatedAt?: string | Date;\r\n};\r\n\r\nexport function getSiteMapIndex(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest) {\r\n try {\r\n const { getContext } = await getPayload({ config });\r\n const { markets, locales, routes } = await getContext(defaultMarket, defaultLocale);\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 const body = `<?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 return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapIndex.error', response.status, error);\r\n return response;\r\n }\r\n };\r\n}\r\n\r\nexport function getSiteMapXML(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest, {\r\n params: getParams,\r\n }: {\r\n params: Promise<{ market?: string; locale?: string; }>;\r\n }) {\r\n try {\r\n const params = await getParams;\r\n const market = params?.market || defaultMarket;\r\n const locale = params?.locale || defaultLocale;\r\n const { getContext } = await getPayload({ config });\r\n const { markets, locales, routes } = await getContext(market, locale);\r\n const selectedMarket = markets.find(x => market ? x.id === market : x.isDefault) || markets[0]!;\r\n const selectedLocale = locales.find(x => locale ? x.id === locale : x.isDefault) || locales[0]!;\r\n const selectedMarketLocale = selectedMarket && selectedMarket.defaultLanguage ? selectedMarket.defaultLanguage : selectedLocale.id;\r\n const isCanonicalRoute: (route: IRoute) => boolean = (market && locale) ? (route) => {\r\n return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedLocale.id;\r\n } : (route) => {\r\n return route.noindex !== true && route.market === selectedMarket.id && route.locale === selectedMarketLocale;\r\n };\r\n const getCanonicalAlternates: (canonical: IRoute) => IRoute[] = (market && locale) ? (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 const body = `<?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 return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapXml.error', response.status, error);\r\n return response;\r\n }\r\n };\r\n}\r\n\r\nexport function getSiteMapXSL(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest, {\r\n params: getParams,\r\n }: {\r\n params: Promise<{ market?: string; locale?: string; }>;\r\n }) {\r\n try {\r\n const params = await getParams;\r\n const locale = params?.locale || defaultLocale;\r\n const body = /* 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}\" 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) > 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) < 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 return new Response(body, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'application/xml; charset=UTF-8',\r\n 'X-Frame-Options': 'SAMEORIGIN',\r\n 'X-Robots-Tag': 'noindex, follow',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n const response = getHandlerErrorResponse(error);\r\n console.error('storeHandler.sitemapXsl.error', response.status, error);\r\n return response;\r\n }\r\n };\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\n Character\t Escape Code\r\n Ampersand\t &\t &\r\n Single Quote\t'\t '\r\n Double Quote\t\"\t "\r\n Greater Than\t>\t >\r\n Less Than\t <\t <\r\n */\r\n\r\nfunction 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 = '"';\r\n break;\r\n case 38: // &\r\n escape = '&';\r\n break;\r\n case 39: // '\r\n escape = ''';\r\n break;\r\n case 60: // <\r\n escape = '<';\r\n break;\r\n case 62: // >\r\n escape = '>';\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"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-params.handler.d.ts","names":[],"sources":["../../../src/server/handlers/static-params.handler.ts"],"mappings":";;;;;;;AAWA;AAA+B,iBAAf,eAAe,CAAA,cAAe,cAAf,CAAA,CAAA,IAAA,EAAqC,KAArC,EAAA,MAAA,EAAoD,OAApD,CAA4D,eAA5D,CAAA,CAAA,EAAA,GAAA,GACiB,OADjB,CACyB,UADzB,EAAA,CAAA;AAAe,iBAqB9B,gBAAA,CArB8B,MAAA,EAAA,MAAA,CAAA,EAAA,GAAA,GAsBE,OAtBF,CAAA;
|
|
1
|
+
{"version":3,"file":"static-params.handler.d.ts","names":[],"sources":["../../../src/server/handlers/static-params.handler.ts"],"sourcesContent":[],"mappings":";;;;;;;AAWA;AAA+B,iBAAf,eAAe,CAAA,cAAe,cAAf,CAAA,CAAA,IAAA,EAAqC,KAArC,EAAA,MAAA,EAAoD,OAApD,CAA4D,eAA5D,CAAA,CAAA,EAAA,GAAA,GACiB,OADjB,CACyB,UADzB,EAAA,CAAA;AAAe,iBAqB9B,gBAAA,CArB8B,MAAA,EAAA,MAAA,CAAA,EAAA,GAAA,GAsBE,OAtBF,CAAA;EAAc,MAAQ,EAAA,MAAA;EAAK,MAAkB,EAAA,MAAA;EAAe,EAAA,EAAvB,MAAA;CAAO,EAAA,CAAA;AAC1C,iBAuDhC,0BAAA,CAvDgC,MAAA,EAAA,MAAA,EAAA,MAAA,EAuDmB,OAvDnB,CAuD2B,eAvD3B,CAAA,CAAA,EAAA,GAAA,GAwDA,OAxDA,CAAA;EAAO,MAAA,EAAA,MAAA;EAoBvC,MAAA,EAAA,MAAA;EAmCA,EAAA,EAAA,MAAA;CAA0B,EAAA,CAAA"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { guest } from "../../lib/const.js";
|
|
2
2
|
import { localApiGet } from "../../lib/http.js";
|
|
3
|
-
import { buildStrategy } from "../../lib/store.js";
|
|
3
|
+
import { BuildStrategy, buildStrategy } from "../../lib/store.js";
|
|
4
4
|
import { getPayload, getPayloadInstance, getRoutes } from "../mixer.js";
|
|
5
5
|
import { isDevelopment, qsSerialize } from "@websolutespa/bom-core";
|
|
6
|
+
|
|
6
7
|
//#region src/server/handlers/static-params.handler.ts
|
|
7
8
|
/**
|
|
9
|
+
|
|
8
10
|
* Returns a generateStaticParams function for a given page collection slug.
|
|
11
|
+
|
|
9
12
|
*/
|
|
10
13
|
function getStaticParams(slug, config) {
|
|
11
14
|
return async function generateStaticParams() {
|
|
12
|
-
if (isDevelopment || buildStrategy ===
|
|
15
|
+
if (isDevelopment || buildStrategy === BuildStrategy.Runtime) return [];
|
|
13
16
|
const { getContext } = await getPayload({ config });
|
|
14
17
|
const { routes } = await getContext("all", "all");
|
|
15
18
|
return routes.filter((r) => r.schema === slug).map((route) => ({
|
|
@@ -21,12 +24,13 @@ function getStaticParams(slug, config) {
|
|
|
21
24
|
}
|
|
22
25
|
function getStaticParams_(schema) {
|
|
23
26
|
return async function generateStaticParams() {
|
|
24
|
-
if (isDevelopment || buildStrategy ===
|
|
27
|
+
if (isDevelopment || buildStrategy === BuildStrategy.Runtime) return [];
|
|
25
28
|
const query = qsSerialize({ where: { or: [{
|
|
26
29
|
schema: { equals: schema },
|
|
27
30
|
template: { equals: schema }
|
|
28
31
|
}] } });
|
|
29
|
-
|
|
32
|
+
const routes = await localApiGet(`/-route?${query}`);
|
|
33
|
+
return routes.map((route) => ({
|
|
30
34
|
market: route.market,
|
|
31
35
|
locale: route.locale,
|
|
32
36
|
id: String(route.page)
|
|
@@ -35,22 +39,23 @@ function getStaticParams_(schema) {
|
|
|
35
39
|
}
|
|
36
40
|
function getStaticParamsFromPayload(schema, config) {
|
|
37
41
|
return async function generateStaticParams() {
|
|
38
|
-
if (isDevelopment || buildStrategy ===
|
|
42
|
+
if (isDevelopment || buildStrategy === BuildStrategy.Runtime) return [];
|
|
39
43
|
const payload = await getPayloadInstance({ config });
|
|
40
|
-
|
|
44
|
+
const routes = await getRoutes({
|
|
41
45
|
payload,
|
|
42
46
|
market: "all",
|
|
43
47
|
locale: "all",
|
|
44
48
|
user: guest,
|
|
45
49
|
draft: false
|
|
46
|
-
})
|
|
50
|
+
});
|
|
51
|
+
return routes.filter((route) => route.schema === schema || route.template === schema).map((route) => ({
|
|
47
52
|
market: route.market,
|
|
48
53
|
locale: route.locale,
|
|
49
54
|
id: String(route.page)
|
|
50
55
|
}));
|
|
51
56
|
};
|
|
52
57
|
}
|
|
58
|
+
|
|
53
59
|
//#endregion
|
|
54
60
|
export { getStaticParams, getStaticParamsFromPayload, getStaticParams_ };
|
|
55
|
-
|
|
56
61
|
//# sourceMappingURL=static-params.handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-params.handler.js","names":[],"sources":["../../../src/server/handlers/static-params.handler.ts"],"sourcesContent":["import { isDevelopment, qsSerialize, type IRoute } from '@websolutespa/bom-core';\r\nimport type { CollectionSlug, SanitizedConfig } from 'payload';\r\nimport { guest } from '../../lib/const';\r\nimport { localApiGet } from '../../lib/http';\r\nimport { BuildStrategy, buildStrategy } from '../../lib/store';\r\nimport { PageParams } from '../../types';\r\nimport { getPayload, getPayloadInstance, getRoutes } from '../mixer';\r\n\r\n/**\r\n * Returns a generateStaticParams function for a given page collection slug.\r\n */\r\nexport function getStaticParams<TSlug extends CollectionSlug>(slug: TSlug, config: Promise<SanitizedConfig>) {\r\n return async function generateStaticParams(): Promise<PageParams[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n const { getContext } = await getPayload({ config });\r\n const { routes } = await getContext('all', 'all');\r\n return (routes)\r\n .filter(r => r.schema === slug)\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n// unused\r\nexport function getStaticParams_(schema: string) {\r\n return async function generateStaticParams(): Promise<{\r\n market: string;\r\n locale: string;\r\n id: string;\r\n }[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n const query = qsSerialize({\r\n where: {\r\n or: [{\r\n schema: {\r\n equals: schema,\r\n },\r\n template: {\r\n equals: schema,\r\n },\r\n }],\r\n },\r\n });\r\n const routes: IRoute[] = await localApiGet(`/-route?${query}`);\r\n return (routes)\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n// unused\r\nexport function getStaticParamsFromPayload(schema: string, config: Promise<SanitizedConfig>) {\r\n return async function generateStaticParams(): Promise<{\r\n market: string;\r\n locale: string;\r\n id: string;\r\n }[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n\r\n const payload = await getPayloadInstance({ config });\r\n const routes = await getRoutes({\r\n payload,\r\n market: 'all',\r\n locale: 'all',\r\n user: guest,\r\n draft: false,\r\n });\r\n\r\n return routes\r\n .filter(route => (\r\n route.schema === schema ||\r\n route.template === schema\r\n ))\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n/*\r\nGood to know:\r\nYou can use the dynamicParams segment config option to control what happens when a dynamic segment is visited that was not generated with generateStaticParams.\r\nYou must return an empty array from generateStaticParams or utilize export const dynamic = 'force-static' in order to revalidate (ISR) paths at runtime.\r\nDuring next dev, generateStaticParams will be called when you navigate to a route.\r\nDuring next build, generateStaticParams runs before the corresponding Layouts or Pages are generated.\r\nDuring revalidation (ISR), generateStaticParams will not be called again.\r\ngenerateStaticParams replaces the getStaticPaths function in the Pages Router.\r\n*/\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"static-params.handler.js","names":["slug: TSlug","config: Promise<SanitizedConfig>","schema: string","routes: IRoute[]"],"sources":["../../../src/server/handlers/static-params.handler.ts"],"sourcesContent":["import { isDevelopment, qsSerialize, type IRoute } from '@websolutespa/bom-core';\r\nimport type { CollectionSlug, SanitizedConfig } from 'payload';\r\nimport { guest } from '../../lib/const';\r\nimport { localApiGet } from '../../lib/http';\r\nimport { BuildStrategy, buildStrategy } from '../../lib/store';\r\nimport { PageParams } from '../../types';\r\nimport { getPayload, getPayloadInstance, getRoutes } from '../mixer';\r\n\r\n/**\r\n * Returns a generateStaticParams function for a given page collection slug.\r\n */\r\nexport function getStaticParams<TSlug extends CollectionSlug>(slug: TSlug, config: Promise<SanitizedConfig>) {\r\n return async function generateStaticParams(): Promise<PageParams[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n const { getContext } = await getPayload({ config });\r\n const { routes } = await getContext('all', 'all');\r\n return (routes)\r\n .filter(r => r.schema === slug)\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n// unused\r\nexport function getStaticParams_(schema: string) {\r\n return async function generateStaticParams(): Promise<{\r\n market: string;\r\n locale: string;\r\n id: string;\r\n }[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n const query = qsSerialize({\r\n where: {\r\n or: [{\r\n schema: {\r\n equals: schema,\r\n },\r\n template: {\r\n equals: schema,\r\n },\r\n }],\r\n },\r\n });\r\n const routes: IRoute[] = await localApiGet(`/-route?${query}`);\r\n return (routes)\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n// unused\r\nexport function getStaticParamsFromPayload(schema: string, config: Promise<SanitizedConfig>) {\r\n return async function generateStaticParams(): Promise<{\r\n market: string;\r\n locale: string;\r\n id: string;\r\n }[]> {\r\n if (\r\n isDevelopment ||\r\n buildStrategy === BuildStrategy.Runtime\r\n ) {\r\n return [];\r\n }\r\n\r\n const payload = await getPayloadInstance({ config });\r\n const routes = await getRoutes({\r\n payload,\r\n market: 'all',\r\n locale: 'all',\r\n user: guest,\r\n draft: false,\r\n });\r\n\r\n return routes\r\n .filter(route => (\r\n route.schema === schema ||\r\n route.template === schema\r\n ))\r\n .map(route => ({\r\n market: route.market,\r\n locale: route.locale,\r\n id: String(route.page),\r\n }));\r\n };\r\n}\r\n\r\n/*\r\nGood to know:\r\nYou can use the dynamicParams segment config option to control what happens when a dynamic segment is visited that was not generated with generateStaticParams.\r\nYou must return an empty array from generateStaticParams or utilize export const dynamic = 'force-static' in order to revalidate (ISR) paths at runtime.\r\nDuring next dev, generateStaticParams will be called when you navigate to a route.\r\nDuring next build, generateStaticParams runs before the corresponding Layouts or Pages are generated.\r\nDuring revalidation (ISR), generateStaticParams will not be called again.\r\ngenerateStaticParams replaces the getStaticPaths function in the Pages Router.\r\n*/\r\n"],"mappings":";;;;;;;;;;;;AAWA,SAAgB,gBAA8CA,MAAaC,QAAkC;AAC3G,QAAO,eAAe,uBAA8C;AAClE,MACE,iBACA,kBAAkB,cAAc,QAEhC,QAAO,CAAE;EAEX,MAAM,EAAE,YAAY,GAAG,MAAM,WAAW,EAAE,OAAQ,EAAC;EACnD,MAAM,EAAE,QAAQ,GAAG,MAAM,WAAW,OAAO,MAAM;AACjD,SAAQ,OACL,OAAO,OAAK,EAAE,WAAW,KAAK,CAC9B,IAAI,YAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,KAAK;EACvB,GAAE;CACN;AACF;AAGD,SAAgB,iBAAiBC,QAAgB;AAC/C,QAAO,eAAe,uBAIjB;AACH,MACE,iBACA,kBAAkB,cAAc,QAEhC,QAAO,CAAE;EAEX,MAAM,QAAQ,YAAY,EACxB,OAAO,EACL,IAAI,CAAC;GACH,QAAQ,EACN,QAAQ,OACT;GACD,UAAU,EACR,QAAQ,OACT;EACF,CAAC,EACH,EACF,EAAC;EACF,MAAMC,SAAmB,MAAM,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC;AAC9D,SAAQ,OACL,IAAI,YAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,KAAK;EACvB,GAAE;CACN;AACF;AAGD,SAAgB,2BAA2BD,QAAgBD,QAAkC;AAC3F,QAAO,eAAe,uBAIjB;AACH,MACE,iBACA,kBAAkB,cAAc,QAEhC,QAAO,CAAE;EAGX,MAAM,UAAU,MAAM,mBAAmB,EAAE,OAAQ,EAAC;EACpD,MAAM,SAAS,MAAM,UAAU;GAC7B;GACA,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,OAAO;EACR,EAAC;AAEF,SAAO,OACJ,OAAO,WACN,MAAM,WAAW,UACjB,MAAM,aAAa,OACnB,CACD,IAAI,YAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,KAAK;EACvB,GAAE;CACN;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vars.handler.d.ts","names":[],"sources":["../../../src/server/handlers/vars.handler.ts"],"mappings":";;;;iBA0BgB,cAAA,SAAuB,QAAQ,6BACb,gBAAW,QAAA"}
|
|
1
|
+
{"version":3,"file":"vars.handler.d.ts","names":[],"sources":["../../../src/server/handlers/vars.handler.ts"],"sourcesContent":[],"mappings":";;;;iBA0BgB,cAAA,SAAuB,QAAQ,6BACb,gBAAW,QAAA"}
|
|
@@ -3,6 +3,7 @@ import { getLayout } from "../layout.js";
|
|
|
3
3
|
import { getHandlerErrorResponse } from "./error-response.js";
|
|
4
4
|
import { getHost, getOrigin, isDevelopment, isProduction } from "@websolutespa/bom-core";
|
|
5
5
|
import { headers } from "next/headers";
|
|
6
|
+
|
|
6
7
|
//#region src/server/handlers/vars.handler.ts
|
|
7
8
|
const DISALLOWED_KEYS = ["__NEXT_PRIVATE_STANDALONE_CONFIG"];
|
|
8
9
|
const getFilteredEnv = (env) => {
|
|
@@ -19,7 +20,7 @@ function getVarsHandler(config) {
|
|
|
19
20
|
return async function(request) {
|
|
20
21
|
try {
|
|
21
22
|
const searchParams = request.nextUrl.searchParams;
|
|
22
|
-
const { market, locale, defaultMarket, defaultLocale, params } = getSearchParams(request);
|
|
23
|
+
const { market, locale, defaultMarket: defaultMarket$1, defaultLocale: defaultLocale$1, params } = getSearchParams(request);
|
|
23
24
|
const headers$1 = await headers();
|
|
24
25
|
const { payload, user, getContext } = await getPayload({
|
|
25
26
|
config,
|
|
@@ -29,8 +30,8 @@ function getVarsHandler(config) {
|
|
|
29
30
|
status: 401,
|
|
30
31
|
message: "Unauthorized"
|
|
31
32
|
};
|
|
32
|
-
const context = await getContext(market || defaultMarket, locale || defaultLocale);
|
|
33
|
-
const layout = await getLayout(market || defaultMarket, locale || defaultLocale, payload, user, context);
|
|
33
|
+
const context = await getContext(market || defaultMarket$1, locale || defaultLocale$1);
|
|
34
|
+
const layout = await getLayout(market || defaultMarket$1, locale || defaultLocale$1, payload, user, context);
|
|
34
35
|
const info = {
|
|
35
36
|
production: isProduction,
|
|
36
37
|
development: isDevelopment,
|
|
@@ -153,7 +154,7 @@ function getVarsHandler(config) {
|
|
|
153
154
|
}
|
|
154
155
|
};
|
|
155
156
|
}
|
|
157
|
+
|
|
156
158
|
//#endregion
|
|
157
159
|
export { getVarsHandler };
|
|
158
|
-
|
|
159
160
|
//# sourceMappingURL=vars.handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vars.handler.js","names":["headers","getHeaders"],"sources":["../../../src/server/handlers/vars.handler.ts"],"sourcesContent":["import { getHost, getOrigin, isDevelopment, isProduction } from '@websolutespa/bom-core';\r\nimport { headers as getHeaders } from 'next/headers';\r\nimport { NextRequest } from 'next/server';\r\nimport { SanitizedConfig } from 'payload';\r\nimport { getLayout } from '../layout';\r\nimport { getPayload, getSearchParams } from '../mixer';\r\nimport { getHandlerErrorResponse } from './error-response';\r\n\r\nconst DISALLOWED_KEYS = [\r\n '__NEXT_PRIVATE_STANDALONE_CONFIG',\r\n];\r\n\r\nconst getFilteredEnv = (env: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(env).filter(([k, v]) => (\r\n !DISALLOWED_KEYS.includes(k) && typeof v === 'string'\r\n ));\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nconst sortKeys = (object?: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(object || {});\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nexport function getVarsHandler(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest) {\r\n try {\r\n const searchParams = request.nextUrl.searchParams;\r\n // console.log('getVarsHandler', searchParams);\r\n const { market, locale, defaultMarket, defaultLocale, params } = getSearchParams(request);\r\n const headers = await getHeaders();\r\n const { payload, user, getContext } = await getPayload({ config, headers });\r\n if (!(user?.roles || []).includes('admin')) {\r\n throw { status: 401, message: 'Unauthorized' };\r\n }\r\n const context = await getContext(market || defaultMarket, locale || defaultLocale);\r\n const layout = await getLayout(market || defaultMarket, locale || defaultLocale, payload, user, context);\r\n const info = {\r\n production: isProduction,\r\n development: isDevelopment,\r\n origin: getOrigin(headers),\r\n host: getHost(headers),\r\n params: {},\r\n searchParams: { ...sortKeys(Object.fromEntries(searchParams)) },\r\n headers: { ...sortKeys(Object.fromEntries(headers)) },\r\n env: { ...getFilteredEnv(process.env) },\r\n user: { ...sortKeys(user as unknown as Record<string, unknown>) },\r\n context: { ...sortKeys(context) },\r\n layout: { ...sortKeys(layout) },\r\n };\r\n const accept = headers.get('accept');\r\n if (!accept || !(accept.includes('text/html'))) {\r\n return Response.json(info, {\r\n status: 200,\r\n });\r\n }\r\n return new Response(`<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charSet=\"utf-8\"/>\r\n <style>\r\n html, body {\r\n background: #282828;\r\n color: #7cacf8;\r\n }\r\n body {\r\n padding: 0;\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 14px;\r\n line-height: 1.16;\r\n font-weight: 100;\r\n }\r\n json-viewer {\r\n padding: 20px;\r\n min-height: 100vh;\r\n box-sizing: border-box;\r\n line-height: 1.2;\r\n --background-color: #282828;\r\n --color: #e3e3e3;\r\n --property-color: #7cacf8;\r\n --string-color: #53d5fb;\r\n --number-color: #7b80ff;\r\n --boolean-color: #9980ff;\r\n --null-color: #6f6f6f;\r\n --preview-color: #8f8f8f;\r\n --highlight-color: #7b0000;\r\n --font-family: monospace;\r\n --font-size: 14px;\r\n --indent-size: 1em;\r\n --indentguide-size: 1px;\r\n --indentguide-style: solid;\r\n --indentguide-color: #333;\r\n --indentguide-color-active: #666;\r\n --indentguide: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color);\r\n --indentguide-active: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color-active);\r\n }\r\n\r\n :root {\r\n --scrollbar-size: 8px;\r\n --scrollbar-border-radius: 2px;\r\n --scrollbar-track-color: transparent;\r\n --scrollbar-track-hover-color: transparent;\r\n --scrollbar-thumb-color: #888888;\r\n --scrollbar-thumb-hover-color: #aaaaaa;\r\n }\r\n\r\n ::-webkit-scrollbar {\r\n width: var(--scrollbar-size);\r\n height: var(--scrollbar-size);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-button {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-button:hover {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-thumb {\r\n background-color: var(--scrollbar-thumb-color);\r\n box-shadow: none;\r\n border-radius: calc(var(--scrollbar-size) * 0.5);\r\n }\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background-color: var(--scrollbar-thumb-hover-color);\r\n }\r\n\r\n ::-webkit-scrollbar-track {\r\n background-color: var(--scrollbar-track-color);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-track:hover {\r\n background-color: var(--scrollbar-track-hover-color);\r\n }\r\n\r\n </style>\r\n <script src=\"https://unpkg.com/@alenaksu/json-viewer@2.0.0/dist/json-viewer.bundle.js\"></script>\r\n <script>\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const viewer = document.querySelector('#json-viewer');\r\n viewer.data = ${JSON.stringify(info)};\r\n viewer.expand(/headers|env/);\r\n });\r\n </script>\r\n</head>\r\n<body>\r\n <json-viewer id=\"json-viewer\"></json-viewer>\r\n</body>\r\n</html>`, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'text/html',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n console.log('getVarsHandler.error', error);\r\n return getHandlerErrorResponse(error);\r\n }\r\n };\r\n}\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"vars.handler.js","names":["env: Record<string, unknown>","object?: Record<string, unknown>","config: Promise<SanitizedConfig>","request: NextRequest","headers","getHeaders","defaultMarket","defaultLocale","error: unknown"],"sources":["../../../src/server/handlers/vars.handler.ts"],"sourcesContent":["import { getHost, getOrigin, isDevelopment, isProduction } from '@websolutespa/bom-core';\r\nimport { headers as getHeaders } from 'next/headers';\r\nimport { NextRequest } from 'next/server';\r\nimport { SanitizedConfig } from 'payload';\r\nimport { getLayout } from '../layout';\r\nimport { getPayload, getSearchParams } from '../mixer';\r\nimport { getHandlerErrorResponse } from './error-response';\r\n\r\nconst DISALLOWED_KEYS = [\r\n '__NEXT_PRIVATE_STANDALONE_CONFIG',\r\n];\r\n\r\nconst getFilteredEnv = (env: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(env).filter(([k, v]) => (\r\n !DISALLOWED_KEYS.includes(k) && typeof v === 'string'\r\n ));\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nconst sortKeys = (object?: Record<string, unknown>): Record<string, unknown> => {\r\n const entries = Object.entries(object || {});\r\n entries.sort();\r\n return Object.fromEntries(entries);\r\n};\r\n\r\nexport function getVarsHandler(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest) {\r\n try {\r\n const searchParams = request.nextUrl.searchParams;\r\n // console.log('getVarsHandler', searchParams);\r\n const { market, locale, defaultMarket, defaultLocale, params } = getSearchParams(request);\r\n const headers = await getHeaders();\r\n const { payload, user, getContext } = await getPayload({ config, headers });\r\n if (!(user?.roles || []).includes('admin')) {\r\n throw { status: 401, message: 'Unauthorized' };\r\n }\r\n const context = await getContext(market || defaultMarket, locale || defaultLocale);\r\n const layout = await getLayout(market || defaultMarket, locale || defaultLocale, payload, user, context);\r\n const info = {\r\n production: isProduction,\r\n development: isDevelopment,\r\n origin: getOrigin(headers),\r\n host: getHost(headers),\r\n params: {},\r\n searchParams: { ...sortKeys(Object.fromEntries(searchParams)) },\r\n headers: { ...sortKeys(Object.fromEntries(headers)) },\r\n env: { ...getFilteredEnv(process.env) },\r\n user: { ...sortKeys(user as unknown as Record<string, unknown>) },\r\n context: { ...sortKeys(context) },\r\n layout: { ...sortKeys(layout) },\r\n };\r\n const accept = headers.get('accept');\r\n if (!accept || !(accept.includes('text/html'))) {\r\n return Response.json(info, {\r\n status: 200,\r\n });\r\n }\r\n return new Response(`<!DOCTYPE html>\r\n<html>\r\n<head>\r\n <meta charSet=\"utf-8\"/>\r\n <style>\r\n html, body {\r\n background: #282828;\r\n color: #7cacf8;\r\n }\r\n body {\r\n padding: 0;\r\n margin: 0;\r\n font-family: monospace;\r\n font-size: 14px;\r\n line-height: 1.16;\r\n font-weight: 100;\r\n }\r\n json-viewer {\r\n padding: 20px;\r\n min-height: 100vh;\r\n box-sizing: border-box;\r\n line-height: 1.2;\r\n --background-color: #282828;\r\n --color: #e3e3e3;\r\n --property-color: #7cacf8;\r\n --string-color: #53d5fb;\r\n --number-color: #7b80ff;\r\n --boolean-color: #9980ff;\r\n --null-color: #6f6f6f;\r\n --preview-color: #8f8f8f;\r\n --highlight-color: #7b0000;\r\n --font-family: monospace;\r\n --font-size: 14px;\r\n --indent-size: 1em;\r\n --indentguide-size: 1px;\r\n --indentguide-style: solid;\r\n --indentguide-color: #333;\r\n --indentguide-color-active: #666;\r\n --indentguide: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color);\r\n --indentguide-active: var(--indentguide-size) var(--indentguide-style) var(--indentguide-color-active);\r\n }\r\n\r\n :root {\r\n --scrollbar-size: 8px;\r\n --scrollbar-border-radius: 2px;\r\n --scrollbar-track-color: transparent;\r\n --scrollbar-track-hover-color: transparent;\r\n --scrollbar-thumb-color: #888888;\r\n --scrollbar-thumb-hover-color: #aaaaaa;\r\n }\r\n\r\n ::-webkit-scrollbar {\r\n width: var(--scrollbar-size);\r\n height: var(--scrollbar-size);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-button {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-button:hover {\r\n display: none;\r\n }\r\n\r\n ::-webkit-scrollbar-thumb {\r\n background-color: var(--scrollbar-thumb-color);\r\n box-shadow: none;\r\n border-radius: calc(var(--scrollbar-size) * 0.5);\r\n }\r\n\r\n ::-webkit-scrollbar-thumb:hover {\r\n background-color: var(--scrollbar-thumb-hover-color);\r\n }\r\n\r\n ::-webkit-scrollbar-track {\r\n background-color: var(--scrollbar-track-color);\r\n border-radius: 0;\r\n }\r\n\r\n ::-webkit-scrollbar-track:hover {\r\n background-color: var(--scrollbar-track-hover-color);\r\n }\r\n\r\n </style>\r\n <script src=\"https://unpkg.com/@alenaksu/json-viewer@2.0.0/dist/json-viewer.bundle.js\"></script>\r\n <script>\r\n document.addEventListener('DOMContentLoaded', () => {\r\n const viewer = document.querySelector('#json-viewer');\r\n viewer.data = ${JSON.stringify(info)};\r\n viewer.expand(/headers|env/);\r\n });\r\n </script>\r\n</head>\r\n<body>\r\n <json-viewer id=\"json-viewer\"></json-viewer>\r\n</body>\r\n</html>`, {\r\n status: 200,\r\n headers: {\r\n 'Content-Type': 'text/html',\r\n },\r\n });\r\n } catch (error: unknown) {\r\n console.log('getVarsHandler.error', error);\r\n return getHandlerErrorResponse(error);\r\n }\r\n };\r\n}\r\n"],"mappings":";;;;;;;AAQA,MAAM,kBAAkB,CACtB,kCACD;AAED,MAAM,iBAAiB,CAACA,QAA0D;CAChF,MAAM,UAAU,OAAO,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAChD,CAAC,gBAAgB,SAAS,EAAE,IAAI,OAAO,MAAM,SAC7C;CACF,QAAQ,MAAM;AACd,QAAO,OAAO,YAAY,QAAQ;AACnC;AAED,MAAM,WAAW,CAACC,WAA8D;CAC9E,MAAM,UAAU,OAAO,QAAQ,UAAU,CAAE,EAAC;CAC5C,QAAQ,MAAM;AACd,QAAO,OAAO,YAAY,QAAQ;AACnC;AAED,SAAgB,eAAeC,QAAkC;AAC/D,QAAO,eAAgBC,SAAsB;AAC3C,MAAI;GACF,MAAM,eAAe,QAAQ,QAAQ;GAErC,MAAM,EAAE,QAAQ,QAAQ,gCAAe,gCAAe,QAAQ,GAAG,gBAAgB,QAAQ;GACzF,MAAMC,YAAU,MAAMC,SAAY;GAClC,MAAM,EAAE,SAAS,MAAM,YAAY,GAAG,MAAM,WAAW;IAAE;IAAQ;GAAS,EAAC;AAC3E,OAAI,EAAE,MAAM,SAAS,CAAE,GAAE,SAAS,QAAQ,CACxC,OAAM;IAAE,QAAQ;IAAK,SAAS;GAAgB;GAEhD,MAAM,UAAU,MAAM,WAAW,UAAUC,iBAAe,UAAUC,gBAAc;GAClF,MAAM,SAAS,MAAM,UAAU,UAAUD,iBAAe,UAAUC,iBAAe,SAAS,MAAM,QAAQ;GACxG,MAAM,OAAO;IACX,YAAY;IACZ,aAAa;IACb,QAAQ,UAAUH,UAAQ;IAC1B,MAAM,QAAQA,UAAQ;IACtB,QAAQ,CAAE;IACV,cAAc,EAAE,GAAG,SAAS,OAAO,YAAY,aAAa,CAAC,CAAE;IAC/D,SAAS,EAAE,GAAG,SAAS,OAAO,YAAYA,UAAQ,CAAC,CAAE;IACrD,KAAK,EAAE,GAAG,eAAe,QAAQ,IAAI,CAAE;IACvC,MAAM,EAAE,GAAG,SAAS,KAA2C,CAAE;IACjE,SAAS,EAAE,GAAG,SAAS,QAAQ,CAAE;IACjC,QAAQ,EAAE,GAAG,SAAS,OAAO,CAAE;GAChC;GACD,MAAM,SAASA,UAAQ,IAAI,SAAS;AACpC,OAAI,CAAC,UAAU,CAAE,OAAO,SAAS,YAAY,CAC3C,QAAO,SAAS,KAAK,MAAM,EACzB,QAAQ,IACT,EAAC;AAEJ,UAAO,IAAI,SAAS,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oBAyFP,EAAE,KAAK,UAAU,KAAK,CAAC;;;;;;;;OAQpC,CAAC,EAAE;IACF,QAAQ;IACR,SAAS,EACP,gBAAgB,YACjB;GACF;EACF,SAAQI,OAAgB;GACvB,QAAQ,IAAI,wBAAwB,MAAM;AAC1C,UAAO,wBAAwB,MAAM;EACtC;CACF;AACF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { IPageContext, LayoutContextOptions, LayoutOption, LayoutOptions, PageContextOptions, PageSelect, TypedPageContext } from "../types.js";
|
|
2
|
+
import { CollectionSlug, SanitizedConfig } from "payload";
|
|
3
|
+
import * as next0 from "next";
|
|
4
|
+
|
|
5
|
+
//#region src/server/helpers.d.ts
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Options bound once for every call. Request-scoped values (`headers`) and
|
|
9
|
+
* per-page values (`select`, `populate`, `joins`) are passed per call;
|
|
10
|
+
* skipping the layout (`layout: false`) is a per-call choice too.
|
|
11
|
+
*/
|
|
12
|
+
type ContextDefaults = Omit<PageContextOptions, 'config' | 'headers' | 'select' | 'populate' | 'joins' | 'layout'> & {
|
|
13
|
+
layout?: LayoutOptions;
|
|
14
|
+
};
|
|
15
|
+
type PageOptions<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug>, TLayout extends LayoutOption> = Omit<PageContextOptions<TSlug, TSelect, TLayout>, 'config'> & {
|
|
16
|
+
config?: Promise<SanitizedConfig>;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Binds `config` and default options once, so templates don't pass them every time.
|
|
20
|
+
* Per-call options override the defaults.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* // src/lib/context.ts in the app
|
|
24
|
+
* export const { createPageContext, createLayoutContext, getMetadata } =
|
|
25
|
+
* createContextHelpers({ config, defaults: { depth: 2 } });
|
|
26
|
+
*/
|
|
27
|
+
declare function createContextHelpers({
|
|
28
|
+
config,
|
|
29
|
+
defaults
|
|
30
|
+
}: {
|
|
31
|
+
config: Promise<SanitizedConfig>;
|
|
32
|
+
defaults?: ContextDefaults;
|
|
33
|
+
}): {
|
|
34
|
+
createPageContext<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined, TLayout extends LayoutOption = LayoutOptions>(market: string, locale: string, slug: TSlug, id: string, options?: PageOptions<TSlug, TSelect, TLayout>): Promise<TypedPageContext<TSlug, TSelect, TLayout>>;
|
|
35
|
+
createNotFoundContext<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined, TLayout extends LayoutOption = LayoutOptions>(market: string, locale: string, slug: TSlug, id: string, options?: PageOptions<TSlug, TSelect, TLayout>): Promise<TypedPageContext<TSlug, TSelect, TLayout>>;
|
|
36
|
+
createLayoutContext(market: string, locale: string, options?: Partial<LayoutContextOptions>): Promise<IPageContext>;
|
|
37
|
+
getMetadata<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined>(slug: TSlug, options?: Omit<PageContextOptions<TSlug, TSelect, LayoutOption>, "config">): (props: Readonly<{
|
|
38
|
+
params: Promise<{
|
|
39
|
+
market: string;
|
|
40
|
+
locale: string;
|
|
41
|
+
id: string;
|
|
42
|
+
}>;
|
|
43
|
+
}>, _parent: next0.ResolvingMetadata) => Promise<{
|
|
44
|
+
title: string | undefined;
|
|
45
|
+
description: string | undefined;
|
|
46
|
+
}>;
|
|
47
|
+
};
|
|
48
|
+
//#endregion
|
|
49
|
+
export { createContextHelpers };
|
|
50
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","names":[],"sources":["../../src/server/helpers.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AACkH;;KAS7G,eAAA,GAAkB,IAAK,CAAA,kBAAA,EAAA,QAAA,GAAA,SAAA,GAAA,QAAA,GAAA,UAAA,GAAA,OAAA,GAAA,QAAA,CAAA,GAAA;EAAkB,MAAvB,CAAA,EACZ,aADY;CAAI;AACH,KAGnB,WAHmB,CAAA,cAGO,cAHP,EAAA,gBAGuC,UAHvC,CAGkD,KAHlD,CAAA,EAAA,gBAG0E,YAH1E,CAAA,GAItB,IAJsB,CAIjB,kBAJiB,CAIE,KAJF,EAIS,OAJT,EAIkB,OAJlB,CAAA,EAAA,QAAA,CAAA,GAAA;EAGnB,MAAA,CAAA,EACsE,OAD3D,CACmE,eADnE,CAAA;CAAA;;;;;;;;;;AACmE,iBAWnE,oBAAA,CAXmE;EAAA,MAAA;EAAA;AAWnF,CAXmF,EAAA;EAAe,MAAvB,EAejE,OAfiE,CAezD,eAfyD,CAAA;EAAO,QAAA,CAAA,EAgBrE,eAhBqE;AAWlF,CAAA,CAAA,EAAgB;EAAoB,iBAAA,CAAA,cAYA,cAZA,EAAA,gBAYgC,UAZhC,CAY2C,KAZ3C,CAAA,GAAA,SAAA,EAAA,gBAY+E,YAZ/E,GAY2F,aAZ3F,CAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAaQ,KAbR,EAAA,EAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAaqC,WAbrC,CAaiD,KAbjD,EAawD,OAbxD,EAaiE,OAbjE,CAAA,CAAA,EAayE,OAbzE,CAayE,gBAbzE,CAayE,KAbzE,EAayE,OAbzE,EAayE,OAbzE,CAAA,CAAA;EAAA,qBAClC,CAAA,cAgBsC,cAhBtC,EAAA,gBAgBsE,UAhBtE,CAgBiF,KAhBjF,CAAA,GAAA,SAAA,EAAA,gBAgBqH,YAhBrH,GAgBiI,aAhBjI,CAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAiB0C,KAjB1C,EAAA,EAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAiBuE,WAjBvE,CAiBmF,KAjBnF,EAiB0F,OAjB1F,EAiBmG,OAjBnG,CAAA,CAAA,EAiB2G,OAjB3G,CAiB2G,gBAjB3G,CAiB2G,KAjB3G,EAiB2G,OAjB3G,EAiB2G,OAjB3G,CAAA,CAAA;EAAM,mBACN,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAoBgE,OApBhE,CAoBwE,oBApBxE,CAAA,CAAA,EAoB6F,OApB7F,CAoBuE,YAAA,CApBvE;EAAa,WAEG,CAAA,cAqBY,cArBZ,EAAA,gBAqB4C,UArB5C,CAqBuD,KArBvD,CAAA,GAAA,SAAA,CAAA,CAAA,IAAA,EAsBN,KAtBM,EAAA,OAAA,CAAA,EAsBW,IAtBX,CAsBgB,kBAtBhB,CAsBmC,KAtBnC,EAsB0C,OAtB1C,EAsBmD,YAtBnD,CAAA,EAAA,QAAA,CAAA,CAAA,EAAA,CAAA,KAAA,EAsB2E,QAtB3E,CAAA;IAAR,MAAA,EAsBuB,OAtBvB,CAAA;MACG,MAAA,EAAA,MAAA;MAOuB,MAAA,EAAA,MAAA;MAA2C,EAAA,EAAA,MAAA;IAAX,CAAA,CAAA;EAAU,CAAA,CAAA,EAAqC,OAAA,EActB,KAAA,CAAA,iBAdsB,EAAA,UAAA,CAAA;IAAY,KAAA,EAAA,MAAA,GAAA,SAAA;IACnF,WAAA,EAAA,MAAA,GAAA,SAAA;EAAK,CAAA,CAAA;CAAyC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { createLayoutContext, createNotFoundContext, createPageContext } from "./context.js";
|
|
2
|
+
import { getMetadata } from "./metadata.js";
|
|
3
|
+
|
|
4
|
+
//#region src/server/helpers.ts
|
|
5
|
+
/**
|
|
6
|
+
|
|
7
|
+
* Binds `config` and default options once, so templates don't pass them every time.
|
|
8
|
+
|
|
9
|
+
* Per-call options override the defaults.
|
|
10
|
+
|
|
11
|
+
*
|
|
12
|
+
|
|
13
|
+
* @example
|
|
14
|
+
|
|
15
|
+
* // src/lib/context.ts in the app
|
|
16
|
+
|
|
17
|
+
* export const { createPageContext, createLayoutContext, getMetadata } =
|
|
18
|
+
|
|
19
|
+
* createContextHelpers({ config, defaults: { depth: 2 } });
|
|
20
|
+
|
|
21
|
+
*/
|
|
22
|
+
function createContextHelpers({ config, defaults = {} }) {
|
|
23
|
+
const layoutDefaults = {
|
|
24
|
+
draft: defaults.draft,
|
|
25
|
+
...defaults.layout
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
createPageContext(market, locale, slug, id, options) {
|
|
29
|
+
return createPageContext(market, locale, slug, id, {
|
|
30
|
+
config,
|
|
31
|
+
...defaults,
|
|
32
|
+
...options
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
createNotFoundContext(market, locale, slug, id, options) {
|
|
36
|
+
return createNotFoundContext(market, locale, slug, id, {
|
|
37
|
+
config,
|
|
38
|
+
...defaults,
|
|
39
|
+
...options
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
createLayoutContext(market, locale, options) {
|
|
43
|
+
return createLayoutContext(market, locale, {
|
|
44
|
+
config,
|
|
45
|
+
...layoutDefaults,
|
|
46
|
+
...options
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
getMetadata(slug, options) {
|
|
50
|
+
return getMetadata(slug, config, {
|
|
51
|
+
...defaults,
|
|
52
|
+
...options
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//#endregion
|
|
59
|
+
export { createContextHelpers };
|
|
60
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","names":["layoutDefaults: Omit<LayoutContextOptions, 'config'>","market: string","locale: string","slug: TSlug","id: string","options?: PageOptions<TSlug, TSelect, TLayout>","options?: Partial<LayoutContextOptions>","options?: Omit<PageContextOptions<TSlug, TSelect, LayoutOption>, 'config'>"],"sources":["../../src/server/helpers.ts"],"sourcesContent":["import type { CollectionSlug, SanitizedConfig } from 'payload';\r\nimport type { LayoutContextOptions, LayoutOption, LayoutOptions, PageContextOptions, PageSelect } from '../types';\r\nimport { createLayoutContext, createNotFoundContext, createPageContext } from './context';\r\nimport { getMetadata } from './metadata';\r\n\r\n/**\r\n * Options bound once for every call. Request-scoped values (`headers`) and\r\n * per-page values (`select`, `populate`, `joins`) are passed per call;\r\n * skipping the layout (`layout: false`) is a per-call choice too.\r\n */\r\ntype ContextDefaults = Omit<PageContextOptions, 'config' | 'headers' | 'select' | 'populate' | 'joins' | 'layout'> & {\r\n layout?: LayoutOptions;\r\n};\r\n\r\ntype PageOptions<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug>, TLayout extends LayoutOption> =\r\n Omit<PageContextOptions<TSlug, TSelect, TLayout>, 'config'> & { config?: Promise<SanitizedConfig> };\r\n\r\n/**\r\n * Binds `config` and default options once, so templates don't pass them every time.\r\n * Per-call options override the defaults.\r\n *\r\n * @example\r\n * // src/lib/context.ts in the app\r\n * export const { createPageContext, createLayoutContext, getMetadata } =\r\n * createContextHelpers({ config, defaults: { depth: 2 } });\r\n */\r\nexport function createContextHelpers({\r\n config,\r\n defaults = {},\r\n}: {\r\n config: Promise<SanitizedConfig>;\r\n defaults?: ContextDefaults;\r\n}) {\r\n const layoutDefaults: Omit<LayoutContextOptions, 'config'> = {\r\n draft: defaults.draft,\r\n ...defaults.layout,\r\n };\r\n return {\r\n createPageContext<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined, TLayout extends LayoutOption = LayoutOptions>(\r\n market: string, locale: string, slug: TSlug, id: string, options?: PageOptions<TSlug, TSelect, TLayout>\r\n ) {\r\n return createPageContext<TSlug, TSelect, TLayout>(market, locale, slug, id, { config, ...defaults as PageOptions<TSlug, TSelect, TLayout>, ...options });\r\n },\r\n createNotFoundContext<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined, TLayout extends LayoutOption = LayoutOptions>(\r\n market: string, locale: string, slug: TSlug, id: string, options?: PageOptions<TSlug, TSelect, TLayout>\r\n ) {\r\n return createNotFoundContext<TSlug, TSelect, TLayout>(market, locale, slug, id, { config, ...defaults as PageOptions<TSlug, TSelect, TLayout>, ...options });\r\n },\r\n createLayoutContext(market: string, locale: string, options?: Partial<LayoutContextOptions>) {\r\n return createLayoutContext(market, locale, { config, ...layoutDefaults, ...options });\r\n },\r\n getMetadata<TSlug extends CollectionSlug, TSelect extends PageSelect<TSlug> = undefined>(\r\n slug: TSlug, options?: Omit<PageContextOptions<TSlug, TSelect, LayoutOption>, 'config'>\r\n ) {\r\n return getMetadata<TSlug, TSelect>(slug, config, { ...defaults, ...options });\r\n },\r\n };\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,qBAAqB,EACnC,QACA,WAAW,CAAE,GAId,EAAE;CACD,MAAMA,iBAAuD;EAC3D,OAAO,SAAS;EAChB,GAAG,SAAS;CACb;AACD,QAAO;EACL,kBACEC,QAAgBC,QAAgBC,MAAaC,IAAYC,SACzD;AACA,UAAO,kBAA2C,QAAQ,QAAQ,MAAM,IAAI;IAAE;IAAQ,GAAG;IAAkD,GAAG;GAAS,EAAC;EACzJ;EACD,sBACEJ,QAAgBC,QAAgBC,MAAaC,IAAYC,SACzD;AACA,UAAO,sBAA+C,QAAQ,QAAQ,MAAM,IAAI;IAAE;IAAQ,GAAG;IAAkD,GAAG;GAAS,EAAC;EAC7J;EACD,oBAAoBJ,QAAgBC,QAAgBI,SAAyC;AAC3F,UAAO,oBAAoB,QAAQ,QAAQ;IAAE;IAAQ,GAAG;IAAgB,GAAG;GAAS,EAAC;EACtF;EACD,YACEH,MAAaI,SACb;AACA,UAAO,YAA4B,MAAM,QAAQ;IAAE,GAAG;IAAU,GAAG;GAAS,EAAC;EAC9E;CACF;AACF"}
|
package/dist/server/layout.js
CHANGED
|
@@ -1,56 +1,90 @@
|
|
|
1
|
-
"use server";
|
|
2
1
|
import { getRouteLinkCategory } from "../lib/route.js";
|
|
3
|
-
import {
|
|
2
|
+
import { DEFAULT_LAYOUT_DEPTH } from "../lib/const.js";
|
|
3
|
+
import { buildReadOptions } from "./mixer.js";
|
|
4
4
|
import { getRootCategory } from "@websolutespa/bom-core";
|
|
5
|
+
import "server-only";
|
|
6
|
+
|
|
5
7
|
//#region src/server/layout.ts
|
|
6
8
|
/**
|
|
9
|
+
|
|
7
10
|
* Builds the full ILayout object using Payload local API calls.
|
|
11
|
+
|
|
8
12
|
*
|
|
13
|
+
|
|
9
14
|
* All payload.find / payload.findGlobal calls pass `context: mixerContext` so
|
|
15
|
+
|
|
10
16
|
* payload-plugin-bowl can enrich results (hrefs, richText serialisation, etc.).
|
|
17
|
+
|
|
11
18
|
*
|
|
19
|
+
|
|
12
20
|
* Collection and global slugs use the payload-plugin-bowl defaults:
|
|
21
|
+
|
|
13
22
|
* market → 'market' (collection)
|
|
23
|
+
|
|
14
24
|
* locale → 'locale' (global)
|
|
25
|
+
|
|
15
26
|
* label → 'label' (collection)
|
|
27
|
+
|
|
16
28
|
* app → 'app' (global) ← defined in payload-plugin-bowl
|
|
29
|
+
|
|
17
30
|
* menu → 'menu' (collection)
|
|
31
|
+
|
|
18
32
|
*
|
|
33
|
+
|
|
19
34
|
* The route link tree is built from mixerContext.currentRoutes + mixerContext.categories
|
|
35
|
+
|
|
20
36
|
* using getRouteLinkCategory (pure fn, no store calls) from bom-mixer-models/server.
|
|
37
|
+
|
|
38
|
+
*
|
|
39
|
+
|
|
40
|
+
* The last argument accepts read options (depth, draft); depth defaults to
|
|
41
|
+
|
|
42
|
+
* DEFAULT_LAYOUT_DEPTH. A boolean is still accepted as the legacy draft flag.
|
|
43
|
+
|
|
21
44
|
*/
|
|
22
|
-
async function getLayout(market, locale, payload, user, mixerContext,
|
|
23
|
-
const
|
|
45
|
+
async function getLayout(market, locale, payload, user, mixerContext, readOptions) {
|
|
46
|
+
const options = typeof readOptions === "object" ? readOptions : { draft: readOptions };
|
|
47
|
+
const base = buildReadOptions({
|
|
48
|
+
user,
|
|
49
|
+
locale,
|
|
50
|
+
draft: options.draft,
|
|
51
|
+
depth: options.depth ?? DEFAULT_LAYOUT_DEPTH
|
|
52
|
+
});
|
|
24
53
|
const findOpts = {
|
|
25
54
|
...base,
|
|
26
55
|
pagination: false,
|
|
27
56
|
limit: 1e4
|
|
28
57
|
};
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
58
|
+
const [marketsResult, localeGlobal, labelsResult, app, menusResult] = await Promise.all([
|
|
59
|
+
payload.find({
|
|
60
|
+
...findOpts,
|
|
61
|
+
collection: "market",
|
|
62
|
+
context: mixerContext
|
|
63
|
+
}),
|
|
64
|
+
payload.findGlobal({
|
|
65
|
+
...base,
|
|
66
|
+
slug: "locale",
|
|
67
|
+
context: mixerContext
|
|
68
|
+
}),
|
|
69
|
+
payload.find({
|
|
70
|
+
...findOpts,
|
|
71
|
+
collection: "label",
|
|
72
|
+
context: mixerContext
|
|
73
|
+
}),
|
|
74
|
+
payload.findGlobal({
|
|
75
|
+
...base,
|
|
76
|
+
slug: "app",
|
|
77
|
+
context: mixerContext
|
|
78
|
+
}),
|
|
79
|
+
payload.find({
|
|
80
|
+
...findOpts,
|
|
81
|
+
collection: "menu",
|
|
82
|
+
context: mixerContext
|
|
83
|
+
})
|
|
84
|
+
]);
|
|
85
|
+
const markets = marketsResult.docs;
|
|
86
|
+
const locales = (localeGlobal?.items ?? []).filter((x) => x.isActive);
|
|
87
|
+
const labels = labelsResult.docs;
|
|
54
88
|
const menu = {};
|
|
55
89
|
menusResult.docs.forEach((x) => {
|
|
56
90
|
menu[String(x.id)] = x;
|
|
@@ -66,6 +100,10 @@ async function getLayout(market, locale, payload, user, mixerContext, draft) {
|
|
|
66
100
|
if (!object[routeLink.schema] || routeLink.schema === String(routeLink.category)) object[routeLink.schema] = routeLink;
|
|
67
101
|
return object;
|
|
68
102
|
}, {});
|
|
103
|
+
const topLevelHrefs = flatTopLevelRoutes.reduce((object, routeLink) => {
|
|
104
|
+
if (routeLink.href && (!object[routeLink.schema] || routeLink.schema === String(routeLink.category))) object[routeLink.schema] = routeLink.href;
|
|
105
|
+
return object;
|
|
106
|
+
}, {});
|
|
69
107
|
return {
|
|
70
108
|
labels,
|
|
71
109
|
locale,
|
|
@@ -74,15 +112,12 @@ async function getLayout(market, locale, payload, user, mixerContext, draft) {
|
|
|
74
112
|
markets,
|
|
75
113
|
app,
|
|
76
114
|
menu,
|
|
77
|
-
topLevelHrefs
|
|
78
|
-
if (routeLink.href && (!object[routeLink.schema] || routeLink.schema === String(routeLink.category))) object[routeLink.schema] = routeLink.href;
|
|
79
|
-
return object;
|
|
80
|
-
}, {}),
|
|
115
|
+
topLevelHrefs,
|
|
81
116
|
topLevelRoutes,
|
|
82
117
|
tree
|
|
83
118
|
};
|
|
84
119
|
}
|
|
120
|
+
|
|
85
121
|
//#endregion
|
|
86
122
|
export { getLayout };
|
|
87
|
-
|
|
88
123
|
//# sourceMappingURL=layout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","names":[],"sources":["../../src/server/layout.ts"],"sourcesContent":["'
|
|
1
|
+
{"version":3,"file":"layout.js","names":["market: string","locale: string","payload: MixerPayload","user: User","mixerContext: MixerContext","readOptions?: Pick<ReadOptions, 'depth' | 'draft'> | boolean","menu: Record<string, ILocalizedMenu>","flatTopLevelRoutes: IRouteLink[]"],"sources":["../../src/server/layout.ts"],"sourcesContent":["import 'server-only';\r\n\r\nimport { IApp, IAppExtended, ICategory, ILabel, ILayout, ILocale, ILocalizedMenu, IMarket, IRoute, IRouteLink, getRootCategory } from '@websolutespa/bom-core';\r\nimport type { User } from '@websolutespa/payload-plugin-bowl';\r\nimport type { CollectionSlug, GlobalSlug } from 'payload';\r\nimport { getRouteLinkCategory } from '../lib/route';\r\nimport { DEFAULT_LAYOUT_DEPTH } from '../lib/const';\r\nimport type { MixerContext, ReadOptions } from '../types';\r\nimport { buildReadOptions } from './mixer';\r\nimport type { MixerPayload } from './mixer-payload';\r\n\r\n/**\r\n * Builds the full ILayout object using Payload local API calls.\r\n *\r\n * All payload.find / payload.findGlobal calls pass `context: mixerContext` so\r\n * payload-plugin-bowl can enrich results (hrefs, richText serialisation, etc.).\r\n *\r\n * Collection and global slugs use the payload-plugin-bowl defaults:\r\n * market → 'market' (collection)\r\n * locale → 'locale' (global)\r\n * label → 'label' (collection)\r\n * app → 'app' (global) ← defined in payload-plugin-bowl\r\n * menu → 'menu' (collection)\r\n *\r\n * The route link tree is built from mixerContext.currentRoutes + mixerContext.categories\r\n * using getRouteLinkCategory (pure fn, no store calls) from bom-mixer-models/server.\r\n *\r\n * The last argument accepts read options (depth, draft); depth defaults to\r\n * DEFAULT_LAYOUT_DEPTH. A boolean is still accepted as the legacy draft flag.\r\n */\r\nexport async function getLayout<T extends IAppExtended = IAppExtended>(\r\n market: string,\r\n locale: string,\r\n payload: MixerPayload,\r\n user: User,\r\n mixerContext: MixerContext,\r\n readOptions?: Pick<ReadOptions, 'depth' | 'draft'> | boolean\r\n): Promise<ILayout<T>> {\r\n const options = typeof readOptions === 'object' ? readOptions : { draft: readOptions };\r\n const base = buildReadOptions({\r\n user,\r\n locale,\r\n draft: options.draft,\r\n depth: options.depth ?? DEFAULT_LAYOUT_DEPTH,\r\n });\r\n const findOpts = { ...base, pagination: false, limit: 10000 } as const;\r\n\r\n // independent reads: markets, locales (global with an `items` array), labels, app global, menus\r\n const [marketsResult, localeGlobal, labelsResult, app, menusResult] = await Promise.all([\r\n payload.find({\r\n ...findOpts,\r\n collection: 'market' as CollectionSlug,\r\n context: mixerContext,\r\n }),\r\n payload.findGlobal({\r\n ...base,\r\n slug: 'locale' as GlobalSlug,\r\n context: mixerContext,\r\n }) as unknown as Promise<{ items: ILocale[] }>,\r\n payload.find({\r\n ...findOpts,\r\n collection: 'label' as CollectionSlug,\r\n context: mixerContext,\r\n }),\r\n // app global (slug 'app', registered by payload-plugin-bowl)\r\n payload.findGlobal({\r\n ...base,\r\n slug: 'app' as GlobalSlug,\r\n context: mixerContext,\r\n }) as unknown as Promise<IApp<T>>,\r\n payload.find({\r\n ...findOpts,\r\n collection: 'menu' as CollectionSlug,\r\n context: mixerContext,\r\n }),\r\n ]);\r\n\r\n const markets = marketsResult.docs as unknown as IMarket[];\r\n const locales = (localeGlobal?.items ?? []).filter(x => x.isActive);\r\n const labels = labelsResult.docs as unknown as ILabel[];\r\n\r\n const menu: Record<string, ILocalizedMenu> = {};\r\n (menusResult.docs as unknown as ILocalizedMenu[]).forEach(x => {\r\n menu[String(x.id)] = x;\r\n });\r\n\r\n // route link tree — pure computation from mixer context data (no store calls)\r\n const categories = (mixerContext.categories ?? []) as unknown as ICategory[];\r\n const currentRoutes = (mixerContext.currentRoutes ?? []) as IRoute[];\r\n const rootCategory = getRootCategory(categories);\r\n const treeResult = rootCategory\r\n ? getRouteLinkCategory(locale, currentRoutes, categories, rootCategory, rootCategory)\r\n : undefined;\r\n const tree = Array.isArray(treeResult) ? treeResult[0] : treeResult;\r\n\r\n // derive topLevelRoutes and topLevelHrefs from tree (mirrors layout.service.ts logic)\r\n const firstLevelRoutes = tree?.items ?? [];\r\n const flatTopLevelRoutes: IRouteLink[] = tree ? [tree, ...firstLevelRoutes] : [];\r\n\r\n const topLevelRoutes = flatTopLevelRoutes.reduce((object, routeLink) => {\r\n if (!object[routeLink.schema] || routeLink.schema === String(routeLink.category)) {\r\n object[routeLink.schema] = routeLink;\r\n }\r\n return object;\r\n }, {} as Record<string, IRouteLink>);\r\n\r\n const topLevelHrefs = flatTopLevelRoutes.reduce((object, routeLink) => {\r\n if (routeLink.href && (!object[routeLink.schema] || routeLink.schema === String(routeLink.category))) {\r\n object[routeLink.schema] = routeLink.href;\r\n }\r\n return object;\r\n }, {} as Record<string, string>);\r\n\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,eAAsB,UACpBA,QACAC,QACAC,SACAC,MACAC,cACAC,aACqB;CACrB,MAAM,UAAU,OAAO,gBAAgB,WAAW,cAAc,EAAE,OAAO,YAAa;CACtF,MAAM,OAAO,iBAAiB;EAC5B;EACA;EACA,OAAO,QAAQ;EACf,OAAO,QAAQ,SAAS;CACzB,EAAC;CACF,MAAM,WAAW;EAAE,GAAG;EAAM,YAAY;EAAO,OAAO;CAAO;CAG7D,MAAM,CAAC,eAAe,cAAc,cAAc,KAAK,YAAY,GAAG,MAAM,QAAQ,IAAI;EACtF,QAAQ,KAAK;GACX,GAAG;GACH,YAAY;GACZ,SAAS;EACV,EAAC;EACF,QAAQ,WAAW;GACjB,GAAG;GACH,MAAM;GACN,SAAS;EACV,EAAC;EACF,QAAQ,KAAK;GACX,GAAG;GACH,YAAY;GACZ,SAAS;EACV,EAAC;EAEF,QAAQ,WAAW;GACjB,GAAG;GACH,MAAM;GACN,SAAS;EACV,EAAC;EACF,QAAQ,KAAK;GACX,GAAG;GACH,YAAY;GACZ,SAAS;EACV,EAAC;CACH,EAAC;CAEF,MAAM,UAAU,cAAc;CAC9B,MAAM,WAAW,cAAc,SAAS,CAAE,GAAE,OAAO,OAAK,EAAE,SAAS;CACnE,MAAM,SAAS,aAAa;CAE5B,MAAMC,OAAuC,CAAE;CAC9C,YAAY,KAAqC,QAAQ,OAAK;EAC7D,KAAK,OAAO,EAAE,GAAG,IAAI;CACtB,EAAC;CAGF,MAAM,aAAc,aAAa,cAAc,CAAE;CACjD,MAAM,gBAAiB,aAAa,iBAAiB,CAAE;CACvD,MAAM,eAAe,gBAAgB,WAAW;CAChD,MAAM,aAAa,eACf,qBAAqB,QAAQ,eAAe,YAAY,cAAc,aAAa,GACnF;CACJ,MAAM,OAAO,MAAM,QAAQ,WAAW,GAAG,WAAW,KAAK;CAGzD,MAAM,mBAAmB,MAAM,SAAS,CAAE;CAC1C,MAAMC,qBAAmC,OAAO,CAAC,MAAM,GAAG,gBAAiB,IAAG,CAAE;CAEhF,MAAM,iBAAiB,mBAAmB,OAAO,CAAC,QAAQ,cAAc;AACtE,MAAI,CAAC,OAAO,UAAU,WAAW,UAAU,WAAW,OAAO,UAAU,SAAS,EAC9E,OAAO,UAAU,UAAU;AAE7B,SAAO;CACR,GAAE,CAAE,EAA+B;CAEpC,MAAM,gBAAgB,mBAAmB,OAAO,CAAC,QAAQ,cAAc;AACrE,MAAI,UAAU,SAAS,CAAC,OAAO,UAAU,WAAW,UAAU,WAAW,OAAO,UAAU,SAAS,GACjG,OAAO,UAAU,UAAU,UAAU;AAEvC,SAAO;CACR,GAAE,CAAE,EAA2B;AAEhC,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD;AACF"}
|
package/dist/server/lazy.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ILazyStaticPropsFunc } from "../types.js";
|
|
2
2
|
import { IComponent } from "@websolutespa/bom-core";
|
|
3
|
+
import "server-only";
|
|
3
4
|
|
|
4
5
|
//#region src/server/lazy.d.ts
|
|
5
6
|
declare function withLazyProps<T>(key: string, getComponentProps: ILazyStaticPropsFunc<T>): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lazy.d.ts","names":[],"sources":["../../src/server/lazy.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"lazy.d.ts","names":[],"sources":["../../src/server/lazy.ts"],"sourcesContent":[],"mappings":";;;;;iBASsB,iDAAiD,qBAAqB,KAAE;iBAIxE,sBAAA,mBAAyC,eAAY;AAJ3E"}
|