dedent-js icon indicating copy to clipboard operation
dedent-js copied to clipboard

dedents when it shouldn't

Open brandonkal opened this issue 5 years ago • 6 comments

dedent`
one:
   two: 3
`

becomes

one:
two: 3

brandonkal avatar Jan 10 '20 03:01 brandonkal

Looking at the code, I see that lines that have no indentation are ignored. It is not explicitly mentioned in the readme but I guess it makes sense, otherwise dedent would do nothing in those cases and there would be no point in using it.

MartinKolarik avatar Jan 10 '20 14:01 MartinKolarik

I've created a fix and PR. I'm using this internal to a yaml template tag function. Naturally YAML is very indent focused but the function doesn't know ahead of time if a dedent needs to occur before parsing the string to a JavaScript object.

brandonkal avatar Jan 10 '20 22:01 brandonkal

Looking at the code, I see that lines that have no indentation are ignored. It is not explicitly mentioned in the readme but I guess it makes sense, otherwise dedent would do nothing in those cases and there would be no point in using it.

Should dedent really be useful in this situation? I think consistent behaviour here has more advantages. Here are a few:

  • dedent becomes an idempotent operation if this quirk is removed
  • When dedent is used for the purpose of making code more readable (I would speculate this is the most common use case), indentation is lost when a string happens to start from all the way at the left
  • dedent-js could provide a flag to explicitly remove indentation up to a specified depth, if that's what's desired, covering more use cases overall while making behaviour more consistent

KernelDeimos avatar Mar 01 '21 05:03 KernelDeimos

Also Github reports that there are over 18 thousand repositories using this package. It is irresponsible to leave this awful quirk in the code.

KernelDeimos avatar Mar 01 '21 05:03 KernelDeimos

A possible workaround is to add a space at the begging of each line

dedent(text.replace(/(^[^\n]|\n)/g, '$1 '))

dvirtz avatar Aug 11 '21 19:08 dvirtz

I think the issue here is you might be using dedent-js on something where you don't know the final tabbing. Because of that, it makes sense for dedent to do nothing. I'm also for this change.

KevinGhadyani-minted avatar Aug 18 '21 06:08 KevinGhadyani-minted