-
-
Notifications
You must be signed in to change notification settings - Fork 115
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
improve ISO8601 support #578
Conversation
02e0009
to
5f7c04e
Compare
This one's tricky, because for YAML 1.1 Could it be that you're attempting to parse serialized timestamps without overriding the YAML version from its default of 1.2, which does not support Separately, there does seem to be a bug to fix in the timestamp serialiser, as this ought to include an explicit tag: > YAML.stringify(new Date(), { customTags: ["timestamp"] })
'2024-10-02T11:22:59.726Z\n' This does work for other custom tags, such as: > YAML.stringify(new Set(), { customTags: ["set"] })
'!!set {}\n' |
Thanks @eemeli, I missed this page about the timestamp definition. It was exactly the one I was searching for but could not put my hands on! Then the RegExp currently in use is more broad than the one officially supported but even so does not support the output format of
What would like me to do? I see 3 possible things:
The problem with |
Buggy example just for the sake of being complete and well understood: const yaml = require("yaml");
const res = yaml.parse(
yaml.stringify(
{ date: new Date("2024-04-01T02:00:00Z") },
{ customTags: ["timestamp"] }
),
{ customTags: ["timestamp"] }
);
console.log(res.date, res.date instanceof Date)
// 2024-04-01T02:00 false |
Ok, so a couple of things are wrong here:
I think the test regexp should not be changed, as that's liable to be a breaking change either way, and the deviations aren't too bad. The second-stripping during serialization should be dropped. The |
I mostly agree about everything you just said. The only thing I wonder is about the test RegExp. I think it could be expanded to support everything that the official doc supports but keep support of the small things it parses that are not in spec (if they are any). The idea would be to be at least compliant. It would not be too complicated no? Maybe it's already the case. Hard to compare them… |
As far as I can tell, the only features that the current test regexp does not support and the one in the spec does are:
Both of those look like mistakes in the original spec, tbh. I'd be happy to consider adding support for them if there's a real-world case that is impacted, but that seems unlikely. |
I think you are right. Looking at the codebase, it seems to me that custom tags use I propose to change this MR to fix Once that is merged, we can do another one to tackle I think you are correct about the currect regexp. |
There's an existing pattern used here that should probably work for this use case as well: yaml/src/compose/compose-scalar.ts Lines 75 to 77 in 5adbb60
|
5f7c04e
to
4e23435
Compare
4e23435
to
35dfead
Compare
@eemeli I just updated this MR with the fix for |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry for the delay in getting to this, but this does look like the right fix!
Hello!
I created a script doing DB dumps in YAML and doing that I manipulated dates extensively. I noticed that in a rare case,
yaml.stringify
could produce a validISO8601
date that would not be parsed as a Date byyaml.parse()
. This made me decide to improve the RegExp used byyaml
so that it supports at least the formats it can output. But since I was tinkling with those, I improved ISO8601 support overall.The case that could not work: when a date had no seconds nor milliseconds, it was trimmed by this function:
Which resulted in valid dates like:
2024-10-02T09:00
. Sadly, once in.parse(value, { customTags: ["timestamp"] })
provide a value of"2024-10-02T09:00"
instead of the expected Date instance.I also added support for:
-
characters:
charactersNote: though
20241002
is a valid ISO8601 date,yaml.parse()
still gives priority to the number type abovetimestamp
. Though both are testingtrue
. Could that become an issue? The YAML spec is not very explicit about what timestamp formats should be allowed and how they should be disambiguated.