@scalar/api-client 3.1.0 → 3.2.1
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 +21 -0
- package/dist/components/HttpMethod/HttpMethod.vue.d.ts +2 -2
- package/dist/components/Sidebar/Actions/SidebarListElementForm.vue.d.ts +2 -2
- package/dist/style.css +95 -71
- package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/OperationBlock.vue.js.map +1 -1
- package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js +2 -1
- package/dist/v2/blocks/operation-block/OperationBlock.vue.script.js.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +5 -1
- package/dist/v2/blocks/operation-block/helpers/send-request.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/send-request.js +2 -2
- package/dist/v2/blocks/operation-block/helpers/send-request.js.map +1 -1
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts.map +1 -1
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js +1 -1
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.js.map +1 -1
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js +4 -0
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/RequestBlock.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.js +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js +1 -0
- package/dist/v2/blocks/request-block/components/RequestBody.vue.script.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.js.map +1 -1
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js +1 -0
- package/dist/v2/blocks/request-block/components/RequestTableRow.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.js.map +1 -1
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js +3 -3
- package/dist/v2/blocks/scalar-address-bar-block/components/EnvironmentSelector.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js +131 -48
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.script.js.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts +2 -2
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuthScopesAddModal.vue.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +16 -0
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js +43 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.js.map +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.d.ts +6 -2
- package/dist/v2/components/code-input/CodeInput.vue.d.ts.map +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.js +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.js.map +1 -1
- package/dist/v2/components/code-input/CodeInput.vue.script.js +9 -4
- package/dist/v2/components/code-input/CodeInput.vue.script.js.map +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.d.ts +3 -0
- package/dist/v2/components/data-table/DataTableInput.vue.d.ts.map +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.js +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.js.map +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.script.js +7 -1
- package/dist/v2/components/data-table/DataTableInput.vue.script.js.map +1 -1
- package/dist/v2/components/forms/ConfirmationForm.vue.d.ts +2 -2
- package/dist/v2/components/sidebar/Sidebar.vue.d.ts.map +1 -1
- package/dist/v2/components/sidebar/Sidebar.vue.js.map +1 -1
- package/dist/v2/components/sidebar/Sidebar.vue.script.js +16 -8
- package/dist/v2/components/sidebar/Sidebar.vue.script.js.map +1 -1
- package/dist/v2/components/sidebar/SidebarToggle.vue.js.map +1 -1
- package/dist/v2/components/sidebar/SidebarToggle.vue.script.js +1 -1
- package/dist/v2/components/sidebar/SidebarToggle.vue.script.js.map +1 -1
- package/dist/v2/constants.js +1 -1
- package/dist/v2/features/app/App.vue.d.ts.map +1 -1
- package/dist/v2/features/app/App.vue.js.map +1 -1
- package/dist/v2/features/app/App.vue.script.js +13 -13
- package/dist/v2/features/app/App.vue.script.js.map +1 -1
- package/dist/v2/features/app/app-state.d.ts +6 -1
- package/dist/v2/features/app/app-state.d.ts.map +1 -1
- package/dist/v2/features/app/app-state.js +5 -3
- package/dist/v2/features/app/app-state.js.map +1 -1
- package/dist/v2/features/app/components/AppSidebar.vue.js +1 -1
- package/dist/v2/features/app/components/AppSidebar.vue.js.map +1 -1
- package/dist/v2/features/app/components/AppSidebar.vue.script.js +1 -1
- package/dist/v2/features/app/components/AppSidebar.vue.script.js.map +1 -1
- package/dist/v2/features/app/components/DesktopTab.vue.d.ts +2 -2
- package/dist/v2/features/app/helpers/create-api-client-app.d.ts +9 -1
- package/dist/v2/features/app/helpers/create-api-client-app.d.ts.map +1 -1
- package/dist/v2/features/app/helpers/create-api-client-app.js +3 -2
- package/dist/v2/features/app/helpers/create-api-client-app.js.map +1 -1
- package/dist/v2/features/app/helpers/routes.d.ts +4 -2
- package/dist/v2/features/app/helpers/routes.d.ts.map +1 -1
- package/dist/v2/features/app/helpers/routes.js.map +1 -1
- package/dist/v2/features/collection/DocumentCollection.vue.script.js +2 -1
- package/dist/v2/features/collection/DocumentCollection.vue.script.js.map +1 -1
- package/dist/v2/features/collection/OperationCollection.vue.script.js +2 -1
- package/dist/v2/features/collection/OperationCollection.vue.script.js.map +1 -1
- package/dist/v2/features/collection/WorkspaceCollection.vue.script.js +2 -1
- package/dist/v2/features/collection/WorkspaceCollection.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Authentication.vue.d.ts.map +1 -1
- package/dist/v2/features/collection/components/Authentication.vue.js +1 -1
- package/dist/v2/features/collection/components/Authentication.vue.js.map +1 -1
- package/dist/v2/features/collection/components/Authentication.vue.script.js +10 -1
- package/dist/v2/features/collection/components/Authentication.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Cookies.vue.script.js +1 -0
- package/dist/v2/features/collection/components/Cookies.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Editor/Editor.vue.script.js +1 -0
- package/dist/v2/features/collection/components/Editor/Editor.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Environment.vue.script.js +1 -0
- package/dist/v2/features/collection/components/Environment.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Form.vue.d.ts +2 -0
- package/dist/v2/features/collection/components/Form.vue.d.ts.map +1 -1
- package/dist/v2/features/collection/components/Form.vue.js.map +1 -1
- package/dist/v2/features/collection/components/Form.vue.script.js +4 -1
- package/dist/v2/features/collection/components/Form.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/LabelInput.vue.d.ts +1 -1
- package/dist/v2/features/collection/components/Overview.vue.script.js +1 -0
- package/dist/v2/features/collection/components/Overview.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Runner/components/Runner.vue.d.ts.map +1 -1
- package/dist/v2/features/collection/components/Runner/components/Runner.vue.js.map +1 -1
- package/dist/v2/features/collection/components/Runner/components/Runner.vue.script.js +4 -2
- package/dist/v2/features/collection/components/Runner/components/Runner.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Runner/components/RunnerTree.vue.d.ts +2 -2
- package/dist/v2/features/collection/components/Runner/hooks/use-runner-execution.d.ts +4 -2
- package/dist/v2/features/collection/components/Runner/hooks/use-runner-execution.d.ts.map +1 -1
- package/dist/v2/features/collection/components/Runner/hooks/use-runner-execution.js +3 -2
- package/dist/v2/features/collection/components/Runner/hooks/use-runner-execution.js.map +1 -1
- package/dist/v2/features/collection/components/Scripts.vue.script.js +1 -0
- package/dist/v2/features/collection/components/Scripts.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Servers.vue.d.ts.map +1 -1
- package/dist/v2/features/collection/components/Servers.vue.js.map +1 -1
- package/dist/v2/features/collection/components/Servers.vue.script.js +3 -1
- package/dist/v2/features/collection/components/Servers.vue.script.js.map +1 -1
- package/dist/v2/features/collection/components/Settings.vue.script.js +1 -0
- package/dist/v2/features/collection/components/Settings.vue.script.js.map +1 -1
- package/dist/v2/features/command-palette/components/CommandActionForm.vue.d.ts +2 -2
- package/dist/v2/features/environments/components/EnvironmentDeleteModal.vue.d.ts +2 -2
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.d.ts.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.js.map +1 -1
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js +2 -2
- package/dist/v2/features/environments/components/EnvironmentVariablesDropdown.vue.script.js.map +1 -1
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.d.ts.map +1 -1
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.js +1 -1
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.js.map +1 -1
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.script.js +2 -0
- package/dist/v2/features/global-cookies/components/CookiesTable.vue.script.js.map +1 -1
- package/dist/v2/features/modal/Modal.vue.d.ts +7 -6
- package/dist/v2/features/modal/Modal.vue.d.ts.map +1 -1
- package/dist/v2/features/modal/Modal.vue.js.map +1 -1
- package/dist/v2/features/modal/Modal.vue.script.js +2 -2
- package/dist/v2/features/modal/Modal.vue.script.js.map +1 -1
- package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts +5 -5
- package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts.map +1 -1
- package/dist/v2/features/modal/helpers/create-api-client-modal.js.map +1 -1
- package/dist/v2/features/modal/helpers/types.d.ts +1 -7
- package/dist/v2/features/modal/helpers/types.d.ts.map +1 -1
- package/dist/v2/features/modal/index.d.ts +1 -1
- package/dist/v2/features/modal/index.d.ts.map +1 -1
- package/dist/v2/features/operation/Operation.vue.d.ts +0 -5
- package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
- package/dist/v2/features/operation/Operation.vue.js.map +1 -1
- package/dist/v2/features/operation/Operation.vue.script.js.map +1 -1
- package/dist/v2/types/options.d.ts +15 -0
- package/dist/v2/types/options.d.ts.map +1 -0
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Editor.vue.script.js","names":[],"sources":["../../../../../../src/v2/features/collection/components/Editor/Editor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarHotkey, useLoadingState } from '@scalar/components'\nimport { debounce } from '@scalar/helpers/general/debounce'\nimport { isObject } from '@scalar/helpers/object/is-object'\nimport { ScalarIconArrowsIn, ScalarIconArrowsOut } from '@scalar/icons'\nimport * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n watch,\n} from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { useEditor, useJsonPointerLinkSupport } from '@/v2/features/editor'\nimport { createJsonModel } from '@/v2/features/editor/helpers/json/create-json-model'\nimport { createYamlModel } from '@/v2/features/editor/helpers/yaml/create-yaml-model'\nimport { useEditorMarkers } from '@/v2/features/editor/hooks/use-editor-markers'\n\nimport EditorDiagnosticsPanel from './components/EditorDiagnosticsPanel.vue'\nimport EditorSavePanel from './components/EditorSavePanel.vue'\nimport { getDiagnosticCounts } from './helpers/get-diagnostic-counts'\nimport { getOperationContext } from './helpers/get-operation-context'\nimport { getVisibleDiagnostics } from './helpers/get-visible-diagnostics'\nimport { parseEditorObject } from './helpers/parse-editor-object'\nimport { stringifyDocument } from './helpers/stringify-document'\nimport { useEditorState } from './hooks/use-editor-state'\n\nconst { collectionType, documentSlug, method, path, workspaceStore } =\n defineProps<CollectionProps>()\n\nconst MAX_VISIBLE_DIAGNOSTICS = 6\nconst EDITOR_PERSIST_DEBOUNCE_KEY = 'editor:replace-document'\n\nconst monacoEditorRef = ref<HTMLElement>()\nconst editorApi = shallowRef<ReturnType<typeof useEditor>>()\n\nconst saveLoader = useLoadingState()\nconst {\n isAutoSaveEnabled,\n isDirty,\n editorLanguage,\n isDiagnosticsPaneExpanded,\n isEditorMaximized,\n isYamlMode,\n editorBottomPadding,\n editorRootClass,\n getLanguageToggleClass,\n toggleEditorMaximized,\n} = useEditorState()\n\nconst jsonModel = createJsonModel()\nconst yamlModel = createYamlModel()\n\nconst selectedLanguage = ref<'json' | 'yaml'>('json')\n\nconst currentModel = computed(() => {\n return selectedLanguage.value === 'json' ? jsonModel : yamlModel\n})\n\nconst monacoEditorInstance = computed(() => editorApi.value?.editor)\nconst { markers: diagnostics } = useEditorMarkers(monacoEditorInstance)\n\nconst syncEditorBottomPadding = () => {\n editorApi.value?.editor.updateOptions({\n padding: {\n top: 0,\n bottom: editorBottomPadding.value,\n },\n })\n}\n\nconst diagnosticCounts = computed(() => getDiagnosticCounts(diagnostics.value))\nconst visibleDiagnostics = computed(() =>\n getVisibleDiagnostics(diagnostics.value, MAX_VISIBLE_DIAGNOSTICS),\n)\n\nconst focusDiagnostic = (marker: monaco.editor.IMarker) => {\n const editor = editorApi.value?.editor\n if (!editor) {\n return\n }\n editor.setSelection({\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n })\n editor.revealPositionInCenter({\n lineNumber: marker.startLineNumber,\n column: marker.startColumn,\n })\n}\n\nconst getEditorValue = (): string | null => currentModel.value.model.getValue()\n\n/** Value from the editor for a specific language (use when switching to avoid reading the wrong model). */\nconst getEditorValueForLanguage = (language: 'json' | 'yaml'): string | null =>\n (language === 'json' ? jsonModel : yamlModel).model.getValue()\n\nconst getDocumentValue = async (\n language?: 'json' | 'yaml',\n): Promise<string> => {\n const document = await workspaceStore.getEditableDocument(documentSlug)\n return stringifyDocument(document, language ?? selectedLanguage.value)\n}\n\nconst debouncedPersist = debounce({ delay: 1500 })\n\nconst applyProgrammaticEditorValue = (value: string): void => {\n // Cancel pending auto-save work so synthetic model updates do not persist stale data.\n debouncedPersist.cleanup()\n editorApi.value?.setValue(value, true)\n}\n\nconst loadDocumentIntoEditor = async () => {\n applyProgrammaticEditorValue(await getDocumentValue())\n isDirty.value = false\n await focusOperation()\n}\n\nconst formatDocument = async () => {\n await editorApi.value?.formatDocument()\n}\n\nconst focusOperation = async () => {\n const operationContext = getOperationContext(path, method)\n if (!operationContext) {\n return\n }\n\n await editorApi.value?.focusPath([\n 'paths',\n operationContext.path,\n operationContext.method,\n ])\n}\n\nconst persistEditorToWorkspace = async (value: string) => {\n const parsed = parseEditorObject(value, editorLanguage.value)\n if (!parsed) {\n const firstError = diagnostics.value.find(\n (m) => m.severity === monaco.MarkerSeverity.Error,\n )\n if (firstError) {\n focusDiagnostic(firstError)\n }\n await saveLoader.invalidate()\n return\n }\n\n saveLoader.start()\n await workspaceStore.replaceDocument(documentSlug, parsed)\n isDirty.value = false\n await saveLoader.validate({ duration: 900 })\n}\n\nconst saveNow = async () => {\n const value = getEditorValue()\n if (!value) {\n return\n }\n await persistEditorToWorkspace(value)\n}\n\nconst handleEditorChange = (value: string) => {\n isDirty.value = true\n\n if (!isAutoSaveEnabled.value) {\n return\n }\n\n debouncedPersist.execute(EDITOR_PERSIST_DEBOUNCE_KEY, () =>\n persistEditorToWorkspace(value),\n )\n}\n\nconst focusOperationServers = async () => {\n const operationContext = getOperationContext(path, method)\n if (!operationContext) {\n return\n }\n\n const value = getEditorValue()\n if (!value) {\n return\n }\n\n const parsed = parseEditorObject(value, editorLanguage.value)\n\n if (!parsed || !isObject(parsed.paths)) {\n return\n }\n\n const pathsObject = parsed.paths as Record<string, unknown>\n const operationPathItem = pathsObject[operationContext.path]\n if (!isObject(operationPathItem)) {\n return\n }\n\n const operation = operationPathItem[operationContext.method]\n if (!isObject(operation)) {\n return\n }\n\n // Add default servers if not present\n operation.servers ??= []\n\n // Update the editor value\n editorApi.value?.setValue(stringifyDocument(parsed, editorLanguage.value))\n await editorApi.value?.focusPath([\n 'paths',\n operationContext.path,\n operationContext.method,\n 'servers',\n ])\n}\n\nuseJsonPointerLinkSupport(editorApi, currentModel)\n\nonMounted(() => {\n editorApi.value = useEditor({\n element: monacoEditorRef.value ?? document.createElement('div'),\n onChange: handleEditorChange,\n model: currentModel,\n actions: [\n {\n id: 'scalar.editor.focusOperation',\n label: 'Focus Operation',\n keybindings: [monaco.KeyMod.Alt | monaco.KeyCode.KeyO],\n run: async () => {\n await focusOperation()\n },\n },\n {\n id: 'scalar.editor.focusOperationServers',\n label: 'Focus Operation Servers',\n keybindings: [monaco.KeyMod.Alt | monaco.KeyCode.KeyS],\n run: async () => {\n await focusOperationServers()\n },\n },\n {\n id: 'scalar.editor.formatDocument',\n label: 'Format Document',\n keybindings: [\n monaco.KeyMod.Alt | monaco.KeyMod.Shift | monaco.KeyCode.KeyF,\n ],\n run: async () => {\n await formatDocument()\n },\n },\n ],\n })\n\n syncEditorBottomPadding()\n void loadDocumentIntoEditor()\n})\n\nonBeforeUnmount(() => {\n debouncedPersist.cleanup()\n\n // Persist if there is a pending save\n if (isDirty.value && isAutoSaveEnabled.value) {\n void saveNow()\n }\n editorApi.value?.dispose?.()\n // Dispose models created at setup; useEditor only disposes the editor widget, not external models.\n jsonModel.model.dispose()\n yamlModel.model.dispose()\n})\n\nwatch(() => documentSlug, loadDocumentIntoEditor)\n\nwatch(\n () => [path, method] as const,\n async () => {\n await focusOperation()\n },\n)\n\nwatch(isDiagnosticsPaneExpanded, () => {\n syncEditorBottomPadding()\n})\n\nwatch(editorLanguage, async (nextLanguage, previousLanguage) => {\n const wasDirty = isDirty.value\n // Read from the previous model before switching; getEditorValue() would use currentModel\n // which changes with selectedLanguage, so we would read the (empty) new model otherwise.\n const value = getEditorValueForLanguage(previousLanguage ?? 'json')\n if (!value) {\n selectedLanguage.value = nextLanguage\n await nextTick()\n await focusOperation()\n return\n }\n\n const parsed = parseEditorObject(value, previousLanguage ?? 'json')\n selectedLanguage.value = nextLanguage\n await nextTick()\n if (parsed) {\n applyProgrammaticEditorValue(stringifyDocument(parsed, nextLanguage))\n isDirty.value = wasDirty\n }\n await focusOperation()\n})\n\nwatch(\n isAutoSaveEnabled,\n (isEnabled) => {\n if (!isEnabled) {\n debouncedPersist.cleanup()\n return\n }\n\n if (isDirty.value) {\n const value = getEditorValue()\n if (!value) {\n return\n }\n debouncedPersist.execute(EDITOR_PERSIST_DEBOUNCE_KEY, () =>\n persistEditorToWorkspace(value),\n )\n }\n },\n { flush: 'post' },\n)\n</script>\n\n<template>\n <div\n v-if=\"\n collectionType === 'operation' &&\n getOperationContext(path, method) !== null\n \"\n class=\"flex w-full min-w-0 flex-1 flex-col gap-2\"\n :class=\"editorRootClass\">\n <div\n class=\"grid grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-3\">\n <div\n class=\"flex min-w-0 items-center gap-1 overflow-x-auto whitespace-nowrap\">\n <span class=\"text-c-2 text-xs font-medium whitespace-nowrap\">\n Shortcuts\n </span>\n\n <ScalarButton\n class=\"whitespace-nowrap\"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"focusOperation\">\n <span>Operation</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarHotkey\n hotkey=\"O\"\n :modifier=\"['Alt']\" />\n </span>\n </ScalarButton>\n\n <ScalarButton\n class=\"whitespace-nowrap\"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"focusOperationServers\">\n <span>Servers</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarHotkey\n hotkey=\"S\"\n :modifier=\"['Alt']\" />\n </span>\n </ScalarButton>\n </div>\n\n <div\n aria-label=\"Editor language\"\n class=\"bg-b-1 shadow-border flex items-center justify-self-center overflow-hidden rounded-lg p-0.5\"\n role=\"tablist\">\n <ScalarButton\n :aria-selected=\"!isYamlMode\"\n :class=\"getLanguageToggleClass(!isYamlMode)\"\n role=\"tab\"\n size=\"xs\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"editorLanguage = 'json'\">\n JSON\n </ScalarButton>\n <ScalarButton\n :aria-selected=\"isYamlMode\"\n :class=\"getLanguageToggleClass(isYamlMode)\"\n role=\"tab\"\n size=\"xs\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"editorLanguage = 'yaml'\">\n YAML\n </ScalarButton>\n </div>\n\n <div class=\"flex min-w-0 shrink-0 items-center gap-2 justify-self-end\">\n <ScalarButton\n size=\"xs\"\n variant=\"ghost\"\n @click=\"formatDocument\">\n <span>Format {{ isYamlMode ? 'YAML' : 'JSON' }}</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarHotkey\n hotkey=\"F\"\n :modifier=\"['Alt', 'Shift']\" />\n </span>\n </ScalarButton>\n <ScalarButton\n :aria-label=\"\n isEditorMaximized ? 'Restore editor size' : 'Maximize editor'\n \"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"toggleEditorMaximized\">\n <span>{{ isEditorMaximized ? 'Restore' : 'Maximize' }}</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarIconArrowsIn\n v-if=\"isEditorMaximized\"\n class=\"size-3.5\" />\n <ScalarIconArrowsOut\n v-else\n class=\"size-3.5\" />\n </span>\n </ScalarButton>\n </div>\n </div>\n\n <div class=\"flex min-h-0 w-full min-w-0 flex-1 rounded-lg border\">\n <div\n class=\"relative w-full min-w-0 flex-1\"\n :class=\"isEditorMaximized ? 'h-full min-h-0' : 'h-125'\">\n <div class=\"pointer-events-none absolute top-2 right-2 z-10\">\n <EditorSavePanel\n :isAutoSaveEnabled=\"isAutoSaveEnabled\"\n :isDirty=\"isDirty\"\n :saveLoader=\"saveLoader\"\n @saveNow=\"saveNow\"\n @update:isAutoSaveEnabled=\"isAutoSaveEnabled = $event\" />\n </div>\n\n <EditorDiagnosticsPanel\n :diagnosticCounts=\"diagnosticCounts\"\n :expanded=\"isDiagnosticsPaneExpanded\"\n :visibleDiagnostics=\"visibleDiagnostics\"\n @focusDiagnostic=\"focusDiagnostic\"\n @toggle=\"isDiagnosticsPaneExpanded = !isDiagnosticsPaneExpanded\" />\n\n <div\n ref=\"monacoEditorRef\"\n class=\"h-full w-full min-w-0 flex-1 [&_.monaco-editor]:rounded-lg [&_.overflow-guard]:rounded-lg\" />\n </div>\n </div>\n </div>\n <div v-else>No operation context found</div>\n</template>\n<style scoped>\n.editor-container {\n width: 100%;\n height: 100%;\n}\n\n:deep(.json-path-highlight) {\n background-color: rgba(255, 200, 0, 0.35);\n border-radius: 4px;\n}\n\n:deep(.json-focus-highlight) {\n background-color: color-mix(\n in srgb,\n var(--scalar-color-accent, #24b47e) 18%,\n transparent\n );\n border-radius: 4px;\n}\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Editor.vue.script.js","names":[],"sources":["../../../../../../src/v2/features/collection/components/Editor/Editor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarHotkey, useLoadingState } from '@scalar/components'\nimport { debounce } from '@scalar/helpers/general/debounce'\nimport { isObject } from '@scalar/helpers/object/is-object'\nimport { ScalarIconArrowsIn, ScalarIconArrowsOut } from '@scalar/icons'\nimport * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n shallowRef,\n watch,\n} from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { useEditor, useJsonPointerLinkSupport } from '@/v2/features/editor'\nimport { createJsonModel } from '@/v2/features/editor/helpers/json/create-json-model'\nimport { createYamlModel } from '@/v2/features/editor/helpers/yaml/create-yaml-model'\nimport { useEditorMarkers } from '@/v2/features/editor/hooks/use-editor-markers'\n\nimport EditorDiagnosticsPanel from './components/EditorDiagnosticsPanel.vue'\nimport EditorSavePanel from './components/EditorSavePanel.vue'\nimport { getDiagnosticCounts } from './helpers/get-diagnostic-counts'\nimport { getOperationContext } from './helpers/get-operation-context'\nimport { getVisibleDiagnostics } from './helpers/get-visible-diagnostics'\nimport { parseEditorObject } from './helpers/parse-editor-object'\nimport { stringifyDocument } from './helpers/stringify-document'\nimport { useEditorState } from './hooks/use-editor-state'\n\nconst { collectionType, documentSlug, method, path, workspaceStore } =\n defineProps<CollectionProps>()\n\nconst MAX_VISIBLE_DIAGNOSTICS = 6\nconst EDITOR_PERSIST_DEBOUNCE_KEY = 'editor:replace-document'\n\nconst monacoEditorRef = ref<HTMLElement>()\nconst editorApi = shallowRef<ReturnType<typeof useEditor>>()\n\nconst saveLoader = useLoadingState()\nconst {\n isAutoSaveEnabled,\n isDirty,\n editorLanguage,\n isDiagnosticsPaneExpanded,\n isEditorMaximized,\n isYamlMode,\n editorBottomPadding,\n editorRootClass,\n getLanguageToggleClass,\n toggleEditorMaximized,\n} = useEditorState()\n\nconst jsonModel = createJsonModel()\nconst yamlModel = createYamlModel()\n\nconst selectedLanguage = ref<'json' | 'yaml'>('json')\n\nconst currentModel = computed(() => {\n return selectedLanguage.value === 'json' ? jsonModel : yamlModel\n})\n\nconst monacoEditorInstance = computed(() => editorApi.value?.editor)\nconst { markers: diagnostics } = useEditorMarkers(monacoEditorInstance)\n\nconst syncEditorBottomPadding = () => {\n editorApi.value?.editor.updateOptions({\n padding: {\n top: 0,\n bottom: editorBottomPadding.value,\n },\n })\n}\n\nconst diagnosticCounts = computed(() => getDiagnosticCounts(diagnostics.value))\nconst visibleDiagnostics = computed(() =>\n getVisibleDiagnostics(diagnostics.value, MAX_VISIBLE_DIAGNOSTICS),\n)\n\nconst focusDiagnostic = (marker: monaco.editor.IMarker) => {\n const editor = editorApi.value?.editor\n if (!editor) {\n return\n }\n editor.setSelection({\n startLineNumber: marker.startLineNumber,\n startColumn: marker.startColumn,\n endLineNumber: marker.endLineNumber,\n endColumn: marker.endColumn,\n })\n editor.revealPositionInCenter({\n lineNumber: marker.startLineNumber,\n column: marker.startColumn,\n })\n}\n\nconst getEditorValue = (): string | null => currentModel.value.model.getValue()\n\n/** Value from the editor for a specific language (use when switching to avoid reading the wrong model). */\nconst getEditorValueForLanguage = (language: 'json' | 'yaml'): string | null =>\n (language === 'json' ? jsonModel : yamlModel).model.getValue()\n\nconst getDocumentValue = async (\n language?: 'json' | 'yaml',\n): Promise<string> => {\n const document = await workspaceStore.getEditableDocument(documentSlug)\n return stringifyDocument(document, language ?? selectedLanguage.value)\n}\n\nconst debouncedPersist = debounce({ delay: 1500 })\n\nconst applyProgrammaticEditorValue = (value: string): void => {\n // Cancel pending auto-save work so synthetic model updates do not persist stale data.\n debouncedPersist.cleanup()\n editorApi.value?.setValue(value, true)\n}\n\nconst loadDocumentIntoEditor = async () => {\n applyProgrammaticEditorValue(await getDocumentValue())\n isDirty.value = false\n await focusOperation()\n}\n\nconst formatDocument = async () => {\n await editorApi.value?.formatDocument()\n}\n\nconst focusOperation = async () => {\n const operationContext = getOperationContext(path, method)\n if (!operationContext) {\n return\n }\n\n await editorApi.value?.focusPath([\n 'paths',\n operationContext.path,\n operationContext.method,\n ])\n}\n\nconst persistEditorToWorkspace = async (value: string) => {\n const parsed = parseEditorObject(value, editorLanguage.value)\n if (!parsed) {\n const firstError = diagnostics.value.find(\n (m) => m.severity === monaco.MarkerSeverity.Error,\n )\n if (firstError) {\n focusDiagnostic(firstError)\n }\n await saveLoader.invalidate()\n return\n }\n\n saveLoader.start()\n await workspaceStore.replaceDocument(documentSlug, parsed)\n isDirty.value = false\n await saveLoader.validate({ duration: 900 })\n}\n\nconst saveNow = async () => {\n const value = getEditorValue()\n if (!value) {\n return\n }\n await persistEditorToWorkspace(value)\n}\n\nconst handleEditorChange = (value: string) => {\n isDirty.value = true\n\n if (!isAutoSaveEnabled.value) {\n return\n }\n\n debouncedPersist.execute(EDITOR_PERSIST_DEBOUNCE_KEY, () =>\n persistEditorToWorkspace(value),\n )\n}\n\nconst focusOperationServers = async () => {\n const operationContext = getOperationContext(path, method)\n if (!operationContext) {\n return\n }\n\n const value = getEditorValue()\n if (!value) {\n return\n }\n\n const parsed = parseEditorObject(value, editorLanguage.value)\n\n if (!parsed || !isObject(parsed.paths)) {\n return\n }\n\n const pathsObject = parsed.paths as Record<string, unknown>\n const operationPathItem = pathsObject[operationContext.path]\n if (!isObject(operationPathItem)) {\n return\n }\n\n const operation = operationPathItem[operationContext.method]\n if (!isObject(operation)) {\n return\n }\n\n // Add default servers if not present\n operation.servers ??= []\n\n // Update the editor value\n editorApi.value?.setValue(stringifyDocument(parsed, editorLanguage.value))\n await editorApi.value?.focusPath([\n 'paths',\n operationContext.path,\n operationContext.method,\n 'servers',\n ])\n}\n\nuseJsonPointerLinkSupport(editorApi, currentModel)\n\nonMounted(() => {\n editorApi.value = useEditor({\n element: monacoEditorRef.value ?? document.createElement('div'),\n onChange: handleEditorChange,\n model: currentModel,\n actions: [\n {\n id: 'scalar.editor.focusOperation',\n label: 'Focus Operation',\n keybindings: [monaco.KeyMod.Alt | monaco.KeyCode.KeyO],\n run: async () => {\n await focusOperation()\n },\n },\n {\n id: 'scalar.editor.focusOperationServers',\n label: 'Focus Operation Servers',\n keybindings: [monaco.KeyMod.Alt | monaco.KeyCode.KeyS],\n run: async () => {\n await focusOperationServers()\n },\n },\n {\n id: 'scalar.editor.formatDocument',\n label: 'Format Document',\n keybindings: [\n monaco.KeyMod.Alt | monaco.KeyMod.Shift | monaco.KeyCode.KeyF,\n ],\n run: async () => {\n await formatDocument()\n },\n },\n ],\n })\n\n syncEditorBottomPadding()\n void loadDocumentIntoEditor()\n})\n\nonBeforeUnmount(() => {\n debouncedPersist.cleanup()\n\n // Persist if there is a pending save\n if (isDirty.value && isAutoSaveEnabled.value) {\n void saveNow()\n }\n editorApi.value?.dispose?.()\n // Dispose models created at setup; useEditor only disposes the editor widget, not external models.\n jsonModel.model.dispose()\n yamlModel.model.dispose()\n})\n\nwatch(() => documentSlug, loadDocumentIntoEditor)\n\nwatch(\n () => [path, method] as const,\n async () => {\n await focusOperation()\n },\n)\n\nwatch(isDiagnosticsPaneExpanded, () => {\n syncEditorBottomPadding()\n})\n\nwatch(editorLanguage, async (nextLanguage, previousLanguage) => {\n const wasDirty = isDirty.value\n // Read from the previous model before switching; getEditorValue() would use currentModel\n // which changes with selectedLanguage, so we would read the (empty) new model otherwise.\n const value = getEditorValueForLanguage(previousLanguage ?? 'json')\n if (!value) {\n selectedLanguage.value = nextLanguage\n await nextTick()\n await focusOperation()\n return\n }\n\n const parsed = parseEditorObject(value, previousLanguage ?? 'json')\n selectedLanguage.value = nextLanguage\n await nextTick()\n if (parsed) {\n applyProgrammaticEditorValue(stringifyDocument(parsed, nextLanguage))\n isDirty.value = wasDirty\n }\n await focusOperation()\n})\n\nwatch(\n isAutoSaveEnabled,\n (isEnabled) => {\n if (!isEnabled) {\n debouncedPersist.cleanup()\n return\n }\n\n if (isDirty.value) {\n const value = getEditorValue()\n if (!value) {\n return\n }\n debouncedPersist.execute(EDITOR_PERSIST_DEBOUNCE_KEY, () =>\n persistEditorToWorkspace(value),\n )\n }\n },\n { flush: 'post' },\n)\n</script>\n\n<template>\n <div\n v-if=\"\n collectionType === 'operation' &&\n getOperationContext(path, method) !== null\n \"\n class=\"flex w-full min-w-0 flex-1 flex-col gap-2\"\n :class=\"editorRootClass\">\n <div\n class=\"grid grid-cols-[minmax(0,1fr)_auto_minmax(0,1fr)] items-center gap-3\">\n <div\n class=\"flex min-w-0 items-center gap-1 overflow-x-auto whitespace-nowrap\">\n <span class=\"text-c-2 text-xs font-medium whitespace-nowrap\">\n Shortcuts\n </span>\n\n <ScalarButton\n class=\"whitespace-nowrap\"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"focusOperation\">\n <span>Operation</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarHotkey\n hotkey=\"O\"\n :modifier=\"['Alt']\" />\n </span>\n </ScalarButton>\n\n <ScalarButton\n class=\"whitespace-nowrap\"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"focusOperationServers\">\n <span>Servers</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarHotkey\n hotkey=\"S\"\n :modifier=\"['Alt']\" />\n </span>\n </ScalarButton>\n </div>\n\n <div\n aria-label=\"Editor language\"\n class=\"bg-b-1 shadow-border flex items-center justify-self-center overflow-hidden rounded-lg p-0.5\"\n role=\"tablist\">\n <ScalarButton\n :aria-selected=\"!isYamlMode\"\n :class=\"getLanguageToggleClass(!isYamlMode)\"\n role=\"tab\"\n size=\"xs\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"editorLanguage = 'json'\">\n JSON\n </ScalarButton>\n <ScalarButton\n :aria-selected=\"isYamlMode\"\n :class=\"getLanguageToggleClass(isYamlMode)\"\n role=\"tab\"\n size=\"xs\"\n type=\"button\"\n variant=\"ghost\"\n @click=\"editorLanguage = 'yaml'\">\n YAML\n </ScalarButton>\n </div>\n\n <div class=\"flex min-w-0 shrink-0 items-center gap-2 justify-self-end\">\n <ScalarButton\n size=\"xs\"\n variant=\"ghost\"\n @click=\"formatDocument\">\n <span>Format {{ isYamlMode ? 'YAML' : 'JSON' }}</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarHotkey\n hotkey=\"F\"\n :modifier=\"['Alt', 'Shift']\" />\n </span>\n </ScalarButton>\n <ScalarButton\n :aria-label=\"\n isEditorMaximized ? 'Restore editor size' : 'Maximize editor'\n \"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"toggleEditorMaximized\">\n <span>{{ isEditorMaximized ? 'Restore' : 'Maximize' }}</span>\n <span class=\"text-c-3 ml-2 text-[11px]\">\n <ScalarIconArrowsIn\n v-if=\"isEditorMaximized\"\n class=\"size-3.5\" />\n <ScalarIconArrowsOut\n v-else\n class=\"size-3.5\" />\n </span>\n </ScalarButton>\n </div>\n </div>\n\n <div class=\"flex min-h-0 w-full min-w-0 flex-1 rounded-lg border\">\n <div\n class=\"relative w-full min-w-0 flex-1\"\n :class=\"isEditorMaximized ? 'h-full min-h-0' : 'h-125'\">\n <div class=\"pointer-events-none absolute top-2 right-2 z-10\">\n <EditorSavePanel\n :isAutoSaveEnabled=\"isAutoSaveEnabled\"\n :isDirty=\"isDirty\"\n :saveLoader=\"saveLoader\"\n @saveNow=\"saveNow\"\n @update:isAutoSaveEnabled=\"isAutoSaveEnabled = $event\" />\n </div>\n\n <EditorDiagnosticsPanel\n :diagnosticCounts=\"diagnosticCounts\"\n :expanded=\"isDiagnosticsPaneExpanded\"\n :visibleDiagnostics=\"visibleDiagnostics\"\n @focusDiagnostic=\"focusDiagnostic\"\n @toggle=\"isDiagnosticsPaneExpanded = !isDiagnosticsPaneExpanded\" />\n\n <div\n ref=\"monacoEditorRef\"\n class=\"h-full w-full min-w-0 flex-1 [&_.monaco-editor]:rounded-lg [&_.overflow-guard]:rounded-lg\" />\n </div>\n </div>\n </div>\n <div v-else>No operation context found</div>\n</template>\n<style scoped>\n.editor-container {\n width: 100%;\n height: 100%;\n}\n\n:deep(.json-path-highlight) {\n background-color: rgba(255, 200, 0, 0.35);\n border-radius: 4px;\n}\n\n:deep(.json-focus-highlight) {\n background-color: color-mix(\n in srgb,\n var(--scalar-color-accent, #24b47e) 18%,\n transparent\n );\n border-radius: 4px;\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -21,6 +21,7 @@ var Environment_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ de
|
|
|
21
21
|
fetchRegistryDocument: { type: Function },
|
|
22
22
|
telemetry: { type: Boolean },
|
|
23
23
|
onUpdateTelemetry: { type: Function },
|
|
24
|
+
options: {},
|
|
24
25
|
collectionType: {}
|
|
25
26
|
},
|
|
26
27
|
setup(__props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Environment.vue.script.js","names":[],"sources":["../../../../../src/v2/features/collection/components/Environment.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * Environment variables section for the collection.\n * Renders document or workspace environments and lets users set variables\n * that can be referenced in request inputs via {{ variable }}.\n */\nexport default {\n name: 'Environment',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { EnvironmentsList } from '@/v2/features/environments'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst { document, eventBus, collectionType, workspaceStore } =\n defineProps<CollectionProps>()\n\n/** Document or workspace environments */\nconst environments = computed(\n () =>\n (collectionType === 'document'\n ? document['x-scalar-environments']\n : workspaceStore.workspace['x-scalar-environments']) ?? {},\n)\n\nconst activeEnvironment = computed(() => {\n return workspaceStore.workspace['x-scalar-active-environment']\n})\n</script>\n\n<template>\n <Section v-if=\"collectionType !== 'operation'\">\n <template #title>Environment Variables</template>\n <template #description>\n Set environment variables at your collection level. Use\n <code\n v-pre\n class=\"font-code text-c-2\">\n {{ variable }}\n </code>\n to add / search among the selected environment's variables in your request\n inputs.\n </template>\n <EnvironmentsList\n :activeEnvironment\n :collectionType\n :environments\n :eventBus />\n </Section>\n</template>\n"],"mappings":";;;;CAOE,MAAM
|
|
1
|
+
{"version":3,"file":"Environment.vue.script.js","names":[],"sources":["../../../../../src/v2/features/collection/components/Environment.vue"],"sourcesContent":["<script lang=\"ts\">\n/**\n * Environment variables section for the collection.\n * Renders document or workspace environments and lets users set variables\n * that can be referenced in request inputs via {{ variable }}.\n */\nexport default {\n name: 'Environment',\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport { EnvironmentsList } from '@/v2/features/environments'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst { document, eventBus, collectionType, workspaceStore } =\n defineProps<CollectionProps>()\n\n/** Document or workspace environments */\nconst environments = computed(\n () =>\n (collectionType === 'document'\n ? document['x-scalar-environments']\n : workspaceStore.workspace['x-scalar-environments']) ?? {},\n)\n\nconst activeEnvironment = computed(() => {\n return workspaceStore.workspace['x-scalar-active-environment']\n})\n</script>\n\n<template>\n <Section v-if=\"collectionType !== 'operation'\">\n <template #title>Environment Variables</template>\n <template #description>\n Set environment variables at your collection level. Use\n <code\n v-pre\n class=\"font-code text-c-2\">\n {{ variable }}\n </code>\n to add / search among the selected environment's variables in your request\n inputs.\n </template>\n <EnvironmentsList\n :activeEnvironment\n :collectionType\n :environments\n :eventBus />\n </Section>\n</template>\n"],"mappings":";;;;CAOE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;EAeR,MAAM,eAAe,gBAEhB,QAAA,mBAAmB,aAChB,QAAA,SAAS,2BACT,QAAA,eAAe,UAAU,6BAA6B,EAAE,CAChE;EAEA,MAAM,oBAAoB,eAAe;AACvC,UAAO,QAAA,eAAe,UAAU;IACjC;;UAIgB,QAAA,mBAAc,eAAA,WAAA,EAA7B,YAiBU,iBAAA,EAAA,KAAA,GAAA,EAAA;IAhBG,OAAK,cAAsB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAArB,yBAAqB,GAAA,CAAA,EAAA,CAAA;IAC3B,aAAW,cAEpB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA;qBAFqB,6DAErB,GAAA;KAAA,mBAIO,QAAA,EAFL,OAAM,sBAAoB,EAAC,oBAE7B,GAAA;qBAAO,wFAGT,GAAA;;2BAKc,CAJd,YAIc,MAAA,yBAAA,EAAA;KAHX,mBAAA,kBAAA;KACA,gBAAA,QAAA;KACA,cAAA,aAAA;KACA,UAAA,QAAA"}
|
|
@@ -10,6 +10,8 @@ type __VLS_Props = {
|
|
|
10
10
|
data: Record<string, any>;
|
|
11
11
|
onUpdate: (key: string, value: string | number) => void;
|
|
12
12
|
environment: XScalarEnvironment;
|
|
13
|
+
/** Whether to show context function suggestions like $guid, $timestamp. Defaults to true */
|
|
14
|
+
withFakeData?: boolean;
|
|
13
15
|
};
|
|
14
16
|
declare var __VLS_9: {};
|
|
15
17
|
type __VLS_Slots = {} & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/collection/components/Form.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Form.vue.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/collection/components/Form.vue"],"names":[],"mappings":"AA+EA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAA;AAQnH,KAAK,WAAW,GAAG;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAA;QACX,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,YAAY,CAAC,EAAE,OAAO,CAAA;KACvB,EAAE,CAAA;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzB,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAA;IACvD,WAAW,EAAE,kBAAkB,CAAA;IAC/B,4FAA4F;IAC5F,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAC;AA2KF,QAAA,IAAI,OAAO,IAAW,CAAE;AACxB,KAAK,WAAW,GAAG,EAAE,GACnB;IAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,OAAO,KAAK,GAAG,CAAA;CAAE,CAAC;AAK7C,QAAA,MAAM,UAAU,kSAEd,CAAC;AACH,QAAA,MAAM,YAAY,EAAS,eAAe,CAAC,OAAO,UAAU,EAAE,WAAW,CAAC,CAAC;wBACtD,OAAO,YAAY;AAAxC,wBAAyC;AACzC,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IAChC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KACV,CAAA;CACD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.vue.js","names":[],"sources":["../../../../../src/v2/features/collection/components/Form.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { useId } from 'vue'\n\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport DataTable from '@/v2/components/data-table/DataTable.vue'\nimport DataTableInput from '@/v2/components/data-table/DataTableInput.vue'\nimport DataTableRow from '@/v2/components/data-table/DataTableRow.vue'\n\ndefineProps<{\n title?: string\n options: {\n key: string\n label: string\n placeholder: string\n lineWrapping?: boolean\n }[]\n data: Record<string, any>\n onUpdate: (key: string, value: string | number) => void\n environment: XScalarEnvironment\n}>()\n\nconst id = useId()\n</script>\n<template>\n <ViewLayoutSection class=\"last:rounded-b-lg\">\n <template\n v-if=\"title || $slots.title\"\n #title>\n <span v-if=\"title\">{{ title }}</span>\n <slot\n v-else\n name=\"title\" />\n </template>\n <div class=\"flex flex-1 flex-col gap-1.5\">\n <DataTable\n v-if=\"Object.keys(data).length > 0\"\n class=\"rounded-b-lg\"\n :columns=\"['']\">\n <DataTableRow\n v-for=\"(option, index) in options\"\n :key=\"index\">\n <DataTableInput\n :id=\"id\"\n class=\"pr-9\"\n :environment=\"environment\"\n :lineWrapping=\"option.lineWrapping ?? false\"\n :modelValue=\"data[option.key] ?? ''\"\n :placeholder=\"option.placeholder\"\n @update:modelValue=\"onUpdate(option.key, $event)\">\n <template #default>\n <label :for=\"id\">\n {{ option.label }}\n </label>\n </template>\n <template\n v-if=\"option.key === 'description'\"\n #icon>\n <div\n class=\"centered-y bg-b-2 flex-center absolute right-1 z-1 rounded px-1 py-0.5\">\n <ScalarIcon\n icon=\"Markdown\"\n size=\"lg\" />\n </div>\n </template>\n </DataTableInput>\n </DataTableRow>\n </DataTable>\n </div>\n </ViewLayoutSection>\n</template>\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"Form.vue.js","names":[],"sources":["../../../../../src/v2/features/collection/components/Form.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { useId } from 'vue'\n\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport DataTable from '@/v2/components/data-table/DataTable.vue'\nimport DataTableInput from '@/v2/components/data-table/DataTableInput.vue'\nimport DataTableRow from '@/v2/components/data-table/DataTableRow.vue'\n\ndefineProps<{\n title?: string\n options: {\n key: string\n label: string\n placeholder: string\n lineWrapping?: boolean\n }[]\n data: Record<string, any>\n onUpdate: (key: string, value: string | number) => void\n environment: XScalarEnvironment\n /** Whether to show context function suggestions like $guid, $timestamp. Defaults to true */\n withFakeData?: boolean\n}>()\n\nconst id = useId()\n</script>\n<template>\n <ViewLayoutSection class=\"last:rounded-b-lg\">\n <template\n v-if=\"title || $slots.title\"\n #title>\n <span v-if=\"title\">{{ title }}</span>\n <slot\n v-else\n name=\"title\" />\n </template>\n <div class=\"flex flex-1 flex-col gap-1.5\">\n <DataTable\n v-if=\"Object.keys(data).length > 0\"\n class=\"rounded-b-lg\"\n :columns=\"['']\">\n <DataTableRow\n v-for=\"(option, index) in options\"\n :key=\"index\">\n <DataTableInput\n :id=\"id\"\n class=\"pr-9\"\n :environment=\"environment\"\n :lineWrapping=\"option.lineWrapping ?? false\"\n :modelValue=\"data[option.key] ?? ''\"\n :placeholder=\"option.placeholder\"\n :withFakeData=\"withFakeData ?? true\"\n @update:modelValue=\"onUpdate(option.key, $event)\">\n <template #default>\n <label :for=\"id\">\n {{ option.label }}\n </label>\n </template>\n <template\n v-if=\"option.key === 'description'\"\n #icon>\n <div\n class=\"centered-y bg-b-2 flex-center absolute right-1 z-1 rounded px-1 py-0.5\">\n <ScalarIcon\n icon=\"Markdown\"\n size=\"lg\" />\n </div>\n </template>\n </DataTableInput>\n </DataTableRow>\n </DataTable>\n </div>\n </ViewLayoutSection>\n</template>\n"],"mappings":""}
|
|
@@ -16,7 +16,8 @@ var Form_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
|
|
|
16
16
|
options: {},
|
|
17
17
|
data: {},
|
|
18
18
|
onUpdate: { type: Function },
|
|
19
|
-
environment: {}
|
|
19
|
+
environment: {},
|
|
20
|
+
withFakeData: { type: Boolean }
|
|
20
21
|
},
|
|
21
22
|
setup(__props) {
|
|
22
23
|
const id = useId();
|
|
@@ -36,6 +37,7 @@ var Form_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
|
|
|
36
37
|
lineWrapping: option.lineWrapping ?? false,
|
|
37
38
|
modelValue: __props.data[option.key] ?? "",
|
|
38
39
|
placeholder: option.placeholder,
|
|
40
|
+
withFakeData: __props.withFakeData ?? true,
|
|
39
41
|
"onUpdate:modelValue": ($event) => __props.onUpdate(option.key, $event)
|
|
40
42
|
}, createSlots({
|
|
41
43
|
default: withCtx(() => [createElementVNode("label", { for: unref(id) }, toDisplayString(option.label), 9, _hoisted_3)]),
|
|
@@ -53,6 +55,7 @@ var Form_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCom
|
|
|
53
55
|
"lineWrapping",
|
|
54
56
|
"modelValue",
|
|
55
57
|
"placeholder",
|
|
58
|
+
"withFakeData",
|
|
56
59
|
"onUpdate:modelValue"
|
|
57
60
|
])]),
|
|
58
61
|
_: 2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Form.vue.script.js","names":["$slots"],"sources":["../../../../../src/v2/features/collection/components/Form.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { useId } from 'vue'\n\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport DataTable from '@/v2/components/data-table/DataTable.vue'\nimport DataTableInput from '@/v2/components/data-table/DataTableInput.vue'\nimport DataTableRow from '@/v2/components/data-table/DataTableRow.vue'\n\ndefineProps<{\n title?: string\n options: {\n key: string\n label: string\n placeholder: string\n lineWrapping?: boolean\n }[]\n data: Record<string, any>\n onUpdate: (key: string, value: string | number) => void\n environment: XScalarEnvironment\n}>()\n\nconst id = useId()\n</script>\n<template>\n <ViewLayoutSection class=\"last:rounded-b-lg\">\n <template\n v-if=\"title || $slots.title\"\n #title>\n <span v-if=\"title\">{{ title }}</span>\n <slot\n v-else\n name=\"title\" />\n </template>\n <div class=\"flex flex-1 flex-col gap-1.5\">\n <DataTable\n v-if=\"Object.keys(data).length > 0\"\n class=\"rounded-b-lg\"\n :columns=\"['']\">\n <DataTableRow\n v-for=\"(option, index) in options\"\n :key=\"index\">\n <DataTableInput\n :id=\"id\"\n class=\"pr-9\"\n :environment=\"environment\"\n :lineWrapping=\"option.lineWrapping ?? false\"\n :modelValue=\"data[option.key] ?? ''\"\n :placeholder=\"option.placeholder\"\n @update:modelValue=\"onUpdate(option.key, $event)\">\n <template #default>\n <label :for=\"id\">\n {{ option.label }}\n </label>\n </template>\n <template\n v-if=\"option.key === 'description'\"\n #icon>\n <div\n class=\"centered-y bg-b-2 flex-center absolute right-1 z-1 rounded px-1 py-0.5\">\n <ScalarIcon\n icon=\"Markdown\"\n size=\"lg\" />\n </div>\n </template>\n </DataTableInput>\n </DataTableRow>\n </DataTable>\n </div>\n </ViewLayoutSection>\n</template>\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"Form.vue.script.js","names":["$slots"],"sources":["../../../../../src/v2/features/collection/components/Form.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIcon } from '@scalar/components'\nimport type { XScalarEnvironment } from '@scalar/workspace-store/schemas/extensions/document/x-scalar-environments'\nimport { useId } from 'vue'\n\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport DataTable from '@/v2/components/data-table/DataTable.vue'\nimport DataTableInput from '@/v2/components/data-table/DataTableInput.vue'\nimport DataTableRow from '@/v2/components/data-table/DataTableRow.vue'\n\ndefineProps<{\n title?: string\n options: {\n key: string\n label: string\n placeholder: string\n lineWrapping?: boolean\n }[]\n data: Record<string, any>\n onUpdate: (key: string, value: string | number) => void\n environment: XScalarEnvironment\n /** Whether to show context function suggestions like $guid, $timestamp. Defaults to true */\n withFakeData?: boolean\n}>()\n\nconst id = useId()\n</script>\n<template>\n <ViewLayoutSection class=\"last:rounded-b-lg\">\n <template\n v-if=\"title || $slots.title\"\n #title>\n <span v-if=\"title\">{{ title }}</span>\n <slot\n v-else\n name=\"title\" />\n </template>\n <div class=\"flex flex-1 flex-col gap-1.5\">\n <DataTable\n v-if=\"Object.keys(data).length > 0\"\n class=\"rounded-b-lg\"\n :columns=\"['']\">\n <DataTableRow\n v-for=\"(option, index) in options\"\n :key=\"index\">\n <DataTableInput\n :id=\"id\"\n class=\"pr-9\"\n :environment=\"environment\"\n :lineWrapping=\"option.lineWrapping ?? false\"\n :modelValue=\"data[option.key] ?? ''\"\n :placeholder=\"option.placeholder\"\n :withFakeData=\"withFakeData ?? true\"\n @update:modelValue=\"onUpdate(option.key, $event)\">\n <template #default>\n <label :for=\"id\">\n {{ option.label }}\n </label>\n </template>\n <template\n v-if=\"option.key === 'description'\"\n #icon>\n <div\n class=\"centered-y bg-b-2 flex-center absolute right-1 z-1 rounded px-1 py-0.5\">\n <ScalarIcon\n icon=\"Markdown\"\n size=\"lg\" />\n </div>\n </template>\n </DataTableInput>\n </DataTableRow>\n </DataTable>\n </div>\n </ViewLayoutSection>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;EAyBA,MAAM,KAAK,OAAM;;uBAGf,YA6CoB,2BAAA,EA7CD,OAAM,qBAAmB,EAAA,YAAA;2BA4CpC,CAnCN,mBAmCM,OAnCN,YAmCM,CAjCI,OAAO,KAAK,QAAA,KAAI,CAAE,SAAM,KAAA,WAAA,EADhC,YAiCY,mBAAA;;KA/BV,OAAM;KACL,SAAS,CAAA,GAAI;;4BAEsB,EAAA,UAAA,KAAA,EADpC,mBA4Be,UAAA,MAAA,WA3Ba,QAAA,UAAlB,QAAQ,UAAK;0BADvB,YA4Be,sBAAA,EA1BZ,KAAK,OAAK,EAAA;8BAyBM,CAxBjB,YAwBiB,wBAAA;QAvBd,IAAI,MAAA,GAAE;QACP,OAAM;QACL,aAAa,QAAA;QACb,cAAc,OAAO,gBAAY;QACjC,YAAY,QAAA,KAAK,OAAO,QAAG;QAC3B,aAAa,OAAO;QACpB,cAAc,QAAA,gBAAY;QAC1B,wBAAiB,WAAE,QAAA,SAAS,OAAO,KAAK,OAAM;;QACpC,SAAO,cAGR,CAFR,mBAEQ,SAAA,EAFA,KAAK,MAAA,GAAE,EAAA,EAAA,gBACV,OAAO,MAAK,EAAA,GAAA,WAAA,CAAA,CAAA;;WAIX,OAAO,QAAG,gBAAA;cACf;0BAMK,CALN,mBAKM,OALN,YAKM,CAHJ,YAEc,MAAA,WAAA,EAAA;SADZ,MAAK;SACL,MAAK;;;;;;;;;;;;;;;;;;OApCX,QAAA,SAASA,KAAAA,OAAO,QAAA;UACrB;sBACoC,CAAzB,QAAA,SAAA,WAAA,EAAZ,mBAAqC,QAAA,YAAA,gBAAf,QAAA,MAAK,EAAA,EAAA,IAC3B,WAEiB,KAAA,QAAA,SAAA,EAAA,KAAA,GAAA,CAAA,CAAA,CAAA"}
|
|
@@ -10,8 +10,8 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {},
|
|
|
10
10
|
} & {
|
|
11
11
|
blur: (value: string) => any;
|
|
12
12
|
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
13
|
-
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
14
13
|
onBlur?: ((value: string) => any) | undefined;
|
|
14
|
+
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
15
15
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
16
16
|
declare const _default: typeof __VLS_export;
|
|
17
17
|
export default _default;
|
|
@@ -35,6 +35,7 @@ var Overview_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defin
|
|
|
35
35
|
fetchRegistryDocument: { type: Function },
|
|
36
36
|
telemetry: { type: Boolean },
|
|
37
37
|
onUpdateTelemetry: { type: Function },
|
|
38
|
+
options: {},
|
|
38
39
|
collectionType: {}
|
|
39
40
|
},
|
|
40
41
|
setup(__props) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Overview.vue.script.js","names":[],"sources":["../../../../../src/v2/features/collection/components/Overview.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarMarkdown,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { ScalarIconPencil } from '@scalar/icons'\nimport {\n computed,\n nextTick,\n ref,\n useTemplateRef,\n type ComputedRef,\n type Ref,\n} from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { CodeInput } from '@/v2/components/code-input'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst {\n document,\n eventBus,\n layout,\n collectionType,\n path,\n method,\n documentSlug,\n} = defineProps<CollectionProps>()\n\nconst operationLabel = computed(() => {\n if (!method || !path) {\n return 'this operation'\n }\n const upperMethod = typeof method === 'string' ? method.toUpperCase() : method\n return `${upperMethod} ${path}`\n})\n\nconst description: ComputedRef<string> = computed(() => {\n if (collectionType === 'operation') {\n if (!path || !method || !isHttpMethod(method)) {\n return ''\n }\n\n return document?.paths?.[path]?.[method]?.description ?? ''\n }\n\n return document?.info?.description ?? ''\n})\n\nconst deprecated: ComputedRef<boolean> = computed(() => {\n if (collectionType !== 'operation' || !path || !isHttpMethod(method)) {\n return false\n }\n\n const operation = document?.paths?.[path]?.[method] as\n | { deprecated?: boolean }\n | undefined\n return operation?.deprecated ?? false\n})\n\nconst mode: Ref<'edit' | 'preview'> = ref('preview')\n\nconst codeInputRef = useTemplateRef('codeInputRef')\n\n/**\n * Switch between edit and preview modes.\n * When switching to edit mode, focus the input after the DOM updates.\n */\nconst switchMode = async (newMode: 'edit' | 'preview'): Promise<void> => {\n mode.value = newMode\n\n if (newMode === 'edit') {\n await nextTick()\n codeInputRef.value?.focus()\n }\n}\n\n/**\n * Updates the description of the collection\n * @param payload - The new description\n * @returns void\n */\nconst handleDescriptionUpdate = async (payload: string) => {\n await switchMode('preview')\n\n /** If the collection type is a document, update the description of the document */\n if (collectionType === 'document') {\n return eventBus.emit('document:update:info', { description: payload })\n }\n\n /** If the collection type is an operation, update the description of the operation */\n if (collectionType === 'operation') {\n if (!path || !method) {\n console.error('Invalid path or method', { path, method })\n return\n }\n\n return eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: {\n description: payload,\n },\n })\n }\n\n console.error('Invalid collection type', { collectionType })\n}\n\nconst handleDeprecatedChange = (value: boolean) => {\n if (collectionType !== 'operation' || !path || !method) {\n return\n }\n\n eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: { deprecated: value },\n })\n}\n\nconst deleteOperationModal = useModal()\n\nconst handleDeleteOperation = () => {\n if (collectionType !== 'operation' || !path || !method || !documentSlug) {\n return\n }\n\n eventBus.emit('operation:delete:operation', {\n documentName: documentSlug,\n meta: { path, method },\n })\n deleteOperationModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-8\">\n <Section>\n <template #title>Description</template>\n <template #actions>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </template>\n <div class=\"has-focus-visible:bg-b-1 group rounded-lg\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"description.trim().length\">\n <ScalarMarkdown\n class=\"flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"description\"\n withImages\n @dblclick=\"switchMode('edit')\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-focus-visible:hidden\" />\n </template>\n\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-else>\n <CodeInput\n ref=\"codeInputRef\"\n class=\"border px-0.5 py-0\"\n :environment=\"undefined\"\n :layout=\"layout\"\n :modelValue=\"description\"\n @blur=\"handleDescriptionUpdate\" />\n </template>\n </div>\n </Section>\n\n <!-- Operation-only: Status and Danger Zone -->\n <template v-if=\"collectionType === 'operation'\">\n <Section>\n <template #title>Status</template>\n <div\n class=\"rounded-lg border text-sm transition-colors\"\n :class=\"\n deprecated\n ? 'border-(--scalar-color-alert) bg-(--scalar-background-alert)'\n : 'bg-b-2 border-(--scalar-background-3)'\n \">\n <div class=\"flex items-center justify-between gap-4 rounded-lg p-4\">\n <div class=\"min-w-0 flex-1\">\n <h4\n class=\"font-medium\"\n :class=\"\n deprecated ? 'text-(--scalar-color-alert)' : 'text-c-1'\n \">\n Deprecated\n </h4>\n <p class=\"text-c-2 mt-1.5\">\n Mark this operation as deprecated. Consumers SHOULD refrain from\n using it.\n </p>\n </div>\n <ScalarToggle\n class=\"shrink-0\"\n :modelValue=\"deprecated\"\n @update:modelValue=\"handleDeprecatedChange\" />\n </div>\n </div>\n </Section>\n\n <Section>\n <template #title>Danger Zone</template>\n <div\n class=\"bg-b-2 flex items-center justify-between gap-4 rounded-lg border border-(--scalar-background-3) p-4 text-sm\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"text-c-1 font-medium\">Delete Operation</h4>\n <p class=\"text-c-2 mt-1.5\">\n Be careful, my friend. Once deleted, there is no way to recover\n the operation.\n </p>\n </div>\n <ScalarButton\n class=\"shrink-0\"\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteOperationModal.show()\">\n Delete Operation\n </ScalarButton>\n </div>\n </Section>\n </template>\n </div>\n\n <!-- Delete Operation Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteOperationModal\"\n :title=\"`Delete ${operationLabel}`\">\n <DeleteSidebarListElement\n :variableName=\"operationLabel\"\n warningMessage=\"This action cannot be undone.\"\n @close=\"deleteOperationModal.hide()\"\n @delete=\"handleDeleteOperation\" />\n </ScalarModal>\n</template>\n\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Overview.vue.script.js","names":[],"sources":["../../../../../src/v2/features/collection/components/Overview.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarMarkdown,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { ScalarIconPencil } from '@scalar/icons'\nimport {\n computed,\n nextTick,\n ref,\n useTemplateRef,\n type ComputedRef,\n type Ref,\n} from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { CodeInput } from '@/v2/components/code-input'\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nconst {\n document,\n eventBus,\n layout,\n collectionType,\n path,\n method,\n documentSlug,\n} = defineProps<CollectionProps>()\n\nconst operationLabel = computed(() => {\n if (!method || !path) {\n return 'this operation'\n }\n const upperMethod = typeof method === 'string' ? method.toUpperCase() : method\n return `${upperMethod} ${path}`\n})\n\nconst description: ComputedRef<string> = computed(() => {\n if (collectionType === 'operation') {\n if (!path || !method || !isHttpMethod(method)) {\n return ''\n }\n\n return document?.paths?.[path]?.[method]?.description ?? ''\n }\n\n return document?.info?.description ?? ''\n})\n\nconst deprecated: ComputedRef<boolean> = computed(() => {\n if (collectionType !== 'operation' || !path || !isHttpMethod(method)) {\n return false\n }\n\n const operation = document?.paths?.[path]?.[method] as\n | { deprecated?: boolean }\n | undefined\n return operation?.deprecated ?? false\n})\n\nconst mode: Ref<'edit' | 'preview'> = ref('preview')\n\nconst codeInputRef = useTemplateRef('codeInputRef')\n\n/**\n * Switch between edit and preview modes.\n * When switching to edit mode, focus the input after the DOM updates.\n */\nconst switchMode = async (newMode: 'edit' | 'preview'): Promise<void> => {\n mode.value = newMode\n\n if (newMode === 'edit') {\n await nextTick()\n codeInputRef.value?.focus()\n }\n}\n\n/**\n * Updates the description of the collection\n * @param payload - The new description\n * @returns void\n */\nconst handleDescriptionUpdate = async (payload: string) => {\n await switchMode('preview')\n\n /** If the collection type is a document, update the description of the document */\n if (collectionType === 'document') {\n return eventBus.emit('document:update:info', { description: payload })\n }\n\n /** If the collection type is an operation, update the description of the operation */\n if (collectionType === 'operation') {\n if (!path || !method) {\n console.error('Invalid path or method', { path, method })\n return\n }\n\n return eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: {\n description: payload,\n },\n })\n }\n\n console.error('Invalid collection type', { collectionType })\n}\n\nconst handleDeprecatedChange = (value: boolean) => {\n if (collectionType !== 'operation' || !path || !method) {\n return\n }\n\n eventBus.emit('operation:update:meta', {\n meta: { path, method },\n payload: { deprecated: value },\n })\n}\n\nconst deleteOperationModal = useModal()\n\nconst handleDeleteOperation = () => {\n if (collectionType !== 'operation' || !path || !method || !documentSlug) {\n return\n }\n\n eventBus.emit('operation:delete:operation', {\n documentName: documentSlug,\n meta: { path, method },\n })\n deleteOperationModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-8\">\n <Section>\n <template #title>Description</template>\n <template #actions>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </template>\n <div class=\"has-focus-visible:bg-b-1 group rounded-lg\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"description.trim().length\">\n <ScalarMarkdown\n class=\"flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"description\"\n withImages\n @dblclick=\"switchMode('edit')\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-focus-visible:hidden\" />\n </template>\n\n <div\n v-else\n class=\"text-c-3 flex items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"switchMode('edit')\">\n <ScalarIconPencil\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-else>\n <CodeInput\n ref=\"codeInputRef\"\n class=\"border px-0.5 py-0\"\n :environment=\"undefined\"\n :layout=\"layout\"\n :modelValue=\"description\"\n @blur=\"handleDescriptionUpdate\" />\n </template>\n </div>\n </Section>\n\n <!-- Operation-only: Status and Danger Zone -->\n <template v-if=\"collectionType === 'operation'\">\n <Section>\n <template #title>Status</template>\n <div\n class=\"rounded-lg border text-sm transition-colors\"\n :class=\"\n deprecated\n ? 'border-(--scalar-color-alert) bg-(--scalar-background-alert)'\n : 'bg-b-2 border-(--scalar-background-3)'\n \">\n <div class=\"flex items-center justify-between gap-4 rounded-lg p-4\">\n <div class=\"min-w-0 flex-1\">\n <h4\n class=\"font-medium\"\n :class=\"\n deprecated ? 'text-(--scalar-color-alert)' : 'text-c-1'\n \">\n Deprecated\n </h4>\n <p class=\"text-c-2 mt-1.5\">\n Mark this operation as deprecated. Consumers SHOULD refrain from\n using it.\n </p>\n </div>\n <ScalarToggle\n class=\"shrink-0\"\n :modelValue=\"deprecated\"\n @update:modelValue=\"handleDeprecatedChange\" />\n </div>\n </div>\n </Section>\n\n <Section>\n <template #title>Danger Zone</template>\n <div\n class=\"bg-b-2 flex items-center justify-between gap-4 rounded-lg border border-(--scalar-background-3) p-4 text-sm\">\n <div class=\"min-w-0 flex-1\">\n <h4 class=\"text-c-1 font-medium\">Delete Operation</h4>\n <p class=\"text-c-2 mt-1.5\">\n Be careful, my friend. Once deleted, there is no way to recover\n the operation.\n </p>\n </div>\n <ScalarButton\n class=\"shrink-0\"\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteOperationModal.show()\">\n Delete Operation\n </ScalarButton>\n </div>\n </Section>\n </template>\n </div>\n\n <!-- Delete Operation Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteOperationModal\"\n :title=\"`Delete ${operationLabel}`\">\n <DeleteSidebarListElement\n :variableName=\"operationLabel\"\n warningMessage=\"This action cannot be undone.\"\n @close=\"deleteOperationModal.hide()\"\n @delete=\"handleDeleteOperation\" />\n </ScalarModal>\n</template>\n\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Runner.vue.d.ts","sourceRoot":"","sources":["../../../../../../../src/v2/features/collection/components/Runner/components/Runner.vue"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Runner.vue.d.ts","sourceRoot":"","sources":["../../../../../../../src/v2/features/collection/components/Runner/components/Runner.vue"],"names":[],"mappings":"AA0yBA,QAAA,MAAM,YAAY;;;;;;;;;;;;kGAEhB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Runner.vue.js","names":[],"sources":["../../../../../../../src/v2/features/collection/components/Runner/components/Runner.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconArrowCounterClockwise, ScalarIconPlay } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nimport { useRunnerExecution, useRunnerSelection } from '../hooks'\nimport RunnerCard from './RunnerCard.vue'\nimport RunnerOrderItem from './RunnerOrderItem.vue'\nimport RunnerResults from './RunnerResults.vue'\nimport RunnerTree from './RunnerTree.vue'\n\nconst {
|
|
1
|
+
{"version":3,"file":"Runner.vue.js","names":[],"sources":["../../../../../../../src/v2/features/collection/components/Runner/components/Runner.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconArrowCounterClockwise, ScalarIconPlay } from '@scalar/icons'\nimport { computed, toValue } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nimport { useRunnerExecution, useRunnerSelection } from '../hooks'\nimport RunnerCard from './RunnerCard.vue'\nimport RunnerOrderItem from './RunnerOrderItem.vue'\nimport RunnerResults from './RunnerResults.vue'\nimport RunnerTree from './RunnerTree.vue'\n\nconst {\n document,\n collectionType,\n workspaceStore,\n documentSlug,\n layout,\n options,\n} = defineProps<CollectionProps>()\n\nconst {\n selectedOrder,\n hasSelection,\n isSelected,\n toggle,\n clearAll,\n removeFromOrder,\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n handleDragEnd,\n} = useRunnerSelection({\n isLocked: () => isLocked.value,\n})\n\nconst {\n isRunning,\n hasRunCompleted,\n currentRunIndex,\n runLoader,\n runSummary,\n run,\n rerun,\n clearResults,\n getResultAtIndex,\n isResultPassed,\n isResultSkipped,\n getFailedTests,\n} = useRunnerExecution({\n workspaceStore,\n document,\n documentName: documentSlug,\n isWeb: layout === 'web',\n selectedOrder: computed(() => selectedOrder.value),\n customFetch: toValue(options)?.customFetch,\n})\n\nconst isLocked = computed(() => isRunning.value || hasRunCompleted.value)\n\nconst { draggedIndex, dragOverIndex, dragOffset } = dragState\n\nconst navigationChildren = computed(() => {\n return document?.['x-scalar-navigation']?.children ?? []\n})\n\nconst hasOperations = computed(() => navigationChildren.value.length > 0)\n</script>\n\n<template>\n <Section v-if=\"collectionType === 'document'\">\n <template #title>Runner</template>\n <template #description>\n Select operation examples, set the run order, then run them in sequence.\n Variables set by pre-request or post-response scripts are shared between\n runs.\n </template>\n\n <div class=\"flex flex-col gap-8 lg:flex-row lg:items-start\">\n <!-- Left: Document operations tree -->\n <RunnerCard\n class=\"min-w-0 flex-1\"\n subtitle=\"Check the examples you want to run. They will be added to the run order.\"\n title=\"Select operations\">\n <div\n v-if=\"hasOperations\"\n class=\"max-h-[28rem] overflow-y-auto\"\n :class=\"{ 'opacity-60': isLocked }\">\n <RunnerTree\n :disabled=\"isLocked\"\n :entries=\"navigationChildren\"\n :isSelected=\"isSelected\"\n :selectedOrder=\"selectedOrder\"\n @toggle=\"toggle\" />\n </div>\n <div\n v-else\n class=\"py-6 text-center\">\n <p class=\"text-c-3 text-sm\">No operations in this document.</p>\n <p class=\"text-c-3 mt-1 text-xs\">\n Add paths and methods to your API description to see them here.\n </p>\n </div>\n </RunnerCard>\n\n <!-- Right: Run order + actions + results -->\n <div class=\"flex w-full shrink-0 flex-col gap-4 lg:w-96\">\n <!-- Run order card -->\n <RunnerCard title=\"Run order\">\n <template #header>\n <ScalarButton\n class=\"transition-opacity duration-100\"\n :class=\"\n hasSelection && !isLocked\n ? 'opacity-100'\n : 'pointer-events-none opacity-0'\n \"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"clearAll\">\n <span class=\"hover:underline\">Clear all</span>\n </ScalarButton>\n </template>\n <template #subtitle>\n {{ selectedOrder.length }}\n {{ selectedOrder.length === 1 ? 'item' : 'items' }} selected.\n <template v-if=\"!isLocked\">Drag to reorder.</template>\n <template v-else-if=\"hasRunCompleted\">\n Clear results to modify.\n </template>\n </template>\n <template #default>\n <div\n v-if=\"selectedOrder.length > 0\"\n class=\"flex flex-col gap-0.5\"\n :class=\"{ 'opacity-60': isLocked }\">\n <RunnerOrderItem\n v-for=\"(item, index) in selectedOrder\"\n :key=\"item.id\"\n :draggable=\"!isLocked\"\n :exampleKey=\"item.exampleKey\"\n :index=\"index\"\n :isDragAfter=\"dragOverIndex === index && dragOffset === 'after'\"\n :isDragBefore=\"\n dragOverIndex === index && dragOffset === 'before'\n \"\n :isDragging=\"draggedIndex === index\"\n :isLocked=\"isLocked\"\n :method=\"item.method\"\n :path=\"item.path\"\n @dragend=\"handleDragEnd\"\n @dragleave=\"handleDragLeave\"\n @dragover=\"handleDragOver(index, $event)\"\n @dragstart=\"handleDragStart(index, $event)\"\n @drop=\"handleDrop\"\n @remove=\"removeFromOrder(item)\" />\n </div>\n <div\n v-else\n class=\"py-4 text-center\">\n <p class=\"text-c-3 text-sm\">No items yet.</p>\n <p class=\"text-c-3 mt-0.5 text-xs\">\n Select operations from the list on the left.\n </p>\n </div>\n </template>\n </RunnerCard>\n\n <!-- Run button -->\n <div class=\"flex justify-end pt-1\">\n <ScalarButton\n v-if=\"!hasRunCompleted\"\n class=\"min-w-40\"\n :disabled=\"!hasSelection || isRunning\"\n :icon=\"ScalarIconPlay\"\n :loader=\"runLoader\"\n size=\"md\"\n variant=\"gradient\"\n @click=\"run\">\n Run sequence\n </ScalarButton>\n <ScalarButton\n v-else\n class=\"min-w-40\"\n :disabled=\"!hasSelection || isRunning\"\n :icon=\"ScalarIconArrowCounterClockwise\"\n :loader=\"runLoader\"\n size=\"md\"\n variant=\"gradient\"\n @click=\"rerun\">\n Re-run sequence\n </ScalarButton>\n </div>\n\n <!-- Running progress -->\n <RunnerCard\n v-if=\"\n isRunning && currentRunIndex != null && selectedOrder.length > 0\n \"\n compact>\n <p class=\"text-c-2 text-sm\">\n Running step\n <span class=\"text-c-1 font-medium\">\n {{ currentRunIndex }} / {{ selectedOrder.length }}\n </span>\n </p>\n <div\n :aria-valuemax=\"selectedOrder.length\"\n :aria-valuemin=\"0\"\n :aria-valuenow=\"currentRunIndex\"\n class=\"bg-b-3 mt-2 h-1.5 overflow-hidden rounded-full\"\n role=\"progressbar\">\n <div\n class=\"bg-accent-color h-full rounded-full transition-[width] duration-200 ease-out\"\n :style=\"{\n width: `${(currentRunIndex / selectedOrder.length) * 100}%`,\n }\" />\n </div>\n </RunnerCard>\n\n <!-- Results -->\n <RunnerResults\n v-if=\"runSummary && hasRunCompleted\"\n :getFailedTests=\"getFailedTests\"\n :getResultAtIndex=\"getResultAtIndex\"\n :isResultPassed=\"isResultPassed\"\n :isResultSkipped=\"isResultSkipped\"\n :selectedOrder=\"selectedOrder\"\n :summary=\"runSummary\"\n @clear=\"clearResults\" />\n </div>\n </div>\n </Section>\n</template>\n"],"mappings":""}
|
|
@@ -5,7 +5,7 @@ import RunnerCard_default from "./RunnerCard.vue.js";
|
|
|
5
5
|
import RunnerOrderItem_default from "./RunnerOrderItem.vue.js";
|
|
6
6
|
import RunnerResults_default from "./RunnerResults.vue.js";
|
|
7
7
|
import RunnerTree_default from "./RunnerTree.vue.js";
|
|
8
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderList, toDisplayString, unref, withCtx } from "vue";
|
|
8
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, normalizeStyle, openBlock, renderList, toDisplayString, toValue, unref, withCtx } from "vue";
|
|
9
9
|
import { ScalarButton } from "@scalar/components";
|
|
10
10
|
import { ScalarIconArrowCounterClockwise, ScalarIconPlay } from "@scalar/icons";
|
|
11
11
|
//#region src/v2/features/collection/components/Runner/components/Runner.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -43,6 +43,7 @@ var Runner_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
|
|
|
43
43
|
fetchRegistryDocument: { type: Function },
|
|
44
44
|
telemetry: { type: Boolean },
|
|
45
45
|
onUpdateTelemetry: { type: Function },
|
|
46
|
+
options: {},
|
|
46
47
|
collectionType: {}
|
|
47
48
|
},
|
|
48
49
|
setup(__props) {
|
|
@@ -52,7 +53,8 @@ var Runner_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineC
|
|
|
52
53
|
document: __props.document,
|
|
53
54
|
documentName: __props.documentSlug,
|
|
54
55
|
isWeb: __props.layout === "web",
|
|
55
|
-
selectedOrder: computed(() => selectedOrder.value)
|
|
56
|
+
selectedOrder: computed(() => selectedOrder.value),
|
|
57
|
+
customFetch: toValue(__props.options)?.customFetch
|
|
56
58
|
});
|
|
57
59
|
const isLocked = computed(() => isRunning.value || hasRunCompleted.value);
|
|
58
60
|
const { draggedIndex, dragOverIndex, dragOffset } = dragState;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Runner.vue.script.js","names":[],"sources":["../../../../../../../src/v2/features/collection/components/Runner/components/Runner.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconArrowCounterClockwise, ScalarIconPlay } from '@scalar/icons'\nimport { computed } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nimport { useRunnerExecution, useRunnerSelection } from '../hooks'\nimport RunnerCard from './RunnerCard.vue'\nimport RunnerOrderItem from './RunnerOrderItem.vue'\nimport RunnerResults from './RunnerResults.vue'\nimport RunnerTree from './RunnerTree.vue'\n\nconst { document, collectionType, workspaceStore, documentSlug, layout } =\n defineProps<CollectionProps>()\n\nconst {\n selectedOrder,\n hasSelection,\n isSelected,\n toggle,\n clearAll,\n removeFromOrder,\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n handleDragEnd,\n} = useRunnerSelection({\n isLocked: () => isLocked.value,\n})\n\nconst {\n isRunning,\n hasRunCompleted,\n currentRunIndex,\n runLoader,\n runSummary,\n run,\n rerun,\n clearResults,\n getResultAtIndex,\n isResultPassed,\n isResultSkipped,\n getFailedTests,\n} = useRunnerExecution({\n workspaceStore,\n document,\n documentName: documentSlug,\n isWeb: layout === 'web',\n selectedOrder: computed(() => selectedOrder.value),\n})\n\nconst isLocked = computed(() => isRunning.value || hasRunCompleted.value)\n\nconst { draggedIndex, dragOverIndex, dragOffset } = dragState\n\nconst navigationChildren = computed(() => {\n return document?.['x-scalar-navigation']?.children ?? []\n})\n\nconst hasOperations = computed(() => navigationChildren.value.length > 0)\n</script>\n\n<template>\n <Section v-if=\"collectionType === 'document'\">\n <template #title>Runner</template>\n <template #description>\n Select operation examples, set the run order, then run them in sequence.\n Variables set by pre-request or post-response scripts are shared between\n runs.\n </template>\n\n <div class=\"flex flex-col gap-8 lg:flex-row lg:items-start\">\n <!-- Left: Document operations tree -->\n <RunnerCard\n class=\"min-w-0 flex-1\"\n subtitle=\"Check the examples you want to run. They will be added to the run order.\"\n title=\"Select operations\">\n <div\n v-if=\"hasOperations\"\n class=\"max-h-[28rem] overflow-y-auto\"\n :class=\"{ 'opacity-60': isLocked }\">\n <RunnerTree\n :disabled=\"isLocked\"\n :entries=\"navigationChildren\"\n :isSelected=\"isSelected\"\n :selectedOrder=\"selectedOrder\"\n @toggle=\"toggle\" />\n </div>\n <div\n v-else\n class=\"py-6 text-center\">\n <p class=\"text-c-3 text-sm\">No operations in this document.</p>\n <p class=\"text-c-3 mt-1 text-xs\">\n Add paths and methods to your API description to see them here.\n </p>\n </div>\n </RunnerCard>\n\n <!-- Right: Run order + actions + results -->\n <div class=\"flex w-full shrink-0 flex-col gap-4 lg:w-96\">\n <!-- Run order card -->\n <RunnerCard title=\"Run order\">\n <template #header>\n <ScalarButton\n class=\"transition-opacity duration-100\"\n :class=\"\n hasSelection && !isLocked\n ? 'opacity-100'\n : 'pointer-events-none opacity-0'\n \"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"clearAll\">\n <span class=\"hover:underline\">Clear all</span>\n </ScalarButton>\n </template>\n <template #subtitle>\n {{ selectedOrder.length }}\n {{ selectedOrder.length === 1 ? 'item' : 'items' }} selected.\n <template v-if=\"!isLocked\">Drag to reorder.</template>\n <template v-else-if=\"hasRunCompleted\">\n Clear results to modify.\n </template>\n </template>\n <template #default>\n <div\n v-if=\"selectedOrder.length > 0\"\n class=\"flex flex-col gap-0.5\"\n :class=\"{ 'opacity-60': isLocked }\">\n <RunnerOrderItem\n v-for=\"(item, index) in selectedOrder\"\n :key=\"item.id\"\n :draggable=\"!isLocked\"\n :exampleKey=\"item.exampleKey\"\n :index=\"index\"\n :isDragAfter=\"dragOverIndex === index && dragOffset === 'after'\"\n :isDragBefore=\"\n dragOverIndex === index && dragOffset === 'before'\n \"\n :isDragging=\"draggedIndex === index\"\n :isLocked=\"isLocked\"\n :method=\"item.method\"\n :path=\"item.path\"\n @dragend=\"handleDragEnd\"\n @dragleave=\"handleDragLeave\"\n @dragover=\"handleDragOver(index, $event)\"\n @dragstart=\"handleDragStart(index, $event)\"\n @drop=\"handleDrop\"\n @remove=\"removeFromOrder(item)\" />\n </div>\n <div\n v-else\n class=\"py-4 text-center\">\n <p class=\"text-c-3 text-sm\">No items yet.</p>\n <p class=\"text-c-3 mt-0.5 text-xs\">\n Select operations from the list on the left.\n </p>\n </div>\n </template>\n </RunnerCard>\n\n <!-- Run button -->\n <div class=\"flex justify-end pt-1\">\n <ScalarButton\n v-if=\"!hasRunCompleted\"\n class=\"min-w-40\"\n :disabled=\"!hasSelection || isRunning\"\n :icon=\"ScalarIconPlay\"\n :loader=\"runLoader\"\n size=\"md\"\n variant=\"gradient\"\n @click=\"run\">\n Run sequence\n </ScalarButton>\n <ScalarButton\n v-else\n class=\"min-w-40\"\n :disabled=\"!hasSelection || isRunning\"\n :icon=\"ScalarIconArrowCounterClockwise\"\n :loader=\"runLoader\"\n size=\"md\"\n variant=\"gradient\"\n @click=\"rerun\">\n Re-run sequence\n </ScalarButton>\n </div>\n\n <!-- Running progress -->\n <RunnerCard\n v-if=\"\n isRunning && currentRunIndex != null && selectedOrder.length > 0\n \"\n compact>\n <p class=\"text-c-2 text-sm\">\n Running step\n <span class=\"text-c-1 font-medium\">\n {{ currentRunIndex }} / {{ selectedOrder.length }}\n </span>\n </p>\n <div\n :aria-valuemax=\"selectedOrder.length\"\n :aria-valuemin=\"0\"\n :aria-valuenow=\"currentRunIndex\"\n class=\"bg-b-3 mt-2 h-1.5 overflow-hidden rounded-full\"\n role=\"progressbar\">\n <div\n class=\"bg-accent-color h-full rounded-full transition-[width] duration-200 ease-out\"\n :style=\"{\n width: `${(currentRunIndex / selectedOrder.length) * 100}%`,\n }\" />\n </div>\n </RunnerCard>\n\n <!-- Results -->\n <RunnerResults\n v-if=\"runSummary && hasRunCompleted\"\n :getFailedTests=\"getFailedTests\"\n :getResultAtIndex=\"getResultAtIndex\"\n :isResultPassed=\"isResultPassed\"\n :isResultSkipped=\"isResultSkipped\"\n :selectedOrder=\"selectedOrder\"\n :summary=\"runSummary\"\n @clear=\"clearResults\" />\n </div>\n </div>\n </Section>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Runner.vue.script.js","names":[],"sources":["../../../../../../../src/v2/features/collection/components/Runner/components/Runner.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconArrowCounterClockwise, ScalarIconPlay } from '@scalar/icons'\nimport { computed, toValue } from 'vue'\n\nimport type { CollectionProps } from '@/v2/features/app/helpers/routes'\nimport Section from '@/v2/features/settings/components/Section.vue'\n\nimport { useRunnerExecution, useRunnerSelection } from '../hooks'\nimport RunnerCard from './RunnerCard.vue'\nimport RunnerOrderItem from './RunnerOrderItem.vue'\nimport RunnerResults from './RunnerResults.vue'\nimport RunnerTree from './RunnerTree.vue'\n\nconst {\n document,\n collectionType,\n workspaceStore,\n documentSlug,\n layout,\n options,\n} = defineProps<CollectionProps>()\n\nconst {\n selectedOrder,\n hasSelection,\n isSelected,\n toggle,\n clearAll,\n removeFromOrder,\n dragState,\n handleDragStart,\n handleDragOver,\n handleDragLeave,\n handleDrop,\n handleDragEnd,\n} = useRunnerSelection({\n isLocked: () => isLocked.value,\n})\n\nconst {\n isRunning,\n hasRunCompleted,\n currentRunIndex,\n runLoader,\n runSummary,\n run,\n rerun,\n clearResults,\n getResultAtIndex,\n isResultPassed,\n isResultSkipped,\n getFailedTests,\n} = useRunnerExecution({\n workspaceStore,\n document,\n documentName: documentSlug,\n isWeb: layout === 'web',\n selectedOrder: computed(() => selectedOrder.value),\n customFetch: toValue(options)?.customFetch,\n})\n\nconst isLocked = computed(() => isRunning.value || hasRunCompleted.value)\n\nconst { draggedIndex, dragOverIndex, dragOffset } = dragState\n\nconst navigationChildren = computed(() => {\n return document?.['x-scalar-navigation']?.children ?? []\n})\n\nconst hasOperations = computed(() => navigationChildren.value.length > 0)\n</script>\n\n<template>\n <Section v-if=\"collectionType === 'document'\">\n <template #title>Runner</template>\n <template #description>\n Select operation examples, set the run order, then run them in sequence.\n Variables set by pre-request or post-response scripts are shared between\n runs.\n </template>\n\n <div class=\"flex flex-col gap-8 lg:flex-row lg:items-start\">\n <!-- Left: Document operations tree -->\n <RunnerCard\n class=\"min-w-0 flex-1\"\n subtitle=\"Check the examples you want to run. They will be added to the run order.\"\n title=\"Select operations\">\n <div\n v-if=\"hasOperations\"\n class=\"max-h-[28rem] overflow-y-auto\"\n :class=\"{ 'opacity-60': isLocked }\">\n <RunnerTree\n :disabled=\"isLocked\"\n :entries=\"navigationChildren\"\n :isSelected=\"isSelected\"\n :selectedOrder=\"selectedOrder\"\n @toggle=\"toggle\" />\n </div>\n <div\n v-else\n class=\"py-6 text-center\">\n <p class=\"text-c-3 text-sm\">No operations in this document.</p>\n <p class=\"text-c-3 mt-1 text-xs\">\n Add paths and methods to your API description to see them here.\n </p>\n </div>\n </RunnerCard>\n\n <!-- Right: Run order + actions + results -->\n <div class=\"flex w-full shrink-0 flex-col gap-4 lg:w-96\">\n <!-- Run order card -->\n <RunnerCard title=\"Run order\">\n <template #header>\n <ScalarButton\n class=\"transition-opacity duration-100\"\n :class=\"\n hasSelection && !isLocked\n ? 'opacity-100'\n : 'pointer-events-none opacity-0'\n \"\n size=\"xs\"\n variant=\"ghost\"\n @click=\"clearAll\">\n <span class=\"hover:underline\">Clear all</span>\n </ScalarButton>\n </template>\n <template #subtitle>\n {{ selectedOrder.length }}\n {{ selectedOrder.length === 1 ? 'item' : 'items' }} selected.\n <template v-if=\"!isLocked\">Drag to reorder.</template>\n <template v-else-if=\"hasRunCompleted\">\n Clear results to modify.\n </template>\n </template>\n <template #default>\n <div\n v-if=\"selectedOrder.length > 0\"\n class=\"flex flex-col gap-0.5\"\n :class=\"{ 'opacity-60': isLocked }\">\n <RunnerOrderItem\n v-for=\"(item, index) in selectedOrder\"\n :key=\"item.id\"\n :draggable=\"!isLocked\"\n :exampleKey=\"item.exampleKey\"\n :index=\"index\"\n :isDragAfter=\"dragOverIndex === index && dragOffset === 'after'\"\n :isDragBefore=\"\n dragOverIndex === index && dragOffset === 'before'\n \"\n :isDragging=\"draggedIndex === index\"\n :isLocked=\"isLocked\"\n :method=\"item.method\"\n :path=\"item.path\"\n @dragend=\"handleDragEnd\"\n @dragleave=\"handleDragLeave\"\n @dragover=\"handleDragOver(index, $event)\"\n @dragstart=\"handleDragStart(index, $event)\"\n @drop=\"handleDrop\"\n @remove=\"removeFromOrder(item)\" />\n </div>\n <div\n v-else\n class=\"py-4 text-center\">\n <p class=\"text-c-3 text-sm\">No items yet.</p>\n <p class=\"text-c-3 mt-0.5 text-xs\">\n Select operations from the list on the left.\n </p>\n </div>\n </template>\n </RunnerCard>\n\n <!-- Run button -->\n <div class=\"flex justify-end pt-1\">\n <ScalarButton\n v-if=\"!hasRunCompleted\"\n class=\"min-w-40\"\n :disabled=\"!hasSelection || isRunning\"\n :icon=\"ScalarIconPlay\"\n :loader=\"runLoader\"\n size=\"md\"\n variant=\"gradient\"\n @click=\"run\">\n Run sequence\n </ScalarButton>\n <ScalarButton\n v-else\n class=\"min-w-40\"\n :disabled=\"!hasSelection || isRunning\"\n :icon=\"ScalarIconArrowCounterClockwise\"\n :loader=\"runLoader\"\n size=\"md\"\n variant=\"gradient\"\n @click=\"rerun\">\n Re-run sequence\n </ScalarButton>\n </div>\n\n <!-- Running progress -->\n <RunnerCard\n v-if=\"\n isRunning && currentRunIndex != null && selectedOrder.length > 0\n \"\n compact>\n <p class=\"text-c-2 text-sm\">\n Running step\n <span class=\"text-c-1 font-medium\">\n {{ currentRunIndex }} / {{ selectedOrder.length }}\n </span>\n </p>\n <div\n :aria-valuemax=\"selectedOrder.length\"\n :aria-valuemin=\"0\"\n :aria-valuenow=\"currentRunIndex\"\n class=\"bg-b-3 mt-2 h-1.5 overflow-hidden rounded-full\"\n role=\"progressbar\">\n <div\n class=\"bg-accent-color h-full rounded-full transition-[width] duration-200 ease-out\"\n :style=\"{\n width: `${(currentRunIndex / selectedOrder.length) * 100}%`,\n }\" />\n </div>\n </RunnerCard>\n\n <!-- Results -->\n <RunnerResults\n v-if=\"runSummary && hasRunCompleted\"\n :getFailedTests=\"getFailedTests\"\n :getResultAtIndex=\"getResultAtIndex\"\n :isResultPassed=\"isResultPassed\"\n :isResultSkipped=\"isResultSkipped\"\n :selectedOrder=\"selectedOrder\"\n :summary=\"runSummary\"\n @clear=\"clearResults\" />\n </div>\n </div>\n </Section>\n</template>\n"],"mappings":"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"}
|
|
@@ -9,9 +9,9 @@ type __VLS_Props = {
|
|
|
9
9
|
disabled?: boolean;
|
|
10
10
|
};
|
|
11
11
|
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
|
|
12
|
-
toggle: (path: string, method: "
|
|
12
|
+
toggle: (path: string, method: "head" | "delete" | "get" | "options" | "patch" | "post" | "put" | "trace", exampleKey: string, label: string) => any;
|
|
13
13
|
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
14
|
-
onToggle?: ((path: string, method: "
|
|
14
|
+
onToggle?: ((path: string, method: "head" | "delete" | "get" | "options" | "patch" | "post" | "put" | "trace", exampleKey: string, label: string) => any) | undefined;
|
|
15
15
|
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
16
16
|
declare const _default: typeof __VLS_export;
|
|
17
17
|
export default _default;
|
|
@@ -2,7 +2,7 @@ import { useLoadingState } from '@scalar/components';
|
|
|
2
2
|
import type { WorkspaceStore } from '@scalar/workspace-store/client';
|
|
3
3
|
import type { OpenApiDocument } from '@scalar/workspace-store/schemas/v3.1/strict/openapi-document';
|
|
4
4
|
import { type ComputedRef, type Ref } from 'vue';
|
|
5
|
-
import { type ResponseInstance } from '../../../../../../v2/blocks/operation-block/helpers/send-request.js';
|
|
5
|
+
import { type CustomFetch, type ResponseInstance } from '../../../../../../v2/blocks/operation-block/helpers/send-request.js';
|
|
6
6
|
import type { SelectedItem } from './use-runner-selection.js';
|
|
7
7
|
export type TestResult = {
|
|
8
8
|
title: string;
|
|
@@ -36,6 +36,8 @@ type UseRunnerExecutionOptions = {
|
|
|
36
36
|
isWeb: boolean;
|
|
37
37
|
/** Ordered list of selected items to run */
|
|
38
38
|
selectedOrder: ComputedRef<SelectedItem[]>;
|
|
39
|
+
/** Optional custom fetch implementation, overrides the global fetch for request execution */
|
|
40
|
+
customFetch?: CustomFetch;
|
|
39
41
|
};
|
|
40
42
|
type UseRunnerExecutionReturn = {
|
|
41
43
|
/** Whether a run is currently in progress */
|
|
@@ -68,6 +70,6 @@ type UseRunnerExecutionReturn = {
|
|
|
68
70
|
/**
|
|
69
71
|
* Composable for managing runner execution state and logic.
|
|
70
72
|
*/
|
|
71
|
-
export declare function useRunnerExecution({ workspaceStore, document, documentName, isWeb, selectedOrder, }: UseRunnerExecutionOptions): UseRunnerExecutionReturn;
|
|
73
|
+
export declare function useRunnerExecution({ workspaceStore, document, documentName, isWeb, selectedOrder, customFetch, }: UseRunnerExecutionOptions): UseRunnerExecutionReturn;
|
|
72
74
|
export {};
|
|
73
75
|
//# sourceMappingURL=use-runner-execution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-runner-execution.d.ts","sourceRoot":"","sources":["../../../../../../../src/v2/features/collection/components/Runner/hooks/use-runner-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAA;AASpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8DAA8D,CAAA;AACnG,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,GAAG,EAAiB,MAAM,KAAK,CAAA;AAE/D,OAAO,EAAE,KAAK,gBAAgB,EAAe,MAAM,kDAAkD,CAAA;
|
|
1
|
+
{"version":3,"file":"use-runner-execution.d.ts","sourceRoot":"","sources":["../../../../../../../src/v2/features/collection/components/Runner/hooks/use-runner-execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { executePostResponseScript, executePreRequestScript, getScript } from "@
|
|
|
10
10
|
/**
|
|
11
11
|
* Composable for managing runner execution state and logic.
|
|
12
12
|
*/
|
|
13
|
-
function useRunnerExecution({ workspaceStore, document, documentName, isWeb, selectedOrder }) {
|
|
13
|
+
function useRunnerExecution({ workspaceStore, document, documentName, isWeb, selectedOrder, customFetch }) {
|
|
14
14
|
const isRunning = ref(false);
|
|
15
15
|
const hasRunCompleted = ref(false);
|
|
16
16
|
const currentRunIndex = ref(null);
|
|
@@ -136,7 +136,8 @@ function useRunnerExecution({ workspaceStore, document, documentName, isWeb, sel
|
|
|
136
136
|
}
|
|
137
137
|
const [sendError, sendResult] = await sendRequest({
|
|
138
138
|
isUsingProxy: requestResult.data.isUsingProxy,
|
|
139
|
-
requestPayload: requestResult.data.requestPayload
|
|
139
|
+
requestPayload: requestResult.data.requestPayload,
|
|
140
|
+
customFetch
|
|
140
141
|
});
|
|
141
142
|
if (sendError) {
|
|
142
143
|
runResult.error = sendError;
|