@scalar/workspace-store 0.20.0 → 0.22.0
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 +58 -0
- package/README.md +2 -2
- package/dist/client.d.ts +54 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +66 -29
- package/dist/client.js.map +2 -2
- package/dist/events/bus.d.ts +14 -2
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/bus.js +46 -10
- package/dist/events/bus.js.map +3 -3
- package/dist/events/definitions/auth.d.ts +2 -1
- package/dist/events/definitions/auth.d.ts.map +1 -1
- package/dist/events/definitions/cookie.d.ts +20 -0
- package/dist/events/definitions/cookie.d.ts.map +1 -0
- package/dist/events/definitions/cookie.js +1 -0
- package/dist/events/definitions/cookie.js.map +7 -0
- package/dist/events/definitions/document.d.ts +19 -2
- package/dist/events/definitions/document.d.ts.map +1 -1
- package/dist/events/definitions/index.d.ts +6 -1
- package/dist/events/definitions/index.d.ts.map +1 -1
- package/dist/events/definitions/operation.d.ts +20 -14
- package/dist/events/definitions/operation.d.ts.map +1 -1
- package/dist/events/definitions/server.d.ts +2 -2
- package/dist/events/definitions/server.d.ts.map +1 -1
- package/dist/events/definitions/tabs.d.ts +55 -0
- package/dist/events/definitions/tabs.d.ts.map +1 -0
- package/dist/events/definitions/tabs.js +1 -0
- package/dist/events/definitions/tabs.js.map +7 -0
- package/dist/events/definitions/tag.d.ts +15 -0
- package/dist/events/definitions/tag.d.ts.map +1 -0
- package/dist/events/definitions/tag.js +1 -0
- package/dist/events/definitions/tag.js.map +7 -0
- package/dist/events/definitions/ui.d.ts +131 -39
- package/dist/events/definitions/ui.d.ts.map +1 -1
- package/dist/events/definitions/workspace.d.ts +18 -0
- package/dist/events/definitions/workspace.d.ts.map +1 -0
- package/dist/events/definitions/workspace.js +1 -0
- package/dist/events/definitions/workspace.js.map +7 -0
- package/dist/events/index.d.ts +1 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js.map +2 -2
- package/dist/helpers/generate-unique-value.d.ts +19 -6
- package/dist/helpers/generate-unique-value.d.ts.map +1 -1
- package/dist/helpers/generate-unique-value.js +12 -7
- package/dist/helpers/generate-unique-value.js.map +2 -2
- package/dist/helpers/unpack-proxy.d.ts +14 -1
- package/dist/helpers/unpack-proxy.d.ts.map +1 -1
- package/dist/helpers/unpack-proxy.js +51 -1
- package/dist/helpers/unpack-proxy.js.map +3 -3
- package/dist/mutators/auth.d.ts +7 -2
- package/dist/mutators/auth.d.ts.map +1 -1
- package/dist/mutators/auth.js +24 -21
- package/dist/mutators/auth.js.map +2 -2
- package/dist/mutators/cookie.d.ts +21 -13
- package/dist/mutators/cookie.d.ts.map +1 -1
- package/dist/mutators/cookie.js +34 -26
- package/dist/mutators/cookie.js.map +3 -3
- package/dist/mutators/document.d.ts +12 -2
- package/dist/mutators/document.d.ts.map +1 -1
- package/dist/mutators/document.js +42 -3
- package/dist/mutators/document.js.map +2 -2
- package/dist/mutators/index.d.ts +30 -20
- package/dist/mutators/index.d.ts.map +1 -1
- package/dist/mutators/index.js +38 -9
- package/dist/mutators/index.js.map +2 -2
- package/dist/mutators/operation.d.ts +49 -108
- package/dist/mutators/operation.d.ts.map +1 -1
- package/dist/mutators/operation.js +198 -94
- package/dist/mutators/operation.js.map +2 -2
- package/dist/mutators/request.d.ts +2 -1
- package/dist/mutators/request.d.ts.map +1 -1
- package/dist/mutators/request.js.map +1 -1
- package/dist/mutators/server.d.ts +1 -1
- package/dist/mutators/server.d.ts.map +1 -1
- package/dist/mutators/server.js +6 -5
- package/dist/mutators/server.js.map +2 -2
- package/dist/mutators/tabs.d.ts +44 -0
- package/dist/mutators/tabs.d.ts.map +1 -0
- package/dist/mutators/tabs.js +133 -0
- package/dist/mutators/tabs.js.map +7 -0
- package/dist/mutators/tag.d.ts +12 -0
- package/dist/mutators/tag.d.ts.map +1 -0
- package/dist/mutators/tag.js +19 -0
- package/dist/mutators/tag.js.map +7 -0
- package/dist/mutators/workspace.d.ts +6 -0
- package/dist/mutators/workspace.d.ts.map +1 -0
- package/dist/mutators/workspace.js +24 -0
- package/dist/mutators/workspace.js.map +7 -0
- package/dist/navigation/get-navigation-options.d.ts.map +1 -1
- package/dist/navigation/get-navigation-options.js +4 -4
- package/dist/navigation/get-navigation-options.js.map +2 -2
- package/dist/navigation/helpers/get-openapi-object.d.ts +35 -0
- package/dist/navigation/helpers/get-openapi-object.d.ts.map +1 -0
- package/dist/navigation/helpers/get-openapi-object.js +31 -0
- package/dist/navigation/helpers/get-openapi-object.js.map +7 -0
- package/dist/navigation/helpers/get-operation-entries.d.ts +24 -0
- package/dist/navigation/helpers/get-operation-entries.d.ts.map +1 -0
- package/dist/navigation/helpers/get-operation-entries.js +33 -0
- package/dist/navigation/helpers/get-operation-entries.js.map +7 -0
- package/dist/navigation/helpers/get-parent-entry.d.ts +15 -0
- package/dist/navigation/helpers/get-parent-entry.d.ts.map +1 -0
- package/dist/navigation/helpers/get-parent-entry.js +13 -0
- package/dist/navigation/helpers/get-parent-entry.js.map +7 -0
- package/dist/navigation/helpers/traverse-description.d.ts +0 -1
- package/dist/navigation/helpers/traverse-description.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-description.js +0 -1
- package/dist/navigation/helpers/traverse-description.js.map +2 -2
- package/dist/navigation/helpers/traverse-document.d.ts +1 -0
- package/dist/navigation/helpers/traverse-document.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-document.js +16 -2
- package/dist/navigation/helpers/traverse-document.js.map +2 -2
- package/dist/navigation/helpers/traverse-examples.js +2 -2
- package/dist/navigation/helpers/traverse-examples.js.map +2 -2
- package/dist/navigation/helpers/traverse-paths.d.ts +6 -3
- package/dist/navigation/helpers/traverse-paths.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-paths.js +5 -10
- package/dist/navigation/helpers/traverse-paths.js.map +2 -2
- package/dist/navigation/helpers/traverse-tags.d.ts +0 -1
- package/dist/navigation/helpers/traverse-tags.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-tags.js +57 -49
- package/dist/navigation/helpers/traverse-tags.js.map +3 -3
- package/dist/navigation/helpers/utils.d.ts +2 -1
- package/dist/navigation/helpers/utils.d.ts.map +1 -1
- package/dist/navigation/helpers/utils.js.map +1 -1
- package/dist/navigation/index.d.ts +2 -1
- package/dist/navigation/index.d.ts.map +1 -1
- package/dist/navigation/index.js +5 -3
- package/dist/navigation/index.js.map +2 -2
- package/dist/persistence/index.d.ts +6 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +18 -0
- package/dist/persistence/index.js.map +2 -2
- package/dist/persistence/indexdb.d.ts +1 -0
- package/dist/persistence/indexdb.d.ts.map +1 -1
- package/dist/persistence/indexdb.js +6 -1
- package/dist/persistence/indexdb.js.map +2 -2
- package/dist/plugins/client/persistence.d.ts.map +1 -1
- package/dist/plugins/client/persistence.js +6 -0
- package/dist/plugins/client/persistence.js.map +2 -2
- package/dist/schemas/extensions/document/x-scalar-environments.d.ts +1 -0
- package/dist/schemas/extensions/document/x-scalar-environments.d.ts.map +1 -1
- package/dist/schemas/extensions/document/x-scalar-environments.js.map +2 -2
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts +13 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts.map +1 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.js +8 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.js.map +7 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.d.ts +36 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.d.ts.map +1 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.js +15 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.js.map +7 -0
- package/dist/schemas/extensions/general/x-scalar-order.d.ts +12 -0
- package/dist/schemas/extensions/general/x-scalar-order.d.ts.map +1 -0
- package/dist/schemas/extensions/general/x-scalar-order.js +8 -0
- package/dist/schemas/extensions/general/x-scalar-order.js.map +7 -0
- package/dist/schemas/extensions/operation/index.d.ts +4 -1
- package/dist/schemas/extensions/operation/index.d.ts.map +1 -1
- package/dist/schemas/extensions/operation/index.js +22 -0
- package/dist/schemas/extensions/operation/index.js.map +3 -3
- package/dist/schemas/extensions/operation/x-code-samples.d.ts +0 -5
- package/dist/schemas/extensions/operation/x-code-samples.d.ts.map +1 -1
- package/dist/schemas/extensions/operation/x-code-samples.js +0 -1
- package/dist/schemas/extensions/operation/x-code-samples.js.map +2 -2
- package/dist/schemas/extensions/operation/x-post-response.d.ts +0 -18
- package/dist/schemas/extensions/operation/x-post-response.d.ts.map +1 -1
- package/dist/schemas/extensions/operation/x-post-response.js.map +1 -1
- package/dist/schemas/extensions/tag/x-tag-groups.d.ts +8 -14
- package/dist/schemas/extensions/tag/x-tag-groups.d.ts.map +1 -1
- package/dist/schemas/extensions/tag/x-tag-groups.js +15 -11
- package/dist/schemas/extensions/tag/x-tag-groups.js.map +2 -2
- package/dist/schemas/extensions/workspace/index.d.ts +4 -0
- package/dist/schemas/extensions/workspace/index.d.ts.map +1 -0
- package/dist/schemas/extensions/workspace/index.js +15 -0
- package/dist/schemas/extensions/workspace/index.js.map +7 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts +18 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts.map +1 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js +8 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js.map +7 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.d.ts +36 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.d.ts.map +1 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.js +16 -0
- package/dist/schemas/extensions/workspace/x-scalar-tabs.js.map +7 -0
- package/dist/schemas/extensions.d.ts +1 -1
- package/dist/schemas/extensions.js +1 -1
- package/dist/schemas/extensions.js.map +2 -2
- package/dist/schemas/inmemory-workspace.d.ts +46 -33
- package/dist/schemas/inmemory-workspace.d.ts.map +1 -1
- package/dist/schemas/navigation.d.ts +12 -1
- package/dist/schemas/navigation.d.ts.map +1 -1
- package/dist/schemas/navigation.js +2 -1
- package/dist/schemas/navigation.js.map +2 -2
- package/dist/schemas/reference-config/index.d.ts +22 -16
- package/dist/schemas/reference-config/index.d.ts.map +1 -1
- package/dist/schemas/reference-config/settings.d.ts +22 -16
- package/dist/schemas/reference-config/settings.d.ts.map +1 -1
- package/dist/schemas/reference-config/settings.js +2 -0
- package/dist/schemas/reference-config/settings.js.map +2 -2
- package/dist/schemas/v3.1/strict/header.d.ts +0 -45
- package/dist/schemas/v3.1/strict/header.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/header.js +1 -3
- package/dist/schemas/v3.1/strict/header.js.map +2 -2
- package/dist/schemas/v3.1/strict/oauth-flow.d.ts +0 -99
- package/dist/schemas/v3.1/strict/oauth-flow.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/oauth-flow.js +0 -7
- package/dist/schemas/v3.1/strict/oauth-flow.js.map +2 -2
- package/dist/schemas/v3.1/strict/openapi-document.d.ts +756 -552
- package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/openapi-document.js +10 -11
- package/dist/schemas/v3.1/strict/openapi-document.js.map +2 -2
- package/dist/schemas/v3.1/strict/operation.d.ts +1 -5
- package/dist/schemas/v3.1/strict/operation.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/operation.js +1 -5
- package/dist/schemas/v3.1/strict/operation.js.map +2 -2
- package/dist/schemas/v3.1/strict/parameter.d.ts +1 -101
- package/dist/schemas/v3.1/strict/parameter.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/parameter.js +1 -4
- package/dist/schemas/v3.1/strict/parameter.js.map +2 -2
- package/dist/schemas/v3.1/strict/ref-definitions.d.ts +0 -1
- package/dist/schemas/v3.1/strict/ref-definitions.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/ref-definitions.js +0 -2
- package/dist/schemas/v3.1/strict/ref-definitions.js.map +2 -2
- package/dist/schemas/v3.1/strict/schema.d.ts +28 -11
- package/dist/schemas/v3.1/strict/schema.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/schema.js +2 -2
- package/dist/schemas/v3.1/strict/schema.js.map +2 -2
- package/dist/schemas/v3.1/strict/security-scheme.d.ts +1 -54
- package/dist/schemas/v3.1/strict/security-scheme.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/security-scheme.js +0 -5
- package/dist/schemas/v3.1/strict/security-scheme.js.map +2 -2
- package/dist/schemas/v3.1/strict/tag.d.ts +4 -1
- package/dist/schemas/v3.1/strict/tag.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/tag.js +3 -1
- package/dist/schemas/v3.1/strict/tag.js.map +2 -2
- package/dist/schemas/v3.1/strict/type-guards.d.ts +6 -0
- package/dist/schemas/v3.1/strict/type-guards.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/type-guards.js +4 -0
- package/dist/schemas/v3.1/strict/type-guards.js.map +2 -2
- package/dist/schemas/workspace-specification/config.d.ts +22 -16
- package/dist/schemas/workspace-specification/config.d.ts.map +1 -1
- package/dist/schemas/workspace-specification/index.d.ts +23 -17
- package/dist/schemas/workspace-specification/index.d.ts.map +1 -1
- package/dist/schemas/workspace.d.ts +204 -130
- package/dist/schemas/workspace.d.ts.map +1 -1
- package/dist/schemas/workspace.js +18 -11
- package/dist/schemas/workspace.js.map +2 -2
- package/dist/server.d.ts +1 -1
- package/dist/workspace-plugin.d.ts +3 -0
- package/dist/workspace-plugin.d.ts.map +1 -1
- package/package.json +50 -35
- package/dist/schemas/extensions/document/x-scalar-document-security.d.ts +0 -13
- package/dist/schemas/extensions/document/x-scalar-document-security.d.ts.map +0 -1
- package/dist/schemas/extensions/document/x-scalar-document-security.js +0 -8
- package/dist/schemas/extensions/document/x-scalar-document-security.js.map +0 -7
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts +0 -13
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts.map +0 -1
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js +0 -9
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js.map +0 -7
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts +0 -32
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts.map +0 -1
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js +0 -13
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js.map +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/mutators/server.ts"],
|
|
4
|
-
"sourcesContent": ["import { findVariables } from '@scalar/helpers/regex/find-variables'\n\nimport type { ServerEvents } from '@/events/definitions/server'\nimport { coerceValue } from '@/schemas/typebox-coerce'\nimport { type ServerObject, ServerObjectSchema } from '@/schemas/v3.1/strict/openapi-document'\nimport type { WorkspaceDocument } from '@/schemas/workspace'\n\n/**\n * Adds a new ServerObject to the document.\n *\n * @param document - The document to add the server to\n * @returns the new server object or undefined if the document is not found\n */\nexport const addServer = (document: WorkspaceDocument | null): ServerObject | undefined => {\n if (!document) {\n return undefined\n }\n\n const parsed = coerceValue(ServerObjectSchema, {})\n\n // Initialize the servers array if it doesn't exist\n if (!document.servers) {\n document.servers = []\n }\n\n document.servers.push(parsed)\n return parsed\n}\n\n/**\n * Creates a map of variable names to their character positions in a URL.\n * Used to detect renamed variables by position matching.\n */\nconst getVariablePositions = (url: string, variables: readonly string[]): Record<string, number> => {\n const positions: Record<string, number> = {}\n\n for (const varName of variables) {\n const position = url.indexOf(`{${varName}}`)\n if (position !== -1) {\n positions[varName] = position\n }\n }\n\n return positions\n}\n\ntype VariableConfig = {\n description?: string\n default?: string\n enum?: string[]\n}\n\n/**\n * Syncs server variables when the URL changes.\n *\n * Preserves variable configurations by:\n * 1. Keeping variables with matching names\n * 2. Renaming variables at the same position\n * 3. Creating new variables with empty defaults\n */\nconst syncVariablesForUrlChange = (\n newUrl: string,\n oldUrl: string,\n existingVariables: Record<string, VariableConfig>,\n): Record<string, VariableConfig> => {\n // Filter out undefined values from findVariables results\n const oldVariables = findVariables(oldUrl, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n const newVariables = findVariables(newUrl, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n\n const oldPositions = getVariablePositions(oldUrl, oldVariables)\n const newPositions = getVariablePositions(newUrl, newVariables)\n\n const usedOldVariables = new Set<string>()\n const syncedVariables: Record<string, VariableConfig> = {}\n\n for (const newVar of newVariables) {\n // Case 1: Variable with same name exists - preserve its config\n if (existingVariables[newVar]) {\n syncedVariables[newVar] = existingVariables[newVar]\n usedOldVariables.add(newVar)\n continue\n }\n\n // Case 2: Check for variable at same position (likely a rename)\n const newVarPosition = newPositions[newVar]\n const oldVarAtPosition = oldVariables.find(\n (oldVar) => oldPositions[oldVar] === newVarPosition && !usedOldVariables.has(oldVar),\n )\n\n if (oldVarAtPosition && existingVariables[oldVarAtPosition]) {\n // Rename: transfer the old variable's config to the new name\n syncedVariables[newVar] = existingVariables[oldVarAtPosition]\n usedOldVariables.add(oldVarAtPosition)\n continue\n }\n\n // Case 3: New variable - create with empty default\n syncedVariables[newVar] = { default: '' }\n }\n\n return syncedVariables\n}\n\n/**\n * Updates a ServerObject in the document.\n * When the URL changes, intelligently syncs variables by preserving configurations\n * for renamed variables (detected by position) and existing variables.\n *\n * @param document - The document containing the server to update\n * @param index - The index of the server to update\n * @param server - The partial server object with fields to update\n * @returns the updated server object or undefined if the server is not found\n */\nexport const updateServer = (\n document: WorkspaceDocument | null,\n { index, server }: ServerEvents['server:update:server'],\n): ServerObject | undefined => {\n const oldServer = document?.servers?.[index]\n\n if (!oldServer) {\n console.error('Server not found at index:', index)\n return undefined\n }\n\n const oldUrl = oldServer.url\n const updatedServer = coerceValue(ServerObjectSchema, { ...oldServer, ...server })\n\n // Sync variables if the URL changed\n const hasUrlChanged = oldUrl && oldUrl !== updatedServer.url\n if (hasUrlChanged) {\n const existingVariables = updatedServer.variables ?? {}\n updatedServer.variables = syncVariablesForUrlChange(updatedServer.url, oldUrl, existingVariables)\n\n // If the selected server is the one being updated, set the selected server to the new server\n if (document['x-scalar-selected-server'] === oldUrl) {\n document['x-scalar-selected-server'] = updatedServer.url\n }\n }\n\n // Ensure servers array exists and update the server at the specified index\n if (!document.servers) {\n document.servers = [updatedServer]\n } else {\n document.servers[index] = updatedServer\n }\n\n return updatedServer\n}\n\n/**\n * Deletes a ServerObject at the specified index from the target array.\n *\n * @param document - The document to delete the server from\n * @param index - The index of the server to delete.\n */\nexport const deleteServer = (document: WorkspaceDocument | null, { index }: ServerEvents['server:delete:server']) => {\n if (!document?.servers) {\n return\n }\n\n const url = document.servers[index]?.url\n document.servers.splice(index, 1)\n\n // If the selected server is the one being deleted, set the selected server to the first one after removal\n if (document['x-scalar-selected-server'] === url) {\n document['x-scalar-selected-server'] = document.servers[0]?.url ?? undefined\n }\n}\n\n/**\n * Updates a server variable for the selected server\n *\n * @param document - The document to update the server variables in\n * @param index - The index of the server to update\n * @param key - The key of the variable to update\n * @param value - The new value of the variable\n * @returns the updated variable or undefined if the variable is not found\n */\nexport const updateServerVariables = (\n document: WorkspaceDocument | null,\n { index, key, value }: ServerEvents['server:update:variables'],\n) => {\n const variable = document?.servers?.[index]?.variables?.[key]\n if (!variable) {\n console.error('Variable not found', key, index)\n return\n }\n\n variable.default = value\n\n // Now we need to make the url reflect the new variable value\n const url = document?.servers?.[index]?.url\n if (!url) {\n console.error('URL not found', index)\n return\n }\n\n return variable\n}\n\n/**\n * Updates the selected server for the document\n *\n * @param document - The document to update the selected server in\n * @param index - The index of the server to update\n * @returns the url of the selected server or undefined if the server is not found\n */\nexport const updateSelectedServer = (\n document: WorkspaceDocument | null,\n {
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["import { findVariables } from '@scalar/helpers/regex/find-variables'\n\nimport type { ServerEvents } from '@/events/definitions/server'\nimport { coerceValue } from '@/schemas/typebox-coerce'\nimport { type ServerObject, ServerObjectSchema } from '@/schemas/v3.1/strict/openapi-document'\nimport type { WorkspaceDocument } from '@/schemas/workspace'\n\n/**\n * Adds a new ServerObject to the document.\n *\n * @param document - The document to add the server to\n * @returns the new server object or undefined if the document is not found\n */\nexport const addServer = (document: WorkspaceDocument | null): ServerObject | undefined => {\n if (!document) {\n return undefined\n }\n\n const parsed = coerceValue(ServerObjectSchema, {})\n\n // Initialize the servers array if it doesn't exist\n if (!document.servers) {\n document.servers = []\n }\n\n document.servers.push(parsed)\n return parsed\n}\n\n/**\n * Creates a map of variable names to their character positions in a URL.\n * Used to detect renamed variables by position matching.\n */\nconst getVariablePositions = (url: string, variables: readonly string[]): Record<string, number> => {\n const positions: Record<string, number> = {}\n\n for (const varName of variables) {\n const position = url.indexOf(`{${varName}}`)\n if (position !== -1) {\n positions[varName] = position\n }\n }\n\n return positions\n}\n\ntype VariableConfig = {\n description?: string\n default?: string\n enum?: string[]\n}\n\n/**\n * Syncs server variables when the URL changes.\n *\n * Preserves variable configurations by:\n * 1. Keeping variables with matching names\n * 2. Renaming variables at the same position\n * 3. Creating new variables with empty defaults\n */\nconst syncVariablesForUrlChange = (\n newUrl: string,\n oldUrl: string,\n existingVariables: Record<string, VariableConfig>,\n): Record<string, VariableConfig> => {\n // Filter out undefined values from findVariables results\n const oldVariables = findVariables(oldUrl, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n const newVariables = findVariables(newUrl, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n\n const oldPositions = getVariablePositions(oldUrl, oldVariables)\n const newPositions = getVariablePositions(newUrl, newVariables)\n\n const usedOldVariables = new Set<string>()\n const syncedVariables: Record<string, VariableConfig> = {}\n\n for (const newVar of newVariables) {\n // Case 1: Variable with same name exists - preserve its config\n if (existingVariables[newVar]) {\n syncedVariables[newVar] = existingVariables[newVar]\n usedOldVariables.add(newVar)\n continue\n }\n\n // Case 2: Check for variable at same position (likely a rename)\n const newVarPosition = newPositions[newVar]\n const oldVarAtPosition = oldVariables.find(\n (oldVar) => oldPositions[oldVar] === newVarPosition && !usedOldVariables.has(oldVar),\n )\n\n if (oldVarAtPosition && existingVariables[oldVarAtPosition]) {\n // Rename: transfer the old variable's config to the new name\n syncedVariables[newVar] = existingVariables[oldVarAtPosition]\n usedOldVariables.add(oldVarAtPosition)\n continue\n }\n\n // Case 3: New variable - create with empty default\n syncedVariables[newVar] = { default: '' }\n }\n\n return syncedVariables\n}\n\n/**\n * Updates a ServerObject in the document.\n * When the URL changes, intelligently syncs variables by preserving configurations\n * for renamed variables (detected by position) and existing variables.\n *\n * @param document - The document containing the server to update\n * @param index - The index of the server to update\n * @param server - The partial server object with fields to update\n * @returns the updated server object or undefined if the server is not found\n */\nexport const updateServer = (\n document: WorkspaceDocument | null,\n { index, server }: ServerEvents['server:update:server'],\n): ServerObject | undefined => {\n const oldServer = document?.servers?.[index]\n\n if (!oldServer) {\n console.error('Server not found at index:', index)\n return undefined\n }\n\n const oldUrl = oldServer.url\n const updatedServer = coerceValue(ServerObjectSchema, { ...oldServer, ...server })\n\n // Sync variables if the URL changed\n const hasUrlChanged = oldUrl && oldUrl !== updatedServer.url\n if (hasUrlChanged) {\n const existingVariables = updatedServer.variables ?? {}\n updatedServer.variables = syncVariablesForUrlChange(updatedServer.url, oldUrl, existingVariables)\n\n // If the selected server is the one being updated, set the selected server to the new server\n if (document['x-scalar-selected-server'] === oldUrl) {\n document['x-scalar-selected-server'] = updatedServer.url\n }\n }\n\n // Ensure servers array exists and update the server at the specified index\n if (!document.servers) {\n document.servers = [updatedServer]\n } else {\n document.servers[index] = updatedServer\n }\n\n return updatedServer\n}\n\n/**\n * Deletes a ServerObject at the specified index from the target array.\n *\n * @param document - The document to delete the server from\n * @param index - The index of the server to delete.\n */\nexport const deleteServer = (document: WorkspaceDocument | null, { index }: ServerEvents['server:delete:server']) => {\n if (!document?.servers) {\n return\n }\n\n const url = document.servers[index]?.url\n document.servers.splice(index, 1)\n\n // If the selected server is the one being deleted, set the selected server to the first one after removal\n if (document['x-scalar-selected-server'] === url) {\n document['x-scalar-selected-server'] = document.servers[0]?.url ?? undefined\n }\n}\n\n/**\n * Updates a server variable for the selected server\n *\n * @param document - The document to update the server variables in\n * @param index - The index of the server to update\n * @param key - The key of the variable to update\n * @param value - The new value of the variable\n * @returns the updated variable or undefined if the variable is not found\n */\nexport const updateServerVariables = (\n document: WorkspaceDocument | null,\n { index, key, value }: ServerEvents['server:update:variables'],\n) => {\n const variable = document?.servers?.[index]?.variables?.[key]\n if (!variable) {\n console.error('Variable not found', key, index)\n return\n }\n\n variable.default = value\n\n // Now we need to make the url reflect the new variable value\n const url = document?.servers?.[index]?.url\n if (!url) {\n console.error('URL not found', index)\n return\n }\n\n return variable\n}\n\n/**\n * Updates the selected server for the document\n *\n * @param document - The document to update the selected server in\n * @param index - The index of the server to update\n * @returns the url of the selected server or undefined if the server is not found\n */\nexport const updateSelectedServer = (\n document: WorkspaceDocument | null,\n { url }: ServerEvents['server:update:selected'],\n): string | undefined => {\n if (!document) {\n return\n }\n\n // If no servers match then return undefined\n if (!document.servers?.some((server) => server.url === url)) {\n return\n }\n\n /**\n * [un]set it and return the url,\n * we specifically use en empty string to indicate that the user has unset the selected server\n */\n document['x-scalar-selected-server'] = document['x-scalar-selected-server'] === url ? '' : url\n return document['x-scalar-selected-server']\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { TabEvents } from '../events/definitions/tabs.js';
|
|
2
|
+
import type { Workspace } from '../schemas.js';
|
|
3
|
+
/**
|
|
4
|
+
* Updates the tabs and active tab index in the workspace.
|
|
5
|
+
* This is used for bulk updates when synchronizing state.
|
|
6
|
+
*/
|
|
7
|
+
export declare const updateTabs: (workspace: Workspace | null, payload: TabEvents["tabs:update:tabs"]) => void;
|
|
8
|
+
/**
|
|
9
|
+
* Adds a new tab by duplicating the currently active tab.
|
|
10
|
+
* This preserves the user's context when opening a new tab.
|
|
11
|
+
*/
|
|
12
|
+
export declare const addTab: (workspace: Workspace | null, _payload: TabEvents["tabs:add:tab"]) => boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Closes the currently active tab.
|
|
15
|
+
* Prevents closing if only one tab remains, to ensure the user always has a tab open.
|
|
16
|
+
* Adjusts the active index if needed to keep it in bounds.
|
|
17
|
+
*/
|
|
18
|
+
export declare const closeTab: (workspace: Workspace | null, payload: TabEvents["tabs:close:tab"]) => boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Closes all other tabs except the one at the given index
|
|
21
|
+
*/
|
|
22
|
+
export declare const closeOtherTabs: (workspace: Workspace | null, payload: TabEvents["tabs:close:other-tabs"]) => boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Navigates to the previous tab in the list.
|
|
25
|
+
* Does nothing if already at the first tab.
|
|
26
|
+
*/
|
|
27
|
+
export declare const navigatePreviousTab: (workspace: Workspace | null, _payload: TabEvents["tabs:navigate:previous"]) => boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Navigates to the next tab in the list.
|
|
30
|
+
* Does nothing if already at the last tab.
|
|
31
|
+
*/
|
|
32
|
+
export declare const navigateNextTab: (workspace: Workspace | null, _payload: TabEvents["tabs:navigate:next"]) => boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Focuses a specific tab based on keyboard number input (1-9).
|
|
35
|
+
* Extracts the digit from the keyboard event and focuses that tab.
|
|
36
|
+
* Tab numbering starts at 1 for user convenience but uses 0-based indexing internally.
|
|
37
|
+
*/
|
|
38
|
+
export declare const focusTab: (workspace: Workspace | null, payload: TabEvents["tabs:focus:tab"]) => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Focuses the last tab in the list.
|
|
41
|
+
* This provides a quick way to jump to the end, regardless of how many tabs exist.
|
|
42
|
+
*/
|
|
43
|
+
export declare const focusLastTab: (workspace: Workspace | null, _payload: TabEvents["tabs:focus:tab-last"]) => boolean;
|
|
44
|
+
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/mutators/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAoC1C;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,kBAAkB,CAAC,KAAG,IAYhG,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,UAAU,SAAS,CAAC,cAAc,CAAC,KAAG,OAkBzF,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,KAAG,OA8B5F,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,uBAAuB,CAAC,KAAG,OAezG,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,WAAW,SAAS,GAAG,IAAI,EAC3B,UAAU,SAAS,CAAC,wBAAwB,CAAC,KAC5C,OAaF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,UAAU,SAAS,CAAC,oBAAoB,CAAC,KAAG,OAcxG,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,KAAG,OAsB5F,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,UAAU,SAAS,CAAC,qBAAqB,CAAC,KAAG,OAatG,CAAA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { unpackProxyObject } from "../helpers/unpack-proxy.js";
|
|
2
|
+
const TAB_UNPACK_DEPTH = 1;
|
|
3
|
+
const hasValidTabs = (workspace) => {
|
|
4
|
+
return workspace !== null && workspace["x-scalar-tabs"] !== void 0;
|
|
5
|
+
};
|
|
6
|
+
const getUnpackedTabs = (workspace) => {
|
|
7
|
+
return unpackProxyObject(workspace["x-scalar-tabs"], { depth: TAB_UNPACK_DEPTH });
|
|
8
|
+
};
|
|
9
|
+
const getActiveIndex = (workspace) => {
|
|
10
|
+
return workspace["x-scalar-active-tab"] ?? 0;
|
|
11
|
+
};
|
|
12
|
+
const updateTabs = (workspace, payload) => {
|
|
13
|
+
if (!workspace) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
if (payload["x-scalar-tabs"]) {
|
|
17
|
+
workspace["x-scalar-tabs"] = payload["x-scalar-tabs"];
|
|
18
|
+
}
|
|
19
|
+
if (payload["x-scalar-active-tab"] !== void 0) {
|
|
20
|
+
workspace["x-scalar-active-tab"] = payload["x-scalar-active-tab"];
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
const addTab = (workspace, _payload) => {
|
|
24
|
+
if (!hasValidTabs(workspace)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const tabs = getUnpackedTabs(workspace);
|
|
28
|
+
const activeIndex = getActiveIndex(workspace);
|
|
29
|
+
const currentTab = tabs[activeIndex];
|
|
30
|
+
if (!currentTab) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const newTabs = [...tabs, { ...currentTab }];
|
|
34
|
+
workspace["x-scalar-tabs"] = newTabs;
|
|
35
|
+
workspace["x-scalar-active-tab"] = newTabs.length - 1;
|
|
36
|
+
return true;
|
|
37
|
+
};
|
|
38
|
+
const closeTab = (workspace, payload) => {
|
|
39
|
+
const getInputIndex = () => {
|
|
40
|
+
if ("event" in payload) {
|
|
41
|
+
return payload.event.code.startsWith("Digit") ? Number.parseInt(payload.event.key, 10) - 1 : Number.NaN;
|
|
42
|
+
}
|
|
43
|
+
return payload.index;
|
|
44
|
+
};
|
|
45
|
+
if (!hasValidTabs(workspace)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const tabs = getUnpackedTabs(workspace);
|
|
49
|
+
const index = getInputIndex();
|
|
50
|
+
if (tabs.length <= 1) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
workspace["x-scalar-tabs"] = tabs.filter((_, i) => i !== index);
|
|
54
|
+
if (index >= tabs.length - 1) {
|
|
55
|
+
workspace["x-scalar-active-tab"] = tabs.length - 2;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
};
|
|
59
|
+
const closeOtherTabs = (workspace, payload) => {
|
|
60
|
+
if (!hasValidTabs(workspace)) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const tabs = getUnpackedTabs(workspace);
|
|
64
|
+
if (tabs.length <= 1) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
workspace["x-scalar-tabs"] = tabs.filter((_, index) => index === payload.index);
|
|
68
|
+
workspace["x-scalar-active-tab"] = 0;
|
|
69
|
+
return true;
|
|
70
|
+
};
|
|
71
|
+
const navigatePreviousTab = (workspace, _payload) => {
|
|
72
|
+
if (!hasValidTabs(workspace)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const activeIndex = getActiveIndex(workspace);
|
|
76
|
+
if (activeIndex <= 0) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
workspace["x-scalar-active-tab"] = activeIndex - 1;
|
|
80
|
+
return true;
|
|
81
|
+
};
|
|
82
|
+
const navigateNextTab = (workspace, _payload) => {
|
|
83
|
+
if (!hasValidTabs(workspace)) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
const tabs = getUnpackedTabs(workspace);
|
|
87
|
+
const activeIndex = getActiveIndex(workspace);
|
|
88
|
+
if (activeIndex >= tabs.length - 1) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
workspace["x-scalar-active-tab"] = activeIndex + 1;
|
|
92
|
+
return true;
|
|
93
|
+
};
|
|
94
|
+
const focusTab = (workspace, payload) => {
|
|
95
|
+
if (!hasValidTabs(workspace)) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const getInputIndex = () => {
|
|
99
|
+
if ("event" in payload) {
|
|
100
|
+
return payload.event.code.startsWith("Digit") ? Number.parseInt(payload.event.key, 10) - 1 : Number.NaN;
|
|
101
|
+
}
|
|
102
|
+
return payload.index;
|
|
103
|
+
};
|
|
104
|
+
const tabs = getUnpackedTabs(workspace);
|
|
105
|
+
const newActiveIndex = getInputIndex();
|
|
106
|
+
if (Number.isNaN(newActiveIndex) || newActiveIndex < 0 || newActiveIndex >= tabs.length) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
workspace["x-scalar-active-tab"] = newActiveIndex;
|
|
110
|
+
return true;
|
|
111
|
+
};
|
|
112
|
+
const focusLastTab = (workspace, _payload) => {
|
|
113
|
+
if (!hasValidTabs(workspace)) {
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const tabs = getUnpackedTabs(workspace);
|
|
117
|
+
if (tabs.length <= 1) {
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
workspace["x-scalar-active-tab"] = tabs.length - 1;
|
|
121
|
+
return true;
|
|
122
|
+
};
|
|
123
|
+
export {
|
|
124
|
+
addTab,
|
|
125
|
+
closeOtherTabs,
|
|
126
|
+
closeTab,
|
|
127
|
+
focusLastTab,
|
|
128
|
+
focusTab,
|
|
129
|
+
navigateNextTab,
|
|
130
|
+
navigatePreviousTab,
|
|
131
|
+
updateTabs
|
|
132
|
+
};
|
|
133
|
+
//# sourceMappingURL=tabs.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/mutators/tabs.ts"],
|
|
4
|
+
"sourcesContent": ["import type { TabEvents } from '@/events/definitions/tabs'\nimport { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport type { Workspace } from '@/schemas'\n\n/**\n * Depth level for unpacking tab proxy objects.\n * We only need shallow unpacking since tabs are a flat array.\n */\nconst TAB_UNPACK_DEPTH = 1\n\n/**\n * Helper to validate that workspace has tabs configured.\n * Returns false if workspace or tabs are not available.\n */\nconst hasValidTabs = (\n workspace: Workspace | null,\n): workspace is Workspace & { 'x-scalar-tabs': NonNullable<Workspace['x-scalar-tabs']> } => {\n return workspace !== null && workspace['x-scalar-tabs'] !== undefined\n}\n\n/**\n * Helper to get the unpacked tabs array from workspace.\n * Returns the tabs as a plain array, not a proxy.\n */\nconst getUnpackedTabs = (\n workspace: Workspace & { 'x-scalar-tabs': NonNullable<Workspace['x-scalar-tabs']> },\n): ReturnType<typeof unpackProxyObject<NonNullable<Workspace['x-scalar-tabs']>>> => {\n return unpackProxyObject(workspace['x-scalar-tabs']!, { depth: TAB_UNPACK_DEPTH })\n}\n\n/**\n * Helper to get the current active tab index.\n * Defaults to 0 if not set.\n */\nconst getActiveIndex = (workspace: Workspace): number => {\n return workspace['x-scalar-active-tab'] ?? 0\n}\n\n/**\n * Updates the tabs and active tab index in the workspace.\n * This is used for bulk updates when synchronizing state.\n */\nexport const updateTabs = (workspace: Workspace | null, payload: TabEvents['tabs:update:tabs']): void => {\n if (!workspace) {\n return\n }\n\n if (payload['x-scalar-tabs']) {\n workspace['x-scalar-tabs'] = payload['x-scalar-tabs']\n }\n\n if (payload['x-scalar-active-tab'] !== undefined) {\n workspace['x-scalar-active-tab'] = payload['x-scalar-active-tab']\n }\n}\n\n/**\n * Adds a new tab by duplicating the currently active tab.\n * This preserves the user's context when opening a new tab.\n */\nexport const addTab = (workspace: Workspace | null, _payload: TabEvents['tabs:add:tab']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n const activeIndex = getActiveIndex(workspace)\n const currentTab = tabs[activeIndex]\n\n if (!currentTab) {\n return false\n }\n\n const newTabs = [...tabs, { ...currentTab }]\n\n workspace['x-scalar-tabs'] = newTabs\n workspace['x-scalar-active-tab'] = newTabs.length - 1\n return true\n}\n\n/**\n * Closes the currently active tab.\n * Prevents closing if only one tab remains, to ensure the user always has a tab open.\n * Adjusts the active index if needed to keep it in bounds.\n */\nexport const closeTab = (workspace: Workspace | null, payload: TabEvents['tabs:close:tab']): boolean => {\n const getInputIndex = (): number => {\n if ('event' in payload) {\n return payload.event.code.startsWith('Digit') ? Number.parseInt(payload.event.key, 10) - 1 : Number.NaN\n }\n return payload.index\n }\n\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n const index = getInputIndex()\n\n if (tabs.length <= 1) {\n return false\n }\n\n workspace['x-scalar-tabs'] = tabs.filter((_, i) => i !== index)\n\n /**\n * If we closed a tab at the end, the active index needs to move back.\n * This ensures the active tab stays within bounds after removal.\n */\n if (index >= tabs.length - 1) {\n workspace['x-scalar-active-tab'] = tabs.length - 2\n }\n\n return true\n}\n\n/**\n * Closes all other tabs except the one at the given index\n */\nexport const closeOtherTabs = (workspace: Workspace | null, payload: TabEvents['tabs:close:other-tabs']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n\n if (tabs.length <= 1) {\n return false\n }\n\n workspace['x-scalar-tabs'] = tabs.filter((_, index) => index === payload.index)\n // set the active tab to the first tab since we closed all other tabs\n workspace['x-scalar-active-tab'] = 0\n return true\n}\n\n/**\n * Navigates to the previous tab in the list.\n * Does nothing if already at the first tab.\n */\nexport const navigatePreviousTab = (\n workspace: Workspace | null,\n _payload: TabEvents['tabs:navigate:previous'],\n): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const activeIndex = getActiveIndex(workspace)\n\n if (activeIndex <= 0) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = activeIndex - 1\n return true\n}\n\n/**\n * Navigates to the next tab in the list.\n * Does nothing if already at the last tab.\n */\nexport const navigateNextTab = (workspace: Workspace | null, _payload: TabEvents['tabs:navigate:next']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n const activeIndex = getActiveIndex(workspace)\n\n if (activeIndex >= tabs.length - 1) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = activeIndex + 1\n return true\n}\n\n/**\n * Focuses a specific tab based on keyboard number input (1-9).\n * Extracts the digit from the keyboard event and focuses that tab.\n * Tab numbering starts at 1 for user convenience but uses 0-based indexing internally.\n */\nexport const focusTab = (workspace: Workspace | null, payload: TabEvents['tabs:focus:tab']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const getInputIndex = (): number => {\n if ('event' in payload) {\n return payload.event.code.startsWith('Digit') ? Number.parseInt(payload.event.key, 10) - 1 : Number.NaN\n }\n return payload.index\n }\n\n const tabs = getUnpackedTabs(workspace)\n\n const newActiveIndex = getInputIndex()\n\n if (Number.isNaN(newActiveIndex) || newActiveIndex < 0 || newActiveIndex >= tabs.length) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = newActiveIndex\n return true\n}\n\n/**\n * Focuses the last tab in the list.\n * This provides a quick way to jump to the end, regardless of how many tabs exist.\n */\nexport const focusLastTab = (workspace: Workspace | null, _payload: TabEvents['tabs:focus:tab-last']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n\n if (tabs.length <= 1) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = tabs.length - 1\n return true\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WorkspaceStore } from '../client.js';
|
|
2
|
+
import type { TagEvents } from '../events/definitions/tag.js';
|
|
3
|
+
/**
|
|
4
|
+
* Adds a new tag to the WorkspaceDocument's `tags` array.
|
|
5
|
+
*
|
|
6
|
+
* If the document or its tags property does not exist, the function safely no-ops or initializes `tags` as needed.
|
|
7
|
+
*
|
|
8
|
+
* @param document - The target WorkspaceDocument
|
|
9
|
+
* @param payload - The name of the tag to add
|
|
10
|
+
*/
|
|
11
|
+
export declare const createTag: (store: WorkspaceStore | null, payload: TagEvents["tag:create:tag"]) => void;
|
|
12
|
+
//# sourceMappingURL=tag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/mutators/tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEzD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAkB3F,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const createTag = (store, payload) => {
|
|
2
|
+
const document = store?.workspace.documents[payload.documentName];
|
|
3
|
+
if (!document) {
|
|
4
|
+
console.error("Document not found", { payload, store });
|
|
5
|
+
payload.callback?.(false);
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
if (!document.tags) {
|
|
9
|
+
document.tags = [];
|
|
10
|
+
}
|
|
11
|
+
document.tags.push({
|
|
12
|
+
name: payload.name
|
|
13
|
+
});
|
|
14
|
+
payload.callback?.(true);
|
|
15
|
+
};
|
|
16
|
+
export {
|
|
17
|
+
createTag
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=tag.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/mutators/tag.ts"],
|
|
4
|
+
"sourcesContent": ["import type { WorkspaceStore } from '@/client'\nimport type { TagEvents } from '@/events/definitions/tag'\n\n/**\n * Adds a new tag to the WorkspaceDocument's `tags` array.\n *\n * If the document or its tags property does not exist, the function safely no-ops or initializes `tags` as needed.\n *\n * @param document - The target WorkspaceDocument\n * @param payload - The name of the tag to add\n */\nexport const createTag = (store: WorkspaceStore | null, payload: TagEvents['tag:create:tag']) => {\n const document = store?.workspace.documents[payload.documentName]\n\n if (!document) {\n console.error('Document not found', { payload, store })\n payload.callback?.(false)\n return\n }\n\n if (!document.tags) {\n document.tags = []\n }\n\n document.tags.push({\n name: payload.name,\n })\n\n payload.callback?.(true)\n}\n"],
|
|
5
|
+
"mappings": "AAWO,MAAM,YAAY,CAAC,OAA8B,YAAyC;AAC/F,QAAM,WAAW,OAAO,UAAU,UAAU,QAAQ,YAAY;AAEhE,MAAI,CAAC,UAAU;AACb,YAAQ,MAAM,sBAAsB,EAAE,SAAS,MAAM,CAAC;AACtD,YAAQ,WAAW,KAAK;AACxB;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,MAAM;AAClB,aAAS,OAAO,CAAC;AAAA,EACnB;AAEA,WAAS,KAAK,KAAK;AAAA,IACjB,MAAM,QAAQ;AAAA,EAChB,CAAC;AAED,UAAQ,WAAW,IAAI;AACzB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { WorkspaceEvents } from '../events/definitions/workspace.js';
|
|
2
|
+
import type { Workspace } from '../schemas.js';
|
|
3
|
+
export declare const updateActiveProxy: (workspace: Workspace | null, payload: WorkspaceEvents["workspace:update:active-proxy"]) => void;
|
|
4
|
+
export declare const updateColorMode: (workspace: Workspace | null, payload: WorkspaceEvents["workspace:update:color-mode"]) => void;
|
|
5
|
+
export declare const updateTheme: (workspace: Workspace | null, payload: WorkspaceEvents["workspace:update:theme"]) => void;
|
|
6
|
+
//# sourceMappingURL=workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/mutators/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE1C,eAAO,MAAM,iBAAiB,GAC5B,WAAW,SAAS,GAAG,IAAI,EAC3B,SAAS,eAAe,CAAC,+BAA+B,CAAC,SAM1D,CAAA;AAED,eAAO,MAAM,eAAe,GAC1B,WAAW,SAAS,GAAG,IAAI,EAC3B,SAAS,eAAe,CAAC,6BAA6B,CAAC,SAMxD,CAAA;AAED,eAAO,MAAM,WAAW,GAAI,WAAW,SAAS,GAAG,IAAI,EAAE,SAAS,eAAe,CAAC,wBAAwB,CAAC,SAK1G,CAAA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
const updateActiveProxy = (workspace, payload) => {
|
|
2
|
+
if (!workspace) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
workspace["x-scalar-active-proxy"] = payload ?? void 0;
|
|
6
|
+
};
|
|
7
|
+
const updateColorMode = (workspace, payload) => {
|
|
8
|
+
if (!workspace) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
workspace["x-scalar-color-mode"] = payload;
|
|
12
|
+
};
|
|
13
|
+
const updateTheme = (workspace, payload) => {
|
|
14
|
+
if (!workspace) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
workspace["x-scalar-theme"] = payload;
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
updateActiveProxy,
|
|
21
|
+
updateColorMode,
|
|
22
|
+
updateTheme
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/mutators/workspace.ts"],
|
|
4
|
+
"sourcesContent": ["import type { WorkspaceEvents } from '@/events/definitions/workspace'\nimport type { Workspace } from '@/schemas'\n\nexport const updateActiveProxy = (\n workspace: Workspace | null,\n payload: WorkspaceEvents['workspace:update:active-proxy'],\n) => {\n if (!workspace) {\n return\n }\n workspace['x-scalar-active-proxy'] = payload ?? undefined\n}\n\nexport const updateColorMode = (\n workspace: Workspace | null,\n payload: WorkspaceEvents['workspace:update:color-mode'],\n) => {\n if (!workspace) {\n return\n }\n workspace['x-scalar-color-mode'] = payload\n}\n\nexport const updateTheme = (workspace: Workspace | null, payload: WorkspaceEvents['workspace:update:theme']) => {\n if (!workspace) {\n return\n }\n workspace['x-scalar-theme'] = payload\n}\n"],
|
|
5
|
+
"mappings": "AAGO,MAAM,oBAAoB,CAC/B,WACA,YACG;AACH,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AACA,YAAU,uBAAuB,IAAI,WAAW;AAClD;AAEO,MAAM,kBAAkB,CAC7B,WACA,YACG;AACH,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AACA,YAAU,qBAAqB,IAAI;AACrC;AAEO,MAAM,cAAc,CAAC,WAA6B,YAAuD;AAC9G,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AACA,YAAU,gBAAgB,IAAI;AAChC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-navigation-options.d.ts","sourceRoot":"","sources":["../../src/navigation/get-navigation-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAE7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAA;AAErF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,EAAE,SAAS,qBAAqB,KAAG,
|
|
1
|
+
{"version":3,"file":"get-navigation-options.d.ts","sourceRoot":"","sources":["../../src/navigation/get-navigation-options.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAE7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAA;AAErF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,EAAE,SAAS,qBAAqB,KAAG,mBAoH3F,CAAA"}
|
|
@@ -19,20 +19,20 @@ const getNavigationOptions = (documentName, config) => {
|
|
|
19
19
|
return `${documentId}/tag/${slug(props.tag.name ?? "")}`;
|
|
20
20
|
}
|
|
21
21
|
if (props.type === "operation") {
|
|
22
|
-
const
|
|
22
|
+
const prefixTag = props.parentTag ? `${generateId({
|
|
23
23
|
type: "tag",
|
|
24
24
|
tag: props.parentTag.tag,
|
|
25
25
|
parentId: props.parentTag.id
|
|
26
|
-
})}
|
|
26
|
+
})}/` : `${documentId}/`;
|
|
27
27
|
if (referenceConfig?.generateOperationSlug) {
|
|
28
|
-
return `${
|
|
28
|
+
return `${prefixTag}${referenceConfig.generateOperationSlug({
|
|
29
29
|
path: props.path,
|
|
30
30
|
operationId: props.operation.operationId,
|
|
31
31
|
method: props.method,
|
|
32
32
|
summary: props.operation.summary
|
|
33
33
|
})}`;
|
|
34
34
|
}
|
|
35
|
-
return `${
|
|
35
|
+
return `${prefixTag}${props.method}/${slug(props.path)}`;
|
|
36
36
|
}
|
|
37
37
|
if (props.type === "webhook") {
|
|
38
38
|
const prefixTag = props.parentTag ? `${generateId({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/navigation/get-navigation-options.ts"],
|
|
4
|
-
"sourcesContent": ["import { slug } from 'github-slugger'\n\nimport type { TraverseSpecOptions } from '@/navigation/types'\nimport type { IdGenerator } from '@/schemas/navigation'\nimport type { DocumentConfiguration } from '@/schemas/workspace-specification/config'\n\n/**\n * Returns options for traversing an OpenAPI document, allowing customization of\n * how IDs and slugs are generated for tags, headings, models, operations, and webhooks.\n * The returned options can be influenced by the provided DocumentConfiguration\n */\nexport const getNavigationOptions = (documentName: string, config?: DocumentConfiguration): TraverseSpecOptions => {\n const referenceConfig = config?.['x-scalar-reference-config']\n\n const generateId: IdGenerator = (props) => {\n const documentId = `${slug(documentName)}`\n\n // -------- Default text id generation logic --------\n if (props.type === 'text') {\n if (referenceConfig?.generateHeadingSlug) {\n return referenceConfig?.generateHeadingSlug({ slug: props.slug })\n }\n\n if (props.slug) {\n return `${documentId}/description/${props.slug}`\n }\n\n return `${documentId}/`\n }\n\n // -------- Default tag id generation logic --------\n if (props.type === 'tag') {\n if (referenceConfig?.generateTagSlug) {\n return `${documentId}/tag/${referenceConfig.generateTagSlug(props.tag)}`\n }\n\n return `${documentId}/tag/${slug(props.tag.name ?? '')}`\n }\n\n // -------- Default operation id generation logic --------\n if (props.type === 'operation') {\n const
|
|
5
|
-
"mappings": "AAAA,SAAS,YAAY;AAWd,MAAM,uBAAuB,CAAC,cAAsB,WAAwD;AACjH,QAAM,kBAAkB,SAAS,2BAA2B;AAE5D,QAAM,aAA0B,CAAC,UAAU;AACzC,UAAM,aAAa,GAAG,KAAK,YAAY,CAAC;AAGxC,QAAI,MAAM,SAAS,QAAQ;AACzB,UAAI,iBAAiB,qBAAqB;AACxC,eAAO,iBAAiB,oBAAoB,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,MAClE;AAEA,UAAI,MAAM,MAAM;AACd,eAAO,GAAG,UAAU,gBAAgB,MAAM,IAAI;AAAA,MAChD;AAEA,aAAO,GAAG,UAAU;AAAA,IACtB;AAGA,QAAI,MAAM,SAAS,OAAO;AACxB,UAAI,iBAAiB,iBAAiB;AACpC,eAAO,GAAG,UAAU,QAAQ,gBAAgB,gBAAgB,MAAM,GAAG,CAAC;AAAA,MACxE;AAEA,aAAO,GAAG,UAAU,QAAQ,KAAK,MAAM,IAAI,QAAQ,EAAE,CAAC;AAAA,IACxD;AAGA,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,
|
|
4
|
+
"sourcesContent": ["import { slug } from 'github-slugger'\n\nimport type { TraverseSpecOptions } from '@/navigation/types'\nimport type { IdGenerator } from '@/schemas/navigation'\nimport type { DocumentConfiguration } from '@/schemas/workspace-specification/config'\n\n/**\n * Returns options for traversing an OpenAPI document, allowing customization of\n * how IDs and slugs are generated for tags, headings, models, operations, and webhooks.\n * The returned options can be influenced by the provided DocumentConfiguration\n */\nexport const getNavigationOptions = (documentName: string, config?: DocumentConfiguration): TraverseSpecOptions => {\n const referenceConfig = config?.['x-scalar-reference-config']\n\n const generateId: IdGenerator = (props) => {\n const documentId = `${slug(documentName)}`\n\n // -------- Default text id generation logic --------\n if (props.type === 'text') {\n if (referenceConfig?.generateHeadingSlug) {\n return referenceConfig?.generateHeadingSlug({ slug: props.slug })\n }\n\n if (props.slug) {\n return `${documentId}/description/${props.slug}`\n }\n\n return `${documentId}/`\n }\n\n // -------- Default tag id generation logic --------\n if (props.type === 'tag') {\n if (referenceConfig?.generateTagSlug) {\n return `${documentId}/tag/${referenceConfig.generateTagSlug(props.tag)}`\n }\n\n return `${documentId}/tag/${slug(props.tag.name ?? '')}`\n }\n\n // -------- Default operation id generation logic --------\n if (props.type === 'operation') {\n const prefixTag = props.parentTag\n ? `${generateId({\n type: 'tag',\n tag: props.parentTag.tag,\n parentId: props.parentTag.id,\n })}/`\n : `${documentId}/`\n\n if (referenceConfig?.generateOperationSlug) {\n return `${prefixTag}${referenceConfig.generateOperationSlug({\n path: props.path,\n operationId: props.operation.operationId,\n method: props.method,\n summary: props.operation.summary,\n })}`\n }\n\n return `${prefixTag}${props.method}/${slug(props.path)}`\n }\n\n // -------- Default webhook id generation logic --------\n if (props.type === 'webhook') {\n const prefixTag = props.parentTag\n ? `${generateId({\n type: 'tag',\n parentId: props.parentTag.id,\n tag: props.parentTag.tag,\n })}/`\n : `${documentId}/`\n\n if (referenceConfig?.generateWebhookSlug) {\n return `${prefixTag}webhook/${referenceConfig.generateWebhookSlug({\n name: props.name,\n method: props.method,\n })}`\n }\n\n return `${prefixTag}webhook/${props.method}/${slug(props.name)}`\n }\n\n // -------- Default model id generation logic --------\n if (props.type === 'model') {\n if (!props.name) {\n return `${documentId}/models`\n }\n\n const prefixTag = props.parentTag\n ? `${generateId({\n type: 'tag',\n parentId: props.parentTag.id,\n tag: props.parentTag.tag,\n })}/`\n : `${documentId}/`\n\n if (referenceConfig?.generateModelSlug) {\n return `${prefixTag}model/${referenceConfig.generateModelSlug({\n name: props.name,\n })}`\n }\n\n return `${prefixTag}model/${slug(props.name)}`\n }\n\n if (props.type === 'example') {\n return `${props.parentId}/example/${slug(props.name)}`\n }\n\n if (props.type === 'document') {\n // -------- Default document id generation logic --------\n return documentId\n }\n\n console.warn('[WARNING]: unhandled id generation for navigation item:', props)\n return 'unknown-id'\n }\n\n const hideModels = referenceConfig?.features?.showModels === false\n const operationsSorter: TraverseSpecOptions['operationsSorter'] = referenceConfig?.operationsSorter\n const tagsSorter: TraverseSpecOptions['tagsSorter'] = referenceConfig?.tagSort\n\n return {\n hideModels,\n operationsSorter,\n tagsSorter,\n generateId,\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { WorkspaceStore } from '../../client.js';
|
|
2
|
+
import type { WorkspaceDocument } from '../../schemas.js';
|
|
3
|
+
import type { TraversedDocument, TraversedEntry, TraversedOperation, TraversedTag } from '../../schemas/navigation.js';
|
|
4
|
+
import type { OperationObject, TagObject } from '../../schemas/v3.1/strict/openapi-document.js';
|
|
5
|
+
type TraversedOrderable = TraversedDocument | TraversedTag | TraversedOperation;
|
|
6
|
+
type GetOpenapiObject<Entry extends TraversedOrderable> = Entry extends TraversedDocument ? WorkspaceDocument : Entry extends TraversedTag ? TagObject : Entry extends TraversedOperation ? OperationObject : never;
|
|
7
|
+
/** Type guard which checks if the entry has an x-scalar-order property */
|
|
8
|
+
export declare const canHaveOrder: (entry: TraversedEntry) => entry is TraversedOrderable;
|
|
9
|
+
/**
|
|
10
|
+
* Retrieves the corresponding OpenAPI object (document, tag, or operation) from the workspace store based on the provided entry.
|
|
11
|
+
*
|
|
12
|
+
* This helper abstracts the common lookup logic for working with sidebar/drag-and-drop entries and their associated OpenAPI objects.
|
|
13
|
+
* Returns `null` when the lookup cannot be completed (e.g., document/tag/operation not found).
|
|
14
|
+
*
|
|
15
|
+
* @template Entry Either TraversedDocument, TraversedTag, or TraversedOperation.
|
|
16
|
+
* @param store - The workspace store containing loaded documents.
|
|
17
|
+
* @param entry - The sidebar entry (document, tag, or operation).
|
|
18
|
+
* @returns The corresponding OpenAPI object (WorkspaceDocument, TagObject, or OperationObject) or `null` if not found.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* // For a Document entry:
|
|
22
|
+
* const document = getOpenapiObject({ store, entry: documentEntry })
|
|
23
|
+
*
|
|
24
|
+
* // For a Tag entry:
|
|
25
|
+
* const tag = getOpenapiObject({ store, entry: tagEntry })
|
|
26
|
+
*
|
|
27
|
+
* // For an Operation entry:
|
|
28
|
+
* const operation = getOpenapiObject({ store, entry: operationEntry })
|
|
29
|
+
*/
|
|
30
|
+
export declare const getOpenapiObject: <Entry extends TraversedOrderable>({ store, entry, }: {
|
|
31
|
+
store: WorkspaceStore;
|
|
32
|
+
entry: Entry;
|
|
33
|
+
}) => GetOpenapiObject<Entry> | null;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=get-openapi-object.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-openapi-object.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/get-openapi-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/G,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAIxF,KAAK,kBAAkB,GAAG,iBAAiB,GAAG,YAAY,GAAG,kBAAkB,CAAA;AAE/E,KAAK,gBAAgB,CAAC,KAAK,SAAS,kBAAkB,IAAI,KAAK,SAAS,iBAAiB,GACrF,iBAAiB,GACjB,KAAK,SAAS,YAAY,GACxB,SAAS,GACT,KAAK,SAAS,kBAAkB,GAC9B,eAAe,GACf,KAAK,CAAA;AAEb,0EAA0E;AAC1E,eAAO,MAAM,YAAY,GAAI,OAAO,cAAc,KAAG,KAAK,IAAI,kBACmB,CAAA;AAEjF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,SAAS,kBAAkB,EAAE,mBAGhE;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;CACb,KAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,IA2B7B,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getResolvedRef } from "../../helpers/get-resolved-ref.js";
|
|
2
|
+
import { getParentEntry } from "./get-parent-entry.js";
|
|
3
|
+
const canHaveOrder = (entry) => entry.type === "document" || entry.type === "tag" || entry.type === "operation";
|
|
4
|
+
const getOpenapiObject = ({
|
|
5
|
+
store,
|
|
6
|
+
entry
|
|
7
|
+
}) => {
|
|
8
|
+
const documentEntry = getParentEntry("document", entry);
|
|
9
|
+
if (!documentEntry) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
const document = store.workspace.documents[documentEntry.name];
|
|
13
|
+
if (!document) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (entry.type === "document") {
|
|
17
|
+
return document;
|
|
18
|
+
}
|
|
19
|
+
if (entry.type === "tag") {
|
|
20
|
+
return document.tags?.find((tag) => tag.name === entry.name) ?? null;
|
|
21
|
+
}
|
|
22
|
+
if (entry.type === "operation") {
|
|
23
|
+
return getResolvedRef(document.paths?.[entry.path]?.[entry.method]) ?? null;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
};
|
|
27
|
+
export {
|
|
28
|
+
canHaveOrder,
|
|
29
|
+
getOpenapiObject
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=get-openapi-object.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/navigation/helpers/get-openapi-object.ts"],
|
|
4
|
+
"sourcesContent": ["import type { WorkspaceStore } from '@/client'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport type { WorkspaceDocument } from '@/schemas'\nimport type { TraversedDocument, TraversedEntry, TraversedOperation, TraversedTag } from '@/schemas/navigation'\nimport type { OperationObject, TagObject } from '@/schemas/v3.1/strict/openapi-document'\n\nimport { getParentEntry } from './get-parent-entry'\n\ntype TraversedOrderable = TraversedDocument | TraversedTag | TraversedOperation\n\ntype GetOpenapiObject<Entry extends TraversedOrderable> = Entry extends TraversedDocument\n ? WorkspaceDocument\n : Entry extends TraversedTag\n ? TagObject\n : Entry extends TraversedOperation\n ? OperationObject\n : never\n\n/** Type guard which checks if the entry has an x-scalar-order property */\nexport const canHaveOrder = (entry: TraversedEntry): entry is TraversedOrderable =>\n entry.type === 'document' || entry.type === 'tag' || entry.type === 'operation'\n\n/**\n * Retrieves the corresponding OpenAPI object (document, tag, or operation) from the workspace store based on the provided entry.\n *\n * This helper abstracts the common lookup logic for working with sidebar/drag-and-drop entries and their associated OpenAPI objects.\n * Returns `null` when the lookup cannot be completed (e.g., document/tag/operation not found).\n *\n * @template Entry Either TraversedDocument, TraversedTag, or TraversedOperation.\n * @param store - The workspace store containing loaded documents.\n * @param entry - The sidebar entry (document, tag, or operation).\n * @returns The corresponding OpenAPI object (WorkspaceDocument, TagObject, or OperationObject) or `null` if not found.\n *\n * @example\n * // For a Document entry:\n * const document = getOpenapiObject({ store, entry: documentEntry })\n *\n * // For a Tag entry:\n * const tag = getOpenapiObject({ store, entry: tagEntry })\n *\n * // For an Operation entry:\n * const operation = getOpenapiObject({ store, entry: operationEntry })\n */\nexport const getOpenapiObject = <Entry extends TraversedOrderable>({\n store,\n entry,\n}: {\n store: WorkspaceStore\n entry: Entry\n}): GetOpenapiObject<Entry> | null => {\n const documentEntry = getParentEntry('document', entry)\n if (!documentEntry) {\n return null\n }\n\n const document = store.workspace.documents[documentEntry.name]\n if (!document) {\n return null\n }\n\n if (entry.type === 'document') {\n return document as GetOpenapiObject<Entry>\n }\n\n if (entry.type === 'tag') {\n // Find the tag by name in the document's tags array\n return (document.tags?.find((tag) => tag.name === entry.name) as GetOpenapiObject<Entry> | undefined) ?? null\n }\n\n if (entry.type === 'operation') {\n // Fetch and resolve the referenced operation object at the given path/method\n return (getResolvedRef(document.paths?.[entry.path]?.[entry.method]) as GetOpenapiObject<Entry> | undefined) ?? null\n }\n\n // If entry type is unknown, return null\n return null\n}\n"],
|
|
5
|
+
"mappings": "AACA,SAAS,sBAAsB;AAK/B,SAAS,sBAAsB;AAaxB,MAAM,eAAe,CAAC,UAC3B,MAAM,SAAS,cAAc,MAAM,SAAS,SAAS,MAAM,SAAS;AAuB/D,MAAM,mBAAmB,CAAmC;AAAA,EACjE;AAAA,EACA;AACF,MAGsC;AACpC,QAAM,gBAAgB,eAAe,YAAY,KAAK;AACtD,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,UAAU,UAAU,cAAc,IAAI;AAC7D,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,OAAO;AAExB,WAAQ,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,SAAS,MAAM,IAAI,KAA6C;AAAA,EAC3G;AAEA,MAAI,MAAM,SAAS,aAAa;AAE9B,WAAQ,eAAe,SAAS,QAAQ,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,KAA6C;AAAA,EAClH;AAGA,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { TraversedDocument, TraversedOperation, TraversedWebhook, WithParent } from '../../schemas/navigation.js';
|
|
2
|
+
type EntriesMap = Map<string, (WithParent<TraversedOperation> | WithParent<TraversedWebhook>)[]>;
|
|
3
|
+
/**
|
|
4
|
+
* Builds a map of all operations and webhooks in a document, indexed by path/name and method.
|
|
5
|
+
*
|
|
6
|
+
* This function recursively traverses the document structure and collects all operation and webhook
|
|
7
|
+
* entries. Multiple entries can share the same path|method key (for example, when operations are
|
|
8
|
+
* duplicated across different tags or groups).
|
|
9
|
+
*
|
|
10
|
+
* Performance note: If this function is called frequently, consider generating this map once when
|
|
11
|
+
* creating the sidebar state rather than recalculating it in mutators.
|
|
12
|
+
*
|
|
13
|
+
* @param document - The traversed OpenAPI document to extract operations from
|
|
14
|
+
* @returns A map where keys are `path|method` (for operations) or `name|method` (for webhooks),
|
|
15
|
+
* and values are arrays of matching entries. The pipe separator is used to create a
|
|
16
|
+
* unique composite key from the two parts.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const entries = getOperationEntries(document)
|
|
20
|
+
* const getUsers = entries.get('/users|get') // Array of all GET /users operations
|
|
21
|
+
*/
|
|
22
|
+
export declare const getOperationEntries: (document: TraversedDocument) => EntriesMap;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=get-operation-entries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-operation-entries.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/get-operation-entries.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,kBAAkB,EAClB,gBAAgB,EAChB,UAAU,EACX,MAAM,sBAAsB,CAAA;AAE7B,KAAK,UAAU,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAA;AAEhG;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,iBAAiB,KAAG,UA2DjE,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
const getOperationEntries = (document) => {
|
|
2
|
+
const map = /* @__PURE__ */ new Map();
|
|
3
|
+
const addToMap = (key, entry) => {
|
|
4
|
+
const existing = map.get(key);
|
|
5
|
+
if (existing) {
|
|
6
|
+
existing.push(entry);
|
|
7
|
+
} else {
|
|
8
|
+
map.set(key, [entry]);
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const traverse = (entries, parent) => {
|
|
12
|
+
if (!entries) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
if (entry.type === "operation") {
|
|
17
|
+
const key = `${entry.path}|${entry.method}`;
|
|
18
|
+
addToMap(key, { ...entry, parent });
|
|
19
|
+
} else if (entry.type === "webhook") {
|
|
20
|
+
const key = `${entry.name}|${entry.method}`;
|
|
21
|
+
addToMap(key, { ...entry, parent });
|
|
22
|
+
} else if ("children" in entry && entry.children) {
|
|
23
|
+
traverse(entry.children, { ...entry, parent });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
traverse(document.children, document);
|
|
28
|
+
return map;
|
|
29
|
+
};
|
|
30
|
+
export {
|
|
31
|
+
getOperationEntries
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=get-operation-entries.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/navigation/helpers/get-operation-entries.ts"],
|
|
4
|
+
"sourcesContent": ["import type {\n TraversedDocument,\n TraversedEntry,\n TraversedOperation,\n TraversedWebhook,\n WithParent,\n} from '@/schemas/navigation'\n\ntype EntriesMap = Map<string, (WithParent<TraversedOperation> | WithParent<TraversedWebhook>)[]>\n\n/**\n * Builds a map of all operations and webhooks in a document, indexed by path/name and method.\n *\n * This function recursively traverses the document structure and collects all operation and webhook\n * entries. Multiple entries can share the same path|method key (for example, when operations are\n * duplicated across different tags or groups).\n *\n * Performance note: If this function is called frequently, consider generating this map once when\n * creating the sidebar state rather than recalculating it in mutators.\n *\n * @param document - The traversed OpenAPI document to extract operations from\n * @returns A map where keys are `path|method` (for operations) or `name|method` (for webhooks),\n * and values are arrays of matching entries. The pipe separator is used to create a\n * unique composite key from the two parts.\n *\n * @example\n * const entries = getOperationEntries(document)\n * const getUsers = entries.get('/users|get') // Array of all GET /users operations\n */\nexport const getOperationEntries = (document: TraversedDocument): EntriesMap => {\n const map: EntriesMap = new Map()\n\n /**\n * Helper function to add an entry to the map under the specified key.\n * If the key already exists, appends to the array; otherwise creates a new array.\n *\n * @param key - The composite key (path|method or name|method)\n * @param entry - The operation or webhook entry to add (with parent information)\n */\n const addToMap = (key: string, entry: WithParent<TraversedOperation> | WithParent<TraversedWebhook>): void => {\n const existing = map.get(key)\n if (existing) {\n existing.push(entry)\n } else {\n map.set(key, [entry])\n }\n }\n\n /**\n * Recursively traverses the document tree to find all operations and webhooks.\n * Handles three entry types:\n * - operations: collected into the map using path|method as key\n * - webhooks: collected into the map using name|method as key\n * - containers (tags, groups): recursively traversed for their children\n *\n * @param entries - Array of entries to traverse (may be undefined for empty sections)\n * @param parent - The parent entry of the current entries (if any)\n */\n const traverse = (\n entries: TraversedEntry[] | undefined,\n parent: WithParent<TraversedEntry> | TraversedDocument,\n ): void => {\n if (!entries) {\n return\n }\n\n for (const entry of entries) {\n // Handle operations - use path and method to create unique key\n if (entry.type === 'operation') {\n const key = `${entry.path}|${entry.method}`\n addToMap(key, { ...entry, parent })\n }\n // Handle webhooks - use name and method to create unique key\n else if (entry.type === 'webhook') {\n const key = `${entry.name}|${entry.method}`\n addToMap(key, { ...entry, parent })\n }\n // Handle containers - recursively traverse children, passing current entry as parent\n else if ('children' in entry && entry.children) {\n traverse(entry.children, { ...entry, parent })\n }\n }\n }\n\n // Start traversal from document root\n traverse(document.children, document)\n\n return map\n}\n"],
|
|
5
|
+
"mappings": "AA6BO,MAAM,sBAAsB,CAAC,aAA4C;AAC9E,QAAM,MAAkB,oBAAI,IAAI;AAShC,QAAM,WAAW,CAAC,KAAa,UAA+E;AAC5G,UAAM,WAAW,IAAI,IAAI,GAAG;AAC5B,QAAI,UAAU;AACZ,eAAS,KAAK,KAAK;AAAA,IACrB,OAAO;AACL,UAAI,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,IACtB;AAAA,EACF;AAYA,QAAM,WAAW,CACf,SACA,WACS;AACT,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAE3B,UAAI,MAAM,SAAS,aAAa;AAC9B,cAAM,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM;AACzC,iBAAS,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MACpC,WAES,MAAM,SAAS,WAAW;AACjC,cAAM,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM;AACzC,iBAAS,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MACpC,WAES,cAAc,SAAS,MAAM,UAAU;AAC9C,iBAAS,MAAM,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAGA,WAAS,SAAS,UAAU,QAAQ;AAEpC,SAAO;AACT;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TraversedEntry } from '../../schemas/navigation.js';
|
|
2
|
+
/**
|
|
3
|
+
* Traverses up the tree to find and return the closest parent node (including self) of a specified type.
|
|
4
|
+
*
|
|
5
|
+
* @template Type - The type of node to look for.
|
|
6
|
+
* @param type - The type to match in the parent chain.
|
|
7
|
+
* @param node - The node from which traversal begins.
|
|
8
|
+
* @returns The closest parent node of the specified type, or undefined if not found.
|
|
9
|
+
*/
|
|
10
|
+
export declare const getParentEntry: <Type extends TraversedEntry["type"]>(type: Type, node?: TraversedEntry & {
|
|
11
|
+
parent?: TraversedEntry;
|
|
12
|
+
}) => (TraversedEntry & {
|
|
13
|
+
type: Type;
|
|
14
|
+
}) | undefined;
|
|
15
|
+
//# sourceMappingURL=get-parent-entry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-parent-entry.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/get-parent-entry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,SAAS,cAAc,CAAC,MAAM,CAAC,EAChE,MAAM,IAAI,EACV,OAAO,cAAc,GAAG;IAAE,MAAM,CAAC,EAAE,cAAc,CAAA;CAAE,KAClD,CAAC,cAAc,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,GAAG,SAUtC,CAAA"}
|