@redocly/realm 0.129.0-next.2 → 0.129.0-next.4

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 (249) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/dist/bin.js +1 -1
  3. package/dist/cli/develop.d.ts +1 -1
  4. package/dist/cli/develop.js +1 -1
  5. package/dist/cli/prepare/analytics/collectors/get-file-extensions-usage.js +1 -1
  6. package/dist/cli/prepare/analytics/collectors/get-frontmatter-usage.js +1 -1
  7. package/dist/cli/prepare/analytics/collectors/get-markdoc-usage.js +1 -1
  8. package/dist/cli/prepare/analytics/collectors/get-nested-configs-usage.js +1 -1
  9. package/dist/cli/prepare/analytics/collectors/get-refs-usage.js +1 -1
  10. package/dist/cli/prepare/index.d.ts +1 -1
  11. package/dist/cli/translations/collect-config-translations.js +1 -1
  12. package/dist/cli/translations/update-translations.js +1 -1
  13. package/dist/client/TestProvider.js +1 -1
  14. package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
  15. package/dist/client/app/Sidebar/Sidebar.js +7 -2
  16. package/dist/client/app/Sidebar/useSidebarItems.d.ts +1 -0
  17. package/dist/client/app/Sidebar/useSidebarItems.js +1 -1
  18. package/dist/client/app/hooks/catalog/useFetchCatalogEntities.js +1 -1
  19. package/dist/client/app/hooks/catalog/useFetchCatalogEntitiesRelations.js +1 -1
  20. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.d.ts +10 -0
  21. package/dist/client/app/hooks/catalog/useFetchCatalogEntityRevisions.js +1 -0
  22. package/dist/client/app/hooks/index.d.ts +1 -0
  23. package/dist/client/app/hooks/index.js +1 -1
  24. package/dist/client/app/hooks/useLoginUrl.js +1 -1
  25. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  26. package/dist/client/app/pages/Login/Login.js +1 -1
  27. package/dist/client/app/utils/loadAndNavigate.js +1 -1
  28. package/dist/client/browser-entry.js +2 -2
  29. package/dist/client/providers/page-data/hooks.d.ts +2 -1
  30. package/dist/client/providers/page-data/hooks.js +1 -1
  31. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  32. package/dist/client/runtime/loader.js +1 -1
  33. package/dist/client/utils/catalog/inject-catalog-items.d.ts +1 -1
  34. package/dist/client/utils/catalog/inject-catalog-items.js +1 -1
  35. package/dist/constants/common.d.ts +0 -4
  36. package/dist/constants/common.js +1 -1
  37. package/dist/constants/l10n/langs/ar.js +1 -1
  38. package/dist/constants/l10n/langs/de.js +1 -1
  39. package/dist/constants/l10n/langs/en.js +1 -1
  40. package/dist/constants/l10n/langs/es.js +1 -1
  41. package/dist/constants/l10n/langs/fr.js +1 -1
  42. package/dist/constants/l10n/langs/hi.js +1 -1
  43. package/dist/constants/l10n/langs/it.js +1 -1
  44. package/dist/constants/l10n/langs/ja.js +1 -1
  45. package/dist/constants/l10n/langs/ko.js +1 -1
  46. package/dist/constants/l10n/langs/pl.js +1 -1
  47. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  48. package/dist/constants/l10n/langs/pt.js +1 -1
  49. package/dist/constants/l10n/langs/ru.js +1 -1
  50. package/dist/constants/l10n/langs/uk.js +1 -1
  51. package/dist/constants/l10n/langs/zh.js +1 -1
  52. package/dist/server/api-routes/execute-api-route.d.ts +0 -7
  53. package/dist/server/api-routes/execute-api-route.js +1 -1
  54. package/dist/server/api-routes/helpers/setup-logger.d.ts +2 -2
  55. package/dist/server/api-routes/helpers/setup-logger.js +1 -1
  56. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  57. package/dist/server/fs/cache.d.ts +1 -2
  58. package/dist/server/fs/cache.js +1 -1
  59. package/dist/server/fs/content-fs.d.ts +9 -4
  60. package/dist/server/fs/content-fs.js +1 -1
  61. package/dist/server/fs/fs.d.ts +6 -6
  62. package/dist/server/fs/fs.js +1 -3
  63. package/dist/server/fs/load-error.d.ts +2 -2
  64. package/dist/server/fs/load-error.js +1 -1
  65. package/dist/server/fs/utils/async-storage.d.ts +0 -8
  66. package/dist/server/fs/utils/async-storage.js +1 -1
  67. package/dist/server/fs/utils/isVirtualFile.d.ts +1 -1
  68. package/dist/server/fs/utils/isVirtualFile.js +1 -1
  69. package/dist/server/plugins/api-functions/index.js +1 -1
  70. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.d.ts +1 -1
  71. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.js +2 -2
  72. package/dist/server/plugins/arazzo-docs/index.d.ts +1 -1
  73. package/dist/server/plugins/arazzo-docs/index.js +1 -1
  74. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.d.ts +1 -1
  75. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.js +2 -2
  76. package/dist/server/plugins/asyncapi-docs/index.d.ts +1 -1
  77. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  78. package/dist/server/plugins/asyncapi-docs/is-asyncapi-doc.js +1 -1
  79. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +23 -18
  80. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  81. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.js +1 -1
  82. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.d.ts +9 -0
  83. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.js +1 -1
  84. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -0
  85. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.js +1 -1
  86. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  87. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-dto.js +1 -1
  88. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.js +1 -1
  89. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +1 -1
  90. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.d.ts +12 -0
  91. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -0
  92. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +15 -4
  93. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +67 -55
  94. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +21 -15
  95. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  96. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +16 -3
  97. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  98. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +17 -0
  99. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -0
  100. package/dist/server/plugins/catalog-entities/database/repositories/utils.d.ts +4 -4
  101. package/dist/server/plugins/catalog-entities/database/repositories/utils.js +1 -1
  102. package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.d.ts → extract-file-content.d.ts} +1 -1
  103. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.d.ts +2 -2
  104. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  105. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +2 -2
  106. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  107. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -2
  108. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  109. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +2 -2
  110. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  111. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +2 -2
  112. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  113. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  114. package/dist/server/plugins/catalog-entities/get-server-props.d.ts +1 -2
  115. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  116. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +64 -0
  117. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  118. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +6 -12
  119. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  120. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +4 -8
  121. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +1 -1
  122. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  123. package/dist/server/plugins/catalog-entities/utils/read-string.d.ts +7 -0
  124. package/dist/server/plugins/catalog-entities/utils/read-string.js +1 -0
  125. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  126. package/dist/server/plugins/config-parser/loaders/nearest-redocly-config-loader.js +1 -1
  127. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  128. package/dist/server/plugins/config-parser/loaders/yaml-parser.js +1 -1
  129. package/dist/server/plugins/default-theme/resolve-products-config.js +1 -1
  130. package/dist/server/plugins/ensure-frontmatter-theme-compatibility.js +1 -1
  131. package/dist/server/plugins/entitlements/index.js +1 -1
  132. package/dist/server/plugins/graphql-docs/index.js +1 -1
  133. package/dist/server/plugins/l10n/index.js +1 -1
  134. package/dist/server/plugins/lifecycle.js +2 -2
  135. package/dist/server/plugins/markdown/attribute-resolvers/code-walkthrough/filesets-resolver.js +1 -1
  136. package/dist/server/plugins/markdown/attribute-resolvers/resolve-code-snippet-from-file.js +1 -1
  137. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.d.ts +1 -1
  138. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
  139. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  140. package/dist/server/plugins/markdown/attribute-resolvers/resolve-parsed-yaml.js +1 -1
  141. package/dist/server/plugins/markdown/attribute-resolvers/resolve-raw-content.js +1 -1
  142. package/dist/server/plugins/markdown/attribute-resolvers/resolve-svg-content.js +1 -1
  143. package/dist/server/plugins/markdown/compiler.js +1 -1
  144. package/dist/server/plugins/markdown/get-server-props.js +1 -1
  145. package/dist/server/plugins/markdown/index.js +1 -1
  146. package/dist/server/plugins/markdown/markdoc/partials.js +1 -1
  147. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.js +1 -1
  148. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  149. package/dist/server/plugins/mcp/auth/auth-handlers.d.ts +1 -1
  150. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  151. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +7 -2
  152. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  153. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +7 -2
  154. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  155. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +7 -2
  156. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  157. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +7 -2
  158. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  159. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +4 -3
  160. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  161. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +5 -2
  162. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
  163. package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +6 -0
  164. package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
  165. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
  166. package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +3 -3
  167. package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
  168. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  169. package/dist/server/plugins/mcp/index.js +1 -1
  170. package/dist/server/plugins/mcp/servers/docs-server.d.ts +10 -3
  171. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  172. package/dist/server/plugins/mcp/types.d.ts +26 -2
  173. package/dist/server/plugins/mcp/utils.d.ts +9 -8
  174. package/dist/server/plugins/mcp/utils.js +1 -1
  175. package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +1 -1
  176. package/dist/server/plugins/nav-utils.js +1 -1
  177. package/dist/server/plugins/openapi-docs/decorators.d.ts +3 -2
  178. package/dist/server/plugins/openapi-docs/decorators.js +1 -1
  179. package/dist/server/plugins/openapi-docs/index.d.ts +2 -2
  180. package/dist/server/plugins/openapi-docs/index.js +1 -1
  181. package/dist/server/plugins/openapi-docs/is-openapi-doc.js +1 -1
  182. package/dist/server/plugins/openapi-docs/load-definition.d.ts +1 -1
  183. package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
  184. package/dist/server/plugins/pages/index.js +1 -1
  185. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  186. package/dist/server/plugins/sidebars/index.js +3 -3
  187. package/dist/server/plugins/utils.js +1 -1
  188. package/dist/server/providers/database/databases/catalog-sqlite/migrations/0003_catalog_versions_and_revisions_relations.sql +40 -0
  189. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/0003_snapshot.json +392 -0
  190. package/dist/server/providers/database/databases/catalog-sqlite/migrations/meta/_journal.json +7 -0
  191. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.d.ts +25 -46
  192. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
  193. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.d.ts +20 -3
  194. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.js +1 -1
  195. package/dist/server/providers/database/databases/main-sqlite/migrations/meta/0005_snapshot.json +263 -0
  196. package/dist/server/providers/database/databases/sqld-sqlite/migrations/0006_catalog-versions-and-revisions-relations.sql +40 -0
  197. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0005_snapshot.json +825 -0
  198. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/0006_snapshot.json +832 -0
  199. package/dist/server/providers/database/databases/sqld-sqlite/migrations/meta/_journal.json +7 -0
  200. package/dist/server/providers/database/pagination/combined-filters.d.ts +4 -1
  201. package/dist/server/providers/database/pagination/combined-filters.js +1 -1
  202. package/dist/server/providers/database/pagination/filter.d.ts +1 -0
  203. package/dist/server/providers/database/pagination/filter.js +1 -1
  204. package/dist/server/providers/database/pagination/index.d.ts +4 -1
  205. package/dist/server/store.js +1 -1
  206. package/dist/server/tools/notifiers/formatter.d.ts +2 -0
  207. package/dist/server/tools/notifiers/formatter.js +3 -3
  208. package/dist/server/tools/notifiers/logger.d.ts +18 -39
  209. package/dist/server/tools/notifiers/logger.js +2 -6
  210. package/dist/server/tools/notifiers/reporter.js +9 -9
  211. package/dist/server/tools/notifiers/terminal-manager.d.ts +8 -0
  212. package/dist/server/tools/notifiers/terminal-manager.js +5 -0
  213. package/dist/server/types/fs.d.ts +5 -10
  214. package/dist/server/types/plugins/api-routes.d.ts +0 -3
  215. package/dist/server/types/plugins/common.d.ts +0 -1
  216. package/dist/server/utils/is-valid-iso-date.d.ts +5 -0
  217. package/dist/server/utils/is-valid-iso-date.js +1 -0
  218. package/dist/server/utils/lifecycle-hooks.js +1 -1
  219. package/dist/server/utils/queue.js +1 -1
  220. package/dist/server/utils/redirects/find-redirect.d.ts +4 -2
  221. package/dist/server/utils/redirects/find-redirect.js +1 -1
  222. package/dist/server/utils/resolve-asset-path.js +1 -1
  223. package/dist/server/utils/validate-and-sanitize-string.d.ts +29 -0
  224. package/dist/server/utils/validate-and-sanitize-string.js +1 -0
  225. package/dist/server/web-server/auth.d.ts +5 -0
  226. package/dist/server/web-server/auth.js +3 -3
  227. package/dist/server/web-server/http.js +2 -2
  228. package/dist/server/web-server/middleware/loggerMiddleware.js +1 -1
  229. package/dist/server/web-server/routes/auth.js +1 -1
  230. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  231. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  232. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  233. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  234. package/dist/server/web-server/routes/search.js +1 -1
  235. package/dist/server/web-server/utils/get-redirect-login-url.js +1 -1
  236. package/dist/utils/auth/build-login-url.d.ts +1 -3
  237. package/dist/utils/auth/build-login-url.js +1 -1
  238. package/dist/utils/env/is-local-development.d.ts +13 -0
  239. package/dist/utils/env/is-local-development.js +1 -0
  240. package/dist/utils/env/is-production.d.ts +13 -0
  241. package/dist/utils/env/is-production.js +1 -0
  242. package/dist/utils/env/is-web-view.d.ts +14 -0
  243. package/dist/utils/env/is-web-view.js +1 -0
  244. package/dist/utils/path/remove-fragment.d.ts +16 -0
  245. package/dist/utils/path/remove-fragment.js +1 -0
  246. package/package.json +10 -10
  247. package/dist/server/web-server/routes/otel/types.d.ts +0 -61
  248. package/dist/server/web-server/routes/otel/types.js +0 -1
  249. /package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.js → extract-file-content.js} +0 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Safely reads a string value from an unknown type.
