Skip to content
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鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix file info size check #476

Merged
merged 3 commits into from Aug 2, 2021
Merged

Fix file info size check #476

merged 3 commits into from Aug 2, 2021

Conversation

LinusU
Copy link
Contributor

@LinusU LinusU commented Jul 29, 2021

Fixing the failing tests as requested here #472 (comment) 馃槑

core.js Outdated
@@ -74,7 +74,7 @@ async function _fromTokenizer(tokenizer) {
const checkString = (header, options) => check(stringToBytes(header), options);

// Keep reading until EOF if the file size is unknown.
if (tokenizer.fileInfo.size === 0) {
if (tokenizer.fileInfo.size === undefined || tokenizer.fileInfo.size === null || tokenizer.fileInfo.size === 0) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's specifically undefined and not null, but I figured it would be better to accept both?

It's also never 0 (in the tests at least), I think before they are using undefined to indicate that the size hasn't been set yet. So potentially we want to remove 0? 馃

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Borewit The .size property is not documented to be undefined. The docs should use number? instead of number to make that clear.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@LinusU Let's only check for undefined.

Copy link
Collaborator

@Borewit Borewit Jul 31, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I just started looking into the failing tests as well. I noticed 2 things:

  1. The fileInfo.size is, for some reason, not set reading from a file-stream (fs.createReadStream) includes the original file path which is used to determine the file size)
    2. There are cases fileInfo.size is undefined (because the stream length is not known), so that code needs to be improved. The file fileInfo.size is overwritten to Number.MAX_SAFE_INTEGER in case the length is unknown.

I don't directly remember where the 0 is coming from. I will try to give some clarity on that and improve the documentation accordingly.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Issue with size being 0 introduced here: https://github.com/sindresorhus/file-type/blame/331b1620c0d6a29b70a2e8e6c246cb2bdd93b183/core.js#L73

Yes, the linter auto-fix assumed .size would be a number and never undefined. It doesn't read the types. The previous check was too loose anyway though, so it's good that we make it more strict now.

@sindresorhus
Copy link
Owner

Thank for looking into this 馃檶

@sindresorhus sindresorhus merged commit c037ba7 into sindresorhus:main Aug 2, 2021
@Borewit
Copy link
Collaborator

Borewit commented Aug 2, 2021

I am puzzled, so we went from:

if (!tokenizer.fileInfo.size) // works, but linter does not like it

to

if (!tokenizer.fileInfo.size === 0) // does not work

to

if (tokenizer.fileInfo.size === undefined || tokenizer.fileInfo.size === null || tokenizer.fileInfo.size === 0) // could be simplified to...

Are we working for the linter or the linter for us?

@LinusU LinusU deleted the lu-fix branch August 2, 2021 11:05
@LinusU
Copy link
Contributor Author

LinusU commented Aug 2, 2021

@Borewit I actually think that the last one of those is the better since when reading the code it's obvious that the value could be null, undefined, or 0. The original code didn't express the intent clear at all, which is what led to the problem in the first place. I think it's better to optimise code for reading and for clarity, rather than brevity...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants