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’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Default to template literal strings #54

Closed
KyleAMathews opened this issue Jan 10, 2017 · 9 comments
Closed

Default to template literal strings #54

KyleAMathews opened this issue Jan 10, 2017 · 9 comments
Labels
keep-unlocked status:needs discussion Issues needing discussion and a decision to be made before action can be taken

Comments

@KyleAMathews
Copy link

KyleAMathews commented Jan 10, 2017

This would probably be a controversial decision but template literal strings are just better. No escaping, easy interpolation, multiline when needed, etc.

This article by @bevacqua introduced me to the idea https://ponyfoo.com/articles/template-literals-strictly-better-strings and I've been using straight template literal strings in Gatsby for the past month or so with great success. Can't imagine going back to the morass of single vs. double quotes now.

@bakkot
Copy link
Collaborator

bakkot commented Jan 10, 2017

That would generate a different program, even if it's semantically the same.

Also, it would make this project unusable for people writing ES5.

@bevacqua
Copy link

I don't see generating a different program as an inherent problem, but @jlongster probably has a better idea of where he wants prettier to head.

Regarding ES5, you could just make it an option instead of singleQuotes, have a quotes option with one of [`backtick`, `single`, `double`].

I suppose this tool will only ever support ES6+ due to complexity (if not, do they turn generators into plain functions with switch statements, etc? leads to ugly code)

@bakkot
Copy link
Collaborator

bakkot commented Jan 10, 2017

Syntactically ES5 is a subset of ES2015 (modulo some obscure cases like the interpretation of let[a]), so if it supports ES2015+ it supports ES5. But I agree that this would be solved by providing it as an option.

I maintain that would be bad, though. Template literals aren't strings: function f(){`use strict`;} is not a strict function, import `b`; is not valid syntax, etc.

@bevacqua
Copy link

bevacqua commented Jan 10, 2017

That's never a problem in actual programs, particularly if you're running build tools like this one, that can and will shout at you for writing incorrect programs.

In practice, using template literals by default means you can smoothly add interpolated expressions, something that is a hassle if you're defaulting to single or double quoted strings because of all the back and forth (remove quotes, add backticks, add interpolation, repeat in reverse if you remove all interpolations, etc).

Plus if you're already using template literals in some places, then defaulting to them is no different than using one, in terms of "but import `b` is invalid" and similar arguments.

@bnjmnt4n
Copy link
Contributor

IMO, this doesn't belong in Prettier. Changes like these will modify the AST, and they probably should be done in a separate step or as part of a Babel plugin or JS codemod, instead of in Prettier which is simply a JavaScript formatter which aims to pretty-print the current AST.

@jlongster
Copy link
Member

The good thing is that if you write with template literal strings, we will output template literal strings. This formatter is not so opinionated that is overwrites everything into a single authoritative style. It never converts AST nodes into different types, etc.

I don't know exactly where this will head, but I do know that I want to take it slowly. I think it would be surprising to a lot of people if they typed double-quotes and they were automatically converted into a template literal. For now, I'd prefer to keep whatever the original string type was. (We do force either double or single quotes, naturally, because those compile to the same AST node type so the user can choose what to output because it's ambiguous what we should do.)

If there are any problems with template literals, let me know. Simply having the formatter is probably divisive enough so I don't want to make it any more opinionated than it has to be. I think things like this could be aided by other tools. I'm open to making it easier to integrate with other tools that can transform the AST (i.e. pass the AST elsewhere, maybe babel plugins).

@vramana vramana added the status:needs discussion Issues needing discussion and a decision to be made before action can be taken label Jan 11, 2017
@vjeux
Copy link
Contributor

vjeux commented Mar 1, 2017

We are unlikely going to support this. Closing this in order to clean up the issue list.

@vjeux vjeux closed this as completed Mar 1, 2017
@lydell
Copy link
Member

lydell commented Mar 1, 2017

Also, this can be achieved with eslint --fix using the quotes rule.

@lock lock bot added the locked-due-to-inactivity Please open a new issue and fill out the template instead of commenting. label Jul 8, 2018
@lock lock bot locked as resolved and limited conversation to collaborators Jul 8, 2018
@j-f1 j-f1 added keep-unlocked and removed locked-due-to-inactivity Please open a new issue and fill out the template instead of commenting. labels Sep 3, 2018
@prettier prettier unlocked this conversation Sep 3, 2018
@jasonkuhrt
Copy link

FYI It looks like dprint is going to support this dprint/dprint-plugin-typescript#345.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 28, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
keep-unlocked status:needs discussion Issues needing discussion and a decision to be made before action can be taken
Projects
None yet
Development

No branches or pull requests

10 participants