Implement an event callback + Obsidian notifications on the publishing status

This commit is contained in:
2026-08-09 14:57:04 -04:00
parent e4117a3d28
commit c31e7323b8
3 changed files with 42 additions and 4 deletions

View File

@@ -54,7 +54,16 @@ export default class JekyllPublishPlugin extends Plugin {
{ noteText, ...r },
this.settings,
git,
(linktext) => this.resolveImage(linktext)
(linktext) => this.resolveImage(linktext),
(event) => {
if (event === 'beforeClone') {
new Notice("Jekyll Publish: cloning");
} else if (event === 'beforeWrite') {
new Notice("Jekyll Publish: writing contents");
} else if (event === 'beforePush') {
new Notice("Jekyll Publish: pushing contents");
}
}
);
const warn = result.unresolved.length
? ` (${result.unresolved.length} image(s) unresolved)`

View File

@@ -1,4 +1,4 @@
import { expect, test, vi } from "vitest";
import { expect, test, vi, vitest } from "vitest";
import { publish } from "./publish";
import { DEFAULT_SETTINGS } from "./settings";
import type { GitClient, GitFile } from "./git";
@@ -63,3 +63,27 @@ test("throws when remoteUrl is empty", async () => {
),
).rejects.toThrow(/remote/i);
});
test("calls all the events", async () => {
const { git } = fakeGit();
const listener = vitest.fn();
await publish(
{
noteText: "---\nlayout: post\n---\n\n![[shot.png]]\nbody",
frontmatterPairs: [{ key: "layout", value: "post" }],
slug: "my-post",
date: "2026-06-19",
strategy: "flat-slug",
commitMessage: "Publish: My Post",
},
{ ...DEFAULT_SETTINGS, remoteUrl: "ssh://x/y.git" },
git,
async () => Buffer.from([9]),
listener
);
expect(listener).toHaveBeenCalledWith('beforeClone');
expect(listener).toHaveBeenCalledWith('beforeWrite');
expect(listener).toHaveBeenCalledWith('beforePush');
});

View File

@@ -15,6 +15,7 @@ export interface PublishInput {
}
export type ImageResolver = (linktext: string) => Promise<Buffer | null>;
export type PublishEventsListener = (on: 'beforeClone' | 'beforeWrite' | 'beforePush') => void;
export interface PublishResult {
postPath: string;
@@ -26,7 +27,8 @@ export async function publish(
input: PublishInput,
settings: JekyllPublishSettings,
git: GitClient,
resolveImage: ImageResolver
imageResolver: ImageResolver,
onProgress?: PublishEventsListener
): Promise<PublishResult> {
if (!settings.remoteUrl.trim()) throw new Error("No git remote URL configured");
@@ -37,7 +39,7 @@ export async function publish(
const unresolved: string[] = [];
for (const ref of refs) {
if (resolved.some((r) => r.linktext === ref.linktext)) continue;
const data = await resolveImage(ref.linktext);
const data = await imageResolver(ref.linktext);
if (data) resolved.push({ linktext: ref.linktext, data });
else unresolved.push(ref.linktext);
}
@@ -59,8 +61,11 @@ export async function publish(
files.push({ repoPath: item.repoPath, data: r.data });
}
onProgress?.('beforeClone');
await git.syncClone({ url: settings.remoteUrl, branch: settings.branch });
onProgress?.('beforeWrite');
await git.writeFiles(files);
onProgress?.('beforePush');
await git.commitAndPush({
message: input.commitMessage,
branch: settings.branch,