@websolutespa/bom-next 3.0.2 → 4.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/CHANGELOG.md +17 -7
  2. package/dist/_virtual/{_rolldown/runtime.js → rolldown_runtime.js} +7 -4
  3. package/dist/client/client.d.ts.map +1 -1
  4. package/dist/client/client.js +17 -6
  5. package/dist/client/client.js.map +1 -1
  6. package/dist/client/extra.d.ts +3 -3
  7. package/dist/client/extra.d.ts.map +1 -1
  8. package/dist/client/extra.js +10 -5
  9. package/dist/client/extra.js.map +1 -1
  10. package/dist/client/label.d.ts.map +1 -1
  11. package/dist/client/label.js +10 -5
  12. package/dist/client/label.js.map +1 -1
  13. package/dist/client/layout.d.ts +3 -3
  14. package/dist/client/layout.d.ts.map +1 -1
  15. package/dist/client/layout.js +10 -5
  16. package/dist/client/layout.js.map +1 -1
  17. package/dist/client/local.collection.d.ts.map +1 -1
  18. package/dist/client/local.collection.js +4 -2
  19. package/dist/client/local.collection.js.map +1 -1
  20. package/dist/client/metadata.d.ts +3 -3
  21. package/dist/client/metadata.d.ts.map +1 -1
  22. package/dist/client/metadata.js +48 -40
  23. package/dist/client/metadata.js.map +1 -1
  24. package/dist/client/page.d.ts +3 -3
  25. package/dist/client/page.d.ts.map +1 -1
  26. package/dist/client/page.js +10 -5
  27. package/dist/client/page.js.map +1 -1
  28. package/dist/client/useApi.d.ts +7 -7
  29. package/dist/client/useApi.d.ts.map +1 -1
  30. package/dist/client/useApi.js +2 -1
  31. package/dist/client/useApi.js.map +1 -1
  32. package/dist/client/useCollectionApi.d.ts +6 -6
  33. package/dist/client/useCollectionApi.d.ts.map +1 -1
  34. package/dist/client/useCollectionApi.js +4 -2
  35. package/dist/client/useCollectionApi.js.map +1 -1
  36. package/dist/client/useExtra.d.ts.map +1 -1
  37. package/dist/client/useExtra.js +5 -2
  38. package/dist/client/useExtra.js.map +1 -1
  39. package/dist/client/useHttp.d.ts.map +1 -1
  40. package/dist/client/useHttp.js +9 -6
  41. package/dist/client/useHttp.js.map +1 -1
  42. package/dist/client/useLabel.d.ts.map +1 -1
  43. package/dist/client/useLabel.js +5 -2
  44. package/dist/client/useLabel.js.map +1 -1
  45. package/dist/client/useLayout.d.ts.map +1 -1
  46. package/dist/client/useLayout.js +5 -2
  47. package/dist/client/useLayout.js.map +1 -1
  48. package/dist/client/useLink.d.ts.map +1 -1
  49. package/dist/client/useLink.js +7 -3
  50. package/dist/client/useLink.js.map +1 -1
  51. package/dist/client/useMetaData.d.ts.map +1 -1
  52. package/dist/client/useMetaData.js +5 -2
  53. package/dist/client/useMetaData.js.map +1 -1
  54. package/dist/client/usePage.d.ts.map +1 -1
  55. package/dist/client/usePage.js +5 -2
  56. package/dist/client/usePage.js.map +1 -1
  57. package/dist/client/useUser.d.ts.map +1 -1
  58. package/dist/client/useUser.js +5 -2
  59. package/dist/client/useUser.js.map +1 -1
  60. package/dist/client/user.d.ts.map +1 -1
  61. package/dist/client/user.js +17 -11
  62. package/dist/client/user.js.map +1 -1
  63. package/dist/exports/client.js +2 -1
  64. package/dist/exports/instrumentation.js +2 -1
  65. package/dist/exports/proxy.js +2 -1
  66. package/dist/exports/server.js +2 -1
  67. package/dist/index.js +2 -1
  68. package/dist/instrumentation/client.d.ts.map +1 -1
  69. package/dist/instrumentation/client.js +2 -1
  70. package/dist/instrumentation/client.js.map +1 -1
  71. package/dist/instrumentation/sentry/capture.requestError.js +4 -1
  72. package/dist/instrumentation/sentry/capture.requestError.js.map +1 -1
  73. package/dist/instrumentation/sentry/capture.routerTransitionStart.js +2 -1
  74. package/dist/instrumentation/sentry/capture.routerTransitionStart.js.map +1 -1
  75. package/dist/instrumentation/sentry/config.client.js +10 -2
  76. package/dist/instrumentation/sentry/config.client.js.map +1 -0
  77. package/dist/instrumentation/sentry/config.edge.js +10 -2
  78. package/dist/instrumentation/sentry/config.edge.js.map +1 -0
  79. package/dist/instrumentation/sentry/config.server.js +10 -2
  80. package/dist/instrumentation/sentry/config.server.js.map +1 -0
  81. package/dist/instrumentation/server.d.ts.map +1 -1
  82. package/dist/instrumentation/server.js +8 -5
  83. package/dist/instrumentation/server.js.map +1 -1
  84. package/dist/instrumentation/types.d.ts.map +1 -1
  85. package/dist/lib/breadcrumb.d.ts.map +1 -1
  86. package/dist/lib/breadcrumb.js +6 -1
  87. package/dist/lib/breadcrumb.js.map +1 -1
  88. package/dist/lib/const.d.ts.map +1 -1
  89. package/dist/lib/const.js +1 -1
  90. package/dist/lib/const.js.map +1 -1
  91. package/dist/lib/http.d.ts.map +1 -1
  92. package/dist/lib/http.js +6 -3
  93. package/dist/lib/http.js.map +1 -1
  94. package/dist/lib/label.d.ts.map +1 -1
  95. package/dist/lib/label.js +4 -3
  96. package/dist/lib/label.js.map +1 -1
  97. package/dist/lib/layout.defaults.d.ts.map +1 -1
  98. package/dist/lib/layout.defaults.js +1 -1
  99. package/dist/lib/layout.defaults.js.map +1 -1
  100. package/dist/lib/link.d.ts.map +1 -1
  101. package/dist/lib/link.js +2 -1
  102. package/dist/lib/link.js.map +1 -1
  103. package/dist/lib/meta-data.d.ts.map +1 -1
  104. package/dist/lib/open-graph.d.ts.map +1 -1
  105. package/dist/lib/pagination.d.ts.map +1 -1
  106. package/dist/lib/pagination.js +4 -2
  107. package/dist/lib/pagination.js.map +1 -1
  108. package/dist/lib/route.d.ts.map +1 -1
  109. package/dist/lib/route.js +9 -3
  110. package/dist/lib/route.js.map +1 -1
  111. package/dist/lib/store.d.ts.map +1 -1
  112. package/dist/lib/store.js +31 -31
  113. package/dist/lib/store.js.map +1 -1
  114. package/dist/lib/structured-data.d.ts.map +1 -1
  115. package/dist/lib/twitter-card.d.ts.map +1 -1
  116. package/dist/lib/utils.d.ts.map +1 -1
  117. package/dist/lib/utils.js +3 -2
  118. package/dist/lib/utils.js.map +1 -1
  119. package/dist/mock.d.ts.map +1 -1
  120. package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js +3 -2
  121. package/dist/node_modules/@selderee/plugin-htmlparser2/lib/hp2-builder.js.map +1 -1
  122. package/dist/node_modules/deepmerge/dist/cjs.js +17 -9
  123. package/dist/node_modules/deepmerge/dist/cjs.js.map +1 -1
  124. package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js +2 -2
  125. package/dist/node_modules/dom-serializer/lib/esm/foreignNames.js.map +1 -1
  126. package/dist/node_modules/dom-serializer/lib/esm/index.js +10 -15
  127. package/dist/node_modules/dom-serializer/lib/esm/index.js.map +1 -1
  128. package/dist/node_modules/domelementtype/lib/esm/index.js +12 -12
  129. package/dist/node_modules/domelementtype/lib/esm/index.js.map +1 -1
  130. package/dist/node_modules/domhandler/lib/esm/index.js +4 -3
  131. package/dist/node_modules/domhandler/lib/esm/index.js.map +1 -1
  132. package/dist/node_modules/domhandler/lib/esm/node.js +8 -7
  133. package/dist/node_modules/domhandler/lib/esm/node.js.map +1 -1
  134. package/dist/node_modules/entities/lib/esm/decode.js +33 -32
  135. package/dist/node_modules/entities/lib/esm/decode.js.map +1 -1
  136. package/dist/node_modules/entities/lib/esm/decode_codepoint.js +5 -5
  137. package/dist/node_modules/entities/lib/esm/decode_codepoint.js.map +1 -1
  138. package/dist/node_modules/entities/lib/esm/escape.js +14 -6
  139. package/dist/node_modules/entities/lib/esm/escape.js.map +1 -1
  140. package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js +2 -2
  141. package/dist/node_modules/entities/lib/esm/generated/decode-data-html.js.map +1 -1
  142. package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js +2 -2
  143. package/dist/node_modules/entities/lib/esm/generated/decode-data-xml.js.map +1 -1
  144. package/dist/node_modules/html-to-text/lib/html-to-text.js +45 -33
  145. package/dist/node_modules/html-to-text/lib/html-to-text.js.map +1 -1
  146. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js +25 -25
  147. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Parser.js.map +1 -1
  148. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js +76 -73
  149. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/Tokenizer.js.map +1 -1
  150. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js +4 -3
  151. package/dist/node_modules/html-to-text/node_modules/htmlparser2/lib/esm/index.js.map +1 -1
  152. package/dist/node_modules/leac/lib/leac.js +72 -72
  153. package/dist/node_modules/leac/lib/leac.js.map +1 -1
  154. package/dist/node_modules/parseley/lib/parseley.js +37 -33
  155. package/dist/node_modules/parseley/lib/parseley.js.map +1 -1
  156. package/dist/node_modules/peberminta/lib/core.js +4 -4
  157. package/dist/node_modules/peberminta/lib/core.js.map +1 -1
  158. package/dist/node_modules/selderee/lib/selderee.js +16 -10
  159. package/dist/node_modules/selderee/lib/selderee.js.map +1 -1
  160. package/dist/proxy/protected-route.d.ts.map +1 -1
  161. package/dist/proxy/protected-route.js +11 -6
  162. package/dist/proxy/protected-route.js.map +1 -1
  163. package/dist/proxy/proxy.d.ts.map +1 -1
  164. package/dist/proxy/proxy.js +17 -2
  165. package/dist/proxy/proxy.js.map +1 -1
  166. package/dist/proxy/route-auto-detection.d.ts.map +1 -1
  167. package/dist/proxy/route-auto-detection.js +26 -14
  168. package/dist/proxy/route-auto-detection.js.map +1 -1
  169. package/dist/proxy/route-proxy.d.ts.map +1 -1
  170. package/dist/proxy/route-proxy.js +22 -5
  171. package/dist/proxy/route-proxy.js.map +1 -1
  172. package/dist/server/context.d.ts.map +1 -1
  173. package/dist/server/context.js +20 -2
  174. package/dist/server/context.js.map +1 -1
  175. package/dist/server/handlers/auth.handler.d.ts.map +1 -1
  176. package/dist/server/handlers/auth.handler.js +4 -2
  177. package/dist/server/handlers/auth.handler.js.map +1 -1
  178. package/dist/server/handlers/captions.handler.d.ts.map +1 -1
  179. package/dist/server/handlers/captions.handler.js +4 -2
  180. package/dist/server/handlers/captions.handler.js.map +1 -1
  181. package/dist/server/handlers/collection.handler.d.ts.map +1 -1
  182. package/dist/server/handlers/collection.handler.js +2 -1
  183. package/dist/server/handlers/collection.handler.js.map +1 -1
  184. package/dist/server/handlers/error-response.js +6 -2
  185. package/dist/server/handlers/error-response.js.map +1 -1
  186. package/dist/server/handlers/index.handler.d.ts.map +1 -1
  187. package/dist/server/handlers/index.handler.js +2 -1
  188. package/dist/server/handlers/index.handler.js.map +1 -1
  189. package/dist/server/handlers/preview.handler.d.ts.map +1 -1
  190. package/dist/server/handlers/preview.handler.js +6 -3
  191. package/dist/server/handlers/preview.handler.js.map +1 -1
  192. package/dist/server/handlers/registry.handler.d.ts.map +1 -1
  193. package/dist/server/handlers/registry.handler.js +14 -9
  194. package/dist/server/handlers/registry.handler.js.map +1 -1
  195. package/dist/server/handlers/route.handler.d.ts.map +1 -1
  196. package/dist/server/handlers/route.handler.js +12 -3
  197. package/dist/server/handlers/route.handler.js.map +1 -1
  198. package/dist/server/handlers/sitemap.handler.d.ts.map +1 -1
  199. package/dist/server/handlers/sitemap.handler.js +12 -9
  200. package/dist/server/handlers/sitemap.handler.js.map +1 -1
  201. package/dist/server/handlers/static-params.handler.d.ts.map +1 -1
  202. package/dist/server/handlers/static-params.handler.js +13 -8
  203. package/dist/server/handlers/static-params.handler.js.map +1 -1
  204. package/dist/server/handlers/vars.handler.d.ts.map +1 -1
  205. package/dist/server/handlers/vars.handler.js +5 -4
  206. package/dist/server/handlers/vars.handler.js.map +1 -1
  207. package/dist/server/layout.js +34 -12
  208. package/dist/server/layout.js.map +1 -1
  209. package/dist/server/lazy.d.ts.map +1 -1
  210. package/dist/server/lazy.js +5 -2
  211. package/dist/server/lazy.js.map +1 -1
  212. package/dist/server/local-api.d.ts.map +1 -1
  213. package/dist/server/local-api.js +12 -6
  214. package/dist/server/local-api.js.map +1 -1
  215. package/dist/server/metadata.d.ts.map +1 -1
  216. package/dist/server/metadata.js +5 -1
  217. package/dist/server/metadata.js.map +1 -1
  218. package/dist/server/mixer-payload.d.ts +1 -1
  219. package/dist/server/mixer-payload.d.ts.map +1 -1
  220. package/dist/server/mixer.d.ts.map +1 -1
  221. package/dist/server/mixer.js +183 -57
  222. package/dist/server/mixer.js.map +1 -1
  223. package/dist/server/page.d.ts.map +1 -1
  224. package/dist/server/page.js +15 -4
  225. package/dist/server/page.js.map +1 -1
  226. package/dist/server/utils.d.ts.map +1 -1
  227. package/dist/server/utils.js +4 -2
  228. package/dist/server/utils.js.map +1 -1
  229. package/dist/server/utmz.d.ts.map +1 -1
  230. package/dist/server/utmz.js +1 -1
  231. package/dist/server/utmz.js.map +1 -1
  232. package/dist/types.d.ts +1 -1
  233. package/dist/types.d.ts.map +1 -1
  234. package/package.json +11 -11
