mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-03-18 07:24:07 +01:00
1 line
15 KiB
Plaintext
1 line
15 KiB
Plaintext
{"version":3,"file":"index.mjs","sources":["../../../plugins/importer-insomnia/src/index.ts"],"sourcesContent":["import {\n Environment,\n Folder,\n GrpcRequest,\n HttpRequest,\n Workspace,\n} from '../../../src-web/lib/models';\nimport '../../../src-web/plugin/runtime.d.ts';\n\ntype AtLeast<T, K extends keyof T> = Partial<T> & Pick<T, K>;\n\nexport interface ExportResources {\n workspaces: AtLeast<Workspace, 'name' | 'id' | 'model'>[];\n environments: AtLeast<Environment, 'name' | 'id' | 'model' | 'workspaceId'>[];\n httpRequests: AtLeast<HttpRequest, 'name' | 'id' | 'model' | 'workspaceId'>[];\n grpcRequests: AtLeast<GrpcRequest, 'name' | 'id' | 'model' | 'workspaceId'>[];\n folders: AtLeast<Folder, 'name' | 'id' | 'model' | 'workspaceId'>[];\n}\n\nexport function pluginHookImport(ctx: YaakContext, contents: string) {\n let parsed: any;\n\n try {\n parsed = JSON.parse(contents);\n } catch (e) {}\n\n try {\n parsed = parsed ?? YAML.parse(contents);\n } catch (e) {\n console.log('FAILED', e);\n }\n\n if (!isJSObject(parsed)) return;\n if (!Array.isArray(parsed.resources)) return;\n\n const resources: ExportResources = {\n workspaces: [],\n httpRequests: [],\n grpcRequests: [],\n environments: [],\n folders: [],\n };\n\n // Import workspaces\n const workspacesToImport = parsed.resources.filter(isWorkspace);\n for (const workspaceToImport of workspacesToImport) {\n const baseEnvironment = parsed.resources.find(\n (r: any) => isEnvironment(r) && r.parentId === workspaceToImport._id,\n );\n resources.workspaces.push({\n id: convertId(workspaceToImport._id),\n createdAt: new Date(workspacesToImport.created ?? Date.now()).toISOString().replace('Z', ''),\n updatedAt: new Date(workspacesToImport.updated ?? Date.now()).toISOString().replace('Z', ''),\n model: 'workspace',\n name: workspaceToImport.name,\n variables: baseEnvironment ? parseVariables(baseEnvironment.data) : [],\n });\n const environmentsToImport = parsed.resources.filter(\n (r: any) => isEnvironment(r) && r.parentId === baseEnvironment?._id,\n );\n resources.environments.push(\n ...environmentsToImport.map((r: any) => importEnvironment(r, workspaceToImport._id)),\n );\n\n const nextFolder = (parentId: string) => {\n const children = parsed.resources.filter((r: any) => r.parentId === parentId);\n let sortPriority = 0;\n for (const child of children) {\n if (isRequestGroup(child)) {\n resources.folders.push(importFolder(child, workspaceToImport._id));\n nextFolder(child._id);\n } else if (isHttpRequest(child)) {\n resources.httpRequests.push(\n importHttpRequest(child, workspaceToImport._id, sortPriority++),\n );\n } else if (isGrpcRequest(child)) {\n resources.grpcRequests.push(\n importGrpcRequest(child, workspaceToImport._id, sortPriority++),\n );\n }\n }\n };\n\n // Import folders\n nextFolder(workspaceToImport._id);\n }\n\n // Filter out any `null` values\n resources.httpRequests = resources.httpRequests.filter(Boolean);\n resources.grpcRequests = resources.grpcRequests.filter(Boolean);\n resources.environments = resources.environments.filter(Boolean);\n resources.workspaces = resources.workspaces.filter(Boolean);\n\n return { resources };\n}\n\nfunction importEnvironment(e: any, workspaceId: string): ExportResources['environments'][0] {\n return {\n id: convertId(e._id),\n createdAt: new Date(e.created ?? Date.now()).toISOString().replace('Z', ''),\n updatedAt: new Date(e.updated ?? Date.now()).toISOString().replace('Z', ''),\n workspaceId: convertId(workspaceId),\n model: 'environment',\n name: e.name,\n variables: Object.entries(e.data).map(([name, value]) => ({\n enabled: true,\n name,\n value: `${value}`,\n })),\n };\n}\n\nfunction importFolder(f: any, workspaceId: string): ExportResources['folders'][0] {\n return {\n id: convertId(f._id),\n createdAt: new Date(f.created ?? Date.now()).toISOString().replace('Z', ''),\n updatedAt: new Date(f.updated ?? Date.now()).toISOString().replace('Z', ''),\n folderId: f.parentId === workspaceId ? null : convertId(f.parentId),\n workspaceId: convertId(workspaceId),\n model: 'folder',\n name: f.name,\n };\n}\n\nfunction importGrpcRequest(\n r: any,\n workspaceId: string,\n sortPriority = 0,\n): ExportResources['grpcRequests'][0] {\n const parts = r.protoMethodName.split('/').filter((p: any) => p !== '');\n const service = parts[0] ?? null;\n const method = parts[1] ?? null;\n\n return {\n id: convertId(r._id),\n createdAt: new Date(r.created ?? Date.now()).toISOString().replace('Z', ''),\n updatedAt: new Date(r.updated ?? Date.now()).toISOString().replace('Z', ''),\n workspaceId: convertId(workspaceId),\n folderId: r.parentId === workspaceId ? null : convertId(r.parentId),\n model: 'grpc_request',\n sortPriority,\n name: r.name,\n url: convertSyntax(r.url),\n service,\n method,\n message: r.body?.text ?? '',\n metadata: (r.metadata ?? [])\n .map((h: any) => ({\n enabled: !h.disabled,\n name: h.name ?? '',\n value: h.value ?? '',\n }))\n .filter(({ name, value }: any) => name !== '' || value !== ''),\n };\n}\n\nfunction importHttpRequest(\n r: any,\n workspaceId: string,\n sortPriority = 0,\n): ExportResources['httpRequests'][0] {\n let bodyType = null;\n let body = {};\n if (r.body.mimeType === 'application/octet-stream') {\n bodyType = 'binary';\n body = { filePath: r.body.fileName ?? '' };\n } else if (r.body?.mimeType === 'application/x-www-form-urlencoded') {\n bodyType = 'application/x-www-form-urlencoded';\n body = {\n form: (r.body.params ?? []).map((p: any) => ({\n enabled: !p.disabled,\n name: p.name ?? '',\n value: p.value ?? '',\n })),\n };\n } else if (r.body?.mimeType === 'multipart/form-data') {\n bodyType = 'multipart/form-data';\n body = {\n form: (r.body.params ?? []).map((p: any) => ({\n enabled: !p.disabled,\n name: p.name ?? '',\n value: p.value ?? '',\n file: p.fileName ?? null,\n })),\n };\n } else if (r.body?.mimeType === 'application/graphql') {\n bodyType = 'graphql';\n body = { text: convertSyntax(r.body.text ?? '') };\n } else if (r.body?.mimeType === 'application/json') {\n bodyType = 'application/json';\n body = { text: convertSyntax(r.body.text ?? '') };\n }\n\n let authenticationType = null;\n let authentication = {};\n if (r.authentication.type === 'bearer') {\n authenticationType = 'bearer';\n authentication = {\n token: convertSyntax(r.authentication.token),\n };\n } else if (r.authentication.type === 'basic') {\n authenticationType = 'basic';\n authentication = {\n username: convertSyntax(r.authentication.username),\n password: convertSyntax(r.authentication.password),\n };\n }\n\n return {\n id: convertId(r._id),\n createdAt: new Date(r.created ?? Date.now()).toISOString().replace('Z', ''),\n updatedAt: new Date(r.updated ?? Date.now()).toISOString().replace('Z', ''),\n workspaceId: convertId(workspaceId),\n folderId: r.parentId === workspaceId ? null : convertId(r.parentId),\n model: 'http_request',\n sortPriority,\n name: r.name,\n url: convertSyntax(r.url),\n body,\n bodyType,\n authentication,\n authenticationType,\n method: r.method,\n headers: (r.headers ?? [])\n .map((h: any) => ({\n enabled: !h.disabled,\n name: h.name ?? '',\n value: h.value ?? '',\n }))\n .filter(({ name, value }: any) => name !== '' || value !== ''),\n };\n}\n\nfunction parseVariables(data: Record<string, string>) {\n return Object.entries(data).map(([name, value]) => ({\n enabled: true,\n name,\n value: `${value}`,\n }));\n}\n\nfunction convertSyntax(variable: string): string {\n if (!isJSString(variable)) return variable;\n return variable.replaceAll(/{{\\s*(_\\.)?([^}]+)\\s*}}/g, '${[$2]}');\n}\n\nfunction isWorkspace(obj: any) {\n return isJSObject(obj) && obj._type === 'workspace';\n}\n\nfunction isRequestGroup(obj: any) {\n return isJSObject(obj) && obj._type === 'request_group';\n}\n\nfunction isHttpRequest(obj: any) {\n return isJSObject(obj) && obj._type === 'request';\n}\n\nfunction isGrpcRequest(obj: any) {\n return isJSObject(obj) && obj._type === 'grpc_request';\n}\n\nfunction isEnvironment(obj: any) {\n return isJSObject(obj) && obj._type === 'environment';\n}\n\nfunction isJSObject(obj: any) {\n return Object.prototype.toString.call(obj) === '[object Object]';\n}\n\nfunction isJSString(obj: any) {\n return Object.prototype.toString.call(obj) === '[object String]';\n}\n\nfunction convertId(id: string): string {\n if (id.startsWith('GENERATE_ID::')) {\n return id;\n }\n return `GENERATE_ID::${id}`;\n}\n"],"names":["pluginHookImport","ctx","contents","parsed","e","isJSObject","resources","workspacesToImport","isWorkspace","workspaceToImport","baseEnvironment","r","isEnvironment","convertId","parseVariables","environmentsToImport","importEnvironment","nextFolder","parentId","children","sortPriority","child","isRequestGroup","importFolder","isHttpRequest","importHttpRequest","isGrpcRequest","importGrpcRequest","workspaceId","name","value","f","_a","parts","p","service","method","convertSyntax","h","_b","_c","_d","bodyType","body","authenticationType","authentication","data","variable","isJSString","obj","id"],"mappings":"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"} |