From 310b54ef2c0f96e61280a90e5727224baeb0da78 Mon Sep 17 00:00:00 2001 From: IllusionMH Date: Sat, 9 Feb 2019 23:21:37 +0200 Subject: [PATCH] create-rule task also updates README (fixed #816) --- build-tasks/common/readme-rules.js | 30 ++++++++++++++++++- build-tasks/create-rule.js | 13 ++++++-- .../templates/readme-rule-entry.template.js | 8 +++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 build-tasks/templates/readme-rule-entry.template.js diff --git a/build-tasks/common/readme-rules.js b/build-tasks/common/readme-rules.js index 2fe9c4f5b..d9971c93b 100644 --- a/build-tasks/common/readme-rules.js +++ b/build-tasks/common/readme-rules.js @@ -17,6 +17,34 @@ function getAllRules() { return rules; } +function addNewRule(name, ruleMarkup) { + let match; + let insertPosition; + + while ((match = praseRe.exec(readmeContent))) { + const existingName = match[1]; + // Looks for first rule that should follow new rule. + // Match position will be used to insert new rule row + if (name < existingName) { + insertPosition = match.index; + break; + } + } + + // In case when new rule should be added to the end of the table - look for insret position before + if (insertPosition === undefined) { + insertPosition = readmeContent.match(/\s+<\/tbody>\s+<\/table>/).index; + } + const contentBeforeNewRule = readmeContent.slice(0, insertPosition); + const contentAfterNewRule = readmeContent.slice(insertPosition); + const newContent = contentBeforeNewRule + ruleMarkup + contentAfterNewRule; + writeFile(README_NAME, newContent); + + // To position cursor on the same line with new rule name should add 3 lines to match lines added with template + return `./${README_NAME}:${contentBeforeNewRule.split('\n').length + 3}`; +} + module.exports = { - getAllRules + getAllRules, + addNewRule }; diff --git a/build-tasks/create-rule.js b/build-tasks/create-rule.js index 830d6bc41..f982dcc6b 100644 --- a/build-tasks/create-rule.js +++ b/build-tasks/create-rule.js @@ -4,6 +4,8 @@ const fs = require('fs'); const inquirer = require('inquirer'); const path = require('path'); const { writeFile } = require('./common/files'); +const readmeTemplate = require('./templates/readme-rule-entry.template'); +const { addNewRule } = require('./common/readme-rules'); const questions = [ { @@ -88,13 +90,15 @@ const questions = [ inquirer.prompt(questions).then(answers => { const sourceFileName = createImplementationFile(answers); const testFileNames = createTestFiles(answers); + const readmePosition = createReadmeEntry(answers); console.log(`Rule '${answers.name}' created.`); console.log(`Source file: ${sourceFileName}`); - console.log(`Test files: ${testFileNames.join(', ')}`); + console.log(`Test files: ${testFileNames.join(' ')}`); + console.log(`README.md entry: ${readmePosition}`); // Attempt to open the files in the current editor. - tryOpenFiles([...testFileNames, sourceFileName]); + tryOpenFiles([...testFileNames, sourceFileName, readmePosition]); }); function createImplementationFile(answers) { @@ -139,6 +143,11 @@ function createTestFiles(answers) { return testFiles; } +function createReadmeEntry(answers) { + const content = readmeTemplate(answers); + return addNewRule(answers.name, content); +} + function camelCase(input) { return input.toLowerCase().replace(/-(.)/g, (match, group1) => group1.toUpperCase()); } diff --git a/build-tasks/templates/readme-rule-entry.template.js b/build-tasks/templates/readme-rule-entry.template.js new file mode 100644 index 000000000..657ebd0aa --- /dev/null +++ b/build-tasks/templates/readme-rule-entry.template.js @@ -0,0 +1,8 @@ +module.exports = ({ name, description }) => ` + + + ${name} + + ${description} + @next + `;