@redocly/reef 0.130.0-next.8 → 0.130.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +133 -0
- package/dist/bin.js +1 -1
- package/dist/cli/develop.js +1 -1
- package/dist/cli/stats/collectors/openapi.js +1 -1
- package/dist/client/ErrorBoundary.js +1 -1
- package/dist/client/app/Sidebar/RequestAccessButton.js +2 -2
- package/dist/client/app/Sidebar/Sidebar.js +2 -2
- package/dist/client/app/hooks/catalog/useCatalogClassic.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogFilter.js +1 -1
- package/dist/client/app/hooks/catalog/useCatalogViewMode.js +1 -1
- package/dist/client/app/hooks/catalog/useSearchTracker.js +1 -1
- package/dist/client/app/hooks/usePageTimeTracker.js +1 -1
- package/dist/client/app/hooks/useRouteChangeTracker.js +1 -1
- package/dist/client/app/pages/DevLogin/DevLogin.js +1 -1
- package/dist/client/app/search/message-handlers.d.ts +29 -0
- package/dist/client/app/search/message-handlers.js +1 -0
- package/dist/client/app/search/sse-parser.d.ts +10 -0
- package/dist/client/app/search/sse-parser.js +2 -0
- package/dist/client/app/search/useAiSearch.d.ts +9 -11
- package/dist/client/app/search/useAiSearch.js +1 -1
- package/dist/client/app/search/useSearch.js +1 -1
- package/dist/client/constants/ai-search.d.ts +30 -0
- package/dist/client/constants/ai-search.js +1 -0
- package/dist/client/constants/index.d.ts +2 -0
- package/dist/client/constants/index.js +1 -0
- package/dist/client/types/ai-search.d.ts +73 -0
- package/dist/client/types/ai-search.js +0 -0
- package/dist/client/types/index.d.ts +1 -0
- package/dist/constants/l10n/langs/ar.js +1 -1
- package/dist/constants/l10n/langs/de.js +1 -1
- package/dist/constants/l10n/langs/en.js +1 -1
- package/dist/constants/l10n/langs/es.js +1 -1
- package/dist/constants/l10n/langs/fr.js +1 -1
- package/dist/constants/l10n/langs/hi.js +1 -1
- package/dist/constants/l10n/langs/it.js +1 -1
- package/dist/constants/l10n/langs/ja.js +1 -1
- package/dist/constants/l10n/langs/ko.js +1 -1
- package/dist/constants/l10n/langs/pl.js +1 -1
- package/dist/constants/l10n/langs/pt-BR.js +1 -1
- package/dist/constants/l10n/langs/pt.js +1 -1
- package/dist/constants/l10n/langs/ru.js +1 -1
- package/dist/constants/l10n/langs/uk.js +1 -1
- package/dist/constants/l10n/langs/zh.js +1 -1
- package/dist/server/api-routes/run-api-routes-worker.js +1 -1
- package/dist/server/constants/common.js +1 -1
- package/dist/server/entitlements/entitlements-provider.js +1 -1
- package/dist/server/persistence/kv/services/kv-service.js +1 -1
- package/dist/server/plugins/asyncapi-docs/template/AsyncApiDocs.js +5 -3
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.d.ts +32 -9
- package/dist/server/plugins/catalog-entities/database/catalog-entities-service.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.d.ts +16 -5
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-bff-repository.js +21 -17
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.d.ts +35 -9
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-read-repository.js +24 -21
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.d.ts +31 -8
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-local-write-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.d.ts +7 -1
- package/dist/server/plugins/catalog-entities/database/repositories/local/catalog-entities-relations-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.d.ts +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/remote/catalog-entities-remote-repository.js +1 -1
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.d.ts +13 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-entities-exclusion-filter.js +1 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.d.ts +31 -0
- package/dist/server/plugins/catalog-entities/database/repositories/utils/build-rbac-filter.js +9 -0
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/base.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/api-description/openapi-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/extensions/extractors/fs-entities-extractor.js +1 -1
- package/dist/server/plugins/catalog-entities/get-server-props.js +1 -1
- package/dist/server/plugins/catalog-entities/types/openapi.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/types/openapi.js +0 -0
- package/dist/server/plugins/catalog-entities/types/params.d.ts +6 -0
- package/dist/server/plugins/catalog-entities/types/params.js +0 -0
- package/dist/server/plugins/catalog-entities/utils/catalog-data-collector.js +1 -1
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.d.ts +11 -0
- package/dist/server/plugins/catalog-entities/utils/get-not-accessible-catalog-resources.js +1 -0
- package/dist/server/plugins/config-parser/index.js +1 -1
- package/dist/server/plugins/markdown/markdown-static-data-loader.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/docs-mcp-tool.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoint-info.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-endpoints.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-full-api-description.js +1 -1
- package/dist/server/plugins/mcp/docs-mcp/tools/get-security-schemes.js +1 -1
- package/dist/server/plugins/mcp/handlers/docs-mcp-handler.js +1 -1
- package/dist/server/plugins/mcp/handlers/errors.js +1 -1
- package/dist/server/plugins/mcp/servers/base-server.js +1 -1
- package/dist/server/plugins/openapi-docs/template/OpenAPIDocs.js +8 -4
- package/dist/server/plugins/openapi-docs/template/helpers.d.ts +1 -1
- package/dist/server/plugins/openapi-docs/template/helpers.js +3 -3
- package/dist/server/plugins/scorecard-classic/types.d.ts +3 -3
- package/dist/server/plugins/scorecard-classic/types.js +1 -1
- package/dist/server/plugins/search/llmstxt/index.js +4 -4
- package/dist/server/plugins/sso/index.js +1 -1
- package/dist/server/store.js +1 -1
- package/dist/server/tools/notifiers/logger.js +1 -1
- package/dist/server/tools/notifiers/reporter.js +7 -7
- package/dist/server/utils/rbac.d.ts +65 -0
- package/dist/server/web-server/auth.js +3 -3
- package/dist/server/web-server/middleware/catalogAuthMiddleware.d.ts +4 -6
- package/dist/server/web-server/middleware/catalogAuthMiddleware.js +1 -1
- package/dist/server/web-server/routes/ask-ai.js +1 -1
- package/dist/server/web-server/routes/auth.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog-related-entities.js +1 -1
- package/dist/server/web-server/routes/catalog/bff-catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/catalog.js +1 -1
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.d.ts +10 -0
- package/dist/server/web-server/routes/catalog/helpers/has-access-to-entity.js +1 -0
- package/dist/server/web-server/routes/dynamic-route.js +1 -1
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.d.ts +3 -0
- package/dist/server/web-server/routes/helpers/get-current-rbac-teams.js +1 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.d.ts +11 -0
- package/dist/server/web-server/routes/helpers/get-rbac-restrictions-data-for-catalog.js +1 -0
- package/dist/server/web-server/routes/index.js +1 -1
- package/dist/server/web-server/routes/mcp-oauth.js +1 -1
- package/dist/server/web-server/routes/page-data.js +1 -1
- package/dist/server/web-server/utils.d.ts +2 -2
- package/package.json +16 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,138 @@
|
|
|
1
1
|
# @redocly/reef
|
|
2
2
|
|
|
3
|
+
## 0.130.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ac12b3523a: Added an interactive lightbox viewer for Mermaid diagrams with zoom, pan, and keyboard navigation.
|
|
8
|
+
- 1ff6da217d: Added support for branch-specific configuration in `redocly.yaml`.
|
|
9
|
+
- 12fd642835: Transitioned AI Search to agent mode, now featuring expanded search capabilities and direct integration with the Docs MCP.
|
|
10
|
+
- ec292cdaaa: Made the **403 Forbidden** error page layout ejectable and improved its styling.
|
|
11
|
+
- f117f86b3b: Added `login-button` Markdoc tag to render a login button on project pages.
|
|
12
|
+
- 053051e82f: Added `rbac` support for banners to allow conditional visibility based on user team membership.
|
|
13
|
+
- e24e828523: Added ejectable `DocumentationLayoutTop` and `DocumentationLayoutBottom` to customize component positions in `DocumentationLayout`.
|
|
14
|
+
- c585ce5de8: Improved tooltip positioning and performance.
|
|
15
|
+
|
|
16
|
+
### Patch Changes
|
|
17
|
+
|
|
18
|
+
- 134e0817c3: Fixed an issue where project processing could halt indefinitely.
|
|
19
|
+
- 2db5a19a31: Fixed an issue where project builds could fail due to unset environment variables, despite the variables existing in the cloud environment.
|
|
20
|
+
- 8cb9a82a7a: Fixed support for `.redocly.lint-ignore.yaml` in the scorecard.
|
|
21
|
+
- e135881ebc: Updated `@redocly/openapi-core` to version `2.15.2`.
|
|
22
|
+
- 39a6b03569: Fixed `id_token` audience validation to support organization ID alongside slug, preventing auth failures after slug changes.
|
|
23
|
+
- 864165169a: Fixed an issue where deep links would open pages in an incorrect position if a banner was present.
|
|
24
|
+
- a191d2c98e: Fixed an issue where the **Back to Search** button was displayed when AI Assistant was opened using the **Ask AI** button.
|
|
25
|
+
- 8164c94e92: Fixed image alignment in headers.
|
|
26
|
+
- d309b3d828: Fixed language icon rendering issues in API docs.
|
|
27
|
+
- 3af7a906b4: Fixed an issue where URLs of OpenAPI docs pages could automatically receive `-1` suffixes.
|
|
28
|
+
- a57b480eef: Added support for `query` in OpenAPI 3.2 and `x-query` in OpenAPI versions earlier than 3.2.
|
|
29
|
+
- 31ab0feb1c: Improved misleading warning for expired plan gates token.
|
|
30
|
+
- 1bc7e35d32: Fixed API docs performance issues in projects that use Markdoc partial tags.
|
|
31
|
+
- 4015d8d229: Fixed an issue where the `llms.txt` page ignored path prefix in links.
|
|
32
|
+
- Updated dependencies [ac12b3523a]
|
|
33
|
+
- Updated dependencies [e135881ebc]
|
|
34
|
+
- Updated dependencies [7083962f58]
|
|
35
|
+
- Updated dependencies [7083962f58]
|
|
36
|
+
- Updated dependencies [c94dd823e4]
|
|
37
|
+
- Updated dependencies [c585ce5de8]
|
|
38
|
+
- Updated dependencies [a759cf76c7]
|
|
39
|
+
- Updated dependencies [9562d72bd7]
|
|
40
|
+
- Updated dependencies [864165169a]
|
|
41
|
+
- Updated dependencies [a191d2c98e]
|
|
42
|
+
- Updated dependencies [8164c94e92]
|
|
43
|
+
- Updated dependencies [85818157d8]
|
|
44
|
+
- Updated dependencies [d309b3d828]
|
|
45
|
+
- Updated dependencies [c1d9f9a79d]
|
|
46
|
+
- Updated dependencies [3b573feb37]
|
|
47
|
+
- Updated dependencies [7ea47225bc]
|
|
48
|
+
- Updated dependencies [12fd642835]
|
|
49
|
+
- Updated dependencies [24c74512bd]
|
|
50
|
+
- Updated dependencies [ab5975a273]
|
|
51
|
+
- Updated dependencies [9df7a53978]
|
|
52
|
+
- Updated dependencies [ec292cdaaa]
|
|
53
|
+
- Updated dependencies [f117f86b3b]
|
|
54
|
+
- Updated dependencies [a57b480eef]
|
|
55
|
+
- Updated dependencies [053051e82f]
|
|
56
|
+
- Updated dependencies [e24e828523]
|
|
57
|
+
- Updated dependencies [39d177b9b6]
|
|
58
|
+
- @redocly/theme@0.62.0
|
|
59
|
+
- @redocly/openapi-docs@3.18.0
|
|
60
|
+
- @redocly/realm-asyncapi-sdk@0.8.0
|
|
61
|
+
- @redocly/asyncapi-docs@1.7.0
|
|
62
|
+
- @redocly/graphql-docs@1.7.0
|
|
63
|
+
- @redocly/portal-plugin-mock-server@0.15.0
|
|
64
|
+
- @redocly/portal-legacy-ui@0.13.0
|
|
65
|
+
|
|
66
|
+
## 0.130.0-next.12
|
|
67
|
+
|
|
68
|
+
### Minor Changes
|
|
69
|
+
|
|
70
|
+
- 12fd642835: Transitioned AI Search to agent mode, now featuring expanded search capabilities and direct integration with the Docs MCP.
|
|
71
|
+
- 053051e82f: Added `rbac` support for banners to allow conditional visibility based on user team membership.
|
|
72
|
+
|
|
73
|
+
### Patch Changes
|
|
74
|
+
|
|
75
|
+
- 31ab0feb1c: Improved misleading warning for expired plan gates token.
|
|
76
|
+
- Updated dependencies [c94dd823e4]
|
|
77
|
+
- Updated dependencies [12fd642835]
|
|
78
|
+
- Updated dependencies [053051e82f]
|
|
79
|
+
- @redocly/theme@0.62.0-next.8
|
|
80
|
+
- @redocly/asyncapi-docs@1.7.0-next.11
|
|
81
|
+
- @redocly/graphql-docs@1.7.0-next.3
|
|
82
|
+
- @redocly/openapi-docs@3.18.0-next.11
|
|
83
|
+
- @redocly/portal-plugin-mock-server@0.15.0-next.11
|
|
84
|
+
|
|
85
|
+
## 0.130.0-next.11
|
|
86
|
+
|
|
87
|
+
### Patch Changes
|
|
88
|
+
|
|
89
|
+
- e135881ebc: Updated `@redocly/openapi-core` to version `2.15.2`.
|
|
90
|
+
- c585ce5de8: Improved tooltip positioning and performance.
|
|
91
|
+
- 4015d8d229: Fixed an issue where the `llms.txt` page ignored path prefix in links.
|
|
92
|
+
- Updated dependencies [e135881ebc]
|
|
93
|
+
- Updated dependencies [c585ce5de8]
|
|
94
|
+
- Updated dependencies [a759cf76c7]
|
|
95
|
+
- Updated dependencies [85818157d8]
|
|
96
|
+
- @redocly/openapi-docs@3.18.0-next.10
|
|
97
|
+
- @redocly/theme@0.62.0-next.7
|
|
98
|
+
- @redocly/realm-asyncapi-sdk@0.8.0-next.3
|
|
99
|
+
- @redocly/asyncapi-docs@1.7.0-next.10
|
|
100
|
+
- @redocly/portal-plugin-mock-server@0.15.0-next.10
|
|
101
|
+
- @redocly/graphql-docs@1.7.0-next.2
|
|
102
|
+
|
|
103
|
+
## 0.130.0-next.10
|
|
104
|
+
|
|
105
|
+
### Patch Changes
|
|
106
|
+
|
|
107
|
+
- 8164c94e92: Fixed image alignment in headers.
|
|
108
|
+
- Updated dependencies [8164c94e92]
|
|
109
|
+
- Updated dependencies [c1d9f9a79d]
|
|
110
|
+
- Updated dependencies [3b573feb37]
|
|
111
|
+
- Updated dependencies [7ea47225bc]
|
|
112
|
+
- Updated dependencies [9df7a53978]
|
|
113
|
+
- @redocly/theme@0.62.0-next.6
|
|
114
|
+
- @redocly/portal-plugin-mock-server@0.15.0-next.9
|
|
115
|
+
- @redocly/realm-asyncapi-sdk@0.8.0-next.2
|
|
116
|
+
- @redocly/asyncapi-docs@1.7.0-next.9
|
|
117
|
+
- @redocly/graphql-docs@1.7.0-next.1
|
|
118
|
+
- @redocly/openapi-docs@3.18.0-next.9
|
|
119
|
+
|
|
120
|
+
## 0.130.0-next.9
|
|
121
|
+
|
|
122
|
+
### Patch Changes
|
|
123
|
+
|
|
124
|
+
- 9f91c53c96: Updated `@redocly/openapi-core` to version `2.15.1`.
|
|
125
|
+
- 39a6b03569: Fixed `id_token` audience validation to support organization ID alongside slug, preventing auth failures after slug changes.
|
|
126
|
+
- 864165169a: Fixed an issue where deep links would open pages in an incorrect position if a banner was present.
|
|
127
|
+
- d7fada1899: Fixed an issue where `KV.set` would fail when not provided with a third argument in transactions.
|
|
128
|
+
- Updated dependencies [9f91c53c96]
|
|
129
|
+
- Updated dependencies [864165169a]
|
|
130
|
+
- Updated dependencies [ab5975a273]
|
|
131
|
+
- @redocly/openapi-docs@3.18.0-next.8
|
|
132
|
+
- @redocly/asyncapi-docs@1.7.0-next.8
|
|
133
|
+
- @redocly/graphql-docs@1.7.0-next.1
|
|
134
|
+
- @redocly/portal-plugin-mock-server@0.15.0-next.8
|
|
135
|
+
|
|
3
136
|
## 0.130.0-next.8
|
|
4
137
|
|
|
5
138
|
### Minor Changes
|
package/dist/bin.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import"./cli/utils/node-version-check.js";import o from"mri";import*as r from"node:path";import{tmpdir as A}from"node:os";import*as x from"node:fs";import"./server/node-fetch-polyfill.js";import{cliCommandNames as g}from"./constants/common.js";import{initPlugins as T}from"./server/plugins/lifecycle.js";import{loadEnvVariables as y}from"./server/utils/envs/load-env-variables.js";import{PORTAL_VERSION as k}from"./server/version.js";import{logger as p}from"./server/tools/notifiers/logger.js";import{reporter as t}from"./server/tools/notifiers/reporter.js";import{sha as R}from"./server/utils/crypto/sha.js";import{develop as S}from"./cli/develop.js";import{eject as V}from"./cli/eject/index.js";import{beforeCommand as w}from"./server/utils/lifecycle-hooks.js";import{Store as C}from"./server/store.js";import{prepare as I}from"./cli/prepare/index.js";import{fromCurrentDir as L}from"./server/utils/paths.js";import{translationsCliOpts as
|
|
2
|
+
import"./cli/utils/node-version-check.js";import o from"mri";import*as r from"node:path";import{tmpdir as A}from"node:os";import*as x from"node:fs";import"./server/node-fetch-polyfill.js";import{cliCommandNames as g}from"./constants/common.js";import{initPlugins as T}from"./server/plugins/lifecycle.js";import{loadEnvVariables as y}from"./server/utils/envs/load-env-variables.js";import{PORTAL_VERSION as k}from"./server/version.js";import{logger as p}from"./server/tools/notifiers/logger.js";import{reporter as t}from"./server/tools/notifiers/reporter.js";import{sha as R}from"./server/utils/crypto/sha.js";import{develop as S}from"./cli/develop.js";import{eject as V}from"./cli/eject/index.js";import{beforeCommand as w}from"./server/utils/lifecycle-hooks.js";import{Store as C}from"./server/store.js";import{prepare as I}from"./cli/prepare/index.js";import{fromCurrentDir as L}from"./server/utils/paths.js";import{translationsCliOpts as _}from"./cli/translations/options.js";import{generateTranslations as M}from"./cli/translations/index.js";import{EntitlementsProvider as N}from"./server/entitlements/entitlements-provider.js";import{isValidPlan as F}from"./server/entitlements/is-valid-plan.js";import{stopAllCompilers as U}from"./server/esbuild/esbuild.js";import{copyLibsqlPrebuiltBinary as $}from"./cli/prepare/libsql/copy-prebuilt-binary.js";import{telemetry as d}from"./cli/telemetry/index.js";import{stats as q}from"./cli/stats/index.js";import{statsCliOpts as B}from"./cli/stats/options.js";const n=process.argv[2];let i;const f={alias:{d:"project-dir",p:"port"},default:{"project-dir":process.env.REDOCLY_CONTENT_DIR||process.cwd(),outdir:"public"}},G={alias:f.alias,default:{...f.default,plan:"enterprise"}},Y={alias:{d:"prepareDir"},default:{prepareDir:"public"}},z={boolean:["force"],alias:{f:"force",d:"project-dir"},default:{"project-dir":process.cwd()}};process.on("uncaughtException",async function(e){e?.code==="ERR_INVALID_STATE"?console.log("Ignore premature close error"):(p.error("Uncaught exception occurred. Stopping compilers."),await U(),p.error("Exiting due to uncaught exception"),await t.panic(e))});try{n||await t.panicOnContentError("Command not specified.");const e=N.instance();switch(["prepare","serve","stats"].includes(n)&&await e.init(),["eject","translate"].includes(n)&&await e.init({developModePlan:"enterprise"}),n){case"develop":case"preview":const a=o(process.argv.slice(3),G),E=r.resolve(a["project-dir"]),j=r.join(A(),"redocly-public-"+R(E)),l=a.plan.toLowerCase();F(l)||await t.panicOnContentError(`Invalid --plan argument value '${l}'.`),await e.init({developModePlan:l}),i=new C({contentDir:r.resolve(a["project-dir"]),outdir:j,serverOutDir:L(import.meta.url,"./server/esbuild/cache/server")}),await w(g.DEVELOP,a,i),await S(a,i);break;case"prepare":const s=o(process.argv.slice(3),f),u=r.resolve(r.join(s.outdir,"server"));i=new C({contentDir:r.resolve(s["project-dir"]),outdir:r.resolve(s.outdir,"client"),serverOutDir:u}),await w(g.PREPARE,s,i),$(u),await I(s,i);break;case"serve":await y();const b=o(process.argv.slice(3),Y),O=r.resolve(b.prepareDir);d.sendServeCliCommandExecutedMessage();const v=r.join(O,"server","index.mjs");x.existsSync(v)||await t.panic("Server not found. Please run `realm prepare` first"),import(v).catch(async c=>{await t.panic("Failed to load server",c)});break;case"eject":e.canAccessFeature("themeEjecting")||await t.panicOnContentError('The "eject" command is not available for this project');const m=o(process.argv.slice(3),z),{lifecycleContext:{getConfig:h,fs:D}}=await T({outdir:"",contentDir:r.resolve(m["project-dir"]),setGlobalConfig:()=>null});D.dispose(),d.sendCliCommandEjectExecutedMessage([{object:"cli_command",arguments:m}]),await V({...m,config:await h()}),p.clearAllTimeouts();break;case"translate":if(e.canAccessFeature("l10n")){const c=o(process.argv.slice(3),_);d.sendCliCommandTranslateExecutedMessage({arguments:c}),await M(c)}else await t.panicOnContentError('The "translate" command is not available for this project');break;case"stats":const P=o(process.argv.slice(3),B);await q(P);break;case"--version":console.log(k);break;default:await t.panicOnContentError(`Unknown command "${n}"`)}}catch(e){p.error("Exiting due to uncaught exception"),await t.panic(e)}
|
package/dist/cli/develop.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{logger as
|
|
1
|
+
import{logger as t}from"../server/tools/notifiers/logger.js";import{reporter as u}from"../server/tools/notifiers/reporter.js";import{green as v}from"../server/tools/notifiers/helpers/colors.js";import{resolveCache as g}from"../server/esbuild/plugins/themes-resolver.js";import{getBilledPagesCount as m}from"../server/utils/index.js";import{createClientCompiler as w,createServerCompiler as C}from"../server/esbuild/esbuild.js";import{initPlugins as h,runPlugins as p,writeClientEntries as S}from"../server/plugins/lifecycle.js";import{startDevServer as E}from"../server/web-server/dev-server.js";import{validateAllMarkdowns as f}from"../server/plugins/markdown/compiler.js";import{reportAllErrors as b}from"../server/utils/report-all-errors.js";import{copyMigrationsFolder as R}from"../server/providers/database/copy-migrations.js";async function j(i,e){t.info("Starting project preview mode."),S(e),t.startTiming("initial-js"),await y(e),t.infoTime("initial-js","JavaScript compiled");const{pluginInstances:a,lifecycleContext:n}=await h({contentDir:e.contentDir,outdir:e.outdir,serverOutDir:void 0,devLogin:i["dev-login"]!==!1,setGlobalConfig:e.setGlobalConfig});e.lifecycleContext=n,R(e),await p(a,e,n,{failFast:!0});const s=async()=>{const r=performance.now();u.clearErrors(),await p(a,e,n),process.env.REDOCLY_EXP_DISABLE_MD_VALIDATION!=="true"?await f(e,n):t.info("Skipping markdown validation step"),L().then(async()=>{await b(n);const l=m(e.getAllRoutes()),o=u.summary(` \u{1F440} Last change processed in ${v(Math.round(performance.now()-r)+"ms")}`,l);e.runListeners("errors-updated",void 0,o),e.runListeners("pages-updated",void 0,l),e.runListeners("routes-updated")})};process.env.REDOCLY_EXP_DISABLE_MD_VALIDATION!=="true"?await f(e,n):t.info("Skipping markdown validation step"),await b(n);const d=m(e.getAllRoutes());u.summary(" \u{1F440} Watching for changes...",d),e.runListeners("pages-updated",void 0,d),n.fs.watch(async()=>{g.clear(),await s()}),t.verbose("Starting development server."),await E(e,n,{port:Number(i.port||4e3)}),u.listenStdin()}async function y(i){let e=!0,a=!0;const n=r=>{r==="client"?e=!0:a=!0,i.runListeners("build-started"),e!=a&&(i.startEsbuildRun(),t.startTiming("rebuild"))},s=async r=>{r==="client"?e=!1:a=!1,!(e||a)&&(i.finishEsbuildRun(),i.buildRevision++,t.infoTime("rebuild","JavaScript re-compiled"),await i.reloadMarkdocOptions(),i.markUserCodeReady(),i.runListeners("build-updated"),i.lifecycleContext&&i.buildRevision>1&&i.lifecycleContext.fs.emitCodeUpdated())},d=[new Promise((r,l)=>{const o={label:"client",buildStart(){t.verbose("Start compiling client code."),t.startTiming(this.label)},buildEnd(){t.verboseTime(this.label,"Client compiled"),r(!0)},rebuildStart:()=>n("client"),rebuildEnd:()=>s("client")};w(i,i.outdir,"development",o).then(c=>c.watch()).catch(l)}),new Promise((r,l)=>{const o={label:"server",buildStart(){t.verbose("Start compiling server code."),t.startTiming(this.label)},buildEnd(){t.verboseTime(this.label,"Server compiled"),r(!0)},rebuildStart:()=>n("server"),rebuildEnd:()=>s("server")};C(i,i.serverOutDir,"development",o).then(c=>c.watch()).catch(l)})];await Promise.all(d),await i.reloadMarkdocOptions()}function L(){return new Promise(i=>{setTimeout(i,0)})}export{j as develop};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{detectSpec as m,getTypes as f,normalizeTypes as d,normalizeVisitors as u,resolveDocument as w,BaseResolver as h,Stats as S,walkDocument as y}from"@redocly/openapi-core";import{logger as l}from"../../../server/tools/notifiers/logger.js";import{telemetryTraceStep as g}from"../../telemetry/helpers/trace-step.js";import{telemetry as D}from"../../telemetry/index.js";const t={refs:{metric:"References",total:0,color:"red",items:new Set},externalDocs:{metric:"External Documents",total:0,color:"magenta"},schemas:{metric:"Schemas",total:0,color:"white"},parameters:{metric:"Parameters",total:0,color:"yellow",items:new Set},links:{metric:"Links",total:0,color:"cyan",items:new Set},pathItems:{metric:"Path Items",total:0,color:"green"},webhooks:{metric:"Webhooks",total:0,color:"green"},operations:{metric:"Operations",total:0,color:"yellow"},tags:{metric:"Tags",total:0,color:"white",items:new Set}};async function x(a,r){await g("stats.openapi",async()=>{l.info("OpenAPI collector: start processing documents...");const s=(await a.cache.load(".","load-oas-docs")).data,e=[];for(const o of s)if(!o.isVirtual){const n=await
|
|
1
|
+
import{detectSpec as m,getTypes as f,normalizeTypes as d,normalizeVisitors as u,resolveDocument as w,BaseResolver as h,Stats as S,walkDocument as y}from"@redocly/openapi-core";import{logger as l}from"../../../server/tools/notifiers/logger.js";import{telemetryTraceStep as g}from"../../telemetry/helpers/trace-step.js";import{telemetry as D}from"../../telemetry/index.js";const t={refs:{metric:"References",total:0,color:"red",items:new Set},externalDocs:{metric:"External Documents",total:0,color:"magenta"},schemas:{metric:"Schemas",total:0,color:"white"},parameters:{metric:"Parameters",total:0,color:"yellow",items:new Set},links:{metric:"Links",total:0,color:"cyan",items:new Set},pathItems:{metric:"Path Items",total:0,color:"green"},webhooks:{metric:"Webhooks",total:0,color:"green"},operations:{metric:"Operations",total:0,color:"yellow"},tags:{metric:"Tags",total:0,color:"white",items:new Set}};async function x(a,r){await g("stats.openapi",async()=>{l.info("OpenAPI collector: start processing documents...");const s=(await a.cache.load(".","load-oas-docs")).data,e=[];for(const o of s)if(!o.isVirtual){const n=await b(o);e.push(n)}D.sendStatsOpenapiCollectedMessage([{object:"openapi_stats",openapiStats:e.map(o=>JSON.stringify(o))}]),r||console.table(e),l.info("OpenAPI collector: openapi docments processing completed.")})}async function b(a){const r=a.definition,s=m(r),e=d(f(s)),o=u([{severity:"warn",ruleId:"openapi_stats",visitor:S(t)}],e),n={problems:[],specVersion:s,visitorsData:{}},c={source:{absoluteRef:""},parsed:r},i=e.Root;if(!i)throw new Error("Root type not found in OpenAPI spec types");const p=await w({rootDocument:c,rootType:i,externalRefResolver:new h});return y({rootType:i,normalizedVisitors:o,resolvedRefMap:p,document:c,ctx:n}),{path:a.relativePath,refs:t.refs.total,externalDocs:t.externalDocs.total,schemas:t.schemas.total,parameters:t.parameters.total,links:t.links.total,pathItems:t.pathItems.total,webhooks:t.webhooks.total,operations:t.operations.total,tags:t.tags.total,version:s}}export{x as collectOpenapiDocumentsStatistics};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as s from"react";import{ErrorDetails as a}from"./app/Error/ErrorDetails";import{telemetry as n}from"./app/telemetry/index.js";class p extends s.Component{constructor(r){super(r),this.state={error:void 0}}componentDidCatch(r,c){const{name:e,message:t}=r,o={name:e,message:t,stack:c.componentStack??void 0};this.setState({error:o}),n.sendClientErrorMessage({message:`${e}: ${t}`,url:location.href}),n.sendError(o,"ReactErrorBoundary"),process.env.NODE_ENV!=="production"&&console.log(r)}render(){return this.state.error&&process.env.NODE_ENV!=="production"?s.createElement(a,{error:this.state.error}):this.props.children}}export{p as ErrorBoundary};
|
|
1
|
+
import*as s from"react";import{ErrorDetails as a}from"./app/Error/ErrorDetails";import{telemetry as n}from"./app/telemetry/index.js";class p extends s.Component{constructor(r){super(r),this.state={error:void 0}}componentDidCatch(r,c){const{name:e,message:t}=r,o={name:e,message:t,stack:c.componentStack??void 0};this.setState({error:o}),n.sendClientErrorMessage([{object:"client",message:`${e}: ${t}`,url:location.href}]),n.sendError(o,"ReactErrorBoundary"),process.env.NODE_ENV!=="production"&&console.log(r)}render(){return this.state.error&&process.env.NODE_ENV!=="production"?s.createElement(a,{error:this.state.error}):this.props.children}}export{p as ErrorBoundary};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import o,{useEffect as D,useState as a}from"react";import I from"styled-components";import{useLocation as N}from"react-router-dom";import{Button as y}from"@redocly/theme/components/Button/Button";import{Admonition as k}from"@redocly/theme/markdoc/components/Admonition/Admonition";import{withPathPrefix as w}from"@redocly/theme/core/utils";import{usePageData as b}from"../hooks/usePageData";import{usePreloadHistory as q}from"../usePreloadHistory";import{telemetry as x}from"../telemetry/index.js";import{useLoginUrl as R}from"../hooks";const U=e=>{const{apiId:s,status:t,setStatus:r}=e,u=q(),{userData:n}=b("userData")||{},h=N(),i=R(),[l,p]=a(),[g,A]=a(),[m,E]=a(!0);D(()=>{n?.isAuthenticated&&fetch(`/api/api-keys/api-products/${s}/access`).then(d=>d.json().then(c=>{d.ok?(r(c.status),A(c.appId)):p(c.message)}).catch(()=>p("Something went wrong")).finally(()=>E(!1)))},[n?.isAuthenticated,s,r]);const P=()=>{!n?.isAuthenticated&&i?window.location.href=`${w(i)}${i.includes("?")?"&":"?"}redirectTo=${h.pathname}`:t==="ACCEPTED"?u.push("/apps/"+g||""):t==="NONE"&&u.push("/apps/?createApp&apiId="+s),x.sendRequestApiAccessButtonClickedMessage([{object:"button",action:"click"}])},C=(t==="PENDING"||m||l!=null)&&n?.isAuthenticated;return o.createElement(o.Fragment,null,o.createElement(y,{disabled:C,onClick:P,fullWidth:!0,size:"small"},T(t,m,l,!!n?.isAuthenticated)))},T=(e,s,t,r)=>{if(!r)return"Request access";if(s)return"Loading...";if(t)return"Failed to check access";switch(e){case"NONE":return"Request access";case"ACCEPTED":return"Credentials";case"PENDING":return"Pending access..."}return null},Y=e=>e==="ACCEPTED"?o.createElement(f,{type:"success",name:"You have access to this API"}):e==="PENDING"?o.createElement(f,{type:"info",name:"You have requested access to this API"}):null,f=I(k)`
|
|
2
2
|
margin-top: 0px;
|
|
3
3
|
margin-bottom: var(--spacing-sm);
|
|
4
|
-
`;export{
|
|
4
|
+
`;export{U as RequestAccessButton,Y as renderAdmonition};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import e,{useEffect as y,useState as p}from"react";import b from"styled-components";import{Menu as I}from"@redocly/theme/components/Menu/Menu";import{SidebarActions as L}from"@redocly/theme/components/SidebarActions/SidebarActions";import{Sidebar as w}from"@redocly/theme/components/Sidebar/Sidebar";import{VersionPicker as A}from"@redocly/theme/components/VersionPicker/VersionPicker";import{Button as B}from"@redocly/theme/components/Button/Button";import{CatalogEntityHistoryButton as P}from"@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton";import{ArrowLeftIcon as x}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{withPathPrefix as D}from"@redocly/theme/core/utils";import{telemetry as h}from"../telemetry/index.js";import{usePreloadHistory as T}from"../usePreloadHistory";import{useTranslate as C}from"../hooks";import{usePageSharedData as M,usePageVersions as V}from"../../providers/page-data/hooks";import{useSidebarItems as
|
|
1
|
+
import e,{useEffect as y,useState as p}from"react";import b from"styled-components";import{Menu as I}from"@redocly/theme/components/Menu/Menu";import{SidebarActions as L}from"@redocly/theme/components/SidebarActions/SidebarActions";import{Sidebar as w}from"@redocly/theme/components/Sidebar/Sidebar";import{VersionPicker as A}from"@redocly/theme/components/VersionPicker/VersionPicker";import{Button as B}from"@redocly/theme/components/Button/Button";import{CatalogEntityHistoryButton as P}from"@redocly/theme/components/Catalog/CatalogEntity/CatalogEntityHistory/CatalogEntityHistoryButton";import{ArrowLeftIcon as x}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{withPathPrefix as D}from"@redocly/theme/core/utils";import{telemetry as h}from"../telemetry/index.js";import{usePreloadHistory as T}from"../usePreloadHistory";import{useTranslate as C}from"../hooks";import{usePageSharedData as M,usePageVersions as V}from"../../providers/page-data/hooks";import{useSidebarItems as j}from"./useSidebarItems";import{renderAdmonition as H,RequestAccessButton as R}from"./RequestAccessButton";function ie({layoutControls:s}){const{versions:l=[]}=V()||{},k=l.find(t=>t?.active),{translate:o}=C(),{currentItems:m,backLink:n,versionLabel:a,pushDrilldownState:g,popDrilldownState:v}=j(k),[c,S]=p(),{collapsedSidebar:i}=s,d=M("openAPIDocsStore")?.definition.info?.["x-metadata"]?.apiId,E=T(),[u,r]=p(void 0);return y(()=>{const t=setTimeout(()=>r(void 0),350);return()=>clearTimeout(t)},[u]),m.length?e.createElement(e.Fragment,null,e.createElement(w,{collapsed:i,menuItemsAnimation:u,versions:e.createElement(A,{versions:l,onChange:t=>{h.sendVersionPickerSelectionChangeMessage([{object:"version_picker",action:"change"}]);const f=location.hash?t?.link+location.hash:t?.link;f&&E.push(D(f))}}),menu:e.createElement(I,{items:m,onDrilldownOpen:t=>{r("slideInRight"),g(t)}}),footer:e.createElement("div",{style:{width:"100%"}},!i&&H(c),e.createElement(L,{...s,requestAccessButton:d?e.createElement(R,{apiId:d,status:c,setStatus:S}):null})),header:(n||a)&&e.createElement(q,null,n&&e.createElement(J,{icon:e.createElement(x,null),iconPosition:"left",variant:"ghost",size:"medium","data-component-name":"Sidebar/BackButton",to:n.slug,onClick:()=>{r("slideInLeft"),v(),h.sendSidebarDrilldownBackButtonClickedMessage([{object:"button",action:"click"}])}},i?"":n.label?e.createElement("div",{"data-translation-key":"sidebar.menu.backToLabel"},o("sidebar.menu.backToLabel",{value:o(n.labelTranslationKey,n.label)})):e.createElement("div",{"data-translation-key":"sidebar.menu.backLabel"},o("sidebar.menu.backLabel"))),a&&!i&&e.createElement(P,{version:a}))})):null}const q=b.div`
|
|
2
2
|
display: flex;
|
|
3
3
|
flex-direction: column;
|
|
4
4
|
gap: var(--menu-header-container-gap);
|
|
5
5
|
width: 100%;
|
|
6
|
-
`,
|
|
6
|
+
`,J=b(B)`
|
|
7
7
|
padding: var(--menu-item-padding-vertical) 0;
|
|
8
8
|
height: calc(var(--line-height-base) + var(--menu-item-padding-vertical) * 2);
|
|
9
9
|
justify-content: flex-start;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as h from"react";import{useLocation as
|
|
1
|
+
import*as h from"react";import{useLocation as _,useNavigate as B}from"react-router-dom";import{usePageData as $,usePageSharedData as R}from"../../hooks";import{withoutHash as M}from"@redocly/theme/core/utils";import{telemetry as w}from"../../telemetry/index.js";import{toStringIfDefined as A}from"../../../../utils/string/to-string-if-defined.js";import{findDeepFirst as V}from"../../../../utils/tree/find-deep-first.js";function te(e,o){const r=_(),i=B(),a=$(),t=q(r),s=R("catalog"),[n,p]=h.useState(()=>(e.filters??[]).map(l=>{if(l.type==="date-range"){const[c,u]=t.get(l.property)?.split("--")??[];return!c&&!u?{}:{from:c,to:u}}return new Set(t.getAll(l.property))})),[d,g]=h.useState(()=>t.get("filter")||"");o||(o=[...s]);const S=h.useMemo(()=>j(o??[],e.filters),[o,e.filters]),b=a?.props?.customFields,C=h.useMemo(()=>G(o??[],e,b||{}),[o,e,b]),v=h.useCallback((l,c)=>{p(u=>{const y=u[l]?u[l]:new Set;return y instanceof Set?(y.has(c)?u.forEach((f,m)=>{f instanceof Set&&f.has(c)&&f.delete(c)}):y.add(c),[...u.slice(0,l),y,...u.slice(l+1)]):u}),w.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"toggle"}]),window.scrollTo(0,0)},[]),I=h.useCallback((l,c)=>{p(u=>{const y=u[l]instanceof Set?new Set(c?[c]:[]):{from:c?.from,to:c?.to},f=S[l];return u.map((m,F)=>F===l?y:S[F].parentFilter===f.property?new Set:m)}),w.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"select"}]),window.scrollTo(0,0)},[S]),T=()=>{const l=new URLSearchParams(Array.from(t.entries()));d?t.set("filter",d):t.delete("filter"),n.forEach((u,y)=>{const f=e.filters?.[y];if(!f)return;const m=Z(u);J(f.property,m,l)});const c=l.toString();c!==r.search.substring(1)&&i({search:c})};h.useEffect(()=>{T()},[e.filters,n,d,i,r]);const P=h.useMemo(()=>H(e.filters),[e.filters]);return h.useMemo(()=>{const l=S.map((f,m)=>({...f,toggleOption:F=>v(m,F),selectOption:F=>I(m,F),selectedOptions:n[m]??new Set,isFilterUsed:(n[m]?.size??0)>0||!!n[m]?.from})),c=D(C,l,d),u=l.map((f,m)=>{const F=l.findIndex(O=>O.property===f.parentFilter),E=f.parentFilter?(n[F]?.size??0)>0||!!n[F].from:!0,N=l.filter((O,k)=>k!==m&&!P[m]?.has(k)),z=D(C,N,d),U=j(z.map(O=>({metadata:O})),e.filters);return{...f,parentUsed:E,filteredOptions:U[m].options}});return{groups:e.groupByFirstFilter&&u.length>0?K(u,c):[{title:"APIs",items:c}],filters:u,setFilterTerm:f=>{g(f),w.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"term"}])},filterTerm:d}},[S,C,d,e.groupByFirstFilter,e.filters,n,v,I,P])}function K(e,o){return e[0].options.map(r=>({title:r.value,items:o.filter(i=>{const a=i?.[e[0].property]||e[0].missingCategoryName||"Others";return Array.isArray(a)?a.includes(r.value):a===r.value})})).filter(r=>r.items.length>0)}function q(e){return h.useMemo(()=>new URLSearchParams(e.search),[e.search])}function G(e,o,r){let i;if(o.separateVersions)i=e.map(a);else{const t={};for(const s of e){if(!s.versionFolderId){const p=s.link||s.fsPath||JSON.stringify(s);t[p]=[s];continue}let n=s.versionFolderId;if(t[n]?.find(p=>p.version===s.version)){const p=s.fsPath?.replace(/\/@.*?\//,"/@version/")??"";n=`${n}-${p}`}t[n]||(t[n]=[]),t[n].push(s)}i=Object.values(t).map(s=>{s.sort((d,g)=>(d.version||"").localeCompare(g.version||""));const n=s.map(a);return{...a(s.find(d=>d.isDefault)||s[s.length-1]),versions:n}})}return i.sort((t,s)=>t.title.localeCompare(s.title)),i;function a(t){const s=t.metadata||{},n=r[t.fsPath||""]||{},p=t.link||V(t.items||[],g=>"link"in g&&!!g.link)?.link,d=t.sidebar?.[0];return{...s,...n,publishedAt:s.publishedAt||s.createdAt,title:A(s?.title)||t.label||"Untitled",description:A(s?.description),link:M(p)??"#",docsLink:M(d?.link),image:A(s?.image),version:t.version,versionFolderId:t.versionFolderId}}}function H(e){if(!e)return[];const o=[];for(let r=0;r<e.length;r++){const i=e[r];if(i.parentFilter){const a=e.findIndex(t=>t.property===i.parentFilter);o[a]=o[a]||new Set,o[a].add(r)}}return o}function j(e,o){return(o??[]).map(r=>{const i=r.options?Object.fromEntries(r.options.map(n=>[n,0])):void 0,a=i??{};let t=0;for(const n of e){const p=Array.isArray(n.metadata?.[r.property])?n.metadata?.[r.property]:[n.metadata?.[r.property]];for(const d of p){const g=L(String(d),r.valuesMapping);if(i){g in i&&(a[g]=a[g]+1);continue}d?a[g]=(a[g]??0)+1:t++}}const s=Object.entries(a).map(([n,p])=>({value:n,count:p}));return i||s.sort((n,p)=>n.value.localeCompare(p.value)),t&&s.push({value:r.missingCategoryNameTranslationKey||r.missingCategoryName||"Others",count:t}),{...r,options:s}})}function D(e,o,r){const i=e.filter(a=>o.every(t=>{if(t.selectedOptions&&!(t.selectedOptions instanceof Set))try{const n=new Date(a[t.property]).toISOString().split("T")[0];return n>=(t.selectedOptions.from??"")&&n<=(t.selectedOptions.to??"Z")}catch{return!0}if(t.selectedOptions.size===0)return!0;const s=L(a?.[t.property]||t.missingCategoryName||"Others",t.valuesMapping);return Array.isArray(s)?s.some(n=>t.selectedOptions.has(n)):t.selectedOptions.has(s)}));return r?(r=r.toLowerCase(),i.filter(a=>Object.values(a).some(t=>Array.isArray(t)?t.some(s=>String(s).toLowerCase().includes(r)):String(t).toLowerCase().includes(r)))):i}function L(e,o){return o?Array.isArray(e)?e.map(r=>o[String(r)]||r):o[String(e)]||e:e}function J(e,o,r){r.delete(e),o.forEach(i=>{r.append(e,i)})}function Z(e){const o=new Set;return e instanceof Set?e.forEach(r=>o.add(r)):(e.from||e.to)&&o.add(`${e.from||""}--${e.to||""}`),o}export{J as fillSearchParams,Z as getFilterValues,te as useCatalogClassic};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as h,useEffect as w,useMemo as y,useState as P}from"react";import{useSearchParams as Q}from"react-router-dom";import{telemetry as
|
|
1
|
+
import{useCallback as h,useEffect as w,useMemo as y,useState as P}from"react";import{useSearchParams as Q}from"react-router-dom";import{telemetry as b}from"../../telemetry/index.js";import{parseFilterQuery as g,formatFilterQuery as C,collectFilterOptions as U}from"../../../utils";function O(r){return r instanceof Set?r.size>0:!!(r?.from||r?.to)}function k(r,d){const[u,m]=Q(),i=u.get("filter")||"",[o,f]=P(()=>g(i,r?.filters||[])),p=y(()=>U(r?.filters,d),[r?.filters,d]);w(()=>{const t=r?.filters||[];if(t.length>0&&o.length!==t.length){const e=g(i,t);f(e)}},[r?.filters,o.length,i]);const F=h((t,e)=>{f(l=>l.map((s,c)=>{if(c!==t||!(s instanceof Set))return s;const n=new Set(s);return n.has(e)?n.delete(e):n.add(e),n})),window.scrollTo(0,0)},[]),S=h((t,e)=>{f(l=>l.map((a,s)=>s!==t?a:a instanceof Set?e&&typeof e=="string"?new Set([e]):new Set:{from:typeof e=="object"?e?.from:void 0,to:typeof e=="object"?e?.to:void 0})),b.sendCatalogFilterChangedMessage([{object:"catalog_filter",type:"select"}]),window.scrollTo(0,0)},[]);return w(()=>{const t=new URLSearchParams(u),e=C(o,r?.filters||[]);e?t.set("filter",e):t.delete("filter"),m(t,{replace:!0})},[r?.filters,o,u,m]),y(()=>{const t=p.map((l,a)=>{const s=o[a],c=O(s);return{...l,toggleOption:n=>F(a,n),selectOption:n=>S(a,n),selectedOptions:s??new Set,isFilterUsed:c}});return{filters:t.map(l=>{const a=t.findIndex(n=>n.property===l.parentFilter),s=o[a],c=l.parentFilter?O(s):!0;return{...l,parentUsed:c}}),filterQuery:i}},[p,o,F,S,i])}export{k as useCatalogFilter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useState as i}from"react";import{telemetry as n}from"../../telemetry/index.js";const s="catalog-view-mode",w="table";function u(o){const[r,a]=i(o??w);return{viewMode:r,setViewMode:t=>{if(a(t),!(typeof window>"u")){try{localStorage.setItem(s,t)}catch(e){console.warn("Failed to save view mode preference to localStorage",e)}try{const e=new URL(window.location.href);e.searchParams.set("viewMode",t),window.history.replaceState({},"",e.toString()),n.sendCatalogEntitiesViewModeChangedMessage({mode:t,id:t,object:"view_mode",uri:window.location.href})}catch(e){console.warn("Failed to update viewMode query parameter",e)}}}}}export{u as useCatalogViewMode};
|
|
1
|
+
import{useState as i}from"react";import{telemetry as n}from"../../telemetry/index.js";const s="catalog-view-mode",w="table";function u(o){const[r,a]=i(o??w);return{viewMode:r,setViewMode:t=>{if(a(t),!(typeof window>"u")){try{localStorage.setItem(s,t)}catch(e){console.warn("Failed to save view mode preference to localStorage",e)}try{const e=new URL(window.location.href);e.searchParams.set("viewMode",t),window.history.replaceState({},"",e.toString()),n.sendCatalogEntitiesViewModeChangedMessage([{mode:t,id:t,object:"view_mode",uri:window.location.href}])}catch(e){console.warn("Failed to update viewMode query parameter",e)}}}}}export{u as useCatalogViewMode};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as g,useEffect as m,useRef as f}from"react";import{useCatalogEntityDetails as d}from"@redocly/theme/core/hooks";import{usePageProps as p}from"../../../providers/hooks.js";import{telemetry as c}from"../../telemetry/index.js";const l={id:"redocly-unknown",object:"catalog_entity",uri:"redocly-unknown"},C={entities:"catalog_entity",related_entities:"catalog_entity"},E={entities:({items:e,searchQuery:n})=>{const t=e[0]??l;c.sendCatalogEntitiesListSearchQueryMessage({query:n,...t})},related_entities:({items:e,searchQuery:n})=>{const t=e[0]??l;c.sendCatalogEntitiesRelatedEntitiesListSearchQueryMessage({query:n,...t})}};function j({isLoading:e,items:n,apiResource:t,searchQuery:i}){const{catalogConfig:u,entitiesCatalogConfig:y}=p(),o=f(i),{getEntityDetailsLink:s}=d({catalogConfig:u,entitiesCatalogConfig:y}),a=g(r=>({id:r.id,object:C[t],uri:s(r)}),[s,t]);m(()=>{if(e)return;const r=i?.trim();!r||r===o.current||(o.current=i,E[t]({items:n.map(a),searchQuery:i}))},[n,e,i,t,a])}export{j as useSearchTracker};
|
|
1
|
+
import{useCallback as g,useEffect as m,useRef as f}from"react";import{useCatalogEntityDetails as d}from"@redocly/theme/core/hooks";import{usePageProps as p}from"../../../providers/hooks.js";import{telemetry as c}from"../../telemetry/index.js";const l={id:"redocly-unknown",object:"catalog_entity",uri:"redocly-unknown"},C={entities:"catalog_entity",related_entities:"catalog_entity"},E={entities:({items:e,searchQuery:n})=>{const t=e[0]??l;c.sendCatalogEntitiesListSearchQueryMessage([{query:n,...t}])},related_entities:({items:e,searchQuery:n})=>{const t=e[0]??l;c.sendCatalogEntitiesRelatedEntitiesListSearchQueryMessage([{query:n,...t}])}};function j({isLoading:e,items:n,apiResource:t,searchQuery:i}){const{catalogConfig:u,entitiesCatalogConfig:y}=p(),o=f(i),{getEntityDetailsLink:s}=d({catalogConfig:u,entitiesCatalogConfig:y}),a=g(r=>({id:r.id,object:C[t],uri:s(r)}),[s,t]);m(()=>{if(e)return;const r=i?.trim();!r||r===o.current||(o.current=i,E[t]({items:n.map(a),searchQuery:i}))},[n,e,i,t,a])}export{j as useSearchTracker};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useEffect as r}from"react";import{useLocation as d}from"react-router-dom";import{telemetry as s}from"../telemetry";const g=()=>{const t=d();r(()=>{const i=()=>{if(!e)return;const a=new Date().getTime()-e;s.sendPageTimeMessage({id:`${window.origin}${t.pathname}`,object:"page",uri:`${window.origin}${t.pathname}`,durationMs:a}),e=void 0},n=()=>{if(document.visibilityState==="visible"){e=e||new Date().getTime();return}i()},o=()=>{i()};let e=new Date().getTime();return document.addEventListener("visibilitychange",n),window.addEventListener("beforeunload",o),()=>{i(),window.removeEventListener("beforeunload",o),document.removeEventListener("visibilitychange",n)}},[t.pathname])};export{g as usePageTimeTracker};
|
|
1
|
+
import{useEffect as r}from"react";import{useLocation as d}from"react-router-dom";import{telemetry as s}from"../telemetry";const g=()=>{const t=d();r(()=>{const i=()=>{if(!e)return;const a=new Date().getTime()-e;s.sendPageTimeMessage([{id:`${window.origin}${t.pathname}`,object:"page",uri:`${window.origin}${t.pathname}`,durationMs:a}]),e=void 0},n=()=>{if(document.visibilityState==="visible"){e=e||new Date().getTime();return}i()},o=()=>{i()};let e=new Date().getTime();return document.addEventListener("visibilitychange",n),window.addEventListener("beforeunload",o),()=>{i(),window.removeEventListener("beforeunload",o),document.removeEventListener("visibilitychange",n)}},[t.pathname])};export{g as usePageTimeTracker};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useLocation as u,useNavigate as d,useNavigationType as l}from"react-router-dom";import{useEffect as v,useState as P}from"react";import{useThemeConfig as w}from"@redocly/theme/core/hooks";import{removeTrailingSlash as E}from"../../../utils/url/remove-trailing-slash";import{onRouteChange as M}from"../../runtime/generated/browser-plugins.js";import{resolveRouteBySlug as y}from"../utils/resolveRouteBySlug.js";import{usePageData as
|
|
1
|
+
import{useLocation as u,useNavigate as d,useNavigationType as l}from"react-router-dom";import{useEffect as v,useState as P}from"react";import{useThemeConfig as w}from"@redocly/theme/core/hooks";import{removeTrailingSlash as E}from"../../../utils/url/remove-trailing-slash";import{onRouteChange as M}from"../../runtime/generated/browser-plugins.js";import{resolveRouteBySlug as y}from"../utils/resolveRouteBySlug.js";import{usePageData as b}from"./usePageData.js";import{usePostMessage as C}from"../../providers/post-message/use-post-message.js";import{isInIframe as T}from"../../utils/utils.js";import{waitForContentScripts as I}from"../../ScriptLoader.js";import{telemetry as N}from"../telemetry/index.js";const F=()=>{const e=u(),n=d(),a=l(),r=b(),[t,i]=P(),m=w(),{sendMessage:h}=C();v(()=>{I().then(()=>{if(e.pathname!==t?.pathname||e.search!==t.search){M({location:e,prevLocation:t},m);const o=`${window.origin}${e.pathname+e.search+e.hash}`,s=t?`${window.origin}${t.pathname+t.search+t.hash}`:void 0;N.sendPageViewedMessage([{object:"view_stats",uri:o,referrer:s||document.referrer||void 0}])}});const c=!!t;i(e);const{pathname:p,hash:g,state:f}=e;if(e?.pathname.endsWith("/")&&e?.pathname!=="/"){const o=E(e.pathname);n({pathname:o,search:e.search,hash:e.hash},{replace:!0})}(process.env.NODE_ENV==="development"||T())&&c&&y(p+g,r?.templateId).then(o=>{const s=a==="POP"?"browser":f?.origin;s&&h({type:"route-updated",origin:s,...o})}).catch(o=>console.log("Resolve route by slug failed with error: ",o.message))},[e,a])};export{F as useRouteChangeTracker};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import t,{useEffect as g,useState as s}from"react";import{useNavigate as h}from"react-router-dom";import{Button as y}from"@redocly/theme/components/Button/Button";import{H3 as S}from"@redocly/theme/components/Typography/H3";import{H4 as v}from"@redocly/theme/components/Typography/H4";import{Admonition as w}from"@redocly/theme/components/Admonition/Admonition";import{getPathnameForLocale as E,withPathPrefix as P}from"@redocly/theme/core/utils";import{ServerRoutes as L}from"../../../../constants/common";import{telemetry as
|
|
1
|
+
import t,{useEffect as g,useState as s}from"react";import{useNavigate as h}from"react-router-dom";import{Button as y}from"@redocly/theme/components/Button/Button";import{H3 as S}from"@redocly/theme/components/Typography/H3";import{H4 as v}from"@redocly/theme/components/Typography/H4";import{Admonition as w}from"@redocly/theme/components/Admonition/Admonition";import{getPathnameForLocale as E,withPathPrefix as P}from"@redocly/theme/core/utils";import{ServerRoutes as L}from"../../../../constants/common";import{telemetry as b}from"../../telemetry/index.js";import{buildLoginUrl as k}from"../../../../utils/auth/build-login-url";import{usePageProps as O}from"../../../providers/page-data/hooks";import{Wrapper as T,HeadingSection as C}from"./styled";import{DevLoginForm as R}from"./DevLoginForm";import{useL10nConfig as F}from"../../hooks";async function x(r){try{const{status:o}=await fetch(P(L.AUTHORIZATION),{method:"POST",body:JSON.stringify(r)});return o}catch(o){console.error(o)}}function G(){const{defaultLocale:r,locales:o,currentLocale:c}=F(),l=h(),[a,d]=s({values:{teams:[],email:"example@example.com"}}),[n,u]=s();g(()=>{const e=new URLSearchParams(window.location.search);u(e.get("redirectTo")||void 0)},[]);const i=O(),m=i?.authIdps,p=(i.rbac?.teams||[]).filter(e=>e!=="*"),f=async()=>{await x(a.values)===200&&(l(n||"/"),window.location.reload())};return t.createElement(T,null,t.createElement(C,null,t.createElement(S,{"data-cy":"login-title"},"Dev-mode login"),t.createElement(w,{type:"warning",name:"This is dev mode login simulator."},"Any email works and password is not checked.")),t.createElement(t.Fragment,null,t.createElement(R,{teams:p,formState:a,setFormState:d,onSubmit:f}),Object.keys(m||{}).length>0&&t.createElement(v,null,"Use SSO:"),Object.values(m||{}).map(e=>t.createElement("div",{key:e.idpId},t.createElement(y,{fullWidth:!0,size:"large","data-cy":"idp-login",to:k(e.idpId,E("",r,c,o),n),onClick:()=>b.sendLoginProviderButtonClickedMessage([{object:"button",provider:e.type}])},e.title||e.type)))))}export{G as default};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
import type { SSEMessage, SearchResource, ToolCallState, AiSearchState } from '../../types';
|
|
3
|
+
import type { AiSearchConversationItem } from '@redocly/theme/core/types';
|
|
4
|
+
/**
|
|
5
|
+
* Context object passed to message handlers
|
|
6
|
+
* Contains current values and state setters
|
|
7
|
+
*/
|
|
8
|
+
export type MessageHandlerContext = {
|
|
9
|
+
messageId: string;
|
|
10
|
+
resources: SearchResource[];
|
|
11
|
+
accumulatedResponse: string;
|
|
12
|
+
setConversation: Dispatch<SetStateAction<AiSearchConversationItem[]>>;
|
|
13
|
+
setState: Dispatch<SetStateAction<AiSearchState>>;
|
|
14
|
+
setToolCalls: Dispatch<SetStateAction<ToolCallState[]>>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Updates returned by message handlers
|
|
18
|
+
*/
|
|
19
|
+
export type MessageHandlerResult = {
|
|
20
|
+
messageId?: string;
|
|
21
|
+
resources?: SearchResource[];
|
|
22
|
+
accumulatedResponse?: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Main message dispatcher that routes messages to appropriate handlers
|
|
26
|
+
* Returns updates to be applied to refs
|
|
27
|
+
*/
|
|
28
|
+
export declare function handleSSEMessage(message: SSEMessage, ctx: MessageHandlerContext): MessageHandlerResult;
|
|
29
|
+
//# sourceMappingURL=message-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AiSearchConversationRole as o,AiSearchError as l}from"@redocly/theme/core/constants";import{SSE_EVENTS as n,MAX_DISPLAYED_RESOURCES as a}from"../../constants";function i(e,r){if(e.length===0)return e;const t=e[e.length-1];return t.role===o.ASSISTANT&&!t.messageId?[...e.slice(0,-1),{...t,messageId:r}]:e}function S(e,r){if(e.length===0)return e;const t=[...e];return t[t.length-1]={...t[t.length-1],result:r},t}function E(e,r){return e.type!==n.MESSAGE_ID?{}:(r.setConversation(t=>i(t,e.messageId)),{messageId:e.messageId})}function c(e,r){if(e.type!==n.SOURCES)return{};const t=e.sources.slice(0,a).map(({url:s,title:u})=>({url:s,title:u}));return r.setState(s=>s.status==="loading"?{...s,resources:t}:s),{resources:t}}function f(e,r){if(e.type!==n.ANSWER)return{};const t=r.accumulatedResponse+e.answer;return r.setState(s=>s.status==="loading"?{...s,response:t}:s),{accumulatedResponse:t}}function d(e,r){return e.type!==n.TOOL_CALL?{}:(r.setToolCalls(t=>[...t,{...e.toolCall,position:r.accumulatedResponse.length}]),{})}function R(e,r){return e.type!==n.TOOL_RESULT?{}:(r.setToolCalls(t=>S(t,e.result)),{})}function h(e,r){return e.type!==n.ERROR?{}:(r.setState(t=>t.status==="loading"?{status:"error",question:t.question,error:l.ErrorProcessingResponse}:t),{})}const A={[n.MESSAGE_ID]:E,[n.SOURCES]:c,[n.ANSWER]:f,[n.TOOL_CALL]:d,[n.TOOL_RESULT]:R,[n.ERROR]:h};function O(e,r){const t=A[e.type];return t?t(e,r):{}}export{O as handleSSEMessage};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SSEMessage } from '../../types/ai-search';
|
|
2
|
+
/**
|
|
3
|
+
* Parses SSE data lines from a chunk string
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseSSEChunk(chunk: string): SSEMessage[];
|
|
6
|
+
/**
|
|
7
|
+
* Creates an async generator that reads SSE messages from a ReadableStream
|
|
8
|
+
*/
|
|
9
|
+
export declare function streamSSEMessages(stream: ReadableStream<Uint8Array>, signal?: AbortSignal): AsyncGenerator<SSEMessage>;
|
|
10
|
+
//# sourceMappingURL=sse-parser.d.ts.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{SSE_EVENTS as i,SSE_DATA_PREFIX as a}from"../../constants";function d(e){return Object.values(i).includes(e)}function p(e){const s=[],t=e.split(`
|
|
2
|
+
`);for(const n of t){if(!n.startsWith(a))continue;const r=n.slice(a.length);if(r)try{const c=JSON.parse(r),o=S(c);o&&s.push(o)}catch{}}return s}function S(e){return e.type&&typeof e.type=="string"&&d(e.type)?e:"messageId"in e&&typeof e.messageId=="string"?{type:i.MESSAGE_ID,messageId:e.messageId}:"sources"in e&&Array.isArray(e.sources)?{type:i.SOURCES,sources:e.sources}:"answer"in e&&typeof e.answer=="string"?{type:i.ANSWER,answer:e.answer}:null}async function*y(e,s){const t=e.getReader(),n=new TextDecoder;try{for(;!s?.aborted;){const{value:r,done:c}=await t.read();if(c)break;const o=n.decode(r),u=p(o);for(const f of u)yield f}}finally{t.releaseLock()}}export{p as parseSSEChunk,y as streamSSEMessages};
|
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
import type { AiSearchConversationItem,
|
|
1
|
+
import type { AiSearchConversationItem, ContentSegment } from '@redocly/theme/core/types';
|
|
2
|
+
import type { AiSearchOptions, SearchResource, ToolCallState } from '../../types/ai-search';
|
|
2
3
|
import { AiSearchError } from '@redocly/theme/core/constants';
|
|
3
|
-
type
|
|
4
|
-
|
|
5
|
-
};
|
|
6
|
-
export declare function useAiSearch(options?: AiSearchOptions): {
|
|
7
|
-
askQuestion: (question: string, history?: AiSearchConversationItem[]) => Promise<void>;
|
|
4
|
+
type UseAiSearchReturn = {
|
|
5
|
+
askQuestion: (question: string, history?: AiSearchConversationItem[]) => void;
|
|
8
6
|
isGeneratingResponse: boolean;
|
|
9
7
|
response: string | undefined;
|
|
10
|
-
resources:
|
|
11
|
-
url: string;
|
|
12
|
-
title: string;
|
|
13
|
-
}[];
|
|
8
|
+
resources: SearchResource[];
|
|
14
9
|
question: string;
|
|
15
10
|
error: AiSearchError | null;
|
|
16
11
|
clearConversation: () => void;
|
|
17
12
|
conversation: AiSearchConversationItem[];
|
|
18
|
-
setConversation:
|
|
13
|
+
setConversation: React.Dispatch<React.SetStateAction<AiSearchConversationItem[]>>;
|
|
14
|
+
toolCalls: ToolCallState[];
|
|
15
|
+
contentSegments: ContentSegment[];
|
|
19
16
|
};
|
|
17
|
+
export declare function useAiSearch(options?: AiSearchOptions): UseAiSearchReturn;
|
|
20
18
|
export {};
|
|
21
19
|
//# sourceMappingURL=useAiSearch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as
|
|
1
|
+
import{useCallback as h,useEffect as J,useMemo as N,useRef as f,useState as C}from"react";import{AiSearchError as m}from"@redocly/theme/core/constants";import{withPathPrefix as V,splitContentByToolCalls as j}from"@redocly/theme/core/utils";import{ServerRoutes as B}from"../../../constants/common";import{useSearchSession as D}from"@redocly/theme/core/contexts";import{AI_SEARCH_REQUEST_HEADERS as G,HTTP_ERROR_MAP as K}from"../../constants";import{useI18nConfig as L,useCurrentProduct as U,usePageVersions as z}from"../hooks";import{telemetry as W}from"../telemetry/index.js";import{streamSSEMessages as X}from"./sse-parser";import{handleSSEMessage as Y}from"./message-handlers";function ue(E){const{searchSessionId:d}=D(),[e,s]=C({status:"idle"}),[w,p]=C([]),[g,b]=C([]),t=f(null),u=f(""),o=f(""),c=f([]),{currentLocale:y}=L(),A=U(),{versions:M=[]}=z()||{},a=M.find(r=>r?.active),i=h(()=>{s({status:"idle",response:""}),b([]),u.current="",o.current="",c.current=[]},[]),O=h(()=>{t.current?.abort(),t.current=null,i(),p([])},[i]);J(()=>()=>{t.current?.abort()},[]);const k=h(async(r,F)=>{if(!r)return;t.current?.abort();const R=new AbortController;t.current=R,i(),s({status:"loading",question:r,response:"",resources:[]});try{const n=await fetch(V(B.ASK_AI),{method:"POST",headers:G,body:JSON.stringify({text:r,history:F||[],locale:y,product:A?.name,filter:E?.filter,version:a&&{folder:a.folderId,label:a.label},searchSessionId:d}),signal:R.signal});if(!n.ok){s({status:"error",question:r,error:K[n.status]??m.HttpRequestFailed});return}const I=n.body;if(!I){s({status:"error",question:r,error:m.HttpRequestFailed});return}for await(const l of X(I,R.signal)){const Q={messageId:u.current,resources:c.current,accumulatedResponse:o.current,setConversation:p,setState:s,setToolCalls:b},{messageId:H,resources:P,accumulatedResponse:_}=Y(l,Q);H&&(u.current=H),P&&(c.current=P),_&&(o.current=_)}t.current=null;let v=!1;s(l=>l.status==="error"?l:o.current?(v=!0,{status:"success",question:r,response:o.current,resources:c.current}):{status:"error",question:r,error:m.EmptyResponse}),v&&r.trim()&&u.current&&W.sendSearchAIQueryMessage([{object:"search",question:r,answer:o.current,resources:JSON.stringify(c.current),searchSessionId:d,messageId:u.current}])}catch(n){if(n instanceof Error&&n.name==="AbortError")return;t.current=null,s({status:"error",question:r,error:m.HttpRequestFailed})}},[i,y,A?.name,E?.filter,a,d]),S=e.status==="loading"||e.status==="success"||e.status==="idle"?e.response:void 0,q=N(()=>j(S,g),[S,g]);return{askQuestion:k,isGeneratingResponse:e.status==="loading",response:S,resources:e.status==="loading"||e.status==="success"?e.resources:[],question:e.status!=="idle"?e.question:"",error:e.status==="error"?e.error:null,clearConversation:O,conversation:w,setConversation:p,toolCalls:g,contentSegments:q}}export{ue as useAiSearch};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{useCallback as I,useEffect as y,useState as F,useRef as T}from"react";import{SEARCH_DEBOUNCE_TIME_MS as G}from"@redocly/theme/core/constants";import{withPathPrefix as
|
|
1
|
+
import{useCallback as I,useEffect as y,useState as F,useRef as T}from"react";import{SEARCH_DEBOUNCE_TIME_MS as G}from"@redocly/theme/core/constants";import{withPathPrefix as b}from"@redocly/theme/core/utils";import{SEARCH_GROUP_FACET_FIELD as _,SEARCH_PRODUCT_FIELD as N,SEARCH_VERSION_FIELD as k,ServerRoutes as O}from"../../../constants/common";import{debounce as M}from"../../../utils/time/debounce.js";import{useSearchSession as Q}from"@redocly/theme/core/contexts";import{useGlobalData as U,useI18nConfig as P}from"../hooks";import{usePageVersions as x}from"../../providers/page-data/hooks";import{useFacets as J}from"./useFacets";import{telemetry as B}from"../telemetry/index.js";const K=(s,r,e,n,a,c,i,f)=>{const{searchSessionId:d}=Q(),{currentLocale:m}=P(),l=T(""),p=I(M(async(t,h,u,S)=>{if(!t.trim().length&&!h.length){e({}),n({}),a(!1);return}const R={method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:t,filter:A(h,S,c),locale:u})};try{const o=await fetch(b(O.SEARCH),R);if(l.current===t){const E=await o.json();n(E.facets),e(E.documents),t.trim().length>1&&B.sendSearchQueryMessage([{object:"search",query:t,resultCount:Object.keys(E.documents).length.toString(),searchSessionId:d}])}a(!1)}catch(o){e({}),console.log(o)}},G),[c?.version,c?.folderId,i]);return y(()=>{f||(a(!0),p(s,r,m,i),l.current=s)},[f,r,m,i,s,p,a]),{}},z=(s,r,e,n,a,c,i,f)=>{const{currentLocale:d}=P();y(()=>{m(e,s,r,d,n,a,f)},[n,f]);const m=I(async(l,p,t,h,u,S,R)=>{if(u){const{groupKey:o}=u;i(!0);const j={method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:p,filter:(()=>{const g=S.find(C=>C.field===_);return g&&!t.find(L=>L.field===g?.field)?[...t,{field:g.field,values:[o]}]:A(t,R)})(),loadMore:u,locale:h})},v=await(await fetch(b(O.SEARCH),j)).json(),D=l[o]||[],H=v.documents[o],w={...l,[o]:[...D,...H]};c(w),i(!1)}},[]);return{}};function re(s,r){const{searchFeatures:e}=U(),[n,a]=F(""),[c,i]=F([]),[f,d]=F({}),[m,l]=F({}),[p,t]=F(),[h,u]=F(!1),{facets:S}=J(m),{versions:R=[]}=x()||{},o=R.find(E=>E?.active);return K(n,c,d,l,u,o,s,r),z(n,c,f,p,S,d,u,s),{query:n,setQuery:a,filter:c,setFilter:i,items:f,isSearchLoading:h,facets:S,groupField:_,setLoadMore:t,advancedSearch:e?.advanced?.enabled,askAi:e?.ai?.enabled}}function A(s,r,e){return[...s,...r?[{field:N,values:[r]}]:[],...e?[{field:k,values:[...e.default?["default"]:[e.folderId,e.version]]}]:[]]}export{re as useSearch};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { AiSearchError } from '@redocly/theme/core/constants';
|
|
2
|
+
/**
|
|
3
|
+
* SSE protocol prefix used by Server-Sent Events
|
|
4
|
+
* Following the SSE specification: https://html.spec.whatwg.org/multipage/server-sent-events.html
|
|
5
|
+
*/
|
|
6
|
+
export declare const SSE_DATA_PREFIX = "data: ";
|
|
7
|
+
/**
|
|
8
|
+
* Maximum number of resources to display in the search results
|
|
9
|
+
* Limits UI clutter while providing sufficient context
|
|
10
|
+
*/
|
|
11
|
+
export declare const MAX_DISPLAYED_RESOURCES = 5;
|
|
12
|
+
/**
|
|
13
|
+
* Default headers for AI search API requests
|
|
14
|
+
*/
|
|
15
|
+
export declare const AI_SEARCH_REQUEST_HEADERS: {
|
|
16
|
+
readonly 'Content-Type': "application/json";
|
|
17
|
+
};
|
|
18
|
+
export declare const SSE_EVENTS: {
|
|
19
|
+
readonly MESSAGE_ID: "messageId";
|
|
20
|
+
readonly SOURCES: "sources";
|
|
21
|
+
readonly ANSWER: "answer";
|
|
22
|
+
readonly TOOL_CALL: "toolCall";
|
|
23
|
+
readonly TOOL_RESULT: "toolResult";
|
|
24
|
+
readonly ERROR: "error";
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Maps HTTP status codes to AI search error types
|
|
28
|
+
*/
|
|
29
|
+
export declare const HTTP_ERROR_MAP: Record<number, AiSearchError>;
|
|
30
|
+
//# sourceMappingURL=ai-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{AiSearchError as o}from"@redocly/theme/core/constants";const t="data: ",r=5,S={"Content-Type":"application/json"},e={MESSAGE_ID:"messageId",SOURCES:"sources",ANSWER:"answer",TOOL_CALL:"toolCall",TOOL_RESULT:"toolResult",ERROR:"error"},R={401:o.Unauthorized,403:o.Forbidden};export{S as AI_SEARCH_REQUEST_HEADERS,R as HTTP_ERROR_MAP,r as MAX_DISPLAYED_RESOURCES,t as SSE_DATA_PREFIX,e as SSE_EVENTS};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export*from"./ai-search";
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { SearchFilterItem, ToolCallName } from '@redocly/theme/core/types';
|
|
2
|
+
import type { SSE_EVENTS } from '../constants/ai-search';
|
|
3
|
+
import type { AiSearchError } from '@redocly/theme/core/constants';
|
|
4
|
+
export type SSEMessageType = (typeof SSE_EVENTS)[keyof typeof SSE_EVENTS];
|
|
5
|
+
export type SearchResource = {
|
|
6
|
+
url: string;
|
|
7
|
+
title: string;
|
|
8
|
+
};
|
|
9
|
+
export type DocumentSource = SearchResource & {
|
|
10
|
+
id: string;
|
|
11
|
+
};
|
|
12
|
+
export type SSEMessageId = {
|
|
13
|
+
type: typeof SSE_EVENTS.MESSAGE_ID;
|
|
14
|
+
messageId: string;
|
|
15
|
+
};
|
|
16
|
+
export type SSESources = {
|
|
17
|
+
type: typeof SSE_EVENTS.SOURCES;
|
|
18
|
+
sources: DocumentSource[];
|
|
19
|
+
};
|
|
20
|
+
export type SSEAnswer = {
|
|
21
|
+
type: typeof SSE_EVENTS.ANSWER;
|
|
22
|
+
answer: string;
|
|
23
|
+
};
|
|
24
|
+
export type SSEToolCall = {
|
|
25
|
+
type: typeof SSE_EVENTS.TOOL_CALL;
|
|
26
|
+
toolCall: {
|
|
27
|
+
name: ToolCallName;
|
|
28
|
+
args: unknown;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export type SSEToolResult = {
|
|
32
|
+
type: typeof SSE_EVENTS.TOOL_RESULT;
|
|
33
|
+
result: {
|
|
34
|
+
documentCount: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export type SSEError = {
|
|
38
|
+
type: typeof SSE_EVENTS.ERROR;
|
|
39
|
+
error: {
|
|
40
|
+
message: string;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export type SSEMessage = SSEMessageId | SSESources | SSEAnswer | SSEToolCall | SSEToolResult | SSEError;
|
|
44
|
+
export type ToolCallState = {
|
|
45
|
+
name: ToolCallName;
|
|
46
|
+
args: unknown;
|
|
47
|
+
position: number;
|
|
48
|
+
result?: {
|
|
49
|
+
documentCount: number;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
export type AiSearchOptions = {
|
|
53
|
+
filter?: SearchFilterItem[];
|
|
54
|
+
};
|
|
55
|
+
export type AiSearchState = {
|
|
56
|
+
status: 'idle';
|
|
57
|
+
response?: string;
|
|
58
|
+
} | {
|
|
59
|
+
status: 'loading';
|
|
60
|
+
question: string;
|
|
61
|
+
response: string;
|
|
62
|
+
resources: SearchResource[];
|
|
63
|
+
} | {
|
|
64
|
+
status: 'success';
|
|
65
|
+
question: string;
|
|
66
|
+
response: string;
|
|
67
|
+
resources: SearchResource[];
|
|
68
|
+
} | {
|
|
69
|
+
status: 'error';
|
|
70
|
+
question: string;
|
|
71
|
+
error: AiSearchError;
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=ai-search.d.ts.map
|
|
File without changes
|