@redocly/realm 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 +220 -204
- 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/realm
|
|
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
|
|
@@ -3075,29 +3091,6 @@
|
|
|
3075
3091
|
- @redocly/realm-asyncapi-sdk@0.9.0-next.2
|
|
3076
3092
|
- @redocly/theme@0.63.0-next.3
|
|
3077
3093
|
|
|
3078
|
-
## 0.130.4
|
|
3079
|
-
|
|
3080
|
-
### Patch Changes
|
|
3081
|
-
|
|
3082
|
-
- 5b1e533559: Fixed security vulnerability CVE-2026-25128 in fast-xml-parser by upgrading openapi-sampler to version 1.7.0.
|
|
3083
|
-
- Updated dependencies [5b1e533559]
|
|
3084
|
-
- @redocly/portal-plugin-mock-server@0.15.2
|
|
3085
|
-
- @redocly/asyncapi-docs@1.7.2
|
|
3086
|
-
- @redocly/openapi-docs@3.18.2
|
|
3087
|
-
- @redocly/theme@0.62.1
|
|
3088
|
-
- @redocly/graphql-docs@1.7.1
|
|
3089
|
-
|
|
3090
|
-
## 0.130.3
|
|
3091
|
-
|
|
3092
|
-
### Patch Changes
|
|
3093
|
-
|
|
3094
|
-
- 0beb1adad0: Fixed a bug where AI search events were not tracked for project analytics.
|
|
3095
|
-
- Updated dependencies [e7708a15f1]
|
|
3096
|
-
- Updated dependencies [e7708a15f1]
|
|
3097
|
-
- @redocly/portal-plugin-mock-server@0.15.1
|
|
3098
|
-
- @redocly/asyncapi-docs@1.7.1
|
|
3099
|
-
- @redocly/openapi-docs@3.18.1
|
|
3100
|
-
|
|
3101
3094
|
## 0.131.0-next.6
|
|
3102
3095
|
|
|
3103
3096
|
### Patch Changes
|
|
@@ -3155,15 +3148,6 @@
|
|
|
3155
3148
|
- @redocly/graphql-docs@1.8.0-next.2
|
|
3156
3149
|
- @redocly/portal-plugin-mock-server@0.16.0-next.2
|
|
3157
3150
|
|
|
3158
|
-
## 0.130.2
|
|
3159
|
-
|
|
3160
|
-
### Patch Changes
|
|
3161
|
-
|
|
3162
|
-
- 4dfbc3b570: Fixed an issue where Project Analytics would not display any data for specific versions of Realm.
|
|
3163
|
-
- Updated dependencies [4dfbc3b570]
|
|
3164
|
-
- @redocly/realm-asyncapi-sdk@0.8.1
|
|
3165
|
-
- @redocly/theme@0.62.0
|
|
3166
|
-
|
|
3167
3151
|
## 0.131.0-next.3
|
|
3168
3152
|
|
|
3169
3153
|
### Patch Changes
|
|
@@ -3198,12 +3182,6 @@
|
|
|
3198
3182
|
- 713994c780: Fixed an issue where the execution environment wasn't recognized correctly causing build failures.
|
|
3199
3183
|
- 1fa1e85405: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3200
3184
|
|
|
3201
|
-
## 0.130.1
|
|
3202
|
-
|
|
3203
|
-
### Patch Changes
|
|
3204
|
-
|
|
3205
|
-
- 69f13ea40c: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3206
|
-
|
|
3207
3185
|
## 0.131.0-next.0
|
|
3208
3186
|
|
|
3209
3187
|
### Minor Changes
|
|
@@ -3230,6 +3208,44 @@
|
|
|
3230
3208
|
- @redocly/graphql-docs@1.8.0-next.0
|
|
3231
3209
|
- @redocly/openapi-docs@3.19.0-next.0
|
|
3232
3210
|
|
|
3211
|
+
## 0.130.4
|
|
3212
|
+
|
|
3213
|
+
### Patch Changes
|
|
3214
|
+
|
|
3215
|
+
- 5b1e533559: Fixed security vulnerability CVE-2026-25128 in fast-xml-parser by upgrading openapi-sampler to version 1.7.0.
|
|
3216
|
+
- Updated dependencies [5b1e533559]
|
|
3217
|
+
- @redocly/portal-plugin-mock-server@0.15.2
|
|
3218
|
+
- @redocly/asyncapi-docs@1.7.2
|
|
3219
|
+
- @redocly/openapi-docs@3.18.2
|
|
3220
|
+
- @redocly/theme@0.62.1
|
|
3221
|
+
- @redocly/graphql-docs@1.7.1
|
|
3222
|
+
|
|
3223
|
+
## 0.130.3
|
|
3224
|
+
|
|
3225
|
+
### Patch Changes
|
|
3226
|
+
|
|
3227
|
+
- 0beb1adad0: Fixed a bug where AI search events were not tracked for project analytics.
|
|
3228
|
+
- Updated dependencies [e7708a15f1]
|
|
3229
|
+
- Updated dependencies [e7708a15f1]
|
|
3230
|
+
- @redocly/portal-plugin-mock-server@0.15.1
|
|
3231
|
+
- @redocly/asyncapi-docs@1.7.1
|
|
3232
|
+
- @redocly/openapi-docs@3.18.1
|
|
3233
|
+
|
|
3234
|
+
## 0.130.2
|
|
3235
|
+
|
|
3236
|
+
### Patch Changes
|
|
3237
|
+
|
|
3238
|
+
- 4dfbc3b570: Fixed an issue where Project Analytics would not display any data for specific versions of Realm.
|
|
3239
|
+
- Updated dependencies [4dfbc3b570]
|
|
3240
|
+
- @redocly/realm-asyncapi-sdk@0.8.1
|
|
3241
|
+
- @redocly/theme@0.62.0
|
|
3242
|
+
|
|
3243
|
+
## 0.130.1
|
|
3244
|
+
|
|
3245
|
+
### Patch Changes
|
|
3246
|
+
|
|
3247
|
+
- 69f13ea40c: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3248
|
+
|
|
3233
3249
|
## 0.130.0
|
|
3234
3250
|
|
|
3235
3251
|
### Minor Changes
|
|
@@ -3478,12 +3494,6 @@
|
|
|
3478
3494
|
- @redocly/portal-plugin-mock-server@0.15.0-next.2
|
|
3479
3495
|
- @redocly/graphql-docs@1.7.0-next.0
|
|
3480
3496
|
|
|
3481
|
-
## 0.129.2
|
|
3482
|
-
|
|
3483
|
-
### Patch Changes
|
|
3484
|
-
|
|
3485
|
-
- 237e61721c: Fixed an issue where project processing could halt indefinitely due to incorrect cache handling.
|
|
3486
|
-
|
|
3487
3497
|
## 0.130.0-next.2
|
|
3488
3498
|
|
|
3489
3499
|
### Patch Changes
|
|
@@ -3523,6 +3533,12 @@
|
|
|
3523
3533
|
- @redocly/openapi-docs@3.18.0-next.0
|
|
3524
3534
|
- @redocly/theme@0.62.0-next.0
|
|
3525
3535
|
|
|
3536
|
+
## 0.129.2
|
|
3537
|
+
|
|
3538
|
+
### Patch Changes
|
|
3539
|
+
|
|
3540
|
+
- 237e61721c: Fixed an issue where project processing could halt indefinitely due to incorrect cache handling.
|
|
3541
|
+
|
|
3526
3542
|
## 0.129.1
|
|
3527
3543
|
|
|
3528
3544
|
### Patch Changes
|
|
@@ -3646,19 +3662,6 @@
|
|
|
3646
3662
|
- @redocly/portal-plugin-mock-server@0.14.0-next.3
|
|
3647
3663
|
- @redocly/graphql-docs@1.6.0-next.0
|
|
3648
3664
|
|
|
3649
|
-
## 0.128.1
|
|
3650
|
-
|
|
3651
|
-
### Patch Changes
|
|
3652
|
-
|
|
3653
|
-
- 7a73a9957a: Fixed a bug where scorecard custom targets did not match.
|
|
3654
|
-
- fe3253dabb: Fixed an issue where the product picker was not properly aligned in the navbar.
|
|
3655
|
-
- Updated dependencies [fe3253dabb]
|
|
3656
|
-
- @redocly/theme@0.60.1
|
|
3657
|
-
- @redocly/asyncapi-docs@1.5.1
|
|
3658
|
-
- @redocly/graphql-docs@1.5.0
|
|
3659
|
-
- @redocly/openapi-docs@3.16.1
|
|
3660
|
-
- @redocly/portal-plugin-mock-server@0.13.1
|
|
3661
|
-
|
|
3662
3665
|
## 0.129.0-next.2
|
|
3663
3666
|
|
|
3664
3667
|
### Minor Changes
|
|
@@ -3723,6 +3726,19 @@
|
|
|
3723
3726
|
- @redocly/graphql-docs@1.6.0-next.0
|
|
3724
3727
|
- @redocly/theme@0.61.0-next.0
|
|
3725
3728
|
|
|
3729
|
+
## 0.128.1
|
|
3730
|
+
|
|
3731
|
+
### Patch Changes
|
|
3732
|
+
|
|
3733
|
+
- 7a73a9957a: Fixed a bug where scorecard custom targets did not match.
|
|
3734
|
+
- fe3253dabb: Fixed an issue where the product picker was not properly aligned in the navbar.
|
|
3735
|
+
- Updated dependencies [fe3253dabb]
|
|
3736
|
+
- @redocly/theme@0.60.1
|
|
3737
|
+
- @redocly/asyncapi-docs@1.5.1
|
|
3738
|
+
- @redocly/graphql-docs@1.5.0
|
|
3739
|
+
- @redocly/openapi-docs@3.16.1
|
|
3740
|
+
- @redocly/portal-plugin-mock-server@0.13.1
|
|
3741
|
+
|
|
3726
3742
|
## 0.128.0
|
|
3727
3743
|
|
|
3728
3744
|
### Minor Changes
|
|
@@ -4227,12 +4243,6 @@
|
|
|
4227
4243
|
- @redocly/portal-plugin-mock-server@0.12.0-next.4
|
|
4228
4244
|
- @redocly/graphql-docs@1.4.0-next.0
|
|
4229
4245
|
|
|
4230
|
-
## 0.126.2
|
|
4231
|
-
|
|
4232
|
-
### Patch Changes
|
|
4233
|
-
|
|
4234
|
-
- 80be5200e3: Fixed an issue where successive sidebar items were not activated when users were scrolling API document pages.
|
|
4235
|
-
|
|
4236
4246
|
## 0.127.0-next.3
|
|
4237
4247
|
|
|
4238
4248
|
### Patch Changes
|
|
@@ -4281,20 +4291,6 @@
|
|
|
4281
4291
|
- @redocly/openapi-docs@3.15.0-next.1
|
|
4282
4292
|
- @redocly/portal-plugin-mock-server@0.12.0-next.1
|
|
4283
4293
|
|
|
4284
|
-
## 0.126.1
|
|
4285
|
-
|
|
4286
|
-
### Patch Changes
|
|
4287
|
-
|
|
4288
|
-
- 7a4401ae3f: Renamed the `get-full-definition` MCP tool to `get-full-spec-document`.
|
|
4289
|
-
- Updated dependencies [952ce6e27b]
|
|
4290
|
-
- Updated dependencies [77852d4f5c]
|
|
4291
|
-
- @redocly/realm-asyncapi-sdk@0.4.1
|
|
4292
|
-
- @redocly/theme@0.58.1
|
|
4293
|
-
- @redocly/openapi-docs@3.14.1
|
|
4294
|
-
- @redocly/asyncapi-docs@1.3.1
|
|
4295
|
-
- @redocly/graphql-docs@1.3.0
|
|
4296
|
-
- @redocly/portal-plugin-mock-server@0.11.1
|
|
4297
|
-
|
|
4298
4294
|
## 0.127.0-next.0
|
|
4299
4295
|
|
|
4300
4296
|
### Minor Changes
|
|
@@ -4321,6 +4317,26 @@
|
|
|
4321
4317
|
- @redocly/openapi-docs@3.15.0-next.0
|
|
4322
4318
|
- @redocly/theme@0.59.0-next.0
|
|
4323
4319
|
|
|
4320
|
+
## 0.126.2
|
|
4321
|
+
|
|
4322
|
+
### Patch Changes
|
|
4323
|
+
|
|
4324
|
+
- 80be5200e3: Fixed an issue where successive sidebar items were not activated when users were scrolling API document pages.
|
|
4325
|
+
|
|
4326
|
+
## 0.126.1
|
|
4327
|
+
|
|
4328
|
+
### Patch Changes
|
|
4329
|
+
|
|
4330
|
+
- 7a4401ae3f: Renamed the `get-full-definition` MCP tool to `get-full-spec-document`.
|
|
4331
|
+
- Updated dependencies [952ce6e27b]
|
|
4332
|
+
- Updated dependencies [77852d4f5c]
|
|
4333
|
+
- @redocly/realm-asyncapi-sdk@0.4.1
|
|
4334
|
+
- @redocly/theme@0.58.1
|
|
4335
|
+
- @redocly/openapi-docs@3.14.1
|
|
4336
|
+
- @redocly/asyncapi-docs@1.3.1
|
|
4337
|
+
- @redocly/graphql-docs@1.3.0
|
|
4338
|
+
- @redocly/portal-plugin-mock-server@0.11.1
|
|
4339
|
+
|
|
4324
4340
|
## 0.126.0
|
|
4325
4341
|
|
|
4326
4342
|
### Minor Changes
|
|
@@ -4547,12 +4563,6 @@
|
|
|
4547
4563
|
- @redocly/portal-plugin-mock-server@0.11.0-next.7
|
|
4548
4564
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4549
4565
|
|
|
4550
|
-
## 0.125.3
|
|
4551
|
-
|
|
4552
|
-
### Patch Changes
|
|
4553
|
-
|
|
4554
|
-
- Fixed project analytics collection.
|
|
4555
|
-
|
|
4556
4566
|
## 0.126.0-next.10
|
|
4557
4567
|
|
|
4558
4568
|
### Minor Changes
|
|
@@ -4613,19 +4623,6 @@
|
|
|
4613
4623
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4614
4624
|
- @redocly/portal-plugin-mock-server@0.11.0-next.4
|
|
4615
4625
|
|
|
4616
|
-
## 0.125.2
|
|
4617
|
-
|
|
4618
|
-
### Patch Changes
|
|
4619
|
-
|
|
4620
|
-
- 9578323801: Improved JavaScript compilation time on Windows.
|
|
4621
|
-
- Updated dependencies [1405d52ab2]
|
|
4622
|
-
- @redocly/realm-asyncapi-sdk@0.4.0
|
|
4623
|
-
- @redocly/theme@0.57.1
|
|
4624
|
-
- @redocly/asyncapi-docs@1.2.1
|
|
4625
|
-
- @redocly/graphql-docs@1.2.0
|
|
4626
|
-
- @redocly/openapi-docs@3.13.1
|
|
4627
|
-
- @redocly/portal-plugin-mock-server@0.10.1
|
|
4628
|
-
|
|
4629
4626
|
## 0.126.0-next.6
|
|
4630
4627
|
|
|
4631
4628
|
### Patch Changes
|
|
@@ -4662,12 +4659,6 @@
|
|
|
4662
4659
|
- @redocly/asyncapi-docs@1.3.0-next.1
|
|
4663
4660
|
- @redocly/portal-plugin-mock-server@0.11.0-next.1
|
|
4664
4661
|
|
|
4665
|
-
## 0.125.1
|
|
4666
|
-
|
|
4667
|
-
### Patch Changes
|
|
4668
|
-
|
|
4669
|
-
- 28860eaf79: Fixed an issue where Markdoc tags did not render in preview mode.
|
|
4670
|
-
|
|
4671
4662
|
## 0.126.0-next.3
|
|
4672
4663
|
|
|
4673
4664
|
### Patch Changes
|
|
@@ -4708,6 +4699,31 @@
|
|
|
4708
4699
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4709
4700
|
- @redocly/openapi-docs@3.14.0-next.0
|
|
4710
4701
|
|
|
4702
|
+
## 0.125.3
|
|
4703
|
+
|
|
4704
|
+
### Patch Changes
|
|
4705
|
+
|
|
4706
|
+
- Fixed project analytics collection.
|
|
4707
|
+
|
|
4708
|
+
## 0.125.2
|
|
4709
|
+
|
|
4710
|
+
### Patch Changes
|
|
4711
|
+
|
|
4712
|
+
- 9578323801: Improved JavaScript compilation time on Windows.
|
|
4713
|
+
- Updated dependencies [1405d52ab2]
|
|
4714
|
+
- @redocly/realm-asyncapi-sdk@0.4.0
|
|
4715
|
+
- @redocly/theme@0.57.1
|
|
4716
|
+
- @redocly/asyncapi-docs@1.2.1
|
|
4717
|
+
- @redocly/graphql-docs@1.2.0
|
|
4718
|
+
- @redocly/openapi-docs@3.13.1
|
|
4719
|
+
- @redocly/portal-plugin-mock-server@0.10.1
|
|
4720
|
+
|
|
4721
|
+
## 0.125.1
|
|
4722
|
+
|
|
4723
|
+
### Patch Changes
|
|
4724
|
+
|
|
4725
|
+
- 28860eaf79: Fixed an issue where Markdoc tags did not render in preview mode.
|
|
4726
|
+
|
|
4711
4727
|
## 0.125.0
|
|
4712
4728
|
|
|
4713
4729
|
### Minor Changes
|
|
@@ -4871,44 +4887,6 @@
|
|
|
4871
4887
|
- @redocly/openapi-docs@3.13.0-next.3
|
|
4872
4888
|
- @redocly/portal-plugin-mock-server@0.10.0-next.3
|
|
4873
4889
|
|
|
4874
|
-
## 0.124.3
|
|
4875
|
-
|
|
4876
|
-
### Patch Changes
|
|
4877
|
-
|
|
4878
|
-
- Fixed an issue causing crashed during a build.
|
|
4879
|
-
- Updated dependencies
|
|
4880
|
-
- @redocly/theme@0.56.3
|
|
4881
|
-
- @redocly/asyncapi-docs@1.1.3
|
|
4882
|
-
- @redocly/graphql-docs@1.1.0
|
|
4883
|
-
- @redocly/openapi-docs@3.12.3
|
|
4884
|
-
- @redocly/portal-plugin-mock-server@0.9.3
|
|
4885
|
-
|
|
4886
|
-
## 0.124.2
|
|
4887
|
-
|
|
4888
|
-
### Patch Changes
|
|
4889
|
-
|
|
4890
|
-
- Fixed invalid dependency version causing dependency install to fail.
|
|
4891
|
-
- Updated dependencies
|
|
4892
|
-
- @redocly/theme@0.56.2
|
|
4893
|
-
- @redocly/asyncapi-docs@1.1.2
|
|
4894
|
-
- @redocly/graphql-docs@1.1.0
|
|
4895
|
-
- @redocly/openapi-docs@3.12.2
|
|
4896
|
-
- @redocly/portal-plugin-mock-server@0.9.2
|
|
4897
|
-
|
|
4898
|
-
## 0.124.1
|
|
4899
|
-
|
|
4900
|
-
### Patch Changes
|
|
4901
|
-
|
|
4902
|
-
- 76e2ff5afd: Fixed broken feedback submission.
|
|
4903
|
-
- 92a9326dd1: Fixed an issue where LLM page actions appeared on pages excluded from search.
|
|
4904
|
-
- Updated dependencies [a3e76e3587]
|
|
4905
|
-
- Updated dependencies [92a9326dd1]
|
|
4906
|
-
- @redocly/theme@0.56.1
|
|
4907
|
-
- @redocly/asyncapi-docs@1.1.1
|
|
4908
|
-
- @redocly/graphql-docs@1.1.0
|
|
4909
|
-
- @redocly/openapi-docs@3.12.1
|
|
4910
|
-
- @redocly/portal-plugin-mock-server@0.9.1
|
|
4911
|
-
|
|
4912
4890
|
## 0.125.0-next.2
|
|
4913
4891
|
|
|
4914
4892
|
### Patch Changes
|
|
@@ -4958,6 +4936,44 @@
|
|
|
4958
4936
|
- @redocly/asyncapi-docs@1.2.0-next.0
|
|
4959
4937
|
- @redocly/graphql-docs@1.2.0-next.0
|
|
4960
4938
|
|
|
4939
|
+
## 0.124.3
|
|
4940
|
+
|
|
4941
|
+
### Patch Changes
|
|
4942
|
+
|
|
4943
|
+
- Fixed an issue causing crashed during a build.
|
|
4944
|
+
- Updated dependencies
|
|
4945
|
+
- @redocly/theme@0.56.3
|
|
4946
|
+
- @redocly/asyncapi-docs@1.1.3
|
|
4947
|
+
- @redocly/graphql-docs@1.1.0
|
|
4948
|
+
- @redocly/openapi-docs@3.12.3
|
|
4949
|
+
- @redocly/portal-plugin-mock-server@0.9.3
|
|
4950
|
+
|
|
4951
|
+
## 0.124.2
|
|
4952
|
+
|
|
4953
|
+
### Patch Changes
|
|
4954
|
+
|
|
4955
|
+
- Fixed invalid dependency version causing dependency install to fail.
|
|
4956
|
+
- Updated dependencies
|
|
4957
|
+
- @redocly/theme@0.56.2
|
|
4958
|
+
- @redocly/asyncapi-docs@1.1.2
|
|
4959
|
+
- @redocly/graphql-docs@1.1.0
|
|
4960
|
+
- @redocly/openapi-docs@3.12.2
|
|
4961
|
+
- @redocly/portal-plugin-mock-server@0.9.2
|
|
4962
|
+
|
|
4963
|
+
## 0.124.1
|
|
4964
|
+
|
|
4965
|
+
### Patch Changes
|
|
4966
|
+
|
|
4967
|
+
- 76e2ff5afd: Fixed broken feedback submission.
|
|
4968
|
+
- 92a9326dd1: Fixed an issue where LLM page actions appeared on pages excluded from search.
|
|
4969
|
+
- Updated dependencies [a3e76e3587]
|
|
4970
|
+
- Updated dependencies [92a9326dd1]
|
|
4971
|
+
- @redocly/theme@0.56.1
|
|
4972
|
+
- @redocly/asyncapi-docs@1.1.1
|
|
4973
|
+
- @redocly/graphql-docs@1.1.0
|
|
4974
|
+
- @redocly/openapi-docs@3.12.1
|
|
4975
|
+
- @redocly/portal-plugin-mock-server@0.9.1
|
|
4976
|
+
|
|
4961
4977
|
## 0.124.0
|
|
4962
4978
|
|
|
4963
4979
|
### Minor Changes
|
|
@@ -5219,12 +5235,6 @@
|
|
|
5219
5235
|
- @redocly/portal-plugin-mock-server@0.9.0-next.12
|
|
5220
5236
|
- @redocly/graphql-docs@0.13.0-next.1
|
|
5221
5237
|
|
|
5222
|
-
## 0.123.1
|
|
5223
|
-
|
|
5224
|
-
### Patch Changes
|
|
5225
|
-
|
|
5226
|
-
- bdd218eb53: Fixed an issue where an RBAC match pattern starting with `**` did not override the global match pattern `**`.
|
|
5227
|
-
|
|
5228
5238
|
## 0.124.0-next.17
|
|
5229
5239
|
|
|
5230
5240
|
### Patch Changes
|
|
@@ -5412,6 +5422,12 @@
|
|
|
5412
5422
|
- @redocly/graphql-docs@0.13.0-next.0
|
|
5413
5423
|
- @redocly/theme@0.56.0-next.0
|
|
5414
5424
|
|
|
5425
|
+
## 0.123.1
|
|
5426
|
+
|
|
5427
|
+
### Patch Changes
|
|
5428
|
+
|
|
5429
|
+
- bdd218eb53: Fixed an issue where an RBAC match pattern starting with `**` did not override the global match pattern `**`.
|
|
5430
|
+
|
|
5415
5431
|
## 0.123.0
|
|
5416
5432
|
|
|
5417
5433
|
### Minor Changes
|
|
@@ -5499,18 +5515,6 @@
|
|
|
5499
5515
|
- @redocly/openapi-docs@3.11.0-next.9
|
|
5500
5516
|
- @redocly/portal-plugin-mock-server@0.8.0-next.9
|
|
5501
5517
|
|
|
5502
|
-
## 0.122.3
|
|
5503
|
-
|
|
5504
|
-
### Patch Changes
|
|
5505
|
-
|
|
5506
|
-
- d33ccaad3f: Fixed an issue where the Markdoc `tabs` tag incorrectly set the active state for the selected tab.
|
|
5507
|
-
- Updated dependencies [d33ccaad3f]
|
|
5508
|
-
- @redocly/theme@0.54.3
|
|
5509
|
-
- @redocly/asyncapi-docs@0.3.3
|
|
5510
|
-
- @redocly/graphql-docs@0.11.0
|
|
5511
|
-
- @redocly/openapi-docs@3.10.3
|
|
5512
|
-
- @redocly/portal-plugin-mock-server@0.7.3
|
|
5513
|
-
|
|
5514
5518
|
## 0.123.0-next.9
|
|
5515
5519
|
|
|
5516
5520
|
### Patch Changes
|
|
@@ -5535,18 +5539,6 @@
|
|
|
5535
5539
|
- @redocly/openapi-docs@3.11.0-next.7
|
|
5536
5540
|
- @redocly/portal-plugin-mock-server@0.8.0-next.7
|
|
5537
5541
|
|
|
5538
|
-
## 0.122.2
|
|
5539
|
-
|
|
5540
|
-
### Patch Changes
|
|
5541
|
-
|
|
5542
|
-
- 0cc1594c74: Fixed an issue where the tabs drop-down disappeared immediately after touch was released, preventing users from switching between tabs on mobile devices.
|
|
5543
|
-
- Updated dependencies [0cc1594c74]
|
|
5544
|
-
- @redocly/theme@0.54.2
|
|
5545
|
-
- @redocly/asyncapi-docs@0.3.2
|
|
5546
|
-
- @redocly/graphql-docs@0.11.0
|
|
5547
|
-
- @redocly/openapi-docs@3.10.2
|
|
5548
|
-
- @redocly/portal-plugin-mock-server@0.7.2
|
|
5549
|
-
|
|
5550
5542
|
## 0.123.0-next.7
|
|
5551
5543
|
|
|
5552
5544
|
### Patch Changes
|
|
@@ -5650,19 +5642,6 @@
|
|
|
5650
5642
|
- @redocly/openapi-docs@3.11.0-next.1
|
|
5651
5643
|
- @redocly/portal-plugin-mock-server@0.8.0-next.1
|
|
5652
5644
|
|
|
5653
|
-
## 0.122.1
|
|
5654
|
-
|
|
5655
|
-
### Patch Changes
|
|
5656
|
-
|
|
5657
|
-
- 534408676f: Fixed performance issue in the `Tabs` component.
|
|
5658
|
-
- 4f1e7786c4: Fixed false positive errors for unclosed quotes in `markdoc` attributes.
|
|
5659
|
-
- Updated dependencies [534408676f]
|
|
5660
|
-
- @redocly/theme@0.54.1
|
|
5661
|
-
- @redocly/asyncapi-docs@0.3.1
|
|
5662
|
-
- @redocly/graphql-docs@0.11.0
|
|
5663
|
-
- @redocly/openapi-docs@3.10.1
|
|
5664
|
-
- @redocly/portal-plugin-mock-server@0.7.1
|
|
5665
|
-
|
|
5666
5645
|
## 0.123.0-next.0
|
|
5667
5646
|
|
|
5668
5647
|
### Patch Changes
|
|
@@ -5681,6 +5660,43 @@
|
|
|
5681
5660
|
- @redocly/theme@0.55.0-next.0
|
|
5682
5661
|
- @redocly/realm-asyncapi-sdk@0.1.0-next.0
|
|
5683
5662
|
|
|
5663
|
+
## 0.122.3
|
|
5664
|
+
|
|
5665
|
+
### Patch Changes
|
|
5666
|
+
|
|
5667
|
+
- d33ccaad3f: Fixed an issue where the Markdoc `tabs` tag incorrectly set the active state for the selected tab.
|
|
5668
|
+
- Updated dependencies [d33ccaad3f]
|
|
5669
|
+
- @redocly/theme@0.54.3
|
|
5670
|
+
- @redocly/asyncapi-docs@0.3.3
|
|
5671
|
+
- @redocly/graphql-docs@0.11.0
|
|
5672
|
+
- @redocly/openapi-docs@3.10.3
|
|
5673
|
+
- @redocly/portal-plugin-mock-server@0.7.3
|
|
5674
|
+
|
|
5675
|
+
## 0.122.2
|
|
5676
|
+
|
|
5677
|
+
### Patch Changes
|
|
5678
|
+
|
|
5679
|
+
- 0cc1594c74: Fixed an issue where the tabs drop-down disappeared immediately after touch was released, preventing users from switching between tabs on mobile devices.
|
|
5680
|
+
- Updated dependencies [0cc1594c74]
|
|
5681
|
+
- @redocly/theme@0.54.2
|
|
5682
|
+
- @redocly/asyncapi-docs@0.3.2
|
|
5683
|
+
- @redocly/graphql-docs@0.11.0
|
|
5684
|
+
- @redocly/openapi-docs@3.10.2
|
|
5685
|
+
- @redocly/portal-plugin-mock-server@0.7.2
|
|
5686
|
+
|
|
5687
|
+
## 0.122.1
|
|
5688
|
+
|
|
5689
|
+
### Patch Changes
|
|
5690
|
+
|
|
5691
|
+
- 534408676f: Fixed performance issue in the `Tabs` component.
|
|
5692
|
+
- 4f1e7786c4: Fixed false positive errors for unclosed quotes in `markdoc` attributes.
|
|
5693
|
+
- Updated dependencies [534408676f]
|
|
5694
|
+
- @redocly/theme@0.54.1
|
|
5695
|
+
- @redocly/asyncapi-docs@0.3.1
|
|
5696
|
+
- @redocly/graphql-docs@0.11.0
|
|
5697
|
+
- @redocly/openapi-docs@3.10.1
|
|
5698
|
+
- @redocly/portal-plugin-mock-server@0.7.1
|
|
5699
|
+
|
|
5684
5700
|
## 0.122.0
|
|
5685
5701
|
|
|
5686
5702
|
### Minor Changes
|
|
@@ -5940,15 +5956,6 @@
|
|
|
5940
5956
|
- @redocly/graphql-docs@0.11.0-next.0
|
|
5941
5957
|
- @redocly/portal-plugin-mock-server@0.7.0-next.2
|
|
5942
5958
|
|
|
5943
|
-
## 0.121.1
|
|
5944
|
-
|
|
5945
|
-
### Patch Changes
|
|
5946
|
-
|
|
5947
|
-
- Updated dependencies [6b9d845619]
|
|
5948
|
-
- @redocly/portal-plugin-mock-server@0.6.1
|
|
5949
|
-
- @redocly/openapi-docs@3.9.1
|
|
5950
|
-
- @redocly/asyncapi-docs@0.2.1
|
|
5951
|
-
|
|
5952
5959
|
## 0.122.0-next.1
|
|
5953
5960
|
|
|
5954
5961
|
### Patch Changes
|
|
@@ -5978,6 +5985,15 @@
|
|
|
5978
5985
|
- @redocly/graphql-docs@0.11.0-next.0
|
|
5979
5986
|
- @redocly/openapi-docs@3.10.0-next.0
|
|
5980
5987
|
|
|
5988
|
+
## 0.121.1
|
|
5989
|
+
|
|
5990
|
+
### Patch Changes
|
|
5991
|
+
|
|
5992
|
+
- Updated dependencies [6b9d845619]
|
|
5993
|
+
- @redocly/portal-plugin-mock-server@0.6.1
|
|
5994
|
+
- @redocly/openapi-docs@3.9.1
|
|
5995
|
+
- @redocly/asyncapi-docs@0.2.1
|
|
5996
|
+
|
|
5981
5997
|
## 0.121.0
|
|
5982
5998
|
|
|
5983
5999
|
### Minor Changes
|
|
@@ -6101,12 +6117,6 @@
|
|
|
6101
6117
|
- @redocly/openapi-docs@3.9.0-next.1
|
|
6102
6118
|
- @redocly/portal-plugin-mock-server@0.6.0-next.1
|
|
6103
6119
|
|
|
6104
|
-
## 0.120.2
|
|
6105
|
-
|
|
6106
|
-
### Patch Changes
|
|
6107
|
-
|
|
6108
|
-
- 4a4316e308: Fixed an issue where using links to an OpenAPI file generated by the `output` configuration property caused errors which failed the build.
|
|
6109
|
-
|
|
6110
6120
|
## 0.121.0-next.0
|
|
6111
6121
|
|
|
6112
6122
|
### Patch Changes
|
|
@@ -6121,6 +6131,12 @@
|
|
|
6121
6131
|
- @redocly/openapi-docs@3.9.0-next.0
|
|
6122
6132
|
- @redocly/theme@0.53.0-next.0
|
|
6123
6133
|
|
|
6134
|
+
## 0.120.2
|
|
6135
|
+
|
|
6136
|
+
### Patch Changes
|
|
6137
|
+
|
|
6138
|
+
- 4a4316e308: Fixed an issue where using links to an OpenAPI file generated by the `output` configuration property caused errors which failed the build.
|
|
6139
|
+
|
|
6124
6140
|
## 0.120.1
|
|
6125
6141
|
|
|
6126
6142
|
### Patch Changes
|
|
@@ -6218,12 +6234,6 @@
|
|
|
6218
6234
|
- @redocly/theme@0.52.0-next.3
|
|
6219
6235
|
- @redocly/graphql-docs@0.9.0-next.0
|
|
6220
6236
|
|
|
6221
|
-
## 0.119.1
|
|
6222
|
-
|
|
6223
|
-
### Patch Changes
|
|
6224
|
-
|
|
6225
|
-
- 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.
|
|
6226
|
-
|
|
6227
6237
|
## 0.120.0-next.3
|
|
6228
6238
|
|
|
6229
6239
|
### Patch Changes
|
|
@@ -6275,6 +6285,12 @@
|
|
|
6275
6285
|
- @redocly/portal-plugin-mock-server@0.5.0-next.0
|
|
6276
6286
|
- @redocly/theme@0.52.0-next.0
|
|
6277
6287
|
|
|
6288
|
+
## 0.119.1
|
|
6289
|
+
|
|
6290
|
+
### Patch Changes
|
|
6291
|
+
|
|
6292
|
+
- 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.
|
|
6293
|
+
|
|
6278
6294
|
## 0.119.0
|
|
6279
6295
|
|
|
6280
6296
|
### 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};
|