Page MenuHomePhabricator

[clang-format] Support .mjs module javascript extension in clang-format
ClosedPublic

Authored by fergald on Thu, Aug 22, 5:34 AM.

Details

Summary

PR43085.

Recognize .mjs files as JavaScript. .mjs is the extension used by Node.js for ECMAScript modules. A specific extension (and associated content type javascript/esm) is introduced to differentiate it from previous CommonJS modules and solve some interoperability problems.

Diff Detail

Repository
rL LLVM

Event Timeline

fergald created this revision.Thu, Aug 22, 5:34 AM
Herald added a project: Restricted Project. · View Herald TranscriptThu, Aug 22, 5:34 AM
Herald added a subscriber: cfe-commits. · View Herald Transcript
thakis accepted this revision.Thu, Aug 22, 7:17 PM
thakis added a subscriber: thakis.

Does clang-format format import and export lines in mjs files correctly?

This revision is now accepted and ready to land.Thu, Aug 22, 7:17 PM

I cannot commit this, please do so, if you're happy with it.

This causes .mjs files to be treated as javascript.

I think you meant .mjs was not recognized before but will be recognized as JavaScript with this change.

Can you elaborate a bit why .mjs is so common that it justifies a clang-format change?

module-javascript. Module javascript is not compatible with non-module java script as it uses the "export" and "import" keywords which are only legal in module-javascript.

java script -> JavaScript
module-javascript -> Module JavaScript?

fergald edited the summary of this revision. (Show Details)Thu, Aug 22, 7:35 PM

"why .mjs is so common that it justifies a clang-format change?"

I don't have data but Module JS is the future, it's supported by all major browsers for some time and also Node.js, it solves the problem of everything being lumped into one namespace.

Why does it need a different suffix? It adds the "export" and "import" keywords and so it incompatible with common JS. Forcing everyone to keep using js for both is not helpful (clang-format is not forcing of course but applying clang-format with --assume-filename is pretty awkward).

Node specifies .mjs as the suffix

https://medium.com/@nodejs/announcing-a-new-experimental-modules-1be8d2d6c2ff
https://nodejs.org/api/esm.html

So the use of the .mjs suffix is going to grow in volume as people modernize their project. It would be great for clang-format to be enabling that migration.

MaskRay accepted this revision.EditedThu, Aug 22, 8:12 PM

Reading some materials online... I think this should be named ECMAScript module (ECM), not JavaScript modules.. I can fix the description and commit for you.

How about this description?

Recognize .mjs files as JavaScript. .mjs is the extension used by Node.js for ECMAScript modules. A specific extension (and associated content type javascript/esm) is
introduced to differentiate it from previous CommonJS modules and solve some
interoperability problems.
fergald edited the summary of this revision. (Show Details)Thu, Aug 22, 9:15 PM

Thanks, I'm happy with that description

This revision was automatically updated to reflect the committed changes.
Herald added a project: Restricted Project. · View Herald TranscriptThu, Aug 22, 9:45 PM