@redocly/redoc 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 +217 -201
- 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
|
|
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
|
|
@@ -2931,29 +2947,6 @@
|
|
|
2931
2947
|
- @redocly/realm-asyncapi-sdk@0.9.0-next.2
|
|
2932
2948
|
- @redocly/theme@0.63.0-next.3
|
|
2933
2949
|
|
|
2934
|
-
## 0.130.4
|
|
2935
|
-
|
|
2936
|
-
### Patch Changes
|
|
2937
|
-
|
|
2938
|
-
- 5b1e533559: Fixed security vulnerability CVE-2026-25128 in fast-xml-parser by upgrading openapi-sampler to version 1.7.0.
|
|
2939
|
-
- Updated dependencies [5b1e533559]
|
|
2940
|
-
- @redocly/portal-plugin-mock-server@0.15.2
|
|
2941
|
-
- @redocly/asyncapi-docs@1.7.2
|
|
2942
|
-
- @redocly/openapi-docs@3.18.2
|
|
2943
|
-
- @redocly/theme@0.62.1
|
|
2944
|
-
- @redocly/graphql-docs@1.7.1
|
|
2945
|
-
|
|
2946
|
-
## 0.130.3
|
|
2947
|
-
|
|
2948
|
-
### Patch Changes
|
|
2949
|
-
|
|
2950
|
-
- 0beb1adad0: Fixed a bug where AI search events were not tracked for project analytics.
|
|
2951
|
-
- Updated dependencies [e7708a15f1]
|
|
2952
|
-
- Updated dependencies [e7708a15f1]
|
|
2953
|
-
- @redocly/portal-plugin-mock-server@0.15.1
|
|
2954
|
-
- @redocly/asyncapi-docs@1.7.1
|
|
2955
|
-
- @redocly/openapi-docs@3.18.1
|
|
2956
|
-
|
|
2957
2950
|
## 0.131.0-next.6
|
|
2958
2951
|
|
|
2959
2952
|
### Patch Changes
|
|
@@ -3010,15 +3003,6 @@
|
|
|
3010
3003
|
- @redocly/graphql-docs@1.8.0-next.2
|
|
3011
3004
|
- @redocly/portal-plugin-mock-server@0.16.0-next.2
|
|
3012
3005
|
|
|
3013
|
-
## 0.130.2
|
|
3014
|
-
|
|
3015
|
-
### Patch Changes
|
|
3016
|
-
|
|
3017
|
-
- 4dfbc3b570: Fixed an issue where Project Analytics would not display any data for specific versions of Realm.
|
|
3018
|
-
- Updated dependencies [4dfbc3b570]
|
|
3019
|
-
- @redocly/realm-asyncapi-sdk@0.8.1
|
|
3020
|
-
- @redocly/theme@0.62.0
|
|
3021
|
-
|
|
3022
3006
|
## 0.131.0-next.3
|
|
3023
3007
|
|
|
3024
3008
|
### Patch Changes
|
|
@@ -3053,12 +3037,6 @@
|
|
|
3053
3037
|
- 713994c780: Fixed an issue where the execution environment wasn't recognized correctly causing build failures.
|
|
3054
3038
|
- 1fa1e85405: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3055
3039
|
|
|
3056
|
-
## 0.130.1
|
|
3057
|
-
|
|
3058
|
-
### Patch Changes
|
|
3059
|
-
|
|
3060
|
-
- 69f13ea40c: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3061
|
-
|
|
3062
3040
|
## 0.131.0-next.0
|
|
3063
3041
|
|
|
3064
3042
|
### Minor Changes
|
|
@@ -3085,6 +3063,44 @@
|
|
|
3085
3063
|
- @redocly/graphql-docs@1.8.0-next.0
|
|
3086
3064
|
- @redocly/openapi-docs@3.19.0-next.0
|
|
3087
3065
|
|
|
3066
|
+
## 0.130.4
|
|
3067
|
+
|
|
3068
|
+
### Patch Changes
|
|
3069
|
+
|
|
3070
|
+
- 5b1e533559: Fixed security vulnerability CVE-2026-25128 in fast-xml-parser by upgrading openapi-sampler to version 1.7.0.
|
|
3071
|
+
- Updated dependencies [5b1e533559]
|
|
3072
|
+
- @redocly/portal-plugin-mock-server@0.15.2
|
|
3073
|
+
- @redocly/asyncapi-docs@1.7.2
|
|
3074
|
+
- @redocly/openapi-docs@3.18.2
|
|
3075
|
+
- @redocly/theme@0.62.1
|
|
3076
|
+
- @redocly/graphql-docs@1.7.1
|
|
3077
|
+
|
|
3078
|
+
## 0.130.3
|
|
3079
|
+
|
|
3080
|
+
### Patch Changes
|
|
3081
|
+
|
|
3082
|
+
- 0beb1adad0: Fixed a bug where AI search events were not tracked for project analytics.
|
|
3083
|
+
- Updated dependencies [e7708a15f1]
|
|
3084
|
+
- Updated dependencies [e7708a15f1]
|
|
3085
|
+
- @redocly/portal-plugin-mock-server@0.15.1
|
|
3086
|
+
- @redocly/asyncapi-docs@1.7.1
|
|
3087
|
+
- @redocly/openapi-docs@3.18.1
|
|
3088
|
+
|
|
3089
|
+
## 0.130.2
|
|
3090
|
+
|
|
3091
|
+
### Patch Changes
|
|
3092
|
+
|
|
3093
|
+
- 4dfbc3b570: Fixed an issue where Project Analytics would not display any data for specific versions of Realm.
|
|
3094
|
+
- Updated dependencies [4dfbc3b570]
|
|
3095
|
+
- @redocly/realm-asyncapi-sdk@0.8.1
|
|
3096
|
+
- @redocly/theme@0.62.0
|
|
3097
|
+
|
|
3098
|
+
## 0.130.1
|
|
3099
|
+
|
|
3100
|
+
### Patch Changes
|
|
3101
|
+
|
|
3102
|
+
- 69f13ea40c: Fixed an issue where the login button was not displayed when a default identity provider was configured.
|
|
3103
|
+
|
|
3088
3104
|
## 0.130.0
|
|
3089
3105
|
|
|
3090
3106
|
### Minor Changes
|
|
@@ -3316,12 +3332,6 @@
|
|
|
3316
3332
|
- @redocly/portal-plugin-mock-server@0.15.0-next.2
|
|
3317
3333
|
- @redocly/graphql-docs@1.7.0-next.0
|
|
3318
3334
|
|
|
3319
|
-
## 0.129.2
|
|
3320
|
-
|
|
3321
|
-
### Patch Changes
|
|
3322
|
-
|
|
3323
|
-
- 237e61721c: Fixed an issue where project processing could halt indefinitely due to incorrect cache handling.
|
|
3324
|
-
|
|
3325
3335
|
## 0.130.0-next.2
|
|
3326
3336
|
|
|
3327
3337
|
### Patch Changes
|
|
@@ -3360,6 +3370,12 @@
|
|
|
3360
3370
|
- @redocly/openapi-docs@3.18.0-next.0
|
|
3361
3371
|
- @redocly/theme@0.62.0-next.0
|
|
3362
3372
|
|
|
3373
|
+
## 0.129.2
|
|
3374
|
+
|
|
3375
|
+
### Patch Changes
|
|
3376
|
+
|
|
3377
|
+
- 237e61721c: Fixed an issue where project processing could halt indefinitely due to incorrect cache handling.
|
|
3378
|
+
|
|
3363
3379
|
## 0.129.1
|
|
3364
3380
|
|
|
3365
3381
|
### Patch Changes
|
|
@@ -3476,17 +3492,6 @@
|
|
|
3476
3492
|
- @redocly/portal-plugin-mock-server@0.14.0-next.3
|
|
3477
3493
|
- @redocly/graphql-docs@1.6.0-next.0
|
|
3478
3494
|
|
|
3479
|
-
## 0.128.1
|
|
3480
|
-
|
|
3481
|
-
### Patch Changes
|
|
3482
|
-
|
|
3483
|
-
- Updated dependencies [fe3253dabb]
|
|
3484
|
-
- @redocly/theme@0.60.1
|
|
3485
|
-
- @redocly/asyncapi-docs@1.5.1
|
|
3486
|
-
- @redocly/graphql-docs@1.5.0
|
|
3487
|
-
- @redocly/openapi-docs@3.16.1
|
|
3488
|
-
- @redocly/portal-plugin-mock-server@0.13.1
|
|
3489
|
-
|
|
3490
3495
|
## 0.129.0-next.2
|
|
3491
3496
|
|
|
3492
3497
|
### Patch Changes
|
|
@@ -3541,6 +3546,17 @@
|
|
|
3541
3546
|
- @redocly/graphql-docs@1.6.0-next.0
|
|
3542
3547
|
- @redocly/theme@0.61.0-next.0
|
|
3543
3548
|
|
|
3549
|
+
## 0.128.1
|
|
3550
|
+
|
|
3551
|
+
### Patch Changes
|
|
3552
|
+
|
|
3553
|
+
- Updated dependencies [fe3253dabb]
|
|
3554
|
+
- @redocly/theme@0.60.1
|
|
3555
|
+
- @redocly/asyncapi-docs@1.5.1
|
|
3556
|
+
- @redocly/graphql-docs@1.5.0
|
|
3557
|
+
- @redocly/openapi-docs@3.16.1
|
|
3558
|
+
- @redocly/portal-plugin-mock-server@0.13.1
|
|
3559
|
+
|
|
3544
3560
|
## 0.128.0
|
|
3545
3561
|
|
|
3546
3562
|
### Minor Changes
|
|
@@ -4029,12 +4045,6 @@
|
|
|
4029
4045
|
- @redocly/portal-plugin-mock-server@0.12.0-next.4
|
|
4030
4046
|
- @redocly/graphql-docs@1.4.0-next.0
|
|
4031
4047
|
|
|
4032
|
-
## 0.126.2
|
|
4033
|
-
|
|
4034
|
-
### Patch Changes
|
|
4035
|
-
|
|
4036
|
-
- 80be5200e3: Fixed an issue where successive sidebar items were not activated when users were scrolling API document pages.
|
|
4037
|
-
|
|
4038
4048
|
## 0.127.0-next.3
|
|
4039
4049
|
|
|
4040
4050
|
### Patch Changes
|
|
@@ -4082,20 +4092,6 @@
|
|
|
4082
4092
|
- @redocly/openapi-docs@3.15.0-next.1
|
|
4083
4093
|
- @redocly/portal-plugin-mock-server@0.12.0-next.1
|
|
4084
4094
|
|
|
4085
|
-
## 0.126.1
|
|
4086
|
-
|
|
4087
|
-
### Patch Changes
|
|
4088
|
-
|
|
4089
|
-
- 7a4401ae3f: Renamed the `get-full-definition` MCP tool to `get-full-spec-document`.
|
|
4090
|
-
- Updated dependencies [952ce6e27b]
|
|
4091
|
-
- Updated dependencies [77852d4f5c]
|
|
4092
|
-
- @redocly/realm-asyncapi-sdk@0.4.1
|
|
4093
|
-
- @redocly/theme@0.58.1
|
|
4094
|
-
- @redocly/openapi-docs@3.14.1
|
|
4095
|
-
- @redocly/asyncapi-docs@1.3.1
|
|
4096
|
-
- @redocly/graphql-docs@1.3.0
|
|
4097
|
-
- @redocly/portal-plugin-mock-server@0.11.1
|
|
4098
|
-
|
|
4099
4095
|
## 0.127.0-next.0
|
|
4100
4096
|
|
|
4101
4097
|
### Minor Changes
|
|
@@ -4120,6 +4116,26 @@
|
|
|
4120
4116
|
- @redocly/openapi-docs@3.15.0-next.0
|
|
4121
4117
|
- @redocly/theme@0.59.0-next.0
|
|
4122
4118
|
|
|
4119
|
+
## 0.126.2
|
|
4120
|
+
|
|
4121
|
+
### Patch Changes
|
|
4122
|
+
|
|
4123
|
+
- 80be5200e3: Fixed an issue where successive sidebar items were not activated when users were scrolling API document pages.
|
|
4124
|
+
|
|
4125
|
+
## 0.126.1
|
|
4126
|
+
|
|
4127
|
+
### Patch Changes
|
|
4128
|
+
|
|
4129
|
+
- 7a4401ae3f: Renamed the `get-full-definition` MCP tool to `get-full-spec-document`.
|
|
4130
|
+
- Updated dependencies [952ce6e27b]
|
|
4131
|
+
- Updated dependencies [77852d4f5c]
|
|
4132
|
+
- @redocly/realm-asyncapi-sdk@0.4.1
|
|
4133
|
+
- @redocly/theme@0.58.1
|
|
4134
|
+
- @redocly/openapi-docs@3.14.1
|
|
4135
|
+
- @redocly/asyncapi-docs@1.3.1
|
|
4136
|
+
- @redocly/graphql-docs@1.3.0
|
|
4137
|
+
- @redocly/portal-plugin-mock-server@0.11.1
|
|
4138
|
+
|
|
4123
4139
|
## 0.126.0
|
|
4124
4140
|
|
|
4125
4141
|
### Minor Changes
|
|
@@ -4329,12 +4345,6 @@
|
|
|
4329
4345
|
- @redocly/portal-plugin-mock-server@0.11.0-next.7
|
|
4330
4346
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4331
4347
|
|
|
4332
|
-
## 0.125.3
|
|
4333
|
-
|
|
4334
|
-
### Patch Changes
|
|
4335
|
-
|
|
4336
|
-
- Fixed project analytics collection.
|
|
4337
|
-
|
|
4338
4348
|
## 0.126.0-next.10
|
|
4339
4349
|
|
|
4340
4350
|
### Minor Changes
|
|
@@ -4389,19 +4399,6 @@
|
|
|
4389
4399
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4390
4400
|
- @redocly/portal-plugin-mock-server@0.11.0-next.4
|
|
4391
4401
|
|
|
4392
|
-
## 0.125.2
|
|
4393
|
-
|
|
4394
|
-
### Patch Changes
|
|
4395
|
-
|
|
4396
|
-
- 9578323801: Improved JavaScript compilation time on Windows.
|
|
4397
|
-
- Updated dependencies [1405d52ab2]
|
|
4398
|
-
- @redocly/realm-asyncapi-sdk@0.4.0
|
|
4399
|
-
- @redocly/theme@0.57.1
|
|
4400
|
-
- @redocly/asyncapi-docs@1.2.1
|
|
4401
|
-
- @redocly/graphql-docs@1.2.0
|
|
4402
|
-
- @redocly/openapi-docs@3.13.1
|
|
4403
|
-
- @redocly/portal-plugin-mock-server@0.10.1
|
|
4404
|
-
|
|
4405
4402
|
## 0.126.0-next.6
|
|
4406
4403
|
|
|
4407
4404
|
### Patch Changes
|
|
@@ -4437,12 +4434,6 @@
|
|
|
4437
4434
|
- @redocly/asyncapi-docs@1.3.0-next.1
|
|
4438
4435
|
- @redocly/portal-plugin-mock-server@0.11.0-next.1
|
|
4439
4436
|
|
|
4440
|
-
## 0.125.1
|
|
4441
|
-
|
|
4442
|
-
### Patch Changes
|
|
4443
|
-
|
|
4444
|
-
- 28860eaf79: Fixed an issue where Markdoc tags did not render in preview mode.
|
|
4445
|
-
|
|
4446
4437
|
## 0.126.0-next.3
|
|
4447
4438
|
|
|
4448
4439
|
### Patch Changes
|
|
@@ -4482,6 +4473,31 @@
|
|
|
4482
4473
|
- @redocly/graphql-docs@1.3.0-next.0
|
|
4483
4474
|
- @redocly/openapi-docs@3.14.0-next.0
|
|
4484
4475
|
|
|
4476
|
+
## 0.125.3
|
|
4477
|
+
|
|
4478
|
+
### Patch Changes
|
|
4479
|
+
|
|
4480
|
+
- Fixed project analytics collection.
|
|
4481
|
+
|
|
4482
|
+
## 0.125.2
|
|
4483
|
+
|
|
4484
|
+
### Patch Changes
|
|
4485
|
+
|
|
4486
|
+
- 9578323801: Improved JavaScript compilation time on Windows.
|
|
4487
|
+
- Updated dependencies [1405d52ab2]
|
|
4488
|
+
- @redocly/realm-asyncapi-sdk@0.4.0
|
|
4489
|
+
- @redocly/theme@0.57.1
|
|
4490
|
+
- @redocly/asyncapi-docs@1.2.1
|
|
4491
|
+
- @redocly/graphql-docs@1.2.0
|
|
4492
|
+
- @redocly/openapi-docs@3.13.1
|
|
4493
|
+
- @redocly/portal-plugin-mock-server@0.10.1
|
|
4494
|
+
|
|
4495
|
+
## 0.125.1
|
|
4496
|
+
|
|
4497
|
+
### Patch Changes
|
|
4498
|
+
|
|
4499
|
+
- 28860eaf79: Fixed an issue where Markdoc tags did not render in preview mode.
|
|
4500
|
+
|
|
4485
4501
|
## 0.125.0
|
|
4486
4502
|
|
|
4487
4503
|
### Minor Changes
|
|
@@ -4632,44 +4648,6 @@
|
|
|
4632
4648
|
- @redocly/openapi-docs@3.13.0-next.3
|
|
4633
4649
|
- @redocly/portal-plugin-mock-server@0.10.0-next.3
|
|
4634
4650
|
|
|
4635
|
-
## 0.124.3
|
|
4636
|
-
|
|
4637
|
-
### Patch Changes
|
|
4638
|
-
|
|
4639
|
-
- Fixed an issue causing crashed during a build.
|
|
4640
|
-
- Updated dependencies
|
|
4641
|
-
- @redocly/theme@0.56.3
|
|
4642
|
-
- @redocly/asyncapi-docs@1.1.3
|
|
4643
|
-
- @redocly/graphql-docs@1.1.0
|
|
4644
|
-
- @redocly/openapi-docs@3.12.3
|
|
4645
|
-
- @redocly/portal-plugin-mock-server@0.9.3
|
|
4646
|
-
|
|
4647
|
-
## 0.124.2
|
|
4648
|
-
|
|
4649
|
-
### Patch Changes
|
|
4650
|
-
|
|
4651
|
-
- Fixed invalid dependency version causing dependency install to fail.
|
|
4652
|
-
- Updated dependencies
|
|
4653
|
-
- @redocly/theme@0.56.2
|
|
4654
|
-
- @redocly/asyncapi-docs@1.1.2
|
|
4655
|
-
- @redocly/graphql-docs@1.1.0
|
|
4656
|
-
- @redocly/openapi-docs@3.12.2
|
|
4657
|
-
- @redocly/portal-plugin-mock-server@0.9.2
|
|
4658
|
-
|
|
4659
|
-
## 0.124.1
|
|
4660
|
-
|
|
4661
|
-
### Patch Changes
|
|
4662
|
-
|
|
4663
|
-
- 76e2ff5afd: Fixed broken feedback submission.
|
|
4664
|
-
- 92a9326dd1: Fixed an issue where LLM page actions appeared on pages excluded from search.
|
|
4665
|
-
- Updated dependencies [a3e76e3587]
|
|
4666
|
-
- Updated dependencies [92a9326dd1]
|
|
4667
|
-
- @redocly/theme@0.56.1
|
|
4668
|
-
- @redocly/asyncapi-docs@1.1.1
|
|
4669
|
-
- @redocly/graphql-docs@1.1.0
|
|
4670
|
-
- @redocly/openapi-docs@3.12.1
|
|
4671
|
-
- @redocly/portal-plugin-mock-server@0.9.1
|
|
4672
|
-
|
|
4673
4651
|
## 0.125.0-next.2
|
|
4674
4652
|
|
|
4675
4653
|
### Patch Changes
|
|
@@ -4718,6 +4696,44 @@
|
|
|
4718
4696
|
- @redocly/asyncapi-docs@1.2.0-next.0
|
|
4719
4697
|
- @redocly/graphql-docs@1.2.0-next.0
|
|
4720
4698
|
|
|
4699
|
+
## 0.124.3
|
|
4700
|
+
|
|
4701
|
+
### Patch Changes
|
|
4702
|
+
|
|
4703
|
+
- Fixed an issue causing crashed during a build.
|
|
4704
|
+
- Updated dependencies
|
|
4705
|
+
- @redocly/theme@0.56.3
|
|
4706
|
+
- @redocly/asyncapi-docs@1.1.3
|
|
4707
|
+
- @redocly/graphql-docs@1.1.0
|
|
4708
|
+
- @redocly/openapi-docs@3.12.3
|
|
4709
|
+
- @redocly/portal-plugin-mock-server@0.9.3
|
|
4710
|
+
|
|
4711
|
+
## 0.124.2
|
|
4712
|
+
|
|
4713
|
+
### Patch Changes
|
|
4714
|
+
|
|
4715
|
+
- Fixed invalid dependency version causing dependency install to fail.
|
|
4716
|
+
- Updated dependencies
|
|
4717
|
+
- @redocly/theme@0.56.2
|
|
4718
|
+
- @redocly/asyncapi-docs@1.1.2
|
|
4719
|
+
- @redocly/graphql-docs@1.1.0
|
|
4720
|
+
- @redocly/openapi-docs@3.12.2
|
|
4721
|
+
- @redocly/portal-plugin-mock-server@0.9.2
|
|
4722
|
+
|
|
4723
|
+
## 0.124.1
|
|
4724
|
+
|
|
4725
|
+
### Patch Changes
|
|
4726
|
+
|
|
4727
|
+
- 76e2ff5afd: Fixed broken feedback submission.
|
|
4728
|
+
- 92a9326dd1: Fixed an issue where LLM page actions appeared on pages excluded from search.
|
|
4729
|
+
- Updated dependencies [a3e76e3587]
|
|
4730
|
+
- Updated dependencies [92a9326dd1]
|
|
4731
|
+
- @redocly/theme@0.56.1
|
|
4732
|
+
- @redocly/asyncapi-docs@1.1.1
|
|
4733
|
+
- @redocly/graphql-docs@1.1.0
|
|
4734
|
+
- @redocly/openapi-docs@3.12.1
|
|
4735
|
+
- @redocly/portal-plugin-mock-server@0.9.1
|
|
4736
|
+
|
|
4721
4737
|
## 0.124.0
|
|
4722
4738
|
|
|
4723
4739
|
### Minor Changes
|
|
@@ -4966,12 +4982,6 @@
|
|
|
4966
4982
|
- @redocly/portal-plugin-mock-server@0.9.0-next.12
|
|
4967
4983
|
- @redocly/graphql-docs@0.13.0-next.1
|
|
4968
4984
|
|
|
4969
|
-
## 0.123.1
|
|
4970
|
-
|
|
4971
|
-
### Patch Changes
|
|
4972
|
-
|
|
4973
|
-
- bdd218eb53: Fixed an issue where an RBAC match pattern starting with `**` did not override the global match pattern `**`.
|
|
4974
|
-
|
|
4975
4985
|
## 0.124.0-next.17
|
|
4976
4986
|
|
|
4977
4987
|
### Patch Changes
|
|
@@ -5154,6 +5164,12 @@
|
|
|
5154
5164
|
- @redocly/graphql-docs@0.13.0-next.0
|
|
5155
5165
|
- @redocly/theme@0.56.0-next.0
|
|
5156
5166
|
|
|
5167
|
+
## 0.123.1
|
|
5168
|
+
|
|
5169
|
+
### Patch Changes
|
|
5170
|
+
|
|
5171
|
+
- bdd218eb53: Fixed an issue where an RBAC match pattern starting with `**` did not override the global match pattern `**`.
|
|
5172
|
+
|
|
5157
5173
|
## 0.123.0
|
|
5158
5174
|
|
|
5159
5175
|
### Minor Changes
|
|
@@ -5221,18 +5237,6 @@
|
|
|
5221
5237
|
- @redocly/openapi-docs@3.11.0-next.9
|
|
5222
5238
|
- @redocly/portal-plugin-mock-server@0.8.0-next.9
|
|
5223
5239
|
|
|
5224
|
-
## 0.122.3
|
|
5225
|
-
|
|
5226
|
-
### Patch Changes
|
|
5227
|
-
|
|
5228
|
-
- d33ccaad3f: Fixed an issue where the Markdoc `tabs` tag incorrectly set the active state for the selected tab.
|
|
5229
|
-
- Updated dependencies [d33ccaad3f]
|
|
5230
|
-
- @redocly/theme@0.54.3
|
|
5231
|
-
- @redocly/asyncapi-docs@0.3.3
|
|
5232
|
-
- @redocly/graphql-docs@0.11.0
|
|
5233
|
-
- @redocly/openapi-docs@3.10.3
|
|
5234
|
-
- @redocly/portal-plugin-mock-server@0.7.3
|
|
5235
|
-
|
|
5236
5240
|
## 0.123.0-next.9
|
|
5237
5241
|
|
|
5238
5242
|
### Patch Changes
|
|
@@ -5255,18 +5259,6 @@
|
|
|
5255
5259
|
- @redocly/openapi-docs@3.11.0-next.7
|
|
5256
5260
|
- @redocly/portal-plugin-mock-server@0.8.0-next.7
|
|
5257
5261
|
|
|
5258
|
-
## 0.122.2
|
|
5259
|
-
|
|
5260
|
-
### Patch Changes
|
|
5261
|
-
|
|
5262
|
-
- 0cc1594c74: Fixed an issue where the tabs drop-down disappeared immediately after touch was released, preventing users from switching between tabs on mobile devices.
|
|
5263
|
-
- Updated dependencies [0cc1594c74]
|
|
5264
|
-
- @redocly/theme@0.54.2
|
|
5265
|
-
- @redocly/asyncapi-docs@0.3.2
|
|
5266
|
-
- @redocly/graphql-docs@0.11.0
|
|
5267
|
-
- @redocly/openapi-docs@3.10.2
|
|
5268
|
-
- @redocly/portal-plugin-mock-server@0.7.2
|
|
5269
|
-
|
|
5270
5262
|
## 0.123.0-next.7
|
|
5271
5263
|
|
|
5272
5264
|
### Patch Changes
|
|
@@ -5358,18 +5350,6 @@
|
|
|
5358
5350
|
- @redocly/openapi-docs@3.11.0-next.1
|
|
5359
5351
|
- @redocly/portal-plugin-mock-server@0.8.0-next.1
|
|
5360
5352
|
|
|
5361
|
-
## 0.122.1
|
|
5362
|
-
|
|
5363
|
-
### Patch Changes
|
|
5364
|
-
|
|
5365
|
-
- 534408676f: Fixed performance issue in the `Tabs` component.
|
|
5366
|
-
- Updated dependencies [534408676f]
|
|
5367
|
-
- @redocly/theme@0.54.1
|
|
5368
|
-
- @redocly/asyncapi-docs@0.3.1
|
|
5369
|
-
- @redocly/graphql-docs@0.11.0
|
|
5370
|
-
- @redocly/openapi-docs@3.10.1
|
|
5371
|
-
- @redocly/portal-plugin-mock-server@0.7.1
|
|
5372
|
-
|
|
5373
5353
|
## 0.123.0-next.0
|
|
5374
5354
|
|
|
5375
5355
|
### Patch Changes
|
|
@@ -5387,6 +5367,42 @@
|
|
|
5387
5367
|
- @redocly/theme@0.55.0-next.0
|
|
5388
5368
|
- @redocly/realm-asyncapi-sdk@0.1.0-next.0
|
|
5389
5369
|
|
|
5370
|
+
## 0.122.3
|
|
5371
|
+
|
|
5372
|
+
### Patch Changes
|
|
5373
|
+
|
|
5374
|
+
- d33ccaad3f: Fixed an issue where the Markdoc `tabs` tag incorrectly set the active state for the selected tab.
|
|
5375
|
+
- Updated dependencies [d33ccaad3f]
|
|
5376
|
+
- @redocly/theme@0.54.3
|
|
5377
|
+
- @redocly/asyncapi-docs@0.3.3
|
|
5378
|
+
- @redocly/graphql-docs@0.11.0
|
|
5379
|
+
- @redocly/openapi-docs@3.10.3
|
|
5380
|
+
- @redocly/portal-plugin-mock-server@0.7.3
|
|
5381
|
+
|
|
5382
|
+
## 0.122.2
|
|
5383
|
+
|
|
5384
|
+
### Patch Changes
|
|
5385
|
+
|
|
5386
|
+
- 0cc1594c74: Fixed an issue where the tabs drop-down disappeared immediately after touch was released, preventing users from switching between tabs on mobile devices.
|
|
5387
|
+
- Updated dependencies [0cc1594c74]
|
|
5388
|
+
- @redocly/theme@0.54.2
|
|
5389
|
+
- @redocly/asyncapi-docs@0.3.2
|
|
5390
|
+
- @redocly/graphql-docs@0.11.0
|
|
5391
|
+
- @redocly/openapi-docs@3.10.2
|
|
5392
|
+
- @redocly/portal-plugin-mock-server@0.7.2
|
|
5393
|
+
|
|
5394
|
+
## 0.122.1
|
|
5395
|
+
|
|
5396
|
+
### Patch Changes
|
|
5397
|
+
|
|
5398
|
+
- 534408676f: Fixed performance issue in the `Tabs` component.
|
|
5399
|
+
- Updated dependencies [534408676f]
|
|
5400
|
+
- @redocly/theme@0.54.1
|
|
5401
|
+
- @redocly/asyncapi-docs@0.3.1
|
|
5402
|
+
- @redocly/graphql-docs@0.11.0
|
|
5403
|
+
- @redocly/openapi-docs@3.10.1
|
|
5404
|
+
- @redocly/portal-plugin-mock-server@0.7.1
|
|
5405
|
+
|
|
5390
5406
|
## 0.122.0
|
|
5391
5407
|
|
|
5392
5408
|
### Minor Changes
|
|
@@ -5609,15 +5625,6 @@
|
|
|
5609
5625
|
- @redocly/graphql-docs@0.11.0-next.0
|
|
5610
5626
|
- @redocly/portal-plugin-mock-server@0.7.0-next.2
|
|
5611
5627
|
|
|
5612
|
-
## 0.121.1
|
|
5613
|
-
|
|
5614
|
-
### Patch Changes
|
|
5615
|
-
|
|
5616
|
-
- Updated dependencies [6b9d845619]
|
|
5617
|
-
- @redocly/portal-plugin-mock-server@0.6.1
|
|
5618
|
-
- @redocly/openapi-docs@3.9.1
|
|
5619
|
-
- @redocly/asyncapi-docs@0.2.1
|
|
5620
|
-
|
|
5621
5628
|
## 0.122.0-next.1
|
|
5622
5629
|
|
|
5623
5630
|
### Patch Changes
|
|
@@ -5647,6 +5654,15 @@
|
|
|
5647
5654
|
- @redocly/graphql-docs@0.11.0-next.0
|
|
5648
5655
|
- @redocly/openapi-docs@3.10.0-next.0
|
|
5649
5656
|
|
|
5657
|
+
## 0.121.1
|
|
5658
|
+
|
|
5659
|
+
### Patch Changes
|
|
5660
|
+
|
|
5661
|
+
- Updated dependencies [6b9d845619]
|
|
5662
|
+
- @redocly/portal-plugin-mock-server@0.6.1
|
|
5663
|
+
- @redocly/openapi-docs@3.9.1
|
|
5664
|
+
- @redocly/asyncapi-docs@0.2.1
|
|
5665
|
+
|
|
5650
5666
|
## 0.121.0
|
|
5651
5667
|
|
|
5652
5668
|
### Minor Changes
|
|
@@ -5756,12 +5772,6 @@
|
|
|
5756
5772
|
- @redocly/openapi-docs@3.9.0-next.1
|
|
5757
5773
|
- @redocly/portal-plugin-mock-server@0.6.0-next.1
|
|
5758
5774
|
|
|
5759
|
-
## 0.120.2
|
|
5760
|
-
|
|
5761
|
-
### Patch Changes
|
|
5762
|
-
|
|
5763
|
-
- 4a4316e308: Fixed an issue where using links to an OpenAPI file generated by the `output` configuration property caused errors which failed the build.
|
|
5764
|
-
|
|
5765
5775
|
## 0.121.0-next.0
|
|
5766
5776
|
|
|
5767
5777
|
### Patch Changes
|
|
@@ -5775,6 +5785,12 @@
|
|
|
5775
5785
|
- @redocly/openapi-docs@3.9.0-next.0
|
|
5776
5786
|
- @redocly/theme@0.53.0-next.0
|
|
5777
5787
|
|
|
5788
|
+
## 0.120.2
|
|
5789
|
+
|
|
5790
|
+
### Patch Changes
|
|
5791
|
+
|
|
5792
|
+
- 4a4316e308: Fixed an issue where using links to an OpenAPI file generated by the `output` configuration property caused errors which failed the build.
|
|
5793
|
+
|
|
5778
5794
|
## 0.120.1
|
|
5779
5795
|
|
|
5780
5796
|
### Patch Changes
|
|
@@ -5867,12 +5883,6 @@
|
|
|
5867
5883
|
- @redocly/theme@0.52.0-next.3
|
|
5868
5884
|
- @redocly/graphql-docs@0.9.0-next.0
|
|
5869
5885
|
|
|
5870
|
-
## 0.119.1
|
|
5871
|
-
|
|
5872
|
-
### Patch Changes
|
|
5873
|
-
|
|
5874
|
-
- 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.
|
|
5875
|
-
|
|
5876
5886
|
## 0.120.0-next.3
|
|
5877
5887
|
|
|
5878
5888
|
### Patch Changes
|
|
@@ -5919,6 +5929,12 @@
|
|
|
5919
5929
|
- @redocly/portal-plugin-mock-server@0.5.0-next.0
|
|
5920
5930
|
- @redocly/theme@0.52.0-next.0
|
|
5921
5931
|
|
|
5932
|
+
## 0.119.1
|
|
5933
|
+
|
|
5934
|
+
### Patch Changes
|
|
5935
|
+
|
|
5936
|
+
- 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.
|
|
5937
|
+
|
|
5922
5938
|
## 0.119.0
|
|
5923
5939
|
|
|
5924
5940
|
### 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};
|