mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-03-26 19:31:12 +01:00
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>
100 lines
3.3 KiB
TypeScript
100 lines
3.3 KiB
TypeScript
import type { PluginDefinition } from "@yaakapp/api";
|
|
|
|
export const plugin: PluginDefinition = {
|
|
folderActions: [
|
|
{
|
|
label: "Send All",
|
|
icon: "send_horizontal",
|
|
async onSelect(ctx, args) {
|
|
const targetFolder = args.folder;
|
|
|
|
// Get all folders and HTTP requests
|
|
const [allFolders, allRequests] = await Promise.all([
|
|
ctx.folder.list(),
|
|
ctx.httpRequest.list(),
|
|
]);
|
|
|
|
// Build the send order to match tree ordering:
|
|
// sort siblings by sortPriority then updatedAt, and traverse folders depth-first.
|
|
const compareByOrder = (
|
|
a: Pick<(typeof allFolders)[number], "sortPriority" | "updatedAt">,
|
|
b: Pick<(typeof allFolders)[number], "sortPriority" | "updatedAt">,
|
|
) => {
|
|
if (a.sortPriority === b.sortPriority) {
|
|
return a.updatedAt > b.updatedAt ? 1 : -1;
|
|
}
|
|
return a.sortPriority - b.sortPriority;
|
|
};
|
|
|
|
const childrenByFolderId = new Map<
|
|
string,
|
|
Array<(typeof allFolders)[number] | (typeof allRequests)[number]>
|
|
>();
|
|
for (const folder of allFolders) {
|
|
if (folder.folderId == null) continue;
|
|
const children = childrenByFolderId.get(folder.folderId) ?? [];
|
|
children.push(folder);
|
|
childrenByFolderId.set(folder.folderId, children);
|
|
}
|
|
for (const request of allRequests) {
|
|
if (request.folderId == null) continue;
|
|
const children = childrenByFolderId.get(request.folderId) ?? [];
|
|
children.push(request);
|
|
childrenByFolderId.set(request.folderId, children);
|
|
}
|
|
|
|
const requestsToSend: typeof allRequests = [];
|
|
const collectRequests = (folderId: string) => {
|
|
const children = (childrenByFolderId.get(folderId) ?? []).slice().sort(compareByOrder);
|
|
for (const child of children) {
|
|
if (child.model === "folder") {
|
|
collectRequests(child.id);
|
|
} else if (child.model === "http_request") {
|
|
requestsToSend.push(child);
|
|
}
|
|
}
|
|
};
|
|
collectRequests(targetFolder.id);
|
|
|
|
if (requestsToSend.length === 0) {
|
|
await ctx.toast.show({
|
|
message: "No requests in folder",
|
|
icon: "info",
|
|
color: "info",
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Send requests sequentially in the calculated folder order.
|
|
let successCount = 0;
|
|
let errorCount = 0;
|
|
|
|
for (const request of requestsToSend) {
|
|
try {
|
|
await ctx.httpRequest.send({ httpRequest: request });
|
|
successCount++;
|
|
} catch (error) {
|
|
errorCount++;
|
|
console.error(`Failed to send request ${request.id}:`, error);
|
|
}
|
|
}
|
|
|
|
// Show summary toast
|
|
if (errorCount === 0) {
|
|
await ctx.toast.show({
|
|
message: `Sent ${successCount} request${successCount !== 1 ? "s" : ""}`,
|
|
icon: "send_horizontal",
|
|
color: "success",
|
|
});
|
|
} else {
|
|
await ctx.toast.show({
|
|
message: `Sent ${successCount}, failed ${errorCount}`,
|
|
icon: "alert_triangle",
|
|
color: "warning",
|
|
});
|
|
}
|
|
},
|
|
},
|
|
],
|
|
};
|