Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion packages/insomnia/src/models/helpers/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type { VCS } from '../../sync/vcs/vcs';
import { insomniaFetch } from '../../ui/insomniaFetch';
import { invariant } from '../../utils/invariant';
import { isDefaultOrganizationProject, type Project, update as updateProject } from '../project';
import type { Workspace } from '../workspace';
import { isMcp, type Workspace } from '../workspace';
import { getOrCreateByParentId as getOrCreateWorkspaceMeta } from '../workspace-meta';
export const sortProjects = (projects: Project[]) => [
...projects.filter(p => isDefaultOrganizationProject(p)).sort((a, b) => a.name.localeCompare(b.name)),
Expand Down Expand Up @@ -62,6 +62,9 @@ export async function updateLocalProjectToRemote({
});

for (const workspace of projectWorkspaces) {
if (isMcp(workspace)) {
continue;
}
const workspaceMeta = await getOrCreateWorkspaceMeta(workspace._id);

// Initialize Sync on the workspace if it's not using Git sync
Expand Down
4 changes: 2 additions & 2 deletions packages/insomnia/src/models/workspace.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,8 @@ export async function all() {
return await db.find<Workspace>(type);
}

export function count() {
return db.count(type);
export function count(scope?: WorkspaceScope) {
return db.count<Workspace>(type, scope ? { scope } : {});
}

export function update(workspace: Workspace, patch: Partial<Workspace>) {
Expand Down
2 changes: 2 additions & 0 deletions packages/insomnia/src/root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -139,12 +139,14 @@ export const useRootLoaderData = () => {
export async function clientLoader(_args: Route.ClientLoaderArgs) {
const settings = await models.settings.get();
const workspaceCount = await models.workspace.count();
const mcpWorkspaceCount = await models.workspace.count('mcp');
const userSession = await models.userSession.getOrCreate();
const cloudCredentials = await models.cloudCredential.all();

return {
settings,
workspaceCount,
mcpWorkspaceCount,
userSession,
cloudCredentials,
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import type { RequestGroupMeta } from '~/models/request-group-meta';
import type { RequestMeta } from '~/models/request-meta';
import type { SocketIORequest } from '~/models/socket-io-request';
import type { WebSocketRequest } from '~/models/websocket-request';
import type { Workspace } from '~/models/workspace';
import { isMcp, type Workspace } from '~/models/workspace';
import type { WorkspaceMeta } from '~/models/workspace-meta';
import { pushSnapshotOnInitialize } from '~/sync/vcs/initialize-backend-project';
import { VCSInstance } from '~/sync/vcs/insomnia-sync';
Expand Down Expand Up @@ -253,7 +253,7 @@ export async function clientLoader({ params, request }: Route.ClientLoaderArgs)
const userSession = await models.userSession.getOrCreate();
const isLoggedInIsCloudProjectAndIsNotGitRepo = userSession.id && activeProject.remoteId && !gitRepository;
let vcsVersion = null;
if (isLoggedInIsCloudProjectAndIsNotGitRepo) {
if (isLoggedInIsCloudProjectAndIsNotGitRepo && !isMcp(activeWorkspace)) {
try {
const vcs = VCSInstance();
await vcs.switchAndCreateBackendProjectIfNotExist(workspaceId, activeWorkspace.name);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ export async function clientAction({ request, params }: Route.ClientActionArgs)
await database.flushChanges(flushId);

const { id } = await models.userSession.getOrCreate();
if (id && !workspaceMeta.gitRepositoryId && !isGitProject(project) && !isLocalProject(project)) {
if (id && !workspaceMeta.gitRepositoryId && !isGitProject(project) && !isLocalProject(project) && scope !== 'mcp') {
const vcs = VCSInstance();
await initializeLocalBackendProjectAndMarkForSync({
vcs,
Expand Down
6 changes: 4 additions & 2 deletions packages/insomnia/src/sync/git/project-ne-db-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { database, database as db } from '../../common/database';
import type { InsomniaFile } from '../../common/import-v5-parser';
import { getInsomniaV5DataExport, importInsomniaV5Data } from '../../common/insomnia-v5';
import * as models from '../../models';
import { isWorkspace, type Workspace } from '../../models/workspace';
import { isMcp, isWorkspace, type Workspace } from '../../models/workspace';
import type { WorkspaceMeta } from '../../models/workspace-meta';
import Stat from './stat';
import { SystemError } from './system-error';
Expand Down Expand Up @@ -140,7 +140,9 @@ export class GitProjectNeDBClient {

async readdir(filePath: string) {
filePath = path.normalize(filePath);
const workspaces = await db.find<Workspace>(models.workspace.type, { parentId: this._projectId });
const workspaces = (await db.find<Workspace>(models.workspace.type, { parentId: this._projectId })).filter(
w => !isMcp(w),
);
const workspaceMetas = await db.find<WorkspaceMeta>(models.workspaceMeta.type, {
parentId: {
$in: workspaces.map(w => w._id),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ import * as models from '../../../models';
import { isRemoteProject } from '../../../models/project';
import { isRequest } from '../../../models/request';
import { isRequestGroup } from '../../../models/request-group';
import { isScratchpad, type Workspace } from '../../../models/workspace';
import { isMcp, isScratchpad, type Workspace } from '../../../models/workspace';
import type { WorkspaceAction } from '../../../plugins';
import { getWorkspaceActions } from '../../../plugins';
import * as pluginApp from '../../../plugins/context/app';
Expand Down Expand Up @@ -187,27 +187,31 @@ export const WorkspaceDropdown: FC<{}> = () => {
action: () => void;
}[];
}[] = [
{
name: 'Import',
id: 'import',
icon: 'cog',
items: [
{
id: 'from-file',
name: 'From File',
icon: <Icon icon="file-import" />,
action: () => {
window.main.trackSegmentEvent({
event: SegmentEvent.importStarted,
properties: {
source: `${activeWorkspace.scope}-menu`,
...(isMcp(activeWorkspace)
? []
: [
{
name: 'Import',
id: 'import',
icon: 'cog' as IconName,
items: [
{
id: 'from-file',
name: 'From File',
icon: <Icon icon="file-import" />,
action: () => {
window.main.trackSegmentEvent({
event: SegmentEvent.importStarted,
properties: {
source: `${activeWorkspace.scope}-menu`,
},
});
setIsImportModalOpen(true);
},
},
});
setIsImportModalOpen(true);
],
},
},
],
},
]),
{
name: 'Runner',
id: 'runner',
Expand Down Expand Up @@ -255,29 +259,33 @@ export const WorkspaceDropdown: FC<{}> = () => {
}),
}),
},
{
id: 'export',
name: 'Export',
icon: <Icon icon="file-export" />,
action: () => {
window.main.trackSegmentEvent({
event: SegmentEvent.exportStarted,
properties: {
source: `${activeWorkspace.scope}-menu`,
},
});
...(isMcp(activeWorkspace)
? []
: [
{
id: 'export',
name: 'Export',
icon: <Icon icon="file-export" />,
action: () => {
window.main.trackSegmentEvent({
event: SegmentEvent.exportStarted,
properties: {
source: `${activeWorkspace.scope}-menu`,
},
});

if (activeWorkspace.scope === 'mock-server') {
return exportMockServerToFile(activeWorkspace);
}
if (activeWorkspace.scope === 'mock-server') {
return exportMockServerToFile(activeWorkspace);
}

if (activeWorkspace.scope === 'environment') {
return exportGlobalEnvironmentToFile(activeWorkspace);
}
if (activeWorkspace.scope === 'environment') {
return exportGlobalEnvironmentToFile(activeWorkspace);
}

return setIsExportModalOpen(true);
},
},
return setIsExportModalOpen(true);
},
},
]),
{
id: 'settings',
name: 'Settings',
Expand Down
20 changes: 13 additions & 7 deletions packages/insomnia/src/ui/components/settings/import-export.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import * as models from 'insomnia/src/models/index';
import { type BaseModel, environment } from 'insomnia/src/models/index';
import { isScratchpadOrganizationId, type Organization } from 'insomnia/src/models/organization';
import type { Project } from 'insomnia/src/models/project';
import { isScratchpad, type Workspace } from 'insomnia/src/models/workspace';
import { isMcp, isScratchpad, type Workspace } from 'insomnia/src/models/workspace';
import { SegmentEvent } from 'insomnia/src/ui/analytics';
import { Icon } from 'insomnia/src/ui/components/icon';
import { showError, showModal } from 'insomnia/src/ui/components/modals';
Expand Down Expand Up @@ -389,8 +389,10 @@ export async function exportWorkspaceData({
export async function exportAllData({ dirPath }: { dirPath: string }): Promise<void> {
const workspaces = await database.find<Workspace>(models.workspace.type);

const workspacesWithoutMcp = workspaces.filter(w => !isMcp(w));

const baseEnvironments = await database.find<Environment>(environment.type, {
parentId: { $in: workspaces.map(w => w._id) },
parentId: { $in: workspacesWithoutMcp.map(w => w._id) },
});

const subEnvironments = await database.find<Environment>(environment.type, {
Expand All @@ -405,7 +407,7 @@ export async function exportAllData({ dirPath }: { dirPath: string }): Promise<v
const insomniaExportFolder = path.join(dirPath, `insomnia-export.${Date.now()}`);
await mkdir(insomniaExportFolder);

for (const workspace of workspaces) {
for (const workspace of workspacesWithoutMcp) {
await exportWorkspaceData({
workspace,
dirPath: insomniaExportFolder,
Expand Down Expand Up @@ -632,7 +634,7 @@ export const ImportExport: FC<Props> = ({ hideSettingsModal, onModalChange }) =>

const workspaceData = useWorkspaceLoaderData();
const activeWorkspaceName = workspaceData?.activeWorkspace.name;
const { workspaceCount, userSession } = useRootLoaderData()!;
const { workspaceCount, userSession, mcpWorkspaceCount } = useRootLoaderData()!;
const workspacesFetcher = useProjectListWorkspacesLoaderFetcher();
useEffect(() => {
const isIdleAndUninitialized = workspacesFetcher.state === 'idle' && !workspacesFetcher.data;
Expand All @@ -644,7 +646,11 @@ export const ImportExport: FC<Props> = ({ hideSettingsModal, onModalChange }) =>
}
}, [organizationId, projectId, workspacesFetcher]);
const projectLoaderData = workspacesFetcher?.data;
const workspacesForActiveProject = projectLoaderData?.files.map(w => w.workspace).filter(isNotNullOrUndefined) || [];
const workspacesForActiveProject =
projectLoaderData?.files
.map(w => w.workspace)
.filter(isNotNullOrUndefined)
.filter(w => !isMcp(w)) || [];
const activeProject = projectLoaderData?.activeProject;
const projectName = activeProject?.name ?? getProductName();
const projects = projectLoaderData?.projects || [];
Expand Down Expand Up @@ -710,7 +716,7 @@ export const ImportExport: FC<Props> = ({ hideSettingsModal, onModalChange }) =>
aria-label="Export all data"
>
<Icon icon="file-export" />
<span>Export all data {`(${workspaceCount} files)`}</span>
<span>Export all data {`(${workspaceCount - mcpWorkspaceCount} files)`}</span>
</Button>
);
}
Expand Down Expand Up @@ -778,7 +784,7 @@ export const ImportExport: FC<Props> = ({ hideSettingsModal, onModalChange }) =>
aria-label="Export all data"
>
<Icon icon="file-export" />
<span>Export all data {`(${workspaceCount} files)`}</span>
<span>Export all data {`(${workspaceCount - mcpWorkspaceCount} files)`}</span>
</Button>

<Button
Expand Down
Loading