Repository: gohugoio/hugo (language: go)

Issue:
Treat null dates as zero dates
I implemented validation of the four predefined front matter date fields in [#12877](https://github.com/gohugoio/hugo/pull/12877) to address [#10717](https://github.com/gohugoio/hugo/issues/10717).

I revised the implementation in [#12905](https://github.com/gohugoio/hugo/pull/12905) to address [#12898](https://github.com/gohugoio/hugo/issues/12898) (blank dates).

I neglected to consider that, unlike TOML, YAML and JSON support null values.

Reference: <https://discourse.gohugo.io/t/51833>


Discussion / hints:

Fix patch:
diff --git a/resources/page/pagemeta/page_frontmatter.go b/resources/page/pagemeta/page_frontmatter.go
index 686f0d44d71..d5d61260981 100644
--- a/resources/page/pagemeta/page_frontmatter.go
+++ b/resources/page/pagemeta/page_frontmatter.go
@@ -728,7 +728,7 @@ func (f *frontmatterFieldHandlers) newDateFieldHandler(key string, setter func(d
 	return func(d *FrontMatterDescriptor) (bool, error) {
 		v, found := d.PageConfig.Params[key]
 
-		if !found || v == "" {
+		if !found || v == "" || v == nil {
 			return false, nil
 		}
 


Test patch:
diff --git a/resources/page/pagemeta/pagemeta_integration_test.go b/resources/page/pagemeta/pagemeta_integration_test.go
index 9d8f1b92f28..d0c550b2e1b 100644
--- a/resources/page/pagemeta/pagemeta_integration_test.go
+++ b/resources/page/pagemeta/pagemeta_integration_test.go
@@ -52,47 +52,91 @@ func TestDateValidation(t *testing.T) {
 -- hugo.toml --
 disableKinds = ['page','rss','section','sitemap','taxonomy','term']
 -- content/_index.md --
-+++
-date = DATE
-+++
+FRONT_MATTER
 -- layouts/index.html --
 {{ .Date.UTC.Format "2006-01-02" }}
 --
 `
 	errorMsg := `ERROR the "date" front matter field is not a parsable date`
 
-	// Valid (TOML)
-	f := strings.ReplaceAll(files, "DATE", "2024-10-01")
+	// TOML: unquoted date/time (valid)
+	f := strings.ReplaceAll(files, "FRONT_MATTER", `
++++
+date = 2024-10-01
++++
+	`)
 	b := hugolib.Test(t, f)
 	b.AssertFileContent("public/index.html", "2024-10-01")
 
-	// Valid (string)
-	f = strings.ReplaceAll(files, "DATE", `"2024-10-01"`)
+	// TOML: string (valid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
++++
+date = "2024-10-01"
++++
+	`)
 	b = hugolib.Test(t, f)
 	b.AssertFileContent("public/index.html", "2024-10-01")
 
-	// Valid (empty string)
-	f = strings.ReplaceAll(files, "DATE", `""`)
+	// TOML: empty string (valid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
++++
+date = ""
++++
+	`)
 	b = hugolib.Test(t, f)
 	b.AssertFileContent("public/index.html", "0001-01-01")
 
-	// Valid (int)
-	f = strings.ReplaceAll(files, "DATE", "0")
+	// TOML: int (valid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
++++
+date = 0
++++
+	`)
 	b = hugolib.Test(t, f)
 	b.AssertFileContent("public/index.html", "1970-01-01")
 
-	// Invalid (string)
-	f = strings.ReplaceAll(files, "DATE", `"2024-42-42"`)
+	// TOML: string (invalid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
++++
+date = "2024-42-42"
++++
+	`)
 	b, _ = hugolib.TestE(t, f)
 	b.AssertLogContains(errorMsg)
 
-	// Invalid (bool)
-	f = strings.ReplaceAll(files, "DATE", "true")
+	// TOML: bool (invalid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
++++
+date = true
++++
+	`)
 	b, _ = hugolib.TestE(t, f)
 	b.AssertLogContains(errorMsg)
 
-	// Invalid (float)
-	f = strings.ReplaceAll(files, "DATE", "6.7")
+	// TOML: float (invalid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
++++
+date = 6.7
++++
+	`)
 	b, _ = hugolib.TestE(t, f)
 	b.AssertLogContains(errorMsg)
+
+	// JSON: null (valid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
+{
+  "date": null
+}
+	`)
+	b = hugolib.Test(t, f)
+	b.AssertFileContent("public/index.html", "0001-01-01")
+
+	// YAML: null (valid)
+	f = strings.ReplaceAll(files, "FRONT_MATTER", `
+---
+date:
+---
+	`)
+	b = hugolib.Test(t, f)
+	b.AssertFileContent("public/index.html", "0001-01-01")
 }