mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-05-18 05:37:09 +02:00
b4a1c418bb
Add .oxfmtignore to skip generated bindings and wasm-pack output. Add npm format script, update DEVELOPMENT.md for Vite+ toolchain, and format all non-generated files with oxfmt. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
315 lines
9.9 KiB
TypeScript
315 lines
9.9 KiB
TypeScript
/* oxlint-disable no-explicit-any */
|
|
import type { PartialImportResources } from "@yaakapp/api";
|
|
import { convertId, convertTemplateSyntax, isJSObject } from "./common";
|
|
|
|
export function convertInsomniaV5(parsed: any) {
|
|
// Assert parsed is object
|
|
if (parsed == null || typeof parsed !== "object") {
|
|
return null;
|
|
}
|
|
|
|
if (!("collection" in parsed) || !Array.isArray(parsed.collection)) {
|
|
return null;
|
|
}
|
|
|
|
const resources: PartialImportResources = {
|
|
environments: [],
|
|
folders: [],
|
|
grpcRequests: [],
|
|
httpRequests: [],
|
|
websocketRequests: [],
|
|
workspaces: [],
|
|
};
|
|
|
|
// Import workspaces
|
|
const meta = ("meta" in parsed ? parsed.meta : {}) as Record<string, any>;
|
|
resources.workspaces.push({
|
|
id: convertId(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",
|
|
name: parsed.name,
|
|
description: meta.description || undefined,
|
|
...importHeaders(parsed),
|
|
...importAuthentication(parsed),
|
|
});
|
|
|
|
// Import environments
|
|
resources.environments.push(
|
|
importEnvironment(parsed.environments, meta.id, true),
|
|
...(parsed.environments.subEnvironments ?? []).map((r: any) => importEnvironment(r, meta.id)),
|
|
);
|
|
|
|
// Import folders
|
|
const nextFolder = (children: any[], parentId: string) => {
|
|
for (const child of children ?? []) {
|
|
if (!isJSObject(child)) continue;
|
|
|
|
if (Array.isArray(child.children)) {
|
|
const { folder, environment } = importFolder(child, meta.id, parentId);
|
|
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));
|
|
} else if (child.protoFileId) {
|
|
resources.grpcRequests.push(importGrpcRequest(child, meta.id, parentId));
|
|
} else if (child.url) {
|
|
resources.websocketRequests.push(importWebsocketRequest(child, meta.id, parentId));
|
|
}
|
|
}
|
|
};
|
|
|
|
// Import folders
|
|
nextFolder(parsed.collection ?? [], meta.id);
|
|
|
|
// Filter out any `null` values
|
|
resources.httpRequests = resources.httpRequests.filter(Boolean);
|
|
resources.grpcRequests = resources.grpcRequests.filter(Boolean);
|
|
resources.environments = resources.environments.filter(Boolean);
|
|
resources.workspaces = resources.workspaces.filter(Boolean);
|
|
|
|
return { resources: convertTemplateSyntax(resources) };
|
|
}
|
|
|
|
function importHttpRequest(
|
|
r: any,
|
|
workspaceId: string,
|
|
parentId: string,
|
|
): PartialImportResources["httpRequests"][0] {
|
|
const id = r.meta?.id ?? r._id;
|
|
const created = r.meta?.created ?? r.created;
|
|
const updated = r.meta?.modified ?? r.updated;
|
|
const sortKey = r.meta?.sortKey ?? r.sortKey;
|
|
|
|
let bodyType: string | null = null;
|
|
let body = {};
|
|
if (r.body?.mimeType === "application/octet-stream") {
|
|
bodyType = "binary";
|
|
body = { filePath: r.body.fileName ?? "" };
|
|
} else if (r.body?.mimeType === "application/x-www-form-urlencoded") {
|
|
bodyType = "application/x-www-form-urlencoded";
|
|
body = {
|
|
form: (r.body.params ?? []).map((p: any) => ({
|
|
enabled: !p.disabled,
|
|
name: p.name ?? "",
|
|
value: p.value ?? "",
|
|
})),
|
|
};
|
|
} else if (r.body?.mimeType === "multipart/form-data") {
|
|
bodyType = "multipart/form-data";
|
|
body = {
|
|
form: (r.body.params ?? []).map((p: any) => ({
|
|
enabled: !p.disabled,
|
|
name: p.name ?? "",
|
|
value: p.value ?? "",
|
|
file: p.fileName ?? null,
|
|
})),
|
|
};
|
|
} else if (r.body?.mimeType === "application/graphql") {
|
|
bodyType = "graphql";
|
|
body = { text: r.body.text ?? "" };
|
|
} else if (r.body?.mimeType === "application/json") {
|
|
bodyType = "application/json";
|
|
body = { text: r.body.text ?? "" };
|
|
}
|
|
|
|
return {
|
|
id: convertId(id),
|
|
workspaceId: convertId(workspaceId),
|
|
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
|
|
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
|
|
folderId: parentId === workspaceId ? null : convertId(parentId),
|
|
sortPriority: sortKey,
|
|
model: "http_request",
|
|
name: r.name,
|
|
description: r.meta?.description || undefined,
|
|
url: r.url,
|
|
urlParameters: (r.parameters ?? []).map((p: any) => ({
|
|
enabled: !p.disabled,
|
|
name: p.name ?? "",
|
|
value: p.value ?? "",
|
|
})),
|
|
body,
|
|
bodyType,
|
|
method: r.method,
|
|
...importHeaders(r),
|
|
...importAuthentication(r),
|
|
};
|
|
}
|
|
|
|
function importGrpcRequest(
|
|
r: any,
|
|
workspaceId: string,
|
|
parentId: string,
|
|
): PartialImportResources["grpcRequests"][0] {
|
|
const id = r.meta?.id ?? r._id;
|
|
const created = r.meta?.created ?? r.created;
|
|
const updated = r.meta?.modified ?? r.updated;
|
|
const sortKey = r.meta?.sortKey ?? r.sortKey;
|
|
|
|
const parts = r.protoMethodName.split("/").filter((p: any) => p !== "");
|
|
const service = parts[0] ?? null;
|
|
const method = parts[1] ?? null;
|
|
|
|
return {
|
|
model: "grpc_request",
|
|
id: convertId(id),
|
|
workspaceId: convertId(workspaceId),
|
|
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
|
|
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
|
|
folderId: parentId === workspaceId ? null : convertId(parentId),
|
|
sortPriority: sortKey,
|
|
name: r.name,
|
|
description: r.description || undefined,
|
|
url: r.url,
|
|
service,
|
|
method,
|
|
message: r.body?.text ?? "",
|
|
metadata: (r.metadata ?? [])
|
|
.map((h: any) => ({
|
|
enabled: !h.disabled,
|
|
name: h.name ?? "",
|
|
value: h.value ?? "",
|
|
}))
|
|
.filter(({ name, value }: any) => name !== "" || value !== ""),
|
|
};
|
|
}
|
|
|
|
function importWebsocketRequest(
|
|
r: any,
|
|
workspaceId: string,
|
|
parentId: string,
|
|
): PartialImportResources["websocketRequests"][0] {
|
|
const id = r.meta?.id ?? r._id;
|
|
const created = r.meta?.created ?? r.created;
|
|
const updated = r.meta?.modified ?? r.updated;
|
|
const sortKey = r.meta?.sortKey ?? r.sortKey;
|
|
|
|
return {
|
|
model: "websocket_request",
|
|
id: convertId(id),
|
|
workspaceId: convertId(workspaceId),
|
|
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
|
|
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
|
|
folderId: parentId === workspaceId ? null : convertId(parentId),
|
|
sortPriority: sortKey,
|
|
name: r.name,
|
|
description: r.description || undefined,
|
|
url: r.url,
|
|
message: r.body?.text ?? "",
|
|
...importHeaders(r),
|
|
...importAuthentication(r),
|
|
};
|
|
}
|
|
|
|
function importHeaders(obj: any) {
|
|
const headers = (obj.headers ?? [])
|
|
.map((h: any) => ({
|
|
enabled: !h.disabled,
|
|
name: h.name ?? "",
|
|
value: h.value ?? "",
|
|
}))
|
|
.filter(({ name, value }: any) => name !== "" || value !== "");
|
|
return { headers } as const;
|
|
}
|
|
|
|
function importAuthentication(obj: any) {
|
|
let authenticationType: string | null = null;
|
|
let authentication = {};
|
|
if (obj.authentication?.type === "bearer") {
|
|
authenticationType = "bearer";
|
|
authentication = {
|
|
token: obj.authentication.token,
|
|
};
|
|
} else if (obj.authentication?.type === "basic") {
|
|
authenticationType = "basic";
|
|
authentication = {
|
|
username: obj.authentication.username,
|
|
password: obj.authentication.password,
|
|
};
|
|
}
|
|
|
|
return { authenticationType, authentication } as const;
|
|
}
|
|
|
|
function importFolder(
|
|
f: any,
|
|
workspaceId: string,
|
|
parentId: string,
|
|
): {
|
|
folder: PartialImportResources["folders"][0];
|
|
environment: PartialImportResources["environments"][0] | null;
|
|
} {
|
|
const id = f.meta?.id ?? f._id;
|
|
const created = f.meta?.created ?? f.created;
|
|
const updated = f.meta?.modified ?? f.updated;
|
|
const sortKey = f.meta?.sortKey ?? f.sortKey;
|
|
|
|
let environment: PartialImportResources["environments"][0] | null = null;
|
|
if (Object.keys(f.environment ?? {}).length > 0) {
|
|
environment = {
|
|
id: convertId(`${id}folder`),
|
|
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
|
|
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
|
|
workspaceId: convertId(workspaceId),
|
|
public: true,
|
|
parentModel: "folder",
|
|
parentId: convertId(id),
|
|
model: "environment",
|
|
name: "Folder Environment",
|
|
variables: Object.entries(f.environment ?? {}).map(([name, value]) => ({
|
|
enabled: true,
|
|
name,
|
|
value: String(value),
|
|
})),
|
|
};
|
|
}
|
|
|
|
return {
|
|
folder: {
|
|
model: "folder",
|
|
id: convertId(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),
|
|
sortPriority: sortKey,
|
|
workspaceId: convertId(workspaceId),
|
|
description: f.description || undefined,
|
|
name: f.name,
|
|
...importAuthentication(f),
|
|
...importHeaders(f),
|
|
},
|
|
environment,
|
|
};
|
|
}
|
|
|
|
function importEnvironment(
|
|
e: any,
|
|
workspaceId: string,
|
|
isParent?: boolean,
|
|
): PartialImportResources["environments"][0] {
|
|
const id = e.meta?.id ?? e._id;
|
|
const created = e.meta?.created ?? e.created;
|
|
const updated = e.meta?.modified ?? e.updated;
|
|
const sortKey = e.meta?.sortKey ?? e.sortKey;
|
|
|
|
return {
|
|
id: convertId(id),
|
|
createdAt: created ? new Date(created).toISOString().replace("Z", "") : undefined,
|
|
updatedAt: updated ? new Date(updated).toISOString().replace("Z", "") : undefined,
|
|
workspaceId: convertId(workspaceId),
|
|
public: !e.isPrivate,
|
|
sortPriority: sortKey,
|
|
parentModel: isParent ? "workspace" : "environment",
|
|
parentId: null,
|
|
model: "environment",
|
|
name: e.name,
|
|
variables: Object.entries(e.data ?? {}).map(([name, value]) => ({
|
|
enabled: true,
|
|
name,
|
|
value: String(value),
|
|
})),
|
|
};
|
|
}
|