@scalar/workspace-store 0.68.2 → 0.68.4
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 +39 -0
- package/README.md +20 -0
- package/dist/channel-example/build-connection-url.d.ts.map +1 -1
- package/dist/channel-example/build-connection-url.js +6 -5
- package/dist/channel-example/get-all-channel-messages.js +2 -2
- package/dist/channel-example/get-async-api-protocols.d.ts +3 -1
- package/dist/channel-example/get-async-api-protocols.d.ts.map +1 -1
- package/dist/channel-example/get-async-api-protocols.js +9 -5
- package/dist/channel-example/get-asyncapi-security-requirements.d.ts +14 -2
- package/dist/channel-example/get-asyncapi-security-requirements.d.ts.map +1 -1
- package/dist/channel-example/get-asyncapi-security-requirements.js +93 -36
- package/dist/channel-example/get-channel-connection-context.d.ts.map +1 -1
- package/dist/channel-example/get-channel-connection-context.js +3 -4
- package/dist/channel-example/get-channel-connection-security.d.ts +3 -2
- package/dist/channel-example/get-channel-connection-security.d.ts.map +1 -1
- package/dist/channel-example/get-channel-connection-security.js +4 -6
- package/dist/channel-example/get-channel-operations.d.ts.map +1 -1
- package/dist/channel-example/get-channel-operations.js +4 -3
- package/dist/channel-example/get-channel-parameters.d.ts.map +1 -1
- package/dist/channel-example/get-channel-parameters.js +4 -3
- package/dist/channel-example/index.d.ts +2 -2
- package/dist/channel-example/index.d.ts.map +1 -1
- package/dist/channel-example/index.js +2 -2
- package/dist/channel-example/resolve-channel.d.ts.map +1 -1
- package/dist/channel-example/resolve-channel.js +4 -3
- package/dist/channel-example/resolve-operation-channel.d.ts.map +1 -1
- package/dist/channel-example/resolve-operation-channel.js +8 -6
- package/dist/channel-example/resolve-operation-with-traits.d.ts +1 -3
- package/dist/channel-example/resolve-operation-with-traits.d.ts.map +1 -1
- package/dist/channel-example/resolve-operation-with-traits.js +3 -41
- package/dist/channel-example/servers.d.ts.map +1 -1
- package/dist/channel-example/servers.js +4 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +8 -4
- package/dist/entities/auth/schema.d.ts +25 -0
- package/dist/entities/auth/schema.d.ts.map +1 -1
- package/dist/entities/auth/schema.js +2 -0
- package/dist/events/definitions/operation.d.ts +7 -0
- package/dist/events/definitions/operation.d.ts.map +1 -1
- package/dist/helpers/asyncapi-chunk-groups.d.ts.map +1 -1
- package/dist/helpers/asyncapi-chunk-groups.js +8 -4
- package/dist/helpers/asyncapi-model-chunk-reference.d.ts.map +1 -1
- package/dist/helpers/asyncapi-model-chunk-reference.js +2 -1
- package/dist/helpers/auth-secret-fields.d.ts +11 -0
- package/dist/helpers/auth-secret-fields.d.ts.map +1 -1
- package/dist/helpers/auth-secret-fields.js +22 -0
- package/dist/helpers/encode-path-parameter.d.ts.map +1 -1
- package/dist/helpers/encode-path-parameter.js +11 -12
- package/dist/helpers/external-examples.d.ts.map +1 -1
- package/dist/helpers/external-examples.js +6 -3
- package/dist/helpers/get-async-api-schema-view.d.ts +8 -0
- package/dist/helpers/get-async-api-schema-view.d.ts.map +1 -0
- package/dist/helpers/get-async-api-schema-view.js +82 -0
- package/dist/helpers/get-boolean-schema.d.ts +7 -0
- package/dist/helpers/get-boolean-schema.d.ts.map +1 -0
- package/dist/helpers/get-boolean-schema.js +5 -0
- package/dist/helpers/get-resolved-async-api-ref.d.ts +10 -0
- package/dist/helpers/get-resolved-async-api-ref.d.ts.map +1 -0
- package/dist/helpers/get-resolved-async-api-ref.js +18 -0
- package/dist/helpers/get-resolved-ref-deep.d.ts.map +1 -1
- package/dist/helpers/normalize-boolean-schemas.d.ts.map +1 -1
- package/dist/helpers/normalize-boolean-schemas.js +6 -1
- package/dist/helpers/operation-examples.d.ts.map +1 -1
- package/dist/helpers/operation-examples.js +2 -1
- package/dist/helpers/querystring-parameter.d.ts.map +1 -1
- package/dist/helpers/querystring-parameter.js +6 -6
- package/dist/helpers/resolve-security-requirements.d.ts.map +1 -1
- package/dist/helpers/resolve-security-requirements.js +38 -19
- package/dist/helpers/resolve-traits.d.ts +3 -0
- package/dist/helpers/resolve-traits.d.ts.map +1 -0
- package/dist/helpers/resolve-traits.js +76 -0
- package/dist/helpers/serialize-stream-example.js +1 -1
- package/dist/helpers/snapshot-schema.d.ts +9 -0
- package/dist/helpers/snapshot-schema.d.ts.map +1 -0
- package/dist/helpers/snapshot-schema.js +38 -0
- package/dist/helpers/use-external-examples.d.ts.map +1 -1
- package/dist/helpers/use-external-examples.js +10 -5
- package/dist/mutators/auth.d.ts +2 -1
- package/dist/mutators/auth.d.ts.map +1 -1
- package/dist/mutators/auth.js +32 -2
- package/dist/mutators/index.d.ts +2 -2
- package/dist/mutators/operation/helpers/har-to-operation.d.ts.map +1 -1
- package/dist/mutators/operation/helpers/har-to-operation.js +4 -2
- package/dist/mutators/operation/operation.d.ts.map +1 -1
- package/dist/mutators/operation/operation.js +4 -2
- package/dist/mutators/operation/parameters.d.ts.map +1 -1
- package/dist/mutators/operation/parameters.js +23 -1
- package/dist/mutators/tag.d.ts.map +1 -1
- package/dist/mutators/tag.js +4 -2
- package/dist/navigation/get-navigation-options.d.ts.map +1 -1
- package/dist/navigation/get-navigation-options.js +9 -5
- package/dist/navigation/helpers/get-tag-external-docs.d.ts +4 -0
- package/dist/navigation/helpers/get-tag-external-docs.d.ts.map +1 -0
- package/dist/navigation/helpers/get-tag-external-docs.js +6 -0
- package/dist/navigation/helpers/traverse-asyncapi-document.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-asyncapi-document.js +75 -36
- package/dist/navigation/helpers/traverse-paths.js +1 -1
- package/dist/navigation/helpers/traverse-schemas.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-schemas.js +2 -1
- package/dist/navigation/helpers/traverse-tags.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-tags.js +3 -0
- package/dist/plugins/bundler/index.d.ts.map +1 -1
- package/dist/plugins/bundler/index.js +2 -1
- package/dist/plugins/bundler/openapi-document.d.ts.map +1 -1
- package/dist/plugins/bundler/openapi-document.js +2 -1
- package/dist/request-example/builder/body/build-multipart.d.ts.map +1 -1
- package/dist/request-example/builder/body/build-multipart.js +18 -16
- package/dist/request-example/builder/body/encode-multipart-body.d.ts.map +1 -1
- package/dist/request-example/builder/body/encode-multipart-body.js +2 -1
- package/dist/request-example/builder/body/get-request-body-example.d.ts +2 -2
- package/dist/request-example/builder/body/get-request-body-example.d.ts.map +1 -1
- package/dist/request-example/builder/body/get-request-body-example.js +8 -7
- package/dist/request-example/builder/body/schema-value-coercion.d.ts.map +1 -1
- package/dist/request-example/builder/body/schema-value-coercion.js +4 -1
- package/dist/request-example/builder/header/build-request-parameters.d.ts.map +1 -1
- package/dist/request-example/builder/header/build-request-parameters.js +12 -2
- package/dist/request-example/builder/header/filter-disabled-properties.d.ts +3 -0
- package/dist/request-example/builder/header/filter-disabled-properties.d.ts.map +1 -0
- package/dist/request-example/builder/header/filter-disabled-properties.js +18 -0
- package/dist/request-example/builder/header/filter-global-cookies.d.ts +1 -1
- package/dist/request-example/builder/header/filter-global-cookies.d.ts.map +1 -1
- package/dist/request-example/builder/header/filter-global-cookies.js +15 -3
- package/dist/request-example/builder/header/is-param-disabled.d.ts +1 -1
- package/dist/request-example/builder/header/is-param-disabled.d.ts.map +1 -1
- package/dist/request-example/builder/header/is-param-disabled.js +3 -2
- package/dist/request-example/builder/helpers/get-example-from-schema.d.ts.map +1 -1
- package/dist/request-example/builder/helpers/get-example-from-schema.js +27 -16
- package/dist/request-example/builder/helpers/get-example.d.ts +2 -0
- package/dist/request-example/builder/helpers/get-example.d.ts.map +1 -1
- package/dist/request-example/builder/helpers/get-example.js +15 -5
- package/dist/request-example/builder/index.d.ts +1 -0
- package/dist/request-example/builder/index.d.ts.map +1 -1
- package/dist/request-example/builder/index.js +1 -0
- package/dist/request-example/builder/resolve-request-factory-url.d.ts.map +1 -1
- package/dist/request-example/builder/resolve-request-factory-url.js +9 -8
- package/dist/request-example/builder/security/secret-types.d.ts +13 -3
- package/dist/request-example/builder/security/secret-types.d.ts.map +1 -1
- package/dist/request-example/context/headers.js +1 -1
- package/dist/request-example/context/security/extract-security-scheme-secrets.d.ts.map +1 -1
- package/dist/request-example/context/security/extract-security-scheme-secrets.js +65 -25
- package/dist/request-example/context/security/get-selected-security.js +1 -1
- package/dist/request-example/context/security/merge-security.d.ts.map +1 -1
- package/dist/request-example/context/security/merge-security.js +12 -2
- package/dist/request-example/context/security/uses-api-key-name-override.d.ts +9 -0
- package/dist/request-example/context/security/uses-api-key-name-override.d.ts.map +1 -0
- package/dist/request-example/context/security/uses-api-key-name-override.js +9 -0
- package/dist/request-example/index.d.ts +1 -1
- package/dist/request-example/index.d.ts.map +1 -1
- package/dist/request-example/index.js +1 -1
- package/dist/request-example/xml/get-xml-example.js +2 -1
- package/dist/request-example/xml/write-xml.d.ts.map +1 -1
- package/dist/request-example/xml/write-xml.js +7 -5
- package/dist/resolve.d.ts +1 -1
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +16 -1
- package/dist/schemas/extensions/example/x-disabled.d.ts +4 -0
- package/dist/schemas/extensions/example/x-disabled.d.ts.map +1 -1
- package/dist/schemas/extensions/example/x-disabled.js +3 -1
- package/dist/schemas/navigation.d.ts +5 -1
- package/dist/schemas/navigation.d.ts.map +1 -1
- package/dist/schemas/navigation.js +2 -1
- package/dist/schemas/reference-config/index.d.ts +3 -0
- package/dist/schemas/reference-config/index.d.ts.map +1 -1
- package/dist/schemas/reference-config/settings.d.ts +3 -0
- package/dist/schemas/reference-config/settings.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/example.d.ts +3 -0
- package/dist/schemas/v3.1/strict/example.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/openapi-document.d.ts +106 -6
- package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
- package/dist/schemas/v3.2/strict/example.d.ts +3 -0
- package/dist/schemas/v3.2/strict/example.d.ts.map +1 -1
- package/dist/schemas/v3.2/strict/openapi-document.d.ts +106 -6
- package/dist/schemas/v3.2/strict/openapi-document.d.ts.map +1 -1
- package/dist/server.d.ts +7 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -7
- package/package.json +9 -9
|
@@ -10,8 +10,9 @@ export const useExampleVisibility = (target) => {
|
|
|
10
10
|
observer?.disconnect();
|
|
11
11
|
visible.value = false;
|
|
12
12
|
const node = element && ('$el' in element ? element.$el : element);
|
|
13
|
-
if (typeof Element === 'undefined' || !(node instanceof Element))
|
|
13
|
+
if (typeof Element === 'undefined' || !(node instanceof Element)) {
|
|
14
14
|
return;
|
|
15
|
+
}
|
|
15
16
|
if (typeof IntersectionObserver === 'undefined') {
|
|
16
17
|
visible.value = true;
|
|
17
18
|
return;
|
|
@@ -32,22 +33,26 @@ export const useExternalExamples = (examples, enabled = () => true, resolver) =>
|
|
|
32
33
|
.filter((example) => example !== undefined && example.value === undefined && !!example.externalValue)
|
|
33
34
|
.map((example) => getResolver()(example)));
|
|
34
35
|
watchEffect(() => {
|
|
35
|
-
if (!enabled())
|
|
36
|
+
if (!enabled()) {
|
|
36
37
|
return;
|
|
38
|
+
}
|
|
37
39
|
for (const state of states.value) {
|
|
38
|
-
if (state.status === 'idle')
|
|
40
|
+
if (state.status === 'idle') {
|
|
39
41
|
void state.load();
|
|
42
|
+
}
|
|
40
43
|
}
|
|
41
44
|
});
|
|
42
45
|
return {
|
|
43
46
|
pending: computed(() => states.value.some((state) => state.status !== 'loaded')),
|
|
44
47
|
failed: computed(() => states.value.some((state) => state.status === 'error')),
|
|
45
48
|
resolve: (example) => {
|
|
46
|
-
if (!example || example.value !== undefined || !example.externalValue)
|
|
49
|
+
if (!example || example.value !== undefined || !example.externalValue) {
|
|
47
50
|
return example;
|
|
51
|
+
}
|
|
48
52
|
const state = getResolver()(example);
|
|
49
|
-
if (state.status !== 'loaded')
|
|
53
|
+
if (state.status !== 'loaded') {
|
|
50
54
|
return example;
|
|
55
|
+
}
|
|
51
56
|
// A 3.2 example can pair structured data with external wire text. Keep both in the
|
|
52
57
|
// resolved view so raw consumers display the download and form editors retain the data.
|
|
53
58
|
if (example.dataValue !== undefined && state.serializedValue !== undefined) {
|
package/dist/mutators/auth.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { AuthenticationConfiguration } from '@scalar/types/api-reference';
|
|
1
2
|
import type { WorkspaceStore } from '../client.js';
|
|
2
3
|
import type { AuthEvents } from '../events/definitions/auth.js';
|
|
3
4
|
import type { WorkspaceDocument } from '../schemas.js';
|
|
@@ -155,7 +156,7 @@ export declare const authMutatorsFactory: ({ document, store, }: {
|
|
|
155
156
|
}) => {
|
|
156
157
|
updateSelectedSecuritySchemes: (payload: AuthEvents["auth:update:selected-security-schemes"]) => Promise<void>;
|
|
157
158
|
clearSelectedSecuritySchemes: (payload: AuthEvents["auth:clear:selected-security-schemes"]) => void;
|
|
158
|
-
updateSecurityScheme: (
|
|
159
|
+
updateSecurityScheme: (data: AuthEvents["auth:update:security-scheme"], configuredSchemes?: AuthenticationConfiguration["securitySchemes"]) => SecuritySchemeObject | undefined;
|
|
159
160
|
updateSecuritySchemeSecrets: (payload: AuthEvents["auth:update:security-scheme-secrets"]) => void;
|
|
160
161
|
resetSecuritySchemeSecret: (payload: AuthEvents["auth:reset:security-scheme-secret"]) => void;
|
|
161
162
|
clearSecuritySchemeSecrets: (payload: AuthEvents["auth:clear:security-scheme-secrets"]) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/mutators/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/mutators/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AAE9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAW3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAGlD,OAAO,KAAK,EAAgB,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAuC/F;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,6BAA6B,GACxC,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,4CAA4C,UAAU,CAAC,uCAAuC,CAAC,kBAgFhG,CAAA;AAwBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,iBAAiB,GAAG,IAAI,EAClC,mBAAmB,UAAU,CAAC,6BAA6B,CAAC,qCAwB7D,CAAA;AAqED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,qBAAqB,GAChC,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,iBAAiB,UAAU,CAAC,0BAA0B,CAAC,SAgDxD,CAAA;AAaD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,6CAA6C,UAAU,CAAC,6BAA6B,CAAC,SA0EvF,CAAA;AAqED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,0DAA0D,UAAU,CAAC,oBAAoB,CAAC,SA2D3F,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,2BAA2B,UAAU,CAAC,oBAAoB,CAAC,SAwB5D,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,WAAW,UAAU,CAAC,6BAA6B,CAAC,SAsFrD,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,sBAGjC;IACD,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CAC7B;6CAE4C,UAAU,CAAC,uCAAuC,CAAC;4CAEpD,UAAU,CAAC,sCAAsC,CAAC;iCAGlF,UAAU,CAAC,6BAA6B,CAAC,sBAC5B,2BAA2B,CAAC,iBAAiB,CAAC,KAChE,oBAAoB,GAAG,SAAS;2CAgCI,UAAU,CAAC,qCAAqC,CAAC;yCAEnD,UAAU,CAAC,mCAAmC,CAAC;0CAE9C,UAAU,CAAC,oCAAoC,CAAC;qCAErD,UAAU,CAAC,0BAA0B,CAAC;oCAEvC,UAAU,CAAC,6BAA6B,CAAC;2BAElD,UAAU,CAAC,oBAAoB,CAAC;2BAChC,UAAU,CAAC,oBAAoB,CAAC;oCACvB,UAAU,CAAC,6BAA6B,CAAC;CAG5E,CAAA"}
|
package/dist/mutators/auth.js
CHANGED
|
@@ -7,6 +7,7 @@ import { isNonOptionalSecurityRequirement } from '../helpers/is-non-optional-sec
|
|
|
7
7
|
import { mergeObjects } from '../helpers/merge-object.js';
|
|
8
8
|
import { unpackProxyObject } from '../helpers/unpack-proxy.js';
|
|
9
9
|
import { getSelectedSecurity } from '../request-example/context/security/get-selected-security.js';
|
|
10
|
+
import { usesApiKeyNameOverride } from '../request-example/context/security/uses-api-key-name-override.js';
|
|
10
11
|
import { isAsyncApiDocument, isOpenApiDocument } from '../schemas/type-guards.js';
|
|
11
12
|
/**
|
|
12
13
|
* The auth-store key for a document's selection and secret state.
|
|
@@ -590,8 +591,9 @@ export const deleteSecurityScheme = (store, document, { names }) => {
|
|
|
590
591
|
forEachPathItemOperation(pathItemRef, (method, operationRef) => {
|
|
591
592
|
// Get mutable reference for the operation (could resolve $ref proxies)
|
|
592
593
|
const resolvedOperation = getResolvedRef(operationRef);
|
|
593
|
-
if (!resolvedOperation)
|
|
594
|
+
if (!resolvedOperation) {
|
|
594
595
|
return;
|
|
596
|
+
}
|
|
595
597
|
// Remove from operation-level security array
|
|
596
598
|
if ('security' in resolvedOperation && resolvedOperation['security']) {
|
|
597
599
|
resolvedOperation['security'] = filterSecuritySchemes(resolvedOperation['security']);
|
|
@@ -616,7 +618,35 @@ export const authMutatorsFactory = ({ document, store, }) => {
|
|
|
616
618
|
return {
|
|
617
619
|
updateSelectedSecuritySchemes: (payload) => updateSelectedSecuritySchemes(store, document, payload),
|
|
618
620
|
clearSelectedSecuritySchemes: (payload) => clearSelectedSecuritySchemes(store, document, payload),
|
|
619
|
-
updateSecurityScheme: (
|
|
621
|
+
updateSecurityScheme: (data, configuredSchemes = {}) => {
|
|
622
|
+
const { payload, name } = data;
|
|
623
|
+
if (payload.type !== 'apiKey' || payload.name === undefined) {
|
|
624
|
+
return updateSecurityScheme(document, data);
|
|
625
|
+
}
|
|
626
|
+
const configured = Object.hasOwn(configuredSchemes, name) ? configuredSchemes[name] : undefined;
|
|
627
|
+
const documentScheme = getResolvedRef(getDocumentSecuritySchemes(document)[name]);
|
|
628
|
+
if (!configured || !usesApiKeyNameOverride(configured, documentScheme)) {
|
|
629
|
+
// Document-backed names must remain available to export and synchronization.
|
|
630
|
+
const updated = updateSecurityScheme(document, data);
|
|
631
|
+
const documentName = getAuthDocumentName(document);
|
|
632
|
+
const secrets = documentName ? store?.auth.getAuthSecrets(documentName, name) : undefined;
|
|
633
|
+
// Only release an existing override, so typing a name does not write secrets on every keystroke.
|
|
634
|
+
if (updated && secrets?.type === 'apiKey' && secrets.name !== undefined) {
|
|
635
|
+
updateSecuritySchemeSecrets(store, document, { name, payload: { type: 'apiKey', name: undefined } });
|
|
636
|
+
}
|
|
637
|
+
return updated;
|
|
638
|
+
}
|
|
639
|
+
const defaultName = ('name' in configured ? configured.name : undefined) ??
|
|
640
|
+
(documentScheme && typeof documentScheme === 'object' && 'name' in documentScheme
|
|
641
|
+
? documentScheme.name
|
|
642
|
+
: undefined);
|
|
643
|
+
// Restoring the default releases the override without clearing the API key token.
|
|
644
|
+
updateSecuritySchemeSecrets(store, document, {
|
|
645
|
+
name,
|
|
646
|
+
payload: { type: 'apiKey', name: payload.name === defaultName ? undefined : payload.name },
|
|
647
|
+
});
|
|
648
|
+
return undefined;
|
|
649
|
+
},
|
|
620
650
|
updateSecuritySchemeSecrets: (payload) => updateSecuritySchemeSecrets(store, document, payload),
|
|
621
651
|
resetSecuritySchemeSecret: (payload) => resetSecuritySchemeSecret(store, document, payload),
|
|
622
652
|
clearSecuritySchemeSecrets: (payload) => clearSecuritySchemeSecrets(store, document, payload),
|
package/dist/mutators/index.d.ts
CHANGED
|
@@ -66,7 +66,7 @@ export declare function generateClientMutators(store: WorkspaceStore | null): {
|
|
|
66
66
|
auth: {
|
|
67
67
|
updateSelectedSecuritySchemes: (payload: import("../events/definitions/auth.js").AuthEvents["auth:update:selected-security-schemes"]) => Promise<void>;
|
|
68
68
|
clearSelectedSecuritySchemes: (payload: import("../events/definitions/auth.js").AuthEvents["auth:clear:selected-security-schemes"]) => void;
|
|
69
|
-
updateSecurityScheme: (
|
|
69
|
+
updateSecurityScheme: (data: import("../events/definitions/auth.js").AuthEvents["auth:update:security-scheme"], configuredSchemes?: import("@scalar/types/api-reference").AuthenticationConfiguration["securitySchemes"]) => import("../schemas/v3.2/strict/security-scheme.js").SecuritySchemeObject | undefined;
|
|
70
70
|
updateSecuritySchemeSecrets: (payload: import("../events/definitions/auth.js").AuthEvents["auth:update:security-scheme-secrets"]) => void;
|
|
71
71
|
resetSecuritySchemeSecret: (payload: import("../events/definitions/auth.js").AuthEvents["auth:reset:security-scheme-secret"]) => void;
|
|
72
72
|
clearSecuritySchemeSecrets: (payload: import("../events/definitions/auth.js").AuthEvents["auth:clear:security-scheme-secrets"]) => void;
|
|
@@ -158,7 +158,7 @@ export declare function generateClientMutators(store: WorkspaceStore | null): {
|
|
|
158
158
|
auth: {
|
|
159
159
|
updateSelectedSecuritySchemes: (payload: import("../events/definitions/auth.js").AuthEvents["auth:update:selected-security-schemes"]) => Promise<void>;
|
|
160
160
|
clearSelectedSecuritySchemes: (payload: import("../events/definitions/auth.js").AuthEvents["auth:clear:selected-security-schemes"]) => void;
|
|
161
|
-
updateSecurityScheme: (
|
|
161
|
+
updateSecurityScheme: (data: import("../events/definitions/auth.js").AuthEvents["auth:update:security-scheme"], configuredSchemes?: import("@scalar/types/api-reference").AuthenticationConfiguration["securitySchemes"]) => import("../schemas/v3.2/strict/security-scheme.js").SecuritySchemeObject | undefined;
|
|
162
162
|
updateSecuritySchemeSecrets: (payload: import("../events/definitions/auth.js").AuthEvents["auth:update:security-scheme-secrets"]) => void;
|
|
163
163
|
resetSecuritySchemeSecret: (payload: import("../events/definitions/auth.js").AuthEvents["auth:reset:security-scheme-secret"]) => void;
|
|
164
164
|
clearSecuritySchemeSecrets: (payload: import("../events/definitions/auth.js").AuthEvents["auth:clear:security-scheme-secrets"]) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"har-to-operation.d.ts","sourceRoot":"","sources":["../../../../src/mutators/operation/helpers/har-to-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,8DAA8D,CAAA;AAKpH,KAAK,mBAAmB,GAAG;IACzB,6BAA6B;IAC7B,UAAU,EAAE,UAAU,CAAA;IACtB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,eAAe,CAAA;IAC/B,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC,CAAA;AAyBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,GAAI,2DAK5B,mBAAmB,KAAG,
|
|
1
|
+
{"version":3,"file":"har-to-operation.d.ts","sourceRoot":"","sources":["../../../../src/mutators/operation/helpers/har-to-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,KAAK,EAAE,eAAe,EAAmB,MAAM,8DAA8D,CAAA;AAKpH,KAAK,mBAAmB,GAAG;IACzB,6BAA6B;IAC7B,UAAU,EAAE,UAAU,CAAA;IACtB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAA;IAClB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,eAAe,CAAA;IAC/B,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACvC,CAAA;AAyBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,GAAI,2DAK5B,mBAAmB,KAAG,eA4HxB,CAAA"}
|
|
@@ -98,8 +98,9 @@ export const harToOperation = ({ harRequest, exampleKey, baseOperation = {}, pat
|
|
|
98
98
|
}
|
|
99
99
|
// Resolve the request body in case it is a reference
|
|
100
100
|
const requestBody = getResolvedRef(baseOperation.requestBody);
|
|
101
|
-
if (!requestBody)
|
|
101
|
+
if (!requestBody) {
|
|
102
102
|
return baseOperation;
|
|
103
|
+
}
|
|
103
104
|
// Ensure the content type exists in the requestBody
|
|
104
105
|
if (!requestBody.content[mimeType]) {
|
|
105
106
|
requestBody.content[mimeType] = {
|
|
@@ -150,8 +151,9 @@ const setParameterDisabled = (param, exampleKey, disabled) => {
|
|
|
150
151
|
return;
|
|
151
152
|
}
|
|
152
153
|
const example = getResolvedRef(param.examples[exampleKey]);
|
|
153
|
-
if (example)
|
|
154
|
+
if (example) {
|
|
154
155
|
example['x-disabled'] = disabled;
|
|
156
|
+
}
|
|
155
157
|
};
|
|
156
158
|
/**
|
|
157
159
|
* Finds an existing parameter in the parameters array or creates a new one.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/mutators/operation/operation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAarE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAGlD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,GAC1B,gBAAgB,cAAc,GAAG,IAAI,EACrC,SAAS,eAAe,CAAC,4BAA4B,CAAC,KACrD,MAAM,GAAG,SA0DX,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,mBAAmB,eAAe,CAAC,uBAAuB,CAAC,SAsB5D,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,yBAAyB,GACpC,UAAU,iBAAiB,GAAG,IAAI,EAClC,OAAO,cAAc,GAAG,IAAI,EAC5B,mEAAmE,eAAe,CAAC,6BAA6B,CAAC,KAChH,IAkGF,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,cAAc,GAAG,IAAI,EAChC,wBAAwB,eAAe,CAAC,4BAA4B,CAAC,SAgBtE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GACtC,WAAW,cAAc,GAAG,IAAI,EAChC,uDAAuD,eAAe,CAAC,gCAAgC,CAAC,SAuBzG,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GACjC,WAAW,cAAc,GAAG,IAAI,EAChC,sDAAsD,eAAe,CAAC,0BAA0B,CAAC,
|
|
1
|
+
{"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../../../src/mutators/operation/operation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAarE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAGlD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,eAAe,GAC1B,gBAAgB,cAAc,GAAG,IAAI,EACrC,SAAS,eAAe,CAAC,4BAA4B,CAAC,KACrD,MAAM,GAAG,SA0DX,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAC9B,OAAO,cAAc,GAAG,IAAI,EAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,mBAAmB,eAAe,CAAC,uBAAuB,CAAC,SAsB5D,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,yBAAyB,GACpC,UAAU,iBAAiB,GAAG,IAAI,EAClC,OAAO,cAAc,GAAG,IAAI,EAC5B,mEAAmE,eAAe,CAAC,6BAA6B,CAAC,KAChH,IAkGF,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAC1B,WAAW,cAAc,GAAG,IAAI,EAChC,wBAAwB,eAAe,CAAC,4BAA4B,CAAC,SAgBtE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,GACtC,WAAW,cAAc,GAAG,IAAI,EAChC,uDAAuD,eAAe,CAAC,gCAAgC,CAAC,SAuBzG,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GACjC,WAAW,cAAc,GAAG,IAAI,EAChC,sDAAsD,eAAe,CAAC,0BAA0B,CAAC,SAoDlG,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,GACjC,WAAW,cAAc,GAAG,IAAI,EAChC,+DAA+D,eAAe,CAAC,0BAA0B,CAAC,SA0E3G,CAAA"}
|
|
@@ -274,8 +274,9 @@ export const deleteOperationExample = (workspace, { meta: { path, method, exampl
|
|
|
274
274
|
// Remove the example from all operation parameters
|
|
275
275
|
operation.parameters?.forEach((parameter) => {
|
|
276
276
|
const resolvedParameter = getResolvedRef(parameter);
|
|
277
|
-
if (!resolvedParameter)
|
|
277
|
+
if (!resolvedParameter) {
|
|
278
278
|
return;
|
|
279
|
+
}
|
|
279
280
|
// Remove from content-level examples (if parameter uses content)
|
|
280
281
|
if ('content' in resolvedParameter && resolvedParameter.content) {
|
|
281
282
|
Object.values(resolvedParameter.content).forEach((mediaType) => {
|
|
@@ -325,8 +326,9 @@ export const renameOperationExample = (workspace, { meta: { path, method, exampl
|
|
|
325
326
|
const records = [];
|
|
326
327
|
operation.parameters?.forEach((parameter) => {
|
|
327
328
|
const resolvedParameter = getResolvedRef(parameter);
|
|
328
|
-
if (!resolvedParameter)
|
|
329
|
+
if (!resolvedParameter) {
|
|
329
330
|
return;
|
|
331
|
+
}
|
|
330
332
|
if ('examples' in resolvedParameter && resolvedParameter.examples) {
|
|
331
333
|
records.push(resolvedParameter.examples);
|
|
332
334
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../../src/mutators/operation/parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;
|
|
1
|
+
{"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../../src/mutators/operation/parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAOrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAmClD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,iBAAiB,GAAG,IAAI,EAClC,4CAA4C,eAAe,CAAC,4BAA4B,CAAC,SA4H1F,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,8BAA8B,GACzC,UAAU,iBAAiB,GAAG,IAAI,EAClC,uCAAuC,eAAe,CAAC,mCAAmC,CAAC,SA8C5F,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,iBAAiB,GAAG,IAAI,EAClC,6BAA6B,eAAe,CAAC,4BAA4B,CAAC,SAkC3E,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,4BAA4B,GACvC,UAAU,iBAAiB,GAAG,IAAI,EAClC,gBAAgB,eAAe,CAAC,iCAAiC,CAAC,SAgBnE,CAAA"}
|
|
@@ -3,6 +3,7 @@ import { getParameterExample } from '../../helpers/get-parameter-example.js';
|
|
|
3
3
|
import { getResolvedRef } from '../../helpers/get-resolved-ref.js';
|
|
4
4
|
import { getQuerystringParameter, serializeQuerystringParameter } from '../../helpers/querystring-parameter.js';
|
|
5
5
|
import { unpackProxyObject } from '../../helpers/unpack-proxy.js';
|
|
6
|
+
import { isParamDisabled } from '../../request-example/builder/header/is-param-disabled.js';
|
|
6
7
|
import { isOpenApiDocument } from '../../schemas/type-guards.js';
|
|
7
8
|
import { isContentTypeParameterObject } from '../../schemas/v3.2/strict/type-guards.js';
|
|
8
9
|
const getPathItemsForParameterMutation = (pathItemRef) => {
|
|
@@ -47,6 +48,7 @@ export const upsertOperationParameter = (document, { meta, type, payload, origin
|
|
|
47
48
|
const preserveQuerystringValue = querystring && payload.value === serializeQuerystringParameter(querystring);
|
|
48
49
|
const param = originalParameter;
|
|
49
50
|
const selected = getParameterExample(param, meta.exampleKey);
|
|
51
|
+
const inheritedDisabled = isParamDisabled(param, selected.example);
|
|
50
52
|
const target = param.in !== 'querystring' && !selected.serialized && isContentTypeParameterObject(param)
|
|
51
53
|
? Object.values(param.content ?? {})[0]
|
|
52
54
|
: param;
|
|
@@ -117,7 +119,27 @@ export const upsertOperationParameter = (document, { meta, type, payload, origin
|
|
|
117
119
|
example.value = payload.value;
|
|
118
120
|
}
|
|
119
121
|
}
|
|
120
|
-
|
|
122
|
+
if (payload.propertyState) {
|
|
123
|
+
// Freeze the inherited state before changing values: adding the first populated field
|
|
124
|
+
// must not implicitly enable every untouched sibling.
|
|
125
|
+
const states = { '[]': inheritedDisabled, ...example['x-scalar-disabled-properties'] };
|
|
126
|
+
const { path, previousPath, isDisabled } = payload.propertyState;
|
|
127
|
+
if (previousPath) {
|
|
128
|
+
delete states[JSON.stringify(previousPath)];
|
|
129
|
+
}
|
|
130
|
+
const key = JSON.stringify(path);
|
|
131
|
+
if (isDisabled === undefined) {
|
|
132
|
+
delete states[key];
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
states[key] = isDisabled;
|
|
136
|
+
}
|
|
137
|
+
example['x-scalar-disabled-properties'] = states;
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
example['x-disabled'] = payload.isDisabled;
|
|
141
|
+
delete example['x-scalar-disabled-properties'];
|
|
142
|
+
}
|
|
121
143
|
return;
|
|
122
144
|
}
|
|
123
145
|
// We are adding a new parameter
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/mutators/tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AASzD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAe3F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,cAAc,CAAC,SAqEvF,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/mutators/tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AASzD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAe3F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,cAAc,CAAC,SAqEvF,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAqC/F,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,WAAW;IAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE;yBAErD,SAAS,CAAC,gBAAgB,CAAC;uBAC7B,SAAS,CAAC,cAAc,CAAC;yBACvB,SAAS,CAAC,gBAAgB,CAAC;CAEnD,CAAA"}
|
package/dist/mutators/tag.js
CHANGED
|
@@ -112,8 +112,9 @@ export const deleteTag = (workspace, payload) => {
|
|
|
112
112
|
Object.values(document.paths ?? {}).forEach((pathItemRef) => {
|
|
113
113
|
forEachPathItemOperation(pathItemRef, (_method, operationRef) => {
|
|
114
114
|
const resolvedOperation = getResolvedRef(operationRef);
|
|
115
|
-
if (!resolvedOperation)
|
|
115
|
+
if (!resolvedOperation) {
|
|
116
116
|
return;
|
|
117
|
+
}
|
|
117
118
|
if ('tags' in resolvedOperation) {
|
|
118
119
|
const plainTags = unpackProxyObject(resolvedOperation.tags, { depth: 1 });
|
|
119
120
|
resolvedOperation.tags = plainTags?.filter((tag) => tag !== payload.name);
|
|
@@ -124,8 +125,9 @@ export const deleteTag = (workspace, payload) => {
|
|
|
124
125
|
Object.values(document.webhooks ?? {}).forEach((pathItemRef) => {
|
|
125
126
|
forEachPathItemOperation(pathItemRef, (_method, operationRef) => {
|
|
126
127
|
const resolvedOperation = getResolvedRef(operationRef);
|
|
127
|
-
if (!resolvedOperation)
|
|
128
|
+
if (!resolvedOperation) {
|
|
128
129
|
return;
|
|
130
|
+
}
|
|
129
131
|
const plainTags = unpackProxyObject(resolvedOperation.tags, { depth: 1 });
|
|
130
132
|
resolvedOperation.tags = plainTags?.filter((tag) => tag !== payload.name);
|
|
131
133
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-navigation-options.d.ts","sourceRoot":"","sources":["../../src/navigation/get-navigation-options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,4BAA4B,EAAgC,MAAM,6BAA6B,CAAA;AAE7G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAe7D,MAAM,MAAM,iBAAiB,GACzB,OAAO,CACL,IAAI,CACF,4BAA4B,EAC1B,qBAAqB,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,oBAAoB,GACpB,sBAAsB,CACzB,CACF,GACD,SAAS,CAAA;AAEb;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,EAAE,UAAU,iBAAiB,KAAG,
|
|
1
|
+
{"version":3,"file":"get-navigation-options.d.ts","sourceRoot":"","sources":["../../src/navigation/get-navigation-options.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,4BAA4B,EAAgC,MAAM,6BAA6B,CAAA;AAE7G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAe7D,MAAM,MAAM,iBAAiB,GACzB,OAAO,CACL,IAAI,CACF,4BAA4B,EAC1B,qBAAqB,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,oBAAoB,GACpB,sBAAsB,CACzB,CACF,GACD,SAAS,CAAA;AAEb;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,EAAE,UAAU,iBAAiB,KAAG,mBA6JxF,CAAA"}
|
|
@@ -6,11 +6,12 @@ import { DEFAULT_MODELS_SECTION_LABEL } from '@scalar/types/api-reference';
|
|
|
6
6
|
* Extension methods retain exact case because HTTP method tokens are case-sensitive.
|
|
7
7
|
* Normalizing COPY and copy would collapse distinct operations onto the same anchor.
|
|
8
8
|
*/
|
|
9
|
-
const getMethodId = (method) =>
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
: method
|
|
9
|
+
const getMethodId = (method) => {
|
|
10
|
+
if (!isHttpMethod(method)) {
|
|
11
|
+
return method;
|
|
12
|
+
}
|
|
13
|
+
return method === method.toLowerCase() ? method.toUpperCase() : `additionalOperations/${method}`;
|
|
14
|
+
};
|
|
14
15
|
/**
|
|
15
16
|
* Returns options for traversing an OpenAPI document, allowing customization of
|
|
16
17
|
* how IDs and slugs are generated for tags, headings, models, operations, and webhooks.
|
|
@@ -86,6 +87,9 @@ export const getNavigationOptions = (documentName, options) => {
|
|
|
86
87
|
}
|
|
87
88
|
// -------- Default webhook id generation logic --------
|
|
88
89
|
if (props.type === 'webhook') {
|
|
90
|
+
if (!props.name && props.method === undefined) {
|
|
91
|
+
return `${documentId}/webhooks`;
|
|
92
|
+
}
|
|
89
93
|
const prefixTag = props.parentTag
|
|
90
94
|
? `${generateId({
|
|
91
95
|
type: 'tag',
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ExternalDocumentationObject, TagObject } from '../../schemas/v3.2/strict/openapi-document.js';
|
|
2
|
+
/** Navigation is cloned and persisted, so keep documentation as plain display metadata. */
|
|
3
|
+
export declare const getTagExternalDocs: (tag: TagObject) => ExternalDocumentationObject | undefined;
|
|
4
|
+
//# sourceMappingURL=get-tag-external-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-tag-external-docs.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/get-tag-external-docs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,2BAA2B,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEpG,2FAA2F;AAC3F,eAAO,MAAM,kBAAkB,GAAI,KAAK,SAAS,KAAG,2BAA2B,GAAG,SAGjF,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { getResolvedRef } from '../../helpers/get-resolved-ref.js';
|
|
2
|
+
/** Navigation is cloned and persisted, so keep documentation as plain display metadata. */
|
|
3
|
+
export const getTagExternalDocs = (tag) => {
|
|
4
|
+
const documentation = getResolvedRef(tag.externalDocs);
|
|
5
|
+
return documentation ? { url: documentation.url, description: documentation.description } : undefined;
|
|
6
|
+
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-asyncapi-document.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-asyncapi-document.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,gBAAgB,EAA2B,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"traverse-asyncapi-document.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-asyncapi-document.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,gBAAgB,EAA2B,MAAM,4BAA4B,CAAA;AAOlH,OAAO,EAAE,KAAK,iBAAiB,EAAwB,MAAM,qCAAqC,CAAA;AAQlG,OAAO,KAAK,EAKV,iBAAiB,EAGlB,MAAM,sBAAsB,CAAA;AAM7B,oFAAoF;AACpF,KAAK,wCAAwC,GAAG,gBAAgB,GAAG;IACjE,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB,CAAA;AAqjBD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GACnC,cAAc,MAAM,EACpB,UAAU,wCAAwC,EAClD,UAAU,iBAAiB,KAC1B,iBAsJF,CAAA"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { sortByOrder } from '@scalar/helpers/array/sort-by-order';
|
|
2
2
|
import { objectKeys } from '@scalar/helpers/object/object-keys';
|
|
3
|
-
import {
|
|
3
|
+
import { resolveOperationWithTraits } from '../../channel-example/resolve-operation-with-traits.js';
|
|
4
|
+
import { getNameFromRef } from '../../helpers/get-name-from-ref.js';
|
|
5
|
+
import { getResolvedAsyncApiRef } from '../../helpers/get-resolved-async-api-ref.js';
|
|
4
6
|
import { isHidden } from '../../helpers/is-hidden.js';
|
|
5
7
|
import { unpackProxyObject } from '../../helpers/unpack-proxy.js';
|
|
6
8
|
import { getNavigationOptions } from '../../navigation/get-navigation-options.js';
|
|
7
9
|
import { getTag } from '../../navigation/helpers/get-tag.js';
|
|
10
|
+
import { getTagExternalDocs } from '../../navigation/helpers/get-tag-external-docs.js';
|
|
8
11
|
import { traverseDescription } from '../../navigation/helpers/traverse-description.js';
|
|
9
12
|
import { traverseSchemas } from '../../navigation/helpers/traverse-schemas.js';
|
|
10
13
|
/**
|
|
@@ -40,7 +43,7 @@ const getMessageTitle = (message, messageName) => pickNonEmpty(message.title, me
|
|
|
40
43
|
/**
|
|
41
44
|
* Parses a channel JSON pointer (`#/channels/<name>`) into the key used in `document.channels`.
|
|
42
45
|
*/
|
|
43
|
-
const getChannelNameFromRef = (ref) => ref
|
|
46
|
+
const getChannelNameFromRef = (ref) => getNameFromRef(ref, ['channels']);
|
|
44
47
|
/**
|
|
45
48
|
* Resolves the channel referenced by an operation.
|
|
46
49
|
*
|
|
@@ -61,10 +64,8 @@ const resolveOperationChannel = (document, operation) => {
|
|
|
61
64
|
if (!channelEntry) {
|
|
62
65
|
return undefined;
|
|
63
66
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
channel: getResolvedRef(channelEntry, mergeSiblingReferences),
|
|
67
|
-
};
|
|
67
|
+
const channel = getResolvedAsyncApiRef(channelEntry);
|
|
68
|
+
return channel ? { channelName, channel } : undefined;
|
|
68
69
|
};
|
|
69
70
|
/**
|
|
70
71
|
* Resolves which channel message names an operation references.
|
|
@@ -81,19 +82,16 @@ const resolveOperationMessageNames = (operation, channel, channelName) => {
|
|
|
81
82
|
if (operation.messages.length === 0) {
|
|
82
83
|
return [];
|
|
83
84
|
}
|
|
84
|
-
const channelScopePrefix = `#/channels/${channelName}/messages/`;
|
|
85
85
|
const names = new Set();
|
|
86
86
|
for (const messageRef of operation.messages) {
|
|
87
87
|
if (!('$ref' in messageRef)) {
|
|
88
88
|
continue;
|
|
89
89
|
}
|
|
90
90
|
// Common case: a channel-scoped reference like `#/channels/<name>/messages/<id>`.
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
91
|
+
const candidate = getNameFromRef(messageRef.$ref, ['channels', channelName, 'messages']);
|
|
92
|
+
if (candidate && channelMessages[candidate]) {
|
|
93
|
+
names.add(candidate);
|
|
94
|
+
continue;
|
|
97
95
|
}
|
|
98
96
|
// Fallback: a channel-level message that points to the same target.
|
|
99
97
|
for (const [name, entry] of Object.entries(channelMessages)) {
|
|
@@ -109,11 +107,18 @@ const resolveOperationMessageNames = (operation, channel, channelName) => {
|
|
|
109
107
|
* used by the shared tag navigation helpers.
|
|
110
108
|
*/
|
|
111
109
|
const toTagObject = (tag) => {
|
|
112
|
-
const resolved =
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
110
|
+
const resolved = getResolvedAsyncApiRef(tag);
|
|
111
|
+
if (!resolved) {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
const externalDocs = getResolvedAsyncApiRef(resolved.externalDocs);
|
|
115
|
+
return [
|
|
116
|
+
{
|
|
117
|
+
name: resolved.name,
|
|
118
|
+
...(resolved.description !== undefined ? { description: resolved.description } : {}),
|
|
119
|
+
...(externalDocs ? { externalDocs } : {}),
|
|
120
|
+
},
|
|
121
|
+
];
|
|
117
122
|
};
|
|
118
123
|
/**
|
|
119
124
|
* Sorts operation navigation entries in place using the workspace `operationsSorter` option.
|
|
@@ -137,17 +142,17 @@ const sortMessages = (entries) => {
|
|
|
137
142
|
entries.sort((a, b) => a.title.localeCompare(b.title));
|
|
138
143
|
};
|
|
139
144
|
/**
|
|
140
|
-
* Builds
|
|
145
|
+
* Builds message entries beneath a channel or operation.
|
|
141
146
|
* Resolves each message ref, skips hidden messages, and sorts the result by title.
|
|
142
147
|
*/
|
|
143
|
-
const createMessageEntries = ({ channelName, channel,
|
|
148
|
+
const createMessageEntries = ({ channelName, channel, parentId, messageNames, generateId, }) => {
|
|
144
149
|
const messages = messageNames.flatMap((messageName) => {
|
|
145
150
|
const messageNode = channel.messages?.[messageName];
|
|
146
151
|
if (!messageNode) {
|
|
147
152
|
return [];
|
|
148
153
|
}
|
|
149
|
-
const message =
|
|
150
|
-
if (isHidden(message)) {
|
|
154
|
+
const message = getResolvedAsyncApiRef(messageNode);
|
|
155
|
+
if (!message || isHidden(message)) {
|
|
151
156
|
return [];
|
|
152
157
|
}
|
|
153
158
|
return [
|
|
@@ -157,7 +162,7 @@ const createMessageEntries = ({ channelName, channel, operationId, messageNames,
|
|
|
157
162
|
type: 'asyncapi-message',
|
|
158
163
|
messageName,
|
|
159
164
|
channelName,
|
|
160
|
-
parentId
|
|
165
|
+
parentId,
|
|
161
166
|
}),
|
|
162
167
|
title: getMessageTitle(message, messageName),
|
|
163
168
|
messageName,
|
|
@@ -185,7 +190,7 @@ const createOperationEntry = ({ operationName, operation, channel, channelName,
|
|
|
185
190
|
const messageEntries = createMessageEntries({
|
|
186
191
|
channelName,
|
|
187
192
|
channel,
|
|
188
|
-
operationId,
|
|
193
|
+
parentId: operationId,
|
|
189
194
|
messageNames: resolveOperationMessageNames(operation, channel, channelName),
|
|
190
195
|
generateId,
|
|
191
196
|
});
|
|
@@ -204,7 +209,7 @@ const createOperationEntry = ({ operationName, operation, channel, channelName,
|
|
|
204
209
|
* Builds a channel navigation entry from a bucket and the operations to render under it.
|
|
205
210
|
* The same channel may appear at the document root and under each of its channel-level tags.
|
|
206
211
|
* Writes `x-scalar-order` on the source channel (when it is not a bare `$ref`) so other code can reuse the order.
|
|
207
|
-
* Returns `undefined` when the channel is hidden or
|
|
212
|
+
* Returns `undefined` when the channel is hidden or all its declared operations are hidden.
|
|
208
213
|
*/
|
|
209
214
|
const createChannelEntry = ({ bucket, operationEntries, generateId, parentId, parentTag, operationsSorter, document, }) => {
|
|
210
215
|
if (isHidden(bucket.channel)) {
|
|
@@ -229,15 +234,26 @@ const createChannelEntry = ({ bucket, operationEntries, generateId, parentId, pa
|
|
|
229
234
|
return entry ? [entry] : [];
|
|
230
235
|
});
|
|
231
236
|
sortOperations(operations, operationsSorter);
|
|
232
|
-
|
|
237
|
+
// A channel with hidden operations must not expose their messages through the fallback.
|
|
238
|
+
if (operations.length === 0 && bucket.operations.length > 0) {
|
|
233
239
|
return undefined;
|
|
234
240
|
}
|
|
241
|
+
// Keep channel-only messages reachable without duplicating messages already owned by an operation.
|
|
242
|
+
const operationMessageNames = new Set(bucket.operations.flatMap(({ operation }) => resolveOperationMessageNames(operation, bucket.channel, bucket.channelName)));
|
|
243
|
+
const messages = createMessageEntries({
|
|
244
|
+
channelName: bucket.channelName,
|
|
245
|
+
channel: bucket.channel,
|
|
246
|
+
parentId: channelId,
|
|
247
|
+
messageNames: objectKeys(bucket.channel.messages ?? {}).filter((name) => !operationMessageNames.has(name)),
|
|
248
|
+
generateId,
|
|
249
|
+
});
|
|
250
|
+
const children = [...operations, ...messages];
|
|
235
251
|
// Persist the rendered order back onto the source channel for downstream consumers.
|
|
236
252
|
// We skip channels that are stored as references, since the order should live on the target.
|
|
237
253
|
const channelNode = document.channels?.[bucket.channelName];
|
|
238
254
|
if (channelNode && !('$ref' in channelNode)) {
|
|
239
255
|
const orderedChannel = channelNode;
|
|
240
|
-
orderedChannel['x-scalar-order'] =
|
|
256
|
+
orderedChannel['x-scalar-order'] = children.map((child) => child.id);
|
|
241
257
|
}
|
|
242
258
|
return {
|
|
243
259
|
type: 'asyncapi-channel',
|
|
@@ -245,7 +261,7 @@ const createChannelEntry = ({ bucket, operationEntries, generateId, parentId, pa
|
|
|
245
261
|
title: getChannelTitle(bucket.channel, bucket.channelName),
|
|
246
262
|
channelName: bucket.channelName,
|
|
247
263
|
channelAddress: bucket.channelAddress,
|
|
248
|
-
children
|
|
264
|
+
children,
|
|
249
265
|
};
|
|
250
266
|
};
|
|
251
267
|
/**
|
|
@@ -259,6 +275,7 @@ const createTagEntry = ({ tag, generateId, children, parentId, }) => {
|
|
|
259
275
|
parentId,
|
|
260
276
|
isGroup: false,
|
|
261
277
|
});
|
|
278
|
+
const externalDocs = getTagExternalDocs(tag);
|
|
262
279
|
const title = tag['x-displayName'] ?? tag.name ?? 'Untitled Tag';
|
|
263
280
|
tag['x-scalar-order'] = children.map((child) => child.id);
|
|
264
281
|
return {
|
|
@@ -267,6 +284,7 @@ const createTagEntry = ({ tag, generateId, children, parentId, }) => {
|
|
|
267
284
|
title,
|
|
268
285
|
name: tag.name || title,
|
|
269
286
|
description: tag.description,
|
|
287
|
+
...(externalDocs ? { externalDocs } : {}),
|
|
270
288
|
children,
|
|
271
289
|
isGroup: false,
|
|
272
290
|
isWebhooks: false,
|
|
@@ -315,7 +333,7 @@ const getOrCreateChannelBucket = (channelBuckets, channelName, channel) => {
|
|
|
315
333
|
channelName,
|
|
316
334
|
channel,
|
|
317
335
|
channelAddress: getChannelAddress(channelName, channel),
|
|
318
|
-
channelTags: channel.tags?.
|
|
336
|
+
channelTags: channel.tags?.flatMap(toTagObject) ?? [],
|
|
319
337
|
operations: [],
|
|
320
338
|
};
|
|
321
339
|
channelBuckets.set(channelName, bucket);
|
|
@@ -334,8 +352,8 @@ const collectChannelBuckets = (document) => {
|
|
|
334
352
|
if (!channelNode) {
|
|
335
353
|
continue;
|
|
336
354
|
}
|
|
337
|
-
const channel =
|
|
338
|
-
if (isHidden(channel)) {
|
|
355
|
+
const channel = getResolvedAsyncApiRef(channelNode);
|
|
356
|
+
if (!channel || isHidden(channel)) {
|
|
339
357
|
continue;
|
|
340
358
|
}
|
|
341
359
|
getOrCreateChannelBucket(channelBuckets, channelName, channel);
|
|
@@ -344,10 +362,11 @@ const collectChannelBuckets = (document) => {
|
|
|
344
362
|
if (!operationNode) {
|
|
345
363
|
continue;
|
|
346
364
|
}
|
|
347
|
-
const
|
|
348
|
-
if (
|
|
365
|
+
const resolvedOperation = getResolvedAsyncApiRef(operationNode);
|
|
366
|
+
if (!resolvedOperation) {
|
|
349
367
|
continue;
|
|
350
368
|
}
|
|
369
|
+
const operation = resolveOperationWithTraits(resolvedOperation);
|
|
351
370
|
const resolved = resolveOperationChannel(document, operation);
|
|
352
371
|
if (!resolved) {
|
|
353
372
|
continue;
|
|
@@ -384,6 +403,14 @@ export const traverseAsyncApiDocument = (documentName, document, options) => {
|
|
|
384
403
|
const channelBuckets = collectChannelBuckets(document);
|
|
385
404
|
const tagsMap = new Map();
|
|
386
405
|
const untaggedChannels = [];
|
|
406
|
+
// Info-level tags own their metadata and links, rather than contributing introduction links.
|
|
407
|
+
for (const tag of (document.info.tags ?? []).flatMap(toTagObject)) {
|
|
408
|
+
if (!tag.name) {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
const entry = getTag({ tagsMap, name: tag.name, documentId, generateId });
|
|
412
|
+
entry.tag = tag;
|
|
413
|
+
}
|
|
387
414
|
for (const bucket of channelBuckets.values()) {
|
|
388
415
|
// Operation-level tags are intentionally skipped for now: every operation is rendered
|
|
389
416
|
// under its channel, and only the channel's own tags drive tag grouping below.
|
|
@@ -403,7 +430,9 @@ export const traverseAsyncApiDocument = (documentName, document, options) => {
|
|
|
403
430
|
// Channels can declare their own tags independently of any operation tags.
|
|
404
431
|
for (const tag of bucket.channelTags) {
|
|
405
432
|
const tagName = tag.name ?? 'Untitled Tag';
|
|
406
|
-
const
|
|
433
|
+
const tagEntry = getTag({ tagsMap, name: tagName, documentId, generateId });
|
|
434
|
+
tagEntry.tag = { ...tagEntry.tag, ...tag };
|
|
435
|
+
const { id: tagId, entries } = tagEntry;
|
|
407
436
|
const alreadyRegistered = entries.some((entry) => entry.type === 'asyncapi-channel' && entry.channelName === bucket.channelName);
|
|
408
437
|
if (alreadyRegistered) {
|
|
409
438
|
continue;
|
|
@@ -431,9 +460,19 @@ export const traverseAsyncApiDocument = (documentName, document, options) => {
|
|
|
431
460
|
// typed against the OpenAPI document. We hand it the resolved `components` (so a `$ref`-only
|
|
432
461
|
// wrapper still exposes its schemas) wrapped in a minimal document; the cast bridges the single
|
|
433
462
|
// overlapping field, since AsyncAPI and OpenAPI documents are otherwise distinct types.
|
|
434
|
-
const components = document.components ?
|
|
463
|
+
const components = document.components ? getResolvedAsyncApiRef(document.components) : undefined;
|
|
435
464
|
const untaggedModels = !hideModels && components?.schemas
|
|
436
|
-
? traverseSchemas({
|
|
465
|
+
? traverseSchemas({
|
|
466
|
+
documentId,
|
|
467
|
+
document: {
|
|
468
|
+
components: {
|
|
469
|
+
...components,
|
|
470
|
+
schemas: Object.fromEntries(Object.entries(components.schemas).map(([name, schema]) => [name, getResolvedAsyncApiRef(schema)])),
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
generateId,
|
|
474
|
+
tagsMap,
|
|
475
|
+
})
|
|
437
476
|
: [];
|
|
438
477
|
// Surface the Introduction entry plus any headings extracted from `info.description`
|
|
439
478
|
// before the channel/tag entries, mirroring how OpenAPI documents are traversed.
|
|
@@ -30,7 +30,7 @@ const createOperationEntry = ({ ref, operation, method, path, generateId, parent
|
|
|
30
30
|
path: path,
|
|
31
31
|
parentId: parentId,
|
|
32
32
|
});
|
|
33
|
-
const title = operationTitleSource
|
|
33
|
+
const title = operationTitleSource !== 'path' && operation.summary?.trim() ? operation.summary : path;
|
|
34
34
|
const isDeprecated = isDeprecatedOperation(operation);
|
|
35
35
|
const examples = traverseOperationExamples(operation).map((example) => ({
|
|
36
36
|
type: 'example',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"traverse-schemas.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-schemas.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"traverse-schemas.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-schemas.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,wCAAwC,CAAA;AA2C3F;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,gDAK7B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG,eAAe,EAmDlB,CAAA"}
|