import type { AnyModel } from '@yaakapp-internal/models'; import { foldersAtom } from '@yaakapp-internal/models'; import { jotaiStore } from './jotai'; export function resolvedModelName(r: AnyModel | null): string { if (r == null) return ''; if (!('url' in r) || r.model === 'plugin') { return 'name' in r ? r.name : ''; } // Return name if it has one if ('name' in r && r.name) { return r.name; } // Replace variable syntax with variable name const withoutVariables = r.url.replace(/\$\{\[\s*([^\]\s]+)\s*]}/g, '$1'); if (withoutVariables.trim() === '') { return r.model === 'http_request' ? r.bodyType && r.bodyType === 'graphql' ? 'GraphQL Request' : 'HTTP Request' : r.model === 'websocket_request' ? 'WebSocket Request' : 'gRPC Request'; } // GRPC gets nice short names if (r.model === 'grpc_request' && r.service != null && r.method != null) { const shortService = r.service.split('.').pop(); return `${shortService}/${r.method}`; } // Strip unnecessary protocol const withoutProto = withoutVariables.replace(/^(http|https|ws|wss):\/\//, ''); return withoutProto; } export function resolvedModelNameWithFolders(model: AnyModel | null): string { return resolvedModelNameWithFoldersArray(model).join(' / '); } export function resolvedModelNameWithFoldersArray(model: AnyModel | null): string[] { if (model == null) return []; const folders = jotaiStore.get(foldersAtom) ?? []; const getParents = (m: AnyModel, names: string[]) => { let newNames = [...names, resolvedModelName(m)]; if ('folderId' in m) { const parent = folders.find((f) => f.id === m.folderId); if (parent) { newNames = [...resolvedModelNameWithFoldersArray(parent), ...newNames]; } } return newNames; }; return getParents(model, []); }