From 72afde8e960573f5c53b096afa93816eabbb4fbf Mon Sep 17 00:00:00 2001 From: Vladimir Grinenko Date: Wed, 12 Sep 2018 01:08:47 +0300 Subject: [PATCH 1/7] WIP --- lib/create-entity.js | 2 +- lib/create.js | 14 +++++++++----- package.json | 11 ++++++----- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/create-entity.js b/lib/create-entity.js index b813721..11b79bf 100644 --- a/lib/create-entity.js +++ b/lib/create-entity.js @@ -3,7 +3,7 @@ var fs = require('fs'), path = require('path'), stream = require('stream'), - bemNaming = require('@bem/naming'), + bemNaming = require('@bem/sdk.naming.entity'), Promise = require('pinkie-promise'), mkdirp = require('mkdirp'), createTree = require('./create-tree'), diff --git a/lib/create.js b/lib/create.js index cf48b8f..222ff83 100644 --- a/lib/create.js +++ b/lib/create.js @@ -2,10 +2,11 @@ var path = require('path'), bemConfig = require('@bem/sdk.config'), - BemEntityName = require('@bem/entity-name'), - BemCell = require('@bem/cell'), + BemEntityName = require('@bem/sdk.entity-name'), + BemCell = require('@bem/sdk.cell'), scheme = require('@bem/fs-scheme'), - bemNaming = require('@bem/naming'), + bemNamingParse = require('@bem/sdk.naming.entity.parse'), + bemNamingPresets = require('@bem/sdk.naming.presets'), braceExpansion = require('brace-expansion'), createEntity = require('./create-entity'), getTemplate = require('./template'), @@ -68,9 +69,12 @@ module.exports = function create(entities, levels, techs, options) { if (isFileGlob) { var file = path.basename(filepathOrInput), // split for entity key and tech (by first dot) - match = file.match(/^([^.]+)(?:\.(.+))?$/); + match = file.match(/^([^.]+)(?:\.(.+))?$/), + naming = typeof levelOptions.naming === 'string' ? + bemNamingPresets[levelOptions.naming] : + levelOptions.naming || bemNamingPresets.origin; - entity = bemNaming(levelOptions.naming).parse(match[1]); + entity = bemNamingParse(naming)(match[1]); if (match[2]) { currentTechs = uniq(techs.concat(match[2])); } diff --git a/package.json b/package.json index 6df68b4..4be0d32 100644 --- a/package.json +++ b/package.json @@ -17,11 +17,12 @@ "author": "", "license": "MPL-2.0", "dependencies": { - "@bem/cell": "^0.2.5", - "@bem/entity-name": "^1.3.2", - "@bem/fs-scheme": "^2.1.1-0", - "@bem/naming": "^2.0.0-5", - "@bem/sdk.config": "0.0.8", + "@bem/fs-scheme": "^2.2.0", + "@bem/sdk.cell": "^0.2.8", + "@bem/sdk.config": "0.0.10", + "@bem/sdk.entity-name": "^0.2.10", + "@bem/sdk.naming.entity": "^0.2.10", + "@bem/sdk.naming.entity.stringify": "^1.1.1", "brace-expansion": "^1.1.6", "mkdirp": "^0.5.1", "pinkie-promise": "^2.0.1", From 6bec1abf06468293027eed103f81dc2d4c02ebf9 Mon Sep 17 00:00:00 2001 From: Vladimir Grinenko Date: Wed, 12 Sep 2018 01:11:43 +0300 Subject: [PATCH 2/7] Drop pinkie-promise --- lib/create-entity.js | 1 - lib/create-tree.js | 1 - lib/create.js | 3 +-- package.json | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/create-entity.js b/lib/create-entity.js index 11b79bf..f166845 100644 --- a/lib/create-entity.js +++ b/lib/create-entity.js @@ -4,7 +4,6 @@ var fs = require('fs'), path = require('path'), stream = require('stream'), bemNaming = require('@bem/sdk.naming.entity'), - Promise = require('pinkie-promise'), mkdirp = require('mkdirp'), createTree = require('./create-tree'), relativePath = function(to) { return path.relative(process.cwd(), to); }; diff --git a/lib/create-tree.js b/lib/create-tree.js index e31a39d..5b223b6 100644 --- a/lib/create-tree.js +++ b/lib/create-tree.js @@ -3,7 +3,6 @@ var fs = require('fs'), path = require('path'), mkdirp = require('mkdirp'), - Promise = require('pinkie-promise'), relativePath = function(to) { return path.relative(process.cwd(), to); }; function walk(tree, root, options) { diff --git a/lib/create.js b/lib/create.js index 222ff83..a297ba9 100644 --- a/lib/create.js +++ b/lib/create.js @@ -10,8 +10,7 @@ var path = require('path'), braceExpansion = require('brace-expansion'), createEntity = require('./create-entity'), getTemplate = require('./template'), - uniq = require('uniq'), - Promise = require('pinkie-promise'); + uniq = require('uniq'); module.exports = function create(entities, levels, techs, options) { options || (options = {}); diff --git a/package.json b/package.json index 4be0d32..6819cb6 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "@bem/sdk.naming.entity.stringify": "^1.1.1", "brace-expansion": "^1.1.6", "mkdirp": "^0.5.1", - "pinkie-promise": "^2.0.1", "uniq": "^1.0.1" }, "devDependencies": { From 10e607e42a6771bfc238518749525b9f33245e30 Mon Sep 17 00:00:00 2001 From: Vladimir Grinenko Date: Wed, 12 Sep 2018 01:22:23 +0300 Subject: [PATCH 3/7] fixup! WIP --- package.json | 1 + test/test.js | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 6819cb6..520421f 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@bem/sdk.entity-name": "^0.2.10", "@bem/sdk.naming.entity": "^0.2.10", "@bem/sdk.naming.entity.stringify": "^1.1.1", + "@bem/sdk.naming.presets": "^0.2.2", "brace-expansion": "^1.1.6", "mkdirp": "^0.5.1", "uniq": "^1.0.1" diff --git a/test/test.js b/test/test.js index 2e01b1d..997c5c6 100644 --- a/test/test.js +++ b/test/test.js @@ -5,7 +5,8 @@ const path = require('path'); const mkdirp = require('mkdirp'); const rimraf = require('rimraf'); const create = require('..'); -const naming = require('@bem/naming'); +const namingStringify = require('@bem/sdk.naming.entity.stringify'); +const namingPresets = require('@bem/sdk.naming.presets'); const EOL = require('os').EOL; const assert = require('assert'); const stream = require('stream'); @@ -15,7 +16,9 @@ const initialCwd = process.cwd(); const templates = { css: function(entity, namingScheme) { - const className = typeof entity === 'string' ? entity : naming(namingScheme).stringify(entity); + const className = typeof entity === 'string' ? + entity : + namingStringify(namingScheme || namingPresets.origin)(entity); return [ '.' + className + ' {', @@ -82,14 +85,14 @@ describe('bem-tools-create', () => { }); it('should create an block modifier using `nested` scheme and default naming', () => { - return testEntityHelper([{ block: 'b', modName: 'm', modVal: 'v' }], [tmpDir], ['css'], {}, [{ + return testEntityHelper([{ block: 'b', mod: { name: 'm', val: 'v' } }], [tmpDir], ['css'], {}, [{ name: path.join(tmpDir, 'b', '_m', 'b_m_v.css'), content: templates.css('b_m_v') }]); }); it('should create an element modifier using `nested` scheme and default naming', () => { - return testEntityHelper([{ block: 'b', elem: 'e', modName: 'em', modVal: 'ev' }], [tmpDir], ['css'], {}, [{ + return testEntityHelper([{ block: 'b', elem: 'e', mod: { name: 'em', val: 'ev' } }], [tmpDir], ['css'], {}, [{ name: path.join(tmpDir, 'b', '__e', '_em', 'b__e_em_ev.css'), content: templates.css('b__e_em_ev') }]); @@ -111,7 +114,7 @@ describe('bem-tools-create', () => { describe('custom options', () => { it('should create entities with naming from config', () => { - const entity = { block: 'b', elem: 'e1', modName: 'm1', modVal: 'v1' }; + const entity = { block: 'b', elem: 'e1', mod: { name: 'm1', val: 'v1' } }; const namingScheme = { delims: { elem: '-', @@ -126,7 +129,7 @@ describe('bem-tools-create', () => { }); it('should create blocks with scheme from config', () => { - const entity = { block: 'b', elem: 'e1', modName: 'm1', modVal: 'v1' }; + const entity = { block: 'b', elem: 'e1', mod: { name: 'm1', val: 'v1' } }; return testEntityHelper([entity], [tmpDir], ['css'], { defaults: { scheme: 'flat' } }, [{ name: path.join(tmpDir, 'b__e1_m1_v1.css'), @@ -161,7 +164,7 @@ describe('bem-tools-create', () => { it('should create entities on levels with provided config', () => { const levels = [path.join(tmpDir, 'l1'), path.join(tmpDir, 'l2')]; - const entity = { block: 'b', elem: 'e1', modName: 'm1', modVal: 'v1' }; + const entity = { block: 'b', elem: 'e1', mod: { name: 'm1', val: 'v1' } }; const namingScheme = { delims: { elem: '-', From a20b28f8a2284c7f1b2c4cb3421f943d63761a19 Mon Sep 17 00:00:00 2001 From: Vladimir Grinenko Date: Wed, 12 Sep 2018 02:46:40 +0300 Subject: [PATCH 4/7] package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 520421f..6d72b70 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,10 @@ "author": "", "license": "MPL-2.0", "dependencies": { - "@bem/fs-scheme": "^2.2.0", "@bem/sdk.cell": "^0.2.8", "@bem/sdk.config": "0.0.10", "@bem/sdk.entity-name": "^0.2.10", + "@bem/sdk.naming.cell.stringify": "0.0.11", "@bem/sdk.naming.entity": "^0.2.10", "@bem/sdk.naming.entity.stringify": "^1.1.1", "@bem/sdk.naming.presets": "^0.2.2", From cb26b9b69a457d958f29552466c189a0ee190ae5 Mon Sep 17 00:00:00 2001 From: Vladimir Grinenko Date: Wed, 12 Sep 2018 02:46:52 +0300 Subject: [PATCH 5/7] BAD WRONG WIP --- lib/create.js | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/lib/create.js b/lib/create.js index a297ba9..bc46a41 100644 --- a/lib/create.js +++ b/lib/create.js @@ -4,7 +4,7 @@ var path = require('path'), bemConfig = require('@bem/sdk.config'), BemEntityName = require('@bem/sdk.entity-name'), BemCell = require('@bem/sdk.cell'), - scheme = require('@bem/fs-scheme'), + bemNamingCellStringify = require('@bem/sdk.naming.cell.stringify'), bemNamingParse = require('@bem/sdk.naming.entity.parse'), bemNamingPresets = require('@bem/sdk.naming.presets'), braceExpansion = require('brace-expansion'), @@ -60,9 +60,7 @@ module.exports = function create(entities, levels, techs, options) { return config.level(level).then(function(levelOptions) { levelOptions || (levelOptions = {}); - var levelScheme = levelOptions.scheme, - buildPath = scheme(levelScheme).path, - currentTechs = uniq([].concat(levelOptions.techs || [], techs)), + var currentTechs = uniq([].concat(levelOptions.techs || [], techs)), entity; if (isFileGlob) { @@ -101,10 +99,24 @@ module.exports = function create(entities, levels, techs, options) { })); return Promise.all(currentTechs.map(function(tech) { - var pathToFile = buildPath( - new BemCell({ entity: entity, tech: tech }), - levelOptions.schemeOptions || levelOptions), - absPathToFile = path.join(path.resolve(level), pathToFile), + // fixme here!!! + var schemeOptions = Object.assign({}, bemNamingPresets.origin, + levelOptions, levelOptions.naming, + levelOptions.scheme ? { fs: { scheme: levelOptions.scheme } } : {}, + levelOptions.schemeOptions); + + // FIXME: hardcode! + schemeOptions.fs.pattern = '${layer}/${entity}.${tech}'; + var pathToFile = bemNamingCellStringify(schemeOptions)( + new BemCell({ + entity: entity, + tech: tech, + layer: path.relative(process.cwd(), level) + }) + ), + + // FIXME: hardcode about `common`!!! + absPathToFile = path.resolve(pathToFile.replace(/^common\//, '')), template = options.fileContent || getTemplate(tech, levelOptions); levelOptions.forceRewrite = options.forceRewrite; From d5657faf3d4e1f45b489b555607b3ffe592a2d44 Mon Sep 17 00:00:00 2001 From: Vladimir Grinenko Date: Wed, 12 Sep 2018 11:29:00 +0300 Subject: [PATCH 6/7] New naming configs --- lib/create.js | 19 ++++++------------- test/test.js | 8 ++++++-- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/lib/create.js b/lib/create.js index bc46a41..13e4df2 100644 --- a/lib/create.js +++ b/lib/create.js @@ -61,17 +61,16 @@ module.exports = function create(entities, levels, techs, options) { levelOptions || (levelOptions = {}); var currentTechs = uniq([].concat(levelOptions.techs || [], techs)), - entity; + naming = typeof levelOptions.naming === 'string' ? + bemNamingPresets[levelOptions.naming] : + Object.assign({}, bemNamingPresets.origin, levelOptions.naming); if (isFileGlob) { var file = path.basename(filepathOrInput), // split for entity key and tech (by first dot) match = file.match(/^([^.]+)(?:\.(.+))?$/), - naming = typeof levelOptions.naming === 'string' ? - bemNamingPresets[levelOptions.naming] : - levelOptions.naming || bemNamingPresets.origin; + entity = bemNamingParse(naming)(match[1]); - entity = bemNamingParse(naming)(match[1]); if (match[2]) { currentTechs = uniq(techs.concat(match[2])); } @@ -99,15 +98,9 @@ module.exports = function create(entities, levels, techs, options) { })); return Promise.all(currentTechs.map(function(tech) { - // fixme here!!! - var schemeOptions = Object.assign({}, bemNamingPresets.origin, - levelOptions, levelOptions.naming, - levelOptions.scheme ? { fs: { scheme: levelOptions.scheme } } : {}, - levelOptions.schemeOptions); - // FIXME: hardcode! - schemeOptions.fs.pattern = '${layer}/${entity}.${tech}'; - var pathToFile = bemNamingCellStringify(schemeOptions)( + naming.fs.pattern = '${layer}/${entity}.${tech}'; + var pathToFile = bemNamingCellStringify(naming)( new BemCell({ entity: entity, tech: tech, diff --git a/test/test.js b/test/test.js index 997c5c6..f93de86 100644 --- a/test/test.js +++ b/test/test.js @@ -131,7 +131,7 @@ describe('bem-tools-create', () => { it('should create blocks with scheme from config', () => { const entity = { block: 'b', elem: 'e1', mod: { name: 'm1', val: 'v1' } }; - return testEntityHelper([entity], [tmpDir], ['css'], { defaults: { scheme: 'flat' } }, [{ + return testEntityHelper([entity], [tmpDir], ['css'], { defaults: { naming: { fs: { scheme: 'flat' } } } }, [{ name: path.join(tmpDir, 'b__e1_m1_v1.css'), content: templates.css(entity) }]); @@ -180,7 +180,11 @@ describe('bem-tools-create', () => { }, { path: levels[1], - scheme: 'flat' + naming: { + fs: { + scheme: 'flat' + } + } } ] } From c89f96796af203d0b8c3e58f971e0452ef8e42ba Mon Sep 17 00:00:00 2001 From: Vladimir Grinenko Date: Wed, 12 Sep 2018 12:34:58 +0300 Subject: [PATCH 7/7] works fine so far --- README.ru.md | 21 +++++++++------------ cli.js | 1 + lib/create.js | 14 ++++++++++---- package.json | 8 ++++---- test/test.js | 2 +- 5 files changed, 25 insertions(+), 21 deletions(-) diff --git a/README.ru.md b/README.ru.md index 3ad345a..dca29aa 100644 --- a/README.ru.md +++ b/README.ru.md @@ -332,11 +332,8 @@ module.exports = { levels: [ { path: 'level1', - // Смотри https://ru.bem.info/toolbox/sdk/bem-fs-scheme/ - scheme: 'nested', - schemeOptions: 'react' - // Смотри https://ru.bem.info/toolbox/sdk/bem-naming/#В-стиле-Гарри-Робертса + // Смотри https://github.com/bem/bem-sdk/tree/master/packages/naming.presets naming: 'two-dashes' }, @@ -350,8 +347,6 @@ module.exports = { { path: 'path/to/level2', - // Значение по умолчанию, можно не указывать - scheme: 'nested', // Смотри https://ru.bem.info/toolbox/sdk/bem-naming/#Собственный-стиль naming: { @@ -359,6 +354,12 @@ module.exports = { elem: '-', mod: { name: '--', val: '_' } }, + // Значение по умолчанию, можно не указывать + fs: { + delims: { elem: '__', mod: '_' }, + pattern: '${layer?${layer}.}blocks/${entity}.${tech}', + scheme: 'nested' + }, wordPattern: '[a-zA-Z0-9]+' } } @@ -417,16 +418,14 @@ module.exports = { В корне конфигурационного файла можно задать [схему именования](https://ru.bem.info/toolbox/sdk/bem-naming/) БЭМ-сущностей (см. [соглашение по именованию](https://ru.bem.info/methodology/naming-convention/#Соглашение-по-именованию-css-селекторов)) и -[схему файловой структруры](https://ru.bem.info/toolbox/sdk/bem-fs-scheme/) -(значение по умолчанию `nested`). +[схему файловой структруры](https://github.com/bem/bem-sdk/tree/master/packages/naming.cell.stringify) +(значение по умолчанию `fs: { delims: { elem: '__', mod: '_' }, pattern: '${layer?${layer}.}blocks/${entity}.${tech}', scheme: 'nested' }`). ```js module.exports = { levels: [ { path: 'level1', - // Смотри https://ru.bem.info/toolbox/sdk/bem-fs-scheme/ - scheme: 'flat', // Смотри https://ru.bem.info/toolbox/sdk/bem-naming/#В-стиле-Гарри-Робертса naming: 'two-dashes' @@ -442,8 +441,6 @@ module.exports = { { path: 'path/to/level2', - // Значение по умолчанию, можно не указывать - scheme: 'nested', // Смотри https://ru.bem.info/toolbox/sdk/bem-naming/#Собственный-стиль naming: { diff --git a/cli.js b/cli.js index 6d6bd51..6279d7c 100644 --- a/cli.js +++ b/cli.js @@ -4,6 +4,7 @@ var create = require('./'); function noOp() {} +/* eslint indent: "off" */ module.exports = function() { this .title('Create BEM entity').helpful() diff --git a/lib/create.js b/lib/create.js index 13e4df2..4cef5ef 100644 --- a/lib/create.js +++ b/lib/create.js @@ -61,15 +61,23 @@ module.exports = function create(entities, levels, techs, options) { levelOptions || (levelOptions = {}); var currentTechs = uniq([].concat(levelOptions.techs || [], techs)), + entity, naming = typeof levelOptions.naming === 'string' ? bemNamingPresets[levelOptions.naming] : Object.assign({}, bemNamingPresets.origin, levelOptions.naming); + // NOTICE: for backward compatibility only + // should be eventually removed + if (!levelOptions.naming || !levelOptions.naming.fs || !levelOptions.naming.fs.pattern) { + naming.fs.pattern = '${layer}/${entity}.${tech}'; + } + if (isFileGlob) { var file = path.basename(filepathOrInput), // split for entity key and tech (by first dot) - match = file.match(/^([^.]+)(?:\.(.+))?$/), - entity = bemNamingParse(naming)(match[1]); + match = file.match(/^([^.]+)(?:\.(.+))?$/); + + entity = bemNamingParse(naming)(match[1]); if (match[2]) { currentTechs = uniq(techs.concat(match[2])); @@ -98,8 +106,6 @@ module.exports = function create(entities, levels, techs, options) { })); return Promise.all(currentTechs.map(function(tech) { - // FIXME: hardcode! - naming.fs.pattern = '${layer}/${entity}.${tech}'; var pathToFile = bemNamingCellStringify(naming)( new BemCell({ entity: entity, diff --git a/package.json b/package.json index 6d72b70..8b66fb1 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,9 @@ "uniq": "^1.0.1" }, "devDependencies": { - "eslint": "^3.16.0", - "eslint-config-pedant": "^0.8.0", - "mocha": "^3.1.0", - "rimraf": "^2.5.4" + "eslint": "^5.5.0", + "eslint-config-pedant": "^1.0.1", + "mocha": "^5.2.0", + "rimraf": "^2.6.2" } } diff --git a/test/test.js b/test/test.js index f93de86..0b04b0f 100644 --- a/test/test.js +++ b/test/test.js @@ -65,8 +65,8 @@ describe('bem-tools-create', () => { beforeEach(() => mkdirp.sync(tmpDir)); afterEach(() => { - rimraf.sync(tmpDir); process.chdir(initialCwd); + rimraf.sync(tmpDir); }); describe('default scheme and default naming', () => {