diff --git a/src/main.ts b/src/main.ts index c5907a7..5a1affb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -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)` diff --git a/src/publish.test.ts b/src/publish.test.ts index d1a7f37..74b43af 100644 --- a/src/publish.test.ts +++ b/src/publish.test.ts @@ -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'); +}); diff --git a/src/publish.ts b/src/publish.ts index e66891a..87fa581 100644 --- a/src/publish.ts +++ b/src/publish.ts @@ -15,6 +15,7 @@ export interface PublishInput { } export type ImageResolver = (linktext: string) => Promise; +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 { 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,