Skip to content

Commit b9239e2

Browse files
authored
fix: oas should import requests where possible (Kong#9632)
* first pass * support v5 import too * mark oas correctly
1 parent 8834ff5 commit b9239e2

File tree

3 files changed

+69
-92
lines changed

3 files changed

+69
-92
lines changed

packages/insomnia-smoke-test/tests/smoke/command-palette.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ test('Command palette - can switch between requests and workspaces', async ({ ap
4242
await page.getByPlaceholder('Search and switch between').press('ArrowUp');
4343
await page.getByPlaceholder('Search and switch between').press('ArrowUp');
4444
await page.getByPlaceholder('Search and switch between').press('ArrowUp');
45+
await page.getByPlaceholder('Search and switch between').press('ArrowUp');
4546
await page.getByPlaceholder('Search and switch between').press('Enter');
4647
await expect
4748
.soft(page.getByTestId('workspace-context-dropdown').locator('span'))

packages/insomnia/src/common/import.ts

Lines changed: 68 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,12 @@ export async function scanResources(importEntries: ImportEntry[]): Promise<ScanR
173173
let v5Error = null;
174174

175175
try {
176-
const { data: insomnia5Import, error } = tryImportV5Data(contentStr);
177-
v5Error = error;
176+
let insomnia5Import: ExportedModel[] = [];
177+
if (contentStr.startsWith('type: ')) {
178+
const { data, error } = tryImportV5Data(contentStr);
179+
insomnia5Import = data as ExportedModel[];
180+
v5Error = error;
181+
}
178182
if (insomnia5Import.length > 0) {
179183
result = {
180184
type: {
@@ -183,7 +187,6 @@ export async function scanResources(importEntries: ImportEntry[]): Promise<ScanR
183187
description: 'Insomnia v5',
184188
},
185189
data: {
186-
// @ts-expect-error -- TSCONVERSION
187190
resources: insomnia5Import,
188191
},
189192
};
@@ -234,6 +237,7 @@ export async function scanResources(importEntries: ImportEntry[]): Promise<ScanR
234237
});
235238

236239
const requests = resources.filter(isRequest);
240+
const requestGroups = resources.filter(isRequestGroup);
237241
const websocketRequests = resources.filter(isWebSocketRequest);
238242
const grpcRequests = resources.filter(isGrpcRequest);
239243
const socketIoRequests = resources.filter(isSocketIORequest);
@@ -251,6 +255,7 @@ export async function scanResources(importEntries: ImportEntry[]): Promise<ScanR
251255
unitTests,
252256
unitTestSuites,
253257
requests: [...requests, ...websocketRequests, ...grpcRequests, ...socketIoRequests],
258+
requestGroups,
254259
workspaces,
255260
environments,
256261
apiSpecs,
@@ -598,21 +603,14 @@ export const importResourcesToNewWorkspace = async ({
598603
const resources = resourceCacheItem.resources;
599604
const ResourceIdMap = new Map();
600605
let newWorkspace: Workspace;
601-
// in order to support import from api spec yaml
602-
if (resourceCacheItem?.importer?.id && isApiSpecImport(resourceCacheItem.importer)) {
606+
// support import from both insomnia export and api spec yaml
607+
if (resources.find(isApiSpec) || isApiSpecImport(resourceCacheItem.importer)) {
603608
newWorkspace = await models.workspace.create({
604609
name: workspaceToImport?.name,
605610
scope: 'design',
606611
parentId: projectId,
607612
});
608613

609-
if (isGitProject(project)) {
610-
const workspaceMeta = await models.workspaceMeta.getOrCreateByParentId(newWorkspace._id);
611-
await models.workspaceMeta.update(workspaceMeta, {
612-
gitFilePath: `${newWorkspace.name}-${newWorkspace._id}.yaml`,
613-
});
614-
}
615-
616614
await models.apiSpec.updateOrCreateForParentId(newWorkspace._id, {
617615
contents: resourceCacheItem.content as string | undefined,
618616
contentType: 'yaml',
@@ -624,95 +622,81 @@ export const importResourcesToNewWorkspace = async ({
624622
scope: workspaceToImport?.scope || 'collection',
625623
parentId: projectId,
626624
});
625+
}
627626

628-
if (isGitProject(project)) {
629-
const workspaceMeta = await models.workspaceMeta.getOrCreateByParentId(newWorkspace._id);
630-
await models.workspaceMeta.update(workspaceMeta, {
631-
gitFilePath: `${newWorkspace.name}-${newWorkspace._id}.yaml`,
632-
});
633-
}
634-
635-
const apiSpec = resources.find(r => r.type === 'ApiSpec' && r.parentId === workspaceToImport?._id) as ApiSpec;
636-
const hasApiSpec = newWorkspace.scope === 'design' && isApiSpec(apiSpec);
637-
// if workspace is not in the resources, there will be no apiSpec, if resource type is set to api spec this could cause a bug
638-
if (hasApiSpec) {
639-
// TODO: will overwrite existing api spec, not needed after migrate hack is removed
640-
await models.apiSpec.updateOrCreateForParentId(newWorkspace._id, {
641-
contents: apiSpec.contents,
642-
contentType: apiSpec.contentType,
643-
fileName: workspaceToImport?.name,
644-
});
645-
}
646-
647-
// If we're importing into a new workspace
648-
// Map new IDs
649-
ResourceIdMap.set('__WORKSPACE_ID__', newWorkspace._id);
650-
workspaceToImport && ResourceIdMap.set(workspaceToImport._id, newWorkspace._id);
627+
// If we're importing into a new workspace
628+
// Map new IDs
629+
ResourceIdMap.set('__WORKSPACE_ID__', newWorkspace._id);
630+
workspaceToImport && ResourceIdMap.set(workspaceToImport._id, newWorkspace._id);
651631

652-
const resourcesWithoutWorkspaceAndApiSpec = resources.filter(
653-
resource => !isWorkspace(resource) && !isApiSpec(resource),
654-
);
632+
const resourcesWithoutWorkspaceAndApiSpec = resources.filter(
633+
resource => !isWorkspace(resource) && !isApiSpec(resource),
634+
);
655635

656-
for (const resource of resourcesWithoutWorkspaceAndApiSpec) {
657-
const model = getModel(resource.type);
658-
model && ResourceIdMap.set(resource._id, generateId(model.prefix));
659-
}
636+
for (const resource of resourcesWithoutWorkspaceAndApiSpec) {
637+
const model = getModel(resource.type);
638+
model && ResourceIdMap.set(resource._id, generateId(model.prefix));
639+
}
660640

661-
for (const resource of resourcesWithoutWorkspaceAndApiSpec) {
662-
const model = getModel(resource.type);
641+
for (const resource of resourcesWithoutWorkspaceAndApiSpec) {
642+
const model = getModel(resource.type);
663643

664-
if (model) {
665-
const newParentId = ResourceIdMap.get(resource.parentId);
666-
if (!newParentId) {
667-
console.warn(`Could not find new parent id for ${resource.name} ${resource._id}`);
668-
continue;
669-
}
670-
if (isGrpcRequest(resource)) {
671-
await models.grpcRequest.create({
672-
...resource,
673-
_id: ResourceIdMap.get(resource._id),
674-
protoFileId: ResourceIdMap.get(resource.protoFileId),
675-
parentId: newParentId,
676-
});
677-
} else if (isUnitTest(resource)) {
678-
await models.unitTest.create({
679-
...resource,
680-
_id: ResourceIdMap.get(resource._id),
681-
requestId: ResourceIdMap.get(resource.requestId),
682-
parentId: newParentId,
683-
});
684-
} else if (isRequest(resource)) {
685-
await models.request.create(importRequestWithNewIds(resource, ResourceIdMap));
686-
} else {
687-
await db.docCreate(model.type, {
688-
...resource,
689-
_id: ResourceIdMap.get(resource._id),
690-
parentId: newParentId,
691-
});
692-
}
644+
if (model) {
645+
const newParentId = ResourceIdMap.get(resource.parentId);
646+
if (!newParentId) {
647+
console.warn(`Could not find new parent id for ${resource.name} ${resource._id}`);
648+
continue;
649+
}
650+
if (isGrpcRequest(resource)) {
651+
await models.grpcRequest.create({
652+
...resource,
653+
_id: ResourceIdMap.get(resource._id),
654+
protoFileId: ResourceIdMap.get(resource.protoFileId),
655+
parentId: newParentId,
656+
});
657+
} else if (isUnitTest(resource)) {
658+
await models.unitTest.create({
659+
...resource,
660+
_id: ResourceIdMap.get(resource._id),
661+
requestId: ResourceIdMap.get(resource.requestId),
662+
parentId: newParentId,
663+
});
664+
} else if (isRequest(resource)) {
665+
await models.request.create(importRequestWithNewIds(resource, ResourceIdMap));
666+
} else {
667+
await db.docCreate(model.type, {
668+
...resource,
669+
_id: ResourceIdMap.get(resource._id),
670+
parentId: newParentId,
671+
});
693672
}
694673
}
674+
}
695675

696-
// Use the first sub environment as the active one
697-
const subEnvironments = resources.filter(isEnvironment).filter(isSubEnvironmentResource) || [];
676+
// Use the first sub environment as the active one
677+
const subEnvironments = resources.filter(isEnvironment).filter(isSubEnvironmentResource) || [];
698678

699-
if (subEnvironments.length > 0) {
700-
const firstSubEnvironment = subEnvironments[0];
679+
if (subEnvironments.length > 0) {
680+
const firstSubEnvironment = subEnvironments[0];
701681

702-
if (firstSubEnvironment) {
703-
const workspaceMeta = await models.workspaceMeta.getOrCreateByParentId(newWorkspace._id);
682+
if (firstSubEnvironment) {
683+
const workspaceMeta = await models.workspaceMeta.getOrCreateByParentId(newWorkspace._id);
704684

705-
await models.workspaceMeta.update(workspaceMeta, {
706-
activeEnvironmentId: ResourceIdMap.get(firstSubEnvironment._id),
707-
});
708-
}
685+
await models.workspaceMeta.update(workspaceMeta, {
686+
activeEnvironmentId: ResourceIdMap.get(firstSubEnvironment._id),
687+
});
709688
}
710689
}
711690

712691
// Make sure the new workspace has required resources like base environment, cookie jar and workspaceMeta
713692
await models.environment.getOrCreateForParentId(newWorkspace._id);
714-
await models.workspaceMeta.getOrCreateByParentId(newWorkspace._id);
693+
const workspaceMeta = await models.workspaceMeta.getOrCreateByParentId(newWorkspace._id);
715694

695+
if (isGitProject(project)) {
696+
await models.workspaceMeta.update(workspaceMeta, {
697+
gitFilePath: `${newWorkspace.name}-${newWorkspace._id}.yaml`,
698+
});
699+
}
716700
// we sync the new workspace to the cloud in workspaceLoader when user enters the workspace
717701
// since we won't navigate to the workspace automatically after import
718702
// here we push to the cloud programmatically

packages/insomnia/src/routes/import.scan.tsx

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,6 @@ export const scanImportResources = async (data: {
4646
contentList.push({
4747
contentStr: curl,
4848
});
49-
// const { data } = await window.main.parseImport(
50-
// {
51-
// contentStr: curl || '',
52-
// },
53-
// {
54-
// importerId: 'curl',
55-
// },
56-
// );
5749
} else if (source === 'file') {
5850
let filePaths: string[];
5951
try {

0 commit comments

Comments
 (0)