@redocly/redoc-reef 0.140.0-next.1 → 0.140.0-next.2
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 +219 -203
- package/dist/server/constants/common.d.ts +2 -0
- package/dist/server/constants/common.js +1 -1
- package/dist/server/plugins/api-docs/spec-download.api.js +1 -1
- package/dist/server/plugins/scorecard-classic/index.js +1 -1
- package/dist/server/plugins/scorecard-classic/shared-utils.js +1 -1
- package/dist/server/plugins/scorecard-classic/template/views.js +1 -1
- package/dist/server/plugins/search/engines/typesense/index.js +1 -1
- package/dist/server/utils/decode-request-path.d.ts +2 -0
- package/dist/server/utils/decode-request-path.js +1 -0
- package/dist/server/utils/llmstxt/resolve-llms-txt-md.js +1 -1
- package/dist/server/utils/rbac.js +1 -1
- package/dist/server/web-server/routes/dynamic-route.js +1 -1
- package/dist/server/web-server/routes/helpers/process-redirects.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @redocly/redoc-reef
|
|
2
2
|
|
|
3
|
+
## 0.140.0-next.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- c2de4371f03: Fixed an issue where search with the Typesense engine failed or took several seconds on projects with large API operations.
|
|
8
|
+
|
|
3
9
|
## 0.140.0-next.1
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -19,6 +25,16 @@
|
|
|
19
25
|
- Updated dependencies [cc40376e265]
|
|
20
26
|
- @redocly/api-docs@0.5.0-next.0
|
|
21
27
|
|
|
28
|
+
## 0.139.2
|
|
29
|
+
|
|
30
|
+
## 0.139.1
|
|
31
|
+
|
|
32
|
+
### Patch Changes
|
|
33
|
+
|
|
34
|
+
- e57c8b344f7: Fixed an issue where OpenAPI pages that use `allOf` inheritance with a `oneOf` discriminator caused the server to stop responding.
|
|
35
|
+
- Updated dependencies [e57c8b344f7]
|
|
36
|
+
- @redocly/api-docs@0.4.1
|
|
37
|
+
|
|
22
38
|
## 0.139.0
|
|
23
39
|
|
|
24
40
|
### Minor Changes
|
|
@@ -3014,29 +3030,6 @@
|
|
|
3014
3030
|
- @redocly/realm-asyncapi-sdk@0.9.0-next.2
|
|
3015
3031
|
- @redocly/theme@0.63.0-next.3
|
|
3016
3032
|
|
|
3017
|
-
## 0.130.4
|
|
3018
|
-
|
|
3019
|
-
### Patch Changes
|
|
3020
|
-
|
|
3021
|
-
- 5b1e533559: Fixed security vulnerability CVE-2026-25128 in fast-xml-parser by upgrading openapi-sampler to version 1.7.0.
|
|
3022
|
-
- Updated dependencies [5b1e533559]
|
|
3023
|
-
- @redocly/portal-plugin-mock-server@0.15.2
|
|
3024
|
-
- @redocly/asyncapi-docs@1.7.2
|
|
3025
|
-
- @redocly/openapi-docs@3.18.2
|
|
3026
|
-
- @redocly/theme@0.62.1
|
|
3027
|
-
- @redocly/graphql-docs@1.7.1
|
|
3028
|
-
|
|
3029
|
-
## 0.130.3
|
|
3030
|
-
|
|
3031
|
-
### Patch Changes
|
|
3032
|
-
|
|
3033
|
-
- 0beb1adad0: Fixed a bug where AI search events were not tracked for project analytics.
|
|
3034
|
-
- Updated dependencies [e7708a15f1]
|
|
3035
|
-
- Updated dependencies [e7708a15f1]
|
|
3036
|
-
- @redocly/portal-plugin-mock-server@0.15.1
|
|
3037
|
-
- @redocly/asyncapi-docs@1.7.1
|
|
3038
|
-
- @redocly/openapi-docs@3.18.1
|
|
3039
|
-
|
|
3040
3033
|
## 0.131.0-next.6
|
|
3041
3034
|
|
|
3042
3035
|
### Patch Changes
|
|
@@ -3094,15 +3087,6 @@
|
|
|
3094
3087
|
- @redocly/graphql-docs@1.8.0-next.2
|
|
3095
3088
|
- @redocly/portal-plugin-mock-server@0.16.0-next.2
|
|
3096
3089
|
|
|
3097
|
-
## 0.130.2
|
|
3098
|
-
|
|
3099
|
-
### Patch Changes
|
|
3100
|
-
|
|
3101
|
-
- 4dfbc3b570: Fixed an issue where Project Analytics would not display any data for specific versions of Realm.
|
|
3102
|
-
- Updated dependencies [4dfbc3b570]
|
|
3103
|
-
- @redocly/realm-asyncapi-sdk@0.8.1
|
|
3104
|
-
- @redocly/theme@0.62.0
|
|
3105
|
-
|
|
3106
3090
|
## 0.131.0-next.3
|
|
3107
3091
|
|
|
3108
3092
|
### Patch Changes
|
|
@@ -3137,12 +3121,6 @@
|
|
|
3137
3121
|
- 713994c780: Fixed an issue where the execution environment wasn't recognized correctly causing build failures.
|
|
3138
3122
|
- 1fa1e85405: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3139
3123
|
|
|
3140
|
-
## 0.130.1
|
|
3141
|
-
|
|
3142
|
-
### Patch Changes
|
|
3143
|
-
|
|
3144
|
-
- 69f13ea40c: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3145
|
-
|
|
3146
3124
|
## 0.131.0-next.0
|
|
3147
3125
|
|
|
3148
3126
|
### Minor Changes
|
|
@@ -3169,6 +3147,44 @@
|
|
|
3169
3147
|
- @redocly/graphql-docs@1.8.0-next.0
|
|
3170
3148
|
- @redocly/openapi-docs@3.19.0-next.0
|
|
3171
3149
|
|
|
3150
|
+
## 0.130.4
|
|
3151
|
+
|
|
3152
|
+
### Patch Changes
|
|
3153
|
+
|
|
3154
|
+
- 5b1e533559: Fixed security vulnerability CVE-2026-25128 in fast-xml-parser by upgrading openapi-sampler to version 1.7.0.
|
|
3155
|
+
- Updated dependencies [5b1e533559]
|
|
3156
|
+
- @redocly/portal-plugin-mock-server@0.15.2
|
|
3157
|
+
- @redocly/asyncapi-docs@1.7.2
|
|
3158
|
+
- @redocly/openapi-docs@3.18.2
|
|
3159
|
+
- @redocly/theme@0.62.1
|
|
3160
|
+
- @redocly/graphql-docs@1.7.1
|
|
3161
|
+
|
|
3162
|
+
## 0.130.3
|
|
3163
|
+
|
|
3164
|
+
### Patch Changes
|
|
3165
|
+
|
|
3166
|
+
- 0beb1adad0: Fixed a bug where AI search events were not tracked for project analytics.
|
|
3167
|
+
- Updated dependencies [e7708a15f1]
|
|
3168
|
+
- Updated dependencies [e7708a15f1]
|
|
3169
|
+
- @redocly/portal-plugin-mock-server@0.15.1
|
|
3170
|
+
- @redocly/asyncapi-docs@1.7.1
|
|
3171
|
+
- @redocly/openapi-docs@3.18.1
|
|
3172
|
+
|
|
3173
|
+
## 0.130.2
|
|
3174
|
+
|
|
3175
|
+
### Patch Changes
|
|
3176
|
+
|
|
3177
|
+
- 4dfbc3b570: Fixed an issue where Project Analytics would not display any data for specific versions of Realm.
|
|
3178
|
+
- Updated dependencies [4dfbc3b570]
|
|
3179
|
+
- @redocly/realm-asyncapi-sdk@0.8.1
|
|
3180
|
+
- @redocly/theme@0.62.0
|
|
3181
|
+
|
|
3182
|
+
## 0.130.1
|
|
3183
|
+
|
|
3184
|
+
### Patch Changes
|
|
3185
|
+
|
|
3186
|
+
- 69f13ea40c: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3187
|
+
|
|
3172
3188
|
## 0.130.0
|
|
3173
3189
|
|
|
3174
3190
|
### Minor Changes
|
|
@@ -3415,12 +3431,6 @@
|
|
|
3415
3431
|
- @redocly/portal-plugin-mock-server@0.15.0-next.2
|
|
3416
3432
|
- @redocly/graphql-docs@1.7.0-next.0
|
|
3417
3433
|
|
|
3418
|
-
## 0.129.2
|
|
3419
|
-
|
|
3420
|
-
### Patch Changes
|
|
3421
|
-
|
|
3422
|
-
- 237e61721c: Fixed an issue where project processing could halt indefinitely due to incorrect cache handling.
|
|
3423
|
-
|
|
3424
3434
|
## 0.130.0-next.2
|
|
3425
3435
|
|
|
3426
3436
|
### Patch Changes
|
|
@@ -3460,6 +3470,12 @@
|
|
|
3460
3470
|
- @redocly/openapi-docs@3.18.0-next.0
|
|
3461
3471
|
- @redocly/theme@0.62.0-next.0
|
|
3462
3472
|
|
|
3473
|
+
## 0.129.2
|
|
3474
|
+
|
|
3475
|
+
### Patch Changes
|
|
3476
|
+
|
|
3477
|
+
- 237e61721c: Fixed an issue where project processing could halt indefinitely due to incorrect cache handling.
|
|
3478
|
+
|
|
3463
3479
|
## 0.129.1
|
|
3464
3480
|
|
|
3465
3481
|
### Patch Changes
|
|
@@ -3581,18 +3597,6 @@
|
|
|
3581
3597
|
- @redocly/portal-plugin-mock-server@0.14.0-next.3
|
|
3582
3598
|
- @redocly/graphql-docs@1.6.0-next.0
|
|
3583
3599
|
|
|
3584
|
-
## 0.128.1
|
|
3585
|
-
|
|
3586
|
-
### Patch Changes
|
|
3587
|
-
|
|
3588
|
-
- 7a73a9957a: Fixed a bug where scorecard custom targets did not match.
|
|
3589
|
-
- Updated dependencies [fe3253dabb]
|
|
3590
|
-
- @redocly/theme@0.60.1
|
|
3591
|
-
- @redocly/asyncapi-docs@1.5.1
|
|
3592
|
-
- @redocly/graphql-docs@1.5.0
|
|
3593
|
-
- @redocly/openapi-docs@3.16.1
|
|
3594
|
-
- @redocly/portal-plugin-mock-server@0.13.1
|
|
3595
|
-
|
|
3596
3600
|
## 0.129.0-next.2
|
|
3597
3601
|
|
|
3598
3602
|
### Minor Changes
|
|
@@ -3653,6 +3657,18 @@
|
|
|
3653
3657
|
- @redocly/graphql-docs@1.6.0-next.0
|
|
3654
3658
|
- @redocly/theme@0.61.0-next.0
|
|
3655
3659
|
|
|
3660
|
+
## 0.128.1
|
|
3661
|
+
|
|
3662
|
+
### Patch Changes
|
|
3663
|
+
|
|
3664
|
+
- 7a73a9957a: Fixed a bug where scorecard custom targets did not match.
|
|
3665
|
+
- Updated dependencies [fe3253dabb]
|
|
3666
|
+
- @redocly/theme@0.60.1
|
|
3667
|
+
- @redocly/asyncapi-docs@1.5.1
|
|
3668
|
+
- @redocly/graphql-docs@1.5.0
|
|
3669
|
+
- @redocly/openapi-docs@3.16.1
|
|
3670
|
+
- @redocly/portal-plugin-mock-server@0.13.1
|
|
3671
|
+
|
|
3656
3672
|
## 0.128.0
|
|
3657
3673
|
|
|
3658
3674
|
### Minor Changes
|
|
@@ -4155,12 +4171,6 @@
|
|
|
4155
4171
|
- @redocly/portal-plugin-mock-server@0.12.0-next.4
|
|
4156
4172
|
- @redocly/graphql-docs@1.4.0-next.0
|
|
4157
4173
|
|
|
4158
|
-
## 0.126.2
|
|
4159
|
-
|
|
4160
|
-
### Patch Changes
|
|
4161
|
-
|
|
4162
|
-
- 80be5200e3: Fixed an issue where successive sidebar items were not activated when users were scrolling API document pages.
|
|
4163
|
-
|
|
4164
4174
|
## 0.127.0-next.3
|
|
4165
4175
|
|
|
4166
4176
|
### Patch Changes
|
|
@@ -4209,20 +4219,6 @@
|
|
|
4209
4219
|
- @redocly/openapi-docs@3.15.0-next.1
|
|
4210
4220
|
- @redocly/portal-plugin-mock-server@0.12.0-next.1
|
|
4211
4221
|
|
|
4212
|
-
## 0.126.1
|
|
4213
|
-
|
|
4214
|
-
### Patch Changes
|
|
4215
|
-
|
|
4216
|
-
- 7a4401ae3f: Renamed the `get-full-definition` MCP tool to `get-full-spec-document`.
|
|
4217
|
-
- Updated dependencies [952ce6e27b]
|
|
4218
|
-
- Updated dependencies [77852d4f5c]
|
|
4219
|
-
- @redocly/realm-asyncapi-sdk@0.4.1
|
|
4220
|
-
- @redocly/theme@0.58.1
|
|
4221
|
-
- @redocly/openapi-docs@3.14.1
|
|
4222
|
-
- @redocly/asyncapi-docs@1.3.1
|
|
4223
|
-
- @redocly/graphql-docs@1.3.0
|
|
4224
|
-
- @redocly/portal-plugin-mock-server@0.11.1
|
|
4225
|
-
|
|
4226
4222
|
## 0.127.0-next.0
|
|
4227
4223
|
|
|
4228
4224
|
### Minor Changes
|
|
@@ -4248,6 +4244,26 @@
|
|
|
4248
4244
|
- @redocly/openapi-docs@3.15.0-next.0
|
|
4249
4245
|
- @redocly/theme@0.59.0-next.0
|
|
4250
4246
|
|
|
4247
|
+
## 0.126.2
|
|
4248
|
+
|
|
4249
|
+
### Patch Changes
|
|
4250
|
+
|
|
4251
|
+
- 80be5200e3: Fixed an issue where successive sidebar items were not activated when users were scrolling API document pages.
|
|
4252
|
+
|
|
4253
|
+
## 0.126.1
|
|
4254
|
+
|
|
4255
|
+
### Patch Changes
|
|
4256
|
+
|
|
4257
|
+
- 7a4401ae3f: Renamed the `get-full-definition` MCP tool to `get-full-spec-document`.
|
|
4258
|
+
- Updated dependencies [952ce6e27b]
|
|
4259
|
+
- Updated dependencies [77852d4f5c]
|
|
4260
|
+
- @redocly/realm-asyncapi-sdk@0.4.1
|
|
4261
|
+
- @redocly/theme@0.58.1
|
|
4262
|
+
- @redocly/openapi-docs@3.14.1
|
|
4263
|
+
- @redocly/asyncapi-docs@1.3.1
|
|
4264
|
+
- @redocly/graphql-docs@1.3.0
|
|
4265
|
+
- @redocly/portal-plugin-mock-server@0.11.1
|
|
4266
|
+
|
|
4251
4267
|
## 0.126.0
|
|
4252
4268
|
|
|
4253
4269
|
### Minor Changes
|
|
@@ -4472,12 +4488,6 @@
|
|
|
4472
4488
|
- @redocly/portal-plugin-mock-server@0.11.0-next.7
|
|
4473
4489
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4474
4490
|
|
|
4475
|
-
## 0.125.3
|
|
4476
|
-
|
|
4477
|
-
### Patch Changes
|
|
4478
|
-
|
|
4479
|
-
- Fixed project analytics collection.
|
|
4480
|
-
|
|
4481
4491
|
## 0.126.0-next.10
|
|
4482
4492
|
|
|
4483
4493
|
### Minor Changes
|
|
@@ -4538,19 +4548,6 @@
|
|
|
4538
4548
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4539
4549
|
- @redocly/portal-plugin-mock-server@0.11.0-next.4
|
|
4540
4550
|
|
|
4541
|
-
## 0.125.2
|
|
4542
|
-
|
|
4543
|
-
### Patch Changes
|
|
4544
|
-
|
|
4545
|
-
- 9578323801: Improved JavaScript compilation time on Windows.
|
|
4546
|
-
- Updated dependencies [1405d52ab2]
|
|
4547
|
-
- @redocly/realm-asyncapi-sdk@0.4.0
|
|
4548
|
-
- @redocly/theme@0.57.1
|
|
4549
|
-
- @redocly/asyncapi-docs@1.2.1
|
|
4550
|
-
- @redocly/graphql-docs@1.2.0
|
|
4551
|
-
- @redocly/openapi-docs@3.13.1
|
|
4552
|
-
- @redocly/portal-plugin-mock-server@0.10.1
|
|
4553
|
-
|
|
4554
4551
|
## 0.126.0-next.6
|
|
4555
4552
|
|
|
4556
4553
|
### Patch Changes
|
|
@@ -4586,12 +4583,6 @@
|
|
|
4586
4583
|
- @redocly/asyncapi-docs@1.3.0-next.1
|
|
4587
4584
|
- @redocly/portal-plugin-mock-server@0.11.0-next.1
|
|
4588
4585
|
|
|
4589
|
-
## 0.125.1
|
|
4590
|
-
|
|
4591
|
-
### Patch Changes
|
|
4592
|
-
|
|
4593
|
-
- 28860eaf79: Fixed an issue where Markdoc tags did not render in preview mode.
|
|
4594
|
-
|
|
4595
4586
|
## 0.126.0-next.3
|
|
4596
4587
|
|
|
4597
4588
|
### Patch Changes
|
|
@@ -4632,6 +4623,31 @@
|
|
|
4632
4623
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4633
4624
|
- @redocly/openapi-docs@3.14.0-next.0
|
|
4634
4625
|
|
|
4626
|
+
## 0.125.3
|
|
4627
|
+
|
|
4628
|
+
### Patch Changes
|
|
4629
|
+
|
|
4630
|
+
- Fixed project analytics collection.
|
|
4631
|
+
|
|
4632
|
+
## 0.125.2
|
|
4633
|
+
|
|
4634
|
+
### Patch Changes
|
|
4635
|
+
|
|
4636
|
+
- 9578323801: Improved JavaScript compilation time on Windows.
|
|
4637
|
+
- Updated dependencies [1405d52ab2]
|
|
4638
|
+
- @redocly/realm-asyncapi-sdk@0.4.0
|
|
4639
|
+
- @redocly/theme@0.57.1
|
|
4640
|
+
- @redocly/asyncapi-docs@1.2.1
|
|
4641
|
+
- @redocly/graphql-docs@1.2.0
|
|
4642
|
+
- @redocly/openapi-docs@3.13.1
|
|
4643
|
+
- @redocly/portal-plugin-mock-server@0.10.1
|
|
4644
|
+
|
|
4645
|
+
## 0.125.1
|
|
4646
|
+
|
|
4647
|
+
### Patch Changes
|
|
4648
|
+
|
|
4649
|
+
- 28860eaf79: Fixed an issue where Markdoc tags did not render in preview mode.
|
|
4650
|
+
|
|
4635
4651
|
## 0.125.0
|
|
4636
4652
|
|
|
4637
4653
|
### Minor Changes
|
|
@@ -4788,44 +4804,6 @@
|
|
|
4788
4804
|
- @redocly/openapi-docs@3.13.0-next.3
|
|
4789
4805
|
- @redocly/portal-plugin-mock-server@0.10.0-next.3
|
|
4790
4806
|
|
|
4791
|
-
## 0.124.3
|
|
4792
|
-
|
|
4793
|
-
### Patch Changes
|
|
4794
|
-
|
|
4795
|
-
- Fixed an issue causing crashed during a build.
|
|
4796
|
-
- Updated dependencies
|
|
4797
|
-
- @redocly/theme@0.56.3
|
|
4798
|
-
- @redocly/asyncapi-docs@1.1.3
|
|
4799
|
-
- @redocly/graphql-docs@1.1.0
|
|
4800
|
-
- @redocly/openapi-docs@3.12.3
|
|
4801
|
-
- @redocly/portal-plugin-mock-server@0.9.3
|
|
4802
|
-
|
|
4803
|
-
## 0.124.2
|
|
4804
|
-
|
|
4805
|
-
### Patch Changes
|
|
4806
|
-
|
|
4807
|
-
- Fixed invalid dependency version causing dependency install to fail.
|
|
4808
|
-
- Updated dependencies
|
|
4809
|
-
- @redocly/theme@0.56.2
|
|
4810
|
-
- @redocly/asyncapi-docs@1.1.2
|
|
4811
|
-
- @redocly/graphql-docs@1.1.0
|
|
4812
|
-
- @redocly/openapi-docs@3.12.2
|
|
4813
|
-
- @redocly/portal-plugin-mock-server@0.9.2
|
|
4814
|
-
|
|
4815
|
-
## 0.124.1
|
|
4816
|
-
|
|
4817
|
-
### Patch Changes
|
|
4818
|
-
|
|
4819
|
-
- 76e2ff5afd: Fixed broken feedback submission.
|
|
4820
|
-
- 92a9326dd1: Fixed an issue where LLM page actions appeared on pages excluded from search.
|
|
4821
|
-
- Updated dependencies [a3e76e3587]
|
|
4822
|
-
- Updated dependencies [92a9326dd1]
|
|
4823
|
-
- @redocly/theme@0.56.1
|
|
4824
|
-
- @redocly/asyncapi-docs@1.1.1
|
|
4825
|
-
- @redocly/graphql-docs@1.1.0
|
|
4826
|
-
- @redocly/openapi-docs@3.12.1
|
|
4827
|
-
- @redocly/portal-plugin-mock-server@0.9.1
|
|
4828
|
-
|
|
4829
4807
|
## 0.125.0-next.2
|
|
4830
4808
|
|
|
4831
4809
|
### Patch Changes
|
|
@@ -4875,6 +4853,44 @@
|
|
|
4875
4853
|
- @redocly/asyncapi-docs@1.2.0-next.0
|
|
4876
4854
|
- @redocly/graphql-docs@1.2.0-next.0
|
|
4877
4855
|
|
|
4856
|
+
## 0.124.3
|
|
4857
|
+
|
|
4858
|
+
### Patch Changes
|
|
4859
|
+
|
|
4860
|
+
- Fixed an issue causing crashed during a build.
|
|
4861
|
+
- Updated dependencies
|
|
4862
|
+
- @redocly/theme@0.56.3
|
|
4863
|
+
- @redocly/asyncapi-docs@1.1.3
|
|
4864
|
+
- @redocly/graphql-docs@1.1.0
|
|
4865
|
+
- @redocly/openapi-docs@3.12.3
|
|
4866
|
+
- @redocly/portal-plugin-mock-server@0.9.3
|
|
4867
|
+
|
|
4868
|
+
## 0.124.2
|
|
4869
|
+
|
|
4870
|
+
### Patch Changes
|
|
4871
|
+
|
|
4872
|
+
- Fixed invalid dependency version causing dependency install to fail.
|
|
4873
|
+
- Updated dependencies
|
|
4874
|
+
- @redocly/theme@0.56.2
|
|
4875
|
+
- @redocly/asyncapi-docs@1.1.2
|
|
4876
|
+
- @redocly/graphql-docs@1.1.0
|
|
4877
|
+
- @redocly/openapi-docs@3.12.2
|
|
4878
|
+
- @redocly/portal-plugin-mock-server@0.9.2
|
|
4879
|
+
|
|
4880
|
+
## 0.124.1
|
|
4881
|
+
|
|
4882
|
+
### Patch Changes
|
|
4883
|
+
|
|
4884
|
+
- 76e2ff5afd: Fixed broken feedback submission.
|
|
4885
|
+
- 92a9326dd1: Fixed an issue where LLM page actions appeared on pages excluded from search.
|
|
4886
|
+
- Updated dependencies [a3e76e3587]
|
|
4887
|
+
- Updated dependencies [92a9326dd1]
|
|
4888
|
+
- @redocly/theme@0.56.1
|
|
4889
|
+
- @redocly/asyncapi-docs@1.1.1
|
|
4890
|
+
- @redocly/graphql-docs@1.1.0
|
|
4891
|
+
- @redocly/openapi-docs@3.12.1
|
|
4892
|
+
- @redocly/portal-plugin-mock-server@0.9.1
|
|
4893
|
+
|
|
4878
4894
|
## 0.124.0
|
|
4879
4895
|
|
|
4880
4896
|
### Minor Changes
|
|
@@ -5132,12 +5148,6 @@
|
|
|
5132
5148
|
- @redocly/portal-plugin-mock-server@0.9.0-next.12
|
|
5133
5149
|
- @redocly/graphql-docs@0.13.0-next.1
|
|
5134
5150
|
|
|
5135
|
-
## 0.123.1
|
|
5136
|
-
|
|
5137
|
-
### Patch Changes
|
|
5138
|
-
|
|
5139
|
-
- bdd218eb53: Fixed an issue where an RBAC match pattern starting with `**` did not override the global match pattern `**`.
|
|
5140
|
-
|
|
5141
5151
|
## 0.124.0-next.17
|
|
5142
5152
|
|
|
5143
5153
|
### Patch Changes
|
|
@@ -5321,6 +5331,12 @@
|
|
|
5321
5331
|
- @redocly/graphql-docs@0.13.0-next.0
|
|
5322
5332
|
- @redocly/theme@0.56.0-next.0
|
|
5323
5333
|
|
|
5334
|
+
## 0.123.1
|
|
5335
|
+
|
|
5336
|
+
### Patch Changes
|
|
5337
|
+
|
|
5338
|
+
- bdd218eb53: Fixed an issue where an RBAC match pattern starting with `**` did not override the global match pattern `**`.
|
|
5339
|
+
|
|
5324
5340
|
## 0.123.0
|
|
5325
5341
|
|
|
5326
5342
|
### Minor Changes
|
|
@@ -5406,18 +5422,6 @@
|
|
|
5406
5422
|
- @redocly/openapi-docs@3.11.0-next.9
|
|
5407
5423
|
- @redocly/portal-plugin-mock-server@0.8.0-next.9
|
|
5408
5424
|
|
|
5409
|
-
## 0.122.3
|
|
5410
|
-
|
|
5411
|
-
### Patch Changes
|
|
5412
|
-
|
|
5413
|
-
- d33ccaad3f: Fixed an issue where the Markdoc `tabs` tag incorrectly set the active state for the selected tab.
|
|
5414
|
-
- Updated dependencies [d33ccaad3f]
|
|
5415
|
-
- @redocly/theme@0.54.3
|
|
5416
|
-
- @redocly/asyncapi-docs@0.3.3
|
|
5417
|
-
- @redocly/graphql-docs@0.11.0
|
|
5418
|
-
- @redocly/openapi-docs@3.10.3
|
|
5419
|
-
- @redocly/portal-plugin-mock-server@0.7.3
|
|
5420
|
-
|
|
5421
5425
|
## 0.123.0-next.9
|
|
5422
5426
|
|
|
5423
5427
|
### Patch Changes
|
|
@@ -5442,18 +5446,6 @@
|
|
|
5442
5446
|
- @redocly/openapi-docs@3.11.0-next.7
|
|
5443
5447
|
- @redocly/portal-plugin-mock-server@0.8.0-next.7
|
|
5444
5448
|
|
|
5445
|
-
## 0.122.2
|
|
5446
|
-
|
|
5447
|
-
### Patch Changes
|
|
5448
|
-
|
|
5449
|
-
- 0cc1594c74: Fixed an issue where the tabs drop-down disappeared immediately after touch was released, preventing users from switching between tabs on mobile devices.
|
|
5450
|
-
- Updated dependencies [0cc1594c74]
|
|
5451
|
-
- @redocly/theme@0.54.2
|
|
5452
|
-
- @redocly/asyncapi-docs@0.3.2
|
|
5453
|
-
- @redocly/graphql-docs@0.11.0
|
|
5454
|
-
- @redocly/openapi-docs@3.10.2
|
|
5455
|
-
- @redocly/portal-plugin-mock-server@0.7.2
|
|
5456
|
-
|
|
5457
5449
|
## 0.123.0-next.7
|
|
5458
5450
|
|
|
5459
5451
|
### Patch Changes
|
|
@@ -5553,19 +5545,6 @@
|
|
|
5553
5545
|
- @redocly/openapi-docs@3.11.0-next.1
|
|
5554
5546
|
- @redocly/portal-plugin-mock-server@0.8.0-next.1
|
|
5555
5547
|
|
|
5556
|
-
## 0.122.1
|
|
5557
|
-
|
|
5558
|
-
### Patch Changes
|
|
5559
|
-
|
|
5560
|
-
- 534408676f: Fixed performance issue in the `Tabs` component.
|
|
5561
|
-
- 4f1e7786c4: Fixed false positive errors for unclosed quotes in `markdoc` attributes.
|
|
5562
|
-
- Updated dependencies [534408676f]
|
|
5563
|
-
- @redocly/theme@0.54.1
|
|
5564
|
-
- @redocly/asyncapi-docs@0.3.1
|
|
5565
|
-
- @redocly/graphql-docs@0.11.0
|
|
5566
|
-
- @redocly/openapi-docs@3.10.1
|
|
5567
|
-
- @redocly/portal-plugin-mock-server@0.7.1
|
|
5568
|
-
|
|
5569
5548
|
## 0.123.0-next.0
|
|
5570
5549
|
|
|
5571
5550
|
### Patch Changes
|
|
@@ -5584,6 +5563,43 @@
|
|
|
5584
5563
|
- @redocly/theme@0.55.0-next.0
|
|
5585
5564
|
- @redocly/realm-asyncapi-sdk@0.1.0-next.0
|
|
5586
5565
|
|
|
5566
|
+
## 0.122.3
|
|
5567
|
+
|
|
5568
|
+
### Patch Changes
|
|
5569
|
+
|
|
5570
|
+
- d33ccaad3f: Fixed an issue where the Markdoc `tabs` tag incorrectly set the active state for the selected tab.
|
|
5571
|
+
- Updated dependencies [d33ccaad3f]
|
|
5572
|
+
- @redocly/theme@0.54.3
|
|
5573
|
+
- @redocly/asyncapi-docs@0.3.3
|
|
5574
|
+
- @redocly/graphql-docs@0.11.0
|
|
5575
|
+
- @redocly/openapi-docs@3.10.3
|
|
5576
|
+
- @redocly/portal-plugin-mock-server@0.7.3
|
|
5577
|
+
|
|
5578
|
+
## 0.122.2
|
|
5579
|
+
|
|
5580
|
+
### Patch Changes
|
|
5581
|
+
|
|
5582
|
+
- 0cc1594c74: Fixed an issue where the tabs drop-down disappeared immediately after touch was released, preventing users from switching between tabs on mobile devices.
|
|
5583
|
+
- Updated dependencies [0cc1594c74]
|
|
5584
|
+
- @redocly/theme@0.54.2
|
|
5585
|
+
- @redocly/asyncapi-docs@0.3.2
|
|
5586
|
+
- @redocly/graphql-docs@0.11.0
|
|
5587
|
+
- @redocly/openapi-docs@3.10.2
|
|
5588
|
+
- @redocly/portal-plugin-mock-server@0.7.2
|
|
5589
|
+
|
|
5590
|
+
## 0.122.1
|
|
5591
|
+
|
|
5592
|
+
### Patch Changes
|
|
5593
|
+
|
|
5594
|
+
- 534408676f: Fixed performance issue in the `Tabs` component.
|
|
5595
|
+
- 4f1e7786c4: Fixed false positive errors for unclosed quotes in `markdoc` attributes.
|
|
5596
|
+
- Updated dependencies [534408676f]
|
|
5597
|
+
- @redocly/theme@0.54.1
|
|
5598
|
+
- @redocly/asyncapi-docs@0.3.1
|
|
5599
|
+
- @redocly/graphql-docs@0.11.0
|
|
5600
|
+
- @redocly/openapi-docs@3.10.1
|
|
5601
|
+
- @redocly/portal-plugin-mock-server@0.7.1
|
|
5602
|
+
|
|
5587
5603
|
## 0.122.0
|
|
5588
5604
|
|
|
5589
5605
|
### Minor Changes
|
|
@@ -5836,15 +5852,6 @@
|
|
|
5836
5852
|
- @redocly/graphql-docs@0.11.0-next.0
|
|
5837
5853
|
- @redocly/portal-plugin-mock-server@0.7.0-next.2
|
|
5838
5854
|
|
|
5839
|
-
## 0.121.1
|
|
5840
|
-
|
|
5841
|
-
### Patch Changes
|
|
5842
|
-
|
|
5843
|
-
- Updated dependencies [6b9d845619]
|
|
5844
|
-
- @redocly/portal-plugin-mock-server@0.6.1
|
|
5845
|
-
- @redocly/openapi-docs@3.9.1
|
|
5846
|
-
- @redocly/asyncapi-docs@0.2.1
|
|
5847
|
-
|
|
5848
5855
|
## 0.122.0-next.1
|
|
5849
5856
|
|
|
5850
5857
|
### Patch Changes
|
|
@@ -5874,6 +5881,15 @@
|
|
|
5874
5881
|
- @redocly/graphql-docs@0.11.0-next.0
|
|
5875
5882
|
- @redocly/openapi-docs@3.10.0-next.0
|
|
5876
5883
|
|
|
5884
|
+
## 0.121.1
|
|
5885
|
+
|
|
5886
|
+
### Patch Changes
|
|
5887
|
+
|
|
5888
|
+
- Updated dependencies [6b9d845619]
|
|
5889
|
+
- @redocly/portal-plugin-mock-server@0.6.1
|
|
5890
|
+
- @redocly/openapi-docs@3.9.1
|
|
5891
|
+
- @redocly/asyncapi-docs@0.2.1
|
|
5892
|
+
|
|
5877
5893
|
## 0.121.0
|
|
5878
5894
|
|
|
5879
5895
|
### Minor Changes
|
|
@@ -5993,12 +6009,6 @@
|
|
|
5993
6009
|
- @redocly/openapi-docs@3.9.0-next.1
|
|
5994
6010
|
- @redocly/portal-plugin-mock-server@0.6.0-next.1
|
|
5995
6011
|
|
|
5996
|
-
## 0.120.2
|
|
5997
|
-
|
|
5998
|
-
### Patch Changes
|
|
5999
|
-
|
|
6000
|
-
- 4a4316e308: Fixed an issue where using links to an OpenAPI file generated by the `output` configuration property caused errors which failed the build.
|
|
6001
|
-
|
|
6002
6012
|
## 0.121.0-next.0
|
|
6003
6013
|
|
|
6004
6014
|
### Patch Changes
|
|
@@ -6013,6 +6023,12 @@
|
|
|
6013
6023
|
- @redocly/openapi-docs@3.9.0-next.0
|
|
6014
6024
|
- @redocly/theme@0.53.0-next.0
|
|
6015
6025
|
|
|
6026
|
+
## 0.120.2
|
|
6027
|
+
|
|
6028
|
+
### Patch Changes
|
|
6029
|
+
|
|
6030
|
+
- 4a4316e308: Fixed an issue where using links to an OpenAPI file generated by the `output` configuration property caused errors which failed the build.
|
|
6031
|
+
|
|
6016
6032
|
## 0.120.1
|
|
6017
6033
|
|
|
6018
6034
|
### Patch Changes
|
|
@@ -6108,12 +6124,6 @@
|
|
|
6108
6124
|
- @redocly/theme@0.52.0-next.3
|
|
6109
6125
|
- @redocly/graphql-docs@0.9.0-next.0
|
|
6110
6126
|
|
|
6111
|
-
## 0.119.1
|
|
6112
|
-
|
|
6113
|
-
### Patch Changes
|
|
6114
|
-
|
|
6115
|
-
- e2afa2d1f7: Resolved vulnerabilities `CVE-2025-29774` and `CVE-2025-29775` by updating the `xml-crypto` library to a version `6.0.1` with a security patch.
|
|
6116
|
-
|
|
6117
6127
|
## 0.120.0-next.3
|
|
6118
6128
|
|
|
6119
6129
|
### Patch Changes
|
|
@@ -6161,6 +6171,12 @@
|
|
|
6161
6171
|
- @redocly/portal-plugin-mock-server@0.5.0-next.0
|
|
6162
6172
|
- @redocly/theme@0.52.0-next.0
|
|
6163
6173
|
|
|
6174
|
+
## 0.119.1
|
|
6175
|
+
|
|
6176
|
+
### Patch Changes
|
|
6177
|
+
|
|
6178
|
+
- e2afa2d1f7: Resolved vulnerabilities `CVE-2025-29774` and `CVE-2025-29775` by updating the `xml-crypto` library to a version `6.0.1` with a security patch.
|
|
6179
|
+
|
|
6164
6180
|
## 0.119.0
|
|
6165
6181
|
|
|
6166
6182
|
### Minor Changes
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export declare const RUNTIME_RESOURCES_DIR = "runtime";
|
|
2
|
+
export declare const SCORECARD_CLASSIC_FOLDER = "_scorecard";
|
|
3
|
+
export declare const PAGE_DATA_FOLDER = "page-data";
|
|
2
4
|
export declare const PUBLIC_ASSETS_FOLDER = "/assets";
|
|
3
5
|
export declare const DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER = "/_spec";
|
|
4
6
|
export declare const PUBLIC_API_DEFINITIONS_FOLDER = "/_bundle";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ServerRoutes as n}from"../../constants/api.js";import{USER_THEME_ALIAS as A}from"../../constants/common.js";import{envConfig as _}from"../config/env-config.js";const N="runtime",x="/assets",
|
|
1
|
+
import{ServerRoutes as n}from"../../constants/api.js";import{USER_THEME_ALIAS as A}from"../../constants/common.js";import{envConfig as _}from"../config/env-config.js";const N="runtime",x="_scorecard",a="page-data",U="/assets",M="/_spec",P="/_bundle",l="static",i="static-data",m="redocly:::linkOriginal",F="@",K="default",H=new RegExp("((?!@i18n\\/|@l10n\\/)\\/?@.*?(?=\\/))","g"),Y="@redocly/theme/plugin.js",d="styles.css",B=["@theme/plugin.js","@theme/plugin.cjs","@theme/plugin.mjs"],I="test_secret_key",G=_.JWT_SECRET_KEY||I,S=4096,c=196,u=S-c,g=3600,W=1440*60,L="@i18n",r="@l10n",h=[A,L,r,"@api","@mcp"],k="https://redocly.com/auth/aud",J="catalog.json",f="scorecard.json",w="page-count.json",X="sitemap.xml",j="llms.txt",o=_.PROJECT_ID,V=_.PROJECT_SLUG,R=_.ORGANIZATION_ID,$=_.ORG_SLUG,t=_.BH_API_URL,E=t&&R&&o?`${t}/orgs/${R}/projects/${o}`:void 0,p=t?`${t}/entitlements/.well-known/jwks`:"https://app.cloud.redocly.com/api/entitlements/.well-known/jwks",v=_.ENTITLEMENTS_JWKS_CDN_URL||p,y=E?`${E}/feedback`:"",b=E?`${E}/ai-agentic-conversations`:"",Z=E?`${E}/ai-assistant-escalations`:"",q=E?`${E}/ai-assistant-feedback`:"",z=E?`${E}/semantic-search`:"",Q="no-store",__=365*24*60*60,E_="X-Redocly-Cache-Control",t_="no-cache",o_="public, s-maxage=86400, max-age=10, must-revalidate",R_=_.AUTH_URL,e_="Developer Documentation",e=_.REDOCLY_SSR_RENDER_MODE==="worker"?"worker":"main",s_=e==="main"?0:_.REDOCLY_SSR_WORKERS_MIN!=null?Number(_.REDOCLY_SSR_WORKERS_MIN):2,T_=e==="main"?1:_.REDOCLY_SSR_WORKERS_MAX!=null?Number(_.REDOCLY_SSR_WORKERS_MAX):5,n_="-----BEGIN CERTIFICATE-----",A_="-----END CERTIFICATE-----",I_=!_.isDevelopMode&&_.REDOCLY_TELEMETRY!=="off"||_.REDOCLY_TELEMETRY==="on",S_="http://localhost:4318/v1/traces",c_=[n.HEALTH],s=_.SERVER_EDITOR_APP_URL||"http://127.0.0.1:3000",L_=_.REDOCLY_CORS_ORIGINS?_.REDOCLY_CORS_ORIGINS.split(",").map(T=>T.trim()).filter(Boolean).concat(s):[s],r_="markdown/partials",p_="markdown/partials-deps";export{Z as AI_ASSISTANT_ESCALATIONS_API_URL,q as AI_ASSISTANT_FEEDBACK_API_URL,L_ as ALLOWED_CORS_ORIGINS,k as ALTERNATIVE_AUD_CLAIM_NAME,b as ASK_AI_API_URL,R_ as AUTH_URL,n_ as BEGIN_CERTIFICATE_DELIMITER,E as BH_API_PROJECTS_URL,Q as CACHE_CONTROL_NO_STORE_HEADER_VALUE,t_ as CACHE_CONTROL_PUBLIC_HTML,J as CATALOG_OUTPUT_FILE_NAME,__ as DEFAULT_IMMUTABLE_CACHE_MAX_AGE,B as DEFAULT_PROJECT_PLUGIN_PATHS,Y as DEFAULT_THEME_PLUGIN_PATH,e_ as DEFAULT_TITLE,K as DEFAULT_VERSION_NAME,M as DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER,A_ as END_CERTIFICATE_DELIMITER,v as ENTITLEMENTS_JWKS_URL,I as FALLBACK_JWT_SECRET_KEY,y as FEEDBACK_API_URL,L as I18N_DIR_NAME,G as JWT_SECRET_KEY,r as L10N_DIR_NAME,m as LINK_ORIGINAL_ATTR_NAME,j as LLMS_TXT_FILE_NAME,r_ as MARKDOC_PARTIALS_DATA_KEY,p_ as MARKDOC_PARTIALS_DEPS_KEY,u as MAX_AUTH_TOKEN_COOKIE_BYTES,g as MCP_ACCESS_TOKEN_TTL_SEC,W as MCP_REFRESH_SESSION_LIFETIME_SEC,R as ORG_ID,$ as ORG_SLUG,c_ as OTEL_EXCLUDED_ROUTES,S_ as OTEL_TRACES_DEV_URL,w as PAGE_COUNT_OUTPUT_FILE_NAME,a as PAGE_DATA_FOLDER,o as PROJECT_ID,V as PROJECT_SLUG,P as PUBLIC_API_DEFINITIONS_FOLDER,U as PUBLIC_ASSETS_FOLDER,l as PUBLIC_STATIC_FOLDER,h as RESERVED_DIR_NAMES,N as RUNTIME_RESOURCES_DIR,x as SCORECARD_CLASSIC_FOLDER,f as SCORECARD_OUTPUT_FILE_NAME,z as SEMANTIC_SEARCH_API_URL,s as SERVER_EDITOR_APP_URL,X as SITEMAP_FILE_NAME,e as SSR_RENDER_MODE,T_ as SSR_WORKERS_MAX,s_ as SSR_WORKERS_MIN,i as STATIC_DATA_FOLDER,d as STYLES_FILE,I_ as TELEMETRY_ENABLED,H as VERSIONED_FOLDER_REGEXP_MATCH,F as VERSION_SEPARATOR,E_ as X_REDOCLY_CACHE_CONTROL_HEADER,o_ as X_REDOCLY_CACHE_CONTROL_PUBLIC_HTML};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import t from"node:path";import{existsSync as u}from"node:fs";import{readFile as w}from"node:fs/promises";import q from"js-yaml";import{withoutPathPrefix as j}from"@redocly/theme/core/utils";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as x,PUBLIC_API_DEFINITIONS_FOLDER as A}from"../../constants/common.js";import{GRAPHQL_SPEC_SLUG as g}from"../../../constants/common.js";import{canDownloadApiDefinition as T,filterDataByAccessDeep as C}from"../../utils/rbac.js";import{API_DOWNLOAD_PREFIXES as U}from"../../utils/is-api-download-link.js";import{decodeRequestPath as B}from"../../utils/decode-request-path.js";const G=[".json",".yaml",".yml"],W=[".graphql",".gql"];function S(i,n){const s=t.parse(i);return t.join(s.dir,s.name+n)}const X=async(i,n,s)=>{const{isAuthenticated:r,teams:f,claims:{email:m}}=n.user,D=new URL(i.url),e=B(j(D.pathname));if(e===void 0||e.endsWith("/"))return new Response("Bad Request",{status:400});const c=U.find(a=>e.startsWith(`${a}/`));if(c===void 0)return new Response("Not found",{status:404});const d=c===g,o=e.slice(c.length),p=t.extname(o);if(!(d?W:G).includes(p))return new Response("Not found",{status:404});const{rbac:h={},requiresLogin:P=!1}=n.config.access||{};if(!T(e,h,P,{isAuthenticated:r,email:m,teams:f}))return new Response("Unauthorized",{status:r?403:401});const l=s.props?.outdir||"";if(d){const a=t.join(l,A,o);if(!u(a))return new Response("Not found",{status:404});const L=await w(a,"utf-8");return new Response(L,{headers:{"Content-Type":"application/graphql"}})}const R=t.join(l,A,S(o,".json")),E=t.join(l,x,S(o,".json")),N=u(R),_=u(E);if(!N&&!_)return new Response("Not found",{status:404});const y=await w(N?R:E,"utf-8"),F=JSON.parse(y),I=C(F,{isAuthenticated:r,email:m,teams:f},h,P),O=p===".yaml"?q.dump(I):JSON.stringify(I,null,2);return new Response(O,{headers:{"Content-Type":p===".yaml"?"application/yaml":"application/json"}})};var Z=X;export{Z as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{writeFileSync as
|
|
1
|
+
import{writeFileSync as D}from"node:fs";import L from"path";import{SCORECARD_CLASSIC_FOLDER as P,SCORECARD_OUTPUT_FILE_NAME as w}from"../../constants/common.js";import{mapObject as E}from"../../../utils/object/map-object.js";import{envConfig as j}from"../../config/env-config.js";import{removeLeadingSlash as _}from"../../../utils/url/remove-leading-slash.js";import{combineUrls as O}from"@redocly/theme/core/utils";import{logger as F}from"../../tools/notifiers/logger.js";import{getRouteSlugToCatalogSlugMap as N}from"../../utils/catalog-classic/get-route-slug-to-catalog-slug-map.js";import{getCatalogSharedDataId as q}from"../../utils/catalog-classic/get-catalog-shared-data-id.js";import{deepEqual as I}from"../../../utils/object/deep-equal.js";import{ensureDir as U}from"../../utils/index.js";import{getTemplatePath as k}from"./get-template-path.js";import{getAllRuleNames as M}from"./lint.js";import{getScorecardConfig as T}from"./get-scorecard-config.js";import{getScorecardSlug as W}from"./shared-utils.js";import{scorecardConfigLoader as B}from"./loaders/scorecard-config.js";import{scorecardLoader as J}from"./loaders/scorecard.js";import{computeScorecard as $}from"./compute-scorecard.js";import{telemetryTraceStep as x}from"../../../cli/telemetry/helpers/trace-step.js";const G="scorecardClassic";let u={},R={};async function ge({id:b,requiredEntitlements:A,loadersPrefix:v=""}){let p=null,y=null,h=!1;return{id:b??"scorecardClassic",requiredEntitlements:A??["scorecard"],loaders:{[`${v}scorecard-config`]:B,[`${v}scorecard`]:J},async processContent(r,l){await x("com.redocly.build.plugin.scorecardClassic",async C=>{const a=r.createTemplate(G,k("./template/index.js")),g=await l.getConfig(),m=T(g),f=g?.reunite??{},i=[()=>p===null,()=>!I(u,m),()=>!I(R,f)].some(e=>e());u=m,C?.setAttribute("config",JSON.stringify(u||{})),R=f;const n=g.catalogClassic??{},c=u.levels||[];if(c.length<1)throw Error("Invalid configuration of levels config");i&&(p=await $({actions:r,context:l,scorecardConfig:u,reuniteConfig:R}));const{data:{configs:t}}=await l.cache.load("",`${v}scorecard-config`),{perLevel:d,all:s}=M(t);y={levelNames:c.map(e=>e.name),rules:s,rulesPerLevel:d};for(const[e,o]of Object.entries(n)){const S=O(o.slug,"scorecard/");r.addRoute({duplicateInAllLocales:!0,slug:S,fsPath:O(o.slug,"scorecard/"),templateId:a,hasClientRoutes:!0,excludeFromSidebar:!0,serverPropsGetterIds:[],sharedData:[{id:"scorecard",key:"scorecard"},{key:"catalog",id:q(e)}],getNavText:()=>Promise.resolve(o.title||"API design scorecard"),getStaticData:async()=>({props:{catalogId:e,catalogConfig:{...o,items:void 0},scorecardConfig:u,scorecardInfo:y}})})}})},afterRoutesCreated:async(r,l)=>{const C=await l.getConfig(),a=C.catalogClassic??{},g=T(C);if(Object.keys(a).length){const i=Object.keys(a).length>1?await N(r,l,a):null,n={};for(const[c,t]of Object.entries(p||{})){const d=r.getRouteByFsPath(c),s=d?.slug;if(s){if(d&&!g.ignoreMetadata){const e=i?i.get(s)??Object.values(a)[0].slug:Object.values(a)[0].slug,o=O(e,"scorecard/");d.metadata={...d.metadata,scorecardStatus:t.status,scorecardLevel:t.scorecardLevel,scorecardLevelIdx:t.scorecardLevelIdx,scorecardLevels:E(t.levels,S=>({uniqueErrors:S.uniqueErrors,uniqueWarnings:S.uniqueWarnings})),scoreCardSlug:o+"apis/"+encodeURIComponent(_(s))}}if(n[s]={...t,levels:E(t.levels,e=>({...e,problems:e.problems.map(o=>({ruleId:o.ruleId,severity:o.severity}))}))},!h){const e=L.resolve(r.outdir,P,W(s));D(U(e),JSON.stringify(t))}}}await r.createSharedData("scorecard",n)}const m={};for(const[i,n]of Object.entries(p||{})){const c=r.getRouteByFsPath(i)?.slug;c&&(m[c]=n)}const f=j.REDOCLY_METADATA_OUTPUT_FOLDER;!h&&f&&(F.info("Writing scorecard data..."),D(L.join(f,w),JSON.stringify({scorecardData:m,...y}))),h=!0}}}export{ge as scorecardClassicPlugin};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
import{removeTrailingSlash as o}from"../../../utils/url/remove-trailing-slash.js";function s(r){const e={error:new Set,warn:new Set};for(const n of r)e[n.severity]?.add(n.ruleId);return{errors:e.error.size,warnings:e.warn.size}}function i(r){return r==="/"?"index.json":o(r).substring(1)+".json"}export{i as getScorecardSlug,s as getUniqueProblemsCount};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as e from"react";import{useCallback as H,useMemo as b,useState as G,useEffect as _}from"react";import{useLocation as T}from"react-router";import{Flex as U}from"@redocly/portal-legacy-ui";import{Button as x}from"@redocly/theme/components/Button/Button";import{AddIcon as I}from"@redocly/theme/icons/AddIcon/AddIcon";import{SubtractIcon as K}from"@redocly/theme/icons/SubtractIcon/SubtractIcon";import{ArrowLeftIcon as D}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{getScorecardColorVariable as z,withoutPathPrefix as O}from"@redocly/theme/core/utils";import{Link as w}from"../../../../client/app/Link";import J from"../../../../client/app/CircularProgress";import{isDefined as R}from"../../../../utils/guards/is-defined.js";import{removeLeadingSlash as N}from"../../../../utils/url/remove-leading-slash.js";import{StatusByLevelWidget as Q}from"./StatusByLevelWidget";import{OTHER_TEAMS_LABEL as X,NON_CONFORMANT as Y}from"./utils";import{LevelIndicator as Z}from"./LevelIndicator";import{AppPageWrapper as V,CardValue as v,CardsWrapper as j,CatalogDescription as ee,ModeSwitcherTab as te,ModeSwitcherTabs as re,CardRow as B,ProblemsByStatusCardBody as W,ScoreCardStatusCardBody as F,TableWrap as ne,LevelComplianceCardTitle as le,ContentWithDotWrap as C,ScorecardCard as A,ScorecardCardTitle as L,LinkButton as ae}from"./index.styles";import{ApiLevel as M,InstanceStatus as k,LevelStatus as
|
|
1
|
+
import*as e from"react";import{useCallback as H,useMemo as b,useState as G,useEffect as _}from"react";import{useLocation as T}from"react-router";import{Flex as U}from"@redocly/portal-legacy-ui";import{Button as x}from"@redocly/theme/components/Button/Button";import{AddIcon as I}from"@redocly/theme/icons/AddIcon/AddIcon";import{SubtractIcon as K}from"@redocly/theme/icons/SubtractIcon/SubtractIcon";import{ArrowLeftIcon as D}from"@redocly/theme/icons/ArrowLeftIcon/ArrowLeftIcon";import{getScorecardColorVariable as z,withoutPathPrefix as O}from"@redocly/theme/core/utils";import{Link as w}from"../../../../client/app/Link";import J from"../../../../client/app/CircularProgress";import{isDefined as R}from"../../../../utils/guards/is-defined.js";import{removeLeadingSlash as N}from"../../../../utils/url/remove-leading-slash.js";import{StatusByLevelWidget as Q}from"./StatusByLevelWidget";import{OTHER_TEAMS_LABEL as X,NON_CONFORMANT as Y}from"./utils";import{LevelIndicator as Z}from"./LevelIndicator";import{AppPageWrapper as V,CardValue as v,CardsWrapper as j,CatalogDescription as ee,ModeSwitcherTab as te,ModeSwitcherTabs as re,CardRow as B,ProblemsByStatusCardBody as W,ScoreCardStatusCardBody as F,TableWrap as ne,LevelComplianceCardTitle as le,ContentWithDotWrap as C,ScorecardCard as A,ScorecardCardTitle as L,LinkButton as ae}from"./index.styles";import{ApiLevel as M,InstanceStatus as k,LevelStatus as q,RuleStatus as $}from"./components";import{Grid as S}from"./Grid/Grid";import{useDetailedScorecard as se}from"./useDetailedScorecard";import{Gauge as ce,GaugeValue as oe}from"./Gauge";function Ie(p){const u=T(),{data:d,levelNames:i,hasPublishedAt:n,hasTeam:s,teamLabel:l}=p,f=H((a,o,E)=>{const g=a.getValue(E)?new Date(a.getValue(E)).getTime():0,t=o.getValue(E)?new Date(o.getValue(E)).getTime():0;return g>t?1:-1},[]),m=b(()=>[{id:"title",header:"API",accessorKey:"api.title",size:200,cell:({getValue:a,row:o})=>e.createElement(w,{to:O(u.pathname)+"/apis/"+encodeURIComponent(N(o.original.api.link))},a())},n?{header:"Published at",accessorKey:"api.publishedAt",sortingFn:f,cell:({getValue:a})=>{const o=a();return o?new Date(o).toLocaleDateString():"-"}}:void 0,s?{header:l,accessorKey:"api.team"}:void 0,{id:"level",header:"Level",accessorKey:"scorecard.scorecardLevel",cell:({getValue:a,row:o})=>e.createElement(M,{level:a(),colorVariable:z(o.original?.scorecard.scorecardLevelIdx,i.length+1)})},...i.map(a=>({id:a,header:`${a}`,accessorKey:"scorecard.levels",cell:({getValue:o,row:E})=>{const g=o(),t=E.original.api.link;return g?.[a]?e.createElement(Z,{key:t,uniqueErrors:g[a].uniqueErrors,uniqueWarnings:g[a].uniqueWarnings,id:t}):null}}))].filter(R),[f,i,u.pathname,n,s,l]);return e.createElement(S,{columns:m,data:d,sortBy:[{id:"title",desc:!1}]})}function Ke(p){const u=T(),{data:d}=p,i=b(()=>[{header:"Rules",accessorKey:"ruleId",cell:({getValue:n})=>e.createElement(w,{to:O(u.pathname)+"/rules/"+encodeURIComponent(n())},n())},{id:"status",header:"Status",accessorKey:"status",size:200,cell:({row:n})=>e.createElement($,{errors:n.original.errorApisCount,warnings:n.original.warningApisCount})},{header:"Problem APIs",size:200,accessorKey:"apis",cell:({getValue:n})=>n().length,sortDescFirst:!0},{header:"Problem count",size:200,accessorKey:"count",sortDescFirst:!0}],[u.pathname]);return e.createElement(S,{columns:i,data:d,sortBy:[{id:"status",desc:!0}]})}function De(p){const{data:u,levelNames:d,filters:i,setActiveTab:n,teamLabel:s,teamProperty:l}=p,f=b(()=>[{id:"team",header:`API ${s}`,accessorKey:"team",size:200,cell:({getValue:m})=>e.createElement(ae,{onClick:()=>{n("apis"),i.find(a=>a.property===l)?.selectOption(m())}},m())},...[Y,...d].map(m=>({id:m,header:`${m}`,accessorFn:a=>a.levels[m]?.apis}))],[i,d,n,s,l]);return e.createElement(S,{columns:f,data:u,sortBy:[{id:"team",desc:!1}],groupHeaderTitle:"APIs by level"})}function ie(p){const{data:u,title:d}=p,i=b(()=>[{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:n})=>n.getCanExpand()?e.createElement(x,{onClick:n.getToggleExpandedHandler(),variant:"text",size:"medium",icon:n.getIsExpanded()?e.createElement(K,null):e.createElement(I,null)}):null},{header:"Rules",accessorKey:"ruleId",cell:({getValue:n,row:s})=>s.getCanExpand()?e.createElement("span",{onClick:s.getToggleExpandedHandler()},n()):null},{header:"Status",accessorKey:"status",size:200,cell:({getValue:n})=>{const s=n();return e.createElement($,{errors:s?.errorsCount,warnings:s?.warningsCount})},enableSorting:!1},{header:"Problem count",accessorKey:"problemsCount",size:200,sortDescFirst:!0}],[]);return e.createElement(S,{columns:i,data:u,sortBy:[{id:"ruleId",desc:!1}],empty:e.createElement(e.Fragment,null,"\u2705 This API is compliant with ",e.createElement("strong",null,d)," level rules"),subRowKey:"problems"})}function ze(p){const{catalogSlug:u,slug:d,data:i,hasTeam:n,hasPublishedAt:s,teamLabel:l}=p,{apis:f,apisCount:m,warningApisCount:a,errorApisCount:o,levels:E,count:g}=i,t=f.length===0,h=t?void 0:{id:"expand",maxSize:40,size:40,header:()=>null,enableSorting:!1,cell:({row:r})=>r.getCanExpand()?e.createElement(x,{onClick:r.getToggleExpandedHandler(),variant:"text",size:"medium",icon:r.getIsExpanded()?e.createElement(K,null):e.createElement(I,null)}):null},P=b(()=>[h,{header:"API",accessorKey:"title"},s?{header:"Published at",accessorKey:"publishedAt",cell:({getValue:r})=>{const c=r();return c?new Date(c).toLocaleDateString():"-"}}:void 0,n?{header:l,accessorKey:"team",cell:({getValue:r})=>r()||X}:void 0,{header:"Problem count",size:200,accessorKey:"count",cell:({getValue:r})=>r()||0,sortDescFirst:!0}].filter(R),[n,s,l,t]),y=b(()=>Object.entries(i.teams).sort((r,c)=>c[1]-r[1]),[i.teams]);return e.createElement(V,null,e.createElement(x,{icon:e.createElement(D,null),iconPosition:"left",variant:"ghost",size:"large",to:`${u}scorecard`},"Back to dashboard"),e.createElement("h1",null,"Rule ",d),e.createElement(j,null,e.createElement(A,null,e.createElement(L,null,"Rule status"),e.createElement(F,null,e.createElement("div",null,e.createElement(v,null,m),e.createElement("br",null),"APIs"),e.createElement("div",null,e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},m-a-o),e.createElement(k,{severity:"Pass"})),e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},a),e.createElement(k,{severity:"Warn"})),e.createElement(C,null,e.createElement(v,{style:{textAlign:"right"}},o),e.createElement(k,{severity:"Error"}))))),e.createElement(A,null,e.createElement(L,null,"Problems by level"),e.createElement(W,null,Object.entries(E).map(([r,c])=>e.createElement(B,{key:r},e.createElement("span",null,r),e.createElement(ce,{chunks:[{share:c.errors/g*100,colorVariable:"--scorecard-color-error"},{share:c.warnings/g*100,colorVariable:"--scorecard-color-warning"}]}),e.createElement(oe,null,c.errors+c.warnings))))),e.createElement(A,null,e.createElement(L,null,`Problems by ${l}`),e.createElement(W,null,y.slice(0,4).map(([r,c])=>e.createElement(B,{key:r},e.createElement("span",{style:{flex:1,textAlign:"left"}},r),e.createElement(v,null,c)))))),e.createElement(S,{columns:P,data:f,sortBy:[{id:"title",desc:!1}],subRowKey:"problems",slug:d}))}function Oe(p){const{slug:u,api:d,teamLabel:i,catalogSlug:n}=p,{api:s}=d||{},{scorecard:l,isLoading:f}=se(u),m=l?.levels||{},[a,o]=G(Object.keys(m)[0]),E=b(()=>s?.publishedAt instanceof Date?s?.publishedAt.toLocaleDateString():s?.publishedAt,[s]);_(()=>{if(l){const t=l.levels||{};o(Object.keys(t)[0])}},[l]);const g=b(()=>{if(!l?.levels)return{};const t={};for(const h of Object.keys(l.levels)){const P=l.levels[h].problems.reduce((y,r)=>(y[r.ruleId]||(y[r.ruleId]=[]),y[r.ruleId].push(r),y),{});t[h]=Object.entries(P).map(([y,r])=>({ruleId:y,problems:[...r.filter(c=>c.severity==="error"),...r.filter(c=>c.severity==="warn")],problemsCount:r.length,status:{errorsCount:r.filter(c=>c.severity==="error").length,warningsCount:r.filter(c=>c.severity==="warn").length}}))}return t},[l?.levels]);return f?e.createElement(U,{justifyContent:"center",mt:"2em"},e.createElement(J,null)):l?e.createElement(V,null,e.createElement(x,{icon:e.createElement(D,null),iconPosition:"left",variant:"ghost",size:"large",to:`${n}scorecard`},"Back to dashboard"),e.createElement("h1",null,s?.title||u),e.createElement(ee,null,E&&e.createElement(e.Fragment,null,"Published at: ",E,e.createElement("br",null)),e.createElement(w,{to:u,external:!0},"Documentation")),e.createElement(j,null,e.createElement(A,null,e.createElement(le,null,e.createElement("span",null,"Scorecard level"),e.createElement(M,{level:l.scorecardLevel,colorVariable:z(l.scorecardLevelIdx,Object.keys(m).length)})),e.createElement(F,null,e.createElement("div",null,"Compliance by level"),e.createElement("div",null,Object.entries(l.levels).map(([t,h])=>e.createElement(C,{key:t},e.createElement(v,{style:{width:"100px",textAlign:"right"}},t),e.createElement(q,{errors:h.errors,warnings:h.warnings})))))),e.createElement(Q,{title:"Rules compliance",levels:Object.entries(l.levels).map(([t,h])=>({errors:h.uniqueErrors,warnings:h.uniqueWarnings,total:p.rulesPerLevel[t].length,name:t}))}),e.createElement(A,null,e.createElement(L,null,i),e.createElement(v,{style:{fontWeight:"normal"}},s?.team))),e.createElement(re,{style:{justifyContent:"flex-start"},"data-component-name":"Scorecard/ModeSwitcherTabs"},Object.keys(l.levels).map(t=>e.createElement(te,{"data-component-name":"Scorecard/ModeSwitcherTab",key:t,isActive:a===t,onClick:()=>o(t)},e.createElement(C,null,e.createElement("span",null,t)," ",e.createElement(q,{errors:l.levels[t].errors,warnings:l.levels[t].warnings}))))),Object.keys(m).map(t=>e.createElement(ne,{key:t,isActive:a===t},e.createElement(ie,{title:t,data:g[t]})))):e.createElement("div",null,"Scorecard not found")}export{Ie as ApiListView,Oe as ApiPage,ie as ApiView,ze as RuleView,Ke as RulesView,De as TeamsView};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{appendFile as T}from"node:fs/promises";import{existsSync as P}from"node:fs";import b from"node:path";import{Client as q}from"typesense";import{SEARCH_GROUP_FACET_FIELD as F,SEARCH_PRODUCT_FIELD as L,SEARCH_RBAC_FIELD as d,SEARCH_VERSION_FIELD as h}from"../../../../../constants/common.js";import{DISABLE_DEEP_LINK_IF_FIELDS_EXIST as v,HIGHLIGHTED_TEXT_MAX_LENGTH as C,SEARCH_DATA_EXPORT_FOLDER as R,SEARCH_DOCUMENT_METADATA_KEY as j,SEARCH_GROUP_LIMIT as O,SEARCH_MAX_FACET_VALUES as y,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as k}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as N}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as _}from"../../../../config/env-config.js";import{logger as I}from"../../../../tools/notifiers/logger.js";import{ensureDir as E}from"../../../../utils/index.js";class X{#e=null;#i="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"deprecated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:"parameters.name",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"parameters.description",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"parameters.place",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"parameters.path",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:L,type:"string",facet:!0,optional:!0},{name:h,type:"object",facet:!0,optional:!0},{name:d,type:"string[]",facet:!0},{name:"metadata_curated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_excludes",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_includes",type:"string[]",facet:!1,optional:!0,queryable:!1}];#s=new Map;#r={ORGANIZATION_ID:_.ORGANIZATION_ID??"",PROJECT_ID:_.PROJECT_ID??"",TYPESENSE_API_URL:_.TYPESENSE_API_URL??"",TYPESENSE_API_KEY:_.TYPESENSE_API_KEY??""};constructor(){if(!_.isBuildMode){for(const[e,t]of Object.entries(this.#r))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#i=`${this.#r.ORGANIZATION_ID}_${this.#r.PROJECT_ID}_`,this.#e=new q({nodes:[{url:this.#r.TYPESENSE_API_URL}],apiKey:this.#r.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#b(e)}async addDocuments(e,t){const{locale:s,outDir:a}=t,n=e.map(r=>{const i={...r},c=r[j];return c&&(c.curated&&(i.metadata_curated=c.curated),c.excludes&&(i.metadata_keywords_excludes=c.excludes),c.includes&&(i.metadata_keywords_includes=c.includes)),i}),o=this.#s.get(s)??[];this.#s.set(s,o.concat(n)),o.length+e.length>=k&&await this.exportDocuments(a)}async search(e,t){return await N("com.redocly.search.performed",async s=>{s?.setAttribute("id","searchQueryId"),s?.setAttribute("object","searchQuery"),s?.setAttribute("uri","urn:redocly:realm:api:searchQuery:searchQueryId");const{query:a,locale:n,filter:o,loadMore:r}=e,i=this.#f(n),c={collection:i,q:a||"*",query_by:this.#h(),max_facet_values:y};if(s?.setAttribute("collectionName",i),s?.setAttribute("locale",n),this.#e)if(r){const{groupKey:l,offset:u}=r,f={offset:u,filter_by:this.#n(t,o),facet_by:"*",per_page:O};return s?.setAttribute("isLoadMore",!0),s?.setAttribute("filter",f.filter_by),this.#d(await this.#e.collections(i).documents().search({...c,...f}),l)}else{const l=this.#n(t,o);s?.setAttribute("filter",l);const u=await this.#e.multiSearch.perform({searches:this.#F(t,o)},c),f=this.#c(u,this.#o());f&&I.warn("Search facet requests failed: %s",f);const p=this.#y(u),m=(p[F]??[]).map(A=>A.value);s?.setAttribute("groups",m.join(",")),m.length===y&&I.warn("Search category facet list reached the limit of %s; results for some categories may be missing",y);const D=[...new Set(this.#m(o))].slice(0,y),g=D.length?D:m;if(!g.length)return{facets:p,documents:{},groupCounts:{}};const S=await this.#e.multiSearch.perform({searches:g.map(A=>({filter_by:`${l} && (${F}:=${this.#a(A)})`,per_page:O}))},c),$=this.#c(S,g);return $&&I.warn("Search category requests failed: %s",$),this.#_(S,g,p,o)}else return{facets:{},documents:{}}})}#d(e,t){const s={facets:{},documents:{[t]:[]},groupCounts:typeof e.found=="number"?{[t]:e.found}:{}};if(e.hits&&e.hits.length)for(const a of e.hits)s.documents[t].push({document:this.#l(a),highlight:this.#u(a)});return s}#y(e){const t={};if("results"in e){for(const s of e.results)if(s.facet_counts&&s.facet_counts.length)for(const a of s.facet_counts)t[a.field_name]=a.counts.map(n=>({value:n.value,count:n.count}))}return t}#c(e,t){return"results"in e?e.results.map((s,a)=>({result:s,label:t[a]})).filter(({result:s})=>"error"in s).map(({result:s,label:a})=>`${a}: ${s.error}`).join("; "):""}#_(e,t,s,a){const n={},o={facets:s,documents:{},groupCounts:n};for(const r of this.#m(a))o.documents[r]=[];return"results"in e&&e.results.forEach((r,i)=>{const c=t[i];typeof r.found=="number"&&(n[c]=r.found);const l=r.hits??[];l.length&&(o.documents[c]=l.map(u=>({document:this.#l(u),highlight:this.#u(u)})))}),o}#l(e){return this.#g(e)}#u(e){const t={},s=[];for(const[a,n]of Object.entries(e.highlight??{}))if(Array.isArray(n)){if(a==="path"){const o=n,r=[];for(const i of o)r.push(i.snippet);t.path=r}else if(a==="parameters"){const o=n;for(const r of o){let i=!1;for(const[c,l]of Object.entries(r))if(c!=="deepLink")if(Array.isArray(l))for(const u of l)u.matched_tokens?.length&&(i=!0);else l.matched_tokens?.length&&(i=!0);if(i){const c={name:r.name?.snippet||"",description:r.description?.snippet||"",place:r.place?.snippet||"",path:r.path?.map(l=>l?.snippet)||[]};t.parameters=[c];break}}}}else t[a]=n.snippet,s.push(a);for(const[a,n]of Object.entries(e.document))!s.includes(a)&&typeof n=="string"&&(t[a]=n.length>C?`${n.substring(0,C)}...`:n);return t.parameters||(t.parameters=[]),t}#g(e){let t;const s=Object.keys(e.highlight??{});for(const n of v)if(s.some(o=>o===n))return e.document;const a=e.highlight?.parameters;if(a){for(const n of a)for(const[o,r]of Object.entries(n))if(o!=="deepLink"){if(Array.isArray(r)){for(const i of r)if(i.matched_tokens?.length){t=n.deepLink?.snippet??t;break}}else if(r.matched_tokens?.length){t=n.deepLink?.snippet??t;break}}}if(t){const n=t.split("#")[1];return{...e.document,url:`${e.document.url}#${n}`}}return e.document}async exportDocuments(e){const t='{"documents":[',s=E(b.join(e,R));for(const[a,n]of this.#s){if(n.length===0)continue;const o=E(b.join(s,`${a}.json`)),r=!P(o),i=JSON.stringify(n).substring(1).slice(0,-1),c=r?t+i:","+i;await T(o,c,{encoding:"utf8"}),this.#s.set(a,[])}}async exportIndexes(e){const t=E(b.join(e,R));for(const s of this.#s.keys()){const a=E(b.join(t,`${s}.json`)),n=`],"schemaFields":${JSON.stringify(this.#t)}}`;await T(a,n,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await N("com.redocly.search.facets",async s=>{s?.setAttribute("id","searchFacetsId"),s?.setAttribute("object","searchFacets"),s?.setAttribute("uri","urn:redocly:realm:api:searchFacets:searchFacetsId");const{locale:a,query:n,facetQuery:o,filter:r,field:i}=e,c=this.#f(a),l={q:n||"*",query_by:this.#h(),facet_by:"*",facet_query:this.#A(o,i),filter_by:this.#n(t,r,i),max_facet_values:y};if(s?.setAttribute("collectionName",c),s?.setAttribute("query",l.q),s?.setAttribute("facetQuery",l.facet_query),s?.setAttribute("filter",l.filter_by),this.#e){const u={},f=await this.#e.collections(c).documents().search(l);if(f.facet_counts&&f.facet_counts.length)for(const p of f.facet_counts)u[p.field_name]=p.counts.map(m=>({value:m.value,count:m.count,isCounterVisible:!!n||(r?.length||0)>0}));return u}else return{}})}#f(e){return`${this.#i}${e}`}#b(e){for(const[t,{queryable:s}]of e)this.#t.find(a=>a.name===t)||this.#t.push({queryable:s,name:t,type:"string",facet:!0,optional:!0})}#h(){return this.#t.filter(e=>e.facet?e.queryable:e.queryable!==!1).map(e=>e.name).join(",")}#a(e){return`\`${e.replaceAll("`","")}\``}#n(e,t,s){const a=e.teams.filter(r=>!r.includes("`")&&!r.includes("*")).map(r=>this.#a(r)),n=a.length?`${d}:=[${a.join(", ")}]`:`${d}:=[\`anonymous\`] && ${d}:!=[\`anonymous\`]`,o=(t??[]).filter(r=>r.field!==s&&r.field!==h&&r.values.length&&this.#p(r.field)).map(r=>{const i=r.values.map(c=>this.#a(c));return`${r.field}:=[${i.join(", ")}]`});return[n,...o,this.#E(t)].map(r=>`(${r})`).join(" && ")}#p(e){return this.#o().includes(e)}#o(){return this.#t.filter(e=>e.facet&&e.name!==d&&e.name===e.name.trim()).map(e=>e.name)}#E(e){const t=e?.find(r=>r.field===h);if(t?.values.length!==2)return`${h}.isDefault:true`;const[s,a]=t.values.map(r=>this.#a(r)),n=`(${h}.folderId:! ${s} && ${h}.isDefault:true)`,o=`(${h}.folderId: ${s} && ${h}.version:=${a})`;return`${n} || ${o}`}#A(e,t){return e&&t&&this.#p(t)?`${t}:${e}`:""}#m(e){const t=[];if(e&&e.length)for(const s of e)s.field===F&&t.push(...s.values);return t}#F(e,t){const s=[];for(const a of this.#o()){const n={facet_by:a,filter_by:this.#n(e,t,a)};s.push(n)}return s}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(s=>{s.values=[]}),e.setSearchFacets(t)}}export{X as Typesense};
|
|
1
|
+
import{appendFile as T}from"node:fs/promises";import{existsSync as P}from"node:fs";import b from"node:path";import{Client as q}from"typesense";import{SEARCH_GROUP_FACET_FIELD as F,SEARCH_PRODUCT_FIELD as L,SEARCH_RBAC_FIELD as d,SEARCH_VERSION_FIELD as h}from"../../../../../constants/common.js";import{DISABLE_DEEP_LINK_IF_FIELDS_EXIST as v,HIGHLIGHTED_TEXT_MAX_LENGTH as C,SEARCH_DATA_EXPORT_FOLDER as R,SEARCH_DOCUMENT_METADATA_KEY as j,SEARCH_GROUP_LIMIT as O,SEARCH_MAX_FACET_VALUES as y,SEARCH_MAX_INMEMORY_DOCUMENTS_COUNT as k}from"../../../../constants/plugins/search.js";import{telemetryTraceStep as N}from"../../../../telemetry/helpers/trace-step.js";import{envConfig as _}from"../../../../config/env-config.js";import{logger as I}from"../../../../tools/notifiers/logger.js";import{ensureDir as E}from"../../../../utils/index.js";class X{#e=null;#i="";#t=[{name:"title",type:"string",facet:!1,optional:!0},{name:"text",type:"string",facet:!1,optional:!0},{name:"path",type:"string[]",facet:!1,optional:!0},{name:"isAdditionalOperation",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"deprecated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"parameters",type:"object[]",facet:!1,optional:!0},{name:"parameters.name",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"parameters.description",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"parameters.place",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"parameters.path",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:L,type:"string",facet:!0,optional:!0},{name:h,type:"object",facet:!0,optional:!0},{name:d,type:"string[]",facet:!0},{name:"metadata_curated",type:"bool",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_excludes",type:"string[]",facet:!1,optional:!0,queryable:!1},{name:"metadata_keywords_includes",type:"string[]",facet:!1,optional:!0,queryable:!1}];#s=new Map;#r={ORGANIZATION_ID:_.ORGANIZATION_ID??"",PROJECT_ID:_.PROJECT_ID??"",TYPESENSE_API_URL:_.TYPESENSE_API_URL??"",TYPESENSE_API_KEY:_.TYPESENSE_API_KEY??""};constructor(){if(!_.isBuildMode){for(const[e,t]of Object.entries(this.#r))if(!t)throw new Error(`Cannot initialize search index. ${e} is not set`);this.#i=`${this.#r.ORGANIZATION_ID}_${this.#r.PROJECT_ID}_`,this.#e=new q({nodes:[{url:this.#r.TYPESENSE_API_URL}],apiKey:this.#r.TYPESENSE_API_KEY,connectionTimeoutSeconds:5})}}async initIndexSchema(e){this.#b(e)}async addDocuments(e,t){const{locale:s,outDir:a}=t,n=e.map(r=>{const i={...r},c=r[j];return c&&(c.curated&&(i.metadata_curated=c.curated),c.excludes&&(i.metadata_keywords_excludes=c.excludes),c.includes&&(i.metadata_keywords_includes=c.includes)),i}),o=this.#s.get(s)??[];this.#s.set(s,o.concat(n)),o.length+e.length>=k&&await this.exportDocuments(a)}async search(e,t){return await N("com.redocly.search.performed",async s=>{s?.setAttribute("id","searchQueryId"),s?.setAttribute("object","searchQuery"),s?.setAttribute("uri","urn:redocly:realm:api:searchQuery:searchQueryId");const{query:a,locale:n,filter:o,loadMore:r}=e,i=this.#f(n),c={collection:i,q:a||"*",query_by:this.#h(),max_facet_values:y};if(s?.setAttribute("collectionName",i),s?.setAttribute("locale",n),this.#e)if(r){const{groupKey:l,offset:u}=r,f={offset:u,filter_by:this.#n(t,o),facet_by:"*",per_page:O};return s?.setAttribute("isLoadMore",!0),s?.setAttribute("filter",f.filter_by),this.#d(await this.#e.collections(i).documents().search({...c,...f}),l)}else{const l=this.#n(t,o);s?.setAttribute("filter",l);const u=await this.#e.multiSearch.perform({searches:this.#F(t,o)},c),f=this.#c(u,this.#o());f&&I.warn("Search facet requests failed: %s",f);const p=this.#y(u),m=(p[F]??[]).map(A=>A.value);s?.setAttribute("groups",m.join(",")),m.length===y&&I.warn("Search category facet list reached the limit of %s; results for some categories may be missing",y);const D=[...new Set(this.#m(o))].slice(0,y),g=D.length?D:m;if(!g.length)return{facets:p,documents:{},groupCounts:{}};const S=await this.#e.multiSearch.perform({searches:g.map(A=>({filter_by:`${l} && (${F}:=${this.#a(A)})`,per_page:O}))},c),$=this.#c(S,g);return $&&I.warn("Search category requests failed: %s",$),this.#_(S,g,p,o)}else return{facets:{},documents:{}}})}#d(e,t){const s={facets:{},documents:{[t]:[]},groupCounts:typeof e.found=="number"?{[t]:e.found}:{}};if(e.hits&&e.hits.length)for(const a of e.hits)s.documents[t].push({document:this.#l(a),highlight:this.#u(a)});return s}#y(e){const t={};if("results"in e){for(const s of e.results)if(s.facet_counts&&s.facet_counts.length)for(const a of s.facet_counts)t[a.field_name]=a.counts.map(n=>({value:n.value,count:n.count}))}return t}#c(e,t){return"results"in e?e.results.map((s,a)=>({result:s,label:t[a]})).filter(({result:s})=>"error"in s).map(({result:s,label:a})=>`${a}: ${s.error}`).join("; "):""}#_(e,t,s,a){const n={},o={facets:s,documents:{},groupCounts:n};for(const r of this.#m(a))o.documents[r]=[];return"results"in e&&e.results.forEach((r,i)=>{const c=t[i];typeof r.found=="number"&&(n[c]=r.found);const l=r.hits??[];l.length&&(o.documents[c]=l.map(u=>({document:this.#l(u),highlight:this.#u(u)})))}),o}#l(e){return this.#g(e)}#u(e){const t={},s=[];for(const[a,n]of Object.entries(e.highlight??{}))if(Array.isArray(n)){if(a==="path"){const o=n,r=[];for(const i of o)r.push(i.snippet);t.path=r}else if(a==="parameters"){const o=n;for(const r of o){let i=!1;for(const[c,l]of Object.entries(r))if(c!=="deepLink")if(Array.isArray(l))for(const u of l)u.matched_tokens?.length&&(i=!0);else l.matched_tokens?.length&&(i=!0);if(i){const c={name:r.name?.snippet||"",description:r.description?.snippet||"",place:r.place?.snippet||"",path:r.path?.map(l=>l?.snippet)||[]};t.parameters=[c];break}}}}else t[a]=n.snippet,s.push(a);for(const[a,n]of Object.entries(e.document))!s.includes(a)&&typeof n=="string"&&(t[a]=n.length>C?`${n.substring(0,C)}...`:n);return t.parameters||(t.parameters=[]),t}#g(e){let t;const s=Object.keys(e.highlight??{});for(const n of v)if(s.some(o=>o===n))return e.document;const a=e.highlight?.parameters;if(a){for(const n of a)for(const[o,r]of Object.entries(n))if(o!=="deepLink"){if(Array.isArray(r)){for(const i of r)if(i.matched_tokens?.length){t=n.deepLink?.snippet??t;break}}else if(r.matched_tokens?.length){t=n.deepLink?.snippet??t;break}}}if(t){const n=t.split("#")[1];return{...e.document,url:`${e.document.url}#${n}`}}return e.document}async exportDocuments(e){const t='{"documents":[',s=E(b.join(e,R));for(const[a,n]of this.#s){if(n.length===0)continue;const o=E(b.join(s,`${a}.json`)),r=!P(o),i=JSON.stringify(n).substring(1).slice(0,-1),c=r?t+i:","+i;await T(o,c,{encoding:"utf8"}),this.#s.set(a,[])}}async exportIndexes(e){const t=E(b.join(e,R));for(const s of this.#s.keys()){const a=E(b.join(t,`${s}.json`)),n=`],"schemaFields":${JSON.stringify(this.#t)}}`;await T(a,n,{encoding:"utf8"})}}async import(e){}async countFacets(e,t){return await N("com.redocly.search.facets",async s=>{s?.setAttribute("id","searchFacetsId"),s?.setAttribute("object","searchFacets"),s?.setAttribute("uri","urn:redocly:realm:api:searchFacets:searchFacetsId");const{locale:a,query:n,facetQuery:o,filter:r,field:i}=e,c=this.#f(a),l={q:n||"*",query_by:this.#h(),facet_by:"*",facet_query:this.#A(o,i),filter_by:this.#n(t,r,i),max_facet_values:y,per_page:0};if(s?.setAttribute("collectionName",c),s?.setAttribute("query",l.q),s?.setAttribute("facetQuery",l.facet_query),s?.setAttribute("filter",l.filter_by),this.#e){const u={},f=await this.#e.collections(c).documents().search(l);if(f.facet_counts&&f.facet_counts.length)for(const p of f.facet_counts)u[p.field_name]=p.counts.map(m=>({value:m.value,count:m.count,isCounterVisible:!!n||(r?.length||0)>0}));return u}else return{}})}#f(e){return`${this.#i}${e}`}#b(e){for(const[t,{queryable:s}]of e)this.#t.find(a=>a.name===t)||this.#t.push({queryable:s,name:t,type:"string",facet:!0,optional:!0})}#h(){return this.#t.filter(e=>e.facet?e.queryable:e.queryable!==!1).map(e=>e.name).join(",")}#a(e){return`\`${e.replaceAll("`","")}\``}#n(e,t,s){const a=e.teams.filter(r=>!r.includes("`")&&!r.includes("*")).map(r=>this.#a(r)),n=a.length?`${d}:=[${a.join(", ")}]`:`${d}:=[\`anonymous\`] && ${d}:!=[\`anonymous\`]`,o=(t??[]).filter(r=>r.field!==s&&r.field!==h&&r.values.length&&this.#p(r.field)).map(r=>{const i=r.values.map(c=>this.#a(c));return`${r.field}:=[${i.join(", ")}]`});return[n,...o,this.#E(t)].map(r=>`(${r})`).join(" && ")}#p(e){return this.#o().includes(e)}#o(){return this.#t.filter(e=>e.facet&&e.name!==d&&e.name===e.name.trim()).map(e=>e.name)}#E(e){const t=e?.find(r=>r.field===h);if(t?.values.length!==2)return`${h}.isDefault:true`;const[s,a]=t.values.map(r=>this.#a(r)),n=`(${h}.folderId:! ${s} && ${h}.isDefault:true)`,o=`(${h}.folderId: ${s} && ${h}.version:=${a})`;return`${n} || ${o}`}#A(e,t){return e&&t&&this.#p(t)?`${t}:${e}`:""}#m(e){const t=[];if(e&&e.length)for(const s of e)s.field===F&&t.push(...s.values);return t}#F(e,t){const s=[];for(const a of this.#o()){const n={facet_by:a,filter_by:this.#n(e,t,a),per_page:0};s.push(n)}return s}cleanupFacetValues(e){const t=e.getSearchFacets();t.forEach(s=>{s.values=[]}),e.setSearchFacets(t)}}export{X as Typesense};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function c(d){let e;try{e=decodeURIComponent(d)}catch{return}return/[\\\0]/.test(e)||e.replace(/\/$/,"").split("/").slice(1).some(t=>t===""||t==="."||t==="..")?void 0:e}export{c as decodeRequestPath};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import n from"path";import{removeLeadingSlash as s}from"../../../utils/url/remove-leading-slash.js";import{fileExistsAsync as l}from"../index.js";async function f(e,o,r){if(r){const t=await r.getPageMarkdown(e);return{exists:t!==void 0,content:t?.content,route:t?.route}}const i=e==="/index.html.md"?"/":e.replace(/\.md$/i,"");return{exists:await l(n.resolve(o.outdir,s(e))),content:void 0,route:o.getRouteBySlug(i,{followRedirect:!1})}}export{f as resolveLlmsTxtMd};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import R from"path";import
|
|
1
|
+
import R from"path";import T from"picomatch";import"../node-crypto-polyfill.js";import{REDOCLY_TEAMS_RBAC as L,REDOCLY_ROUTE_RBAC as A}from"@redocly/config";import{MCP_ROUTE as U,PUBLIC_MCP_ROUTE as k}from"@redocly/theme/core/constants/mcp";import{ServerRoutes as w}from"../../constants/api.js";import{DEFAULT_ANONYMOUS_VISITOR_TEAM as D,PUBLIC_RBAC_SCOPE_ITEM as y,RBAC_ALL_OTHER_TEAMS as l,DEFAULT_RBAC_SCOPE as x,GRAPHQL_SPEC_SLUG as B}from"../../constants/common.js";import{DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as g,PUBLIC_API_DEFINITIONS_FOLDER as C,PUBLIC_ASSETS_FOLDER as b,RUNTIME_RESOURCES_DIR as $,SCORECARD_CLASSIC_FOLDER as W,SITEMAP_FILE_NAME as v,LLMS_TXT_FILE_NAME as Y}from"../constants/common.js";import{MCP_CREDENTIALS_ROUTE as G}from"../constants/mcp.js";import{ANONYMOUS_AUTH_DETAILS as H}from"../constants/rbac.js";import{removeTrailingSlash as P}from"../../utils/url/remove-trailing-slash.js";import{removeLeadingSlash as z}from"../../utils/url/remove-leading-slash.js";import{parsePathVersions as K}from"../../utils/path/parse-path-versions.js";import{reporter as V}from"../tools/notifiers/reporter.js";import{bold as J}from"../tools/notifiers/helpers/colors.js";import{shaDirPathShort as Q}from"../utils/crypto/sha-dir-path-short.js";import{isTruthy as X}from"../../utils/guards/is-truthy.js";import{isPathInFolder as I}from"../../utils/path/is-path-in-folder.js";import{canExpandConfig as Z,expandRbacConfig as q,getTeamFolderDefaults as tt,parseTeamFoldersTemplate as et,parseTeamNameTemplate as rt}from"./rbac-expand.js";import{getUserParamsFromCookies as nt}from"../web-server/auth.js";import{getDeeperGlobPattern as ot}from"./globs.js";import{EntitlementsProvider as st}from"../entitlements/entitlements-provider.js";const j=["NONE","READ","TRIAGE","WRITE","MAINTAIN","ADMIN"],ct=new Set(["x-parsed-md-description","x-parsed-md-summary"]),it=new Set(Object.values(w).map(t=>P(t.split(":")[0])));function wt(t,e){const r=j.indexOf(t.toUpperCase()),n=j.indexOf(e.toUpperCase());return r>n?t:e}const _={};function F(t,e){if(!t?.content)return y;const r=t.content,{slug:n,fsPath:o}=e;if(!n&&!o)return y;const s=a=>{const d=`slug:${a}`,p=_[d]??T(a);_[d]=p;const E=`fsPath:${a}`,S=_[E]??T(z(a));return _[E]=S,!!(n&&p(n))||!!(o&&S(o))};if(ut(n||o||"")&&Object.keys(r).filter(p=>s(p)).length===0)return r[x]||y;const f=Object.keys(r).filter(a=>s(a));if(f.length==0)return y;const u=f.map(a=>T.scan(a,{tokens:!0,parts:!0}));let h=u[0];for(let a=1;a<u.length;a++)h=ot(h,u[a]);return r[h.input]}function N(t,e,r){const n=r?[...e,r]:e,o=[];for(const s of n)t[s]?o.push(t[s]):t[l]&&s!==r&&o.push(t[l]);return o.some(s=>s.toLowerCase()!=="none")}function Bt(t,e,r={},n=!1){if(n&&Object.keys(r).length===0)return e.isAuthenticated;const o=r.features?.[t];return o?N(o,e.teams):!0}function bt(t,e){return O(t,H,e.access?.rbac||{},e.access?.requiresLogin||!1)}function O(t,e={},r={},n=!1){if(t.slug&&typeof t.slug=="string"&&it.has(P(t.slug))||(t.slug===U||t.slug===k||t.slug===G)&&st.instance().canAccessFeature("mcp"))return!0;if(n&&Object.keys(r).length===0)return!!e.isAuthenticated;const o=q(r,e.teams||[]),s=t[L]||F(o,t[A]||{});return Object.keys(s||{}).length===0?!1:Object.keys(s).length===1&&s[l]&&s[l].toLowerCase()!=="none"?!0:N(s,e?.teams||[],e?.email)}function $t(t,e,r,n){if(!t.startsWith(C)&&!t.startsWith(g))return!0;const o=t.replace(new RegExp(`^${C}/`),"").replace(new RegExp(`^${g}/`),"").replace(new RegExp(`^${B}/`),""),c=o==="."?"":o,i={[A]:{slug:t,fsPath:c},slug:t};return O(i,n,e,r)}function Wt(t,e,r,n,o){if(!I(t,b))return[`/${v}`,`/${Y}`].includes(t)||[$,W].some(E=>I(t,E));const s=t.match(/\..{64}\.([A-Fa-f0-9]{8})\.[^.]+$/)?.[1];if(!s)return!0;const c=n[s];if(!c)return!0;const{base:i,ext:f}=R.parse(t),u=i.split(".")[0],h=f.split(".").join(""),d=c==="."?"":c,p={[A]:{slug:t,fsPath:R.posix.join(d,`${u}.${h}`)},slug:t};return O(p,o,e,r)}async function vt(t,e){const{isAuthenticated:r=!1,idpAccessToken:n,federatedAccessToken:o,federatedIdToken:s,...c}=await nt(t,e),{teams:i=[]}=c;let f;return r?f=i.filter(u=>u!==D):f=[D],{isAuthenticated:r,idpAccessToken:n,teams:f,claims:c}}function M(t,e,r={},n=!1){if(!t)return t;if(Array.isArray(t)){const o=[];for(const s of t){const c=M(s,e,r,n);c!==void 0&&o.push(c)}return o}if(typeof t=="object"){if(!O(t,e,r,n))return;let o=!1;const s={};for(const c in t){if(c===L||c===A)continue;if(ct.has(c)){s[c]=t[c];continue}const i=M(t[c],e,r,n);if(!t.link&&(c==="items"||c==="menu"&&t.type==="tab")&&Array.isArray(i)&&i.length===0&&t[c].length!==0){o=!0;continue}i!==void 0&&(s[c]=i),c==="paths"&&at(i)&&ft(i)}return o?void 0:s}return t}function Yt(t){return typeof t=="string"?t.split(" ").filter(Boolean):Array.isArray(t)?t.map(e=>e.toString()):[]}function Gt(t,e){if(!e)return;const r=e.content;if(!r)return e;const n=Object.entries(r).flatMap(([s,c])=>s===x?[[s,c]]:[[s,c]].concat(t.localeFolders.map(i=>[s.startsWith("/")?`/${i.toLocaleLowerCase()}${s}`:R.posix.join(t.localizationFolder,i,s),c]))),o=Object.fromEntries(n);return{...e,content:o}}async function Ht(t,e){if(!e)return{};const r={},n=new Set(t.scan().flatMap(({relativePath:o})=>{const{versionFolderPath:s}=K(o)||{},c=R.dirname(o);return s?[s,c]:c}));for(const o of n)r[Q(o)]=o;return r}const m=t=>typeof t=="object"&&t!==null&&!Array.isArray(t);function at(t){return m(t)&&Object.keys(t).length>0}function ft(t){for(const e of Object.keys(t)){const r=t[e];m(r)&&Object.keys(r).length===0&&delete t[e]}}function ut(t){return t?t.split("/").filter(Boolean).some(r=>r.startsWith(".")):!1}const lt=t=>{if(t&&m(t)&&("content"in t&&m(t.content)||"reunite"in t&&m(t.reunite)||"features"in t&&m(t.features)||t.teamFolders&&t.teamNamePatterns)){const e=Object.values(t.content||{});if(e.length===0)return!0;if(e.every(m))return e.every(r=>Object.values(r).every(n=>typeof n=="string"))}return!1},zt=async t=>{if(t){if(Object.keys(t).length===0)return{};if(lt(t))return mt(t);await V.panicOnContentError(`You are using an incorrect format of ${J("rbac:")} configuration. See: https://redocly.com/docs/realm/access`)}},mt=t=>{const e={...t};if(e.content){const r={};for(const n in e.content)if(e.content[n]!==void 0){const o=P(n);r[o]=e.content[n]}e.content=r}return e};function Kt(t,e){const r=t.fsPath,n=t.slug,o=[],s=Z(e)&&(r||n)?et(e,[r,n].filter(X)):null;if(s){const i=e?.teamNamePatterns?.map(f=>f.replace("{teamPathSegment}",s.teamPathSegment).replace("{projectRole}","read"))??[];o.push(...i)}const c=F(s?{content:{...tt(e),...e.content}}:e,t);return o.push(...pt(c)),ht(e,o)}function pt(t){if(!t)return[];const e=[],r=l in t?{authenticated:t[l],anonymous:t[l]}:{};for(const[n,o]of Object.entries({...r,...t}))o.toLowerCase()!=="none"&&n!==l&&e.push(n);return e}function ht(t,e){return e.map(n=>rt(t,n)??{teamName:n}).map(n=>n.projectRole&&n.projectRole!=="READ"?n.teamName?.toLowerCase().replace(n.projectRole?.toLowerCase?.()??"","read")??"":n.teamName?.toLowerCase()??"")}export{j as PROJECT_ROLES_ORDERED_BY_ACCESS_LEVEL,Gt as applyL10nToRbacConfig,Wt as canAccessAsset,Bt as canAccessFeature,O as canAccessResource,$t as canDownloadApiDefinition,ht as expandTeamsForRead,pt as extractTeamsFromScopeItems,M as filterDataByAccessDeep,vt as getAuthDetailsFromCookies,wt as getHigherRole,Kt as getRbacTeamsListForResource,F as getScopeItemsForResource,N as hasScopeAccess,lt as isRbacConfigValid,bt as isResourcePubliclyAccessible,mt as normalizeRbacConfig,zt as parseRbacConfig,Yt as parseTeamClaimToArray,Ht as resolveDirectoryHashes};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import m from"path";import{realpath as
|
|
1
|
+
import m from"path";import{realpath as G}from"fs/promises";import{REDOCLY_ROUTE_RBAC as z,REDOCLY_TEAMS_RBAC as j}from"@redocly/config";import{combineUrls as V,withoutPathPrefix as ie,withPathPrefix as R}from"@redocly/theme/core/utils";import{CACHE_CONTROL_NO_STORE_HEADER_VALUE as W,CACHE_CONTROL_PUBLIC_HTML as ae,DEFAULT_IMMUTABLE_CACHE_MAX_AGE as se,DEPRECATED_PUBLIC_API_DEFINITIONS_FOLDER as ce,PAGE_DATA_FOLDER as le,PUBLIC_API_DEFINITIONS_FOLDER as me,PUBLIC_ASSETS_FOLDER as ue,STATIC_DATA_FOLDER as de,X_REDOCLY_CACHE_CONTROL_HEADER as fe,X_REDOCLY_CACHE_CONTROL_PUBLIC_HTML as ge}from"../../constants/common.js";import{removeTrailingSlash as Z}from"../../../utils/url/remove-trailing-slash.js";import{findInIterable as pe}from"../../../utils/collection/find-in-iterable.js";import{sanitizeRedirectPathname as he}from"../../../utils/url/sanitize-redirect-pathname.js";import{envConfig as Re}from"../../config/env-config.js";import{addLeadingSlash as Ae}from"../../../utils/url/add-leading-slash.js";import{isPathInFolder as D}from"../../../utils/path/is-path-in-folder.js";import{getLlmsTxtMdPathBySlug as Ee}from"../../utils/llmstxt/get-llms-txt-md-path-by-slug.js";import{resolveLlmsTxtMd as J}from"../../utils/llmstxt/resolve-llms-txt-md.js";import{removeLeadingSlash as I}from"../../../utils/url/remove-leading-slash.js";import{decodeRequestPath as Ce}from"../../utils/decode-request-path.js";import{AI_INDEX_EXPORT_FOLDER as _e,SEARCH_DATA_EXPORT_FOLDER as Le}from"../../constants/plugins/search.js";import{processRedirects as Te}from"./helpers/process-redirects.js";import{renderPage as Pe,getServerProps as Oe}from"../../ssr/index.js";import{canAccessAsset as we,canAccessResource as K}from"../../utils/rbac.js";import{handleErrorPageRender as A,handleUnauthorized as Q,handleUnauthorizedAsset as x}from"../utils.js";import{DEFAULT_MAX_AGE_FOR_MIME_TYPE as De,MIME_TYPES as Ie}from"../mime-types.js";import{fileExistsAsync as Se}from"../../utils/index.js";import{isAiAgentRequest as ye}from"../../utils/ai-agent-detection.js";import{getRedirectRoute as Ue}from"../utils/legacy-openapi-redirects.js";import{getContentTypeHeaderValue as ee}from"../utils/content-type.js";import{telemetry as be}from"../../../cli/telemetry/index.js";import{telemetry as Me}from"../../telemetry/index.js";const Fe=[Le,_e,de,I(me),I(ce),le];async function qe(e,E){try{const[C,u]=await Promise.all([G(e),G(E)]);return Fe.some(t=>D(C,m.join(u,t)))}catch{return!1}}function mt(e,E,C,u){return async t=>{const S=t.get("logger"),i=t.req,c=new URL(i.url),_=c.pathname.replace(/\/{2,}/g,"/"),y=Ce(_);if(y===void 0)return t.text("Bad Request",400);const d=Re.isProductionEnv?301:302;if(_!==c.pathname)return t.newResponse(null,d,{Location:_+c.search});const r=ie(y),U=m.parse(r).ext.toLowerCase()===".md",b=ye({accept:i.header("accept"),signatureAgent:i.header("signature-agent"),signature:i.header("signature"),signatureInput:i.header("signature-input"),userAgent:i.header("user-agent")}),a=Ae(Z(r)),o=(i.method==="GET"||i.method==="HEAD")&&!U?e.getRouteBySlug(a,{followRedirect:!1})||pe(e.routesBySlug?.values(),n=>n.hasClientRoutes&&(r===n.slug||r.startsWith(n.slug+"/"))):void 0,M=e.getRedirect(a);if(M){const n=Te({redirect:M,reqUrlSearch:c.search});return Me.sendRedirectMessage([{id:a,object:"redirect",uri:`urn:redocly:realm:api:redirect:${a}`,from:a,templateId:n.type.toString()}]),t.newResponse(null,n.type,{Location:n.location})}if(o?.metadata?.type==="openapi"){const n=Ue(c.pathname);if(n)return S.info("Legacy OpenAPI docs redirect from "+c.pathname),t.newResponse(null,d,{Location:encodeURI(n)});if(r.match(/[A-Z]/))return S.warn("Redirect to lowercase route to avoid 404 error"),t.newResponse(null,d,{Location:encodeURI(R(r.toLowerCase()))})}if(r.endsWith("/")&&r!=="/"){const n=he(new URL(a||"/",t.req.url).pathname);return t.newResponse(null,d,{Location:R((n==="/"?"/":Z(n))+c.search)})}const{isAuthenticated:f,teams:L,claims:{email:T}}=t.get("auth");if(o&&!K(o,{isAuthenticated:f,email:T,teams:L},e.config.access?.rbac,e.config.access?.requiresLogin))return f?A(t,e,{slug:o.slug,[j]:o[j],[z]:o[z]},403):Q(t,e,o.slug);const g=o&&b?Ee(o.slug):void 0,F=g?await J(g,e,u):void 0,P=F?.exists??!1;if(o&&(!b||!P)){const n=await E(o),N=await Oe(o,t,n,e),{html:ne,statusCode:X,error:oe}=await Pe(o,N,t,e,be),Y=e.config.access?.rbac,$=!e.config.access?.requiresLogin&&(!Y||!Object.keys(Y).length),k=X>=400||!!oe||!!e.compilationErrors?.length,re=$&&!k;let h;return k?h=W:$?h=ae:h="private",t.html(ne,X,{"Cache-Control":h,...re&&{[fe]:ge}})}const p=g&&P?g:r,te=I(p),s=m.resolve(e.outdir,te);if(!D(s,e.outdir))return x(t);const q=U?await J(r,e,u):void 0,l=q?.route;if(l&&!K(l,{isAuthenticated:f,email:T,teams:L},e.config.access?.rbac,e.config.access?.requiresLogin))return Q(t,e,r);if(!P&&!l){if(await qe(s,e.outdir))return A(t,e,{slug:a},404);const n=e.getGlobalConfig("access");if(!we(p,n?.rbac||{},n?.requiresLogin||!1,e.getGlobalConfig("directoryPaths"),{isAuthenticated:f,email:T,teams:L}))return D(p,ue)?x(t):A(t,e,{slug:a},404)}const O=Ie[m.extname(s)]||"text/plain",w=s.match(/assets\/.*\.[a-f0-9]{8,}\..+/)||s.match(/runtime\/chunks\/.*/)?se:De[O],H=w?{"Cache-Control":`public, max-age=${w}, immutable`,Expires:new Date(Date.now()+w*1e3).toUTCString()}:{"Cache-Control":W},B=i.query("download")!=null,v=F?.content??q?.content;if(v!==void 0)return t.newResponse(v,200,{"Content-Type":ee(O),"Access-Control-Allow-Origin":"*",...H,...l&&{"X-Robots-Tag":"noindex, follow",...e.config.seo?.siteUrl&&{Link:`<${V(e.config.seo.siteUrl,R(l.slug))}>; rel="canonical"`}},...B&&{"Content-Disposition":`attachment; filename="${m.basename(p)}"`}});if(await Se(s)){const n=await C(s);return t.newResponse(n,200,{"Content-Type":ee(O),"Access-Control-Allow-Origin":"*",...H,...l&&{"X-Robots-Tag":"noindex, follow",...e.config.seo?.siteUrl&&{Link:`<${V(e.config.seo.siteUrl,R(l.slug))}>; rel="canonical"`}},...B&&{"Content-Disposition":`attachment; filename="${m.basename(s)}"`}})}else return A(t,e,{slug:a},404)}}export{mt as dynamicRouteHandler};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{removeTrailingSlash as
|
|
1
|
+
import{removeTrailingSlash as i}from"../../../../utils/url/remove-trailing-slash.js";import{isLocalLink as e}from"../../../../utils/path/is-local-link.js";import{withPathPrefix as r}from"@redocly/theme/core/utils";function m({redirect:o,reqUrlSearch:t=""}){const n=e(o.to)?r(o.to):o.to;return{location:a(i(n))+t,type:o?.type||301}}function a(o){return encodeURI(o).replace(/%25([0-9A-Fa-f]{2})/g,"%$1")}export{m as processRedirects};
|