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 },
|
{ noteText, ...r },
|
||||||
this.settings,
|
this.settings,
|
||||||
git,
|
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
|
const warn = result.unresolved.length
|
||||||
? ` (${result.unresolved.length} image(s) unresolved)`
|
? ` (${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 { publish } from "./publish";
|
||||||
import { DEFAULT_SETTINGS } from "./settings";
|
import { DEFAULT_SETTINGS } from "./settings";
|
||||||
import type { GitClient, GitFile } from "./git";
|
import type { GitClient, GitFile } from "./git";
|
||||||
@@ -63,3 +63,27 @@ test("throws when remoteUrl is empty", async () => {
|
|||||||
),
|
),
|
||||||
).rejects.toThrow(/remote/i);
|
).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 ImageResolver = (linktext: string) => Promise<Buffer | null>;
|
||||||
|
export type PublishEventsListener = (on: 'beforeClone' | 'beforeWrite' | 'beforePush') => void;
|
||||||
|
|
||||||
export interface PublishResult {
|
export interface PublishResult {
|
||||||
postPath: string;
|
postPath: string;
|
||||||
@@ -26,7 +27,8 @@ export async function publish(
|
|||||||
input: PublishInput,
|
input: PublishInput,
|
||||||
settings: JekyllPublishSettings,
|
settings: JekyllPublishSettings,
|
||||||
git: GitClient,
|
git: GitClient,
|
||||||
resolveImage: ImageResolver
|
imageResolver: ImageResolver,
|
||||||
|
onProgress?: PublishEventsListener
|
||||||
): Promise<PublishResult> {
|
): Promise<PublishResult> {
|
||||||
if (!settings.remoteUrl.trim()) throw new Error("No git remote URL configured");
|
if (!settings.remoteUrl.trim()) throw new Error("No git remote URL configured");
|
||||||
|
|
||||||
@@ -37,7 +39,7 @@ export async function publish(
|
|||||||
const unresolved: string[] = [];
|
const unresolved: string[] = [];
|
||||||
for (const ref of refs) {
|
for (const ref of refs) {
|
||||||
if (resolved.some((r) => r.linktext === ref.linktext)) continue;
|
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 });
|
if (data) resolved.push({ linktext: ref.linktext, data });
|
||||||
else unresolved.push(ref.linktext);
|
else unresolved.push(ref.linktext);
|
||||||
}
|
}
|
||||||
@@ -59,8 +61,11 @@ export async function publish(
|
|||||||
files.push({ repoPath: item.repoPath, data: r.data });
|
files.push({ repoPath: item.repoPath, data: r.data });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onProgress?.('beforeClone');
|
||||||
await git.syncClone({ url: settings.remoteUrl, branch: settings.branch });
|
await git.syncClone({ url: settings.remoteUrl, branch: settings.branch });
|
||||||
|
onProgress?.('beforeWrite');
|
||||||
await git.writeFiles(files);
|
await git.writeFiles(files);
|
||||||
|
onProgress?.('beforePush');
|
||||||
await git.commitAndPush({
|
await git.commitAndPush({
|
||||||
message: input.commitMessage,
|
message: input.commitMessage,
|
||||||
branch: settings.branch,
|
branch: settings.branch,
|
||||||
|
|||||||
Reference in New Issue
Block a user