npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@bem/naming

v2.0.0-6

Published

Manage naming of BEM entities

Downloads

1,410

Readme

bem-naming

Tool for working with BEM entity representations: allows you to parse string representation and stringify object representation.

Supports various naming conventions: origin, two-dashes, react and allows to create your convention.

NPM Status Travis Status Coverage Status Dependency Status

Install

$ npm install --save @bem/naming

Usage

const bemNaming = require('@bem/naming');

bemNaming.parse('button__text'); // BemEntityName { block: 'button', elem: 'text' }
bemNaming.stringify({ block: 'button', mod: 'checked' }); // String 'button_checked'

Table of Contents

BEM Entity representation

With BEM entity representation you can define block, element, block modifier and element modifier.

The representation can include name of block, name of element, name of modifier and value of modifier.

BEM entity can be represented using Object or String.

Object representation

The BemEntityName class describes the representation of a BEM entity name.

String representation

To define BEM entities, we often use a special string format that allows us to define exactly which entity is represented.

According to the original BEM naming convention, it looks like this:

'block[_block-mod-name[_block-mod-val]][__elem-name[_elem-mod-name[_elem-mod-val]]]'

(Parameters within square brackets are optional)

Delimiters

The names are separated from each other by means of special delimiters.

The original naming uses the following delimiters:

  • __ — to separate an element from a block
  • _ — to separate a modifier name from a block or element and to separate a modifier value from a modifier name

Examples

| BEM Entity Type | String Representation | |------------------|--------------------------------------------| | Block | block-name | | Block modifier | block-scope_mod-name_mod-val | | Element | block-scope__elem-name | | Element modifier | block-scope__elem-scope_mod-name_mod-val |

The simple modifier doesn't have value. Therefore, in the string representation the value should be omitted.

| BEM Entity Type | String Representation | |------------------|------------------------------------| | Block modifier | block-scope_mod-name | | Element modifier | block-scope__elem-scope_mod-name |

Common misconceptions

The BEM methodology uses a flat structure inside blocks. This means that a BEM entity can't be represented as an element of another element, and the following string representation will be invalid:

'block__some-elem__sub-elem'

For more information, see the FAQ:

Why doesn't BEM recommend using elements within elements (block__elem1__elem2)?

Also, a BEM entity can't be a block 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'

Naming conventions

The main idea of the naming convention is to make names of BEM entities as informative and clear as possible.

Read more in the section naming convention of the BEM methodology.

The BEM methodology provides an idea for creating naming rules and implements that idea in its canonical naming convention: origin naming convention.

However, a number of alternative schemes based on the BEM principles also exist in the world of web development:

In addition, you can invent your naming convention. How to do this, see the Custom naming convention section.

Origin naming convention

According to this convention elements are delimited with two underscores (__), modifiers and values of modifiers are delimited by one underscore (_).

Read more in the section naming convention of the BEM methodology.

Example:

const originNaming = require('@bem/naming')('origin');

originNaming.parse('block__elem');    // BemEntityName { block: 'block', elem: 'elem' }
originNaming.parse('block_mod_val');  // BemEntityName { block: 'block',
                                      //                 mod: { name: 'mod', val: 'val' } }

originNaming.stringify({
    block: 'block',
    elem: 'elem',
    mod: 'mod'
});

// ➜ block__elem_mod

Harry Roberts' naming convention

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:

const twoDashesNaming = require('@bem/naming')('two-dashes');

twoDashesNaming.parse('block__elem');    // { block: 'block', elem: 'elem' }
twoDashesNaming.parse('block--mod_val'); // { block: 'block',
                                         //   mod: { name: 'mod', val: 'val' } }

twoDashesNaming.stringify({
    block: 'block',
    elem: 'elem',
    mod: 'mod'
});

// ➜ block__elem--mod

React naming convention

According to this convention elements are delimited with one hyphen (-), modifiers are delimited by one underscore (_), and values of modifiers are delimited by one underscore (_).

You can explore this convention at bem-react-components.

Example:

const reactNaming = require('@bem/naming')('react');

reactNaming.parse('Block-Elem');    // BemEntityName { block: 'Block', elem: 'Elem' }
reactNaming.parse('Block_Mod_Val'); // BemEntityName { block: 'Block',
                                    //                 mod: { name: 'Mod', val: 'Val' } }

reactNaming.stringify({
    block: 'Block',
    elem: 'Elem',
    mod: 'Mod'
});

// ➜ Block-Elem_Mod

Custom naming convention

To create an instance where you can manage your own naming convention use the bemNaming function.

Example:

const createBemNaming = require('@bem/naming');

const myNaming = createBemNaming({
    delims: {
        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'); // BemEntityName
                                  // { block: 'block',
                                  //   mod: { name: 'mod', val: 'val' } }

const BemEntityName = require('@bem/entity-name');

myNaming.stringify(new BemEntityName({
    block: 'blockName',
    elem: 'elemName',
    mod: 'simpleElemMod'
});

// ➜ blockName-elemName--simpleElemMod

API

bemNaming({ delims: {elem, mod}, wordPattern })

Parameter | Type | Description | Default ------------------|----------|-----------------------------------------------------------------------------------|---------------------------------------- delims | object | Defines delimeters for elem and/or mods | delims.elem | string | Separates element's name from block. | __ delims.mod | string, { name: string, val: string } | Separates modifier from block or element. | _ delims.mod.name | string | Separates a modifier name from a block or an element. | _ delims.mod.val | string | Separates the value of a modifier from the modifier name. | _ wordPattern | string | Defines which characters can be used in names of blocks, elements, and modifiers. | [a-z0-9]+(?:-[a-z0-9]+)*

parse(str)

Parameter | Type | Description ----------|----------|-------------------------------- str | string | BEM entity name representation.

Parses the string into an instance of BemEntityName.

Example:

const bemNaming = require('@bem/naming');

bemNaming.parse('block__elem_mod_val');

// ➜ BemEntityName {
//     block: 'block',
//     elem: 'elem',
//     mod: { name: 'mod', val: 'val' }
// }

stringify(entityName)

Parameter | Type | Description -------------|---------------------------|-------------------------------- entityName | BemEntityName, object | BEM entity name representation.

Forms a string from the instance of BemEntityName.

Example:

const bemNaming = require('@bem/naming');
const BemEntityName = require('@bem/entity-name');

bemNaming.stringify(new BemEntityName({
    block: 'block',
    elem: 'elem',
    mod: { name: 'mod', val: 'val' }
});

// ➜ block__elem_mod_val

delims

Strings to separate names of bem entities.

Type: Object

delims.elem

String to separate an element from a block.

Type: String

Default: __

delims.mod.name

String to separate a modifier name from a block or element.

Type: String

Default: _

delims.mod.val

String to separate a modifier value from the name of the modifier.

Type: String

Default: _

License

Code and documentation copyright 2014 YANDEX LLC. Code released under the Mozilla Public License 2.0.