
Research
/Security News
DuckDB npm Account Compromised in Continuing Supply Chain Attack
Ongoing npm supply chain attack spreads to DuckDB: multiple packages compromised with the same wallet-drainer malware.
bem-naming
Advanced tools
This tool allows getting information about BEM entity using string as well as forming string representation based on naming object.
$ npm install --save bem-naming
var bemNaming = require('bem-naming');
bemNaming.parse('button__text'); // { block: 'button', elem: 'text' }
bemNaming.stringify({ block: 'button', modName: 'checked' }); // button_checked
To define BEM entities we often use a special string format that allows us 100% define what entity exactly is represented.
According to original BEM-naming convention it looks like the following:
'block[_block-mod-name[_block-mod-val]][__elem-name[_elem-mod-name[_elem-mod-val]]]'
(Parameters within square brackets are optional)
block-name
.block-name_mod-name_mod-val
.block-name_mod
.block-name__elem-name
.block-name__elem-name_mod-name_mod-val
.block-name__elem_mod
.BEM entities can be defined with a help of JS object with the following fields:
block
— a block name. The field is required because only a block exists as an independent BEM entityelem
— an element name.modName
— a modifier name.modVal
— a modifier value.The modifier consists of a pair of fields modName
and modVal
. This means that the field modVal
without modName
has no meaning.
Example:
// The block modifier
{
block: 'block',
modName: 'mod',
modVal: 'val'
}
// Not valid BEM-notation
{
block: 'block',
modVal: 'val'
}
To describe the boolean modifier field modVal
must be specified as true
.
Example:
// Boolean modifier of a block
{
block: 'block',
modName: 'mod',
modVal: true
}
// Shorthand for the boolean modifier of a block
{
block: 'block',
modName: 'mod'
}
// Not valid BEM-notation
{
block: 'block',
modName: 'mod',
modVal: false
}
Checks a string to be valid BEM notation.
Example:
bemNaming.validate('block-name'); // true
bemNaming.validate('^*^'); // false
It parses string into naming object.
Example:
bemNaming.parse('block__elem_mod_val'); // { block: 'block', elem: 'elem',
// modName: 'mod', modVal: 'val' }
It forms a string according to naming object.
Example:
bemNaming.stringify({
block: 'block', elem: 'elem',
modName: 'mod', modVal: 'val'
}); // 'block__elem_mod_val'
typeOf(str)
Returns a string indicating the type of the BEM entity.
Example:
bemNaming.typeOf('block'); // block
bemNaming.typeOf('block_mod'); // blockMod
bemNaming.typeOf('block__elem'); // elem
bemNaming.typeOf('block__elem_mod'); // elemMod
Returns a string indicating the type of the BEM entity.
Example:
bemNaming.typeOf({ block: 'block' }); // block
bemNaming.typeOf({ block: 'block', modName: 'mod' }); // blockMod
bemNaming.typeOf({ block: 'block', elem: 'elem' }); // elem
bemNaming.typeOf({ block: 'block', elem: 'elem', modName: 'mod' }); // elemMod
Checks whether string is a block.
Example:
bemNaming.isBlock('block-name'); // true
bemNaming.isBlock('block__elem'); // false
Checks whether naming object is a block.
Example:
bemNaming.isBlock({ block: 'block-name' }); // true
bemNaming.isBlock({ block: 'block', elem: 'elem' }); // false
Checks whether string is modifier of a block.
Example:
bemNaming.isBlockMod('block_mod'); // true
bemNaming.isBlockMod('block__elem_mod'); // false
Checks whether naming object is modifier of a block.
Example:
bemNaming.isBlockMod({ block: 'block',
modName: 'mod', modVal: true }); // true
bemNaming.isBlockMod({ block: 'block', elem: 'elem',
modName: 'mod', modVal: true }); // false
Checks whether string is element of a block.
Example:
bemNaming.isElem('block__elem'); // true
bemNaming.isElem('block-name'); // false
Checks whether naming object is element of a block.
Example:
bemNaming.isElem({ block: 'block', elem: 'elem' }); // true
bemNaming.isElem({ block: 'block-name' }); // false
Checks whether string is modifier of an element.
Example:
bemNaming.isElemMod('block__elem_mod'); // true
bemNaming.isElemMod('block__elem'); // false
Checks whether naming object is modifier of an element.
Example:
bemNaming.isElemMod({ block: 'block', elem: 'elem',
modName: 'mod', modVal: true }); // true
bemNaming.isElemMod({ block: 'block',
modName: 'mod', modVal: true}); // false
String to separate elem from block.
String to separate modifiers from blocks and elements.
String to separate value of modifier from name of modifier.
BEM methodology involves the use of flat structure inside a block. It means that BEM entity can not be represented as an element of the other element and the following string representation will be invalid:
'block__some-elem__sub-elem'
Also there is no such BEM entity as a modifier and an element modifier simultaneously so the following string representation will be invalid:
'block_block-mod-name_block-mod-val__elem-name_elem-mod-name_elem-mod-val'
Use bemNaming
function to create instance to manage naming of your own naming convention.
Example:
var myNaming = bemNaming({
elem: '-',
mod: { name: '--', val: '_' }
wordPattern: '[a-zA-Z0-9]+' // because element and modifier's separators include
}); // hyphen in it, we need to exclude it from block,
// element and modifier's name
myNaming.parse('block--mod_val'); // { block: 'block',
// modName: 'mod', modVal: 'val' }
myNaming.stringify({ // 'blockName-elemName--boolElemMod'
block: 'blockName',
elem: 'elemName',
modName: 'boolElemMod'
});
Type: String
Default: __
Separates element's name from block
Type: String
, { name: String, val: String }
Default: _
Separates modifiers from blocks and elements.
This option can take object with following fields:
name
— separates name of modifier from blocks and elements.
Default as _
.
val
— separates value of modifier from name of modifier.
Default as the value of the name
.
Type: String
Default: [a-z0-9]+(?:-[a-z0-9]+)*
Defines which symbols can be used for block, element and modifier's names.
According to this convention elements are delimited with two underscores (__
), modifiers are delimited by two hyphens (--
), and values of modifiers are delimited by one underscore (_
).
Read more in the Guidelines.
Example:
var twoDashes = bemNaming('two-dashes');
twoDashes.parse('block__elem'); // { block: 'block', elem: 'elem' }
twoDashes.parse('block--mod_val'); // { block: 'block',
// modName: 'mod', modVal: 'val' }
twoDashes.stringify({ // 'block__elem--mod'
block: 'block',
elem: 'elem',
modName: 'mod'
});
Code and documentation copyright 2014 YANDEX LLC. Code released under the Mozilla Public License 2.0.
FAQs
Manage naming of BEM entities
The npm package bem-naming receives a total of 628 weekly downloads. As such, bem-naming popularity was classified as not popular.
We found that bem-naming 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.
Research
/Security News
Ongoing npm supply chain attack spreads to DuckDB: multiple packages compromised with the same wallet-drainer malware.
Security News
The MCP Steering Committee has launched the official MCP Registry in preview, a central hub for discovering and publishing MCP servers.
Product
Socket’s new Pull Request Stories give security teams clear visibility into dependency risks and outcomes across scanned pull requests.