
Product
Introducing Socket Firewall Enterprise: Flexible, Configurable Protection for Modern Package Ecosystems
Socket Firewall Enterprise is now available with flexible deployment, configurable policies, and expanded language support.
babel-plugin-globalize-symbols
Advanced tools
Transform Symbol() calls to add to the global registry.
Transform Symbol() calls to add to the global Symbol registry.
Disclaimer: This is an experiment.
npm install --save-dev babel-plugin-globalize-symbols
Run:
babel --plugins globalize-symbols script.js
Or add the plugin to your .babelrc configuration:
{
"plugins": ["globalize-symbols"]
}
This plugin will transform the following code:
const RED = Symbol('red');
into:
const RED = Symbol.for('' + 'red' + '540ddd7da3ec634279bbff574b040782');
where the hash is unique to the module the symbol is defined in.
Symbols are really cool but when you use the Symbol() function to create them,
they have some issues:
To address this, we can use Symbol.for() to create and retrieve Symbols from a
global registry. Every time you call it with the same argument, you'll get the
same symbol. These symbols can be serialized (using Symbol.keyFor) and
deserialized (again, using Symbol.for). But it places the onus back on the
developer to guarantee uniqueness, which is a big part of the reason why we were
using Symbols in the first place!
The point of this plugin is to help you create unique Symbols that don't suffer
from the normal problems. To accomplish this, it transforms Symbol() calls
into Symbol.for() calls, but adds a hash to the key that it derives from the
package and module in which it's defined. That means Symbol('red') in
pkg/a.js will always be the same as Symbol('red') in pkg/a.js—regardless
of the frame that loaded it or how many times the module was reloaded—but will
never be the same as Symbol('red') in other/a.js.
This project is an experiment and I'm still thinking about it. One drawback is
that it subtly changes the semantics of Symbol(), which might result in
surprising behavior. It might be better to encourage authors to always use
Symbol.for() with a free variable and use build time transforms to replace
that; for example Symbol.for('red' + __MODULE_HASH__).
FAQs
Transform Symbol() calls to add to the global registry.
We found that babel-plugin-globalize-symbols demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket Firewall Enterprise is now available with flexible deployment, configurable policies, and expanded language support.

Security News
Open source dashboard CNAPulse tracks CVE Numbering Authorities’ publishing activity, highlighting trends and transparency across the CVE ecosystem.

Product
Detect malware, unsafe data flows, and license issues in GitHub Actions with Socket’s new workflow scanning support.