feat(import): add stable per-resource source keys to the importer contract (#614)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Gregory Schier
2026-09-01 08:11:54 -07:00
committed by GitHub
co-authored by Claude Opus 5
parent e63a87718c
commit 81a2a5d955
28 changed files with 785 additions and 49 deletions
+24 -14
View File
@@ -3,9 +3,11 @@ import type { PartialImportResources } from "@yaakapp/api";
import {
convertId,
convertTemplateSyntax,
createSourceKeys,
importHeaders,
importHttpBodyAndHeaders,
isJSObject,
type SourceKeys,
} from "./common";
export function convertInsomniaV5(parsed: any) {
@@ -18,6 +20,7 @@ export function convertInsomniaV5(parsed: any) {
return null;
}
const keys = createSourceKeys();
const resources: PartialImportResources = {
environments: [],
folders: [],
@@ -30,7 +33,7 @@ export function convertInsomniaV5(parsed: any) {
// Import workspaces
const meta = ("meta" in parsed ? parsed.meta : {}) as Record<string, any>;
resources.workspaces.push({
id: convertId(meta.id ?? "collection"),
id: keys.own(meta.id ?? "collection"),
createdAt: meta.created ? new Date(meta.created).toISOString().replace("Z", "") : undefined,
updatedAt: meta.modified ? new Date(meta.modified).toISOString().replace("Z", "") : undefined,
model: "workspace",
@@ -42,8 +45,10 @@ export function convertInsomniaV5(parsed: any) {
// Import environments
resources.environments.push(
importEnvironment(parsed.environments, meta.id, true),
...(parsed.environments.subEnvironments ?? []).map((r: any) => importEnvironment(r, meta.id)),
importEnvironment(parsed.environments, meta.id, keys, true),
...(parsed.environments.subEnvironments ?? []).map((r: any) =>
importEnvironment(r, meta.id, keys),
),
);
// Import folders
@@ -52,16 +57,16 @@ export function convertInsomniaV5(parsed: any) {
if (!isJSObject(child)) continue;
if (Array.isArray(child.children)) {
const { folder, environment } = importFolder(child, meta.id, parentId);
const { folder, environment } = importFolder(child, meta.id, parentId, keys);
resources.folders.push(folder);
if (environment) resources.environments.push(environment);
nextFolder(child.children, child.meta.id);
} else if (child.method) {
resources.httpRequests.push(importHttpRequest(child, meta.id, parentId));
resources.httpRequests.push(importHttpRequest(child, meta.id, parentId, keys));
} else if (child.protoFileId) {
resources.grpcRequests.push(importGrpcRequest(child, meta.id, parentId));
resources.grpcRequests.push(importGrpcRequest(child, meta.id, parentId, keys));
} else if (child.url) {
resources.websocketRequests.push(importWebsocketRequest(child, meta.id, parentId));
resources.websocketRequests.push(importWebsocketRequest(child, meta.id, parentId, keys));
}
}
};
@@ -75,13 +80,14 @@ export function convertInsomniaV5(parsed: any) {
resources.environments = resources.environments.filter(Boolean);
resources.workspaces = resources.workspaces.filter(Boolean);
return { resources: convertTemplateSyntax(resources) };
return { resources: convertTemplateSyntax(resources), sourceKeys: keys.all() };
}
function importHttpRequest(
r: any,
workspaceId: string,
parentId: string,
keys: SourceKeys,
): PartialImportResources["httpRequests"][0] {
const id = r.meta?.id ?? r._id;
const created = r.meta?.created ?? r.created;
@@ -89,7 +95,7 @@ function importHttpRequest(
const sortKey = r.meta?.sortKey ?? r.sortKey;
return {
id: convertId(id),
id: keys.own(id),
workspaceId: convertId(workspaceId),
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
@@ -114,6 +120,7 @@ function importGrpcRequest(
r: any,
workspaceId: string,
parentId: string,
keys: SourceKeys,
): PartialImportResources["grpcRequests"][0] {
const id = r.meta?.id ?? r._id;
const created = r.meta?.created ?? r.created;
@@ -126,7 +133,7 @@ function importGrpcRequest(
return {
model: "grpc_request",
id: convertId(id),
id: keys.own(id),
workspaceId: convertId(workspaceId),
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
@@ -152,6 +159,7 @@ function importWebsocketRequest(
r: any,
workspaceId: string,
parentId: string,
keys: SourceKeys,
): PartialImportResources["websocketRequests"][0] {
const id = r.meta?.id ?? r._id;
const created = r.meta?.created ?? r.created;
@@ -160,7 +168,7 @@ function importWebsocketRequest(
return {
model: "websocket_request",
id: convertId(id),
id: keys.own(id),
workspaceId: convertId(workspaceId),
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
@@ -198,6 +206,7 @@ function importFolder(
f: any,
workspaceId: string,
parentId: string,
keys: SourceKeys,
): {
folder: PartialImportResources["folders"][0];
environment: PartialImportResources["environments"][0] | null;
@@ -210,7 +219,7 @@ function importFolder(
let environment: PartialImportResources["environments"][0] | null = null;
if (Object.keys(f.environment ?? {}).length > 0) {
environment = {
id: convertId(`${id}folder`),
id: keys.own(`${id}folder`),
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
workspaceId: convertId(workspaceId),
@@ -230,7 +239,7 @@ function importFolder(
return {
folder: {
model: "folder",
id: convertId(id),
id: keys.own(id),
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
folderId: parentId === workspaceId ? null : convertId(parentId),
@@ -248,6 +257,7 @@ function importFolder(
function importEnvironment(
e: any,
workspaceId: string,
keys: SourceKeys,
isParent?: boolean,
): PartialImportResources["environments"][0] {
const id = e.meta?.id ?? e._id;
@@ -256,7 +266,7 @@ function importEnvironment(
const sortKey = e.meta?.sortKey ?? e.sortKey;
return {
id: convertId(id),
id: keys.own(id),
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
workspaceId: convertId(workspaceId),