Implement an event callback + Obsidian notifications on the publishing status
This commit is contained in:
11
src/main.ts
11
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)`
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user