@redocly/redoc 0.129.0-next.1 → 0.129.0-next.3

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 (295) hide show
  1. package/CHANGELOG.md +52 -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/useBanner.d.ts +4 -0
  25. package/dist/client/app/hooks/useBanner.js +1 -1
  26. package/dist/client/app/hooks/useLoginUrl.js +1 -1
  27. package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
  28. package/dist/client/app/pages/Login/Login.js +1 -1
  29. package/dist/client/app/utils/loadAndNavigate.js +1 -1
  30. package/dist/client/browser-entry.js +2 -2
  31. package/dist/client/providers/page-data/hooks.d.ts +2 -1
  32. package/dist/client/providers/page-data/hooks.js +1 -1
  33. package/dist/client/providers/theme/ThemeDataProvider.js +1 -1
  34. package/dist/client/runtime/loader.js +1 -1
  35. package/dist/client/types/post-message.d.ts +2 -1
  36. package/dist/client/utils/catalog/inject-catalog-items.d.ts +1 -1
  37. package/dist/client/utils/catalog/inject-catalog-items.js +1 -1
  38. package/dist/constants/common.d.ts +0 -4
  39. package/dist/constants/common.js +1 -1
  40. package/dist/constants/l10n/langs/ar.js +1 -1
  41. package/dist/constants/l10n/langs/de.js +1 -1
  42. package/dist/constants/l10n/langs/en.js +1 -1
  43. package/dist/constants/l10n/langs/es.js +1 -1
  44. package/dist/constants/l10n/langs/fr.js +1 -1
  45. package/dist/constants/l10n/langs/hi.js +1 -1
  46. package/dist/constants/l10n/langs/it.js +1 -1
  47. package/dist/constants/l10n/langs/ja.js +1 -1
  48. package/dist/constants/l10n/langs/ko.js +1 -1
  49. package/dist/constants/l10n/langs/pl.js +1 -1
  50. package/dist/constants/l10n/langs/pt-BR.js +1 -1
  51. package/dist/constants/l10n/langs/pt.js +1 -1
  52. package/dist/constants/l10n/langs/ru.js +1 -1
  53. package/dist/constants/l10n/langs/uk.js +1 -1
  54. package/dist/constants/l10n/langs/zh.js +1 -1
  55. package/dist/server/api-routes/execute-api-route.d.ts +0 -7
  56. package/dist/server/api-routes/execute-api-route.js +1 -1
  57. package/dist/server/api-routes/helpers/setup-logger.d.ts +2 -2
  58. package/dist/server/api-routes/helpers/setup-logger.js +1 -1
  59. package/dist/server/api-routes/run-api-routes-worker.js +1 -1
  60. package/dist/server/fs/cache.d.ts +1 -2
  61. package/dist/server/fs/cache.js +1 -1
  62. package/dist/server/fs/content-fs.d.ts +9 -4
  63. package/dist/server/fs/content-fs.js +1 -1
  64. package/dist/server/fs/fs.d.ts +6 -6
  65. package/dist/server/fs/fs.js +1 -3
  66. package/dist/server/fs/load-error.d.ts +2 -2
  67. package/dist/server/fs/load-error.js +1 -1
  68. package/dist/server/fs/utils/async-storage.d.ts +0 -8
  69. package/dist/server/fs/utils/async-storage.js +1 -1
  70. package/dist/server/fs/utils/isVirtualFile.d.ts +1 -1
  71. package/dist/server/fs/utils/isVirtualFile.js +1 -1
  72. package/dist/server/persistence/kv/helpers/decode-cursor.d.ts +2 -0
  73. package/dist/server/persistence/kv/helpers/decode-cursor.js +1 -0
  74. package/dist/server/persistence/kv/helpers/encode-cursor.d.ts +2 -0
  75. package/dist/server/persistence/kv/helpers/encode-cursor.js +1 -0
  76. package/dist/server/persistence/kv/mappers/create-kv-list-entry.d.ts +5 -0
  77. package/dist/server/persistence/kv/mappers/create-kv-list-entry.js +1 -0
  78. package/dist/server/persistence/kv/mappers/create-kv-value.d.ts +4 -0
  79. package/dist/server/persistence/kv/mappers/create-kv-value.js +1 -0
  80. package/dist/server/persistence/kv/repositories/kv-remote-repository.d.ts +5 -5
  81. package/dist/server/persistence/kv/repositories/kv-remote-repository.js +1 -1
  82. package/dist/server/persistence/kv/schemas/kv-schemas.d.ts +10 -0
  83. package/dist/server/persistence/kv/schemas/kv-schemas.js +1 -0
  84. package/dist/server/persistence/kv/services/kv-service.d.ts +6 -6
  85. package/dist/server/persistence/kv/services/kv-service.js +1 -1
  86. package/dist/server/plugins/api-functions/index.js +1 -1
  87. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.d.ts +1 -1
  88. package/dist/server/plugins/arazzo-docs/arazzo-doc-loader.js +2 -2
  89. package/dist/server/plugins/arazzo-docs/index.d.ts +1 -1
  90. package/dist/server/plugins/arazzo-docs/index.js +1 -1
  91. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.d.ts +1 -1
  92. package/dist/server/plugins/asyncapi-docs/asyncapi-doc-loader.js +2 -2
  93. package/dist/server/plugins/asyncapi-docs/index.d.ts +1 -1
  94. package/dist/server/plugins/asyncapi-docs/index.js +1 -1
  95. package/dist/server/plugins/asyncapi-docs/is-asyncapi-doc.js +1 -1
  96. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +23 -18
  97. package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
  98. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-entity.js +1 -1
  99. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.d.ts +9 -0
  100. package/dist/server/plugins/catalog-entities/database/mappers/create-bff-related-entity.js +1 -1
  101. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.d.ts +1 -0
  102. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-db-record.js +1 -1
  103. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-read-model.js +1 -1
  104. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-dto.js +1 -1
  105. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation-db-record-from-file-schema.js +1 -1
  106. package/dist/server/plugins/catalog-entities/database/mappers/create-entity-relation.js +1 -1
  107. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.d.ts +12 -0
  108. package/dist/server/plugins/catalog-entities/database/mappers/map-entity-relation-row.js +1 -0
  109. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +15 -4
  110. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +67 -55
  111. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +21 -15
  112. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
  113. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.d.ts +16 -3
  114. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
  115. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +17 -0
  116. package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -0
  117. package/dist/server/plugins/catalog-entities/database/repositories/utils.d.ts +4 -4
  118. package/dist/server/plugins/catalog-entities/database/repositories/utils.js +1 -1
  119. package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.d.ts → extract-file-content.d.ts} +1 -1
  120. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.d.ts +2 -2
  121. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/arazzo-entities-extractor.js +1 -1
  122. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.d.ts +2 -2
  123. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/asyncapi-entities-extractor.js +1 -1
  124. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.d.ts +2 -2
  125. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
  126. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.d.ts +2 -2
  127. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/graphql-entities-extractor.js +2 -2
  128. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.d.ts +2 -2
  129. package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
  130. package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
  131. package/dist/server/plugins/catalog-entities/get-server-props.d.ts +1 -2
  132. package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
  133. package/dist/server/plugins/catalog-entities/schemas/database-schemas.d.ts +64 -0
  134. package/dist/server/plugins/catalog-entities/schemas/database-schemas.js +1 -1
  135. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.d.ts +6 -12
  136. package/dist/server/plugins/catalog-entities/schemas/dto-schemas.js +1 -1
  137. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.d.ts +4 -8
  138. package/dist/server/plugins/catalog-entities/schemas/read-model-schemas.js +1 -1
  139. package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
  140. package/dist/server/plugins/catalog-entities/utils/read-string.d.ts +7 -0
  141. package/dist/server/plugins/catalog-entities/utils/read-string.js +1 -0
  142. package/dist/server/plugins/config-parser/loaders/content-slugs-loader.js +1 -1
  143. package/dist/server/plugins/config-parser/loaders/nearest-redocly-config-loader.js +1 -1
  144. package/dist/server/plugins/config-parser/loaders/utils/read-and-validate-config.js +1 -1
  145. package/dist/server/plugins/config-parser/loaders/yaml-parser.js +1 -1
  146. package/dist/server/plugins/default-theme/resolve-products-config.js +1 -1
  147. package/dist/server/plugins/ensure-frontmatter-theme-compatibility.js +1 -1
  148. package/dist/server/plugins/entitlements/index.js +1 -1
  149. package/dist/server/plugins/graphql-docs/index.js +1 -1
  150. package/dist/server/plugins/l10n/index.js +1 -1
  151. package/dist/server/plugins/lifecycle.js +2 -2
  152. package/dist/server/plugins/markdown/attribute-resolvers/code-walkthrough/filesets-resolver.js +1 -1
  153. package/dist/server/plugins/markdown/attribute-resolvers/helpers/dereference-json-schema-refs.d.ts +14 -0
  154. package/dist/server/plugins/markdown/attribute-resolvers/helpers/dereference-json-schema-refs.js +1 -0
  155. package/dist/server/plugins/markdown/attribute-resolvers/helpers/generate-sample-from-schema.d.ts +62 -0
  156. package/dist/server/plugins/markdown/attribute-resolvers/helpers/generate-sample-from-schema.js +2 -0
  157. package/dist/server/plugins/markdown/attribute-resolvers/index.js +1 -1
  158. package/dist/server/plugins/markdown/attribute-resolvers/resolve-code-snippet-from-file.js +1 -1
  159. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.d.ts +4 -0
  160. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-example-ref.js +1 -0
  161. package/dist/server/plugins/markdown/attribute-resolvers/resolve-json-schema-ref.js +1 -1
  162. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.d.ts +1 -1
  163. package/dist/server/plugins/markdown/attribute-resolvers/resolve-link.js +1 -1
  164. package/dist/server/plugins/markdown/attribute-resolvers/resolve-open-api-ref.js +1 -1
  165. package/dist/server/plugins/markdown/attribute-resolvers/resolve-parsed-yaml.js +1 -1
  166. package/dist/server/plugins/markdown/attribute-resolvers/resolve-raw-content.js +1 -1
  167. package/dist/server/plugins/markdown/attribute-resolvers/resolve-sample-from-json-schema.d.ts +4 -0
  168. package/dist/server/plugins/markdown/attribute-resolvers/resolve-sample-from-json-schema.js +1 -0
  169. package/dist/server/plugins/markdown/attribute-resolvers/resolve-svg-content.js +1 -1
  170. package/dist/server/plugins/markdown/compiler.js +1 -1
  171. package/dist/server/plugins/markdown/get-server-props.js +1 -1
  172. package/dist/server/plugins/markdown/index.js +1 -1
  173. package/dist/server/plugins/markdown/markdoc/attributes/index.d.ts +2 -0
  174. package/dist/server/plugins/markdown/markdoc/attributes/index.js +1 -1
  175. package/dist/server/plugins/markdown/markdoc/attributes/json-example-ref.d.ts +6 -0
  176. package/dist/server/plugins/markdown/markdoc/attributes/json-example-ref.js +1 -0
  177. package/dist/server/plugins/markdown/markdoc/attributes/sample-from-json-schema.d.ts +6 -0
  178. package/dist/server/plugins/markdown/markdoc/attributes/sample-from-json-schema.js +1 -0
  179. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/index.d.ts +1 -0
  180. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/index.js +1 -1
  181. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/json-example.d.ts +8 -0
  182. package/dist/server/plugins/markdown/markdoc/custom-components/openapi/json-example.js +7 -0
  183. package/dist/server/plugins/markdown/markdoc/partials.js +1 -1
  184. package/dist/server/plugins/markdown/markdoc/resolve-raw-partials.js +1 -1
  185. package/dist/server/plugins/markdown/markdoc/tags/index.d.ts +4 -0
  186. package/dist/server/plugins/markdown/markdoc/tags/index.js +1 -1
  187. package/dist/server/plugins/markdown/markdoc/tags/json-example.d.ts +3 -0
  188. package/dist/server/plugins/markdown/markdoc/tags/json-example.js +1 -0
  189. package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
  190. package/dist/server/plugins/mcp/auth/auth-handlers.d.ts +1 -1
  191. package/dist/server/plugins/mcp/auth/auth-handlers.js +1 -1
  192. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.d.ts +7 -2
  193. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
  194. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.d.ts +7 -2
  195. package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
  196. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.d.ts +7 -2
  197. package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
  198. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.d.ts +7 -2
  199. package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
  200. package/dist/server/plugins/mcp/docs-mcp/tools/index.d.ts +4 -3
  201. package/dist/server/plugins/mcp/docs-mcp/tools/index.js +1 -1
  202. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.d.ts +5 -2
  203. package/dist/server/plugins/mcp/docs-mcp/tools/list-apis.js +1 -1
  204. package/dist/server/plugins/mcp/docs-mcp/tools/utils.d.ts +6 -0
  205. package/dist/server/plugins/mcp/docs-mcp/tools/utils.js +6 -6
  206. package/dist/server/plugins/mcp/docs-mcp/tools/whoami.js +1 -1
  207. package/dist/server/plugins/mcp/docs-mcp/utils.d.ts +3 -3
  208. package/dist/server/plugins/mcp/docs-mcp/utils.js +1 -1
  209. package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
  210. package/dist/server/plugins/mcp/index.js +1 -1
  211. package/dist/server/plugins/mcp/servers/docs-server.d.ts +10 -3
  212. package/dist/server/plugins/mcp/servers/docs-server.js +1 -1
  213. package/dist/server/plugins/mcp/types.d.ts +26 -2
  214. package/dist/server/plugins/mcp/utils.d.ts +9 -8
  215. package/dist/server/plugins/mcp/utils.js +1 -1
  216. package/dist/server/plugins/mcp/workers/run-api-routes-worker.js +1 -1
  217. package/dist/server/plugins/nav-utils.js +1 -1
  218. package/dist/server/plugins/openapi-docs/decorators.d.ts +3 -2
  219. package/dist/server/plugins/openapi-docs/decorators.js +1 -1
  220. package/dist/server/plugins/openapi-docs/index.d.ts +2 -2
  221. package/dist/server/plugins/openapi-docs/index.js +1 -1
  222. package/dist/server/plugins/openapi-docs/is-openapi-doc.js +1 -1
  223. package/dist/server/plugins/openapi-docs/load-definition.d.ts +1 -1
  224. package/dist/server/plugins/openapi-docs/load-definition.js +3 -3
  225. package/dist/server/plugins/pages/index.js +1 -1
  226. package/dist/server/plugins/scorecard-classic/get-scorecard-config.d.ts +11 -0
  227. package/dist/server/plugins/scorecard-classic/loaders/scorecard.js +1 -1
  228. package/dist/server/plugins/search/llmstxt/index.js +5 -5
  229. package/dist/server/plugins/sidebars/index.js +3 -3
  230. package/dist/server/plugins/utils.js +1 -1
  231. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.d.ts +25 -46
  232. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-relations-table.js +1 -1
  233. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.d.ts +20 -3
  234. package/dist/server/providers/database/databases/catalog-sqlite/schemas/entities-table.js +1 -1
  235. package/dist/server/providers/database/pagination/combined-filters.d.ts +4 -1
  236. package/dist/server/providers/database/pagination/combined-filters.js +1 -1
  237. package/dist/server/providers/database/pagination/filter.d.ts +1 -0
  238. package/dist/server/providers/database/pagination/filter.js +1 -1
  239. package/dist/server/providers/database/pagination/index.d.ts +4 -1
  240. package/dist/server/providers/database/pagination/utils/decode-cursor.js +1 -1
  241. package/dist/server/ssr/index.js +1 -1
  242. package/dist/server/ssr/render.js +1 -1
  243. package/dist/server/ssr/template.d.ts +1 -1
  244. package/dist/server/ssr/template.js +13 -13
  245. package/dist/server/ssr/utils.js +27 -13
  246. package/dist/server/store.js +1 -1
  247. package/dist/server/tools/notifiers/formatter.d.ts +2 -0
  248. package/dist/server/tools/notifiers/formatter.js +3 -3
  249. package/dist/server/tools/notifiers/logger.d.ts +18 -39
  250. package/dist/server/tools/notifiers/logger.js +2 -6
  251. package/dist/server/tools/notifiers/reporter.js +9 -9
  252. package/dist/server/tools/notifiers/terminal-manager.d.ts +8 -0
  253. package/dist/server/tools/notifiers/terminal-manager.js +5 -0
  254. package/dist/server/types/fs.d.ts +5 -10
  255. package/dist/server/types/plugins/api-routes.d.ts +0 -3
  256. package/dist/server/types/plugins/common.d.ts +0 -1
  257. package/dist/server/utils/is-valid-iso-date.d.ts +5 -0
  258. package/dist/server/utils/is-valid-iso-date.js +1 -0
  259. package/dist/server/utils/lifecycle-hooks.js +1 -1
  260. package/dist/server/utils/queue.js +1 -1
  261. package/dist/server/utils/redirects/find-redirect.d.ts +4 -2
  262. package/dist/server/utils/redirects/find-redirect.js +1 -1
  263. package/dist/server/utils/resolve-asset-path.js +1 -1
  264. package/dist/server/utils/safe-parse.d.ts +6 -0
  265. package/dist/server/utils/safe-parse.js +1 -0
  266. package/dist/server/utils/validate-and-sanitize-string.d.ts +29 -0
  267. package/dist/server/utils/validate-and-sanitize-string.js +1 -0
  268. package/dist/server/web-server/auth.d.ts +5 -0
  269. package/dist/server/web-server/auth.js +3 -3
  270. package/dist/server/web-server/http.js +2 -2
  271. package/dist/server/web-server/middleware/loggerMiddleware.js +1 -1
  272. package/dist/server/web-server/routes/auth.js +1 -1
  273. package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
  274. package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
  275. package/dist/server/web-server/routes/catalog/catalog-relations.js +1 -1
  276. package/dist/server/web-server/routes/mcp-oauth.js +1 -1
  277. package/dist/server/web-server/routes/search.js +1 -1
  278. package/dist/server/web-server/utils/get-redirect-login-url.js +1 -1
  279. package/dist/types/ssr.d.ts +3 -1
  280. package/dist/utils/auth/build-login-url.d.ts +1 -3
  281. package/dist/utils/auth/build-login-url.js +1 -1
  282. package/dist/utils/env/is-local-development.d.ts +13 -0
  283. package/dist/utils/env/is-local-development.js +1 -0
  284. package/dist/utils/env/is-production.d.ts +13 -0
  285. package/dist/utils/env/is-production.js +1 -0
  286. package/dist/utils/env/is-web-view.d.ts +14 -0
  287. package/dist/utils/env/is-web-view.js +1 -0
  288. package/dist/utils/path/remove-fragment.d.ts +16 -0
  289. package/dist/utils/path/remove-fragment.js +1 -0
  290. package/package.json +12 -11
  291. package/dist/server/persistence/kv/mappers/create-kv-read-record.d.ts +0 -4
  292. package/dist/server/persistence/kv/mappers/create-kv-read-record.js +0 -1
  293. package/dist/server/web-server/routes/otel/types.d.ts +0 -61
  294. package/dist/server/web-server/routes/otel/types.js +0 -1
  295. /package/dist/server/plugins/catalog-entities/entities/{extract-entities-content.js → extract-file-content.js} +0 -0
