mirror of
https://github.com/jackyzha0/quartz.git
synced 2025-12-24 13:24:05 -06:00
Following on from https://github.com/jackyzha0/quartz/pull/1791. The change in
a737207981
did not fix the issue for me. Another important change in my PR was the
relative path of the file within the repo that gets passed to `repo.getFileLatestModifiedDateAsync`.
100 lines
3.3 KiB
TypeScript
100 lines
3.3 KiB
TypeScript
import fs from "fs"
|
|
import path from "path"
|
|
import { Repository } from "@napi-rs/simple-git"
|
|
import { QuartzTransformerPlugin } from "../types"
|
|
import chalk from "chalk"
|
|
|
|
export interface Options {
|
|
priority: ("frontmatter" | "git" | "filesystem")[]
|
|
}
|
|
|
|
const defaultOptions: Options = {
|
|
priority: ["frontmatter", "git", "filesystem"],
|
|
}
|
|
|
|
function coerceDate(fp: string, d: any): Date {
|
|
const dt = new Date(d)
|
|
const invalidDate = isNaN(dt.getTime()) || dt.getTime() === 0
|
|
if (invalidDate && d !== undefined) {
|
|
console.log(
|
|
chalk.yellow(
|
|
`\nWarning: found invalid date "${d}" in \`${fp}\`. Supported formats: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format`,
|
|
),
|
|
)
|
|
}
|
|
|
|
return invalidDate ? new Date() : dt
|
|
}
|
|
|
|
type MaybeDate = undefined | string | number
|
|
export const CreatedModifiedDate: QuartzTransformerPlugin<Partial<Options>> = (userOpts) => {
|
|
const opts = { ...defaultOptions, ...userOpts }
|
|
return {
|
|
name: "CreatedModifiedDate",
|
|
markdownPlugins(ctx) {
|
|
return [
|
|
() => {
|
|
let repo: Repository | undefined = undefined
|
|
let repoRoot: string | undefined = undefined
|
|
return async (_tree, file) => {
|
|
let created: MaybeDate = undefined
|
|
let modified: MaybeDate = undefined
|
|
let published: MaybeDate = undefined
|
|
|
|
const fp = file.data.relativePath!
|
|
const fullFp = path.posix.join(ctx.argv.directory, fp)
|
|
for (const source of opts.priority) {
|
|
if (source === "filesystem") {
|
|
const st = await fs.promises.stat(fullFp)
|
|
created ||= st.birthtimeMs
|
|
modified ||= st.mtimeMs
|
|
} else if (source === "frontmatter" && file.data.frontmatter) {
|
|
created ||= file.data.frontmatter.created as MaybeDate
|
|
modified ||= file.data.frontmatter.modified as MaybeDate
|
|
published ||= file.data.frontmatter.published as MaybeDate
|
|
} else if (source === "git") {
|
|
if (!repo) {
|
|
// Get a reference to the main git repo.
|
|
// It's either the same as the workdir,
|
|
// or 1+ level higher in case of a submodule/subtree setup
|
|
repo = Repository.discover(ctx.argv.directory)
|
|
repoRoot = path.join(repo.path(), "..")
|
|
}
|
|
|
|
try {
|
|
modified ||= await repo.getFileLatestModifiedDateAsync(
|
|
path.relative(repoRoot!, fullFp),
|
|
)
|
|
} catch {
|
|
console.log(
|
|
chalk.yellow(
|
|
`\nWarning: ${file.data
|
|
.filePath!} isn't yet tracked by git, last modification date is not available for this file`,
|
|
),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
file.data.dates = {
|
|
created: coerceDate(fp, created),
|
|
modified: coerceDate(fp, modified),
|
|
published: coerceDate(fp, published),
|
|
}
|
|
}
|
|
},
|
|
]
|
|
},
|
|
}
|
|
}
|
|
|
|
declare module "vfile" {
|
|
interface DataMap {
|
|
dates: {
|
|
created: Date
|
|
modified: Date
|
|
published: Date
|
|
}
|
|
}
|
|
}
|