diff --git a/quartz/plugins/transformers/frontmatter.ts b/quartz/plugins/transformers/frontmatter.ts index 41c1b1375..eae359e1e 100644 --- a/quartz/plugins/transformers/frontmatter.ts +++ b/quartz/plugins/transformers/frontmatter.ts @@ -5,7 +5,6 @@ import yaml from "js-yaml" import toml from "toml" import { slugTag } from "../../util/path" import { QuartzPluginData } from "../vfile" -import chalk from "chalk" export interface Options { delims: string | string[] @@ -17,23 +16,6 @@ const defaultOptions: Options = { language: "yaml", } -function coerceDate(fp: string, d: unknown): Date | undefined { - if (d === undefined || d === null) return undefined - const dt = new Date(d as string | number) - const invalidDate = isNaN(dt.getTime()) || dt.getTime() === 0 - if (invalidDate) { - 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 undefined - } - - return dt -} - function coalesceAliases(data: { [key: string]: any }, aliases: string[]) { for (const alias of aliases) { if (data[alias] !== undefined && data[alias] !== null) return data[alias] @@ -66,7 +48,6 @@ export const FrontMatter: QuartzTransformerPlugin | undefined> [remarkFrontmatter, ["yaml", "toml"]], () => { return (_, file) => { - const fp = file.data.filePath! const { data } = matter(Buffer.from(file.value), { ...opts, engines: { @@ -88,16 +69,6 @@ export const FrontMatter: QuartzTransformerPlugin | undefined> if (aliases) data.aliases = aliases const cssclasses = coerceToArray(coalesceAliases(data, ["cssclasses", "cssclass"])) if (cssclasses) data.cssclasses = cssclasses - const created = coerceDate(fp, coalesceAliases(data, ["created", "date"])) - - if (created) data.created = created - const modified = coerceDate( - fp, - coalesceAliases(data, ["modified", "lastmod", "updated", "last-modified"]), - ) - if (modified) data.modified = modified - const published = coerceDate(fp, coalesceAliases(data, ["published", "publishDate"])) - if (published) data.published = published // fill in frontmatter file.data.frontmatter = data as QuartzPluginData["frontmatter"] @@ -120,9 +91,6 @@ declare module "vfile" { draft: boolean enableToc: string cssclasses: string[] - created: Date - modified: Date - published: Date }> } } diff --git a/quartz/plugins/transformers/lastmod.ts b/quartz/plugins/transformers/lastmod.ts index 193664d65..31c8c2084 100644 --- a/quartz/plugins/transformers/lastmod.ts +++ b/quartz/plugins/transformers/lastmod.ts @@ -12,6 +12,21 @@ 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 | undefined> = ( userOpts, ) => { @@ -23,21 +38,23 @@ export const CreatedModifiedDate: QuartzTransformerPlugin | und () => { let repo: Repository | undefined = undefined return async (_tree, file) => { - let created: Date | undefined = undefined - let modified: Date | undefined = undefined - let published: Date | undefined = undefined + let created: MaybeDate = undefined + let modified: MaybeDate = undefined + let published: MaybeDate = undefined const fp = file.data.filePath! const fullFp = path.posix.join(file.cwd, fp) for (const source of opts.priority) { if (source === "filesystem") { const st = await fs.promises.stat(fullFp) - created ||= new Date(st.birthtimeMs) - modified ||= new Date(st.mtimeMs) + created ||= st.birthtimeMs + modified ||= st.mtimeMs } else if (source === "frontmatter" && file.data.frontmatter) { - created ||= file.data.frontmatter.created - modified ||= file.data.frontmatter.modified - published ||= file.data.frontmatter.published + created ||= file.data.frontmatter.date as MaybeDate + modified ||= file.data.frontmatter.lastmod as MaybeDate + modified ||= file.data.frontmatter.updated as MaybeDate + modified ||= file.data.frontmatter["last-modified"] as MaybeDate + published ||= file.data.frontmatter.publishDate as MaybeDate } else if (source === "git") { if (!repo) { // Get a reference to the main git repo. @@ -47,9 +64,7 @@ export const CreatedModifiedDate: QuartzTransformerPlugin | und } try { - modified ||= new Date( - await repo.getFileLatestModifiedDateAsync(file.data.filePath!), - ) + modified ||= await repo.getFileLatestModifiedDateAsync(file.data.filePath!) } catch { console.log( chalk.yellow( @@ -61,13 +76,10 @@ export const CreatedModifiedDate: QuartzTransformerPlugin | und } } - created ||= new Date() - modified ||= new Date() - published ||= new Date() file.data.dates = { - created, - modified, - published, + created: coerceDate(fp, created), + modified: coerceDate(fp, modified), + published: coerceDate(fp, published), } } },