@@ -1 +1 @@
1
- import*as v from"path";import{REDOCLY_ROUTE_RBAC as P,REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{VERSION_SEPARATOR as M}from"../constants/common.js";import{DEFAULT_LOCALE_PLACEHOLDER as _}from"../../constants/common.js";import{removeTrailingSlash as j}from"../../utils/url/remove-trailing-slash.js";import{isPrimitive as W}from"../../utils/guards/is-primitive.js";import{slash as w}from"../../utils/path/slash.js";import{isAbsoluteUrl as z}from"../../utils/url/is-absolute-url.js";import{normalizeRouteSlug as U}from"../../utils/path/normalize-route-slug.js";import{parsePathVersions as R}from"../../utils/path/parse-path-versions.js";import{logger as A}from"../tools/notifiers/logger.js";import{reporter as S}from"../tools/notifiers/reporter.js";import{shaDirPathShort as C}from"../utils/crypto/sha-dir-path-short.js";import{copyStaticFile as H,FileNotFoundError as E}from"../utils/fs.js";import{isIconPath as J,resolveAssetPath as Y}from"../utils/index.js";import{resolveSrcSet as G}from"../utils/resolve-src-set.js";import{isL10nPath as B}from"../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as q}from"../fs/utils/get-locale-from-relative-path.js";async function D(e,s,n,t,a){if(!e)return;const f={...a,ignoreCustomSidebar:!0};if(W(e)){if(typeof e=="string"){const r=F(n.contentDir,s,a,e,t.fs);if(await t.fs.exists(r)){if(n.getRouteByFsPath(r))return K({page:e},s,n,t,f);{const g=await t.fs.getFileInfo(r);return g?H(n.contentDir,g.realRelativePath,n.outdir):void 0}}}return e}return Array.isArray(e)?I(N(e),s,n,t,f):Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,l])=>[r,await D(l,s,n,t,a)])))}function N(e){return e.map(s=>({...s,items:s.items?N(s.items):void 0}))}async function I(e,s,n,t,a){if(Array.isArray(e))return(await Promise.all(e.map(f=>K(f,s,n,t,a)))).flatMap(f=>f)}async function y(e,s,n,t){let a,f;if(typeof e.icon=="object"){if("srcSet"in e.icon)try{a=await G(e.icon.srcSet,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`):await S.panicOnBuild(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`)}}else if(typeof e.icon=="string")if(z(e.icon)||J(e.icon))try{f=await Y(e.icon,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon" from ${t.navFile}: file ${f} does not exist`):await S.panicOnBuild(`Cannot resolve "item.icon" from ${t.navFile}: ${d.message}`)}else f=e.icon;return{icon:f,srcSet:a}}function Q(e){return s=>{if(s.type==="link"||s.type==="group"){const n=s.metadata;return n?Object.entries(e).every(([t,a])=>Array.isArray(a)?a.some(f=>n[t]===f):n[t]===a):!1}return!0}}async function K(e,s,n,t,a){if(e?.directory&&e.items?.length)return{type:"error",label:`Can't have both "directory" and "items" in the nav item: ${JSON.stringify(e)}`};e?.directory&&e?.group&&(e={...e,directory:void 0,items:[{directory:e.directory}]});const f=e?.directory?F(n.contentDir,s,a,e.directory,t.fs):void 0;if(f!==void 0){const i=f===""?"":f+"/",{locale:u,ignoredRoutes:o}=a;let h=n.getAllRoutesForLocale(u).filter(c=>!o?.has(c.baseSlug||"")&&c.fsPath.startsWith(i)&&!c.excludeFromSidebar).sort((c,b)=>c.fsPath===b.fsPath?0:c.baseSlug.localeCompare(b.baseSlug,void 0,{numeric:!0}));const k=e.includeByMetadata?Q(e.includeByMetadata):Boolean;if(!h.length)return[];const $=(await Promise.all(h.map(async c=>{const b=c.versions?.find(x=>x.active),L=b&&{version:b.version,isDefault:b.default,versionFolderId:b.folderId},V=ee(v.posix.relative(f,c.fsPath)),O=c.getSidebar?.(c);return!a.ignoreCustomSidebar&&O?.length?{type:"group",fsPath:c.fsPath,metadata:c.metadata,link:c.slug,routeSlug:c.slug,label:await c.getNavText?.()||c.slug,[p]:c[p],[P]:c[P],sidebarItems:m(O,L,c[p],c[P]),...L,relativePathFromDirectory:v.relative(f,c.fsPath).replace(/@[^\/]+\//,"")}:{type:"link",fsPath:c.fsPath,metadata:c.metadata,[p]:c[p],[P]:c[P],label:await c.getNavText?.()||c.slug,link:c.slug,routeSlug:c.slug,...L,relativePathFromDirectory:V}}))).filter(k);return e.flatten?T($,a):Z($,a)}let d=typeof e=="string"?e:e?.page,r,l;if(d){if(d.includes("#")){const[i,u]=d.split("#");u?l=u:A.warn(`Invalid heading anchor format in sidebar: "${u}". Heading anchors should contain only alphanumeric characters, hyphens, and underscores.`),d=i}if(d=j(d),a.locale&&a.locale!==_){const i=U(v.join(a.locale.toLowerCase(),d));r=n.getRouteBySlug(i)}r||(r=n.getRouteBySlug(d)),r||(r=n.getRouteByFsPath(F(n.contentDir,s,a,d,t.fs)))}const g=r?.metadata;if(e?.$ref){let i=F(n.contentDir,s,a,e.$ref,t.fs);if(a.ref!==void 0&&(i=v.posix.join(a.ref,e.$ref)),!await t.fs.exists(i))return await S.panicOnBuildContentError(`Failed to load ${i} file. Make sure sidebar $ref path is correct.`),[];const u=await t.cache.load(i,"yaml"),o=v.dirname(i);return await I(u.data,s,n,t,{...a,navFile:i,ref:o})||[]}if(!r){const i=a.excludedFromLinkCheckerPatterns?.catalog.some(o=>o.test(d||"")),u=a.excludedFromLinkCheckerPatterns?.apiFunctions.some(o=>o.test(d||e.href||""));(u||i)&&(e={...e,href:d||e.href,page:void 0,target:e.target??(u?"_blank":void 0)}),await X(e,a,t,s)}if(r&&!e.disconnect&&!a.ignoreCustomSidebar&&(l||r?.getSidebar)){const i=r.versions?.find(o=>o.active),u=i&&{version:i.version,isDefault:i.default,versionFolderId:i.folderId};if(l){let o=[];if(r.getSidebar&&(o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),o&&o.length>0)){const h=o[0];h&&h.link&&(h.link=`${h.link}#${l}`)}if(!o||o.length===0){let h=e.group||e.label||l;o=[{type:"link",fsPath:r.fsPath,metadata:r.metadata,link:`${r.slug}#${l}`,routeSlug:r.slug,label:h,labelTranslationKey:e.labelTranslationKey,...await y(e,n,t,a),[p]:r[p],[P]:{slug:r.slug,fsPath:r.fsPath},...u}]}return m(o,u,r[p],r[P])}if(r?.getSidebar){const o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),h=e.group&&o?.[0]?.routeSlug===r.slug?o.slice(1):o;return m(a.groupCustomSidebars||e.group?[{type:"group",fsPath:r.fsPath,link:r.slug,routeSlug:r.slug,label:e.group||e.label||await r.getNavText?.()||r.slug,items:h,labelTranslationKey:e.labelTranslationKey,metadata:g,...await y(e,n,t,a)}]:o,u,r[p],r[P])}}if(r&&!e.group){const i=l?`${r.slug}#${l}`:r.slug;let u=e.label||l||"";u||(u=await r.getNavText?.()||r.slug);const o=r.versions?.find(k=>k.active),h=o&&{version:o.version,isDefault:o.default,versionFolderId:o.folderId};return{type:"link",fsPath:r.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,[p]:e?.rbac||r[p],[P]:{slug:r.slug,fsPath:r.fsPath},label:u,labelTranslationKey:e.labelTranslationKey,link:i,items:await I(e.items,s,n,t,a),separatorLine:e.separatorLine,linePosition:e.linePosition,routeSlug:e.disconnect?void 0:i,external:e.external,target:e.target,...await y(e,n,t,a),...h,additionalProps:e.additionalProps}}else if(e?.group){const i=r?.versions?.find(o=>o.active),u=R(a?.navFile);return{type:"group",fsPath:r?.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,version:i?.version||u?.versionName,versionFolderId:i?.folderId||(u?.versionFolderPath?C(u.versionFolderPath):void 0),label:e.group,link:r?.slug,routeSlug:r?.slug,labelTranslationKey:e.groupTranslationKey,items:await I(e.items,s,n,t,a),expanded:e.expanded?e.expanded.toString():void 0,selectFirstItemOnExpand:e.selectFirstItemOnExpand,menuStyle:e.menuStyle,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,[P]:{slug:r?.slug||"",fsPath:r?.fsPath||""},additionalProps:e.additionalProps}}else{if(e?.href||e?.label)return{type:"link",metadata:g,link:e.href||"",label:e?.label||e?.href||"",labelTranslationKey:e.labelTranslationKey,external:e.external,target:e.target,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps};if(e?.separator!=null||e?.separatorLine!=null){const i=R(a?.navFile);return{type:"separator",metadata:g,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0,label:e.separator,labelTranslationKey:e.separatorTranslationKey,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps}}else{const i=R(a?.navFile);return{type:"error",label:`Can't resolve page: ${JSON.stringify(e)}`,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0}}}}async function X(e,s,n,t){const{href:a,page:f}=e;if(a||!f)return;const d=F(n.fs.cwd,t,s,f,n.fs),r=await n.fs.exists(d),l=await n.isPathIgnored(d),g=(r?"The page is ignored: ":"Can't resolve page: ")+f;(!r||l)&&S.reportBrokenLink({type:"BROKEN_LINK",brokenLinkType:"LINK",title:e.label||e.group||"",link:d,rawLink:f,message:g,sourceFileRelativePath:s.navFile,sourceFileLocation:{line:0}})}function F(e,s,n,t="",a){if(n.ref!==void 0)return w(v.relative(e,v.resolve(e,v.join(n.ref,t))));if(t.startsWith("/")){const f=B(s)?q(s):void 0,d=f?`${a.localizationFolder}/${f}/`:"",r=t.slice(1);return B(r)?r:d+w(r)}return w(v.relative(e,v.resolve(e,s,t)))}function Z(e,s){const n={};for(const r of e){const l=v.dirname(r.relativePathFromDirectory),g=r.version?M+r.version:"",i=v.basename(r.relativePathFromDirectory)+g;d(l,r,i)}const t=f(a(n));return T(t,s);function a(r){const l=[];for(const g of Object.keys(r)){const i=r[g];l.push({...i,items:i.items?a(i.items):void 0})}return l}function f(r){return r.sort((l,g)=>{const i=typeof l=="string"?l.toLowerCase():l.relativePathFromDirectory||l.label||"",u=typeof g=="string"?g.toLowerCase():g.relativePathFromDirectory||g.label||"";return i.startsWith("index.")?-1:u.startsWith("index.")?1:i.localeCompare(u,void 0,{numeric:!0})})}function d(r,l,g){r==="."&&(r="");const i=r.split("/").filter(Boolean);let u=n;for(const o of i){const h=o+(l?.version||"");u[h]||(u[h]={type:"group",version:l?.version,label:o,isDefault:l?.isDefault,versionFolderId:l.versionFolderId,items:{}}),u=u[h].items}u[g]=l}}function T(e,s){return e.flatMap(n=>n?.sidebarItems?s.groupCustomSidebars?{...n,items:n.sidebarItems,sidebarItems:void 0,relativePathFromDirectory:void 0}:n.sidebarItems:{...n,items:n.items?T(n.items,s):void 0})}function m(e,s,n,t){return e.map(a=>({...a,...s,[p]:a[p]||n,[P]:a[P]||t,items:a.type==="group"&&a.items?m(a.items,s,n):a.items}))}function ee(e){return e.replace(/@[^\/]+\//,"")}async function ye(e,s,n,t){const a=(e?.items||[]).filter(r=>r.linkedSidebars?.length).map(r=>({...r,items:void 0})),f=await D(a,s.contentDir,s,n,t),d=new Map;for(const r of f)if(r.linkedSidebars?.length)for(const l of r.linkedSidebars){if(d.has(l)){A.warn(`Only one navbar item can belong to sidebar. "${l}" on 'linkedSidebars' property on "${r.label}" will be ignored.`);continue}d.set(l,{label:r.label,link:r.link})}return d}export{ye as collectItemsLinkedToSidebars,N as normalizeItems,K as resolveItem,I as resolveItems,D as resolveLinksFromConfig};
1
+ import*as v from"path";import{REDOCLY_ROUTE_RBAC as P,REDOCLY_TEAMS_RBAC as p}from"@redocly/config";import{VERSION_SEPARATOR as M}from"../constants/common.js";import{DEFAULT_LOCALE_PLACEHOLDER as _}from"../../constants/common.js";import{removeTrailingSlash as j}from"../../utils/url/remove-trailing-slash.js";import{isPrimitive as W}from"../../utils/guards/is-primitive.js";import{slash as w}from"../../utils/path/slash.js";import{isAbsoluteUrl as z}from"../../utils/url/is-absolute-url.js";import{normalizeRouteSlug as U}from"../../utils/path/normalize-route-slug.js";import{parsePathVersions as R}from"../../utils/path/parse-path-versions.js";import{logger as A}from"../tools/notifiers/logger.js";import{reporter as S}from"../tools/notifiers/reporter.js";import{shaDirPathShort as C}from"../utils/crypto/sha-dir-path-short.js";import{copyStaticFile as H,FileNotFoundError as E}from"../utils/fs.js";import{isIconPath as J,resolveAssetPath as Y}from"../utils/index.js";import{resolveSrcSet as G}from"../utils/resolve-src-set.js";import{isL10nPath as B}from"../fs/utils/is-l10n-path.js";import{getLocaleFromRelativePath as q}from"../fs/utils/get-locale-from-relative-path.js";async function D(e,s,n,t,a){if(!e)return;const f={...a,ignoreCustomSidebar:!0};if(W(e)){if(typeof e=="string"){const r=F(n.contentDir,s,a,e,t.fs);if(t.fs.exists(r)){if(n.getRouteByFsPath(r))return K({page:e},s,n,t,f);{const g=t.fs.getFileInfo(r);return g?H(n.contentDir,g.realRelativePath,n.outdir):void 0}}}return e}return Array.isArray(e)?I(N(e),s,n,t,f):Object.fromEntries(await Promise.all(Object.entries(e).map(async([r,l])=>[r,await D(l,s,n,t,a)])))}function N(e){return e.map(s=>({...s,items:s.items?N(s.items):void 0}))}async function I(e,s,n,t,a){if(Array.isArray(e))return(await Promise.all(e.map(f=>K(f,s,n,t,a)))).flatMap(f=>f)}async function y(e,s,n,t){let a,f;if(typeof e.icon=="object"){if("srcSet"in e.icon)try{a=await G(e.icon.srcSet,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`):await S.panicOnBuild(`Cannot resolve "item.icon.srcSet" from ${t.navFile}: ${d.message}`)}}else if(typeof e.icon=="string")if(z(e.icon)||J(e.icon))try{f=await Y(e.icon,n.fs,{fromFileRelativePath:t.navFile,contentDir:s.contentDir,outdir:s.outdir})}catch(d){d instanceof E?await S.panicOnBuildContentError(`Cannot resolve "item.icon" from ${t.navFile}: file ${f} does not exist`):await S.panicOnBuild(`Cannot resolve "item.icon" from ${t.navFile}: ${d.message}`)}else f=e.icon;return{icon:f,srcSet:a}}function Q(e){return s=>{if(s.type==="link"||s.type==="group"){const n=s.metadata;return n?Object.entries(e).every(([t,a])=>Array.isArray(a)?a.some(f=>n[t]===f):n[t]===a):!1}return!0}}async function K(e,s,n,t,a){if(e?.directory&&e.items?.length)return{type:"error",label:`Can't have both "directory" and "items" in the nav item: ${JSON.stringify(e)}`};e?.directory&&e?.group&&(e={...e,directory:void 0,items:[{directory:e.directory}]});const f=e?.directory?F(n.contentDir,s,a,e.directory,t.fs):void 0;if(f!==void 0){const i=f===""?"":f+"/",{locale:u,ignoredRoutes:o}=a;let h=n.getAllRoutesForLocale(u).filter(c=>!o?.has(c.baseSlug||"")&&c.fsPath.startsWith(i)&&!c.excludeFromSidebar).sort((c,b)=>c.fsPath===b.fsPath?0:c.baseSlug.localeCompare(b.baseSlug,void 0,{numeric:!0}));const k=e.includeByMetadata?Q(e.includeByMetadata):Boolean;if(!h.length)return[];const $=(await Promise.all(h.map(async c=>{const b=c.versions?.find(x=>x.active),L=b&&{version:b.version,isDefault:b.default,versionFolderId:b.folderId},V=ee(v.posix.relative(f,c.fsPath)),O=c.getSidebar?.(c);return!a.ignoreCustomSidebar&&O?.length?{type:"group",fsPath:c.fsPath,metadata:c.metadata,link:c.slug,routeSlug:c.slug,label:await c.getNavText?.()||c.slug,[p]:c[p],[P]:c[P],sidebarItems:m(O,L,c[p],c[P]),...L,relativePathFromDirectory:v.relative(f,c.fsPath).replace(/@[^\/]+\//,"")}:{type:"link",fsPath:c.fsPath,metadata:c.metadata,[p]:c[p],[P]:c[P],label:await c.getNavText?.()||c.slug,link:c.slug,routeSlug:c.slug,...L,relativePathFromDirectory:V}}))).filter(k);return e.flatten?T($,a):Z($,a)}let d=typeof e=="string"?e:e?.page,r,l;if(d){if(d.includes("#")){const[i,u]=d.split("#");u?l=u:A.warn(`Invalid heading anchor format in sidebar: "${u}". Heading anchors should contain only alphanumeric characters, hyphens, and underscores.`),d=i}if(d=j(d),a.locale&&a.locale!==_){const i=U(v.join(a.locale.toLowerCase(),d));r=n.getRouteBySlug(i)}r||(r=n.getRouteBySlug(d)),r||(r=n.getRouteByFsPath(F(n.contentDir,s,a,d,t.fs)))}const g=r?.metadata;if(e?.$ref){let i=F(n.contentDir,s,a,e.$ref,t.fs);if(a.ref!==void 0&&(i=v.posix.join(a.ref,e.$ref)),!t.fs.exists(i))return await S.panicOnBuildContentError(`Failed to load ${i} file. Make sure sidebar $ref path is correct.`),[];const u=await t.cache.load(i,"yaml"),o=v.dirname(i);return await I(u.data,s,n,t,{...a,navFile:i,ref:o})||[]}if(!r){const i=a.excludedFromLinkCheckerPatterns?.catalog.some(o=>o.test(d||"")),u=a.excludedFromLinkCheckerPatterns?.apiFunctions.some(o=>o.test(d||e.href||""));(u||i)&&(e={...e,href:d||e.href,page:void 0,target:e.target??(u?"_blank":void 0)}),await X(e,a,t,s)}if(r&&!e.disconnect&&!a.ignoreCustomSidebar&&(l||r?.getSidebar)){const i=r.versions?.find(o=>o.active),u=i&&{version:i.version,isDefault:i.default,versionFolderId:i.folderId};if(l){let o=[];if(r.getSidebar&&(o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),o&&o.length>0)){const h=o[0];h&&h.link&&(h.link=`${h.link}#${l}`)}if(!o||o.length===0){let h=e.group||e.label||l;o=[{type:"link",fsPath:r.fsPath,metadata:r.metadata,link:`${r.slug}#${l}`,routeSlug:r.slug,label:h,labelTranslationKey:e.labelTranslationKey,...await y(e,n,t,a),[p]:r[p],[P]:{slug:r.slug,fsPath:r.fsPath},...u}]}return m(o,u,r[p],r[P])}if(r?.getSidebar){const o=r.getSidebar(r,{...e,...await y(e,n,t,a)}),h=e.group&&o?.[0]?.routeSlug===r.slug?o.slice(1):o;return m(a.groupCustomSidebars||e.group?[{type:"group",fsPath:r.fsPath,link:r.slug,routeSlug:r.slug,label:e.group||e.label||await r.getNavText?.()||r.slug,items:h,labelTranslationKey:e.labelTranslationKey,metadata:g,...await y(e,n,t,a)}]:o,u,r[p],r[P])}}if(r&&!e.group){const i=l?`${r.slug}#${l}`:r.slug;let u=e.label||l||"";u||(u=await r.getNavText?.()||r.slug);const o=r.versions?.find(k=>k.active),h=o&&{version:o.version,isDefault:o.default,versionFolderId:o.folderId};return{type:"link",fsPath:r.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,[p]:e?.rbac||r[p],[P]:{slug:r.slug,fsPath:r.fsPath},label:u,labelTranslationKey:e.labelTranslationKey,link:i,items:await I(e.items,s,n,t,a),separatorLine:e.separatorLine,linePosition:e.linePosition,routeSlug:e.disconnect?void 0:i,external:e.external,target:e.target,...await y(e,n,t,a),...h,additionalProps:e.additionalProps}}else if(e?.group){const i=r?.versions?.find(o=>o.active),u=R(a?.navFile);return{type:"group",fsPath:r?.fsPath,linkedSidebars:e.linkedSidebars,metadata:g,version:i?.version||u?.versionName,versionFolderId:i?.folderId||(u?.versionFolderPath?C(u.versionFolderPath):void 0),label:e.group,link:r?.slug,routeSlug:r?.slug,labelTranslationKey:e.groupTranslationKey,items:await I(e.items,s,n,t,a),expanded:e.expanded?e.expanded.toString():void 0,selectFirstItemOnExpand:e.selectFirstItemOnExpand,menuStyle:e.menuStyle,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,[P]:{slug:r?.slug||"",fsPath:r?.fsPath||""},additionalProps:e.additionalProps}}else{if(e?.href||e?.label)return{type:"link",metadata:g,link:e.href||"",label:e?.label||e?.href||"",labelTranslationKey:e.labelTranslationKey,external:e.external,target:e.target,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps};if(e?.separator!=null||e?.separatorLine!=null){const i=R(a?.navFile);return{type:"separator",metadata:g,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0,label:e.separator,labelTranslationKey:e.separatorTranslationKey,separatorLine:e.separatorLine,linePosition:e.linePosition,...await y(e,n,t,a),[p]:e?.rbac,additionalProps:e.additionalProps}}else{const i=R(a?.navFile);return{type:"error",label:`Can't resolve page: ${JSON.stringify(e)}`,version:i?.versionName,versionFolderId:i?.versionFolderPath?C(i.versionFolderPath):void 0}}}}async function X(e,s,n,t){const{href:a,page:f}=e;if(a||!f)return;const d=F(n.fs.cwd,t,s,f,n.fs),r=n.fs.exists(d),l=await n.isPathIgnored(d),g=(r?"The page is ignored: ":"Can't resolve page: ")+f;(!r||l)&&S.reportBrokenLink({type:"BROKEN_LINK",brokenLinkType:"LINK",title:e.label||e.group||"",link:d,rawLink:f,message:g,sourceFileRelativePath:s.navFile,sourceFileLocation:{line:0}})}function F(e,s,n,t="",a){if(n.ref!==void 0)return w(v.relative(e,v.resolve(e,v.join(n.ref,t))));if(t.startsWith("/")){const f=B(s)?q(s):void 0,d=f?`${a.localizationFolder}/${f}/`:"",r=t.slice(1);return B(r)?r:d+w(r)}return w(v.relative(e,v.resolve(e,s,t)))}function Z(e,s){const n={};for(const r of e){const l=v.dirname(r.relativePathFromDirectory),g=r.version?M+r.version:"",i=v.basename(r.relativePathFromDirectory)+g;d(l,r,i)}const t=f(a(n));return T(t,s);function a(r){const l=[];for(const g of Object.keys(r)){const i=r[g];l.push({...i,items:i.items?a(i.items):void 0})}return l}function f(r){return r.sort((l,g)=>{const i=typeof l=="string"?l.toLowerCase():l.relativePathFromDirectory||l.label||"",u=typeof g=="string"?g.toLowerCase():g.relativePathFromDirectory||g.label||"";return i.startsWith("index.")?-1:u.startsWith("index.")?1:i.localeCompare(u,void 0,{numeric:!0})})}function d(r,l,g){r==="."&&(r="");const i=r.split("/").filter(Boolean);let u=n;for(const o of i){const h=o+(l?.version||"");u[h]||(u[h]={type:"group",version:l?.version,label:o,isDefault:l?.isDefault,versionFolderId:l.versionFolderId,items:{}}),u=u[h].items}u[g]=l}}function T(e,s){return e.flatMap(n=>n?.sidebarItems?s.groupCustomSidebars?{...n,items:n.sidebarItems,sidebarItems:void 0,relativePathFromDirectory:void 0}:n.sidebarItems:{...n,items:n.items?T(n.items,s):void 0})}function m(e,s,n,t){return e.map(a=>({...a,...s,[p]:a[p]||n,[P]:a[P]||t,items:a.type==="group"&&a.items?m(a.items,s,n):a.items}))}function ee(e){return e.replace(/@[^\/]+\//,"")}async function ye(e,s,n,t){const a=(e?.items||[]).filter(r=>r.linkedSidebars?.length).map(r=>({...r,items:void 0})),f=await D(a,s.contentDir,s,n,t),d=new Map;for(const r of f)if(r.linkedSidebars?.length)for(const l of r.linkedSidebars){if(d.has(l)){A.warn(`Only one navbar item can belong to sidebar. "${l}" on 'linkedSidebars' property on "${r.label}" will be ignored.`);continue}d.set(l,{label:r.label,link:r.link})}return d}export{ye as collectItemsLinkedToSidebars,N as normalizeItems,K as resolveItem,I as resolveItems,D as resolveLinksFromConfig};
@@ -1,6 +1,7 @@
1
1
  import type { RawUniversalConfig } from '@redocly/openapi-core';
2
- export declare const MarkdownParserDecorator: ({ outputRelativePath }: {
2
+ export declare const MarkdownParserDecorator: ({ outputRelativePath, cwd, }: {
3
3
  outputRelativePath: string;
4
+ cwd: string;
4
5
  }) => {
5
6
  any: {
6
7
  leave(node: Record<string, unknown>, ctx: any): void;
@@ -17,5 +18,5 @@ export declare const RbacDecorator: () => {
17
18
  leave(node: Record<string, unknown>, ctx: any): void;
18
19
  };
19
20
  };
20
- export declare function injectDecoratorIntoConfig(config: RawUniversalConfig, outputRelativePath: string): RawUniversalConfig;
21
+ export declare function injectDecoratorIntoConfig(config: RawUniversalConfig, outputRelativePath: string, cwd: string): RawUniversalConfig;
21
22
  //# sourceMappingURL=decorators.d.ts.map
@@ -1 +1 @@
1
- import{REDOCLY_TEAMS_RBAC as f}from"@redocly/config";function m(a,r,o){if(!r)throw new Error("Visitor required");if(a){a.description&&r(a,"description",o.location.absolutePointer+"/description",o);for(const t in a["x-enumDescriptions"])r(a["x-enumDescriptions"],t,o.location.absolutePointer+"/x-enumDescriptions/"+t,o)}}const b=/^[a-zA-Z0-9\s\-,.!\?:;'"()/]+$/,i=({outputRelativePath:a})=>{const r=function(t,c,p,u){const{node:n}=u.resolve(t[c]);if(!n||typeof n!="string"||n.match(b))return;const e=u.getVisitorData();e.markdocChunks=e.markdocChunks||[],e.markdocChunks.push({node:t,pointer:p,markdown:n,relativePath:a,key:c})};return{any:{leave(o,t){m(o,r,t)}},ref:{leave(o,t){m(o,r,t)}}}},s=()=>{const a={};return{Tag:{enter(r){r?.["x-rbac"]&&(a[String(r.name)]=r["x-rbac"])}},any:{leave(r,o){if((o.type.name==="Operation"||o.type.name==="Webhook")&&"tags"in r&&Array.isArray(r.tags))for(const t of r.tags)a[t]&&(r["x-rbac"]=r["x-rbac"]||a[t]);r?.["x-rbac"]&&(r[f]=r["x-rbac"],delete r["x-rbac"])}}}};function l(a,r){const o={id:"markdown",decorators:{oas2:{markdown:i,rbac:s},oas3:{markdown:i,rbac:s},async3:{markdown:i,rbac:s}}};return{...a,decorators:{"markdown/rbac":"on","markdown/markdown":{outputRelativePath:r},...a.decorators||{}},plugins:[...a.plugins||[],o]}}export{i as MarkdownParserDecorator,s as RbacDecorator,l as injectDecoratorIntoConfig};
1
+ import l from"node:path";import{REDOCLY_TEAMS_RBAC as b}from"@redocly/config";import{slash as k}from"../../../utils/path/slash.js";function u(a,r,o){if(!r)throw new Error("Visitor required");if(a){a.description&&r(a,"description",o.location.absolutePointer+"/description",o);for(const t in a["x-enumDescriptions"])r(a["x-enumDescriptions"],t,o.location.absolutePointer+"/x-enumDescriptions/"+t,o)}}const d=/^[a-zA-Z0-9\s\-,.!\?:;'"()/]+$/,s=({outputRelativePath:a,cwd:r})=>{const o=function(n,m,f,p){const{node:e}=p.resolve(n[m]);if(!e||typeof e!="string"||e.match(d))return;const i=p.getVisitorData();i.markdocChunks=i.markdocChunks||[],i.markdocChunks.push({node:n,pointer:k(l.relative(r,f)),markdown:e,relativePath:a,key:m})};return{any:{leave(t,n){u(t,o,n)}},ref:{leave(t,n){u(t,o,n)}}}},c=()=>{const a={};return{Tag:{enter(r){r?.["x-rbac"]&&(a[String(r.name)]=r["x-rbac"])}},any:{leave(r,o){if((o.type.name==="Operation"||o.type.name==="Webhook")&&"tags"in r&&Array.isArray(r.tags))for(const t of r.tags)a[t]&&(r["x-rbac"]=r["x-rbac"]||a[t]);r?.["x-rbac"]&&(r[b]=r["x-rbac"],delete r["x-rbac"])}}}};function x(a,r,o){const t={id:"markdown",decorators:{oas2:{markdown:s,rbac:c},oas3:{markdown:s,rbac:c},async3:{markdown:s,rbac:c}}};return{...a,decorators:{"markdown/rbac":"on","markdown/markdown":{outputRelativePath:r,cwd:o},...a.decorators||{}},plugins:[...a.plugins||[],t]}}export{s as MarkdownParserDecorator,c as RbacDecorator,x as injectDecoratorIntoConfig};
@@ -1,3 +1,3 @@
1
- import type { LifecyclePluginInstance, PluginOptions } from '../../types';
2
- export declare function openAPIDocsPlugin(pluginOptions: PluginOptions): Promise<LifecyclePluginInstance>;
1
+ import type { LifecyclePluginInstance } from '../../types';
2
+ export declare function openAPIDocsPlugin(): Promise<LifecyclePluginInstance>;
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- import Z from"node:path";import{simplifyAstStructure as ee}from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as _}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as G,PUBLIC_RBAC_SCOPE_ITEM as $}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as te,PUBLIC_API_DEFINITIONS_FOLDER as oe}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as ae,OPENAPI_SHARED_DATA_PREFIX as H}from"../../constants/plugins/openapi-docs.js";import{slash as re}from"../../../utils/path/slash.js";import{isDevelopMode as U}from"../../utils/envs/is-develop-mode.js";import{searchResolver as se}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as ie,shouldAddRoute as ne}from"./utils.js";import{getTemplatePath as L}from"./get-template-path.js";import{storeDefinitionBundles as pe}from"./store-definition-bundles.js";import{definitionLoader as ce,definitionsLoader as de}from"./load-definition.js";import{getAiDocumentsStore as le}from"./search/get-ai-search-documents.js";import{fromCurrentDir as ue}from"../../utils/paths.js";import{telemetryTraceStep as me}from"../../../cli/telemetry/helpers/trace-step.js";const M="openapi-spec-download";async function Te(V){let w=[],E={};return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":de,"load-oas":ce},processContent:async(e,i)=>{await me("build.plugin.openapi_docs",async d=>{e.createRequestHandler(M,ue(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:oe+"/*",requestHandlerId:M,httpMethod:"all",[_]:$,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:te+"/*",requestHandlerId:M,httpMethod:"all",[_]:$,getStaticData:async()=>({props:{}})});const s=e.createTemplate(G,L("./template/OpenAPIDocs.js")),n=e.registerServerPropsGetter(G,L("./get-server-props.js")),g=e.registerServerPropsGetter(ae,L("./get-server-props-custom-fields.js")),l=await i.getConfig();d?.setAttribute("config",JSON.stringify(l.openapi||{}));const I=l.rules?.["custom-fields-schema"];E={};const u=await e.loadOpenApiDefinitions(i);w=u.map(({markdocChunks:m,relativePath:f,customOutputRelativeFile:r,isVirtual:a,realRelativePath:p})=>({chunks:m,relativePath:f,realRelativePath:p,isVirtual:r!=null||a})),pe(u,e.outdir);const P={};for(const m of u||[]){const{definition:f,config:r,relativePath:a,customOutputRelativeFile:p,contentItems:S,flatItems:D,parser:v,options:k,rawOptions:q,hash:J}=m,x=p||a,o=[],B={},{definition:Q}=v||{},{info:c}=Q||{},O=c?.["x-metadata"],C=!!r.openapi?.excludeFromSearch||!!r.theme?.openapi?.excludeFromSearch||!!l.openapi?.excludeFromSearch||!!l.theme?.openapi?.excludeFromSearch,N={title:c?.title,description:c?.description,summary:c?.summary,...r.metadata,...O},h={untagged:[],tagged:new Map};for(const t of D){const{id:y,href:A,operationDefinition:F}=t;if(F){const{tags:R}=F;if(R)for(const b of R)h.tagged.has(b)||h.tagged.set(b,[]),h.tagged.get(b)?.push(t);else h.untagged.push(t);U()&&(B[`#${F.pointer}`]=t.href)}if(!ne({item:t}))continue;const T=t,Y=T.type==="section"&&!!T.infoDefinition,z=A.split("#")[0]+"/",K=t?.operationDefinition?.[_];o.push({excludeFromSearch:C,slugSuffix:z,fsPath:x,httpVerb:t?.httpVerb||"",path:a,templateId:s,[_]:K||r.rbac,getAiDocumentsStore:le({parser:v,options:k,info:c,tagOperations:h,openapiContentItem:T,metadata:N,relativePath:a,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:Y,excludeFromSearch:C}),getStaticData:async R=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:R.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:y,disableAutoScroll:!0}})})}o[0]={...o[0],metadata:{type:"openapi",...N},hasClientRoutes:!0,getSidebar:(t,y)=>{const A=[];return ie({contentItems:S,sidebarItems:A,routeSlug:t.slug,navItem:y}),A},getNavText:()=>c?.title,getSearchDocuments:se(v,k,D,e.getSearchFacets,e.setSearchFacets,C)},O?.apiId&&(P[O.apiId]={slug:o[0]?.slug||""});const W=o[0];o[0]=o[o.length-1],o[o.length-1]=W;for(const t of o)e.addRoute({...t,serverPropsGetterIds:I?[n,g]:[n]});const X=U()?a:void 0,j=`${H}${a}`;E[j]={fsPath:x,definition:f,options:q,sourcePath:X,routesMapping:B,hash:J};for(const t of o)e.addRoute({...t,sharedData:[{id:j,key:"openAPIDocsStore"}],serverPropsGetterIds:I?[n,g]:[n]})}e.setGlobalData({apiProducts:P})})},afterRoutesCreated:async(e,i)=>{for(const{chunks:d,relativePath:s,isVirtual:n,realRelativePath:g}of w)await i.cache.load(s,{loader:async function(){await i.cache.load(g,"load-oas");for(const{node:I,markdown:u,pointer:P,key:m,relativePath:f}of d){const[r,...a]=P.split("#"),p=a.join("#"),S=re(Z.relative(V.contentDir,r)),{ast:D}=await e.parseMarkdoc({content:u,relativePath:S,isVirtual:n,cacheId:S+(p?"#"+p:"")},i,{sharedDataIds:[`${H}${f}`]});I[`x-parsed-md-${m}`]={result:ee(D)}}},name:"openapi-markdoc-inline-parser"});for(const[d,s]of Object.entries(E))await e.createSharedData(d,{...s,baseSlug:e.getRouteByFsPath(s.fsPath)?.baseSlug},s.hash)}}}export{Te as openAPIDocsPlugin};
1
+ import{simplifyAstStructure as Z}from"@redocly/openapi-docs";import{REDOCLY_TEAMS_RBAC as D}from"@redocly/config";import{OPENAPI_DOCS_TEMPLATE_ID as $,PUBLIC_RBAC_SCOPE_ITEM as j}from"../../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as ee,PUBLIC_API_DEFINITIONS_FOLDER as te}from"../../constants/common.js";import{OPENAPI_CUSTOM_FIELDS_SERVER_PROPS_GETTER_ID as oe,OPENAPI_SHARED_DATA_PREFIX as U}from"../../constants/plugins/openapi-docs.js";import{isDevelopMode as V}from"../../utils/envs/is-develop-mode.js";import{searchResolver as ae}from"./search/search-resolver.js";import{convertOpenAPIDocs2Sidebar as re,shouldAddRoute as se}from"./utils.js";import{getTemplatePath as b}from"./get-template-path.js";import{storeDefinitionBundles as ne}from"./store-definition-bundles.js";import{definitionLoader as ie,definitionsLoader as pe}from"./load-definition.js";import{getAiDocumentsStore as de}from"./search/get-ai-search-documents.js";import{fromCurrentDir as ce}from"../../utils/paths.js";import{telemetryTraceStep as le}from"../../../cli/telemetry/helpers/trace-step.js";const w="openapi-spec-download";async function Oe(){let L=[],A={},M=new Set;return{id:"openapi",requiredEntitlements:["openapi"],loaders:{"load-oas-docs":pe,"load-oas":ie},processContent:async(e,i)=>{await le("build.plugin.openapi_docs",async c=>{e.createRequestHandler(w,ce(import.meta.url,"./spec-download.api.js")),e.addApiRoute({slug:te+"/*",requestHandlerId:w,httpMethod:"all",[D]:j,getStaticData:async()=>({props:{}})}),e.addApiRoute({slug:ee+"/*",requestHandlerId:w,httpMethod:"all",[D]:j,getStaticData:async()=>({props:{}})});const R=e.createTemplate($,b("./template/OpenAPIDocs.js")),a=e.registerServerPropsGetter($,b("./get-server-props.js")),s=e.registerServerPropsGetter(oe,b("./get-server-props-custom-fields.js")),p=await i.getConfig();c?.setAttribute("config",JSON.stringify(p.openapi||{}));const S=p.rules?.["custom-fields-schema"];A={};const l=await e.loadOpenApiDefinitions(i);L=l.map(({markdocChunks:m,relativePath:f,customOutputRelativeFile:n,isVirtual:r,realRelativePath:h})=>({chunks:m,relativePath:f,realRelativePath:h,isVirtual:n!=null||r})),ne(l,e.outdir);const u={};for(const m of l||[]){const{definition:f,config:n,relativePath:r,customOutputRelativeFile:h,contentItems:_,flatItems:k,parser:E,options:B,rawOptions:q,hash:J}=m,N=h||r,o=[],x={},{definition:Q}=E||{},{info:d}=Q||{},v=d?.["x-metadata"],O=!!n.openapi?.excludeFromSearch||!!n.theme?.openapi?.excludeFromSearch||!!p.openapi?.excludeFromSearch||!!p.theme?.openapi?.excludeFromSearch,G={title:d?.title,description:d?.description,summary:d?.summary,...n.metadata,...v},g={untagged:[],tagged:new Map};for(const t of k){const{id:C,href:I,operationDefinition:y}=t;if(y){const{tags:P}=y;if(P)for(const T of P)g.tagged.has(T)||g.tagged.set(T,[]),g.tagged.get(T)?.push(t);else g.untagged.push(t);V()&&(x[`#${y.pointer}`]=t.href)}if(!se({item:t}))continue;const F=t,Y=F.type==="section"&&!!F.infoDefinition,z=I.split("#")[0]+"/",K=t?.operationDefinition?.[D];o.push({excludeFromSearch:O,slugSuffix:z,fsPath:N,httpVerb:t?.httpVerb||"",path:r,templateId:R,[D]:K||n.rbac,getAiDocumentsStore:de({parser:E,options:B,info:d,tagOperations:g,openapiContentItem:F,metadata:G,relativePath:r,getSearchFacets:e.getSearchFacets,includeInLLMsTxt:Y,excludeFromSearch:O}),getStaticData:async P=>({props:{dynamicMarkdocComponents:["openapi"],baseSlug:P.baseSlug,seo:t["x-metadata"]?.seo||{title:t.name,description:t.description},itemId:C,disableAutoScroll:!0}})})}o[0]={...o[0],metadata:{type:"openapi",...G},hasClientRoutes:!0,getSidebar:(t,C)=>{const I=[];return re({contentItems:_,sidebarItems:I,routeSlug:t.slug,navItem:C}),I},getNavText:()=>d?.title,getSearchDocuments:ae(E,B,k,e.getSearchFacets,e.setSearchFacets,O)},v?.apiId&&(u[v.apiId]={slug:o[0]?.slug||""});const W=o[0];o[0]=o[o.length-1],o[o.length-1]=W;for(const t of o)e.addRoute({...t,serverPropsGetterIds:S?[a,s]:[a]});const X=V()?r:void 0,H=`${U}${r}`;A[H]={fsPath:N,definition:f,options:q,sourcePath:X,routesMapping:x,hash:J};for(const t of o)e.addRoute({...t,sharedData:[{id:H,key:"openAPIDocsStore"}],serverPropsGetterIds:S?[a,s]:[a]})}e.setGlobalData({apiProducts:u})})},afterRoutesCreated:async(e,i)=>{const c=new Set;for(const{chunks:a,relativePath:s,isVirtual:p,realRelativePath:S}of L){const l=(await i.cache.load(S,"load-oas")).compoundHash;await i.cache.load(s,{loader:async function(){for(const{node:m,markdown:f,pointer:n,key:r,relativePath:h}of a){const{ast:_}=await e.parseMarkdoc({content:f,relativePath:n,isVirtual:p},i,{sharedDataIds:[`${U}${h}`]});m[`x-parsed-md-${r}`]={result:Z(_)}}},name:"openapi-markdoc-inline-parser"},[l]);for(const{pointer:u}of a)c.add(u)}const R=M.difference(c);for(const a of R)i.cache.delete(a);M=c;for(const[a,s]of Object.entries(A))await e.createSharedData(a,{...s,baseSlug:e.getRouteByFsPath(s.fsPath)?.baseSlug},s.hash)}}}export{Oe as openAPIDocsPlugin};
@@ -1 +1 @@
1
- import f from"node:path";import{CONFIG_FILE_NAME as h}from"../../../constants/common.js";import{normalizeRouteSlug as c}from"../../../utils/path/normalize-route-slug.js";import{removeLeadingSlash as L}from"../../../utils/url/remove-leading-slash.js";import{parseBaseName as w}from"../utils.js";const x=async(e,s)=>{if(!e.match(/(\.ya?ml|\.json)$/)||f.posix.basename(e)===h||await s.isPathIgnored(e))return!1;const i=await s.fs.getFileInfo(e);if(!i)return!1;try{const{data:n}=await s.cache.load(i.realRelativePath,"yaml");return!(!n?.openapi&&!n?.swagger)}catch{return!1}},F=async(e,s,i,n)=>{const{getRouteBySlug:u,getRouteByFsPath:l}=i,o={isOpenapiDetected:!1,isOpenapiValid:!1},g={isOpenapiDetected:!0,isOpenapiValid:!1},d={isOpenapiDetected:!0,isOpenapiValid:!0};let r=e.toLowerCase();if(e.startsWith("/"))r=c(e);else if(e.startsWith("./")||e.startsWith("../")){const t=l(s)?.slug;if(!t)return o;const{isIndexFile:a}=w(s);r=a?c(f.posix.join(t,e)):c(f.posix.join(t,"../",e))}else return o;const p=r.toLowerCase().split("/");for(let t=p.length;t>=0;t--){const a=p.slice(0,t).join("/"),O=p.slice(t).join("/"),m=u(a)||l(L(a));if(m)return await x(m.fsPath,n)?O?g:d:o}return o};export{F as isOpenApiURL,x as isOpenapiDoc};
1
+ import f from"node:path";import{CONFIG_FILE_NAME as h}from"../../../constants/common.js";import{normalizeRouteSlug as c}from"../../../utils/path/normalize-route-slug.js";import{removeLeadingSlash as L}from"../../../utils/url/remove-leading-slash.js";import{parseBaseName as x}from"../utils.js";const y=async(e,s)=>{if(!e.match(/(\.ya?ml|\.json)$/)||f.posix.basename(e)===h||await s.isPathIgnored(e))return!1;const i=s.fs.getFileInfo(e);if(!i)return!1;try{const{data:n}=await s.cache.load(i.realRelativePath,"yaml");return!(!n?.openapi&&!n?.swagger)}catch{return!1}},F=async(e,s,i,n)=>{const{getRouteBySlug:u,getRouteByFsPath:l}=i,o={isOpenapiDetected:!1,isOpenapiValid:!1},g={isOpenapiDetected:!0,isOpenapiValid:!1},d={isOpenapiDetected:!0,isOpenapiValid:!0};let r=e.toLowerCase();if(e.startsWith("/"))r=c(e);else if(e.startsWith("./")||e.startsWith("../")){const t=l(s)?.slug;if(!t)return o;const{isIndexFile:a}=x(s);r=a?c(f.posix.join(t,e)):c(f.posix.join(t,"../",e))}else return o;const p=r.toLowerCase().split("/");for(let t=p.length;t>=0;t--){const a=p.slice(0,t).join("/"),O=p.slice(t).join("/"),m=u(a)||l(L(a));if(m)return await y(m.fsPath,n)?O?g:d:o}return o};export{F as isOpenApiURL,y as isOpenapiDoc};
@@ -10,7 +10,7 @@ export type BundledDefinition = {
10
10
  customOutputRelativeFile?: string;
11
11
  markdocChunks: MarkdocChunk[];
12
12
  hash: string;
13
- isVirtual?: boolean;
13
+ isVirtual: boolean;
14
14
  contentItems: ContentItemModel[];
15
15
  flatItems: (IMenuItem & {
16
16
  [REDOCLY_TEAMS_RBAC]?: RbacScopeItems;
@@ -1,3 +1,3 @@
1
- import*as l from"path";import{convertSwagger2OpenAPI as oo}from"@redocly/openapi-docs/lib/utils/convertSwagger2OpenAPI.js";import{Source as no,bundle as ro,createConfig as to,getTotals as io,resolvePlugins as eo}from"@redocly/openapi-core";import{normalizeOptions as ao,OpenAPIParser as so,buildContentItems as co}from"@redocly/openapi-docs";import{combineUrls as E}from"@redocly/theme/core/utils";import{CONFIG_FILE_NAME as A}from"../../../constants/common.js";import{PUBLIC_API_DEFINITIONS_FOLDER as P}from"../../constants/common.js";import{MAX_BUNDLING_ERRORS_TO_PRINT as fo}from"../../constants/plugins/openapi-docs.js";import{unique as lo}from"../../../utils/array/unique.js";import{deepMerge as F}from"../../../utils/object/deep-merge.js";import{pluralize as R}from"../../../utils/string/pluralize.js";import{replaceEnvVariablesDeep as po}from"../../utils/envs/replace-env-variables-deep.js";import{logger as N}from"../../tools/notifiers/logger.js";import{reporter as b}from"../../tools/notifiers/reporter.js";import{injectDecoratorIntoConfig as uo}from"./decorators.js";import{getAllApiConfigsByPath as mo}from"../get-api-config.js";import{normalizeFeedbackOptions as go}from"./utils.js";import{replaceFileExtension as L}from"./store-definition-bundles.js";import{ExternalResolver as wo}from"../../fs/utils/external-ref-resolver.js";import{formatBundleError as ho}from"./format-bundle-error.js";async function Mo(o,u){const{fs:t,cache:O,getConfig:g,isPathIgnored:m}=u;if(l.posix.basename(o)===A)return[];let a;try{a=(await O.load(o,"yaml")).data}catch{return[]}if(!a?.openapi&&!a?.swagger)return N.verbose(`${o} file is not definition. Skipping`),[];const p=await g("."),s=await t.getFileInfo(o),n=await g(l.posix.dirname(o)),M=mo(n?.apis,o,n.configPath),S=[],T=await m(o);for(const c of M){if(!c.output&&T)continue;const U=F({decorators:p.decorators},n,{rbac:void 0},c),{resolvedObj:e}=po(U);if(e.decorators&&typeof e.decorators!="object"){await b.panicOnBuildContentError(`'decorators' must be an object at redocly.yaml, got '${typeof e.decorators}'`);continue}if(e.plugins&&!Array.isArray(e.plugins)){await b.panicOnBuildContentError(`'plugins' must be an array at redocly.yaml, got '${typeof e.plugins}'`);continue}const V=n.configPath?l.posix.dirname(n.configPath):".",r=c.output?l.posix.join(V,c.output):o;if(await m(r))continue;s&&c.output&&!await t.exists(r)&&t.addVirtualFile(r,s);const z=l.resolve(t.cwd,n.realConfigPath||A),v=new wo(t),C=await to(uo(e,r),{configPath:z,externalRefResolver:v});p.plugins&&p.configPath!==n.configPath&&(C.plugins=lo([...C.plugins||[],...await eo(p.plugins,t.cwd)],f=>f.id));const D=l.resolve(t.cwd,o),G=await t.read(o),J={config:C,base:l.dirname(D),doc:{source:new no(D,G),parsed:JSON.parse(JSON.stringify(a))},externalRefResolver:v},{bundle:{parsed:y},problems:B,visitorsData:q}=await ro(J),H=q["markdown/markdown"]?.markdocChunks??[],i=io(B);let _=[i.errors&&`${i.errors} ${R(i.errors,"error","errors")}`,i.warnings&&`${i.warnings} ${R(i.warnings,"warning","warnings")}`,i.ignored&&`${i.ignored} ignored`].filter(Boolean).join(", ");if(i.errors){const f=B.filter(d=>d.severity==="error");let $=`${_} while bundling ${r} definition:
2
- `;const x=Math.min(f.length,fo);for(let d=0;d<x;d++){const Y=f[d],Z=await ho(Y,t.cwd);$+=`${Z}
3
- `}if(f.length>x){const d=f.length-x;$+=`... and ${d} more ${R(d,"error","errors")}`}await b.panicOnBuild($)}i.warnings&&N.warn(`${_} while bundling %rp definition`,r);const w=bo(y.swagger!==void 0?await oo(y):y,n.metadata),h=F(p.openapi||{},n.openapi||{},c.openapi||c?.theme?.openapi||{});h.showSchemaCatalogLinks&&(w["x-schema-catalog-link"]=E(P,r));const X=w["x-feedback"]||h.feedback||n.feedback,j={...h,feedback:go(X),hideSidebar:!0,disableRouter:!0,mockServer:e?.mockServer||p?.mockServer,downloadUrls:h.downloadUrls||[{url:E(P,`${L(r,".json")}?download`)},{url:E(P,`${L(r,".yaml")}?download`)}]},I=ao(j);let k;try{k=new so(w,void 0,I)}catch(f){await b.panicOnBuild(f);continue}const{contentItems:K,flatItems:Q}=co(k,I),W={definition:w,config:e,relativePath:r,realRelativePath:s?.realRelativePath||r,customOutputRelativeFile:c.output&&r,markdocChunks:H,contentItems:K,flatItems:Q,options:I,rawOptions:j,parser:k};S.push(W)}return S}async function To(o,u){const{fs:t,cache:O,getConfig:g}=u,m=[];for(const a of await t.scan(/(\.ya?ml|\.json)$/)){if(!await g(l.posix.dirname(a.relativePath)))continue;const s=await O.load(a.relativePath,"load-oas");s.data&&s.data.length&&m.push(...s.data.map(n=>({...n,isVirtual:a.isVirtual||n.isVirtual,hash:s.compoundHash})))}return m}function bo(o,u){return u?{...o,info:{...o.info,"x-metadata":{...o.info["x-metadata"],...u}}}:o}export{Mo as definitionLoader,To as definitionsLoader};
1
+ import*as l from"path";import{convertSwagger2OpenAPI as oo}from"@redocly/openapi-docs/lib/utils/convertSwagger2OpenAPI.js";import{Source as no,bundle as ro,createConfig as to,getTotals as io,resolvePlugins as eo}from"@redocly/openapi-core";import{normalizeOptions as ao,OpenAPIParser as so,buildContentItems as co}from"@redocly/openapi-docs";import{combineUrls as E}from"@redocly/theme/core/utils";import{CONFIG_FILE_NAME as A}from"../../../constants/common.js";import{PUBLIC_API_DEFINITIONS_FOLDER as P}from"../../constants/common.js";import{MAX_BUNDLING_ERRORS_TO_PRINT as fo}from"../../constants/plugins/openapi-docs.js";import{unique as lo}from"../../../utils/array/unique.js";import{deepMerge as F}from"../../../utils/object/deep-merge.js";import{pluralize as R}from"../../../utils/string/pluralize.js";import{replaceEnvVariablesDeep as po}from"../../utils/envs/replace-env-variables-deep.js";import{logger as N}from"../../tools/notifiers/logger.js";import{reporter as b}from"../../tools/notifiers/reporter.js";import{injectDecoratorIntoConfig as uo}from"./decorators.js";import{getAllApiConfigsByPath as mo}from"../get-api-config.js";import{normalizeFeedbackOptions as go}from"./utils.js";import{replaceFileExtension as L}from"./store-definition-bundles.js";import{ExternalResolver as wo}from"../../fs/utils/external-ref-resolver.js";import{formatBundleError as ho}from"./format-bundle-error.js";async function Mo(o,u){const{fs:r,cache:O,getConfig:g,isPathIgnored:m}=u;if(l.posix.basename(o)===A)return[];let s;try{s=(await O.load(o,"yaml")).data}catch{return[]}if(!s?.openapi&&!s?.swagger)return N.verbose(`${o} file is not definition. Skipping`),[];const p=await g("."),e=r.getFileInfo(o),n=await g(l.posix.dirname(o)),M=mo(n?.apis,o,n.configPath),S=[],V=await m(o);for(const c of M){if(!c.output&&V)continue;const T=F({decorators:p.decorators},n,{rbac:void 0},c),{resolvedObj:a}=po(T);if(a.decorators&&typeof a.decorators!="object"){await b.panicOnBuildContentError(`'decorators' must be an object at redocly.yaml, got '${typeof a.decorators}'`);continue}if(a.plugins&&!Array.isArray(a.plugins)){await b.panicOnBuildContentError(`'plugins' must be an array at redocly.yaml, got '${typeof a.plugins}'`);continue}const U=n.configPath?l.posix.dirname(n.configPath):".",t=c.output?l.posix.join(U,c.output):o;if(await m(t))continue;e&&c.output&&!r.exists(t)&&r.addVirtualFile(t,e);const z=l.resolve(r.cwd,n.realConfigPath||A),v=new wo(r),C=await to(uo(a,t,r.cwd),{configPath:z,externalRefResolver:v});p.plugins&&p.configPath!==n.configPath&&(C.plugins=lo([...C.plugins||[],...await eo(p.plugins,r.cwd)],f=>f.id));const D=l.resolve(r.cwd,o),G=await r.read(o),J={config:C,base:l.dirname(D),doc:{source:new no(D,G),parsed:JSON.parse(JSON.stringify(s))},externalRefResolver:v},{bundle:{parsed:y},problems:B,visitorsData:q}=await ro(J),H=q["markdown/markdown"]?.markdocChunks??[],i=io(B);let _=[i.errors&&`${i.errors} ${R(i.errors,"error","errors")}`,i.warnings&&`${i.warnings} ${R(i.warnings,"warning","warnings")}`,i.ignored&&`${i.ignored} ignored`].filter(Boolean).join(", ");if(i.errors){const f=B.filter(d=>d.severity==="error");let $=`${_} while bundling ${t} definition:
2
+ `;const x=Math.min(f.length,fo);for(let d=0;d<x;d++){const Y=f[d],Z=await ho(Y,r.cwd);$+=`${Z}
3
+ `}if(f.length>x){const d=f.length-x;$+=`... and ${d} more ${R(d,"error","errors")}`}await b.panicOnBuild($)}i.warnings&&N.warn(`${_} while bundling %rp definition`,t);const w=bo(y.swagger!==void 0?await oo(y):y,n.metadata),h=F(p.openapi||{},n.openapi||{},c.openapi||c?.theme?.openapi||{});h.showSchemaCatalogLinks&&(w["x-schema-catalog-link"]=E(P,t));const X=w["x-feedback"]||h.feedback||n.feedback,j={...h,feedback:go(X),hideSidebar:!0,disableRouter:!0,mockServer:a?.mockServer||p?.mockServer,downloadUrls:h.downloadUrls||[{url:E(P,`${L(t,".json")}?download`)},{url:E(P,`${L(t,".yaml")}?download`)}]},I=ao(j);let k;try{k=new so(w,void 0,I)}catch(f){await b.panicOnBuild(f);continue}const{contentItems:K,flatItems:Q}=co(k,I),W={definition:w,config:a,relativePath:t,realRelativePath:e?.realRelativePath||t,customOutputRelativeFile:c.output&&t,markdocChunks:H,contentItems:K,flatItems:Q,options:I,rawOptions:j,parser:k,isVirtual:e?.isVirtual??!1};S.push(W)}return S}async function Vo(o,u){const{fs:r,cache:O,getConfig:g}=u,m=[];for(const s of r.scan(/(\.ya?ml|\.json)$/)){if(!await g(l.posix.dirname(s.relativePath)))continue;const e=await O.load(s.relativePath,"load-oas");e.data&&e.data.length&&m.push(...e.data.map(n=>({...n,isVirtual:s.isVirtual||n.isVirtual,hash:e.compoundHash})))}return m}function bo(o,u){return u?{...o,info:{...o.info,"x-metadata":{...o.info["x-metadata"],...u}}}:o}export{Mo as definitionLoader,Vo as definitionsLoader};
@@ -1 +1 @@
1
- import g from"node:path";import{REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import{slash as S}from"../../../utils/path/slash.js";import{staticDataLoader as w}from"./loaders/static-data-loader.js";import{findFrontmatterSlugs as y,getSidebarSharedDataId as P,resolveFrontmatterSlugs as b}from"../utils.js";import{reactFrontmatterLoader as F}from"./loaders/react-frontmatter-loader.js";import{registerPageProps as v}from"../register-page-props.js";import{telemetryTraceStep as D}from"../../../cli/telemetry/helpers/trace-step.js";import{searchResolver as R}from"./search/search-resolver.js";async function j(){return{loaders:{"react-frontmatter":F},id:"react-pages",requiredEntitlements:["reactPages"],processContent:async(r,a)=>{await D("build.plugin.pages",async()=>{const{fs:o,cache:f}=a;for(const n of await o.scan(/\.page\.tsx?$/)){const{relativePath:e,realRelativePath:l}=n;if(await a.isPathIgnored(e))continue;const p=r.createTemplate(S(e),g.resolve(o.cwd,l));await v(n,o,r);const{data:t}=await f.load(e,"react-frontmatter"),u=await y(e,"react-frontmatter",t,a),s=b(u,e);let i=null;t?.sidebar&&(i=await P(t.sidebar,e,a.fs)),(s.length?s.reverse():[void 0]).forEach(c=>{r.addRoute({excludeFromSearch:t?.excludeFromSearch||!1,slug:c,templateId:p,fsPath:e,sharedData:i?[{id:i,key:"sidebar"}]:void 0,[h]:t?.rbac,getNavText:async()=>t?.seo?.title,getStaticData:async(m,d)=>({props:await w({frontmatter:t,relativePath:e},a,d)}),getSearchDocuments:R(t,e,r.getSearchFacets,r.setSearchFacets)})});for(const[c,{to:m,type:d}]of Object.entries(t?.redirects||{}))r.addRedirect(c,{to:m||s[0],type:d||301})}})}}}export{j as customPagesPlugin};
1
+ import g from"node:path";import{REDOCLY_TEAMS_RBAC as h}from"@redocly/config";import{slash as S}from"../../../utils/path/slash.js";import{staticDataLoader as y}from"./loaders/static-data-loader.js";import{findFrontmatterSlugs as P,getSidebarSharedDataId as b,resolveFrontmatterSlugs as w}from"../utils.js";import{reactFrontmatterLoader as F}from"./loaders/react-frontmatter-loader.js";import{registerPageProps as v}from"../register-page-props.js";import{telemetryTraceStep as D}from"../../../cli/telemetry/helpers/trace-step.js";import{searchResolver as R}from"./search/search-resolver.js";async function j(){return{loaders:{"react-frontmatter":F},id:"react-pages",requiredEntitlements:["reactPages"],processContent:async(r,a)=>{await D("build.plugin.pages",async()=>{const{fs:o,cache:f}=a;for(const n of o.scan(/\.page\.tsx?$/)){const{relativePath:e,realRelativePath:l}=n;if(await a.isPathIgnored(e))continue;const p=r.createTemplate(S(e),g.resolve(o.cwd,l));await v(n,o,r);const{data:t}=await f.load(e,"react-frontmatter"),u=await P(e,"react-frontmatter",t,a),s=w(u,e);let i=null;t?.sidebar&&(i=await b(t.sidebar,e,a.fs)),(s.length?s.reverse():[void 0]).forEach(c=>{r.addRoute({excludeFromSearch:t?.excludeFromSearch||!1,slug:c,templateId:p,fsPath:e,sharedData:i?[{id:i,key:"sidebar"}]:void 0,[h]:t?.rbac,getNavText:async()=>t?.seo?.title,getStaticData:async(m,d)=>({props:await y({frontmatter:t,relativePath:e},a,d)}),getSearchDocuments:R(t,e,r.getSearchFacets,r.setSearchFacets)})});for(const[c,{to:m,type:d}]of Object.entries(t?.redirects||{}))r.addRedirect(c,{to:m||s[0],type:d||301})}})}}}export{j as customPagesPlugin};
@@ -29,6 +29,9 @@ export declare const getScorecardConfig: (config: Partial<RedoclyConfig>) => {
29
29
  overlay1Preprocessors?: {
30
30
  [x: string]: unknown;
31
31
  } | undefined;
32
+ openrpc1Preprocessors?: {
33
+ [x: string]: unknown;
34
+ } | undefined;
32
35
  decorators?: {
33
36
  [x: string]: unknown;
34
37
  } | undefined;
@@ -56,6 +59,9 @@ export declare const getScorecardConfig: (config: Partial<RedoclyConfig>) => {
56
59
  overlay1Decorators?: {
57
60
  [x: string]: unknown;
58
61
  } | undefined;
62
+ openrpc1Decorators?: {
63
+ [x: string]: unknown;
64
+ } | undefined;
59
65
  rules?: {
60
66
  [x: string]: string | {
61
67
  [x: string]: unknown;
@@ -101,6 +107,11 @@ export declare const getScorecardConfig: (config: Partial<RedoclyConfig>) => {
101
107
  [x: string]: unknown;
102
108
  };
103
109
  } | undefined;
110
+ openrpc1Rules?: {
111
+ [x: string]: string | {
112
+ [x: string]: unknown;
113
+ };
114
+ } | undefined;
104
115
  extends?: string[] | undefined;
105
116
  color?: string | undefined;
106
117
  name: string;
@@ -1 +1 @@
1
- import w from"node:path";import{reporter as x}from"../../../tools/notifiers/reporter.js";import{lintDefinition as h}from"../lint.js";import{ExternalResolver as v}from"../../../fs/utils/external-ref-resolver.js";const C="Non-conformant";async function M(i,e){const{data:{levelsConfig:c,configs:t,targets:n}}=await e.cache.load("","scorecard-config"),r={};let a=C,s=!1;const g=await e.fs.read(i),{data:f}=await e.cache.load(i,"yaml"),m=new v(e.fs);let l={};if(n.length){const o=await e.getConfig(w.posix.dirname(i)),d=f?.info?.["x-metadata"],p={title:f.info.title,version:f.info.version,...d,...o.metadata};l=(await y(n,p))?.configs||{}}for(const o of c){const d=await h({parsed:f,content:g,relativePath:i},l[o.name]||t[o.name],e,m);r[o.name]=d,d.errors===0&&!s?a=o.name:s=!0}let u=c.findIndex(o=>o.name===a);return{levels:r,scorecardLevel:a,scorecardLevelIdx:u+1}}async function y(i,e){if(i)for(const c of i)for(const[t,n]of Object.entries(c.where?.metadata||{})){if(String(n).match(/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}Z)?\/(\d{4}-\d{2}-\d{2})?$/)){if(!e[t])continue;const[r,a]=n.split("/"),s=new Date(e[t]);if(s<new Date(r)||a&&s>new Date(a))continue}else if(String(n).match(/^\/.*\//)){if(!e[t])continue;try{if(!new RegExp(n.slice(1,-1)).test(e[t]))continue}catch{await x.panicOnBuild(`Invalid regex in scorecard target "${t}": ${n}`);continue}}else if(e[t]!==n)continue;return c}}export{y as getTarget,M as scorecardLoader};
1
+ import w from"node:path";import{reporter as x}from"../../../tools/notifiers/reporter.js";import{lintDefinition as h}from"../lint.js";import{ExternalResolver as b}from"../../../fs/utils/external-ref-resolver.js";const v="Non-conformant";async function O(o,e){const{data:{levelsConfig:s,configs:n,targets:t}}=await e.cache.load("","scorecard-config"),a={};let i=v,f=!1;const c=await e.fs.read(o),{data:l}=await e.cache.load(o,"yaml"),m=new b(e.fs);let g={};if(t.length){const r=await e.getConfig(w.posix.dirname(o)),d=l?.info?.["x-metadata"],p={title:l.info.title,version:l.info.version,...d,...r.metadata};g=(await k(t,p))?.configs||{}}for(const r of s){const d=await h({parsed:l,content:c,relativePath:o},g[r.name]||n[r.name],e,m);a[r.name]=d,d.errors===0&&!f?i=r.name:f=!0}let u=s.findIndex(r=>r.name===i);return{levels:a,scorecardLevel:i,scorecardLevelIdx:u+1}}async function k(o,e){if(o)for(const s of o){let n=!0;for(const[t,a]of Object.entries(s.where?.metadata||{}))if(String(a).match(/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}Z)?\/(\d{4}-\d{2}-\d{2})?$/)){if(!e[t]){n=!1;break}const[i,f]=a.split("/"),c=new Date(e[t]);if(c<new Date(i)||f&&c>new Date(f)){n=!1;break}}else if(String(a).match(/^\/.*\//)){if(!e[t]){n=!1;break}try{if(!new RegExp(a.slice(1,-1)).test(e[t])){n=!1;break}}catch{await x.panicOnBuild(`Invalid regex in scorecard target "${t}": ${a}`),n=!1;break}}else if(e[t]!==a){n=!1;break}if(n)return s}}export{k as getTarget,O as scorecardLoader};
@@ -1,13 +1,13 @@
1
- import a from"picomatch";import{resolve as $}from"path";import{access as x,readFile as E,constants as F}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as P}from"../../../tools/notifiers/logger.js";const l="llms.txt",u="Table of contents";async function I(e,t,n={title:l,description:void 0},o){if(!t)return{title:n.title||l,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:e}]};const s=t.title||n.title||l,r=t.description||n.description,i=await g(t,o),c=t.sections?.map(d=>{const{title:f,description:h,excludeFiles:L,includeFiles:m}=d,T=p(e,{excludeFiles:L,includeFiles:m});return{title:f,description:h,llmstxts:T}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(e,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function g(e,t){const n=await t.getConfig();if(e?.details?.path&&n.configPath)try{const o=await t.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=$(t.fs.cwd,o.dirname,e.details.path);return await x(s,F.R_OK),E(s,"utf-8")}catch{throw new Error(`${e.details.path} is not accessible`)}if(e?.details?.content)return e.details.content}function p(e,t){const{excludeFiles:n,includeFiles:o}=t,s=n?.map(i=>a(i)),r=o?.map(i=>a(i));return e.filter(i=>s?.some(d=>d(i.fsPath))?!1:r?.some(d=>d(i.fsPath)))}async function R(e,t,n={title:l,description:void 0},o){const s=await I(e,t,n,o),r=[`# ${s.title}
1
+ import a from"picomatch";import{dirname as $,resolve as x}from"node:path";import{access as E,readFile as F,constants as P}from"fs/promises";import{removeTrailingSlash as w}from"../../../../utils/url/remove-trailing-slash.js";import{logger as I}from"../../../tools/notifiers/logger.js";const l="llms.txt",u="Table of contents";async function g(e,t,n={title:l,description:void 0},o){if(!t)return{title:n.title||l,description:n.description,details:void 0,sections:[{title:u,description:void 0,llmstxts:e}]};const s=t.title||n.title||l,r=t.description||n.description,i=await y(t,o),c=t.sections?.map(d=>{const{title:f,description:h,excludeFiles:L,includeFiles:m}=d,T=p(e,{excludeFiles:L,includeFiles:m});return{title:f,description:h,llmstxts:T}});return{title:s,description:r,details:i,sections:c||[{title:u,description:void 0,llmstxts:p(e,{includeFiles:["**/*"],excludeFiles:[]})}]}}async function y(e,t){const n=await t.getConfig();if(e?.details?.path&&n.configPath)try{const o=t.fs.getFileInfo(n.configPath);if(!o)throw new Error(`Config file ${n.configPath} not found`);const s=x(t.fs.cwd,$(o.relativePath),e.details.path);return await E(s,P.R_OK),F(s,"utf-8")}catch{throw new Error(`${e.details.path} is not accessible`)}if(e?.details?.content)return e.details.content}function p(e,t){const{excludeFiles:n,includeFiles:o}=t,s=n?.map(i=>a(i)),r=o?.map(i=>a(i));return e.filter(i=>s?.some(d=>d(i.fsPath))?!1:r?.some(d=>d(i.fsPath)))}async function S(e,t,n={title:l,description:void 0},o){const s=await g(e,t,n,o),r=[`# ${s.title}
2
2
 
3
3
  `];return s.description&&r.push(`> ${s.description}
4
4
 
5
5
  `),s.details&&r.push(`${s.details}
6
6
 
7
- `),s.sections.forEach(i=>{if(!i.llmstxts.length){P.warn(`llms.txt: No links found for section "${i.title}". Please check the includeFiles/excludeFiles patterns.`);return}r.push(`## ${i.title}
7
+ `),s.sections.forEach(i=>{if(!i.llmstxts.length){I.warn(`llms.txt: No links found for section "${i.title}". Please check the includeFiles/excludeFiles patterns.`);return}r.push(`## ${i.title}
8
8
  `),i.description?r.push(`${i.description.replace(/\n+$/,"")}
9
9
 
10
10
  `):r.push(`
11
- `),i.llmstxts.forEach(c=>{r.push(` - ${y({title:c.title,description:c.description,slug:M(c.slug)})}`)}),r.push(`
12
- `)}),r.join("")}function y({title:e,description:t,slug:n}){return`[${e}](${w(process.env.REDOCLY_PUBLIC_URL||"")}${encodeURI(n)})${t?`: ${t}`:""}
13
- `}function S(e){if(e?.details?.path&&e?.details?.content)throw new Error('"details.path" and "details.content" are mutually exclusive. Please use only one of them.')}function M(e){return`${e}${e==="/"?"index.html.md":".md"}`}export{R as generateLLMsTxt,M as getLLMsTxtMdSlug,y as llmsTxtLink,S as validateLLMsTxtConfig};
11
+ `),i.llmstxts.forEach(c=>{r.push(` - ${M({title:c.title,description:c.description,slug:v(c.slug)})}`)}),r.push(`
12
+ `)}),r.join("")}function M({title:e,description:t,slug:n}){return`[${e}](${w(process.env.REDOCLY_PUBLIC_URL||"")}${encodeURI(n)})${t?`: ${t}`:""}
13
+ `}function A(e){if(e?.details?.path&&e?.details?.content)throw new Error('"details.path" and "details.content" are mutually exclusive. Please use only one of them.')}function v(e){return`${e}${e==="/"?"index.html.md":".md"}`}export{S as generateLLMsTxt,v as getLLMsTxtMdSlug,M as llmsTxtLink,A as validateLLMsTxtConfig};
@@ -1,3 +1,3 @@
1
- import{writeFileSync as tt}from"node:fs";import*as u from"path";import et from"@markdoc/markdoc";import{withoutHash as ot}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as A,SIDEBAR_PREFIX as at,CONFIG_FILE_NAME as V}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as rt}from"../../constants/common.js";import{findDeepFirst as M}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as it}from"../../../utils/array/partition.js";import{collectPropValueDeep as N}from"../../../utils/tree/collect-prop-value-deep.js";import{readEnvVariable as nt}from"../../utils/envs/read-env-variable.js";import{isLocalLink as st}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as lt}from"../../../utils/path/slash.js";import{parsePathVersions as ct}from"../../../utils/path/parse-path-versions.js";import{reporter as D}from"../../tools/notifiers/reporter.js";import{logger as B}from"../../tools/notifiers/logger.js";import{sha1 as ft}from"../../utils/crypto/sha1.js";import{collectItemsLinkedToSidebars as dt,resolveItems as Z}from"../nav-utils.js";import{getInnerText as ut}from"../markdown/markdoc/helpers/get-inner-text.js";import{getExcludedFromLinkCheckerPatterns as mt,getSidebarReferences as gt,hasCircularDependency as pt}from"./utils.js";import{getLocaleFromRelativePath as ht}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as St}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as yt}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as bt}from"../../../cli/telemetry/helpers/trace-step.js";const Ft=180,It=170,wt=10;async function Jt({contentDir:l}){return{id:"sidebars",async afterRoutesCreated(o,i){await bt("build.plugin.sidebars",async()=>{const{cache:f,fs:c}=i,I=o.getConfig(),w=new Map,P=new Set,x=[A,...c.localeFolders],j=o.getGlobalData()[yt]||{},G=new Map;let _=(await c.scan(/sidebars.yaml$/)).map(({relativePath:t})=>t).filter(t=>!Et(I.ignore??[],t)&&t);const $=await gt(i,l,_),q=it(_.filter(t=>!$.has(t)),t=>ct(t)?.versionFolderPath||t),k=mt(I),Q=await dt(I?.navbar,o,i,{navFile:V,excludedFromLinkCheckerPatterns:k});let C;const v=pt($);v&&Array.isArray(v)&&await D.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
2
- Circular dependency chain: ${v.reverse().join(" -> ")}
3
- `);for(const t of q){const m=(await Promise.all(t.map(async n=>{const e=(await f.load(n,"yaml")).data;if(!Array.isArray(e)){await D.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',n,c,n,typeof e);return}return{items:e,sidebarRelativePath:n,locale:ht(n)}}))).filter(X),a=(await L(m))?.firstLink;C||(C=a)}const z=Object.entries(I?.catalogClassic??{});for(const t of x){for(const[e,s]of z)await K(e,s,t);const m={},a=new Set,n=o.getAllRoutesForLocale(t);for(const e of n)if(U(e)&&e.fsPath&&!a.has(e.fsPath)){a.add(e.fsPath);let d=u.posix.dirname(e.fsPath);const p=u.parse(d).root;do m[d]=(m[d]||0)+1,d=u.dirname(d);while(d&&d!="."&&p!=d)}for(const e of n){if(w.has(e.slug))continue;const s=U(e),d=u.dirname(e.fsPath),p=m[d]===1,g=At(e.baseSlug||e.slug);s&&p?await L([{items:[{directory:d}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}]):e.getSidebar!==void 0&&await L([{items:[{page:e.fsPath}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}])}for(const[e,s]of z)await K(e,s,t,!0)}if(_.length===0)for(const t of x){B.verbose("Creating default sidebar");const m=t===A,a=`sidebars.yaml${m?"":"_"+t}`,n=m?"":`${c.localizationFolder}/${t}`,e=(await L([{items:[{directory:`./${n}`}],sidebarRelativePath:a,locale:t,ignoredRoutes:P}]))?.firstLink;C||(C=e)}if(!o.getRouteBySlug("/")&&!o.getConfig().redirects?.["/"]){const m=o.getAllRoutes().find(n=>!St(n.slug)),a=C?C.link:m?.baseSlug??null;if(a){const n=ot(a);o.addRedirect("/",{to:n,type:302}),B.info("Creating default redirect for index page => %s",n)}}const H=nt("REDOCLY_METADATA_OUTPUT_FOLDER");H&&(B.info("Writing catalog data..."),tt(u.join(H,rt),JSON.stringify(Object.fromEntries(G.entries()))));function U(t){return P.has(t.slug)||j[t.fsPath]}async function L(t){if(t.length===0)return;const a=(await Promise.all(t.map(async({items:g,locale:F,sidebarRelativePath:h,ignoredRoutes:T})=>{const r=await Z(g,u.dirname(u.join(l,h)),o,i,{locale:F,ignoredRoutes:T,navFile:h,excludedFromLinkCheckerPatterns:k});if(!r){await D.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",h);return}return r}))).flat().filter(X),n=N(a,"routeSlug"),e=t[0].sidebarRelativePath,s=J(e),d=new Set;for(const g of n){const F=o.getRouteBySlug(g)?.fsPath??"",h=j[F];h&&d.add(h),o.addRouteSharedData(g,"sidebar",s),w.set(Y(g),a)}const p=d.size===1?Array.from(d)[0]:"";return await o.createSharedData(s,{relatedNavbarItem:Q?.get(e),items:a,catalogEntity:p?{key:p}:void 0}),{firstLink:M(a,g=>!!g.link),resolved:a}}async function K(t,m,a,n=!1){const e=structuredClone(m);a&&a!==A&&e.items.forEach(r=>{r.directory=u.posix.join(c.localizationFolder||"",a,r.directory||"")});let s=await Z(e.items,l,o,i,{groupCustomSidebars:!0,locale:a,navFile:V,excludedFromLinkCheckerPatterns:k});if(s&&(s=Ct(s)),!s){await D.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const d=a===A?"":"/"+a.toLowerCase(),p=a===A?"":`-${a}`,g=Y(u.posix.join(d,e.slug));if(n)for(const r of s){const S=M(r.items||[],b=>!!b.routeSlug);if(!S?.routeSlug)continue;const y=w.get(S.routeSlug);if(!y)continue;const O=N(y,"routeSlug"),R="current-catalog-info-"+r.routeSlug+p,E={catalog:{label:e.title,titleTranslationKey:e.titleTranslationKey,link:g,icon:e?.icon},item:{label:r.metadata?.title,link:r.link,icon:r.icon}};await o.createSharedData(R,E);for(const b of O)o.addRouteSharedData(b,"current-catalog-info",R),P.add(b);const W=M(y,b=>!!b.link&&!b.external&&st(b.link)&&(!r.version||b.version===r.version));W&&(r.sidebar=[{...W,items:void 0}])}const F={},h=new Set;for(const r of s){if(!(r.routeSlug||r.sidebar?.[0]?.routeSlug)||!r.fsPath||h.has(r.fsPath))continue;h.add(r.fsPath);const y=u.dirname(r.fsPath);F[y]=(F[y]||0)+1}if(n){const r=await o.createSharedData("catalog-"+t+p,s.flatMap(S=>{const y=u.dirname(S.fsPath??""),O=F[y]===1,R=E=>({...E,fsPath:O?y:E.fsPath??""});return S.type==="group"&&S.items?.every(E=>E.type==="group")?(S.items||[]).map(R):R(S)}));o.addRouteSharedData(g,"catalog",r),Pt(a,s,G,F)}const T=N(s,"routeSlug");for(const r of T)P.add(r)}})}}}function Pt(l,o,i,f){if(l===A)for(const c of o){const I=c.routeSlug||c.sidebar?.[0]?.routeSlug;if(!I||!c.fsPath)continue;const w=u.dirname(c.fsPath),P=f[w]===1;i.set(I,{rootFileFsPath:c.fsPath,fsPath:P?w:c.fsPath,metadata:c.metadata||{},title:c.metadata?.title||c.label||"Untitled",version:c.version||"latest"})}}function Ct(l){const o=i=>{if(!i)return i;const f=et.parse(i);return ut([f])};return l.map(i=>{const f={...i};return f.metadata?.description&&(f.metadata={...f.metadata,description:o(f.metadata.description)}),f})}function J(l){return at+lt(l)}async function qt(l,o,i){const f=u.posix.join(u.dirname(l),o);return await i.exists(f)?J(f):(await D.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",l,i,l,o),null)}function Et(l,o){const i=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return l.filter(c=>i.test(c)).includes(o)}function At(l){const o=l.replaceAll("/","_");if(o.length>Ft){const i=o.slice(0,It),f=ft(l).slice(0,wt).replaceAll("/","_");return i+f}else return o}export{Et as isSidebarIgnored,Ct as removeMarkdownTags,qt as resolveSidebarId,Jt as sidebarsPlugin};
1
+ import{writeFileSync as tt}from"node:fs";import*as u from"path";import et from"@markdoc/markdoc";import{withoutHash as ot}from"@redocly/theme/core/utils";import{DEFAULT_LOCALE_PLACEHOLDER as E,SIDEBAR_PREFIX as at,CONFIG_FILE_NAME as K}from"../../../constants/common.js";import{CATALOG_OUTPUT_FILE_NAME as rt}from"../../constants/common.js";import{findDeepFirst as M}from"../../../utils/tree/find-deep-first.js";import{isDefined as X}from"../../../utils/guards/is-defined.js";import{partition as it}from"../../../utils/array/partition.js";import{collectPropValueDeep as N}from"../../../utils/tree/collect-prop-value-deep.js";import{readEnvVariable as nt}from"../../utils/envs/read-env-variable.js";import{isLocalLink as st}from"../../../utils/path/is-local-link.js";import{normalizeRouteSlug as Y}from"../../../utils/path/normalize-route-slug.js";import{slash as lt}from"../../../utils/path/slash.js";import{parsePathVersions as ct}from"../../../utils/path/parse-path-versions.js";import{reporter as A}from"../../tools/notifiers/reporter.js";import{logger as x}from"../../tools/notifiers/logger.js";import{sha1 as ft}from"../../utils/crypto/sha1.js";import{collectItemsLinkedToSidebars as dt,resolveItems as Z}from"../nav-utils.js";import{getInnerText as ut}from"../markdown/markdoc/helpers/get-inner-text.js";import{getExcludedFromLinkCheckerPatterns as mt,getSidebarReferences as gt,hasCircularDependency as pt}from"./utils.js";import{getLocaleFromRelativePath as ht}from"../../fs/utils/get-locale-from-relative-path.js";import{isSystemRouteSlug as St}from"../../utils/system-routes.js";import{ENTITIES_MAP_GLOBAL_DATA_KEY as yt}from"../../constants/plugins/catalog-entities.js";import{telemetryTraceStep as bt}from"../../../cli/telemetry/helpers/trace-step.js";const Ft=180,It=170,Dt=10;async function Jt({contentDir:l}){return{id:"sidebars",async afterRoutesCreated(o,i){await bt("build.plugin.sidebars",async()=>{const{cache:d,fs:c}=i,I=o.getConfig(),D=new Map,P=new Set,B=[E,...c.localeFolders],j=o.getGlobalData()[yt]||{},G=new Map;let L=c.scan(/sidebars.yaml$/).map(({relativePath:t})=>t).filter(t=>!Ct(I.ignore??[],t)&&t);const $=await gt(i,l,L),q=it(L.filter(t=>!$.has(t)),t=>ct(t)?.versionFolderPath||t),_=mt(I),Q=await dt(I?.navbar,o,i,{navFile:K,excludedFromLinkCheckerPatterns:_});let w;const T=pt($);T&&Array.isArray(T)&&await A.panicOnBuildContentError(`Sidebar references have circular dependency. Please check your sidebar files.
2
+ Circular dependency chain: ${T.reverse().join(" -> ")}
3
+ `);for(const t of q){const m=(await Promise.all(t.map(async n=>{const e=(await d.load(n,"yaml")).data;if(!Array.isArray(e)){await A.panicOnBuildContentErrorForRealFile('Invalid sidebar contents at %rp, items should be an array, got "%s"',n,c,n,typeof e);return}return{items:e,sidebarRelativePath:n,locale:ht(n)}}))).filter(X),r=(await k(m))?.firstLink;w||(w=r)}const z=Object.entries(I?.catalogClassic??{});for(const t of B){for(const[e,s]of z)await W(e,s,t);const m={},r=new Set,n=o.getAllRoutesForLocale(t);for(const e of n)if(U(e)&&e.fsPath&&!r.has(e.fsPath)){r.add(e.fsPath);let f=u.posix.dirname(e.fsPath);const h=u.parse(f).root;do m[f]=(m[f]||0)+1,f=u.dirname(f);while(f&&f!="."&&h!=f)}for(const e of n){if(D.has(e.slug))continue;const s=U(e),f=u.dirname(e.fsPath),h=m[f]===1,g=Et(e.baseSlug||e.slug);s&&h?await k([{items:[{directory:f}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}]):e.getSidebar!==void 0&&await k([{items:[{page:e.fsPath}],sidebarRelativePath:"sidebar.yaml_"+g,locale:t}])}for(const[e,s]of z)await W(e,s,t,!0)}if(L.length===0)for(const t of B){x.verbose("Creating default sidebar");const m=t===E,r=`sidebars.yaml${m?"":"_"+t}`,n=m?"":`${c.localizationFolder}/${t}`,e=(await k([{items:[{directory:`./${n}`}],sidebarRelativePath:r,locale:t,ignoredRoutes:P}]))?.firstLink;w||(w=e)}if(!o.getRouteBySlug("/")&&!o.getConfig().redirects?.["/"]){const m=o.getAllRoutes().find(n=>!St(n.slug)),r=w?w.link:m?.baseSlug??null;if(r){const n=ot(r);o.addRedirect("/",{to:n,type:302}),x.info("Creating default redirect for index page => %s",n)}}const H=nt("REDOCLY_METADATA_OUTPUT_FOLDER");H&&(x.info("Writing catalog data..."),tt(u.join(H,rt),JSON.stringify(Object.fromEntries(G.entries()))));function U(t){return P.has(t.slug)||j[t.fsPath]}async function k(t){if(t.length===0)return;const r=(await Promise.all(t.map(async({items:g,locale:F,sidebarRelativePath:p,ignoredRoutes:R})=>{const a=await Z(g,u.dirname(u.join(l,p)),o,i,{locale:F,ignoredRoutes:R,navFile:p,excludedFromLinkCheckerPatterns:_});if(!a){await A.panicOnBuild("Failed to resolve sidebar configuration. Make sure %rp is valid",p);return}return a}))).flat().filter(X),n=N(r,"routeSlug"),e=t[0].sidebarRelativePath,s=J(e),f=new Set;for(const g of n){const F=o.getRouteBySlug(g)?.fsPath??"",p=j[F];p&&(Array.from(f).find(a=>a.key===p.key&&a.version===p.version)||f.add(p)),o.addRouteSharedData(g,"sidebar",s),D.set(Y(g),r)}const h=f.size===1?Array.from(f)[0]:void 0;return await o.createSharedData(s,{relatedNavbarItem:Q?.get(e),items:r,catalogEntity:h?{key:h.key,version:h.version}:void 0}),{firstLink:M(r,g=>!!g.link),resolved:r}}async function W(t,m,r,n=!1){const e=structuredClone(m);r&&r!==E&&e.items.forEach(a=>{a.directory=u.posix.join(c.localizationFolder||"",r,a.directory||"")});let s=await Z(e.items,l,o,i,{groupCustomSidebars:!0,locale:r,navFile:K,excludedFromLinkCheckerPatterns:_});if(s&&(s=wt(s)),!s){await A.panicOnBuild(`Failed to resolve catalog configuration. Make sure catalog ${t} has valid config`);return}const f=r===E?"":"/"+r.toLowerCase(),h=r===E?"":`-${r}`,g=Y(u.posix.join(f,e.slug));if(n)for(const a of s){const S=M(a.items||[],b=>!!b.routeSlug);if(!S?.routeSlug)continue;const y=D.get(S.routeSlug);if(!y)continue;const O=N(y,"routeSlug"),v="current-catalog-info-"+a.routeSlug+h,C={catalog:{label:e.title,titleTranslationKey:e.titleTranslationKey,link:g,icon:e?.icon},item:{label:a.metadata?.title,link:a.link,icon:a.icon}};await o.createSharedData(v,C);for(const b of O)o.addRouteSharedData(b,"current-catalog-info",v),P.add(b);const V=M(y,b=>!!b.link&&!b.external&&st(b.link)&&(!a.version||b.version===a.version));V&&(a.sidebar=[{...V,items:void 0}])}const F={},p=new Set;for(const a of s){if(!(a.routeSlug||a.sidebar?.[0]?.routeSlug)||!a.fsPath||p.has(a.fsPath))continue;p.add(a.fsPath);const y=u.dirname(a.fsPath);F[y]=(F[y]||0)+1}if(n){const a=await o.createSharedData("catalog-"+t+h,s.flatMap(S=>{const y=u.dirname(S.fsPath??""),O=F[y]===1,v=C=>({...C,fsPath:O?y:C.fsPath??""});return S.type==="group"&&S.items?.every(C=>C.type==="group")?(S.items||[]).map(v):v(S)}));o.addRouteSharedData(g,"catalog",a),Pt(r,s,G,F)}const R=N(s,"routeSlug");for(const a of R)P.add(a)}})}}}function Pt(l,o,i,d){if(l===E)for(const c of o){const I=c.routeSlug||c.sidebar?.[0]?.routeSlug;if(!I||!c.fsPath)continue;const D=u.dirname(c.fsPath),P=d[D]===1;i.set(I,{rootFileFsPath:c.fsPath,fsPath:P?D:c.fsPath,metadata:c.metadata||{},title:c.metadata?.title||c.label||"Untitled",version:c.version||"latest"})}}function wt(l){const o=i=>{if(!i)return i;const d=et.parse(i);return ut([d])};return l.map(i=>{const d={...i};return d.metadata?.description&&(d.metadata={...d.metadata,description:o(d.metadata.description)}),d})}function J(l){return at+lt(l)}async function qt(l,o,i){const d=u.posix.join(u.dirname(l),o);return await i.exists(d)?J(d):(await A.panicOnBuildContentErrorForRealFile("File %rp: Failed to create relative path for sidebars.yaml using %s",l,i,l,o),null)}function Ct(l,o){const i=/\/?([a-zA-Z0-9-_]+\/)*sidebars?(-[a-zA-Z0-9-_]+)?\.yaml/;return l.filter(c=>i.test(c)).includes(o)}function Et(l){const o=l.replaceAll("/","_");if(o.length>Ft){const i=o.slice(0,It),d=ft(l).slice(0,Dt).replaceAll("/","_");return i+d}else return o}export{Ct as isSidebarIgnored,wt as removeMarkdownTags,qt as resolveSidebarId,Jt as sidebarsPlugin};
@@ -1 +1 @@
1
- import n from"path";import{DEFAULT_LOCALE_PLACEHOLDER as s}from"../../constants/common.js";import{normalizeRouteSlug as m}from"../../utils/path/normalize-route-slug.js";import{logger as l}from"../tools/notifiers/logger.js";import{getLocaleFromRelativePath as p}from"../fs/utils/get-locale-from-relative-path.js";import{isL10nPath as f}from"../fs/utils/is-l10n-path.js";import{removeL10nPrefix as u}from"../fs/utils/remove-l10n-prefix.js";import{resolveSidebarId as c}from"./sidebars/index.js";function E(e,o){return(Array.isArray(e)?e:e?[e]:[]).map(r=>d(r,o))}function d(e,o){const t=p(o).toLowerCase(),r=m(e);return t!==s?`/${t}${r}`:r}function b(e){const o=e.endsWith(".page.tsx")?".page.tsx":n.posix.extname(e),t=n.posix.basename(e,o);return{baseName:t,isIndexFile:t==="index"}}async function w(e,o,t,r){if(t?.slug||!f(e))return t?.slug;const a=u(e);if(!await r.fs.exists(a))return;const{data:i}=await r.cache.load(a,o);return i?.frontmatter?.slug}async function R(e,o,t){const r=typeof e=="string",a=r?e:e.path;return r&&await l.warnForRealFile("The 'sidebar' property in the front matter of %rp is deprecated. Use 'sidebar.path' instead.",o,t),a?c(o,a,t):null}export{w as findFrontmatterSlugs,R as getSidebarSharedDataId,b as parseBaseName,E as resolveFrontmatterSlugs};
1
+ import a from"path";import{DEFAULT_LOCALE_PLACEHOLDER as s}from"../../constants/common.js";import{normalizeRouteSlug as m}from"../../utils/path/normalize-route-slug.js";import{logger as l}from"../tools/notifiers/logger.js";import{getLocaleFromRelativePath as p}from"../fs/utils/get-locale-from-relative-path.js";import{isL10nPath as f}from"../fs/utils/is-l10n-path.js";import{removeL10nPrefix as u}from"../fs/utils/remove-l10n-prefix.js";import{resolveSidebarId as c}from"./sidebars/index.js";function E(e,o){return(Array.isArray(e)?e:e?[e]:[]).map(r=>d(r,o))}function d(e,o){const t=p(o).toLowerCase(),r=m(e);return t!==s?`/${t}${r}`:r}function b(e){const o=e.endsWith(".page.tsx")?".page.tsx":a.posix.extname(e),t=a.posix.basename(e,o);return{baseName:t,isIndexFile:t==="index"}}async function R(e,o,t,r){if(t?.slug||!f(e))return t?.slug;const n=u(e);if(!r.fs.exists(n))return;const{data:i}=await r.cache.load(n,o);return i?.frontmatter?.slug}async function I(e,o,t){const r=typeof e=="string",n=r?e:e.path;return r&&l.warnForRealFile("The 'sidebar' property in the front matter of %rp is deprecated. Use 'sidebar.path' instead.",o,t),n?c(o,n,t):null}export{R as findFrontmatterSlugs,I as getSidebarSharedDataId,b as parseBaseName,E as resolveFrontmatterSlugs};
@@ -78,25 +78,6 @@ export declare const entitiesRelationsTable: import("drizzle-orm/sqlite-core").S
78
78
  }, {}, {
79
79
  length: number | undefined;
80
80
  }>;
81
- sourceId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
82
- name: "source_id";
83
- tableName: "entities_relations";
84
- dataType: "string";
85
- columnType: "SQLiteText";
86
- data: string;
87
- driverParam: string;
88
- notNull: false;
89
- hasDefault: false;
90
- isPrimaryKey: false;
91
- isAutoincrement: false;
92
- hasRuntimeDefault: false;
93
- enumValues: [string, ...string[]];
94
- baseColumn: never;
95
- identity: undefined;
96
- generated: undefined;
97
- }, {}, {
98
- length: number | undefined;
99
- }>;
100
81
  sourceVersion: import("drizzle-orm/sqlite-core").SQLiteColumn<{
101
82
  name: "source_version";
102
83
  tableName: "entities_relations";
@@ -104,8 +85,8 @@ export declare const entitiesRelationsTable: import("drizzle-orm/sqlite-core").S
104
85
  columnType: "SQLiteText";
105
86
  data: string;
106
87
  driverParam: string;
107
- notNull: false;
108
- hasDefault: false;
88
+ notNull: true;
89
+ hasDefault: true;
109
90
  isPrimaryKey: false;
110
91
  isAutoincrement: false;
111
92
  hasRuntimeDefault: false;
@@ -123,8 +104,8 @@ export declare const entitiesRelationsTable: import("drizzle-orm/sqlite-core").S
123
104
  columnType: "SQLiteText";
124
105
  data: string;
125
106
  driverParam: string;
126
- notNull: false;
127
- hasDefault: false;
107
+ notNull: true;
108
+ hasDefault: true;
128
109
  isPrimaryKey: false;
129
110
  isAutoincrement: false;
130
111
  hasRuntimeDefault: false;
@@ -173,25 +154,6 @@ export declare const entitiesRelationsTable: import("drizzle-orm/sqlite-core").S
173
154
  }, {}, {
174
155
  length: number | undefined;
175
156
  }>;
176
- targetId: import("drizzle-orm/sqlite-core").SQLiteColumn<{
177
- name: "target_id";
178
- tableName: "entities_relations";
179
- dataType: "string";
180
- columnType: "SQLiteText";
181
- data: string;
182
- driverParam: string;
183
- notNull: false;
184
- hasDefault: false;
185
- isPrimaryKey: false;
186
- isAutoincrement: false;
187
- hasRuntimeDefault: false;
188
- enumValues: [string, ...string[]];
189
- baseColumn: never;
190
- identity: undefined;
191
- generated: undefined;
192
- }, {}, {
193
- length: number | undefined;
194
- }>;
195
157
  targetVersion: import("drizzle-orm/sqlite-core").SQLiteColumn<{
196
158
  name: "target_version";
197
159
  tableName: "entities_relations";
@@ -199,8 +161,8 @@ export declare const entitiesRelationsTable: import("drizzle-orm/sqlite-core").S
199
161
  columnType: "SQLiteText";
200
162
  data: string;
201
163
  driverParam: string;
202
- notNull: false;
203
- hasDefault: false;
164
+ notNull: true;
165
+ hasDefault: true;
204
166
  isPrimaryKey: false;
205
167
  isAutoincrement: false;
206
168
  hasRuntimeDefault: false;
@@ -218,8 +180,8 @@ export declare const entitiesRelationsTable: import("drizzle-orm/sqlite-core").S
218
180
  columnType: "SQLiteText";
219
181
  data: string;
220
182
  driverParam: string;
221
- notNull: false;
222
- hasDefault: false;
183
+ notNull: true;
184
+ hasDefault: true;
223
185
  isPrimaryKey: false;
224
186
  isAutoincrement: false;
225
187
  hasRuntimeDefault: false;
@@ -287,6 +249,23 @@ export declare const entitiesRelationsTable: import("drizzle-orm/sqlite-core").S
287
249
  }, {}, {
288
250
  length: number | undefined;
289
251
  }>;
252
+ isDeleted: import("drizzle-orm/sqlite-core").SQLiteColumn<{
253
+ name: "is_deleted";
254
+ tableName: "entities_relations";
255
+ dataType: "boolean";
256
+ columnType: "SQLiteBoolean";
257
+ data: boolean;
258
+ driverParam: number;
259
+ notNull: false;
260
+ hasDefault: true;
261
+ isPrimaryKey: false;
262
+ isAutoincrement: false;
263
+ hasRuntimeDefault: false;
264
+ enumValues: undefined;
265
+ baseColumn: never;
266
+ identity: undefined;
267
+ generated: undefined;
268
+ }, {}, {}>;
290
269
  createdAt: import("drizzle-orm/sqlite-core").SQLiteColumn<{
291
270
  name: "created_at";
292
271
  tableName: "entities_relations";
@@ -1 +1 @@
1
- import{sqliteTable as r,text as e,index as o,uniqueIndex as i}from"drizzle-orm/sqlite-core";const s=r("entities_relations",{id:e("id").primaryKey(),organizationId:e("organization_id").notNull(),projectId:e("project_id").notNull(),sourceKey:e("source_key").notNull(),sourceId:e("source_id"),sourceVersion:e("source_version"),sourceRevision:e("source_revision"),sourceToTargetRelation:e("source_to_target_relation").notNull(),targetKey:e("target_key").notNull(),targetId:e("target_id"),targetVersion:e("target_version"),targetRevision:e("target_revision"),targetToSourceRelation:e("target_to_source_relation").notNull(),sourceFile:e("source_file"),fileHash:e("file_hash"),createdAt:e("created_at").notNull(),updatedAt:e("updated_at").notNull()},t=>[o("idx_entities_relations_source_key").on(t.sourceKey),o("idx_entities_relations_target_key").on(t.targetKey),o("idx_entities_relations_source_target").on(t.sourceToTargetRelation),o("idx_entities_relations_target_source").on(t.targetToSourceRelation),i("idx_entities_relations_unique").on(t.sourceKey,t.targetKey,t.sourceVersion,t.targetVersion,t.sourceRevision,t.targetRevision)]);export{s as entitiesRelationsTable};
1
+ import{sqliteTable as i,text as e,integer as r,index as o,uniqueIndex as n}from"drizzle-orm/sqlite-core";const l=i("entities_relations",{id:e("id").primaryKey(),organizationId:e("organization_id").notNull(),projectId:e("project_id").notNull(),sourceKey:e("source_key").notNull(),sourceVersion:e("source_version").default("").notNull(),sourceRevision:e("source_revision").default("").notNull(),sourceToTargetRelation:e("source_to_target_relation").notNull(),targetKey:e("target_key").notNull(),targetVersion:e("target_version").default("").notNull(),targetRevision:e("target_revision").default("").notNull(),targetToSourceRelation:e("target_to_source_relation").notNull(),sourceFile:e("source_file"),fileHash:e("file_hash"),isDeleted:r("is_deleted",{mode:"boolean"}).default(!1),createdAt:e("created_at").notNull(),updatedAt:e("updated_at").notNull()},t=>[o("idx_entities_relations_source_key").on(t.sourceKey,t.isDeleted),o("idx_entities_relations_target_key").on(t.targetKey,t.isDeleted),o("idx_entities_relations_source_target").on(t.sourceToTargetRelation),o("idx_entities_relations_target_source").on(t.targetToSourceRelation),n("idx_entities_relations_unique").on(t.sourceKey,t.targetKey,t.sourceVersion,t.targetVersion,t.sourceRevision,t.targetRevision)]);export{l as entitiesRelationsTable};
@@ -332,8 +332,8 @@ export declare const entitiesTable: import("drizzle-orm/sqlite-core").SQLiteTabl
332
332
  columnType: "SQLiteText";
333
333
  data: string;
334
334
  driverParam: string;
335
- notNull: false;
336
- hasDefault: false;
335
+ notNull: true;
336
+ hasDefault: true;
337
337
  isPrimaryKey: false;
338
338
  isAutoincrement: false;
339
339
  hasRuntimeDefault: false;
@@ -351,7 +351,7 @@ export declare const entitiesTable: import("drizzle-orm/sqlite-core").SQLiteTabl
351
351
  columnType: "SQLiteText";
352
352
  data: string;
353
353
  driverParam: string;
354
- notNull: false;
354
+ notNull: true;
355
355
  hasDefault: false;
356
356
  isPrimaryKey: false;
357
357
  isAutoincrement: false;
@@ -416,6 +416,23 @@ export declare const entitiesTable: import("drizzle-orm/sqlite-core").SQLiteTabl
416
416
  identity: undefined;
417
417
  generated: undefined;
418
418
  }, {}, {}>;
419
+ isDeleted: import("drizzle-orm/sqlite-core").SQLiteColumn<{
420
+ name: "is_deleted";
421
+ tableName: "entities";
422
+ dataType: "boolean";
423
+ columnType: "SQLiteBoolean";
424
+ data: boolean;
425
+ driverParam: number;
426
+ notNull: false;
427
+ hasDefault: true;
428
+ isPrimaryKey: false;
429
+ isAutoincrement: false;
430
+ hasRuntimeDefault: false;
431
+ enumValues: undefined;
432
+ baseColumn: never;
433
+ identity: undefined;
434
+ generated: undefined;
435
+ }, {}, {}>;
419
436
  scorecardsStatus: import("drizzle-orm/sqlite-core").SQLiteColumn<{
420
437
  name: "scorecards_status";
421
438
  tableName: "entities";
@@ -1 +1 @@
1
- import{sqliteTable as o,text as e,integer as s,index as i,uniqueIndex as n}from"drizzle-orm/sqlite-core";const a=o("entities",{id:e("id").primaryKey(),organizationId:e("organization_id").notNull(),projectId:e("project_id").notNull(),key:e("key").notNull(),type:e("type").notNull(),title:e("title").notNull(),summary:e("summary"),tags:e("tags"),metadata:e("metadata"),git:e("git"),contact:e("contact"),links:e("links"),createdAt:e("created_at").notNull(),updatedAt:e("updated_at").notNull(),source:e("source").default("file"),sourceFile:e("source_file"),fileHash:e("file_hash"),version:e("version"),revision:e("revision"),hash:e("hash"),isCurrent:s("is_current",{mode:"boolean"}).default(!0),isDefaultVersion:s("is_default_version",{mode:"boolean"}).default(!1),scorecardsStatus:e("scorecards_status")},t=>[i("idx_entities_type").on(t.type),i("idx_entities_hash").on(t.hash),i("idx_entities_key_source_created_at").on(t.key,t.createdAt),i("idx_entities_key_source_is_current").on(t.key,t.isCurrent),i("idx_entities_key_source_is_default").on(t.key,t.isDefaultVersion),n("idx_entities_key_source").on(t.key,t.source,t.revision,t.version)]);export{a as entitiesTable};
1
+ import{sqliteTable as o,text as e,integer as s,index as i,uniqueIndex as n}from"drizzle-orm/sqlite-core";const d=o("entities",{id:e("id").primaryKey(),organizationId:e("organization_id").notNull(),projectId:e("project_id").notNull(),key:e("key").notNull(),type:e("type").notNull(),title:e("title").notNull(),summary:e("summary"),tags:e("tags"),metadata:e("metadata"),git:e("git"),contact:e("contact"),links:e("links"),createdAt:e("created_at").notNull(),updatedAt:e("updated_at").notNull(),source:e("source").default("file"),sourceFile:e("source_file"),fileHash:e("file_hash"),version:e("version").default("not_specified_version").notNull(),revision:e("revision").notNull(),hash:e("hash"),isCurrent:s("is_current",{mode:"boolean"}).default(!0),isDefaultVersion:s("is_default_version",{mode:"boolean"}).default(!1),isDeleted:s("is_deleted",{mode:"boolean"}).default(!1),scorecardsStatus:e("scorecards_status")},t=>[i("idx_entities_type").on(t.type),i("idx_entities_hash").on(t.hash),i("idx_entities_key_source_created_at").on(t.key,t.createdAt),i("idx_entities_key_source_is_current").on(t.key,t.isCurrent,t.isDeleted),i("idx_entities_key_source_is_default").on(t.key,t.isDefaultVersion),n("idx_entities_key_source").on(t.key,t.source,t.revision,t.version)]);export{d as entitiesTable};
@@ -1,4 +1,7 @@
1
1
  import type { SQLiteSelect } from 'drizzle-orm/sqlite-core';
2
+ import type { SQL } from 'drizzle-orm';
2
3
  import type { PaginationParams } from './schemas.js';
3
- export declare const applyCombinedFilters: <T extends SQLiteSelect>(sqlBuilder: T, paginationParams: PaginationParams) => T;
4
+ export declare const applyCombinedFilters: <T extends SQLiteSelect>(sqlBuilder: T, paginationParams: PaginationParams & {
5
+ baseWhereCondition?: SQL;
6
+ }) => T;
4
7
  //# sourceMappingURL=combined-filters.d.ts.map
@@ -1 +1 @@
1
- import{and as p}from"drizzle-orm";import{applyFilter as f}from"./filter.js";import{applySearch as h}from"./search.js";import{applyAfterAndBefore as c}from"./after-and-before.js";const d=(e,t)=>{const o=[],{whereCondition:r}=f(e,t.filter);r&&o.push(r);const{whereCondition:n}=h(e,t);n&&o.push(n);const{whereCondition:i}=c(e,t);return i&&o.push(i),o.length===0?e:o.length===1?e.where(o[0]):e.where(p(...o))};export{d as applyCombinedFilters};
1
+ import{and as h}from"drizzle-orm";import{applyFilter as f}from"./filter.js";import{applySearch as p}from"./search.js";import{applyAfterAndBefore as C}from"./after-and-before.js";const m=(o,t)=>{const e=[];t.baseWhereCondition&&e.push(t.baseWhereCondition);const{whereCondition:r}=f(o,t.filter);r&&e.push(r);const{whereCondition:n}=p(o,t);n&&e.push(n);const{whereCondition:i}=C(o,t);return i&&e.push(i),e.length===0?o:e.length===1?o.where(e[0]):o.where(h(...e))};export{m as applyCombinedFilters};
@@ -8,4 +8,5 @@ export declare function applyFilter<T extends SQLiteSelect | SQLiteDelete>(sqlBu
8
8
  export declare function convertFilterToWhereCondition(filter?: Filter): SQL | undefined;
9
9
  export declare function getFirstFilterFieldValue(filter: Filter | undefined, fieldName: string): FilterClause['value'] | undefined;
10
10
  export declare function parseFilterQuery(query?: string, availableFields?: string[], fieldsTransformations?: Record<string, string>): Filter | undefined;
11
+ export declare function excludeFieldsFromFilter(filter: Filter | undefined, fieldsToExclude: string[]): Filter | undefined;
11
12
  //# sourceMappingURL=filter.d.ts.map
@@ -1 +1 @@
1
- import{and as R,between as T,eq as x,inArray as C,isNotNull as L,isNull as I,like as v,ne as k,notBetween as y,notInArray as W,notLike as b,or as d,sql as a}from"drizzle-orm";import{isFilterCondition as g}from"./types.js";import{transformToSnakeCase as q}from"./utils/transform-to-snake-case.js";import{isFieldAllowed as D}from"./utils/field-pattern-matcher.js";import{OPERATORS as $}from"./constants.js";const U=["domains","owners"],P=["tags"];function z(t,e){const o=J(e);return o?{sqlBuilder:t,whereCondition:o}:{sqlBuilder:t,whereCondition:null}}function J(t){if(t)return g(t)?j(t):A(t)}const j=t=>{const{op:e,conditions:o}=t,n=[];for(const c of o){if(g(c)){const r=j(c);r&&n.push(r);continue}const i=A(c);i&&n.push(i)}return e===$.AND?R(...n):d(...n)},H=(t,e)=>e.length>1?`$.${e.slice(1).join(".")}.${t}`:`$.${t}`,E=({operator:t,value:e,field:o,parentFields:n,negation:c})=>{const i=a.identifier(n[0]),r=H(o,n);switch(t){case"equal":return c?a`(json_extract(${i}, ${r}) != ${e} OR json_extract(${i}, ${r}) IS NULL)`:a`json_extract(${i}, ${r}) == ${e}`;case"equalNull":return c?a`json_extract(${i}, ${r}) IS NOT NULL`:a`json_extract(${i}, ${r}) IS NULL`;case"contains":return c?a`(json_extract(${i}, ${r}) NOT LIKE ${e} OR json_extract(${i}, ${r}) IS NULL)`:a`json_extract(${i}, ${r}) LIKE ${e}`;case"in":if(Array.isArray(e)){const s=e.map(l=>a`json_extract(${i}, ${r}) == ${l}`);return c?a`(NOT (${d(...s)}) OR json_extract(${i}, ${r}) IS NULL)`:d(...s)}break;case"between":if(Array.isArray(e)&&e.length===2)return c?a`(NOT (json_extract(${i}, ${r}) BETWEEN ${e[0]} AND ${e[1]}) OR json_extract(${i}, ${r}) IS NULL)`:a`json_extract(${i}, ${r}) BETWEEN ${e[0]} AND ${e[1]}`;break;default:throw new Error(`Unsupported operator: ${t} for json path`)}};function G(t,e){if(!t)return;const o=c=>{if(g(c)){for(const i of c.conditions){const r=o(i);if(r!==void 0)return r}return}if(c.field===e)return c.value},n=o(t);return typeof n=="string"?n.trim()===""?null:n.trim():n??null}const M=t=>{const{field:e,operator:o,value:n,modifier:c,parentFields:i}=t,r=c==="not";if(!i||i.length<1)throw new Error("convertNestedFilterClauseToSql called without parentFields");switch(o){case"equal":return E(n===null?{operator:"equalNull",value:n,field:e,parentFields:i,negation:r}:{operator:o,value:n,field:e,parentFields:i,negation:r});case"contains":if(typeof n=="string"){const s=n.startsWith("%")||n.endsWith("%")?n:`%${n}%`;return E({operator:o,value:s,field:e,parentFields:i,negation:r})}break;case"in":if(Array.isArray(n))return E({operator:o,value:n,field:e,parentFields:i,negation:r});break;case"between":if(Array.isArray(n)&&n.length===2)return E({operator:o,value:n,field:e,parentFields:i,negation:r});break;default:throw new Error(`Unsupported filter operator: ${o}`)}},A=t=>{const{field:e,operator:o,value:n,modifier:c,parentFields:i}=t;if(i&&i.length>=1)return M(t);const r=c==="not",s=a.identifier(e),l=P.includes(e),f=U.includes(e);switch(o){case"equal":return n===null?r?L(s):I(s):f?r?a`NOT EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_extract(json_each.value, '$.key') = ${n})`:a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_extract(json_each.value, '$.key') = ${n})`:l?r?a`NOT EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_each.value = ${n})`:a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_each.value = ${n})`:r?k(s,n):x(s,n);case"contains":if(typeof n=="string"){const u=n.startsWith("%")||n.endsWith("%")?n:`%${n}%`;return r?b(s,u):v(s,u)}break;case"in":if(Array.isArray(n)){if(f){const u=n.map(p=>a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_extract(json_each.value, '$.key') = ${p})`);return r?a`NOT (${d(...u)})`:d(...u)}else if(l){const u=n.map(p=>a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_each.value = ${p})`);return r?a`NOT (${d(...u)})`:d(...u)}return r?W(s,n):C(s,n)}break;case"between":if(Array.isArray(n)&&n.length===2)return r?y(s,n[0],n[1]):T(s,n[0],n[1]);break;default:throw new Error(`Unsupported filter operator: ${o}`)}},N=["'",'"'];function Z(t="",e=[],o={}){if(!t||!t.trim())return;const n=S(t);return O(n,e,o)}function F(t){const e=X(t);if(e.operator===":"){const o=w(e.value,",");if(o.length>1)return{operator:"in",field:e.field,parentFields:e.parentFields,value:o.map(m),modifier:e.modifier};const n=w(e.value,"..");return n.length===2?{operator:"between",field:e.field,parentFields:e.parentFields,value:[m(n[0]),m(n[1])],modifier:e.modifier}:{operator:"equal",field:e.field,parentFields:e.parentFields,value:e.value==="null"?null:m(e.value),modifier:e.modifier}}else if(e.operator==="~")return{operator:"contains",field:e.field,parentFields:e.parentFields,value:m(e.value),modifier:e.modifier};throw new Error(`Unsupported filter clause: ${t}`)}function X(t){const e="^(?<modifier>^-?)",o="(?<field>[a-z][\\w.]*)",n="(?<operator>:|~)",c="(?<value>.+)",i=new RegExp(`^${e}${o}${n}${c}$`,"i"),r=t.match(i);if(!r||!r.groups)throw new Error(`Invalid filter clause: ${t}`);const{operator:s,value:l,modifier:f}=r.groups,u=r.groups.field.split(".");return{field:u.pop(),parentFields:u,operator:s,value:l,modifier:f==="-"?"not":void 0}}function w(t,e){const o=[];let n="",c=!1,i=0;for(let r=0;r<t.length;r++){const s=t[r-1],l=t[r];if(i>0){i--;continue}s!=="\\"&&N.includes(l)&&(c=!c),!c&&t.slice(r,r+e.length)===e?(o.push(n),n="",i=e.length-1):n+=l}return n&&o.push(n),o}function m(t){for(const e of N)if(t.startsWith(e)&&t.endsWith(e))return t.slice(1,-1);return t}function S(t){let e="",o=0,n=!1,c="";const i=[];for(let s=0;s<t.length;s++){const l=t[s],f=t[s+1];if(['"',"'"].includes(l)&&(s===0||t[s-1]!=="\\")){if(!n){n=!0,c=l,e+=l;continue}if(l===c){n=!1,c="",e+=l;continue}}if(n){e+=l;continue}if(o===0){const u=f==="A"&&t.slice(s+1,s+5)===`${$.AND} `;if(l===" "&&u){const h=e.trim();h&&(i.push(F(h)),e="");const _=S(t.slice(s+5));return{op:$.AND,conditions:[...i,_]}}const p=f==="O"&&t.slice(s+1,s+4)===`${$.OR} `;if(l===" "&&p){const h=e.trim();h&&(i.push(F(h)),e="");const _=S(t.slice(s+4));return{op:$.OR,conditions:[...i,_]}}}if(l==="("){const u=e.trim();o===0&&u&&(i.push(F(u)),e=""),o++,e+=l;continue}if(l===")"){if(o--,e+=l,o===0){const u=e.slice(1,-1);i.push(S(u)),e=""}continue}e+=l}const r=e.trim();return r&&i.push(F(r)),i.length===1?i[0]:{op:$.AND,conditions:i}}function O(t,e,o){if("field"in t){const n=t.parentFields?.length?`${t.parentFields.join(".")}.${t.field}`:t.field;if(!D(n,e))throw new Error(`Invalid filter field: ${n}`);const c=t.parentFields?.length?t.field:o[t.field]||q(t.field);return{...t,field:c}}else return{...t,conditions:t.conditions.map(n=>O(n,e,o))}}export{z as applyFilter,J as convertFilterToWhereCondition,G as getFirstFilterFieldValue,Z as parseFilterQuery};
1
+ import{and as O,between as R,eq as T,inArray as C,isNotNull as L,isNull as I,like as v,ne as k,notBetween as y,notInArray as W,notLike as b,or as d,sql as a}from"drizzle-orm";import{isFilterCondition as F}from"./types.js";import{transformToSnakeCase as q}from"./utils/transform-to-snake-case.js";import{isFieldAllowed as D}from"./utils/field-pattern-matcher.js";import{OPERATORS as h}from"./constants.js";const U=["domains","owners"],P=["tags"];function z(t,e){const o=J(e);return o?{sqlBuilder:t,whereCondition:o}:{sqlBuilder:t,whereCondition:null}}function J(t){if(t)return F(t)?j(t):x(t)}const j=t=>{const{op:e,conditions:o}=t,n=[];for(const l of o){if(F(l)){const r=j(l);r&&n.push(r);continue}const i=x(l);i&&n.push(i)}return e===h.AND?O(...n):d(...n)},H=(t,e)=>e.length>1?`$.${e.slice(1).join(".")}.${t}`:`$.${t}`,m=({operator:t,value:e,field:o,parentFields:n,negation:l})=>{const i=a.identifier(n[0]),r=H(o,n);switch(t){case"equal":return l?a`(json_extract(${i}, ${r}) != ${e} OR json_extract(${i}, ${r}) IS NULL)`:a`json_extract(${i}, ${r}) == ${e}`;case"equalNull":return l?a`json_extract(${i}, ${r}) IS NOT NULL`:a`json_extract(${i}, ${r}) IS NULL`;case"contains":return l?a`(json_extract(${i}, ${r}) NOT LIKE ${e} OR json_extract(${i}, ${r}) IS NULL)`:a`json_extract(${i}, ${r}) LIKE ${e}`;case"in":if(Array.isArray(e)){const s=e.map(c=>a`json_extract(${i}, ${r}) == ${c}`);return l?a`(NOT (${d(...s)}) OR json_extract(${i}, ${r}) IS NULL)`:d(...s)}break;case"between":if(Array.isArray(e)&&e.length===2)return l?a`(NOT (json_extract(${i}, ${r}) BETWEEN ${e[0]} AND ${e[1]}) OR json_extract(${i}, ${r}) IS NULL)`:a`json_extract(${i}, ${r}) BETWEEN ${e[0]} AND ${e[1]}`;break;default:throw new Error(`Unsupported operator: ${t} for json path`)}};function G(t,e){if(!t)return;const o=l=>{if(F(l)){for(const i of l.conditions){const r=o(i);if(r!==void 0)return r}return}if(l.field===e)return l.value},n=o(t);return typeof n=="string"?n.trim()===""?null:n.trim():n??null}const M=t=>{const{field:e,operator:o,value:n,modifier:l,parentFields:i}=t,r=l==="not";if(!i||i.length<1)throw new Error("convertNestedFilterClauseToSql called without parentFields");switch(o){case"equal":return m(n===null?{operator:"equalNull",value:n,field:e,parentFields:i,negation:r}:{operator:o,value:n,field:e,parentFields:i,negation:r});case"contains":if(typeof n=="string"){const s=n.startsWith("%")||n.endsWith("%")?n:`%${n}%`;return m({operator:o,value:s,field:e,parentFields:i,negation:r})}break;case"in":if(Array.isArray(n))return m({operator:o,value:n,field:e,parentFields:i,negation:r});break;case"between":if(Array.isArray(n)&&n.length===2)return m({operator:o,value:n,field:e,parentFields:i,negation:r});break;default:throw new Error(`Unsupported filter operator: ${o}`)}},x=t=>{const{field:e,operator:o,value:n,modifier:l,parentFields:i}=t;if(i&&i.length>=1)return M(t);const r=l==="not",s=a.identifier(e),c=P.includes(e),f=U.includes(e);switch(o){case"equal":return n===null?r?L(s):I(s):f?r?a`NOT EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_extract(json_each.value, '$.key') = ${n})`:a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_extract(json_each.value, '$.key') = ${n})`:c?r?a`NOT EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_each.value = ${n})`:a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_each.value = ${n})`:r?k(s,n):T(s,n);case"contains":if(typeof n=="string"){const u=n.startsWith("%")||n.endsWith("%")?n:`%${n}%`;return r?b(s,u):v(s,u)}break;case"in":if(Array.isArray(n)){if(f){const u=n.map(p=>a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_extract(json_each.value, '$.key') = ${p})`);return r?a`NOT (${d(...u)})`:d(...u)}else if(c){const u=n.map(p=>a`EXISTS (SELECT 1 FROM json_each(${s}) WHERE json_each.value = ${p})`);return r?a`NOT (${d(...u)})`:d(...u)}return r?W(s,n):C(s,n)}break;case"between":if(Array.isArray(n)&&n.length===2)return r?y(s,n[0],n[1]):R(s,n[0],n[1]);break;default:throw new Error(`Unsupported filter operator: ${o}`)}},A=["'",'"'];function Z(t="",e=[],o={}){if(!t||!t.trim())return;const n=g(t);return w(n,e,o)}function S(t){const e=X(t);if(e.operator===":"){const o=N(e.value,",");if(o.length>1)return{operator:"in",field:e.field,parentFields:e.parentFields,value:o.map(E),modifier:e.modifier};const n=N(e.value,"..");return n.length===2?{operator:"between",field:e.field,parentFields:e.parentFields,value:[E(n[0]),E(n[1])],modifier:e.modifier}:{operator:"equal",field:e.field,parentFields:e.parentFields,value:e.value==="null"?null:E(e.value),modifier:e.modifier}}else if(e.operator==="~")return{operator:"contains",field:e.field,parentFields:e.parentFields,value:E(e.value),modifier:e.modifier};throw new Error(`Unsupported filter clause: ${t}`)}function X(t){const e="^(?<modifier>^-?)",o="(?<field>[a-z][\\w.]*)",n="(?<operator>:|~)",l="(?<value>.+)",i=new RegExp(`^${e}${o}${n}${l}$`,"i"),r=t.match(i);if(!r||!r.groups)throw new Error(`Invalid filter clause: ${t}`);const{operator:s,value:c,modifier:f}=r.groups,u=r.groups.field.split(".");return{field:u.pop(),parentFields:u,operator:s,value:c,modifier:f==="-"?"not":void 0}}function N(t,e){const o=[];let n="",l=!1,i=0;for(let r=0;r<t.length;r++){const s=t[r-1],c=t[r];if(i>0){i--;continue}s!=="\\"&&A.includes(c)&&(l=!l),!l&&t.slice(r,r+e.length)===e?(o.push(n),n="",i=e.length-1):n+=c}return n&&o.push(n),o}function E(t){for(const e of A)if(t.startsWith(e)&&t.endsWith(e))return t.slice(1,-1);return t}function g(t){let e="",o=0,n=!1,l="";const i=[];for(let s=0;s<t.length;s++){const c=t[s],f=t[s+1];if(['"',"'"].includes(c)&&(s===0||t[s-1]!=="\\")){if(!n){n=!0,l=c,e+=c;continue}if(c===l){n=!1,l="",e+=c;continue}}if(n){e+=c;continue}if(o===0){const u=f==="A"&&t.slice(s+1,s+5)===`${h.AND} `;if(c===" "&&u){const $=e.trim();$&&(i.push(S($)),e="");const _=g(t.slice(s+5));return{op:h.AND,conditions:[...i,_]}}const p=f==="O"&&t.slice(s+1,s+4)===`${h.OR} `;if(c===" "&&p){const $=e.trim();$&&(i.push(S($)),e="");const _=g(t.slice(s+4));return{op:h.OR,conditions:[...i,_]}}}if(c==="("){const u=e.trim();o===0&&u&&(i.push(S(u)),e=""),o++,e+=c;continue}if(c===")"){if(o--,e+=c,o===0){const u=e.slice(1,-1);i.push(g(u)),e=""}continue}e+=c}const r=e.trim();return r&&i.push(S(r)),i.length===1?i[0]:{op:h.AND,conditions:i}}function w(t,e,o){if("field"in t){const n=t.parentFields?.length?`${t.parentFields.join(".")}.${t.field}`:t.field;if(!D(n,e))throw new Error(`Invalid filter field: ${n}`);const l=t.parentFields?.length?t.field:o[t.field]||q(t.field);return{...t,field:l}}else return{...t,conditions:t.conditions.map(n=>w(n,e,o))}}function ee(t,e){if(!t)return;const o=i=>e.includes(i),n=i=>{if(F(i)){const r=i.conditions.map(n).filter(s=>s!==null);return r.length===0?null:r.length===1?r[0]:{...i,conditions:r}}else return o(i.field)?null:i};return n(t)||void 0}export{z as applyFilter,J as convertFilterToWhereCondition,ee as excludeFieldsFromFilter,G as getFirstFilterFieldValue,Z as parseFilterQuery};