3
+ * Returns the value if it's a string, null if nullable and value is null,
4
+ * or undefined otherwise.
5
+ */
6
+ export declare function readString(value: unknown, nullable?: boolean): string | null | undefined;
7
+ //# sourceMappingURL=read-string.d.ts.map
@@ -0,0 +1 @@
1
+ function t(n,r=!1){if(typeof n=="string")return n;if(r&&n===null)return null}export{t as readString};
@@ -1 +1 @@
1
- import f from"path";import{combineUrls as p}from"@redocly/theme/core/utils";import{VERSION_SEPARATOR as S}from"../../../constants/common.js";import{removeTrailingSlash as d}from"../../../../utils/url/remove-trailing-slash.js";import{slash as b}from"../../../../utils/path/slash.js";import{logger as c}from"../../../tools/notifiers/logger.js";import{getDefaultVersionByPath as v}from"./versions-config-loader.js";import{GithubSlugger as D,slug as E}from"../../../utils/index.js";import{parseBaseName as F}from"../../utils.js";const I=new Set([".jpg",".jpeg",".png",".gif",".webp",".svg",".ico",".avif",".mp3",".wav",".ogg",".m4a",".mp4",".avi",".mov",".webm",".pdf",".doc",".docx",".zip",".rar",".gz",".ttf",".woff",".woff2"]),A=async(i,{fs:e,cache:s})=>{const g=c.startTiming(),o=(await s.load("versions-config","versions-config")).data,t=new Map,n=new Map,r=new Set,l=new D;n.set(".","/"),n.set("/","/");const u=(await e.scan()).sort((a,m)=>m.relativePath.localeCompare(a.relativePath));for(const{relativePath:a}of u){if(I.has(f.posix.extname(a)))continue;const{data:m}=await s.load(a,"is-ignored");if(m)continue;const h=b(a).replace(new RegExp("^(@i18n|@l10n)\\/"),""),w=v(a,o);N(h,{defaultVersion:w,fileSlugs:t,dirSlugs:n,allFileSlugsList:r,githubSlugger:l})}return c.verboseTime(g,"Calculated slugs. Number of file paths processed: "+u.length),{fileSlugs:t,dirSlugs:n}};function N(i,e){const s=e.fileSlugs.get(i);if(s)return s;let g=f.posix.dirname(i);const o=z(g,e)||"",{baseName:t,isIndexFile:n}=F(i),r=e.dirSlugs.has(f.posix.join(g,t));let l;if(!n&&r){const u=E(p(o,t,"/"));e.allFileSlugsList.has(u)||(l=u)}l||(l=n&&e.dirSlugs.get(g)||e.githubSlugger.slug(p(o,t))),l=d(l),e.fileSlugs.set(i,l),e.allFileSlugsList.add(l)}function z(i,e){if(e.dirSlugs.has(i))return e.dirSlugs.get(i);const s=d(f.posix.normalize(i)).split("/");let g="/",o="";for(const t of s){o=f.posix.join(o,t);const n=T(t,e.defaultVersion);let r=e.dirSlugs.get(o)||e.githubSlugger.slug(p("/",g,n));r.endsWith("/")||(r=r+"/"),e.dirSlugs.set(o,r),g=r}return e.dirSlugs.get(i)}function T(i,e){if(!i.startsWith(S))return i;const s=i.substring(S.length);return s===e?"":s}export{I as IGNORED_EXTS,A as contentSlugsLoader};
1
+ import f from"path";import{combineUrls as p}from"@redocly/theme/core/utils";import{VERSION_SEPARATOR as S}from"../../../constants/common.js";import{removeTrailingSlash as d}from"../../../../utils/url/remove-trailing-slash.js";import{slash as b}from"../../../../utils/path/slash.js";import{logger as c}from"../../../tools/notifiers/logger.js";import{getDefaultVersionByPath as v}from"./versions-config-loader.js";import{GithubSlugger as D,slug as E}from"../../../utils/index.js";import{parseBaseName as F}from"../../utils.js";const I=new Set([".jpg",".jpeg",".png",".gif",".webp",".svg",".ico",".avif",".mp3",".wav",".ogg",".m4a",".mp4",".avi",".mov",".webm",".pdf",".doc",".docx",".zip",".rar",".gz",".ttf",".woff",".woff2"]),A=async(i,{fs:e,cache:s})=>{const g=c.startTiming(),o=(await s.load("versions-config","versions-config")).data,t=new Map,n=new Map,r=new Set,l=new D;n.set(".","/"),n.set("/","/");const u=e.scan().sort((a,m)=>m.relativePath.localeCompare(a.relativePath));for(const{relativePath:a}of u){if(I.has(f.posix.extname(a)))continue;const{data:m}=await s.load(a,"is-ignored");if(m)continue;const h=b(a).replace(new RegExp("^(@i18n|@l10n)\\/"),""),w=v(a,o);N(h,{defaultVersion:w,fileSlugs:t,dirSlugs:n,allFileSlugsList:r,githubSlugger:l})}return c.verboseTime(g,"Calculated slugs. Number of file paths processed: "+u.length),{fileSlugs:t,dirSlugs:n}};function N(i,e){const s=e.fileSlugs.get(i);if(s)return s;let g=f.posix.dirname(i);const o=z(g,e)||"",{baseName:t,isIndexFile:n}=F(i),r=e.dirSlugs.has(f.posix.join(g,t));let l;if(!n&&r){const u=E(p(o,t,"/"));e.allFileSlugsList.has(u)||(l=u)}l||(l=n&&e.dirSlugs.get(g)||e.githubSlugger.slug(p(o,t))),l=d(l),e.fileSlugs.set(i,l),e.allFileSlugsList.add(l)}function z(i,e){if(e.dirSlugs.has(i))return e.dirSlugs.get(i);const s=d(f.posix.normalize(i)).split("/");let g="/",o="";for(const t of s){o=f.posix.join(o,t);const n=T(t,e.defaultVersion);let r=e.dirSlugs.get(o)||e.githubSlugger.slug(p("/",g,n));r.endsWith("/")||(r=r+"/"),e.dirSlugs.set(o,r),g=r}return e.dirSlugs.get(i)}function T(i,e){if(!i.startsWith(S))return i;const s=i.substring(S.length);return s===e?"":s}export{I as IGNORED_EXTS,A as contentSlugsLoader};
@@ -1 +1 @@
1
- import t from"path";import{CONFIG_FILE_NAME as n}from"../../../../constants/common.js";const h=async(l,{fs:o,cache:r,isPathIgnored:d})=>{let e=l,a=t.posix.join(e,n),i=await o.getFileInfo(a);for(;e!=="."&&!i;)e=t.posix.dirname(e),a=t.posix.join(e,n),!await d(a)&&(i=await o.getFileInfo(a));return{...(await r.load(i?.realRelativePath||a,"redocly-config",o.localeFolders)).data,configPath:i?.relativePath||a,realConfigPath:i?.realRelativePath||a}};export{h as nearestRedoclyConfigLoader};
1
+ import t from"path";import{CONFIG_FILE_NAME as n}from"../../../../constants/common.js";const h=async(l,{fs:i,cache:r,isPathIgnored:d})=>{let a=l,e=t.posix.join(a,n),o=i.getFileInfo(e);for(;a!=="."&&!o;)a=t.posix.dirname(a),e=t.posix.join(a,n),!await d(e)&&(o=i.getFileInfo(e));return{...(await r.load(o?.realRelativePath||e,"redocly-config",i.localeFolders)).data,configPath:o?.relativePath||e,realConfigPath:o?.realRelativePath||e}};export{h as nearestRedoclyConfigLoader};
@@ -1 +1 @@
1
- import h from"path";import{lintConfig as C,loadConfig as P,createConfigTypes as T}from"@redocly/openapi-core";import{deepMerge as b}from"../../../../../utils/object/deep-merge.js";import{readEnvVariable as R}from"../../../../utils/envs/read-env-variable.js";import{logger as a}from"../../../../tools/notifiers/logger.js";import{safeParsePartial as A}from"../../safe-parse.js";import{formatConfigProblem as x}from"../../format-error.js";import{ExternalResolver as E}from"../../../../fs/utils/external-ref-resolver.js";import{resolveMutuallyExclusiveProps as $}from"../../resolve-mutual-exclusion.js";async function W(o,r,t,c){const u=(await r.getFileInfo(o))?.realRelativePath||o;async function y(){const n=new E(r),l=h.join(r.cwd,u),i=await P({configPath:l,externalRefResolver:n}),f=await c(i.resolvedConfig);if(f===void 0)return i.resolvedConfig;const g=[...i.document?.source?await C({config:i,externalConfigTypes:T(f,i)}):[],...i.document?.source?$(i.resolvedConfig,i.document?.source):[]];if(g.length>0)for(const v of g)t(new Error(x(v,r.cwd)));return i.resolvedConfig}const s=await r.exists(o)?await y():{},w=j(s),p=await c(s);"residency"in s&&s.residency&&typeof s.residency=="string"&&(/^https?:\/\/.*/.test(s.residency)||t(new Error(`Invalid residency URL: "${s.residency}". Residency must start with "http://" or "https://".`)));let d=p?A(p,s):s;const{env:m}=d;if(m){const n=R("REDOCLY_ENV")||"development",l=m[n]||{};d=b(d,l)}const e=M(d,w);if(e.imports&&e.imports.length>0){a.warn("The 'imports' property is deprecated. Please use 'plugins' property instead.");const n=new Set([...e.plugins||[],...e.imports.map(l=>h.posix.join(l,"plugin.js"))]);e.plugins=Array.from(n),delete e.imports}if(e.catalog&&(a.warn("The 'catalog' property is deprecated. Please use 'catalogClassic' property instead."),e.catalogClassic={...e.catalog},delete e.catalog),e.scorecard&&(a.warn("The 'scorecard' property is deprecated. Please use 'scorecardClassic' property instead."),e.scorecardClassic=e.scorecard,delete e.scorecard),e.search?.ai){a.warn("The 'search.ai' property is deprecated. Please use 'aiAssistant' property instead.");const n={...e.search?.ai,...e.aiAssistant,suggestions:e.aiAssistant?.suggestions?.length?e.aiAssistant.suggestions:e.search?.ai.suggestions||[]};e.aiAssistant=n,delete e.search.ai}return e}function j(o){if(!o.theme)return[];a.warn("The 'theme' property in redocly.yaml is deprecated. Please move all of the properties from 'theme' to the root of the config.");const r=[];for(const t of Object.keys(o.theme))o[t]==null?r.push(t):a.warn(`Detected both '${t}' and 'theme.${t}' properties in redocly.yaml. The 'theme.${t}' property will be ignored and needs to be removed or merged into the '${t}'.`);return r}function M(o,r){if(!o.theme||r.length===0)return o;const t={...o};for(const c of r)t[c]=o.theme[c];return delete t.theme,t}export{W as readAndValidateConfig};
1
+ import h from"path";import{lintConfig as C,loadConfig as P,createConfigTypes as T}from"@redocly/openapi-core";import{deepMerge as b}from"../../../../../utils/object/deep-merge.js";import{readEnvVariable as R}from"../../../../utils/envs/read-env-variable.js";import{logger as a}from"../../../../tools/notifiers/logger.js";import{safeParsePartial as A}from"../../safe-parse.js";import{formatConfigProblem as x}from"../../format-error.js";import{ExternalResolver as E}from"../../../../fs/utils/external-ref-resolver.js";import{resolveMutuallyExclusiveProps as $}from"../../resolve-mutual-exclusion.js";async function W(o,r,t,c){const u=r.getFileInfo(o)?.realRelativePath||o;async function y(){const i=new E(r),l=h.join(r.cwd,u),n=await P({configPath:l,externalRefResolver:i}),f=await c(n.resolvedConfig);if(f===void 0)return n.resolvedConfig;const g=[...n.document?.source?await C({config:n,externalConfigTypes:T(f,n)}):[],...n.document?.source?$(n.resolvedConfig,n.document?.source):[]];if(g.length>0)for(const w of g)t(new Error(x(w,r.cwd)));return n.resolvedConfig}const s=await r.exists(o)?await y():{},v=j(s),p=await c(s);"residency"in s&&s.residency&&typeof s.residency=="string"&&(/^https?:\/\/.*/.test(s.residency)||t(new Error(`Invalid residency URL: "${s.residency}". Residency must start with "http://" or "https://".`)));let d=p?A(p,s):s;const{env:m}=d;if(m){const i=R("REDOCLY_ENV")||"development",l=m[i]||{};d=b(d,l)}const e=M(d,v);if(e.imports&&e.imports.length>0){a.warn("The 'imports' property is deprecated. Please use 'plugins' property instead.");const i=new Set([...e.plugins||[],...e.imports.map(l=>h.posix.join(l,"plugin.js"))]);e.plugins=Array.from(i),delete e.imports}if(e.catalog&&(a.warn("The 'catalog' property is deprecated. Please use 'catalogClassic' property instead."),e.catalogClassic={...e.catalog},delete e.catalog),e.scorecard&&(a.warn("The 'scorecard' property is deprecated. Please use 'scorecardClassic' property instead."),e.scorecardClassic=e.scorecard,delete e.scorecard),e.search?.ai){a.warn("The 'search.ai' property is deprecated. Please use 'aiAssistant' property instead.");const i={...e.search?.ai,...e.aiAssistant,suggestions:e.aiAssistant?.suggestions?.length?e.aiAssistant.suggestions:e.search?.ai.suggestions||[]};e.aiAssistant=i,delete e.search.ai}return e}function j(o){if(!o.theme)return[];a.warn("The 'theme' property in redocly.yaml is deprecated. Please move all of the properties from 'theme' to the root of the config.");const r=[];for(const t of Object.keys(o.theme))o[t]==null?r.push(t):a.warn(`Detected both '${t}' and 'theme.${t}' properties in redocly.yaml. The 'theme.${t}' property will be ignored and needs to be removed or merged into the '${t}'.`);return r}function M(o,r){if(!o.theme||r.length===0)return o;const t={...o};for(const c of r)t[c]=o.theme[c];return delete t.theme,t}export{W as readAndValidateConfig};
@@ -1 +1 @@
1
- import{parseYaml as a}from"@redocly/openapi-core";import{isVirtualFile as i}from"../../../fs/utils/isVirtualFile.js";const s=async(r,{fs:t})=>{try{const e=await t.read(r);return a(e)}catch(e){if(await i(r,t))return;throw new Error(`Error parsing YAML file ${r}: ${e.message}`)}};export{s as yamlParser};
1
+ import{parseYaml as t}from"@redocly/openapi-core";import{isVirtualFile as i}from"../../../fs/utils/isVirtualFile.js";const s=async(r,{fs:o})=>{try{const e=await o.read(r);return t(e)}catch(e){if(i(r,o))return;throw new Error(`Error parsing YAML file ${r}: ${e.message}`)}};export{s as yamlParser};
@@ -1 +1 @@
1
- import a from"path";import{productConfigOverrideSchema as R,REDOCLY_TEAMS_RBAC as L,REDOCLY_ROUTE_RBAC as O}from"@redocly/config";import{CONFIG_FILE_NAME as b}from"../../../constants/common.js";import{findDeepFirst as A}from"../../../utils/tree/find-deep-first.js";import{removeTrailingSlash as B}from"../../../utils/url/remove-trailing-slash.js";import{addTrailingSlash as D}from"../../../utils/url/add-trailing-slash.js";import{reporter as k}from"../../tools/notifiers/reporter.js";import{logger as F}from"../../tools/notifiers/logger.js";import{FileNotFoundError as E,resolveAssetPath as I}from"../../utils/index.js";import{safeParsePartial as _}from"../config-parser/safe-parse.js";import{resolveLinksFromConfig as v,resolveItems as S}from"../nav-utils.js";import{resolveLogoConfig as j}from"./resolve-logo.js";import{pickUiAccessibleConfig as z}from"./index.js";import{getExcludedFromLinkCheckerPatterns as N}from"../sidebars/utils.js";const re=async(o,e,r)=>{if(!o)return;const s={};for(const t of Object.keys(o)){let d;const m=o[t].icon;if(m)try{d=await I(m,r.fs,{fromFileRelativePath:b,contentDir:e.contentDir,outdir:e.outdir})}catch(w){w instanceof E?await k.panicOnBuildContentError(`Could not resolve icon for product "${t}": file ${m} does not exist`):await k.panicOnBuild(`Could not resolve icon for product "${t}": ${w.message}`)}const{name:C,folder:n}=o[t],l=a.posix.join(n,"redocly.yaml"),f=await r.fs.exists(l)?await r.cache.load(l,"product-config"):void 0,c=f?.data&&_(R,f.data),p=await T(n,r,e);if(!p){await k.panicOnBuild(`Could not resolve first link for product "${t}"`);continue}const u=e.getRouteBySlug(p),g=a.join(e.contentDir,n),i=c&&z(c),P=Object.keys(i?.logo||{}).length>0?await j(i?.logo,l,e.outdir,r.fs):void 0,h=N(e.getConfig()),y={navFile:l,excludedFromLinkCheckerPatterns:h};s[t]={name:C,folder:n,icon:d,slug:r.slugify(a.normalize(n)),link:p,configOverride:i&&{logo:Object.keys(P||{}).length>0?P:void 0,navbar:await v(i.navbar,g,e,r,y),footer:await v(i.footer,g,e,r,y),feedback:i.feedback,sidebar:i.sidebar,search:i.search&&{...i.search,suggestedPages:await v(i.search?.suggestedPages,g,e,r,{navFile:b,excludedFromLinkCheckerPatterns:h})},codeSnippet:i.codeSnippet,breadcrumbs:i.breadcrumbs&&{...i.breadcrumbs,prefixItems:await v(i.breadcrumbs?.prefixItems||[],g,e,r,{navFile:b,excludedFromLinkCheckerPatterns:h})},analytics:i.analytics,mockServer:i.mockServer},[L]:u?.[L],[O]:u?.[O]},F.verbose(`Resolved config for product "${t}"`)}return s};async function T(o,e,r){const s=D(a.posix.normalize(o)),t=B(e.slugify(a.normalize(o))),d=r.getRouteBySlug(t);if(d&&d.fsPath.startsWith(s))return d.slug;const m=(await e.fs.scan(/sidebars\.yaml$/)).filter(c=>c.relativePath.startsWith(s)),n=W(m)[0]?.relativePath;if(n){const c=await e.cache.load(n,"yaml"),p=await S(c.data,a.dirname(n),r,e,{navFile:n}),u=$(p);if(u)return F.verbose(`Found product first link "${u}" in sidebar "${n}"`),u}const l=await S([{directory:`${s}`}],a.dirname("sidebars.yaml"),r,e,{navFile:"sidebars.yaml"}),f=$(l);return f&&F.verbose(`Found product first link "${f}" in product folder "${s}"`),f}function $(o){return(o?A(o,r=>!!r.link):void 0)?.link}function W(o){return o.sort((e,r)=>{const s=e.relativePath.split("/").length,t=r.relativePath.split("/").length;return s!==t?s-t:e.relativePath.localeCompare(r.relativePath,void 0,{numeric:!0})})}export{T as getProductFirstLink,re as resolveProductsConfig};
1
+ import a from"path";import{productConfigOverrideSchema as R,REDOCLY_TEAMS_RBAC as w,REDOCLY_ROUTE_RBAC as O}from"@redocly/config";import{CONFIG_FILE_NAME as b}from"../../../constants/common.js";import{findDeepFirst as A}from"../../../utils/tree/find-deep-first.js";import{removeTrailingSlash as B}from"../../../utils/url/remove-trailing-slash.js";import{addTrailingSlash as D}from"../../../utils/url/add-trailing-slash.js";import{reporter as k}from"../../tools/notifiers/reporter.js";import{logger as F}from"../../tools/notifiers/logger.js";import{FileNotFoundError as E,resolveAssetPath as I}from"../../utils/index.js";import{safeParsePartial as _}from"../config-parser/safe-parse.js";import{resolveLinksFromConfig as v,resolveItems as S}from"../nav-utils.js";import{resolveLogoConfig as j}from"./resolve-logo.js";import{pickUiAccessibleConfig as z}from"./index.js";import{getExcludedFromLinkCheckerPatterns as N}from"../sidebars/utils.js";const re=async(o,e,r)=>{if(!o)return;const s={};for(const t of Object.keys(o)){let d;const m=o[t].icon;if(m)try{d=await I(m,r.fs,{fromFileRelativePath:b,contentDir:e.contentDir,outdir:e.outdir})}catch(L){L instanceof E?await k.panicOnBuildContentError(`Could not resolve icon for product "${t}": file ${m} does not exist`):await k.panicOnBuild(`Could not resolve icon for product "${t}": ${L.message}`)}const{name:C,folder:n}=o[t],l=a.posix.join(n,"redocly.yaml"),f=r.fs.exists(l)?await r.cache.load(l,"product-config"):void 0,c=f?.data&&_(R,f.data),p=await T(n,r,e);if(!p){await k.panicOnBuild(`Could not resolve first link for product "${t}"`);continue}const u=e.getRouteBySlug(p),g=a.join(e.contentDir,n),i=c&&z(c),P=Object.keys(i?.logo||{}).length>0?await j(i?.logo,l,e.outdir,r.fs):void 0,h=N(e.getConfig()),y={navFile:l,excludedFromLinkCheckerPatterns:h};s[t]={name:C,folder:n,icon:d,slug:r.slugify(a.normalize(n)),link:p,configOverride:i&&{logo:Object.keys(P||{}).length>0?P:void 0,navbar:await v(i.navbar,g,e,r,y),footer:await v(i.footer,g,e,r,y),feedback:i.feedback,sidebar:i.sidebar,search:i.search&&{...i.search,suggestedPages:await v(i.search?.suggestedPages,g,e,r,{navFile:b,excludedFromLinkCheckerPatterns:h})},codeSnippet:i.codeSnippet,breadcrumbs:i.breadcrumbs&&{...i.breadcrumbs,prefixItems:await v(i.breadcrumbs?.prefixItems||[],g,e,r,{navFile:b,excludedFromLinkCheckerPatterns:h})},analytics:i.analytics,mockServer:i.mockServer},[w]:u?.[w],[O]:u?.[O]},F.verbose(`Resolved config for product "${t}"`)}return s};async function T(o,e,r){const s=D(a.posix.normalize(o)),t=B(e.slugify(a.normalize(o))),d=r.getRouteBySlug(t);if(d&&d.fsPath.startsWith(s))return d.slug;const m=e.fs.scan(/sidebars\.yaml$/).filter(c=>c.relativePath.startsWith(s)),n=W(m)[0]?.relativePath;if(n){const c=await e.cache.load(n,"yaml"),p=await S(c.data,a.dirname(n),r,e,{navFile:n}),u=$(p);if(u)return F.verbose(`Found product first link "${u}" in sidebar "${n}"`),u}const l=await S([{directory:`${s}`}],a.dirname("sidebars.yaml"),r,e,{navFile:"sidebars.yaml"}),f=$(l);return f&&F.verbose(`Found product first link "${f}" in product folder "${s}"`),f}function $(o){return(o?A(o,r=>!!r.link):void 0)?.link}function W(o){return o.sort((e,r)=>{const s=e.relativePath.split("/").length,t=r.relativePath.split("/").length;return s!==t?s-t:e.relativePath.localeCompare(r.relativePath,void 0,{numeric:!0})})}export{T as getProductFirstLink,re as resolveProductsConfig};
@@ -1 +1 @@
1
- import{logger as m}from"../tools/notifiers/logger.js";async function a(r,o,n){if(!r.theme)return r;await m.warnForRealFile("The 'theme' property in frontmatter is deprecated. Please move all of the properties from 'theme' to the root of frontmatter: %rp",o,n);const t={...r};for(const e of Object.keys(t.theme))t[e]==null?t[e]=t.theme[e]:await m.warnForRealFile(`Detected both '${e}' and 'theme.${e}' properties in frontmatter. The 'theme.${e}' property will be ignored and needs to be removed or merged into the '${e}': %rp`,o,n);return delete t.theme,t}export{a as ensureFrontmatterThemeCompatibility};
1
+ import{logger as m}from"../tools/notifiers/logger.js";async function l(r,o,n){if(!r.theme)return r;m.warnForRealFile("The 'theme' property in frontmatter is deprecated. Please move all of the properties from 'theme' to the root of frontmatter: %rp",o,n);const t={...r};for(const e of Object.keys(t.theme))t[e]==null?t[e]=t.theme[e]:m.warnForRealFile(`Detected both '${e}' and 'theme.${e}' properties in frontmatter. The 'theme.${e}' property will be ignored and needs to be removed or merged into the '${e}': %rp`,o,n);return delete t.theme,t}export{l as ensureFrontmatterThemeCompatibility};
@@ -1 +1 @@
1
- import{writeFileSync as P}from"node:fs";import T from"path";import{PAGE_COUNT_OUTPUT_FILE_NAME as y}from"../../constants/common.js";import{readEnvVariable as F}from"../../utils/envs/read-env-variable.js";import{logger as o}from"../../tools/notifiers/logger.js";import{isReactPage as b}from"../../utils/content/is-react-page.js";import{EntitlementsProvider as S}from"../../entitlements/entitlements-provider.js";import{getBilledPagesCount as O,isPathIgnored as R}from"../../utils/index.js";import{isGraphqlDoc as $}from"../graphql-docs/is-graphql-doc.js";import{isMarkdownPage as E}from"../markdown/is-markdown-page.js";import{isOpenapiDoc as M}from"../openapi-docs/is-openapi-doc.js";import{PRODUCT_NAME as l}from"../../../config/product-gates.js";import{isAsyncapiDoc as k}from"../asyncapi-docs/is-asyncapi-doc.js";import{telemetryTraceStep as _}from"../../../cli/telemetry/helpers/trace-step.js";async function Y(){return{id:"entitlements",async afterRoutesCreated(w,u){await _("build.plugin.entitlements",async t=>{const i=S.instance(),r=[],n=[],s=[],a=[],p=[];for(const{relativePath:e}of await u.fs.scan())R(e)||(E(e)?r.push(e):$(e)?s.push(e):b(e)?a.push(e):await M(e,u)?n.push(e):await k(e,u)&&p.push(e));const g=i.canAccessFeature("markdown");t?.setAttribute("totalMarkdownFiles",r.length.toString()),t?.setAttribute("isMarkdownSupported",(!!g).toString()),r.length>0&&!g&&o.warn(`The product you are using ("${l}") does not support Markdown pages. The following Markdown files were detected but will be ignored: ${r.map(()=>"%rp").join(", ")}`,...r);const c=i.canAccessFeature("openapi");t?.setAttribute("totalOpenApiFiles",n.length.toString()),t?.setAttribute("isOpenApiSupported",(!!c).toString()),n.length>0&&!c&&o.warn(`The product you are using ("${l}") does not support OpenAPI documents. The following files are ignored: ${n.map(()=>"%rp").join(", ")}`,...n);const d=i.canAccessFeature("asyncapi");t?.setAttribute("totalAsyncApiFiles",p.length.toString()),t?.setAttribute("isAsyncApiSupported",(!!d).toString()),p.length>0&&!d&&o.warn(`The product you are using ("${l}") does not support AsyncAPI documents. The following files are ignored: ${p.map(()=>"%rp").join(", ")}`,...p);const m=i.canAccessFeature("graphql");t?.setAttribute("totalGraphqlFiles",s.length.toString()),t?.setAttribute("isGraphqlSupported",(!!m).toString()),s.length>0&&!m&&o.warn(`The product you are using ("${l}") does not support GraphQL documents. The following files are ignored: ${s.map(()=>"%rp").join(", ")}`,...s);const f=i.canAccessFeature("reactPages");t?.setAttribute("totalReactFiles",a.length.toString()),t?.setAttribute("isReactPagesSupported",(!!f).toString()),a.length>0&&!f&&o.warn(`The product you are using ("${l}") does not support React pages. The following files are ignored: ${a.map(()=>"%rp").join(", ")}`,...a);const A=O(w.getAllRoutes());t?.setAttribute("totalBilledPages",A.toString());const h=F("REDOCLY_METADATA_OUTPUT_FOLDER");h&&(o.info("Save total pages..."),P(T.join(h,y),JSON.stringify({totalPages:A},null)))})}}}export{Y as entitlementsPlugin};
1
+ import{writeFileSync as P}from"node:fs";import T from"path";import{PAGE_COUNT_OUTPUT_FILE_NAME as y}from"../../constants/common.js";import{readEnvVariable as F}from"../../utils/envs/read-env-variable.js";import{logger as o}from"../../tools/notifiers/logger.js";import{isReactPage as b}from"../../utils/content/is-react-page.js";import{EntitlementsProvider as S}from"../../entitlements/entitlements-provider.js";import{getBilledPagesCount as O,isPathIgnored as R}from"../../utils/index.js";import{isGraphqlDoc as $}from"../graphql-docs/is-graphql-doc.js";import{isMarkdownPage as E}from"../markdown/is-markdown-page.js";import{isOpenapiDoc as M}from"../openapi-docs/is-openapi-doc.js";import{PRODUCT_NAME as l}from"../../../config/product-gates.js";import{isAsyncapiDoc as k}from"../asyncapi-docs/is-asyncapi-doc.js";import{telemetryTraceStep as _}from"../../../cli/telemetry/helpers/trace-step.js";async function Y(){return{id:"entitlements",async afterRoutesCreated(w,u){await _("build.plugin.entitlements",async t=>{const i=S.instance(),r=[],n=[],s=[],a=[],p=[];for(const{relativePath:e}of u.fs.scan())R(e)||(E(e)?r.push(e):$(e)?s.push(e):b(e)?a.push(e):await M(e,u)?n.push(e):await k(e,u)&&p.push(e));const g=i.canAccessFeature("markdown");t?.setAttribute("totalMarkdownFiles",r.length.toString()),t?.setAttribute("isMarkdownSupported",(!!g).toString()),r.length>0&&!g&&o.warn(`The product you are using ("${l}") does not support Markdown pages. The following Markdown files were detected but will be ignored: ${r.map(()=>"%rp").join(", ")}`,...r);const c=i.canAccessFeature("openapi");t?.setAttribute("totalOpenApiFiles",n.length.toString()),t?.setAttribute("isOpenApiSupported",(!!c).toString()),n.length>0&&!c&&o.warn(`The product you are using ("${l}") does not support OpenAPI documents. The following files are ignored: ${n.map(()=>"%rp").join(", ")}`,...n);const d=i.canAccessFeature("asyncapi");t?.setAttribute("totalAsyncApiFiles",p.length.toString()),t?.setAttribute("isAsyncApiSupported",(!!d).toString()),p.length>0&&!d&&o.warn(`The product you are using ("${l}") does not support AsyncAPI documents. The following files are ignored: ${p.map(()=>"%rp").join(", ")}`,...p);const m=i.canAccessFeature("graphql");t?.setAttribute("totalGraphqlFiles",s.length.toString()),t?.setAttribute("isGraphqlSupported",(!!m).toString()),s.length>0&&!m&&o.warn(`The product you are using ("${l}") does not support GraphQL documents. The following files are ignored: ${s.map(()=>"%rp").join(", ")}`,...s);const f=i.canAccessFeature("reactPages");t?.setAttribute("totalReactFiles",a.length.toString()),t?.setAttribute("isReactPagesSupported",(!!f).toString()),a.length>0&&!f&&o.warn(`The product you are using ("${l}") does not support React pages. The following files are ignored: ${a.map(()=>"%rp").join(", ")}`,...a);const A=O(w.getAllRoutes());t?.setAttribute("totalBilledPages",A.toString());const h=F("REDOCLY_METADATA_OUTPUT_FOLDER");h&&(o.info("Save total pages..."),P(T.join(h,y),JSON.stringify({totalPages:A},null)))})}}}export{Y as entitlementsPlugin};
@@ -1 +1 @@
1
- import{writeFileSync as C}from"node:fs";import $ from"node:path";import{REDOCLY_TEAMS_RBAC as v}from"@redocly/config";import{combineUrls as I}from"@redocly/theme/core/utils";import{PUBLIC_API_DEFINITIONS_FOLDER as w}from"../../constants/common.js";import{GRAPHQL_TEMPLATE_ID as H,GRAPHQL_SPEC_SLUG as N,PUBLIC_RBAC_SCOPE_ITEM as O}from"../../../constants/common.js";import{removeTrailingSlash as _}from"../../../utils/url/remove-trailing-slash.js";import{getTemplatePath as Q}from"./get-template-path.js";import{searchResolver as F}from"./search/search-resolver.js";import{graphqlDocLoader as M}from"./graphql-doc-loader.js";import{getAiDocumentsStore as A}from"./search/ai/get-ai-search-document.js";import{fromCurrentDir as U}from"../../utils/paths.js";import{ensureDir as k}from"../../utils/fs.js";import{telemetryTraceStep as x}from"../../../cli/telemetry/helpers/trace-step.js";const B="graphql-docs-",R="graphql-spec-download";async function nt(){return{id:"graphql",requiredEntitlements:["graphql"],loaders:{"graphql-doc":M},processContent:async(t,{fs:n,cache:l,isPathIgnored:u,withPathPrefix:p})=>{await x("build.plugin.graphql_docs",async()=>{t.createRequestHandler(R,U(import.meta.url,"./spec-download.api.js")),t.addApiRoute({slug:N+"/*",requestHandlerId:R,httpMethod:"all",[v]:O,getStaticData:async()=>({props:{}})});const m=t.createTemplate(H,Q("./template/GraphQLDocs.js"));for(const{relativePath:o}of await n.scan(/(\.gql|\.graphql)$/)){if(await u(o))continue;const h=await l.load(o,"graphql-doc");if(!h.data)continue;j(h.data.content,t.outdir,o);const{menu:q,content:T,settings:i,metadata:y,store:c}=h.data,b=`${B}${o}`;await t.createSharedData(b,T);const d=[{key:"graphQlSettings",id:b}],E=q.getGroups(),G=q.getSidebarItems(),g={type:"graphql",title:E[0].name,...y},s=[{slugSuffix:"",fsPath:o,templateId:m,getStaticData:S(void 0,i,p),sharedData:d,getAiDocumentsStore:A({label:i.info?.title??"GraphQL Overview",groupName:"overview",metadata:g,actions:t,store:c,includeInLLMsTxt:!0})}];for(const r of E){const f=`${r.id}`;s.push({slugSuffix:f,fsPath:o,templateId:m,getStaticData:S(r,i,p),sharedData:d});for(const e of r.typeGroups){const a=`${e.id}`;s.push({slugSuffix:a,fsPath:o,templateId:m,getStaticData:S(e,i,p),sharedData:d,getAiDocumentsStore:A({label:e.name,groupName:e.name,metadata:g,actions:t,store:c,isTypeGroup:!0,items:new Set(e.items)})});for(const L of e.items){const P=`${e.id}/${L}`;s.push({slugSuffix:P,fsPath:o,templateId:m,getStaticData:S(e,i,p),sharedData:d,getAiDocumentsStore:A({label:L,groupName:e.name,metadata:g,actions:t,store:c})})}}}if(!s.length)return;const D=s[s.length-1];D.metadata=g,D.getSidebar=r=>{function f(e){return e.map(a=>({...a,slug:a.slug&&_(I(r.baseSlug,a.slug)),routeSlug:a.routeSlug&&_(I(r.baseSlug,a.routeSlug)),link:a.link&&_(I(r.baseSlug,a.link)),items:a.items&&f(a.items)}))}return f(G)},D.getSearchDocuments=F(t,c);for(const r of s)t.addRoute(r)}})}}}function S(t,n,l){return async function(u){return{props:{seo:{title:t?.name},settings:{...n,location:{section:t?.id},sidebar:{hide:!0},baseUrlPath:l(u.baseSlug)},disableAutoScroll:!0}}}}function j(t,n,l){const u=w.slice(1);C(k($.resolve(n,`${u}/${l}`)),t,"utf8")}export{nt as graphqlDocsPlugin,j as storeGqlSchema};
1
+ import{writeFileSync as C}from"node:fs";import $ from"node:path";import{REDOCLY_TEAMS_RBAC as v}from"@redocly/config";import{combineUrls as I}from"@redocly/theme/core/utils";import{PUBLIC_API_DEFINITIONS_FOLDER as w}from"../../constants/common.js";import{GRAPHQL_TEMPLATE_ID as H,GRAPHQL_SPEC_SLUG as N,PUBLIC_RBAC_SCOPE_ITEM as O}from"../../../constants/common.js";import{removeTrailingSlash as _}from"../../../utils/url/remove-trailing-slash.js";import{getTemplatePath as Q}from"./get-template-path.js";import{searchResolver as F}from"./search/search-resolver.js";import{graphqlDocLoader as M}from"./graphql-doc-loader.js";import{getAiDocumentsStore as A}from"./search/ai/get-ai-search-document.js";import{fromCurrentDir as U}from"../../utils/paths.js";import{ensureDir as k}from"../../utils/fs.js";import{telemetryTraceStep as x}from"../../../cli/telemetry/helpers/trace-step.js";const B="graphql-docs-",R="graphql-spec-download";async function nt(){return{id:"graphql",requiredEntitlements:["graphql"],loaders:{"graphql-doc":M},processContent:async(t,{fs:n,cache:l,isPathIgnored:u,withPathPrefix:p})=>{await x("build.plugin.graphql_docs",async()=>{t.createRequestHandler(R,U(import.meta.url,"./spec-download.api.js")),t.addApiRoute({slug:N+"/*",requestHandlerId:R,httpMethod:"all",[v]:O,getStaticData:async()=>({props:{}})});const m=t.createTemplate(H,Q("./template/GraphQLDocs.js"));for(const{relativePath:o}of n.scan(/(\.gql|\.graphql)$/)){if(await u(o))continue;const h=await l.load(o,"graphql-doc");if(!h.data)continue;j(h.data.content,t.outdir,o);const{menu:q,content:T,settings:i,metadata:y,store:c}=h.data,b=`${B}${o}`;await t.createSharedData(b,T);const d=[{key:"graphQlSettings",id:b}],E=q.getGroups(),G=q.getSidebarItems(),g={type:"graphql",title:E[0].name,...y},s=[{slugSuffix:"",fsPath:o,templateId:m,getStaticData:S(void 0,i,p),sharedData:d,getAiDocumentsStore:A({label:i.info?.title??"GraphQL Overview",groupName:"overview",metadata:g,actions:t,store:c,includeInLLMsTxt:!0})}];for(const r of E){const f=`${r.id}`;s.push({slugSuffix:f,fsPath:o,templateId:m,getStaticData:S(r,i,p),sharedData:d});for(const e of r.typeGroups){const a=`${e.id}`;s.push({slugSuffix:a,fsPath:o,templateId:m,getStaticData:S(e,i,p),sharedData:d,getAiDocumentsStore:A({label:e.name,groupName:e.name,metadata:g,actions:t,store:c,isTypeGroup:!0,items:new Set(e.items)})});for(const L of e.items){const P=`${e.id}/${L}`;s.push({slugSuffix:P,fsPath:o,templateId:m,getStaticData:S(e,i,p),sharedData:d,getAiDocumentsStore:A({label:L,groupName:e.name,metadata:g,actions:t,store:c})})}}}if(!s.length)return;const D=s[s.length-1];D.metadata=g,D.getSidebar=r=>{function f(e){return e.map(a=>({...a,slug:a.slug&&_(I(r.baseSlug,a.slug)),routeSlug:a.routeSlug&&_(I(r.baseSlug,a.routeSlug)),link:a.link&&_(I(r.baseSlug,a.link)),items:a.items&&f(a.items)}))}return f(G)},D.getSearchDocuments=F(t,c);for(const r of s)t.addRoute(r)}})}}}function S(t,n,l){return async function(u){return{props:{seo:{title:t?.name},settings:{...n,location:{section:t?.id},sidebar:{hide:!0},baseUrlPath:l(u.baseSlug)},disableAutoScroll:!0}}}}function j(t,n,l){const u=w.slice(1);C(k($.resolve(n,`${u}/${l}`)),t,"utf8")}export{nt as graphqlDocsPlugin,j as storeGqlSchema};
@@ -1 +1 @@
1
- import g from"path";import{DEFAULT_LOCALE_PLACEHOLDER as d,TRANSLATIONS_FILE_NAME as h}from"../../../constants/common.js";import{I18N_DIR_NAME as w,L10N_DIR_NAME as y}from"../../constants/common.js";import{logger as m}from"../../tools/notifiers/logger.js";import{reporter as A}from"../../tools/notifiers/reporter.js";import{EntitlementsProvider as O}from"../../entitlements/entitlements-provider.js";import{isL10nPath as E}from"../../fs/utils/is-l10n-path.js";import{isOpenapiDoc as I}from"../openapi-docs/is-openapi-doc.js";import{telemetryTraceStep as N}from"../../../cli/telemetry/helpers/trace-step.js";async function $(){return{id:"l10n",async processContent(n,e){await N("build.plugin.l10n",async a=>{const{fs:t,cache:c,getConfig:r}=e,i={},p=O.instance(),l=await r();a?.setAttribute("config",JSON.stringify(l.l10n||{}));const s=l.l10n?.defaultLocale||d;if(p.canAccessFeature("l10n")){await F(e);for(const{relativePath:o}of await t.scan(/(^|.*[\/\\])translations\.yaml$/)){const u=await c.load(o,"yaml"),L=P(o)||s;i[L]={translation:u.data||{}}}}i[s]={translation:{...i[s]?.translation||{}}};const f=l.l10n?.locales||[d,...t.localeFolders].map(o=>({code:o.toLowerCase(),name:o}));a?.setAttribute("locales",JSON.stringify(f)),n.setGlobalData({l10n:{translations:i,defaultLocale:s,locales:f.map(o=>({code:o.code,name:o.name||o.code}))}})})}}}function P(n){return n.indexOf("/")>0?n.split("/")[1]:void 0}async function F(n){const e=await n.fs.scan();for(const{isVirtual:a,realRelativePath:t}of e){if(a)continue;if(E(t)&&t.endsWith(".page.tsx")&&await A.panicOnBuild(`The file %rp is not allowed in ${y} or ${w} folders`,t),g.posix.basename(t)===h){const r=/^(?:@(i18n|l10n)[\/\\][^\/\\]+[\/\\])?translations\.yaml$/.test(t),i=await I(t,n);!r&&!i&&m.warn("The file %rp is in the wrong location. Make sure it is located in the root directory or in the locale root directory.",t),r&&i&&m.warn("It looks like the file %rp might be an OpenAPI definition and is located in a location reserved for translation files. Please rename it or move to another directory if it is not a translations file",t)}}}export{$ as l10nPlugin};
1
+ import g from"path";import{DEFAULT_LOCALE_PLACEHOLDER as d,TRANSLATIONS_FILE_NAME as h}from"../../../constants/common.js";import{I18N_DIR_NAME as y,L10N_DIR_NAME as A}from"../../constants/common.js";import{logger as m}from"../../tools/notifiers/logger.js";import{reporter as w}from"../../tools/notifiers/reporter.js";import{EntitlementsProvider as O}from"../../entitlements/entitlements-provider.js";import{isL10nPath as E}from"../../fs/utils/is-l10n-path.js";import{isOpenapiDoc as I}from"../openapi-docs/is-openapi-doc.js";import{telemetryTraceStep as N}from"../../../cli/telemetry/helpers/trace-step.js";async function $(){return{id:"l10n",async processContent(n,i){await N("build.plugin.l10n",async a=>{const{fs:t,cache:c,getConfig:r}=i,e={},p=O.instance(),l=await r();a?.setAttribute("config",JSON.stringify(l.l10n||{}));const s=l.l10n?.defaultLocale||d;if(p.canAccessFeature("l10n")){await F(i);for(const{relativePath:o}of t.scan(/(^|.*[\/\\])translations\.yaml$/)){const u=await c.load(o,"yaml"),L=P(o)||s;e[L]={translation:u.data||{}}}}e[s]={translation:{...e[s]?.translation||{}}};const f=l.l10n?.locales||[d,...t.localeFolders].map(o=>({code:o.toLowerCase(),name:o}));a?.setAttribute("locales",JSON.stringify(f)),n.setGlobalData({l10n:{translations:e,defaultLocale:s,locales:f.map(o=>({code:o.code,name:o.name||o.code}))}})})}}}function P(n){return n.indexOf("/")>0?n.split("/")[1]:void 0}async function F(n){const i=n.fs.scan();for(const{isVirtual:a,realRelativePath:t}of i){if(a)continue;if(E(t)&&t.endsWith(".page.tsx")&&await w.panicOnBuild(`The file %rp is not allowed in ${A} or ${y} folders`,t),g.posix.basename(t)===h){const r=/^(?:@(i18n|l10n)[\/\\][^\/\\]+[\/\\])?translations\.yaml$/.test(t),e=await I(t,n);!r&&!e&&m.warn("The file %rp is in the wrong location. Make sure it is located in the root directory or in the locale root directory.",t),r&&e&&m.warn("It looks like the file %rp might be an OpenAPI definition and is located in a location reserved for translation files. Please rename it or move to another directory if it is not a translations file",t)}}}export{$ as l10nPlugin};
@@ -1,2 +1,2 @@
1
- import _ from"@redocly/portal-plugin-mock-server";import B from"path";import{REDOCLY_ROUTE_RBAC as x}from"@redocly/config";import{combineUrls as v,withPathPrefix as O}from"@redocly/theme/core/utils";import{VERSION_SEPARATOR as N}from"../constants/common.js";import{removeTrailingSlash as D}from"../../utils/url/remove-trailing-slash.js";import{removeLeadingSlash as L}from"../../utils/url/remove-leading-slash.js";import{isTruthy as V}from"../../utils/guards/is-truthy.js";import{normalizeRouteSlug as F}from"../../utils/path/normalize-route-slug.js";import{slash as j}from"../../utils/path/slash.js";import{parsePathVersions as k}from"../../utils/path/parse-path-versions.js";import{reporter as E}from"../tools/notifiers/reporter.js";import{logger as P}from"../tools/notifiers/logger.js";import{isDevelopMode as $}from"../utils/envs/is-develop-mode.js";import{shaDirPathShort as z}from"../utils/crypto/sha-dir-path-short.js";import{customPagesPlugin as M}from"../../server/plugins/pages/index.js";import{openAPIDocsPlugin as q}from"../../server/plugins/openapi-docs/index.js";import{asyncAPIDocsPlugin as I}from"../../server/plugins/asyncapi-docs/index.js";import{configParserPlugin as U}from"./config-parser/index.js";import{markdownPlugin as G}from"./markdown/index.js";import{generateBrowserPluginsModule as W,generateClientRoutes as K,generateTemplatesModule as H}from"../esbuild/generate.js";import{graphqlDocsPlugin as Y}from"./graphql-docs/index.js";import{searchPlugin as J}from"./search/index.js";import{defaultThemePlugin as Q}from"./default-theme/index.js";import{apiKeyMgmtPlugin as X}from"./dev-onboarding/index.js";import{apiFunctionsPlugin as Z}from"./api-functions/index.js";import{scorecardClassicPlugin as ee}from"./scorecard-classic/index.js";import{lintPlugin as te}from"./lint/index.js";import{resolvePlugins as oe}from"../config/external-plugins.js";import{sidebarsPlugin as ie}from"./sidebars/index.js";import{l10nPlugin as ne}from"./l10n/index.js";import{analyticsPlugins as re}from"./analytics/index.js";import{sitemapPlugin as se}from"./sitemap/index.js";import{entitlementsPlugin as ae}from"./entitlements/index.js";import{getBilledPagesCount as le,slug as ce}from"../utils/index.js";import{telemetry as ue}from"../../cli/telemetry/index.js";import{telemetryTraceStep as b}from"../../cli/telemetry/helpers/trace-step.js";import{EntitlementsProvider as A}from"../entitlements/entitlements-provider.js";import{ssoPlugin as fe}from"./sso/index.js";import{Cache as me}from"../fs/cache.js";import{ContentFs as de}from"../fs/content-fs.js";import{findProductBySlug as pe}from"../utils/product.js";import{parseBaseName as ge}from"./utils.js";import{isRouteReserved as Pe}from"./get-reserved-routes.js";import{catalogClassicPlugin as he}from"./catalog-classic/index.js";import{arazzoDocsPlugin as ye}from"./arazzo-docs/index.js";const Ce=[U,fe,Q,ne,G,q,I,ye,ee,te,Z,M,Y,X,he,{importPath:"./catalog-entities/plugin.js",loadCondition:()=>process.env.NEW_CATALOG_ENABLED==="true"},{importPath:"./scorecards/plugin.js",loadCondition:()=>process.env.NEW_SCORECARDS_ENABLED==="true"},{importPath:"./mcp/index.js",loadCondition:()=>A.instance().canAccessFeature("mcp")},ie,se,ae,J,_,...re];async function gt(o,t=Ce){return await b("build.plugins_init",async()=>{const n=[],w=A.instance(),h={};for(const f of t){let a;if("loadCondition"in f){if(!f.loadCondition())continue;const e=await import(f.importPath);if(!e.default||typeof e.default!="function"){await E.panicOnBuild(`Dynamic plugin ${f.importPath} does not export a default export or it is not a function`);continue}a=e.default}else a=f;const d=await a(o);for(const[e,i]of Object.entries(d.loaders||{}))h[e]&&await E.panicOnBuild(`Duplicate loader with name ${e}`),h[e]=i;(!d.requiredEntitlements||d.requiredEntitlements?.every(e=>w.canAccessFeature(e)))&&n.push(d)}const s=new de(o.contentDir),u=new me(s);return u.setLoaders(h),P.verbose("All plugins instantiated"),{pluginInstances:n,lifecycleContext:ve(s,u)}})}function T(o){P.verbose("Generating templates"),b("build.write_client_entries",()=>{H(o),W(o),K(o)})}async function we(o){const t=o.getAllRoutes();le(t)||await E.panicOnBuild("No routes created by plugins. Please check your project configuration.")}async function Pt(o,t,n,w={}){const h=A.instance();try{await b("build.plugins_run",async()=>{t.startPluginsRun();let s=[];await b("build.plugins_process_content",async a=>{for(const e of o){const i=P.startTiming();await e.processContent?.(t,n),P.verboseTime(i,`processContent for ${e.id}`)}s=(await oe(t.contentDir,t.config.plugins)).map(e=>e.lifecyclePlugin).filter(e=>V(e)&&(!e.requiredEntitlements||e.requiredEntitlements?.every(i=>h.canAccessFeature(i)))),n.cache.setLoaders(Object.fromEntries(s.flatMap(e=>Object.entries(e.loaders||{}))));for(const e of s){const i=P.startTiming();await e.processContent?.(t,n),P.verboseTime(i,`processContent for ${e.id}`)}a?.setAttribute("externalPluginsProcessed",s.length.toString())});const u=await Re(t,n),f=[...o,...s];T(t),$()?await t.userCodeReady:t.buildRevision++,await b("build.plugins_after_routes_created",async()=>{for(const a of f){const d=P.startTiming();await a.afterRoutesCreated?.(t,u),P.verboseTime(d,`afterRoutesCreated for ${a.id}`)}}),await t.reportUnsetEnvVars(),await we(t),T(t)})}catch(s){const u="Unhandled error in plugin. "+s.message+`
2
- `+s.stack;ue.sendCliErrorCaughtMessage({message:u}),w.failFast?await E.panic(u):await E.panicOnBuild(u)}finally{t.finishPluginsRun()}}async function Re(o,t){const{cache:n,fs:w}=t,h=await t.getConfig(),s=Object.values(h.products||{}),u=(await n.load("versions-config","versions-config")).data,f=(await n.load("content-slugs","content-slugs")).data;for(const{duplicateInAllLocales:e,slugSuffix:i,sharedData:y=[],redirectFrom:C=[],...l}of o.newRoutes){const c=F(l.slug?l.slug:a(l.fsPath)),p=D(i?v(c,i):c),r={...l,[x]:{slug:p,fsPath:l.fsPath},slug:p,baseSlug:c,versions:d(l.fsPath,i),product:pe(s,p,a)};Pe(p,h)&&await E.panicOnBuildContentError(`Route "${p}" is reserved and cannot be used. Please choose a different slug for "${l.fsPath}".`),o.routesByFsPath.set(r.fsPath,r.slug),o.routesBySlug.set(r.slug,r);for(const{key:g,id:m}of y)o.addRouteSharedData(r.slug,g,m);for(const g of C)o.addRedirect(g.from,{type:g.type,to:r.slug});if(e)for(const g of w.localeFolders){const m={...r,slug:"/"+g.toLowerCase()+r.slug};o.routesByFsPath.set(m.fsPath,m.slug),o.routesBySlug.set(m.slug,m);for(const{key:R,id:S}of y)o.addRouteSharedData(m.slug,R,S);for(const R of C){const S=v(w.localizationFolder,g,R.from);o.addRedirect(S,{type:R.type,to:m.slug})}}}return o.newRoutes=[],{...t,slugify:a};function a(e){const i=j(e).replace(new RegExp("^(@i18n|@l10n)\\/"),""),y=f.fileSlugs.get(i)||f.dirSlugs.get(D(i));if(y)return y;const{baseName:C,isIndexFile:l}=ge(e);let c=B.dirname(e.replace(new RegExp("^(@i18n|@l10n)\\/"),""));return c=c==="."?"/":c,v("/",ce(l?c:v(c,C)),"/")}function d(e,i=""){const y=k(e);if(!y?.versionName)return;const{versionFolderPath:C,filePathInVersion:l,versionName:c}=y,p=u.get(C);if(p)return p.versions.map(r=>{const g=p.defaultVersion===r.version,m=L(v(C,N+r.version,l)),R=a(m);return{version:r.version,label:r.name||r.version,link:F(v(R,i)),default:g,active:c===r.version,folderId:z(`${C}`)}})}}function ve(o,t){return{fs:o,cache:t,getConfig:async(n=".")=>(await t.load(n,"nearest-redocly-config",o.localeFolders)).data,isPathIgnored:async n=>(await t.load(n,"is-ignored")).data,withPathPrefix:O,logger:P}}export{Ce as INTERNAL_PLUGINS,ve as createLifecycleContext,gt as initPlugins,Pt as runPlugins,T as writeClientEntries};
1
+ import _ from"@redocly/portal-plugin-mock-server";import B from"path";import{REDOCLY_ROUTE_RBAC as x}from"@redocly/config";import{combineUrls as v,withPathPrefix as O}from"@redocly/theme/core/utils";import{VERSION_SEPARATOR as N}from"../constants/common.js";import{removeTrailingSlash as D}from"../../utils/url/remove-trailing-slash.js";import{removeLeadingSlash as L}from"../../utils/url/remove-leading-slash.js";import{isTruthy as V}from"../../utils/guards/is-truthy.js";import{normalizeRouteSlug as F}from"../../utils/path/normalize-route-slug.js";import{slash as j}from"../../utils/path/slash.js";import{parsePathVersions as k}from"../../utils/path/parse-path-versions.js";import{reporter as E}from"../tools/notifiers/reporter.js";import{logger as P}from"../tools/notifiers/logger.js";import{isDevelopMode as $}from"../utils/envs/is-develop-mode.js";import{shaDirPathShort as z}from"../utils/crypto/sha-dir-path-short.js";import{customPagesPlugin as M}from"../../server/plugins/pages/index.js";import{openAPIDocsPlugin as q}from"../../server/plugins/openapi-docs/index.js";import{asyncAPIDocsPlugin as I}from"../../server/plugins/asyncapi-docs/index.js";import{configParserPlugin as U}from"./config-parser/index.js";import{markdownPlugin as G}from"./markdown/index.js";import{generateBrowserPluginsModule as W,generateClientRoutes as K,generateTemplatesModule as H}from"../esbuild/generate.js";import{graphqlDocsPlugin as Y}from"./graphql-docs/index.js";import{searchPlugin as J}from"./search/index.js";import{defaultThemePlugin as Q}from"./default-theme/index.js";import{apiKeyMgmtPlugin as X}from"./dev-onboarding/index.js";import{apiFunctionsPlugin as Z}from"./api-functions/index.js";import{scorecardClassicPlugin as ee}from"./scorecard-classic/index.js";import{lintPlugin as te}from"./lint/index.js";import{resolvePlugins as oe}from"../config/external-plugins.js";import{sidebarsPlugin as ie}from"./sidebars/index.js";import{l10nPlugin as ne}from"./l10n/index.js";import{analyticsPlugins as re}from"./analytics/index.js";import{sitemapPlugin as se}from"./sitemap/index.js";import{entitlementsPlugin as ae}from"./entitlements/index.js";import{getBilledPagesCount as le,slug as ce}from"../utils/index.js";import{telemetry as ue}from"../../cli/telemetry/index.js";import{telemetryTraceStep as b}from"../../cli/telemetry/helpers/trace-step.js";import{EntitlementsProvider as A}from"../entitlements/entitlements-provider.js";import{ssoPlugin as fe}from"./sso/index.js";import{Cache as me}from"../fs/cache.js";import{ContentFs as de}from"../fs/content-fs.js";import{findProductBySlug as pe}from"../utils/product.js";import{parseBaseName as ge}from"./utils.js";import{isRouteReserved as Pe}from"./get-reserved-routes.js";import{catalogClassicPlugin as he}from"./catalog-classic/index.js";import{arazzoDocsPlugin as ye}from"./arazzo-docs/index.js";const we=[U,fe,Q,ne,G,q,I,ye,ee,te,Z,M,Y,X,he,{importPath:"./catalog-entities/plugin.js",loadCondition:()=>process.env.NEW_CATALOG_ENABLED==="true"},{importPath:"./scorecards/plugin.js",loadCondition:()=>process.env.NEW_SCORECARDS_ENABLED==="true"},{importPath:"./mcp/index.js",loadCondition:()=>A.instance().canAccessFeature("mcp")},ie,se,ae,J,_,...re];async function gt(o,t=we){return await b("build.plugins_init",async()=>{const n=[],C=A.instance(),h={};for(const f of t){let a;if("loadCondition"in f){if(!f.loadCondition())continue;const e=await import(f.importPath);if(!e.default||typeof e.default!="function"){await E.panicOnBuild(`Dynamic plugin ${f.importPath} does not export a default export or it is not a function`);continue}a=e.default}else a=f;const d=await a(o);for(const[e,i]of Object.entries(d.loaders||{}))h[e]&&await E.panicOnBuild(`Duplicate loader with name ${e}`),h[e]=i;(!d.requiredEntitlements||d.requiredEntitlements?.every(e=>C.canAccessFeature(e)))&&n.push(d)}const s=new de(o.contentDir);await s.ready;const u=new me(s);return u.setLoaders(h),P.verbose("All plugins instantiated"),{pluginInstances:n,lifecycleContext:ve(s,u)}})}function T(o){P.verbose("Generating templates"),b("build.write_client_entries",()=>{H(o),W(o),K(o)})}async function Ce(o){const t=o.getAllRoutes();le(t)||await E.panicOnBuild("No routes created by plugins. Please check your project configuration.")}async function Pt(o,t,n,C={}){const h=A.instance();try{await b("build.plugins_run",async()=>{t.startPluginsRun();let s=[];await b("build.plugins_process_content",async a=>{for(const e of o){const i=P.startTiming();await e.processContent?.(t,n),P.verboseTime(i,`processContent for ${e.id}`)}s=(await oe(t.contentDir,t.config.plugins)).map(e=>e.lifecyclePlugin).filter(e=>V(e)&&(!e.requiredEntitlements||e.requiredEntitlements?.every(i=>h.canAccessFeature(i)))),n.cache.setLoaders(Object.fromEntries(s.flatMap(e=>Object.entries(e.loaders||{}))));for(const e of s){const i=P.startTiming();await e.processContent?.(t,n),P.verboseTime(i,`processContent for ${e.id}`)}a?.setAttribute("externalPluginsProcessed",s.length.toString())});const u=await Re(t,n),f=[...o,...s];T(t),$()?await t.userCodeReady:t.buildRevision++,await b("build.plugins_after_routes_created",async()=>{for(const a of f){const d=P.startTiming();await a.afterRoutesCreated?.(t,u),P.verboseTime(d,`afterRoutesCreated for ${a.id}`)}}),await t.reportUnsetEnvVars(),await Ce(t),T(t)})}catch(s){const u="Unhandled error in plugin. "+s.message+`
2
+ `+s.stack;ue.sendCliErrorCaughtMessage({message:u}),C.failFast?await E.panic(u):await E.panicOnBuild(u)}finally{t.finishPluginsRun()}}async function Re(o,t){const{cache:n,fs:C}=t,h=await t.getConfig(),s=Object.values(h.products||{}),u=(await n.load("versions-config","versions-config")).data,f=(await n.load("content-slugs","content-slugs")).data;for(const{duplicateInAllLocales:e,slugSuffix:i,sharedData:y=[],redirectFrom:w=[],...l}of o.newRoutes){const c=F(l.slug?l.slug:a(l.fsPath)),p=D(i?v(c,i):c),r={...l,[x]:{slug:p,fsPath:l.fsPath},slug:p,baseSlug:c,versions:d(l.fsPath,i),product:pe(s,p,a)};Pe(p,h)&&await E.panicOnBuildContentError(`Route "${p}" is reserved and cannot be used. Please choose a different slug for "${l.fsPath}".`),o.routesByFsPath.set(r.fsPath,r.slug),o.routesBySlug.set(r.slug,r);for(const{key:g,id:m}of y)o.addRouteSharedData(r.slug,g,m);for(const g of w)o.addRedirect(g.from,{type:g.type,to:r.slug});if(e)for(const g of C.localeFolders){const m={...r,slug:"/"+g.toLowerCase()+r.slug};o.routesByFsPath.set(m.fsPath,m.slug),o.routesBySlug.set(m.slug,m);for(const{key:R,id:S}of y)o.addRouteSharedData(m.slug,R,S);for(const R of w){const S=v(C.localizationFolder,g,R.from);o.addRedirect(S,{type:R.type,to:m.slug})}}}return o.newRoutes=[],{...t,slugify:a};function a(e){const i=j(e).replace(new RegExp("^(@i18n|@l10n)\\/"),""),y=f.fileSlugs.get(i)||f.dirSlugs.get(D(i));if(y)return y;const{baseName:w,isIndexFile:l}=ge(e);let c=B.dirname(e.replace(new RegExp("^(@i18n|@l10n)\\/"),""));return c=c==="."?"/":c,v("/",ce(l?c:v(c,w)),"/")}function d(e,i=""){const y=k(e);if(!y?.versionName)return;const{versionFolderPath:w,filePathInVersion:l,versionName:c}=y,p=u.get(w);if(p)return p.versions.map(r=>{const g=p.defaultVersion===r.version,m=L(v(w,N+r.version,l)),R=a(m);return{version:r.version,label:r.name||r.version,link:F(v(R,i)),default:g,active:c===r.version,folderId:z(`${w}`)}})}}function ve(o,t){return{fs:o,cache:t,getConfig:async(n=".")=>(await t.load(n,"nearest-redocly-config",o.localeFolders)).data,isPathIgnored:async n=>(await t.load(n,"is-ignored")).data,withPathPrefix:O,logger:P}}export{we as INTERNAL_PLUGINS,ve as createLifecycleContext,gt as initPlugins,Pt as runPlugins,T as writeClientEntries};
@@ -1 +1 @@
1
- import c from"node:path";import v from"is-glob";import m from"picomatch";import{parseFileChunks as h}from"./file-chunk-parser.js";import{getNodeAttribute as b}from"../../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as d}from"../../markdoc/helpers/set-node-attribute-value.js";import{readFileContent as g}from"../../read-file-content.js";import{resolvePathInMarkdown as x}from"../../resolve-path-in-markdown.js";import{removeL10nPrefix as P}from"../../../../fs/utils/remove-l10n-prefix.js";import{mapFileExtensionToLanguage as k}from"./map-file-extension-to-language.js";async function V(a,f,p,u){const{actions:{contentDir:F},context:{fs:i}}=u,n=b(a,f);if(!Array.isArray(n))d(a,"resolvedFilesets",[]);else{const w=await Promise.all(n.map(async e=>{const s=Array.isArray(e.files)?e.files:[],o=Array.isArray(e.downloadAssociatedFiles)?e.downloadAssociatedFiles:[],r=await Promise.all(s.map(l)),t=await Promise.all(o.map(l));return{...e,files:r.flat(),downloadAssociatedFiles:t.flat()}}));d(a,"resolvedFilesets",w.filter(e=>!!e));async function l(e){const s=x(e,P(p),F),o=await A(s);return(await Promise.all(o.map(y))).filter(t=>t!==null)}async function A(e){if(!v(e))return[e];const{base:s}=m.scan(e);return(await i.scan(new RegExp(s))).filter(({isVirtual:t})=>!t).map(({realRelativePath:t})=>t).filter(t=>m(e)(t))}async function y(e){const s=await g(e,i);if(s==null)return null;const{root:o,metadata:r}=await h(s,e);return{path:e,content:o,metadata:r,basename:c.basename(e),language:k(c.extname(e))}}}}export{V as resolveCodeWalkthroughFilesets};
1
+ import c from"node:path";import v from"is-glob";import m from"picomatch";import{parseFileChunks as h}from"./file-chunk-parser.js";import{getNodeAttribute as b}from"../../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as d}from"../../markdoc/helpers/set-node-attribute-value.js";import{readFileContent as g}from"../../read-file-content.js";import{resolvePathInMarkdown as x}from"../../resolve-path-in-markdown.js";import{removeL10nPrefix as P}from"../../../../fs/utils/remove-l10n-prefix.js";import{mapFileExtensionToLanguage as k}from"./map-file-extension-to-language.js";async function V(a,f,p,u){const{actions:{contentDir:F},context:{fs:i}}=u,n=b(a,f);if(!Array.isArray(n))d(a,"resolvedFilesets",[]);else{const w=await Promise.all(n.map(async e=>{const s=Array.isArray(e.files)?e.files:[],o=Array.isArray(e.downloadAssociatedFiles)?e.downloadAssociatedFiles:[],r=await Promise.all(s.map(l)),t=await Promise.all(o.map(l));return{...e,files:r.flat(),downloadAssociatedFiles:t.flat()}}));d(a,"resolvedFilesets",w.filter(e=>!!e));async function l(e){const s=x(e,P(p),F),o=await A(s);return(await Promise.all(o.map(y))).filter(t=>t!==null)}async function A(e){if(!v(e))return[e];const{base:s}=m.scan(e);return i.scan(new RegExp(s)).filter(({isVirtual:t})=>!t).map(({realRelativePath:t})=>t).filter(t=>m(e)(t))}async function y(e){const s=await g(e,i);if(s==null)return null;const{root:o,metadata:r}=await h(s,e);return{path:e,content:o,metadata:r,basename:c.basename(e),language:k(c.extname(e))}}}}export{V as resolveCodeWalkthroughFilesets};
@@ -1,4 +1,4 @@
1
- import c from"node:path";import{slash as L}from"../../../../utils/path/slash.js";import{reporter as F}from"../../../tools/notifiers/reporter.js";import{getNodeAttribute as n}from"../markdoc/helpers/get-node-attribute.js";import{MdResolveError as h}from"./md-resolve-error.js";async function V(i,w,b,{actions:{contentDir:m},context:u}){const o=n(i,w);if(!o)return;const r=o.startsWith("/")?o.slice(1):L(c.relative(m,c.resolve(m,c.dirname(b),o)));if(!await u.fs.exists(r)){await F.panicOnBuildContentError(`Code snippet file ${r} does not exist`);return}let e=await u.fs.read(r);const d=n(i,"after"),p=n(i,"before"),y=n(i,"from"),C=n(i,"to"),v=n(i,"prefix")||"",s=y??d,f=C??p,g=d!==null,x=p!==null,E=(typeof s=="number"?Math.max(s||0,1):1)+(g?1:0);let a=(typeof f=="number"?f:1/0)-(x?1:0);if(typeof s=="string"){let t=e.indexOf(s);if(t===-1)throw new h(`Cannot find start text "${s}" in snippet file`,{rawLink:r});for(;e[t]!==`
1
+ import c from"node:path";import{slash as L}from"../../../../utils/path/slash.js";import{reporter as F}from"../../../tools/notifiers/reporter.js";import{getNodeAttribute as n}from"../markdoc/helpers/get-node-attribute.js";import{MdResolveError as h}from"./md-resolve-error.js";async function V(i,w,b,{actions:{contentDir:m},context:u}){const o=n(i,w);if(!o)return;const r=o.startsWith("/")?o.slice(1):L(c.relative(m,c.resolve(m,c.dirname(b),o)));if(!u.fs.exists(r)){await F.panicOnBuildContentError(`Code snippet file ${r} does not exist`);return}let e=await u.fs.read(r);const d=n(i,"after"),p=n(i,"before"),y=n(i,"from"),C=n(i,"to"),v=n(i,"prefix")||"",s=y??d,f=C??p,g=d!==null,x=p!==null,E=(typeof s=="number"?Math.max(s||0,1):1)+(g?1:0);let a=(typeof f=="number"?f:1/0)-(x?1:0);if(typeof s=="string"){let t=e.indexOf(s);if(t===-1)throw new h(`Cannot find start text "${s}" in snippet file`,{rawLink:r});for(;e[t]!==`
2
2
  `&&t>0;)t--;typeof a=="number"&&(a-=e.slice(0,t-1).split(`
3
3
  `).length),e=e.slice(t+1)}if(typeof f=="string"){let t=e.indexOf(f);if(t===-1)throw new h(`Cannot find end text "${p}" in snippet file`,{rawLink:r});e[t-1]===`
4
4
  `&&t--,e=e.slice(0,t)}const l=e.split(`
@@ -1,6 +1,6 @@
1
1
  import type { Node } from '@markdoc/markdoc';
2
2
  import type { MarkdocResolveContext, WithOriginalAttr } from '../../../types';
3
- export declare function resolveLink(node: WithOriginalAttr<Node>, attributeName: string, pageRelativePath: string, { actions, context }: MarkdocResolveContext): Promise<{
3
+ export declare function resolveLink(node: WithOriginalAttr<Node>, attributeName: string, fromPage: string, { actions, context }: MarkdocResolveContext): Promise<{
4
4
  sharedDataId?: string;
5
5
  } | void>;
6
6
  //# sourceMappingURL=resolve-link.d.ts.map
@@ -1 +1 @@
1
- import e from"node:path";import{ASYNC_API_DOCS_TEMPLATE_ID as d,GRAPHQL_SPEC_SLUG as F,GRAPHQL_TEMPLATE_ID as U,OPENAPI_DOCS_TEMPLATE_ID as C}from"../../../../constants/common.js";import{isLocalLink as y}from"../../../../utils/path/is-local-link.js";import{normalizeRouteSlug as u}from"../../../../utils/path/normalize-route-slug.js";import{PUBLIC_API_DEFINITIONS_FOLDER as M,DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as N}from"../../../constants/common.js";import{getInnerText as W}from"../markdoc/helpers/get-inner-text.js";import{getNodeAttribute as B}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as m}from"../markdoc/helpers/set-node-attribute-value.js";import{MdResolveError as I}from"./md-resolve-error.js";import{getLinkOriginalAttrName as j}from"./utils.js";import{isOpenApiURL as G}from"../../openapi-docs/is-openapi-doc.js";import{parseBaseName as $}from"../../utils.js";import{isMarkdownPage as H}from"../is-markdown-page.js";import{copyStaticFile as V}from"../../../utils/fs.js";const b=i=>[M,N,F].some(r=>i.startsWith(r));async function at(i,r,n,{actions:A,context:c}){const{contentDir:k,outdir:D,getRouteByFsPath:E,slugHasRouteOrRedirect:_}=A,h=j(r),s=i[h]||B(i,r);if(i[h]=s,!y(s)||b(s))return;const[v,t="",g,L]=/^([^\?#]+)?([^#]+)?(.+)?/.exec(s)||[],f=i.type==="image"?"IMAGE":"LINK",p=String(i.attributes.title||i.attributes.alt||W([i])||""),{isOpenapiDetected:O,isOpenapiValid:R}=await G(t,n,A,c);if(O&&!R)throw new I(`OpenAPI route ${s} does not exist`,{rawLink:s,link:t,title:p,brokenLinkType:f});if(e.extname(t)===""){if(t.startsWith("/")){if(!_(u(t)))throw new I(`Route ${t} does not exist`,{rawLink:s,link:t,title:p,brokenLinkType:f});m(i,r,t+(g||"")+(L||""))}if(!s.startsWith("#")&&!t.startsWith("/")&&H(n)){const o=E(n)?.slug;if(!o)return;const{isIndexFile:P}=$(n),w=P?u(e.posix.join(o,t)):u(e.posix.join(o,"../",t));if(!_(u(w)))throw new I(`Route ${t} does not exist`,{rawLink:s,link:w,title:p,brokenLinkType:f});m(i,r,w+(g||"")+(L||""))}return}const a=t.startsWith("/")?t.substring(1):e.posix.join(e.posix.dirname(n),decodeURI(t)),S=t.startsWith("/")?e.posix.join("static",t.substring(1)):"",x=await c.fs.exists(a),T=await c.fs.exists(S),l=E(a);if(!x&&!l&&!T)throw m(i,r,"#"),new I(`File ${a} does not exist`,{rawLink:s,link:a,title:p,brokenLinkType:f});if(l){const o=[C,U,d].includes(l.templateId);m(i,r,(o?l.baseSlug:l.slug)+(L||""))}else if(x){const o=await c.fs.getFileInfo(a);if(!o||o.isVirtual)return;const P=await V(k,o.realRelativePath,D);m(i,r,P)}}export{at as resolveLink};
1
+ import o from"node:path";import{ASYNC_API_DOCS_TEMPLATE_ID as F,GRAPHQL_SPEC_SLUG as T,GRAPHQL_TEMPLATE_ID as d,OPENAPI_DOCS_TEMPLATE_ID as v}from"../../../../constants/common.js";import{isLocalLink as U}from"../../../../utils/path/is-local-link.js";import{normalizeRouteSlug as P}from"../../../../utils/path/normalize-route-slug.js";import{removeFragment as y}from"../../../../utils/path/remove-fragment.js";import{PUBLIC_API_DEFINITIONS_FOLDER as C,DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as M}from"../../../constants/common.js";import{getInnerText as N}from"../markdoc/helpers/get-inner-text.js";import{getNodeAttribute as W}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as p}from"../markdoc/helpers/set-node-attribute-value.js";import{MdResolveError as g}from"./md-resolve-error.js";import{getLinkOriginalAttrName as B}from"./utils.js";import{isOpenApiURL as j}from"../../openapi-docs/is-openapi-doc.js";import{parseBaseName as G}from"../../utils.js";import{isMarkdownPage as $}from"../is-markdown-page.js";import{copyStaticFile as H}from"../../../utils/fs.js";const V=i=>[C,M,T].some(r=>i.startsWith(r));async function lt(i,r,k,{actions:L,context:c}){const{contentDir:w,outdir:D,getRouteByFsPath:A,slugHasRouteOrRedirect:E}=L,_=B(r),s=i[_]||W(i,r);if(i[_]=s,!U(s)||V(s))return;const[b,t="",R,h]=/^([^\?#]+)?([^#]+)?(.+)?/.exec(s)||[],f=i.type==="image"?"IMAGE":"LINK",u=String(i.attributes.title||i.attributes.alt||N([i])||""),n=y(k);if(i.type!=="image"){const{isOpenapiDetected:e,isOpenapiValid:m}=await j(t,n,L,c);if(e&&!m)throw new g(`OpenAPI route ${s} does not exist`,{rawLink:s,link:t,title:u,brokenLinkType:f})}if(o.extname(t)===""){if(t.startsWith("/")){if(!E(P(t)))throw new g(`Route ${t} does not exist`,{rawLink:s,link:t,title:u,brokenLinkType:f});p(i,r,t+(R||"")+(h||""))}if(!s.startsWith("#")&&!t.startsWith("/")&&$(n)){const e=A(n)?.slug;if(!e)return;const{isIndexFile:m}=G(n),I=m?P(o.posix.join(e,t)):P(o.posix.join(e,"../",t));if(!E(P(I)))throw new g(`Route ${t} does not exist`,{rawLink:s,link:I,title:u,brokenLinkType:f});p(i,r,I+(R||"")+(h||""))}return}const a=t.startsWith("/")?t.substring(1):o.posix.join(o.posix.dirname(n),decodeURI(t)),O=t.startsWith("/")?o.posix.join("static",t.substring(1)):"",x=c.fs.exists(a),S=c.fs.exists(O),l=A(a);if(!x&&!l&&!S)throw p(i,r,"#"),new g(`File ${a} does not exist`,{rawLink:s,link:a,title:u,brokenLinkType:f});if(l){const e=[v,d,F].includes(l.templateId);p(i,r,(e?l.baseSlug:l.slug)+(h||""))}else if(x){const e=c.fs.getFileInfo(a);if(!e||e.isVirtual)return;const m=await H(w,e.realRelativePath,D);p(i,r,m)}}export{lt as resolveLink};
@@ -1 +1 @@
1
- import f from"node:path";import{OPENAPI_SHARED_DATA_PREFIX as p}from"../../../constants/plugins/openapi-docs.js";import{getNodeAttribute as w}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as A}from"../markdoc/helpers/set-node-attribute-value.js";import{isOpenapiDoc as d}from"../../openapi-docs/is-openapi-doc.js";import{MdResolveError as m}from"./md-resolve-error.js";import{getLinkOriginalAttrName as g}from"./utils.js";async function O(r,t,e,{context:n}){const s=g(t);let o=r[s]||w(r,t);if(o||await d(e,n)&&(o=f.basename(e)),r[s]=o,!o)return;const i=f.posix.join(f.posix.dirname(e),o),a=p+i;if(A(r,t,a),!await n.fs.exists(i))throw new m(`Definition file ${i} does not exist`,{rawLink:i});if(await n.isPathIgnored(i))throw new m(`Definition file ${i} is ignored in config`,{rawLink:i});return{sharedDataId:a}}export{O as resolveOpenApiRef};
1
+ import f from"node:path";import{OPENAPI_SHARED_DATA_PREFIX as p}from"../../../constants/plugins/openapi-docs.js";import{getNodeAttribute as A}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as w}from"../markdoc/helpers/set-node-attribute-value.js";import{isOpenapiDoc as d}from"../../openapi-docs/is-openapi-doc.js";import{MdResolveError as a}from"./md-resolve-error.js";import{getLinkOriginalAttrName as g}from"./utils.js";async function O(r,t,e,{context:n}){const s=g(t);let o=r[s]||A(r,t);if(o||await d(e,n)&&(o=f.basename(e)),r[s]=o,!o)return;const i=f.posix.join(f.posix.dirname(e),o),m=p+i;if(w(r,t,m),!n.fs.exists(i))throw new a(`Definition file ${i} does not exist`,{rawLink:i});if(await n.isPathIgnored(i))throw new a(`Definition file ${i} is ignored in config`,{rawLink:i});return{sharedDataId:m}}export{O as resolveOpenApiRef};
@@ -1 +1 @@
1
- import{getNodeAttribute as m}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as c}from"../markdoc/helpers/set-node-attribute-value.js";import{MdResolveError as f}from"./md-resolve-error.js";import{resolvePathInMarkdown as l}from"../resolve-path-in-markdown.js";async function p(t,a,s,{context:o}){const r=m(t,a);if(r){const e=l(r,s,o.fs.cwd);if(!await o.fs.exists(e))throw new f(`Schema file ${e} does not exist`,{rawLink:e});const i=(await o.cache.load(e,"yaml")).data;c(t,a+"Resolved",i)}}export{p as resolveParsedYaml};
1
+ import{getNodeAttribute as m}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as c}from"../markdoc/helpers/set-node-attribute-value.js";import{MdResolveError as f}from"./md-resolve-error.js";import{resolvePathInMarkdown as l}from"../resolve-path-in-markdown.js";async function p(t,r,a,{context:o}){const s=m(t,r);if(s){const e=l(s,a,o.fs.cwd);if(!o.fs.exists(e))throw new f(`Schema file ${e} does not exist`,{rawLink:e});const i=(await o.cache.load(e,"yaml")).data;c(t,r+"Resolved",i)}}export{p as resolveParsedYaml};
@@ -1 +1 @@
1
- import{getNodeAttribute as m}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as c}from"../markdoc/helpers/set-node-attribute-value.js";import{readFileContent as l}from"../read-file-content.js";import{resolvePathInMarkdown as w}from"../resolve-path-in-markdown.js";import{MdResolveError as p}from"./md-resolve-error.js";async function R(o,e,i,{context:r,actions:s}){const n=m(o,e),a=s.contentDir;if(n){const t=w(n,i,a);if(!await r.fs.exists(t))throw new p(`File ${t} does not exist`,{rawLink:t});const f=await l(t,r.fs);c(o,e+"RawContent",f)}}export{R as resolveRawContent};
1
+ import{getNodeAttribute as m}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as c}from"../markdoc/helpers/set-node-attribute-value.js";import{readFileContent as l}from"../read-file-content.js";import{resolvePathInMarkdown as w}from"../resolve-path-in-markdown.js";import{MdResolveError as p}from"./md-resolve-error.js";async function R(o,e,i,{context:r,actions:s}){const n=m(o,e),a=s.contentDir;if(n){const t=w(n,i,a);if(!r.fs.exists(t))throw new p(`File ${t} does not exist`,{rawLink:t});const f=await l(t,r.fs);c(o,e+"RawContent",f)}}export{R as resolveRawContent};
@@ -1 +1 @@
1
- import{getNodeAttribute as m}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as l}from"../markdoc/helpers/set-node-attribute-value.js";import{optimize as p}from"../../../../compiled/svgo/svgo-node.js";import{slug as c}from"../../../utils/index.js";import{MdResolveError as d}from"./md-resolve-error.js";import{resolvePathInMarkdown as u}from"../resolve-path-in-markdown.js";async function b(o,r,n,{context:i,actions:a}){const e=m(o,r),s=a.contentDir;if(e){const t=u(e,n,s);if(!await i.fs.exists(t))throw new d(`File ${t} does not exist`,{rawLink:e});let f=p(await i.fs.read(t),{plugins:[{name:"prefixIds",params:{prefix:c(t).replaceAll(/[\/\.]/g,"-")}}]}).data;l(o,r+"RawContent",f)}}export{b as resolveSvgContent};
1
+ import{getNodeAttribute as m}from"../markdoc/helpers/get-node-attribute.js";import{setNodeAttributeValue as l}from"../markdoc/helpers/set-node-attribute-value.js";import{optimize as p}from"../../../../compiled/svgo/svgo-node.js";import{slug as c}from"../../../utils/index.js";import{MdResolveError as d}from"./md-resolve-error.js";import{resolvePathInMarkdown as u}from"../resolve-path-in-markdown.js";async function b(o,r,n,{context:i,actions:s}){const e=m(o,r),a=s.contentDir;if(e){const t=u(e,n,a);if(!i.fs.exists(t))throw new d(`File ${t} does not exist`,{rawLink:e});let f=p(await i.fs.read(t),{plugins:[{name:"prefixIds",params:{prefix:c(t).replaceAll(/[\/\.]/g,"-")}}]}).data;l(o,r+"RawContent",f)}}export{b as resolveSvgContent};
@@ -1 +1 @@
1
- import L from"@markdoc/markdoc";import*as M from"path";import{GATED_MARKDOC_TAGS as I}from"../../constants/entitlements.js";import{logger as O}from"../../tools/notifiers/logger.js";import{reporter as N}from"../../tools/notifiers/reporter.js";import{sha1 as G}from"../../utils/crypto/sha1.js";import{formatMarkdocError as F}from"./errors.js";import{extractFirstHeading as j,visit as x}from"./markdoc/plugins/utils.js";import{attributeResolvers as y}from"./attribute-resolvers/index.js";import{MdResolveError as K}from"./attribute-resolvers/md-resolve-error.js";import{processHtmlTokens as $}from"./html/process-html-tokens.js";import{resolveRawPartials as W}from"./markdoc/resolve-raw-partials.js";import{EntitlementsProvider as Y}from"../../entitlements/entitlements-provider.js";import{MARKDOC_PARTIALS_DEPS_KEY as B}from"../../store.js";import{getLinkOriginalAttrName as U}from"./attribute-resolvers/utils.js";const V="EMPTY";async function q(a,s,e){const i=Y.instance(),{actions:g}=e,{relativePath:n,resolveErrors:S}=a,m=new Set,p=new Set,c=new Set,v={},f=new Set,w={},k={};function E(t,P){const D=P||V;t[D]=(t[D]||0)+1}const _=[];return a.resolveErrors.length=0,x(a.ast,t=>{const P=D();_.push(P.then(r=>{r?.sharedDataIds&&r.sharedDataIds.forEach(d=>m.add(d))}).catch(z));async function D(){const r=[];switch(t.type){case"fence":E(w,t.attributes.language);break;case"link":case"image":await y.nativeMdLink(t,t.type==="link"?"href":"src",n,e);break;case"tag":if(!t.tag)break;const d=s?.tags?.[t.tag];if(!d){I[t.tag]&&!i.canAccessFeature(I[t.tag])&&(t.errors.push({level:"warning",id:"invalid-tag",message:`Undefined tag: ${t.tag}`}),t.tag="",t.type="error",t.attributes={});break}const h=t.tag==="html"?t.attributes.name:t.tag;if((t.tag==="html"?f:c).add(h),v[h]=(v[h]||0)+1,h==="code-snippet"&&E(w,t.attributes.language),d.attributes?.__idx&&(t.attributes.__idx=v[t.tag]),d.dynamicComponentLib&&p.add(d.dynamicComponentLib),!d.attributes)break;if(h==="partial"&&t.attributes?.file){const o=U("file"),l=t[o]||t.attributes.file,b=l.startsWith("/")?l.slice(1):M.posix.normalize(M.posix.join(M.posix.dirname(n),l)),u=(g.getGlobalConfig(B)||{})[b];if(u?.dynamicComponents)for(const R of u.dynamicComponents)p.add(R);if(u?.sharedDataDeps)for(const R of u.sharedDataDeps)m.add(R)}for(const[o,l]of Object.entries(d.attributes)){const b=l.type;if(b&&(b.resolver||l.resolver)){const A=y[b.resolver||l.resolver],u=await A?.(t,o,n,e);u?.sharedDataId&&r.push(u.sharedDataId)}}if(h==="code-walkthrough")for(const o of t.attributes.resolvedFilesets||[])for(const l of o.files||[])E(k,l.language);const T=t.attributes?.attrs;if(T&&t.tag==="html")for(const o of Object.keys(T))o==="src"||o==="srcSet"?await y.htmlSourceAttribute(t,o,n,e):o==="href"&&await y.htmlHref(t,o,n,e);break}return{sharedDataIds:r}}async function z(r){if(!(r instanceof K)){await N.panicOnBuild(r.message);return}S.push(F({type:"resolve_link",meta:{...r.meta,link:r.meta.link??r.meta.rawLink},lines:t.lines,location:t.location,error:{id:"",level:"error",message:r.message,location:t.location}},a.relativePath,a.rawContent))}}),await Promise.all(_),a.sharedDataDeps=m,a.dynamicMarkdocComponents=p,a.validatedAtRevision<g.buildRevision&&(a.markdocErrors=L.validate(a.ast,s).map(t=>F(t,n,a.rawContent)),a.validatedAtRevision=g.buildRevision),{sharedDataDeps:a.sharedDataDeps,dynamicMarkdocComponents:Array.from(a.dynamicMarkdocComponents?.values()??[]),tagList:Array.from(c),htmlTagsList:Array.from(f),tagOccurrence:v,codeSnippetLanguages:w,codeWalkthroughLanguages:k}}const H=new L.Tokenizer({html:!0,allowIndentation:!0,allowComments:!0});H.parser.block.ruler.getRules("reference").length=0;function C(a,s){const e=H.tokenize(s),i=$(e);return{ast:L.parse(i,{file:a,slots:!0}),rawContent:s,resolveErrors:[],markdocErrors:[],relativePath:a,sharedDataDeps:void 0,validatedAtRevision:-1}}async function ft(a,s){const{data:e}=await s.cache.load(a,"markdown-ast");return j(e.ast)}async function dt(a,s){N.clearMarkdocProblems();const e=a.getAllRoutes();let i=0;for(const g of e)await a.resolveRouteStaticData(g,s,!0),i++,O.isInteractive()&&i%100===0&&O.logSticky("validate",` \u{1F50D} Status: validating markdoc (${i}/${e.length})`)}async function gt(a,s,e){const i=a.content?G(a.content):"";return await e.context.cache.load(a.cacheId||a.relativePath,{loader:n,name:"markdown-inline-parser"},[i,String(e.actions.buildRevision)]);async function n(S,m,p){let c;if(a.content){const f=a.content?a.content:await m.fs.read(a.relativePath),w=await m.getConfig(),k=await W(f,a.relativePath,w.markdown?.partialsFolders,m);c=C(a.relativePath,k)}else c=(await m.cache.load(a.relativePath,"markdown-ast")).data;let v={};if(e.actions.buildRevision!==0&&(v=await q(c,s,e)),!a.isVirtual){for(const f of c.markdocErrors)p(f);for(const f of c.resolveErrors)p(f)}return{ast:c.ast,info:v}}}export{ft as extractMdFirstHeading,C as getAst,gt as parseAndResolveMarkdoc,q as resolveAndValidateMarkdoc,dt as validateAllMarkdowns};
1
+ import L from"@markdoc/markdoc";import*as M from"path";import{GATED_MARKDOC_TAGS as A}from"../../constants/entitlements.js";import{logger as O}from"../../tools/notifiers/logger.js";import{reporter as F}from"../../tools/notifiers/reporter.js";import{sha1 as G}from"../../utils/crypto/sha1.js";import{formatMarkdocError as N}from"./errors.js";import{extractFirstHeading as j,visit as x}from"./markdoc/plugins/utils.js";import{attributeResolvers as y}from"./attribute-resolvers/index.js";import{MdResolveError as K}from"./attribute-resolvers/md-resolve-error.js";import{processHtmlTokens as $}from"./html/process-html-tokens.js";import{resolveRawPartials as W}from"./markdoc/resolve-raw-partials.js";import{EntitlementsProvider as Y}from"../../entitlements/entitlements-provider.js";import{MARKDOC_PARTIALS_DEPS_KEY as B}from"../../store.js";import{getLinkOriginalAttrName as U}from"./attribute-resolvers/utils.js";const V="EMPTY";async function q(a,o,e){const n=Y.instance(),{actions:g}=e,{relativePath:s,resolveErrors:_}=a,m=new Set,p=new Set,c=new Set,v={},f=new Set,w={},k={};function E(t,P){const D=P||V;t[D]=(t[D]||0)+1}const S=[];return a.resolveErrors.length=0,x(a.ast,t=>{const P=D();S.push(P.then(r=>{r?.sharedDataIds&&r.sharedDataIds.forEach(d=>m.add(d))}).catch(z));async function D(){const r=[];switch(t.type){case"fence":E(w,t.attributes.language);break;case"link":case"image":await y.nativeMdLink(t,t.type==="link"?"href":"src",s,e);break;case"tag":if(!t.tag)break;const d=o?.tags?.[t.tag];if(!d){A[t.tag]&&!n.canAccessFeature(A[t.tag])&&(t.errors.push({level:"warning",id:"invalid-tag",message:`Undefined tag: ${t.tag}`}),t.tag="",t.type="error",t.attributes={});break}const h=t.tag==="html"?t.attributes.name:t.tag;if((t.tag==="html"?f:c).add(h),v[h]=(v[h]||0)+1,h==="code-snippet"&&E(w,t.attributes.language),d.attributes?.__idx&&(t.attributes.__idx=v[t.tag]),d.dynamicComponentLib&&p.add(d.dynamicComponentLib),!d.attributes)break;if(h==="partial"&&t.attributes?.file){const i=U("file"),l=t[i]||t.attributes.file,b=l.startsWith("/")?l.slice(1):M.posix.normalize(M.posix.join(M.posix.dirname(s),l)),u=(g.getGlobalConfig(B)||{})[b];if(u?.dynamicComponents)for(const R of u.dynamicComponents)p.add(R);if(u?.sharedDataDeps)for(const R of u.sharedDataDeps)m.add(R)}for(const[i,l]of Object.entries(d.attributes)){const b=l.type;if(b&&(b.resolver||l.resolver)){const T=y[b.resolver||l.resolver],u=await T?.(t,i,s,e);u?.sharedDataId&&r.push(u.sharedDataId)}}if(h==="code-walkthrough")for(const i of t.attributes.resolvedFilesets||[])for(const l of i.files||[])E(k,l.language);const I=t.attributes?.attrs;if(I&&t.tag==="html")for(const i of Object.keys(I))i==="src"||i==="srcSet"?await y.htmlSourceAttribute(t,i,s,e):i==="href"&&await y.htmlHref(t,i,s,e);break}return{sharedDataIds:r}}async function z(r){if(!(r instanceof K)){await F.panicOnBuild(r.message);return}_.push(N({type:"resolve_link",meta:{...r.meta,link:r.meta.link??r.meta.rawLink},lines:t.lines,location:t.location,error:{id:"",level:"error",message:r.message,location:t.location}},a.relativePath,a.rawContent))}}),await Promise.all(S),a.sharedDataDeps=m,a.dynamicMarkdocComponents=p,a.validatedAtRevision<g.buildRevision&&(a.markdocErrors=L.validate(a.ast,o).map(t=>N(t,s,a.rawContent)),a.validatedAtRevision=g.buildRevision),{sharedDataDeps:a.sharedDataDeps,dynamicMarkdocComponents:Array.from(a.dynamicMarkdocComponents?.values()??[]),tagList:Array.from(c),htmlTagsList:Array.from(f),tagOccurrence:v,codeSnippetLanguages:w,codeWalkthroughLanguages:k}}const H=new L.Tokenizer({html:!0,allowIndentation:!0,allowComments:!0});H.parser.block.ruler.getRules("reference").length=0;function C(a,o){const e=H.tokenize(o),n=$(e);return{ast:L.parse(n,{file:a,slots:!0}),rawContent:o,resolveErrors:[],markdocErrors:[],relativePath:a,sharedDataDeps:void 0,validatedAtRevision:-1}}async function ft(a,o){const{data:e}=await o.cache.load(a,"markdown-ast");return j(e.ast)}async function dt(a,o){F.clearMarkdocProblems();const e=a.getAllRoutes();let n=0;const g=O.isInteractive();for(const s of e)await a.resolveRouteStaticData(s,o,!0),n++,g&&n%100===0&&O.logInFooter("validate",` \u{1F50D} Status: validating markdoc (${n}/${e.length})`)}async function gt(a,o,e){const n=a.content?G(a.content):"";return await e.context.cache.load(a.relativePath,{loader:s,name:"markdown-inline-parser"},[n,String(e.actions.buildRevision)]);async function s(_,m,p){let c;if(a.content){const f=a.content?a.content:await m.fs.read(a.relativePath),w=await m.getConfig(),k=await W(f,a.relativePath,w.markdown?.partialsFolders,m);c=C(a.relativePath,k)}else c=(await m.cache.load(a.relativePath,"markdown-ast")).data;let v={};if(e.actions.buildRevision!==0&&(v=await q(c,o,e)),!a.isVirtual){for(const f of c.markdocErrors)p(f);for(const f of c.resolveErrors)p(f)}return{ast:c.ast,info:v}}}export{ft as extractMdFirstHeading,C as getAst,gt as parseAndResolveMarkdoc,q as resolveAndValidateMarkdoc,dt as validateAllMarkdowns};
@@ -1 +1 @@
1
- import d from"@markdoc/markdoc";import{getPublicEnvVariables as c}from"../../utils/envs/get-public-env-variables.js";import{logger as s}from"../../tools/notifiers/logger.js";import{transformMdAst as g}from"./runtime-transform";const P=async(o,a,r,i)=>{const{ast:p,frontmatter:e,props:l,editPage:n,lastModified:f}=a,{headings:m,renderableAst:v,pageProps:t}=await g(d.Ast.fromJSON(p),{partials:r.partials,variables:{frontmatter:e,...r.variables,env:c()}},i.serverOutDir);return process.env.NODE_ENV==="development"&&t&&(s.logSticky("serverProps",`Server props returned from ${o.fsPath}:`),s.logSticky("serverProps",JSON.stringify(t,null,2))),{...l,ast:v,headings:m,frontmatter:e,editPage:n,lastModified:f}};var N=P;export{N as default};
1
+ import f from"@markdoc/markdoc";import{getPublicEnvVariables as m}from"../../utils/envs/get-public-env-variables.js";import{transformMdAst as p}from"./runtime-transform";const c=async(v,a,r,e)=>{const{ast:s,frontmatter:t,props:o,editPage:i,lastModified:l}=a,{headings:n,renderableAst:d}=await p(f.Ast.fromJSON(s),{partials:r.partials,variables:{frontmatter:t,...r.variables,env:m()}},e.serverOutDir);return{...o,ast:d,headings:n,frontmatter:t,editPage:i,lastModified:l}};var A=c;export{A as default};
@@ -1 +1 @@
1
- import u from"path";import{REDOCLY_TEAMS_RBAC as F}from"@redocly/config";import{MARKDOC_PARTIALS_DATA_KEY as D}from"../../store.js";import{reporter as R}from"../../tools/notifiers/reporter.js";import{extractMdFirstHeading as b,getAst as A}from"./compiler.js";import{getTemplatePath as w}from"./get-template-path.js";import{prepareMarkdocPartials as C}from"./markdoc/partials.js";import{searchResolver as M}from"./search/search-resolver.js";import{markdownStaticDataLoader as T}from"./markdown-static-data-loader.js";import{makeErrorRoute as E}from"../error-route.js";import{validateRbacConfig as I}from"../validate-rbac-config.js";import{findFrontmatterSlugs as O,getSidebarSharedDataId as _,resolveFrontmatterSlugs as G}from"../utils.js";import{isPartial as L}from"./is-partial.js";import{markdownFrontmatterLoader as j}from"./markdown-frontmatter-loader.js";import{resolveRawPartials as z}from"./markdoc/resolve-raw-partials.js";import{getAiDocumentsStore as B}from"./search/get-ai-search-documents.js";import{registerPageProps as K}from"../register-page-props.js";import{sanitizeMalformedMdContent as N}from"./utils/sanitize-malformed-md-content.js";import{telemetryTraceStep as W}from"../../../cli/telemetry/helpers/trace-step.js";async function nt(h){return{id:"markdoc",requiredEntitlements:["markdown"],loaders:{"markdown-frontmatter":j,"markdown-ast":async(e,r)=>{const i=await r.fs.read(e),n=await r.getConfig(),d=await z(i,e,n?.markdown?.partialsFolders,r),l=N(d);return A(e,l)}},processContent:async(e,r)=>{await W("build.plugin.markdown",async i=>{const{markdown:n}=await r.getConfig();i?.setAttribute("config",JSON.stringify(n||{}));const d=n?.partialsFolders??[],l=e.createTemplate("markdown","@redocly/theme/core/templates/Markdown"),S=e.registerServerPropsGetter("markdown",w("./get-server-props.js"));e.createTemplate("error",w("../../../client/app/Error/ErrorDetails.js"));for(const o of await r.fs.scan(/\.md$/))if(!await r.isPathIgnored(o.relativePath)&&!L(o.relativePath,d))try{await k(o)}catch(a){e.addRoute(E(o.relativePath,a)),i?.error(a),await R.panicOnBuild("Failed to create route for markdown file: %s",a.message)}async function k(o){const{relativePath:a,realRelativePath:P}=o,{data:{frontmatter:t}}=await r.cache.load(a,"markdown-frontmatter"),v=t?.metadata||{},y=await O(a,"markdown-frontmatter",t,r),c=G(y,a);let f=null;t?.sidebar&&(f=await _(t.sidebar,a,r.fs));let g=l;if(t?.template){const p=t.template.startsWith("./")||t.template.startsWith("../");let m=t.template;if(p){const s=u.posix.dirname(P);m=u.resolve(h.contentDir,s,t.template)}g=e.createTemplate(t.template,m)}t?.rbac&&I({content:{[a]:t.rbac}}),await K(o,r.fs,e),(c.length?c.reverse():[void 0]).forEach(p=>{e.addRoute({excludeFromSearch:t?.excludeFromSearch||!1,slug:p,fsPath:a,templateId:g,sharedData:f?[{id:f,key:"sidebar"}]:void 0,redirectFrom:Object.entries(t.redirects||{}).map(([m,{type:s}])=>({type:s||301,from:m})),[F]:t?.rbac,getNavText:async()=>(t?.seo?.title||await b(a,r)||"").toString(),metadata:{type:"markdown",...v},async getStaticData(m,s){return T(o,m,r,t,s)},getSearchDocuments:M(t,a,e.getSearchFacets,e.setSearchFacets),getAiDocumentsStore:B(e.getSearchFacets,t),serverPropsGetterIds:[S]})})}})},afterRoutesCreated:async(e,r)=>{const i=await C(r,e);e.setGlobalConfig({[D]:i})}}}export{nt as markdownPlugin};
1
+ import u from"path";import{REDOCLY_TEAMS_RBAC as F}from"@redocly/config";import{MARKDOC_PARTIALS_DATA_KEY as D}from"../../store.js";import{reporter as R}from"../../tools/notifiers/reporter.js";import{extractMdFirstHeading as b,getAst as A}from"./compiler.js";import{getTemplatePath as w}from"./get-template-path.js";import{prepareMarkdocPartials as C}from"./markdoc/partials.js";import{searchResolver as M}from"./search/search-resolver.js";import{markdownStaticDataLoader as T}from"./markdown-static-data-loader.js";import{makeErrorRoute as E}from"../error-route.js";import{validateRbacConfig as I}from"../validate-rbac-config.js";import{findFrontmatterSlugs as O,getSidebarSharedDataId as _,resolveFrontmatterSlugs as G}from"../utils.js";import{isPartial as L}from"./is-partial.js";import{markdownFrontmatterLoader as j}from"./markdown-frontmatter-loader.js";import{resolveRawPartials as z}from"./markdoc/resolve-raw-partials.js";import{getAiDocumentsStore as B}from"./search/get-ai-search-documents.js";import{registerPageProps as K}from"../register-page-props.js";import{sanitizeMalformedMdContent as N}from"./utils/sanitize-malformed-md-content.js";import{telemetryTraceStep as W}from"../../../cli/telemetry/helpers/trace-step.js";async function nt(h){return{id:"markdoc",requiredEntitlements:["markdown"],loaders:{"markdown-frontmatter":j,"markdown-ast":async(e,r)=>{const i=await r.fs.read(e),n=await r.getConfig(),d=await z(i,e,n?.markdown?.partialsFolders,r),l=N(d);return A(e,l)}},processContent:async(e,r)=>{await W("build.plugin.markdown",async i=>{const{markdown:n}=await r.getConfig();i?.setAttribute("config",JSON.stringify(n||{}));const d=n?.partialsFolders??[],l=e.createTemplate("markdown","@redocly/theme/core/templates/Markdown"),S=e.registerServerPropsGetter("markdown",w("./get-server-props.js"));e.createTemplate("error",w("../../../client/app/Error/ErrorDetails.js"));for(const o of r.fs.scan(/\.md$/))if(!await r.isPathIgnored(o.relativePath)&&!L(o.relativePath,d))try{await k(o)}catch(a){e.addRoute(E(o.relativePath,a)),i?.error(a),await R.panicOnBuild("Failed to create route for markdown file: %s",a.message)}async function k(o){const{relativePath:a,realRelativePath:P}=o,{data:{frontmatter:t}}=await r.cache.load(a,"markdown-frontmatter"),v=t?.metadata||{},y=await O(a,"markdown-frontmatter",t,r),c=G(y,a);let f=null;t?.sidebar&&(f=await _(t.sidebar,a,r.fs));let g=l;if(t?.template){const p=t.template.startsWith("./")||t.template.startsWith("../");let m=t.template;if(p){const s=u.posix.dirname(P);m=u.resolve(h.contentDir,s,t.template)}g=e.createTemplate(t.template,m)}t?.rbac&&I({content:{[a]:t.rbac}}),await K(o,r.fs,e),(c.length?c.reverse():[void 0]).forEach(p=>{e.addRoute({excludeFromSearch:t?.excludeFromSearch||!1,slug:p,fsPath:a,templateId:g,sharedData:f?[{id:f,key:"sidebar"}]:void 0,redirectFrom:Object.entries(t.redirects||{}).map(([m,{type:s}])=>({type:s||301,from:m})),[F]:t?.rbac,getNavText:async()=>(t?.seo?.title||await b(a,r)||"").toString(),metadata:{type:"markdown",...v},async getStaticData(m,s){return T(o,m,r,t,s)},getSearchDocuments:M(t,a,e.getSearchFacets,e.setSearchFacets),getAiDocumentsStore:B(e.getSearchFacets,t),serverPropsGetterIds:[S]})})}})},afterRoutesCreated:async(e,r)=>{const i=await C(r,e);e.setGlobalConfig({[D]:i})}}}export{nt as markdownPlugin};
@@ -1 +1 @@
1
- import*as l from"path";import{MARKDOC_PARTIALS_DATA_KEY as f,MARKDOC_PARTIALS_DEPS_KEY as D}from"../../../store.js";import{isPartial as h}from"../is-partial.js";function A(e,t){return Promise.all(e.map(t)).then(o=>e.filter((i,n)=>o[n]))}async function C(e,t){const{markdown:o}=await e.getConfig(),i=o?.partialsFolders??[],n=await A(await e.fs.scan(/\.md$/),async a=>!(!l.posix.basename(a.relativePath).endsWith(".md")||await e.isPathIgnored(a.relativePath)||!h(a.relativePath,i)));t.setGlobalConfig({[f]:Object.fromEntries(n.map(a=>[a.relativePath,{}]))});const m={},p={};for(const a of n){const{ast:s,info:r}=await t.parseMarkdoc(a,e);m[a.relativePath]=s;const c=Array.isArray(r.dynamicMarkdocComponents)?r.dynamicMarkdocComponents:[],d=r.sharedDataDeps instanceof Set?Array.from(r.sharedDataDeps):Array.isArray(r.sharedDataDeps)?r.sharedDataDeps:[];p[a.relativePath]={dynamicComponents:new Set(c),sharedDataDeps:new Set(d)}}return t.setGlobalConfig({[D]:Object.fromEntries(Object.entries(p).map(([a,s])=>[a,{dynamicComponents:Array.from(s.dynamicComponents),sharedDataDeps:Array.from(s.sharedDataDeps)}]))}),m}export{C as prepareMarkdocPartials};
1
+ import*as l from"path";import{MARKDOC_PARTIALS_DATA_KEY as f,MARKDOC_PARTIALS_DEPS_KEY as D}from"../../../store.js";import{isPartial as h}from"../is-partial.js";function A(e,t){return Promise.all(e.map(t)).then(o=>e.filter((i,n)=>o[n]))}async function C(e,t){const{markdown:o}=await e.getConfig(),i=o?.partialsFolders??[],n=await A(e.fs.scan(/\.md$/),async a=>!(!l.posix.basename(a.relativePath).endsWith(".md")||await e.isPathIgnored(a.relativePath)||!h(a.relativePath,i)));t.setGlobalConfig({[f]:Object.fromEntries(n.map(a=>[a.relativePath,{}]))});const m={},p={};for(const a of n){const{ast:s,info:r}=await t.parseMarkdoc(a,e);m[a.relativePath]=s;const c=Array.isArray(r.dynamicMarkdocComponents)?r.dynamicMarkdocComponents:[],d=r.sharedDataDeps instanceof Set?Array.from(r.sharedDataDeps):Array.isArray(r.sharedDataDeps)?r.sharedDataDeps:[];p[a.relativePath]={dynamicComponents:new Set(c),sharedDataDeps:new Set(d)}}return t.setGlobalConfig({[D]:Object.fromEntries(Object.entries(p).map(([a,s])=>[a,{dynamicComponents:Array.from(s.dynamicComponents),sharedDataDeps:Array.from(s.sharedDataDeps)}]))}),m}export{C as prepareMarkdocPartials};
@@ -1,2 +1,2 @@
1
- import p from"node:path";import _ from"is-glob";import{slash as $}from"../../../../utils/path/slash.js";import{reporter as d}from"../../../tools/notifiers/reporter.js";import{convertGlobToRegex as h}from"../../../utils/index.js";import{formatMarkdocError as k}from"../errors.js";import{isPartial as E}from"../is-partial.js";const b=/\{\% ?raw-partial file="([^"]+)" ?\/?\%\}/gm,y=async(t,a,i=[],o,l=[a])=>{for(const s of i){const r=_(s)?h(s):new RegExp(`^${s}/`);await o.fs.scan(r)}const n=[],f=t.replace(b,(s,r)=>(n.push(u(s,r)),"_$redocly$"+(n.length-1)+"$")),w=await Promise.all(n);return f.replace(/_\$redocly\$(\d+)\$/g,(s,r)=>w[+r]);async function u(s,r){const e=r.startsWith("/")?r.slice(1):$(p.relative(o.fs.cwd,p.resolve(o.fs.cwd,p.dirname(a),r)));if(l.includes(e)){const c=[...l,e];return await d.panicOnBuildContentError(`Circular reference chain detected when processing raw partials: ${c.map(()=>"%rp").join(" -> ")}`,...c),""}const m=!await o.fs.exists(e),g=!e.endsWith(".md")||await o.isPathIgnored(e)||!E(e,i);if(m||g){const R={type:"resolve_link",lines:[1,t.split(`
1
+ import p from"node:path";import _ from"is-glob";import{slash as $}from"../../../../utils/path/slash.js";import{reporter as d}from"../../../tools/notifiers/reporter.js";import{convertGlobToRegex as h}from"../../../utils/index.js";import{formatMarkdocError as k}from"../errors.js";import{isPartial as E}from"../is-partial.js";const b=/\{\% ?raw-partial file="([^"]+)" ?\/?\%\}/gm,y=async(t,a,i=[],o,l=[a])=>{for(const s of i){const r=_(s)?h(s):new RegExp(`^${s}/`);await o.fs.scan(r)}const n=[],f=t.replace(b,(s,r)=>(n.push(u(s,r)),"_$redocly$"+(n.length-1)+"$")),w=await Promise.all(n);return f.replace(/_\$redocly\$(\d+)\$/g,(s,r)=>w[+r]);async function u(s,r){const e=r.startsWith("/")?r.slice(1):$(p.relative(o.fs.cwd,p.resolve(o.fs.cwd,p.dirname(a),r)));if(l.includes(e)){const c=[...l,e];return await d.panicOnBuildContentError(`Circular reference chain detected when processing raw partials: ${c.map(()=>"%rp").join(" -> ")}`,...c),""}const m=!o.fs.exists(e),g=!e.endsWith(".md")||await o.isPathIgnored(e)||!E(e,i);if(m||g){const R={type:"resolve_link",lines:[1,t.split(`
2
2
  `).length],meta:{rawLink:r,link:e},error:{id:"error",level:"error",message:m?"Raw partial file does not exist":"Could not resolve raw partial. Starting with 0.73.0 version all partials should be placed in partials folders"}};return d.reportMarkdocProblem(k(R,a,t)),""}const v=await o.fs.read(e);return await y(v,e,i,o,[...l,e])}};export{y as resolveRawPartials};
@@ -1 +1 @@
1
- import A from"path";import{REDOCLY_TEAMS_RBAC as m,REDOCLY_ROUTE_RBAC as y}from"@redocly/config";import{removeTrailingSlash as R}from"../../../utils/url/remove-trailing-slash.js";import{addLeadingSlash as S}from"../../../utils/url/add-leading-slash.js";import{resolveFrontmatterKeys as P}from"../resolve-frontmatter-keys.js";import{resolveItem as T}from"../nav-utils.js";const C=new WeakMap;async function _(l,i,s,e,a){const o=await s.getConfig(),{ast:d,compoundHash:n,info:c}=await a.parseMarkdoc(l,s),g={...o.markdown?.editPage,...e.markdown?.editPage},t=i.fsPath!=null?await s.fs.getFileInfo(i.fsPath):null,f=!g?.hide&&g?.baseUrl?{to:R(g.baseUrl)+S(t?.realRelativePath||i.fsPath||"")}:void 0,k={...o.feedback,...e.feedback},u=e.feedback?{type:k.type||"sentiment",settings:k.settings||{},hide:e.feedback?.hide}:void 0;let w=C.get(d),r=w?.ast;(!r||w?.compoundHash!==n)&&(r=JSON.stringify(d),C.set(d,{ast:r,compoundHash:n}));let h;e.navigation&&(h={...e.navigation,nextButton:await L(e.navigation.nextButton,i,a,s),previousButton:await L(e.navigation.previousButton,i,a,s)});const p=e?.seo?await P(e.seo,["image"],i.fsPath||"",a,s):void 0,v=c.tagList;Array.isArray(v)&&v.includes("code-walkthrough")&&(e.markdown=e.markdown||{},e.markdown.toc={hide:!0},e.footer=e.footer||{},e.footer={hide:!0});const b=e?.seo?.title||await i.getNavText?.();return{ast:r,frontmatter:await P({...e,...u!==void 0?{feedback:u}:{},...p!==void 0?{seo:p}:{},...h!==void 0?{navigation:h}:{}},o.markdown?.frontMatterKeysToResolve||["image","links"],i.fsPath||"",a,s),editPage:f,props:{metadata:{markdoc:{tagList:c.tagList}},seo:{...p,...b?{title:b}:{}}},[m]:i[m],[y]:i[y]}}async function L(l,i,s,e){if(!l||typeof l!="object")return;let a=l,o,d;if("page"in a&&typeof a.page=="string"){const{page:t,...f}=a;a=f,o=t}if("label"in a&&typeof a.label=="string"){const{label:t,...f}=a;a=f,d=t}let n;if(o){const t=await T({page:o},i.fsPath?A.dirname(i.fsPath):".",s,e,{navFile:i.fsPath||""});n=Array.isArray(t)?t[0]:t,n=n?.type!=="error"?n:void 0}const c=n?.routeSlug,g=d??n?.label;return{...a,label:g,link:c}}export{_ as markdownStaticDataLoader};
1
+ import A from"path";import{REDOCLY_TEAMS_RBAC as m,REDOCLY_ROUTE_RBAC as y}from"@redocly/config";import{removeTrailingSlash as R}from"../../../utils/url/remove-trailing-slash.js";import{addLeadingSlash as S}from"../../../utils/url/add-leading-slash.js";import{resolveFrontmatterKeys as P}from"../resolve-frontmatter-keys.js";import{resolveItem as T}from"../nav-utils.js";const C=new WeakMap;async function _(l,i,s,e,a){const o=await s.getConfig(),{ast:d,compoundHash:n,info:c}=await a.parseMarkdoc(l,s),g={...o.markdown?.editPage,...e.markdown?.editPage},t=i.fsPath!=null?s.fs.getFileInfo(i.fsPath):null,f=!g?.hide&&g?.baseUrl?{to:R(g.baseUrl)+S(t?.realRelativePath||i.fsPath||"")}:void 0,k={...o.feedback,...e.feedback},u=e.feedback?{type:k.type||"sentiment",settings:k.settings||{},hide:e.feedback?.hide}:void 0;let w=C.get(d),r=w?.ast;(!r||w?.compoundHash!==n)&&(r=JSON.stringify(d),C.set(d,{ast:r,compoundHash:n}));let h;e.navigation&&(h={...e.navigation,nextButton:await L(e.navigation.nextButton,i,a,s),previousButton:await L(e.navigation.previousButton,i,a,s)});const p=e?.seo?await P(e.seo,["image"],i.fsPath||"",a,s):void 0,v=c.tagList;Array.isArray(v)&&v.includes("code-walkthrough")&&(e.markdown=e.markdown||{},e.markdown.toc={hide:!0},e.footer=e.footer||{},e.footer={hide:!0});const b=e?.seo?.title||await i.getNavText?.();return{ast:r,frontmatter:await P({...e,...u!==void 0?{feedback:u}:{},...p!==void 0?{seo:p}:{},...h!==void 0?{navigation:h}:{}},o.markdown?.frontMatterKeysToResolve||["image","links"],i.fsPath||"",a,s),editPage:f,props:{metadata:{markdoc:{tagList:c.tagList}},seo:{...p,...b?{title:b}:{}}},[m]:i[m],[y]:i[y]}}async function L(l,i,s,e){if(!l||typeof l!="object")return;let a=l,o,d;if("page"in a&&typeof a.page=="string"){const{page:t,...f}=a;a=f,o=t}if("label"in a&&typeof a.label=="string"){const{label:t,...f}=a;a=f,d=t}let n;if(o){const t=await T({page:o},i.fsPath?A.dirname(i.fsPath):".",s,e,{navFile:i.fsPath||""});n=Array.isArray(t)?t[0]:t,n=n?.type!=="error"?n:void 0}const c=n?.routeSlug,g=d??n?.label;return{...a,label:g,link:c}}export{_ as markdownStaticDataLoader};
@@ -1,5 +1,5 @@
1
1
  import type { ApiFunctionsContext, ApiFunctionsUser } from '@redocly/config';
2
- export declare function shouldHandleMcpAuth(context: ApiFunctionsContext): boolean;
2
+ export declare function shouldHandleMcpAuth(requiresLogin: boolean, rbacConfig?: Record<string, unknown>): boolean;
3
3
  export declare function handleMcpAuth(request: Request, context: ApiFunctionsContext): Promise<{
4
4
  isAuthenticated: boolean;
5
5
  isTokenValid?: boolean;
@@ -1 +1 @@
1
- import{extractTokenFromAuthHeader as u}from"../utils/jwt.js";import{getUserParamsFromCookies as d}from"../../../web-server/auth.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as s,RBAC_ALL_OTHER_TEAMS as a}from"../../../../constants/common.js";function c(e){return!e||typeof e!="object"||Object.keys(e).length===0?!1:!(e[s]&&e[s]!=="none"||e[a]&&e[a]!=="none")}function p(e){const o=!!e?.config?.requiresLogin,r=e?.config?.rbac;if(!r||Object.keys(r).length===0)return o;const t=r.content;if(t&&Object.keys(t).length>0&&Object.values(t).some(c))return!0;const i=r.teamFoldersBaseRoles;return c(i)?!0:o}async function g(e,o){const r=e.headers.get("Authorization");if(!r)return{isAuthenticated:!1};const t=u(r),i=o?.config?.ssoDirect||{},n=t?await d(i,{authorization:t,idp_access_token:t}):{};return t&&n&&n.isAuthenticated?{isAuthenticated:!0,isTokenValid:!0,currentUser:{teams:n.teams||[],email:n.email||"",claims:n,isAuthenticated:!0,idpAccessToken:n.idpAccessToken||void 0,idpId:n.idpId||void 0}}:{isAuthenticated:!1,isTokenValid:!1}}function m(e){return new Response(JSON.stringify({error:"unauthorized",message:"Authentication required"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":`Bearer realm="${e}/.well-known/oauth-protected-resource/mcp"`,"Access-Control-Allow-Origin":"*"}})}function k(){return new Response(JSON.stringify({error:"invalid_token",message:"Invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":'Bearer error="invalid_token", error_description="Invalid or expired token"',"Access-Control-Allow-Origin":"*"}})}export{k as constructInvalidTokenResponse,m as constructUnauthorizedResponse,g as handleMcpAuth,p as shouldHandleMcpAuth};
1
+ import{extractTokenFromAuthHeader as u}from"../utils/jwt.js";import{getUserParamsFromCookies as d}from"../../../web-server/auth.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as i,RBAC_ALL_OTHER_TEAMS as a}from"../../../../constants/common.js";function c(e){return!e||typeof e!="object"||Object.keys(e).length===0?!1:!(e[i]&&e[i]!=="none"||e[a]&&e[a]!=="none")}function p(e,t){if(!t||Object.keys(t).length===0)return e;const r=t.content;if(r&&Object.keys(r).length>0&&Object.values(r).some(c))return!0;const o=t.teamFoldersBaseRoles;return c(o)?!0:e}async function m(e,t){const r=e.headers.get("Authorization");if(!r)return{isAuthenticated:!1};const o=u(r),s=t?.config?.ssoDirect||{},n=o?await d(s,{authorization:o,idp_access_token:o}):{};return o&&n&&n.isAuthenticated?{isAuthenticated:!0,isTokenValid:!0,currentUser:{teams:n.teams||[],email:n.email||"",claims:n,isAuthenticated:!0,idpAccessToken:n.idpAccessToken||void 0,idpId:n.idpId||void 0}}:{isAuthenticated:!1,isTokenValid:!1}}function k(e){return new Response(JSON.stringify({error:"unauthorized",message:"Authentication required"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":`Bearer realm="${e}/.well-known/oauth-protected-resource/mcp"`,"Access-Control-Allow-Origin":"*"}})}function T(){return new Response(JSON.stringify({error:"invalid_token",message:"Invalid or expired token"}),{status:401,headers:{"Content-Type":"application/json","WWW-Authenticate":'Bearer error="invalid_token", error_description="Invalid or expired token"',"Access-Control-Allow-Origin":"*"}})}export{T as constructInvalidTokenResponse,k as constructUnauthorizedResponse,m as handleMcpAuth,p as shouldHandleMcpAuth};
@@ -1,4 +1,9 @@
1
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
3
- export declare function registerGetEndpointTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetEndpointTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-endpoint-info.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as h,resolveParameters as T,resolveRequestBody as g,resolveResponses as P}from"../utils.js";import{checkEndpointAndDeleteXMcp as v}from"../../utils/xmcp-utils.js";import{telemetry as a}from"../../../../telemetry/index.js";const s="get-endpoint-info",c=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD","TRACE"],O={type:"object",required:["name","path","method"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1},path:{type:"string",description:"Endpoint path (e.g. /api/v1/users)",minLength:1},method:{type:"string",description:"HTTP method (GET, POST, PUT, DELETE, etc.)",enum:[...c,...c.map(n=>n.toLowerCase())],minLength:1}}};function M(n,d){n.tool(s,"Get comprehensive information about specific endpoint including parameters, security, and examples",O,async({name:i,path:o,method:p})=>{try{const e=h(d,i),m=o.startsWith("/")?o:`/${o}`;if(!e)return{content:[{type:"text",text:`No APIs found matching "${i}"`}]};const{title:l=""}=e.info||{},r=e.paths?.[m],u=p.toLowerCase();if(!r)return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const t=r[u];if(!t||!v(t,"docs"))return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const y=r?.parameters||[],E=t.parameters||[],f={...t,parameters:T({pathParams:y,opParams:E,definition:e}),requestBody:g(t.requestBody,e),responses:P(t.responses,e)};return a.sendMcpToolCalledMessage({server_type:"docs",tool:s}),{content:[{type:"text",text:JSON.stringify({api:l,version:e.info?.version||"",servers:e.servers||[],endpoint:{path:o,method:p.toUpperCase(),...f},globalSecurity:e.security||[],securitySchemes:e.components?.securitySchemes||[]},null,2)}]}}catch(e){throw a.sendMcpErrorMessage({server_type:"docs",tool:s,message:e?.message||"",stack:e?.stack||""}),e}})}export{M as registerGetEndpointTools};
1
+ import{findApiDescriptionByName as P,resolveParameters as v,resolveRequestBody as x,resolveResponses as O}from"../utils.js";import{checkEndpointAndDeleteXMcp as S}from"../../utils/xmcp-utils.js";import{telemetry as c}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as A}from"./utils.js";const p="get-endpoint-info",d=["GET","POST","PUT","DELETE","PATCH","OPTIONS","HEAD","TRACE"],L={type:"object",required:["name","path","method"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1},path:{type:"string",description:"Endpoint path (e.g. /api/v1/users)",minLength:1},method:{type:"string",description:"HTTP method (GET, POST, PUT, DELETE, etc.)",enum:[...d,...d.map(n=>n.toLowerCase())],minLength:1}}};function N({server:n,apiDescriptionsMap:m,outdir:l,accessInfo:u}){n.tool(p,"Get comprehensive information about specific endpoint including parameters, security, and examples",L,async({name:s,path:r,method:a})=>{try{const t=P(m,s);if(!t)return{content:[{type:"text",text:`No API found matching "${s}".`}]};const e=await A({relativePath:t?.relativePath||"",outdir:l,accessInfo:u});if(!e)return{content:[{type:"text",text:`Spec not found from the file system with "${s}".`}]};const f=r.startsWith("/")?r:`/${r}`,{title:y=""}=e.info||{},i=e.paths?.[f],h=a.toLowerCase();if(!i)return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const o=i[h];if(!o||!S(o,"docs"))return{content:[{type:"text",text:"Endpoint not found"}],isError:!0};const E=i?.parameters||[],T=o.parameters||[],g={...o,parameters:v({pathParams:E,opParams:T,definition:e}),requestBody:x(o.requestBody,e),responses:O(o.responses,e)};return c.sendMcpToolCalledMessage({server_type:"docs",tool:p}),{content:[{type:"text",text:JSON.stringify({api:y,version:e.info?.version||"",servers:e.servers||[],endpoint:{path:r,method:a.toUpperCase(),...g},globalSecurity:e.security||[],securitySchemes:e.components?.securitySchemes||[]},null,2)}]}}catch(t){throw c.sendMcpErrorMessage({server_type:"docs",tool:p,message:t?.message||"",stack:t?.stack||""}),t}})}export{N as registerGetEndpointTools};
@@ -1,4 +1,9 @@
1
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
3
- export declare function registerGetEndpointsTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetEndpointsTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-endpoints.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as p}from"../utils.js";import{getEndpointsFromPaths as c}from"./utils.js";import{telemetry as r}from"../../../../telemetry/index.js";const e="get-endpoints",a={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function m(s,i){s.tool(e,"Get all endpoints for a specific API",a,async({name:o})=>{try{const t=p(i,o);if(!t)return{content:[{type:"text",text:`No APIs found matching "${o}"`}]};const n=c(t);return n.length===0?{content:[{type:"text",text:"No endpoints found"}]}:(r.sendMcpToolCalledMessage({server_type:"docs",tool:e}),{content:[{type:"text",text:JSON.stringify({api:t.info?.title||"",version:t.info?.version||"",servers:t.servers||[],endpoints:n},null,2)}]})}catch(t){throw r.sendMcpErrorMessage({server_type:"docs",tool:e,message:t?.message||"",stack:t?.stack||""}),t}})}export{m as registerGetEndpointsTools};
1
+ import{findApiDescriptionByName as f}from"../utils.js";import{getApiDescriptionFromFs as d,getEndpointsFromPaths as l}from"./utils.js";import{telemetry as i}from"../../../../telemetry/index.js";const n="get-endpoints",m={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function u({server:s,apiDescriptionsMap:p,outdir:c,accessInfo:a}){s.tool(n,"Get all endpoints for a specific API",m,async({name:o})=>{try{const t=f(p,o);if(!t)return{content:[{type:"text",text:`No API found matching "${o}".`}]};const e=await d({relativePath:t?.relativePath||"",outdir:c,accessInfo:a});if(!e)return{content:[{type:"text",text:`Spec not found from the file system with "${o}".`}]};const r=l(e);return r.length===0?{content:[{type:"text",text:"No endpoints found"}]}:(i.sendMcpToolCalledMessage({server_type:"docs",tool:n}),{content:[{type:"text",text:JSON.stringify({api:e.info?.title||"",version:e.info?.version||"",servers:e.servers||[],endpoints:r},null,2)}]})}catch(t){throw i.sendMcpErrorMessage({server_type:"docs",tool:n,message:t?.message||"",stack:t?.stack||""}),t}})}export{u as registerGetEndpointsTools};
@@ -1,4 +1,9 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
2
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
- export declare function registerGetFullApiDescriptionTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetFullApiDescriptionTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-full-api-description.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as s}from"../utils.js";import{telemetry as r}from"../../../../telemetry/index.js";const t="get-full-api-description",p={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function l(i,n){i.tool(t,"Get the complete OpenAPI description",p,async({name:o})=>{try{const e=s(n,o);return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:t}),{content:[{type:"text",text:JSON.stringify({api:e.info?.title||"",version:e.info?.version||"",definition:e},null,2)}]}):{content:[{type:"text",text:`No APIs found matching "${o}"`}]}}catch(e){throw r.sendMcpErrorMessage({server_type:"docs",tool:t,message:e?.message||"",stack:e?.stack||""}),e}})}export{l as registerGetFullApiDescriptionTools};
1
+ import{findApiDescriptionByName as a}from"../utils.js";import{telemetry as r}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as l}from"./utils.js";const i="get-full-api-description",f={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function g({server:n,apiDescriptionsMap:s,outdir:p,accessInfo:c}){n.tool(i,"Get the complete OpenAPI description",f,async({name:o})=>{try{const t=a(s,o);if(!t)return{content:[{type:"text",text:`No API found matching "${o}".`}]};const e=await l({relativePath:t?.relativePath||"",outdir:p,accessInfo:c});return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:i}),{content:[{type:"text",text:JSON.stringify({api:e.info?.title||"",version:e.info?.version||"",definition:e},null,2)}]}):{content:[{type:"text",text:`Spec not found from the file system with "${o}".`}]}}catch(t){throw r.sendMcpErrorMessage({server_type:"docs",tool:i,message:t?.message||"",stack:t?.stack||""}),t}})}export{g as registerGetFullApiDescriptionTools};
@@ -1,4 +1,9 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
2
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
- export declare function registerGetSecuritySchemesTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerGetSecuritySchemesTools({ server, apiDescriptionsMap, outdir, accessInfo, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ outdir: string;
7
+ accessInfo: AccessInfo;
8
+ }): void;
4
9
  //# sourceMappingURL=get-security-schemes.d.ts.map
@@ -1 +1 @@
1
- import{findDefinitionByName as n}from"../utils";import{telemetry as r}from"../../../../telemetry/index.js";const t="get-security-schemes",c={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function p(o,i){o.tool(t,"Get the security schemes for a specific API",c,async({name:s})=>{try{const e=n(i,s);return e?(r.sendMcpToolCalledMessage({server_type:"docs",tool:t}),{content:[{type:"text",text:JSON.stringify({name:e.info?.title,version:e.info?.version,securitySchemes:e.components?.securitySchemes||[],security:e.security||[]},null,2)}]}):{content:[{type:"text",text:`No APIs found matching "${s}"`}]}}catch(e){throw r.sendMcpErrorMessage({server_type:"docs",tool:t,message:e?.message||"",stack:e?.stack||""}),e}})}export{p as registerGetSecuritySchemesTools};
1
+ import{findApiDescriptionByName as a}from"../utils";import{telemetry as i}from"../../../../telemetry/index.js";import{getApiDescriptionFromFs as m}from"./utils.js";const o="get-security-schemes",y={type:"object",required:["name"],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",minLength:1}}};function h({server:s,apiDescriptionsMap:n,outdir:c,accessInfo:p}){s.tool(o,"Get the security schemes for a specific API",y,async({name:r})=>{try{const e=a(n,r);if(!e)return{content:[{type:"text",text:`No API found matching "${r}".`}]};const t=await m({relativePath:e?.relativePath||"",outdir:c,accessInfo:p});return t?(i.sendMcpToolCalledMessage({server_type:"docs",tool:o}),{content:[{type:"text",text:JSON.stringify({name:t.info?.title,version:t.info?.version,securitySchemes:t.components?.securitySchemes||[],security:t.security||[]},null,2)}]}):{content:[{type:"text",text:`Spec not found from the file system with "${r}".`}]}}catch(e){throw i.sendMcpErrorMessage({server_type:"docs",tool:o,message:e?.message||"",stack:e?.stack||""}),e}})}export{h as registerGetSecuritySchemesTools};
@@ -1,13 +1,14 @@
1
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
2
- import type { OpenAPIDefinition } from '@redocly/openapi-docs/lib/types/open-api.js';
2
+ import type { AccessInfo, ApiDescriptionInfo } from '../../types.js';
3
3
  /**
4
4
  * Registers all tools with the MCP server
5
5
  */
6
- export declare function registerDocsTools({ server, definitions, baseUrl, outdir, headers, }: {
6
+ export declare function registerDocsTools({ server, baseUrl, outdir, apiDescriptionsMap, headers, accessInfo, }: {
7
7
  server: McpServer;
8
- definitions: OpenAPIDefinition[];
9
8
  baseUrl: string;
10
9
  outdir: string;
10
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
11
+ accessInfo: AccessInfo;
11
12
  headers?: Record<string, string | string[] | undefined>;
12
13
  }): void;
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- import{registerListApisTools as i}from"./list-apis.js";import{registerGetEndpointsTools as l}from"./get-endpoints.js";import{registerGetEndpointTools as s}from"./get-endpoint-info.js";import{registerGetSecuritySchemesTools as e}from"./get-security-schemes.js";import{registerGetFullApiDescriptionTools as g}from"./get-full-api-description.js";import{registerSearchTool as T}from"./search.js";import{registerWhoAmITool as c}from"./whoami.js";function E({server:o,definitions:t,baseUrl:m,outdir:p,headers:r}){c(o,r),i(o,t),l(o,t),s(o,t),e(o,t),g(o,t),T(o,m,p,r)}export{E as registerDocsTools};
1
+ import{registerListApisTools as g}from"./list-apis.js";import{registerGetEndpointsTools as T}from"./get-endpoints.js";import{registerGetEndpointTools as e}from"./get-endpoint-info.js";import{registerGetSecuritySchemesTools as f}from"./get-security-schemes.js";import{registerGetFullApiDescriptionTools as h}from"./get-full-api-description.js";import{registerSearchTool as A}from"./search.js";import{registerWhoAmITool as G}from"./whoami.js";import{shouldHandleMcpAuth as p}from"../../auth/auth-handlers.js";function F({server:o,baseUrl:l,outdir:m,apiDescriptionsMap:r,headers:i,accessInfo:t}){p(t.requiresLogin,t.rbac)&&G(o,i),g({server:o,apiDescriptionsMap:r}),T({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),e({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),f({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),h({server:o,apiDescriptionsMap:r,outdir:m,accessInfo:t}),A(o,l,m,i)}export{F as registerDocsTools};
@@ -1,4 +1,7 @@
1
- import type { OpenAPIDefinition } from '@redocly/openapi-docs';
2
1
  import type { McpServer } from '@redocly/mcp-typescript-sdk/server/mcp.js';
3
- export declare function registerListApisTools(server: McpServer, definitions: OpenAPIDefinition[]): void;
2
+ import type { ApiDescriptionInfo } from '../../types.js';
3
+ export declare function registerListApisTools({ server, apiDescriptionsMap, }: {
4
+ server: McpServer;
5
+ apiDescriptionsMap: Record<string, ApiDescriptionInfo>;
6
+ }): void;
4
7
  //# sourceMappingURL=list-apis.d.ts.map
@@ -1 +1 @@
1
- import{findAllDefinitionsByName as p}from"../utils.js";import{telemetry as a}from"../../../../telemetry/index.js";const r="list-apis",n={type:"object",required:[],additionalProperties:!1,properties:{name:{type:"string",description:"API name (or part of it)",nullable:!0}}};function y(l,o){l.tool(r,"Lists available APIs with their context and purpose",n,async({name:s})=>{try{let e=o;return s&&s!=="null"&&(e=p(o,s)),e.length===0?{content:[{type:"text",text:s?`No APIs found matching "${s}"`:"No APIs available"}]}:(a.sendMcpToolCalledMessage({server_type:"docs",tool:r}),{content:e.map(t=>({type:"text",text:JSON.stringify({name:t.info?.title||"",description:t.info?.description||"",version:t.info?.version||"",paths:Object.keys(t.paths||{}).length,schemas:Object.keys(t.components?.schemas||{}).length,servers:t.servers||[]},null,2)}))})}catch(e){throw a.sendMcpErrorMessage({server_type:"docs",tool:r,message:e?.message||"",stack:e?.stack||""}),e}})}export{y as registerListApisTools};
1
+ import{telemetry as a}from"../../../../telemetry/index.js";import{filterApiDescriptionsByName as g}from"../utils.js";const r="list-apis",f={type:"object",additionalProperties:!1,required:[],properties:{filter:{type:"string",description:"API name (or part of it)",minLength:1},page:{type:"number",description:"Page number",minimum:1,default:1},limit:{type:"number",description:"Number of APIs per page. Default is 300",minimum:1,default:300}}};function b({server:p,apiDescriptionsMap:c}){p.tool(r,"Lists available APIs with their context and purpose",f,async({filter:o,page:i=1,limit:t=300})=>{let e=Object.values(c);o&&(e=g(e,o));const n=(i-1)*t,l=n+t,m=Math.ceil(e.length/t),d=e.length;e=e.slice(n,l);try{return e.length===0?{content:[{type:"text",text:"No APIs available"}]}:(a.sendMcpToolCalledMessage({server_type:"docs",tool:r}),{content:[{type:"text",text:JSON.stringify({items:e.map(({relativePath:s,...u})=>u),limit:t,total:d,page:i,totalPages:m})}]})}catch(s){throw a.sendMcpErrorMessage({server_type:"docs",tool:r,message:s?.message||"",stack:s?.stack||""}),s}})}export{b as registerListApisTools};