astro-loader-obsidian
Version:
Use your Obsidian Vault in Astro projects
55 lines (38 loc) • 1.5 kB
text/typescript
import { dirname, join } from "node:path";
import { ALLOWED_IMAGE_EXTENSIONS } from "./constants";
import { slugify } from "./utils/slugify";
import { copyFile, mkdir } from "node:fs/promises";
export const isImage = (asset: string) =>
ALLOWED_IMAGE_EXTENSIONS.some(ext => asset.includes(ext));
export const getAssetsPublicDir = (baseUrl: URL, outputUrl: URL) => {
const vaultDir = baseUrl.pathname.split('/').filter(Boolean).at(-1);
if (!vaultDir) {
return outputUrl.toString();
}
const outputDir = join(outputUrl.pathname, vaultDir);
return outputDir;
}
export const getAssetsPublicUrl = (baseUrl: URL, base: string) => {
const vaultDir = baseUrl.pathname.split('/').filter(Boolean).at(-1);
if (!vaultDir) {
return base;
}
return join(base, vaultDir);
}
export const getAssetPublicPath = (asset: string, baseUrl: URL, outputUrl: URL) => {
const publicDir = getAssetsPublicDir(baseUrl, outputUrl);
return join(publicDir, slugify(asset, true));
}
export const getAssetPublicUrl = (asset: string, publicDir: string) => {
return join(publicDir, slugify(asset, true));
}
export const exposeObsidianAsset = async (asset: string, baseUrl: URL, outputUrl: URL) => {
if (isImage(asset)) {
return;
}
const assetPath = join(baseUrl.pathname, asset);
const publicPath = getAssetPublicPath(asset, baseUrl, outputUrl);
const dirPath = dirname(publicPath);
await mkdir(dirPath, { recursive: true });
return copyFile(assetPath, publicPath);
}