@@ -1 +1 @@
1
- {"version":3,"file":"registry.handler.js","names":[],"sources":["../../../src/server/handlers/registry.handler.ts"],"sourcesContent":["import { NextRequest } from 'next/server';\r\nimport { readdir, readFile, stat } from 'node:fs/promises';\r\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path';\r\n\r\nconst REGISTRY_SCHEMA = 'https://ui.shadcn.com/schema/registry.json';\r\nconst REGISTRY_ITEM_SCHEMA = 'https://ui.shadcn.com/schema/registry-item.json';\r\nconst SOURCE_EXTENSIONS = new Set(['.css', '.json', '.ts', '.tsx']);\r\nconst PUBLISHED_DIRECTORIES = new Set(['components', 'examples', 'hooks', 'lazy', 'lib', 'sections', 'theme']);\r\nconst SHADCN_COMPONENTS = new Set([\r\n 'accordion', 'alert-dialog', 'alert', 'aspect-ratio', 'avatar', 'badge', 'breadcrumb', 'calendar', 'card',\r\n 'carousel', 'chart', 'checkbox', 'collapsible', 'combobox', 'command', 'context-menu', 'dialog', 'drawer',\r\n 'dropdown-menu', 'form', 'hover-card', 'input', 'input-otp', 'label', 'menubar', 'navigation-menu',\r\n 'pagination', 'popover', 'progress', 'radio-group', 'resizable', 'scroll-area', 'select', 'separator', 'sheet',\r\n 'sidebar', 'skeleton', 'slider', 'sonner', 'switch', 'table', 'tabs', 'textarea', 'toast', 'toggle',\r\n 'toggle-group', 'tooltip',\r\n]);\r\n\r\ntype RegistryFile = {\r\n path: string;\r\n content: string;\r\n type: 'registry:ui' | 'registry:lib' | 'registry:hook' | 'registry:style' | 'registry:file';\r\n target: string;\r\n};\r\n\r\ntype RegistryCatalogFile = Omit<RegistryFile, 'content'>;\r\n\r\ntype RegistryItem = {\r\n $schema: typeof REGISTRY_ITEM_SCHEMA;\r\n name: string;\r\n type: 'registry:ui';\r\n title: string;\r\n dependencies?: string[];\r\n registryDependencies?: string[];\r\n files: RegistryFile[];\r\n};\r\n\r\ntype RegistryCatalogItem = Omit<RegistryItem, 'files'> & {\r\n files: RegistryCatalogFile[];\r\n};\r\n\r\ntype SourceFile = { absolutePath: string; relativePath: string };\r\n\r\nfunction toKebabCase(value: string) {\r\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[._\\s]+/g, '-').toLowerCase();\r\n}\r\n\r\nfunction titleFromName(name: string) {\r\n return name.replace(/(^|[-_])(\\w)/g, (_, __, character: string) => character.toUpperCase());\r\n}\r\n\r\nfunction packageName(specifier: string) {\r\n return specifier.startsWith('@') ? specifier.split('/').slice(0, 2).join('/') : specifier.split('/')[0];\r\n}\r\n\r\nfunction getOrigin(request: NextRequest) {\r\n return process.env.NEXT_PUBLIC_URL?.replace(/\\/$/, '') || request.nextUrl.origin;\r\n}\r\n\r\nasync function directoryExists(directory: string) {\r\n try {\r\n return (await stat(directory)).isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function getUiSourceDirectory() {\r\n if (process.env.UI_REGISTRY_SOURCE_DIR) {\r\n const configuredPath = resolve(process.env.UI_REGISTRY_SOURCE_DIR);\r\n if (await directoryExists(configuredPath)) return configuredPath;\r\n throw new Error(`UI_REGISTRY_SOURCE_DIR does not exist: ${configuredPath}`);\r\n }\r\n\r\n let currentDirectory = process.cwd();\r\n while (dirname(currentDirectory) !== currentDirectory) {\r\n const candidate = join(currentDirectory, 'packages', 'ui', 'src');\r\n if (await directoryExists(candidate)) return candidate;\r\n currentDirectory = dirname(currentDirectory);\r\n }\r\n throw new Error('Unable to find packages/ui/src. Set UI_REGISTRY_SOURCE_DIR to its absolute path.');\r\n}\r\n\r\nasync function getSourceFiles(directory: string, sourceDirectory = directory): Promise<SourceFile[]> {\r\n const entries = await readdir(directory, { withFileTypes: true });\r\n const files = await Promise.all(entries.map(async entry => {\r\n const absolutePath = join(directory, entry.name);\r\n if (entry.isDirectory()) return getSourceFiles(absolutePath, sourceDirectory);\r\n if (!SOURCE_EXTENSIONS.has(extname(entry.name)) || entry.name.endsWith('.d.ts') || /\\.(test|spec)\\.[^.]+$/.test(entry.name)) return [];\r\n return [{ absolutePath, relativePath: entry.name }];\r\n }));\r\n\r\n return files.flat().map(file => ({\r\n ...file,\r\n relativePath: relative(sourceDirectory, file.absolutePath).replaceAll('\\\\', '/'),\r\n }));\r\n}\r\n\r\nfunction getImportSpecifiers(source: string) {\r\n return [...source.matchAll(/(?:import|export)\\s+(?:type\\s+)?(?:[\\s\\S]*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g)]\r\n .map(match => match[1]);\r\n}\r\n\r\nfunction resolveSourceImport(sourceDirectory: string, sourceFile: string, specifier: string, sourceFiles: Map<string, SourceFile>) {\r\n let candidate: string | undefined;\r\n if (specifier.startsWith('@app/ui/')) candidate = specifier.slice('@app/ui/'.length);\r\n if (specifier.startsWith('.')) candidate = relative(sourceDirectory, resolve(dirname(sourceFile), specifier)).replaceAll('\\\\', '/');\r\n if (!candidate) return undefined;\r\n\r\n const normalizedCandidate = candidate.replace(/^\\.\\//, '');\r\n return sourceFiles.get(normalizedCandidate) ||\r\n sourceFiles.get(`${normalizedCandidate}.ts`) || sourceFiles.get(`${normalizedCandidate}.tsx`) ||\r\n sourceFiles.get(`${normalizedCandidate}/index.ts`) || sourceFiles.get(`${normalizedCandidate}/index.tsx`);\r\n}\r\n\r\nfunction rewriteUiImports(source: string, sourceFile: SourceFile, sourceDirectory: string, sourceFiles: Map<string, SourceFile>) {\r\n return source.replace(/(['\"])(@app\\/ui\\/[^'\"]+|\\.\\.?\\/[^'\"]+)\\1/g, (match, quote: string, specifier: string) => {\r\n const importedFile = resolveSourceImport(sourceDirectory, sourceFile.absolutePath, specifier, sourceFiles);\r\n return importedFile ? `${quote}${getImportPath(importedFile.relativePath)}${quote}` : match;\r\n });\r\n}\r\n\r\nfunction getImportPath(relativePath: string) {\r\n const extensionlessPath = relativePath.replace(/\\.(tsx?|mts|cts)$/, '');\r\n if (extensionlessPath.startsWith('components/')) return `@/components/ui/${extensionlessPath.slice('components/'.length)}`;\r\n if (extensionlessPath.startsWith('hooks/')) return `@/hooks/${extensionlessPath.slice('hooks/'.length)}`;\r\n if (extensionlessPath.startsWith('lib/')) return `@/lib/${extensionlessPath.slice('lib/'.length)}`;\r\n return `@/components/${extensionlessPath}`;\r\n}\r\n\r\nfunction getTargetPath(relativePath: string) {\r\n if (relativePath.startsWith('components/')) return `@ui/${relativePath.slice('components/'.length)}`;\r\n if (relativePath.startsWith('hooks/')) return `@hooks/${relativePath.slice('hooks/'.length)}`;\r\n if (relativePath.startsWith('lib/')) return `@lib/${relativePath.slice('lib/'.length)}`;\r\n return `@components/${relativePath}`;\r\n}\r\n\r\nfunction getRegistryFileType(relativePath: string): RegistryFile['type'] {\r\n if (relativePath.startsWith('components/')) return 'registry:ui';\r\n if (relativePath.startsWith('hooks/')) return 'registry:hook';\r\n if (relativePath.startsWith('theme/')) return 'registry:style';\r\n if (extname(relativePath) === '.json') return 'registry:file';\r\n return 'registry:lib';\r\n}\r\n\r\nfunction isPublishedFile(file: SourceFile) {\r\n const [directory] = file.relativePath.split('/');\r\n return PUBLISHED_DIRECTORIES.has(directory) && !/(^|\\/)index\\.[^.]+$/.test(file.relativePath);\r\n}\r\n\r\nfunction getRegistryItemName(file: SourceFile) {\r\n const [directory, ...path] = file.relativePath.split('/');\r\n const filename = path.join('/').replace(extname(file.relativePath), '');\r\n const name = toKebabCase(filename.replaceAll('/', '-'));\r\n return directory === 'components' ? name : `${directory}-${name}`;\r\n}\r\n\r\nasync function createRegistryCatalog(sourceDirectory: string, origin: string) {\r\n const files = (await getSourceFiles(sourceDirectory)).filter(file => PUBLISHED_DIRECTORIES.has(file.relativePath.split('/')[0]));\r\n const filesByRelativePath = new Map(files.map(file => [file.relativePath, file]));\r\n const entries = new Map(files.filter(isPublishedFile).map(file => [getRegistryItemName(file), file]));\r\n const entryNamesByPath = new Map([...entries].map(([name, file]) => [file.relativePath, name]));\r\n const includedItems = new Set([...entries].filter(([name, file]) =>\r\n !file.relativePath.startsWith('components/') || name === 'button' || !SHADCN_COMPONENTS.has(name)\r\n ).map(([name]) => name));\r\n\r\n async function getItem(name: string): Promise<RegistryItem | undefined> {\r\n const entry = entries.get(name);\r\n if (!entry || !includedItems.has(name)) return undefined;\r\n\r\n const filesToInclude = new Map<string, SourceFile>();\r\n const externalDependencies = new Set<string>();\r\n const registryDependencies = new Set<string>();\r\n const pendingFiles = [entry];\r\n\r\n while (pendingFiles.length) {\r\n const file = pendingFiles.pop()!;\r\n if (filesToInclude.has(file.relativePath)) continue;\r\n filesToInclude.set(file.relativePath, file);\r\n const source = await readFile(file.absolutePath, 'utf8');\r\n\r\n for (const specifier of getImportSpecifiers(source)) {\r\n const localFile = resolveSourceImport(sourceDirectory, file.absolutePath, specifier, filesByRelativePath);\r\n const dependencyName = localFile && entryNamesByPath.get(localFile.relativePath);\r\n if (localFile?.relativePath.startsWith('components/')) {\r\n const componentName = toKebabCase(basename(localFile.relativePath, extname(localFile.relativePath)));\r\n if (dependencyName !== name) {\r\n registryDependencies.add(includedItems.has(componentName) ? `${origin}/r/${componentName}.json` : componentName);\r\n }\r\n } else if (localFile && dependencyName && dependencyName !== name && includedItems.has(dependencyName)) {\r\n registryDependencies.add(`${origin}/r/${dependencyName}.json`);\r\n } else if (localFile) {\r\n pendingFiles.push(localFile);\r\n } else if (!specifier.startsWith('.') && !specifier.startsWith('@app/ui/') && !specifier.startsWith('node:') && specifier !== 'react' && specifier !== 'react-dom') {\r\n externalDependencies.add(packageName(specifier));\r\n }\r\n }\r\n }\r\n\r\n const registryFiles = await Promise.all([...filesToInclude.values()].sort((left, right) => left.relativePath.localeCompare(right.relativePath)).map(async file => ({\r\n path: file.relativePath,\r\n content: rewriteUiImports(await readFile(file.absolutePath, 'utf8'), file, sourceDirectory, filesByRelativePath),\r\n type: getRegistryFileType(file.relativePath),\r\n target: getTargetPath(file.relativePath),\r\n })));\r\n\r\n return {\r\n $schema: REGISTRY_ITEM_SCHEMA,\r\n name,\r\n type: 'registry:ui',\r\n title: titleFromName(name),\r\n ...(externalDependencies.size && { dependencies: [...externalDependencies].sort() }),\r\n ...(registryDependencies.size && { registryDependencies: [...registryDependencies].sort() }),\r\n files: registryFiles,\r\n };\r\n }\r\n\r\n async function getCatalogItem(name: string): Promise<RegistryCatalogItem | undefined> {\r\n const item = await getItem(name);\r\n if (!item) return undefined;\r\n return {\r\n ...item,\r\n files: item.files.map(file => ({\r\n path: file.path,\r\n type: file.type,\r\n target: file.target,\r\n })),\r\n };\r\n }\r\n\r\n return { items: includedItems, getCatalogItem, getItem };\r\n}\r\n\r\nfunction jsonResponse(body: unknown, status = 200) {\r\n return Response.json(body, {\r\n status,\r\n headers: { 'X-Frame-Options': 'SAMEORIGIN', 'X-Robots-Tag': 'noindex, follow' },\r\n });\r\n}\r\n\r\nexport function getRegistry() {\r\n return async function (request: NextRequest) {\r\n const sourceDirectory = await getUiSourceDirectory();\r\n const catalog = await createRegistryCatalog(sourceDirectory, getOrigin(request));\r\n const items = (await Promise.all([...catalog.items].sort().map(name => catalog.getCatalogItem(name)))).filter(Boolean);\r\n return jsonResponse({ $schema: REGISTRY_SCHEMA, name: 'bom-ui', homepage: getOrigin(request), items });\r\n };\r\n}\r\n\r\nexport function getRegistryItem() {\r\n return async function (request: NextRequest, { params: getParams }: { params: Promise<{ slug: string[] }> }) {\r\n const { slug } = await getParams;\r\n const name = slug.at(-1)?.replace(/\\.json$/, '');\r\n if (!name) return jsonResponse({ error: 'Registry item name is required.' }, 404);\r\n\r\n const sourceDirectory = await getUiSourceDirectory();\r\n const item = await (await createRegistryCatalog(sourceDirectory, getOrigin(request))).getItem(name);\r\n return item ? jsonResponse(item) : jsonResponse({ error: `Registry item not found: ${name}` }, 404);\r\n };\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"registry.handler.js","names":["value: string","name: string","character: string","specifier: string","request: NextRequest","directory: string","source: string","sourceDirectory: string","sourceFile: string","sourceFiles: Map<string, SourceFile>","candidate: string | undefined","sourceFile: SourceFile","quote: string","relativePath: string","file: SourceFile","origin: string","body: unknown"],"sources":["../../../src/server/handlers/registry.handler.ts"],"sourcesContent":["import { NextRequest } from 'next/server';\r\nimport { readdir, readFile, stat } from 'node:fs/promises';\r\nimport { basename, dirname, extname, join, relative, resolve } from 'node:path';\r\n\r\nconst REGISTRY_SCHEMA = 'https://ui.shadcn.com/schema/registry.json';\r\nconst REGISTRY_ITEM_SCHEMA = 'https://ui.shadcn.com/schema/registry-item.json';\r\nconst SOURCE_EXTENSIONS = new Set(['.css', '.json', '.ts', '.tsx']);\r\nconst PUBLISHED_DIRECTORIES = new Set(['components', 'examples', 'hooks', 'lazy', 'lib', 'sections', 'theme']);\r\nconst SHADCN_COMPONENTS = new Set([\r\n 'accordion', 'alert-dialog', 'alert', 'aspect-ratio', 'avatar', 'badge', 'breadcrumb', 'calendar', 'card',\r\n 'carousel', 'chart', 'checkbox', 'collapsible', 'combobox', 'command', 'context-menu', 'dialog', 'drawer',\r\n 'dropdown-menu', 'form', 'hover-card', 'input', 'input-otp', 'label', 'menubar', 'navigation-menu',\r\n 'pagination', 'popover', 'progress', 'radio-group', 'resizable', 'scroll-area', 'select', 'separator', 'sheet',\r\n 'sidebar', 'skeleton', 'slider', 'sonner', 'switch', 'table', 'tabs', 'textarea', 'toast', 'toggle',\r\n 'toggle-group', 'tooltip',\r\n]);\r\n\r\ntype RegistryFile = {\r\n path: string;\r\n content: string;\r\n type: 'registry:ui' | 'registry:lib' | 'registry:hook' | 'registry:style' | 'registry:file';\r\n target: string;\r\n};\r\n\r\ntype RegistryCatalogFile = Omit<RegistryFile, 'content'>;\r\n\r\ntype RegistryItem = {\r\n $schema: typeof REGISTRY_ITEM_SCHEMA;\r\n name: string;\r\n type: 'registry:ui';\r\n title: string;\r\n dependencies?: string[];\r\n registryDependencies?: string[];\r\n files: RegistryFile[];\r\n};\r\n\r\ntype RegistryCatalogItem = Omit<RegistryItem, 'files'> & {\r\n files: RegistryCatalogFile[];\r\n};\r\n\r\ntype SourceFile = { absolutePath: string; relativePath: string };\r\n\r\nfunction toKebabCase(value: string) {\r\n return value.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[._\\s]+/g, '-').toLowerCase();\r\n}\r\n\r\nfunction titleFromName(name: string) {\r\n return name.replace(/(^|[-_])(\\w)/g, (_, __, character: string) => character.toUpperCase());\r\n}\r\n\r\nfunction packageName(specifier: string) {\r\n return specifier.startsWith('@') ? specifier.split('/').slice(0, 2).join('/') : specifier.split('/')[0];\r\n}\r\n\r\nfunction getOrigin(request: NextRequest) {\r\n return process.env.NEXT_PUBLIC_URL?.replace(/\\/$/, '') || request.nextUrl.origin;\r\n}\r\n\r\nasync function directoryExists(directory: string) {\r\n try {\r\n return (await stat(directory)).isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function getUiSourceDirectory() {\r\n if (process.env.UI_REGISTRY_SOURCE_DIR) {\r\n const configuredPath = resolve(process.env.UI_REGISTRY_SOURCE_DIR);\r\n if (await directoryExists(configuredPath)) return configuredPath;\r\n throw new Error(`UI_REGISTRY_SOURCE_DIR does not exist: ${configuredPath}`);\r\n }\r\n\r\n let currentDirectory = process.cwd();\r\n while (dirname(currentDirectory) !== currentDirectory) {\r\n const candidate = join(currentDirectory, 'packages', 'ui', 'src');\r\n if (await directoryExists(candidate)) return candidate;\r\n currentDirectory = dirname(currentDirectory);\r\n }\r\n throw new Error('Unable to find packages/ui/src. Set UI_REGISTRY_SOURCE_DIR to its absolute path.');\r\n}\r\n\r\nasync function getSourceFiles(directory: string, sourceDirectory = directory): Promise<SourceFile[]> {\r\n const entries = await readdir(directory, { withFileTypes: true });\r\n const files = await Promise.all(entries.map(async entry => {\r\n const absolutePath = join(directory, entry.name);\r\n if (entry.isDirectory()) return getSourceFiles(absolutePath, sourceDirectory);\r\n if (!SOURCE_EXTENSIONS.has(extname(entry.name)) || entry.name.endsWith('.d.ts') || /\\.(test|spec)\\.[^.]+$/.test(entry.name)) return [];\r\n return [{ absolutePath, relativePath: entry.name }];\r\n }));\r\n\r\n return files.flat().map(file => ({\r\n ...file,\r\n relativePath: relative(sourceDirectory, file.absolutePath).replaceAll('\\\\', '/'),\r\n }));\r\n}\r\n\r\nfunction getImportSpecifiers(source: string) {\r\n return [...source.matchAll(/(?:import|export)\\s+(?:type\\s+)?(?:[\\s\\S]*?\\s+from\\s+)?['\"]([^'\"]+)['\"]/g)]\r\n .map(match => match[1]);\r\n}\r\n\r\nfunction resolveSourceImport(sourceDirectory: string, sourceFile: string, specifier: string, sourceFiles: Map<string, SourceFile>) {\r\n let candidate: string | undefined;\r\n if (specifier.startsWith('@app/ui/')) candidate = specifier.slice('@app/ui/'.length);\r\n if (specifier.startsWith('.')) candidate = relative(sourceDirectory, resolve(dirname(sourceFile), specifier)).replaceAll('\\\\', '/');\r\n if (!candidate) return undefined;\r\n\r\n const normalizedCandidate = candidate.replace(/^\\.\\//, '');\r\n return sourceFiles.get(normalizedCandidate) ||\r\n sourceFiles.get(`${normalizedCandidate}.ts`) || sourceFiles.get(`${normalizedCandidate}.tsx`) ||\r\n sourceFiles.get(`${normalizedCandidate}/index.ts`) || sourceFiles.get(`${normalizedCandidate}/index.tsx`);\r\n}\r\n\r\nfunction rewriteUiImports(source: string, sourceFile: SourceFile, sourceDirectory: string, sourceFiles: Map<string, SourceFile>) {\r\n return source.replace(/(['\"])(@app\\/ui\\/[^'\"]+|\\.\\.?\\/[^'\"]+)\\1/g, (match, quote: string, specifier: string) => {\r\n const importedFile = resolveSourceImport(sourceDirectory, sourceFile.absolutePath, specifier, sourceFiles);\r\n return importedFile ? `${quote}${getImportPath(importedFile.relativePath)}${quote}` : match;\r\n });\r\n}\r\n\r\nfunction getImportPath(relativePath: string) {\r\n const extensionlessPath = relativePath.replace(/\\.(tsx?|mts|cts)$/, '');\r\n if (extensionlessPath.startsWith('components/')) return `@/components/ui/${extensionlessPath.slice('components/'.length)}`;\r\n if (extensionlessPath.startsWith('hooks/')) return `@/hooks/${extensionlessPath.slice('hooks/'.length)}`;\r\n if (extensionlessPath.startsWith('lib/')) return `@/lib/${extensionlessPath.slice('lib/'.length)}`;\r\n return `@/components/${extensionlessPath}`;\r\n}\r\n\r\nfunction getTargetPath(relativePath: string) {\r\n if (relativePath.startsWith('components/')) return `@ui/${relativePath.slice('components/'.length)}`;\r\n if (relativePath.startsWith('hooks/')) return `@hooks/${relativePath.slice('hooks/'.length)}`;\r\n if (relativePath.startsWith('lib/')) return `@lib/${relativePath.slice('lib/'.length)}`;\r\n return `@components/${relativePath}`;\r\n}\r\n\r\nfunction getRegistryFileType(relativePath: string): RegistryFile['type'] {\r\n if (relativePath.startsWith('components/')) return 'registry:ui';\r\n if (relativePath.startsWith('hooks/')) return 'registry:hook';\r\n if (relativePath.startsWith('theme/')) return 'registry:style';\r\n if (extname(relativePath) === '.json') return 'registry:file';\r\n return 'registry:lib';\r\n}\r\n\r\nfunction isPublishedFile(file: SourceFile) {\r\n const [directory] = file.relativePath.split('/');\r\n return PUBLISHED_DIRECTORIES.has(directory) && !/(^|\\/)index\\.[^.]+$/.test(file.relativePath);\r\n}\r\n\r\nfunction getRegistryItemName(file: SourceFile) {\r\n const [directory, ...path] = file.relativePath.split('/');\r\n const filename = path.join('/').replace(extname(file.relativePath), '');\r\n const name = toKebabCase(filename.replaceAll('/', '-'));\r\n return directory === 'components' ? name : `${directory}-${name}`;\r\n}\r\n\r\nasync function createRegistryCatalog(sourceDirectory: string, origin: string) {\r\n const files = (await getSourceFiles(sourceDirectory)).filter(file => PUBLISHED_DIRECTORIES.has(file.relativePath.split('/')[0]));\r\n const filesByRelativePath = new Map(files.map(file => [file.relativePath, file]));\r\n const entries = new Map(files.filter(isPublishedFile).map(file => [getRegistryItemName(file), file]));\r\n const entryNamesByPath = new Map([...entries].map(([name, file]) => [file.relativePath, name]));\r\n const includedItems = new Set([...entries].filter(([name, file]) =>\r\n !file.relativePath.startsWith('components/') || name === 'button' || !SHADCN_COMPONENTS.has(name)\r\n ).map(([name]) => name));\r\n\r\n async function getItem(name: string): Promise<RegistryItem | undefined> {\r\n const entry = entries.get(name);\r\n if (!entry || !includedItems.has(name)) return undefined;\r\n\r\n const filesToInclude = new Map<string, SourceFile>();\r\n const externalDependencies = new Set<string>();\r\n const registryDependencies = new Set<string>();\r\n const pendingFiles = [entry];\r\n\r\n while (pendingFiles.length) {\r\n const file = pendingFiles.pop()!;\r\n if (filesToInclude.has(file.relativePath)) continue;\r\n filesToInclude.set(file.relativePath, file);\r\n const source = await readFile(file.absolutePath, 'utf8');\r\n\r\n for (const specifier of getImportSpecifiers(source)) {\r\n const localFile = resolveSourceImport(sourceDirectory, file.absolutePath, specifier, filesByRelativePath);\r\n const dependencyName = localFile && entryNamesByPath.get(localFile.relativePath);\r\n if (localFile?.relativePath.startsWith('components/')) {\r\n const componentName = toKebabCase(basename(localFile.relativePath, extname(localFile.relativePath)));\r\n if (dependencyName !== name) {\r\n registryDependencies.add(includedItems.has(componentName) ? `${origin}/r/${componentName}.json` : componentName);\r\n }\r\n } else if (localFile && dependencyName && dependencyName !== name && includedItems.has(dependencyName)) {\r\n registryDependencies.add(`${origin}/r/${dependencyName}.json`);\r\n } else if (localFile) {\r\n pendingFiles.push(localFile);\r\n } else if (!specifier.startsWith('.') && !specifier.startsWith('@app/ui/') && !specifier.startsWith('node:') && specifier !== 'react' && specifier !== 'react-dom') {\r\n externalDependencies.add(packageName(specifier));\r\n }\r\n }\r\n }\r\n\r\n const registryFiles = await Promise.all([...filesToInclude.values()].sort((left, right) => left.relativePath.localeCompare(right.relativePath)).map(async file => ({\r\n path: file.relativePath,\r\n content: rewriteUiImports(await readFile(file.absolutePath, 'utf8'), file, sourceDirectory, filesByRelativePath),\r\n type: getRegistryFileType(file.relativePath),\r\n target: getTargetPath(file.relativePath),\r\n })));\r\n\r\n return {\r\n $schema: REGISTRY_ITEM_SCHEMA,\r\n name,\r\n type: 'registry:ui',\r\n title: titleFromName(name),\r\n ...(externalDependencies.size && { dependencies: [...externalDependencies].sort() }),\r\n ...(registryDependencies.size && { registryDependencies: [...registryDependencies].sort() }),\r\n files: registryFiles,\r\n };\r\n }\r\n\r\n async function getCatalogItem(name: string): Promise<RegistryCatalogItem | undefined> {\r\n const item = await getItem(name);\r\n if (!item) return undefined;\r\n return {\r\n ...item,\r\n files: item.files.map(file => ({\r\n path: file.path,\r\n type: file.type,\r\n target: file.target,\r\n })),\r\n };\r\n }\r\n\r\n return { items: includedItems, getCatalogItem, getItem };\r\n}\r\n\r\nfunction jsonResponse(body: unknown, status = 200) {\r\n return Response.json(body, {\r\n status,\r\n headers: { 'X-Frame-Options': 'SAMEORIGIN', 'X-Robots-Tag': 'noindex, follow' },\r\n });\r\n}\r\n\r\nexport function getRegistry() {\r\n return async function (request: NextRequest) {\r\n const sourceDirectory = await getUiSourceDirectory();\r\n const catalog = await createRegistryCatalog(sourceDirectory, getOrigin(request));\r\n const items = (await Promise.all([...catalog.items].sort().map(name => catalog.getCatalogItem(name)))).filter(Boolean);\r\n return jsonResponse({ $schema: REGISTRY_SCHEMA, name: 'bom-ui', homepage: getOrigin(request), items });\r\n };\r\n}\r\n\r\nexport function getRegistryItem() {\r\n return async function (request: NextRequest, { params: getParams }: { params: Promise<{ slug: string[] }> }) {\r\n const { slug } = await getParams;\r\n const name = slug.at(-1)?.replace(/\\.json$/, '');\r\n if (!name) return jsonResponse({ error: 'Registry item name is required.' }, 404);\r\n\r\n const sourceDirectory = await getUiSourceDirectory();\r\n const item = await (await createRegistryCatalog(sourceDirectory, getOrigin(request))).getItem(name);\r\n return item ? jsonResponse(item) : jsonResponse({ error: `Registry item not found: ${name}` }, 404);\r\n };\r\n}\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"route.handler.d.ts","names":[],"sources":["../../../src/server/handlers/route.handler.ts"],"mappings":";;;;;;;AAkBA;AAA+B;AAAiB;AAAR;AACN;AAAW;AAAA;AAAA,iBAD7B,eAAA,CAC6B,MAAA,EADL,OACK,CADG,eACH,CAAA,CAAA,EAAA,CAAA,OAAA,EAAX,WAAW,EAAA,GAAA,OAAA,CAAA,QAAA,CAAA"}
1
+ {"version":3,"file":"route.handler.d.ts","names":[],"sources":["../../../src/server/handlers/route.handler.ts"],"sourcesContent":[],"mappings":";;;;;;;AAkBA;;;;;;;AAC6C,iBAD7B,eAAA,CAC6B,MAAA,EADL,OACK,CADG,eACH,CAAA,CAAA,EAAA,CAAA,OAAA,EAAX,WAAW,EAAA,GAAA,OAAA,CAAA,QAAA,CAAA"}
@@ -5,15 +5,24 @@ import { qsDeserialize } from "@websolutespa/bom-core";
5
5
  import { getRouteSnapshot, getRoutes, sortCollection, whereCollection } from "@websolutespa/payload-plugin-bowl";
6
6
  import { createPayloadRequest, getPayload } from "payload";
7
7
  import { ResponseNotFound, ResponseSuccess } from "@websolutespa/payload-utils/server";
8
+
8
9
  //#region src/server/handlers/route.handler.ts
9
10
  /**
11
+
10
12
  * Creates the internal `/-route` GET handler used by middleware to resolve CMS
13
+
11
14
  * paths, route schemas, and redirects before a page is rendered.
15
+
12
16
  *
17
+
13
18
  * One Payload request is created per incoming API request so authentication and
19
+
14
20
  * query context are shared by every route operation. The route service then
21
+
15
22
  * reuses its snapshot cache, which avoids rebuilding the complete route graph
23
+
16
24
  * for repeated market, locale, and access contexts.
25
+
17
26
  */
18
27
  function getRouteHandler(config) {
19
28
  return async function(request) {
@@ -54,8 +63,8 @@ function getRouteHandler(config) {
54
63
  const url = new URL(href);
55
64
  const urlBeforeRedirect = hrefBeforeRedirect ? new URL(hrefBeforeRedirect) : null;
56
65
  const sanitizedHref = sanitizeHref(url, urlBeforeRedirect);
57
- const { payload } = req;
58
- const payloadResponse = await payload.find({
66
+ const { payload: payload$1 } = req;
67
+ const payloadResponse = await payload$1.find({
59
68
  collection: "redirect",
60
69
  where: { isActive: { equals: true } },
61
70
  sort: "order",
@@ -116,7 +125,7 @@ function getRouteHandler(config) {
116
125
  }
117
126
  };
118
127
  }
128
+
119
129
  //#endregion
120
130
  export { getRouteHandler };
121
-
122
131
  //# sourceMappingURL=route.handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"route.handler.js","names":["getPayload_"],"sources":["../../../src/server/handlers/route.handler.ts"],"sourcesContent":["import { IRedirect, IRoute, qsDeserialize } from '@websolutespa/bom-core';\r\nimport { getRoutes, getRouteSnapshot, sortCollection, whereCollection } from '@websolutespa/payload-plugin-bowl';\r\nimport { ResponseNotFound, ResponseSuccess } from '@websolutespa/payload-utils/server';\r\nimport { NextRequest } from 'next/server';\r\nimport { createPayloadRequest, getPayload as getPayload_, PayloadRequest, SanitizedConfig } from 'payload';\r\nimport { guest } from '../../lib/const';\r\nimport { sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl } from '../../lib/utils';\r\nimport { getHandlerErrorResponse } from './error-response';\r\n\r\n/**\r\n * Creates the internal `/-route` GET handler used by middleware to resolve CMS\r\n * paths, route schemas, and redirects before a page is rendered.\r\n *\r\n * One Payload request is created per incoming API request so authentication and\r\n * query context are shared by every route operation. The route service then\r\n * reuses its snapshot cache, which avoids rebuilding the complete route graph\r\n * for repeated market, locale, and access contexts.\r\n */\r\nexport function getRouteHandler(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest) {\r\n try {\r\n const searchParams = request.nextUrl.searchParams;\r\n const pathname = searchParams.get('pathname') || undefined;\r\n const href = searchParams.get('href') || undefined;\r\n const hrefBeforeRedirect = searchParams.get('hrefBeforeRedirect') || undefined;\r\n const schema = searchParams.get('schema') || undefined;\r\n const market = searchParams.get('market') || undefined;\r\n const locale = searchParams.get('locale') || undefined;\r\n const payload = await getPayload_({ config });\r\n const req: PayloadRequest = await createPayloadRequest({\r\n config,\r\n request,\r\n });\r\n req.payload = payload;\r\n req.user = guest as never;\r\n if (schema && market && locale) {\r\n // Schema lookups are used by middleware such as login protection. They\r\n // resolve directly from the snapshot instead of enumerating routes.\r\n req.query = { locale, market };\r\n const route = (await getRouteSnapshot(req)).getSchema(schema, market, locale);\r\n return route ? ResponseSuccess({ route }) : ResponseNotFound();\r\n }\r\n // console.log('routes.length', routes.length);\r\n if (pathname && href) {\r\n // Resolve the public path first. A successful result bypasses the\r\n // redirect collection query, the costliest branch for normal traffic.\r\n const resolution = (await getRouteSnapshot(req)).resolve(pathname);\r\n /*\r\n console.log('pathname', pathname);\r\n console.log('href', href);\r\n console.log('hrefBeforeRedirect', hrefBeforeRedirect);\r\n */\r\n const route = resolution.route;\r\n // console.log('route', route, 'pathname', pathname);\r\n if (route !== undefined) {\r\n return ResponseSuccess({\r\n parent: resolution.parent,\r\n route: {\r\n ...route,\r\n ...(resolution.splat ? { splat: resolution.splat } : {}),\r\n },\r\n });\r\n } else {\r\n const url = new URL(href);\r\n const urlBeforeRedirect = hrefBeforeRedirect ? new URL(hrefBeforeRedirect) : null;\r\n const sanitizedHref = sanitizeHref(url, urlBeforeRedirect);\r\n // Query only active redirects and request depth 0 because matching\r\n // needs scalar fields only; this minimizes Payload serialization.\r\n const { payload } = req;\r\n const payloadResponse = await payload.find({\r\n collection: 'redirect',\r\n where: {\r\n isActive: {\r\n equals: true,\r\n },\r\n },\r\n sort: 'order',\r\n depth: 0,\r\n limit: 10000,\r\n pagination: false,\r\n req,\r\n overrideAccess: true,\r\n });\r\n let redirects = (payloadResponse.docs ? payloadResponse.docs : []) as unknown as IRedirect[];\r\n redirects = redirects.map(x => ({\r\n ...x,\r\n from: sanitizeRedirectFrom(x.from, url, urlBeforeRedirect),\r\n to: sanitizeRedirectTo(x.to),\r\n }));\r\n // redirects.sort((a, b) => a.order - b.order);\r\n // exact match redirect resolver\r\n const exactMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const redirectUrl = sanitizeRedirectUrl(redirect.to, url);\r\n // console.log('>>>>>>>>>> findRoute exactMatchResolver', status, redirectUrl, redirect.to);\r\n return Response.json({ redirectUrl }, { status });\r\n } else {\r\n return Response.json('gone', { status });\r\n }\r\n };\r\n // check exact match redirects\r\n const exactMatchRedirect = redirects.find(x => x.from === sanitizedHref);\r\n if (exactMatchRedirect !== undefined) {\r\n // Exact matching avoids compiling patterns for the common case.\r\n return exactMatchResolver(exactMatchRedirect);\r\n }\r\n // pattern match redirect resolver\r\n const patternMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const regexp = new RegExp(redirect.from);\r\n let i = 0;\r\n let redirectUrl = (redirect.to as string).replace(/\\*/g, (...rest) => {\r\n return `$${++i}`;\r\n });\r\n redirectUrl = sanitizedHref.replace(regexp, redirectUrl);\r\n // console.log('>>>>>>>>>> findRoute patternMatchResolver', status, redirectUrl, redirect.to);\r\n return Response.json({ redirectUrl }, { status });\r\n } else {\r\n return Response.json('gone', { status });\r\n }\r\n };\r\n // check redirects by pattern\r\n redirects.forEach(x => {\r\n let expression = x.from;\r\n // wrapping catchall in (.*)\r\n expression = expression.replace(/\\*(?!\\))/g, '(.*)');\r\n // wrapping expression in ^...$\r\n expression = `^${expression.replace(/(^\\^)|(\\$$)/g, '')}$`;\r\n x.from = expression;\r\n });\r\n // check if a regex pattern redirect does match\r\n const firstMatch = redirects.find(x => sanitizedHref.match(x.from));\r\n // console.log('>>>>>>>>>> findRoute firstMatch', firstMatch);\r\n if (firstMatch) {\r\n return patternMatchResolver(firstMatch);\r\n }\r\n // console.error('not found', collection);\r\n // Preserve the nearest parent so middleware can render a localized\r\n // 404 without a second snapshot lookup.\r\n return ResponseSuccess({ parent: resolution.parent });\r\n }\r\n } else {\r\n // The collection branch serves management/list callers. Apply in-memory\r\n // filtering after the cached route graph is built, avoiding duplicate\r\n // collection queries for each filter or sort combination.\r\n const query = qsDeserialize(decodeURIComponent(searchParams.toString()));\r\n req.query = query;\r\n const routes = await getRoutes(req);\r\n let items = await whereCollection<IRoute>(routes, query.where);\r\n items = await sortCollection(items, query.sort);\r\n return ResponseSuccess(items);\r\n // return ResponseBadRequest();\r\n }\r\n } catch (error: unknown) {\r\n console.error('routeGetHandler.error', error);\r\n return getHandlerErrorResponse(error);\r\n }\r\n };\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAgB,gBAAgB,QAAkC;CAChE,OAAO,eAAgB,SAAsB;EAC3C,IAAI;GACF,MAAM,eAAe,QAAQ,QAAQ;GACrC,MAAM,WAAW,aAAa,IAAI,UAAU,KAAK,KAAA;GACjD,MAAM,OAAO,aAAa,IAAI,MAAM,KAAK,KAAA;GACzC,MAAM,qBAAqB,aAAa,IAAI,oBAAoB,KAAK,KAAA;GACrE,MAAM,SAAS,aAAa,IAAI,QAAQ,KAAK,KAAA;GAC7C,MAAM,SAAS,aAAa,IAAI,QAAQ,KAAK,KAAA;GAC7C,MAAM,SAAS,aAAa,IAAI,QAAQ,KAAK,KAAA;GAC7C,MAAM,UAAU,MAAMA,WAAY,EAAE,OAAO,CAAC;GAC5C,MAAM,MAAsB,MAAM,qBAAqB;IACrD;IACA;GACF,CAAC;GACD,IAAI,UAAU;GACd,IAAI,OAAO;GACX,IAAI,UAAU,UAAU,QAAQ;IAG9B,IAAI,QAAQ;KAAE;KAAQ;IAAO;IAC7B,MAAM,SAAS,MAAM,iBAAiB,GAAG,EAAA,CAAG,UAAU,QAAQ,QAAQ,MAAM;IAC5E,OAAO,QAAQ,gBAAgB,EAAE,MAAM,CAAC,IAAI,iBAAiB;GAC/D;GAEA,IAAI,YAAY,MAAM;IAGpB,MAAM,cAAc,MAAM,iBAAiB,GAAG,EAAA,CAAG,QAAQ,QAAQ;IAMjE,MAAM,QAAQ,WAAW;IAEzB,IAAI,UAAU,KAAA,GACZ,OAAO,gBAAgB;KACrB,QAAQ,WAAW;KACnB,OAAO;MACL,GAAG;MACH,GAAI,WAAW,QAAQ,EAAE,OAAO,WAAW,MAAM,IAAI,CAAC;KACxD;IACF,CAAC;SACI;KACL,MAAM,MAAM,IAAI,IAAI,IAAI;KACxB,MAAM,oBAAoB,qBAAqB,IAAI,IAAI,kBAAkB,IAAI;KAC7E,MAAM,gBAAgB,aAAa,KAAK,iBAAiB;KAGzD,MAAM,EAAE,YAAY;KACpB,MAAM,kBAAkB,MAAM,QAAQ,KAAK;MACzC,YAAY;MACZ,OAAO,EACL,UAAU,EACR,QAAQ,KACV,EACF;MACA,MAAM;MACN,OAAO;MACP,OAAO;MACP,YAAY;MACZ;MACA,gBAAgB;KAClB,CAAC;KACD,IAAI,YAAa,gBAAgB,OAAO,gBAAgB,OAAO,CAAC;KAChE,YAAY,UAAU,KAAI,OAAM;MAC9B,GAAG;MACH,MAAM,qBAAqB,EAAE,MAAM,KAAK,iBAAiB;MACzD,IAAI,mBAAmB,EAAE,EAAE;KAC7B,EAAE;KAGF,MAAM,sBAAsB,aAAwB;MAClD,MAAM,SAAiB,SAAS,SAAS,MAAM,KAAK;MACpD,IAAI,SAAS,KAAK;OAChB,MAAM,cAAc,oBAAoB,SAAS,IAAI,GAAG;OAExD,OAAO,SAAS,KAAK,EAAE,YAAY,GAAG,EAAE,OAAO,CAAC;MAClD,OACE,OAAO,SAAS,KAAK,QAAQ,EAAE,OAAO,CAAC;KAE3C;KAEA,MAAM,qBAAqB,UAAU,MAAK,MAAK,EAAE,SAAS,aAAa;KACvE,IAAI,uBAAuB,KAAA,GAEzB,OAAO,mBAAmB,kBAAkB;KAG9C,MAAM,wBAAwB,aAAwB;MACpD,MAAM,SAAiB,SAAS,SAAS,MAAM,KAAK;MACpD,IAAI,SAAS,KAAK;OAChB,MAAM,SAAS,IAAI,OAAO,SAAS,IAAI;OACvC,IAAI,IAAI;OACR,IAAI,cAAe,SAAS,GAAc,QAAQ,QAAQ,GAAG,SAAS;QACpE,OAAO,IAAI,EAAE;OACf,CAAC;OACD,cAAc,cAAc,QAAQ,QAAQ,WAAW;OAEvD,OAAO,SAAS,KAAK,EAAE,YAAY,GAAG,EAAE,OAAO,CAAC;MAClD,OACE,OAAO,SAAS,KAAK,QAAQ,EAAE,OAAO,CAAC;KAE3C;KAEA,UAAU,SAAQ,MAAK;MACrB,IAAI,aAAa,EAAE;MAEnB,aAAa,WAAW,QAAQ,aAAa,MAAM;MAEnD,aAAa,IAAI,WAAW,QAAQ,gBAAgB,EAAE,EAAE;MACxD,EAAE,OAAO;KACX,CAAC;KAED,MAAM,aAAa,UAAU,MAAK,MAAK,cAAc,MAAM,EAAE,IAAI,CAAC;KAElE,IAAI,YACF,OAAO,qBAAqB,UAAU;KAKxC,OAAO,gBAAgB,EAAE,QAAQ,WAAW,OAAO,CAAC;IACtD;GACF,OAAO;IAIL,MAAM,QAAQ,cAAc,mBAAmB,aAAa,SAAS,CAAC,CAAC;IACvE,IAAI,QAAQ;IACZ,MAAM,SAAS,MAAM,UAAU,GAAG;IAClC,IAAI,QAAQ,MAAM,gBAAwB,QAAQ,MAAM,KAAK;IAC7D,QAAQ,MAAM,eAAe,OAAO,MAAM,IAAI;IAC9C,OAAO,gBAAgB,KAAK;GAE9B;EACF,SAAS,OAAgB;GACvB,QAAQ,MAAM,yBAAyB,KAAK;GAC5C,OAAO,wBAAwB,KAAK;EACtC;CACF;AACF"}
1
+ {"version":3,"file":"route.handler.js","names":["config: Promise<SanitizedConfig>","request: NextRequest","getPayload_","req: PayloadRequest","payload","redirect: IRedirect","status: number","error: unknown"],"sources":["../../../src/server/handlers/route.handler.ts"],"sourcesContent":["import { IRedirect, IRoute, qsDeserialize } from '@websolutespa/bom-core';\r\nimport { getRoutes, getRouteSnapshot, sortCollection, whereCollection } from '@websolutespa/payload-plugin-bowl';\r\nimport { ResponseNotFound, ResponseSuccess } from '@websolutespa/payload-utils/server';\r\nimport { NextRequest } from 'next/server';\r\nimport { createPayloadRequest, getPayload as getPayload_, PayloadRequest, SanitizedConfig } from 'payload';\r\nimport { guest } from '../../lib/const';\r\nimport { sanitizeHref, sanitizeRedirectFrom, sanitizeRedirectTo, sanitizeRedirectUrl } from '../../lib/utils';\r\nimport { getHandlerErrorResponse } from './error-response';\r\n\r\n/**\r\n * Creates the internal `/-route` GET handler used by middleware to resolve CMS\r\n * paths, route schemas, and redirects before a page is rendered.\r\n *\r\n * One Payload request is created per incoming API request so authentication and\r\n * query context are shared by every route operation. The route service then\r\n * reuses its snapshot cache, which avoids rebuilding the complete route graph\r\n * for repeated market, locale, and access contexts.\r\n */\r\nexport function getRouteHandler(config: Promise<SanitizedConfig>) {\r\n return async function (request: NextRequest) {\r\n try {\r\n const searchParams = request.nextUrl.searchParams;\r\n const pathname = searchParams.get('pathname') || undefined;\r\n const href = searchParams.get('href') || undefined;\r\n const hrefBeforeRedirect = searchParams.get('hrefBeforeRedirect') || undefined;\r\n const schema = searchParams.get('schema') || undefined;\r\n const market = searchParams.get('market') || undefined;\r\n const locale = searchParams.get('locale') || undefined;\r\n const payload = await getPayload_({ config });\r\n const req: PayloadRequest = await createPayloadRequest({\r\n config,\r\n request,\r\n });\r\n req.payload = payload;\r\n req.user = guest as never;\r\n if (schema && market && locale) {\r\n // Schema lookups are used by middleware such as login protection. They\r\n // resolve directly from the snapshot instead of enumerating routes.\r\n req.query = { locale, market };\r\n const route = (await getRouteSnapshot(req)).getSchema(schema, market, locale);\r\n return route ? ResponseSuccess({ route }) : ResponseNotFound();\r\n }\r\n // console.log('routes.length', routes.length);\r\n if (pathname && href) {\r\n // Resolve the public path first. A successful result bypasses the\r\n // redirect collection query, the costliest branch for normal traffic.\r\n const resolution = (await getRouteSnapshot(req)).resolve(pathname);\r\n /*\r\n console.log('pathname', pathname);\r\n console.log('href', href);\r\n console.log('hrefBeforeRedirect', hrefBeforeRedirect);\r\n */\r\n const route = resolution.route;\r\n // console.log('route', route, 'pathname', pathname);\r\n if (route !== undefined) {\r\n return ResponseSuccess({\r\n parent: resolution.parent,\r\n route: {\r\n ...route,\r\n ...(resolution.splat ? { splat: resolution.splat } : {}),\r\n },\r\n });\r\n } else {\r\n const url = new URL(href);\r\n const urlBeforeRedirect = hrefBeforeRedirect ? new URL(hrefBeforeRedirect) : null;\r\n const sanitizedHref = sanitizeHref(url, urlBeforeRedirect);\r\n // Query only active redirects and request depth 0 because matching\r\n // needs scalar fields only; this minimizes Payload serialization.\r\n const { payload } = req;\r\n const payloadResponse = await payload.find({\r\n collection: 'redirect',\r\n where: {\r\n isActive: {\r\n equals: true,\r\n },\r\n },\r\n sort: 'order',\r\n depth: 0,\r\n limit: 10000,\r\n pagination: false,\r\n req,\r\n overrideAccess: true,\r\n });\r\n let redirects = (payloadResponse.docs ? payloadResponse.docs : []) as unknown as IRedirect[];\r\n redirects = redirects.map(x => ({\r\n ...x,\r\n from: sanitizeRedirectFrom(x.from, url, urlBeforeRedirect),\r\n to: sanitizeRedirectTo(x.to),\r\n }));\r\n // redirects.sort((a, b) => a.order - b.order);\r\n // exact match redirect resolver\r\n const exactMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const redirectUrl = sanitizeRedirectUrl(redirect.to, url);\r\n // console.log('>>>>>>>>>> findRoute exactMatchResolver', status, redirectUrl, redirect.to);\r\n return Response.json({ redirectUrl }, { status });\r\n } else {\r\n return Response.json('gone', { status });\r\n }\r\n };\r\n // check exact match redirects\r\n const exactMatchRedirect = redirects.find(x => x.from === sanitizedHref);\r\n if (exactMatchRedirect !== undefined) {\r\n // Exact matching avoids compiling patterns for the common case.\r\n return exactMatchResolver(exactMatchRedirect);\r\n }\r\n // pattern match redirect resolver\r\n const patternMatchResolver = (redirect: IRedirect) => {\r\n const status: number = parseInt(redirect.status) || 307;\r\n if (status < 400) {\r\n const regexp = new RegExp(redirect.from);\r\n let i = 0;\r\n let redirectUrl = (redirect.to as string).replace(/\\*/g, (...rest) => {\r\n return `$${++i}`;\r\n });\r\n redirectUrl = sanitizedHref.replace(regexp, redirectUrl);\r\n // console.log('>>>>>>>>>> findRoute patternMatchResolver', status, redirectUrl, redirect.to);\r\n return Response.json({ redirectUrl }, { status });\r\n } else {\r\n return Response.json('gone', { status });\r\n }\r\n };\r\n // check redirects by pattern\r\n redirects.forEach(x => {\r\n let expression = x.from;\r\n // wrapping catchall in (.*)\r\n expression = expression.replace(/\\*(?!\\))/g, '(.*)');\r\n // wrapping expression in ^...$\r\n expression = `^${expression.replace(/(^\\^)|(\\$$)/g, '')}$`;\r\n x.from = expression;\r\n });\r\n // check if a regex pattern redirect does match\r\n const firstMatch = redirects.find(x => sanitizedHref.match(x.from));\r\n // console.log('>>>>>>>>>> findRoute firstMatch', firstMatch);\r\n if (firstMatch) {\r\n return patternMatchResolver(firstMatch);\r\n }\r\n // console.error('not found', collection);\r\n // Preserve the nearest parent so middleware can render a localized\r\n // 404 without a second snapshot lookup.\r\n return ResponseSuccess({ parent: resolution.parent });\r\n }\r\n } else {\r\n // The collection branch serves management/list callers. Apply in-memory\r\n // filtering after the cached route graph is built, avoiding duplicate\r\n // collection queries for each filter or sort combination.\r\n const query = qsDeserialize(decodeURIComponent(searchParams.toString()));\r\n req.query = query;\r\n const routes = await getRoutes(req);\r\n let items = await whereCollection<IRoute>(routes, query.where);\r\n items = await sortCollection(items, query.sort);\r\n return ResponseSuccess(items);\r\n // return ResponseBadRequest();\r\n }\r\n } catch (error: unknown) {\r\n console.error('routeGetHandler.error', error);\r\n return getHandlerErrorResponse(error);\r\n }\r\n };\r\n}\r\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.handler.d.ts","names":[],"sources":["../../../src/server/handlers/sitemap.handler.ts"],"mappings":";;;;KAQY,QAAA;;EAAA,SAAA,CAAA,EAAQ,MAAA,GAEG,IAAA;AAGvB,CAAA;AAA+B,iBAAf,eAAA,CAAe,MAAA,EAAS,OAAT,CAAiB,eAAjB,CAAA,CAAA,EAAA,CAAA,OAAA,EACG,WADH,EAAA,GACc,OADd,CACc,QADd,CAAA;AAAiB,iBA2ChC,aAAA,CA3CgC,MAAA,EA2CV,OA3CU,CA2CF,eA3CE,CAAA,CAAA,EAAA,CAAA,OAAA,EA4Cd,WA5Cc,EAAA;EAAA,MAAA,EA4CD;AA3CF,CADG,EAAA;EAAR,MAAA,EA+C5B,OA/C4B,CAAA;IACN,MAAA,CAAA,EAAA,MAAA;IAAW,MAAA,CAAA,EAAA,MAAA;EAAA,CAAA,CAAA;AAAA,CAAA,EAAA,GA+C1C,OA/C0C,CA+C1C,QA/C0C,CAAA;AA0C7B,iBAuDA,aAAA,CAvDa,MAAA,EAuDS,OAvDT,CAuDiB,eAvDjB,CAAA,CAAA,EAAA,CAAA,OAAA,EAwDK,WAxDL,EAAA;EAAA,MAAA,EAwDkB;AAvDA,CADlB,EAAA;EAAA,MAAA,EA2DjB,OA3DiB,CAAA;IAAiB,MAAA,CAAA,EAAA,MAAA;IAAR,MAAA,CAAA,EAAA,MAAA;EACJ,CAAA,CAAA;AAAa,CAAA,EAAA,GA2D5C,OA3D4C,CA2D5C,QA3D4C,CAAA;AAGnC"}
1
+ {"version":3,"file":"sitemap.handler.d.ts","names":[],"sources":["../../../src/server/handlers/sitemap.handler.ts"],"sourcesContent":[],"mappings":";;;;KAQY,QAAA;;EAAA,SAAA,CAAA,EAAQ,MAAA,GAEG,IAAA;AAGvB,CAAA;AAA+B,iBAAf,eAAA,CAAe,MAAA,EAAS,OAAT,CAAiB,eAAjB,CAAA,CAAA,EAAA,CAAA,OAAA,EACG,WADH,EAAA,GACc,OADd,CACc,QADd,CAAA;AAAiB,iBA2ChC,aAAA,CA3CgC,MAAA,EA2CV,OA3CU,CA2CF,eA3CE,CAAA,CAAA,EAAA,CAAA,OAAA,EA4Cd,WA5Cc,EAAA;EAAA,MAAA,EA4CD;AA3CF,CADG,EAAA;EAAe,MAAvB,EA+C5B,OA/C4B,CAAA;IACN,MAAA,CAAA,EAAA,MAAA;IAAW,MAAA,CAAA,EAAA,MAAA;EAAA,CAAA,CAAA;AAAA,CAAA,EAAA,GA+C1C,OA/C0C,CA+C1C,QA/C0C,CAAA;AA0C7B,iBAuDA,aAAA,CAvDa,MAAA,EAuDS,OAvDT,CAuDiB,eAvDjB,CAAA,CAAA,EAAA,CAAA,OAAA,EAwDK,WAxDL,EAAA;EAAA,MAAA,EAwDkB;CAxDlB,EAAA;EAAA,MAAA,EA2DjB,OA3DiB,CAAA;IAAiB,MAAA,CAAA,EAAA,MAAA;IAAR,MAAA,CAAA,EAAA,MAAA;EAAO,CAAA,CAAA;CACA,EAAA,GA2D1C,OA3D4C,CA2D5C,QA3D4C,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { getPayload } from "../mixer.js";
2
2
  import { getHandlerErrorResponse } from "./error-response.js";
3
3
  import { defaultLocale, defaultMarket, eachMarketLocale } from "@websolutespa/bom-core";
4
+
4
5
  //#region src/server/handlers/sitemap.handler.ts
5
6
  const origin = process.env.NEXT_PUBLIC_URL || "";
6
7
  function getSiteMapIndex(config) {
@@ -12,7 +13,7 @@ function getSiteMapIndex(config) {
12
13
  const getTime = (date) => {
13
14
  return typeof date !== "undefined" ? (typeof date === "string" ? new Date(date) : date).getTime() : 0;
14
15
  };
15
- eachMarketLocale(markets, locales, (market, locale, markets, locales) => {
16
+ eachMarketLocale(markets, locales, (market, locale, markets$1, locales$1) => {
16
17
  const sitemapRoutes = routes.filter((x) => x.market === market.id && x.locale === locale.id);
17
18
  sitemapRoutes.sort((a, b) => getTime(a.updatedAt) - getTime(b.updatedAt));
18
19
  sitemaps.push({
@@ -100,6 +101,8 @@ ${getSiteMapXMLUrls(origin, canonicalRoutes)}
100
101
  function getSiteMapXSL(config) {
101
102
  return async function(request, { params: getParams }) {
102
103
  try {
104
+ const params = await getParams;
105
+ const locale = params?.locale || defaultLocale;
103
106
  const body = `<?xml version="1.0" encoding="UTF-8"?>
104
107
  <xsl:stylesheet version="2.0"
105
108
  xmlns:html="http://www.w3.org/TR/REC-html40"
@@ -108,7 +111,7 @@ function getSiteMapXSL(config) {
108
111
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
109
112
  <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
110
113
  <xsl:template match="/">
111
- <html lang="${(await getParams)?.locale || defaultLocale}" xmlns="http://www.w3.org/1999/xhtml">
114
+ <html lang="${locale}" xmlns="http://www.w3.org/1999/xhtml">
112
115
  <head>
113
116
  <title>XML Sitemap</title>
114
117
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
@@ -285,14 +288,14 @@ function getSiteMapXMLImage(canonical) {
285
288
  <image:loc>${escapeHtml(encodeURI(`${canonical.media.src || canonical.media.url}`))}</image:loc>
286
289
  </image:image>` : "";
287
290
  }
288
- function getSiteMapXMLAlternates(origin, canonical) {
291
+ function getSiteMapXMLAlternates(origin$1, canonical) {
289
292
  return canonical.alternates.map((alternate) => `
290
- <xhtml:link href="${escapeHtml(encodeURI(`${origin}${alternate.id}`))}" hreflang="${alternate.locale}-${alternate.market}" rel="alternate" />`).join("");
293
+ <xhtml:link href="${escapeHtml(encodeURI(`${origin$1}${alternate.id}`))}" hreflang="${alternate.locale}-${alternate.market}" rel="alternate" />`).join("");
291
294
  }
292
- function getSiteMapXMLUrl(origin, canonical) {
295
+ function getSiteMapXMLUrl(origin$1, canonical) {
293
296
  return `
294
297
  <url>
295
- <loc>${escapeHtml(encodeURI(`${origin}${canonical.id}`))}</loc>${getSiteMapXMLLastMod(canonical)}${getSiteMapXMLAlternates(origin, canonical)}${getSiteMapXMLImage(canonical)}
298
+ <loc>${escapeHtml(encodeURI(`${origin$1}${canonical.id}`))}</loc>${getSiteMapXMLLastMod(canonical)}${getSiteMapXMLAlternates(origin$1, canonical)}${getSiteMapXMLImage(canonical)}
296
299
  </url>`;
297
300
  }
298
301
  function escapeHtml(string) {
@@ -329,10 +332,10 @@ function escapeHtml(string) {
329
332
  }
330
333
  return lastIndex !== index ? html + str.substring(lastIndex, index) : html;
331
334
  }
332
- function getSiteMapXMLUrls(origin, canonicalRoutes) {
333
- return canonicalRoutes.map((canonicalRoute) => getSiteMapXMLUrl(origin, canonicalRoute)).join("");
335
+ function getSiteMapXMLUrls(origin$1, canonicalRoutes) {
336
+ return canonicalRoutes.map((canonicalRoute) => getSiteMapXMLUrl(origin$1, canonicalRoute)).join("");
334
337
  }
338
+
335
339
  //#endregion
336
340
  export { getSiteMapIndex, getSiteMapXML, getSiteMapXSL };
337
-
338
341
  //# sourceMappingURL=sitemap.handler.js.map
@@ -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) &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 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 &amp;\r\n Single Quote\t'\t &apos;\r\n Double Quote\t\"\t &quot;\r\n Greater Than\t>\t &gt;\r\n Less Than\t <\t &lt;\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 = '&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"],"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) &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 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 &amp;\r\n Single Quote\t'\t &apos;\r\n Double Quote\t\"\t &quot;\r\n Greater Than\t>\t &gt;\r\n Less Than\t <\t &lt;\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 = '&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"],"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;EAAsB,MAAA,EAAA,MAAA;EAAuB,MAAA,EAAA,MAAA;EAAR,EAAA,EAAA,MAAA;AAC3B,CAAA,EAAA,CAAA;AAAR,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;AAA0B,CAAA,EAAA,CAAA;AAAiC"}
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 === "runtime") return [];
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 === "runtime") return [];
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
- return (await localApiGet(`/-route?${query}`)).map((route) => ({
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 === "runtime") return [];
42
+ if (isDevelopment || buildStrategy === BuildStrategy.Runtime) return [];
39
43
  const payload = await getPayloadInstance({ config });
40
- return (await getRoutes({
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
- })).filter((route) => route.schema === schema || route.template === schema).map((route) => ({
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":";;;;;;;;;AAWA,SAAgB,gBAA8C,MAAa,QAAkC;CAC3G,OAAO,eAAe,uBAA8C;EAClE,IACE,iBACA,kBAAA,WAEA,OAAO,CAAC;EAEV,MAAM,EAAE,eAAe,MAAM,WAAW,EAAE,OAAO,CAAC;EAClD,MAAM,EAAE,WAAW,MAAM,WAAW,OAAO,KAAK;EAChD,OAAQ,OACL,QAAO,MAAK,EAAE,WAAW,IAAI,CAAC,CAC9B,KAAI,WAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,IAAI;EACvB,EAAE;CACN;AACF;AAGA,SAAgB,iBAAiB,QAAgB;CAC/C,OAAO,eAAe,uBAIjB;EACH,IACE,iBACA,kBAAA,WAEA,OAAO,CAAC;EAEV,MAAM,QAAQ,YAAY,EACxB,OAAO,EACL,IAAI,CAAC;GACH,QAAQ,EACN,QAAQ,OACV;GACA,UAAU,EACR,QAAQ,OACV;EACF,CAAC,EACH,EACF,CAAC;EAED,QAAQ,MADuB,YAAY,WAAW,OAAO,EAAA,CAE1D,KAAI,WAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,IAAI;EACvB,EAAE;CACN;AACF;AAGA,SAAgB,2BAA2B,QAAgB,QAAkC;CAC3F,OAAO,eAAe,uBAIjB;EACH,IACE,iBACA,kBAAA,WAEA,OAAO,CAAC;EAGV,MAAM,UAAU,MAAM,mBAAmB,EAAE,OAAO,CAAC;EASnD,QAAO,MARc,UAAU;GAC7B;GACA,QAAQ;GACR,QAAQ;GACR,MAAM;GACN,OAAO;EACT,CAAC,EAAA,CAGE,QAAO,UACN,MAAM,WAAW,UACjB,MAAM,aAAa,MACpB,CAAC,CACD,KAAI,WAAU;GACb,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,IAAI,OAAO,MAAM,IAAI;EACvB,EAAE;CACN;AACF"}
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":";;;;;;AAQA,MAAM,kBAAkB,CACtB,kCACF;AAEA,MAAM,kBAAkB,QAA0D;CAChF,MAAM,UAAU,OAAO,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,OAC9C,CAAC,gBAAgB,SAAS,CAAC,KAAK,OAAO,MAAM,QAC9C;CACD,QAAQ,KAAK;CACb,OAAO,OAAO,YAAY,OAAO;AACnC;AAEA,MAAM,YAAY,WAA8D;CAC9E,MAAM,UAAU,OAAO,QAAQ,UAAU,CAAC,CAAC;CAC3C,QAAQ,KAAK;CACb,OAAO,OAAO,YAAY,OAAO;AACnC;AAEA,SAAgB,eAAe,QAAkC;CAC/D,OAAO,eAAgB,SAAsB;EAC3C,IAAI;GACF,MAAM,eAAe,QAAQ,QAAQ;GAErC,MAAM,EAAE,QAAQ,QAAQ,eAAe,eAAe,WAAW,gBAAgB,OAAO;GACxF,MAAMA,YAAU,MAAMC,QAAW;GACjC,MAAM,EAAE,SAAS,MAAM,eAAe,MAAM,WAAW;IAAE;IAAQ,SAAA;GAAQ,CAAC;GAC1E,IAAI,EAAE,MAAM,SAAS,CAAC,EAAA,CAAG,SAAS,OAAO,GACvC,MAAM;IAAE,QAAQ;IAAK,SAAS;GAAe;GAE/C,MAAM,UAAU,MAAM,WAAW,UAAU,eAAe,UAAU,aAAa;GACjF,MAAM,SAAS,MAAM,UAAU,UAAU,eAAe,UAAU,eAAe,SAAS,MAAM,OAAO;GACvG,MAAM,OAAO;IACX,YAAY;IACZ,aAAa;IACb,QAAQ,UAAUD,SAAO;IACzB,MAAM,QAAQA,SAAO;IACrB,QAAQ,CAAC;IACT,cAAc,EAAE,GAAG,SAAS,OAAO,YAAY,YAAY,CAAC,EAAE;IAC9D,SAAS,EAAE,GAAG,SAAS,OAAO,YAAYA,SAAO,CAAC,EAAE;IACpD,KAAK,EAAE,GAAG,eAAe,QAAQ,GAAG,EAAE;IACtC,MAAM,EAAE,GAAG,SAAS,IAA0C,EAAE;IAChE,SAAS,EAAE,GAAG,SAAS,OAAO,EAAE;IAChC,QAAQ,EAAE,GAAG,SAAS,MAAM,EAAE;GAChC;GACA,MAAM,SAASA,UAAQ,IAAI,QAAQ;GACnC,IAAI,CAAC,UAAU,CAAE,OAAO,SAAS,WAAW,GAC1C,OAAO,SAAS,KAAK,MAAM,EACzB,QAAQ,IACV,CAAC;GAEH,OAAO,IAAI,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAyFJ,KAAK,UAAU,IAAI,EAAE;;;;;;;;UAQjC;IACF,QAAQ;IACR,SAAS,EACP,gBAAgB,YAClB;GACF,CAAC;EACH,SAAS,OAAgB;GACvB,QAAQ,IAAI,wBAAwB,KAAK;GACzC,OAAO,wBAAwB,KAAK;EACtC;CACF;AACF"}
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"}