diff --git a/_config.yml b/_config.yml index fe8530028..dc892a3ab 100644 --- a/_config.yml +++ b/_config.yml @@ -109,3 +109,22 @@ descriptions: "contributor-guide/development-environment": What you need to do to start developing for sonar "contributor-guide/index.md": Learn about the different pieces that build sonarwhal and what each one of them does +categories: + accessibility: + description: Is your site usable via the keyboard? Does your content have enough contrast to be read without issues? Everyone should enjoy your content. Let us help you! + name: Accessibility + development: + description: "Web developers use a wide variety of tools: bundlers, transpilers, optimizers... But sometimes there can be problems when using them together or the configuration might not be the most optimal. Let us take care of this for you!" + name: Development + interoperability: + description: The web has been around for decades and it can be accessed from many different devices and form factors, old and new. These rules help you make your sites more interoperable so your users can have a better experience no matter how they visit you. + name: Interoperability + pwa: + description: Progressive Web Apps allow your users to have a more immersive experience within your site. Make sure your PWA looks the best no matter the platform of your users. + name: PWA + performance: + description: No one likes to wait while a website loads. Validate that you are using the right compression, cache strategy and more to make your site (re)load faster. + name: Performance + security: + description: Browsers are one of the main vectors for attacks. The web platform has many features that allow you to mitigate the risks. Are you doing everything you can to keep your users safe? + name: Security \ No newline at end of file diff --git a/helpers/update-content.js b/helpers/update-content.js index d47366535..44e228357 100644 --- a/helpers/update-content.js +++ b/helpers/update-content.js @@ -1,31 +1,177 @@ /* global config cp exec ls mv rm */ +const _ = require('lodash'); +const getDirname = require('path').dirname; +const mkdirp = require('mkdirp'); +const os = require('os'); const shell = require('shelljs/global'); // eslint-disable-line no-unused-vars +const fs = require('fs'); +const path = require('path'); +const yamlLoader = require('js-yaml'); + +const configDir = path.resolve(__dirname, '..', '_config.yml'); +const hexoConfig = yamlLoader.safeLoad(fs.readFileSync(configDir, 'utf8')); // eslint-disable-line no-sync const CLONE_URL = 'https://github.com/sonarwhal/sonarwhal.git'; // eslint-disable-line no-process-env -const SOURCE_DIR = 'src/content'; +const DEST_DIR = 'src/content'; +const DEST_RULES_DIR = `${DEST_DIR}/docs/user-guide/rules`; +const DATA_DIR = `${DEST_DIR}/_data`; const TMP_DIR = require('./mktemp')(); const PACKAGES_TMP_DIR = `${TMP_DIR}/packages`; +const categories = {}; + +const processRule = (rule, isSummary) => { + const processedRule = { + /* + * For packages with multiple rules we have a summary + * file with how to install and links to all the rules. + * This property is used to not take into account in + * the rule index page total. + */ + isSummary: isSummary === true, + link: `/docs/user-guide/rules/${rule}/`, + name: rule.replace(/^rule-/, '') + }; + + return processedRule; +}; + +/** + * Process catogories to be suitable for Handlebars templating. + * Before: { performance: ['rule-amp-validator'] } + * After: + * [{ + * name: 'performance', + * rules: [{ + * link: 'rule-amp-validator/', + * name: 'amp-validator' + * }] + * }] + */ +const processCategories = (cats) => { + const processedCategories = _.reduce(cats, (allCategories, category) => { + const includedRules = category.rules; + + const singleRules = includedRules.filter((ruleName) => { + return !ruleName.includes('/'); + }); + + /* + * Rules with id: package-name/rule-name will be + * considered part of a package with multiple rules + */ + const multiRules = includedRules.filter((ruleName) => { + return ruleName.includes('/'); + }); + + /* + * Group rules by package name. + */ + const packagesName = _.groupBy(multiRules, (ruleName) => { + return ruleName.split('/')[0]; + }); + + const rules = _.map(singleRules, processRule); + + const multiRulesProcessed = _.reduce(packagesName, (multi, values, key) => { + // Add an item with the link to the package with multiple rules itself. + const partial = processRule(key, true); + + multi.push(partial); + + // Add an item for each individual rule for a package with multiple rules. + return multi.concat(_.map(values, processRule)); + }, []); + + const processedCategory = { + description: category.description, + link: `/docs/user-guide/rules/${category.name}/`, + name: category.name, + rules: rules.concat(multiRulesProcessed) + }; + + allCategories.push(processedCategory); + + return allCategories; + }, []); + + return { categories: processedCategories }; +}; config.fatal = true; exec(`git clone ${CLONE_URL} "${TMP_DIR}"`); -rm('-rf', `${SOURCE_DIR}/docs/contributor-guide`); -rm('-rf', `${SOURCE_DIR}/docs/user-guide`); -rm('-rf', `${SOURCE_DIR}/about`); +rm('-rf', `${DEST_DIR}/docs/contributor-guide`); +rm('-rf', `${DEST_DIR}/docs/user-guide`); +rm('-rf', `${DEST_DIR}/about`); + +cp('-R', `${PACKAGES_TMP_DIR}/sonarwhal/docs/contributor-guide`, `${DEST_DIR}/docs/contributor-guide`); +cp('-R', `${PACKAGES_TMP_DIR}/sonarwhal/docs/user-guide`, `${DEST_DIR}/docs/user-guide`); +cp('-R', `${PACKAGES_TMP_DIR}/sonarwhal/docs/about`, `${DEST_DIR}`); +cp(`${PACKAGES_TMP_DIR}/sonarwhal/CHANGELOG.md`, `${DEST_DIR}/about`); + +const ruleDocs = ls('-R', `${PACKAGES_TMP_DIR}/rule-*/{README.md,/docs/*.md}`); +const rules = ls('-R', `${PACKAGES_TMP_DIR}/rule-*/src/!(index).ts`); + +// Create folder if not exist before writing file. +// Reference: https://stackoverflow.com/a/16317628 +const safeWriteFile = (dir, content) => { + const folderPath = getDirname(dir); + + mkdirp.sync(folderPath); + fs.writeFileSync(dir, content); // eslint-disable-line no-sync +}; + +// Get rule documentations. +ruleDocs.forEach((ruleDocPath) => { + const ruleDocPathSplitted = ruleDocPath.split('/').reverse(); + let ruleName; + + if (ruleDocPathSplitted[1] === 'docs') { + ruleName = `${ruleDocPathSplitted[2]}/${ruleDocPathSplitted[0].replace('.md', '')}`; -cp('-R', `${PACKAGES_TMP_DIR}/sonarwhal/docs/contributor-guide`, `${SOURCE_DIR}/docs/contributor-guide`); -cp('-R', `${PACKAGES_TMP_DIR}/sonarwhal/docs/user-guide`, `${SOURCE_DIR}/docs/user-guide`); -cp('-R', `${PACKAGES_TMP_DIR}/sonarwhal/docs/about`, `${SOURCE_DIR}`); -cp(`${PACKAGES_TMP_DIR}/sonarwhal/CHANGELOG.md`, `${SOURCE_DIR}/about`); + mkdirp.sync(path.join(process.cwd(), DEST_RULES_DIR, path.dirname(ruleName))); + } else { + ruleName = ruleDocPathSplitted[1]; + } -const rules = ls('-R', `${PACKAGES_TMP_DIR}/rule-*/README.md`); + const destRuleDocPath = `${DEST_RULES_DIR}/${ruleName}.md`; + mv(ruleDocPath, destRuleDocPath); +}); + +// Get category information of rules. rules.forEach((rulePath) => { - const ruleName = rulePath.split('/').reverse()[1]; - const destRulePath = `${SOURCE_DIR}/docs/user-guide/rules/${ruleName}.md`; + const ruleContent = fs.readFileSync(rulePath, 'utf8'); // eslint-disable-line no-sync + const ruleNameRegex = /id:\s*'([^']*)'/; + const ruleNameMatch = ruleContent.match(ruleNameRegex); + const categoryRegex = /category:\s*Category\.([a-z]*)/; + const categoryMatch = ruleContent.match(categoryRegex); + + // If we don't find the category or the name, we will assume that it is not a rule. + if (categoryMatch && ruleNameMatch) { + const category = categoryMatch.pop(); + const ruleName = `rule-${ruleNameMatch.pop()}`; + + if (categories[category]) { + categories[category].rules.push(ruleName); + } else { + categories[category] = { + description: hexoConfig.categories[category].description, + name: hexoConfig.categories[category].name, + rules: [ruleName] + }; + } + } +}); + +// Generate JSON file that contains the category-rule information. +const processedCategories = processCategories(categories); + +fs.writeFileSync(`${DATA_DIR}/categories.json`, JSON.stringify(processedCategories), 'utf8'); //eslint-disable-line no-sync - mv(rulePath, destRulePath); +processedCategories.categories.forEach((category) => { + safeWriteFile(`${DEST_RULES_DIR}/${category.name}/index.md`, `# ${category.name}${os.EOL}`); }); rm('-rf', TMP_DIR); diff --git a/helpers/updater.js b/helpers/updater.js index 7af0fbaee..253540a15 100644 --- a/helpers/updater.js +++ b/helpers/updater.js @@ -136,6 +136,12 @@ const generateFrontMatterInfo = (filePath, title, description, currentFrontMatte tocTitle: tocTitle ? tocTitle.replace(/-/g, ' ') : tocTitle }; + if (originalFile.endsWith('index.md')) { + newFrontMatter.contentType = 'index'; + } else { + newFrontMatter.contentType = 'details'; + } + const finalFrontMatterData = _.assign(newFrontMatter, existingFrontMatter); // Override frontmatter if there are existing frontmatter values. diff --git a/package-lock.json b/package-lock.json index 34900317b..a6a8cacf9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", - "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "integrity": "sha1-UkryQNGjYFJ7cwR17PoTRKpUDd4=", "dev": true, "requires": { "call-me-maybe": "1.0.1", @@ -174,7 +174,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -193,7 +193,7 @@ "ansi-colors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "integrity": "sha1-Y3S03V1HGP884npnGjscrQdxMqk=", "dev": true, "requires": { "ansi-wrap": "0.1.0" @@ -255,7 +255,7 @@ "anymatch": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", "requires": { "micromatch": "2.3.11", "normalize-path": "2.1.1" @@ -493,7 +493,7 @@ "array-sort": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", + "integrity": "sha1-5MBTVkU/VvU1EqfR1hI/LFTAqIo=", "dev": true, "requires": { "default-compare": "1.0.0", @@ -504,7 +504,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", "dev": true } } @@ -983,7 +983,7 @@ "boxen": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "integrity": "sha1-VcbDmouljZxhrSLNh3Uy3rZlogs=", "requires": { "ansi-align": "2.0.0", "camelcase": "4.1.0", @@ -1002,7 +1002,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "requires": { "color-convert": "1.9.0" } @@ -1015,7 +1015,7 @@ "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", @@ -1035,7 +1035,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -1052,7 +1052,7 @@ "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", "requires": { "has-flag": "3.0.0" } @@ -2029,7 +2029,7 @@ "cosmiconfig": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-4.0.0.tgz", - "integrity": "sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==", + "integrity": "sha1-dgORVJWAu9LfHlYrwXexPCkJctw=", "dev": true, "requires": { "is-directory": "0.3.1", @@ -2061,7 +2061,7 @@ "cross-env": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.4.tgz", - "integrity": "sha512-Mx8mw6JWhfpYoEk7PGvHxJMLQwQHORAs8+2bX+C1lGQ4h3GkDb1zbzC2Nw85YH9ZQMlO0BHZxMacgrfPmMFxbg==", + "integrity": "sha1-9hwUKR98xlO7hkVwAuqAoEaZ0CI=", "dev": true, "requires": { "cross-spawn": "5.1.0", @@ -2674,7 +2674,7 @@ "default-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", + "integrity": "sha1-y2ETGESthNhHiPto/QFoHKd4Gi8=", "dev": true, "requires": { "kind-of": "5.1.0" @@ -2683,7 +2683,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", "dev": true } } @@ -2832,7 +2832,7 @@ "dir-glob": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "integrity": "sha1-CyBdK2rvmCOMooZZioIE0p0KADQ=", "dev": true, "requires": { "arrify": "1.0.1", @@ -2842,7 +2842,7 @@ "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "integrity": "sha1-zvMdyOCho7sNEFwM2Xzzv0f0428=", "dev": true, "requires": { "pify": "3.0.0" @@ -2922,7 +2922,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", "requires": { "is-obj": "1.0.1" } @@ -3383,7 +3383,7 @@ "envify": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", - "integrity": "sha512-IKRVVoAYr4pIx4yIWNsz9mOsboxlNXiu7TNBnem/K/uTHdkyzXWDzHCK7UTolqBbgaBz0tQHsD3YNls0uIIjiw==", + "integrity": "sha1-85rT251oAbTmtHi2ECjT8LaBn34=", "requires": { "esprima": "4.0.0", "through": "2.3.8" @@ -3628,7 +3628,7 @@ "esprima": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=" }, "esquery": { "version": "1.0.0", @@ -4554,7 +4554,7 @@ "braces": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", "dev": true, "requires": { "arr-flatten": "1.1.0", @@ -4594,7 +4594,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "dev": true, "requires": { "is-descriptor": "1.0.2", @@ -4637,7 +4637,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", @@ -4648,7 +4648,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", "dev": true } } @@ -4666,7 +4666,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -4677,7 +4677,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "dev": true, "requires": { "array-unique": "0.3.2", @@ -4811,7 +4811,7 @@ "is-odd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", "dev": true, "requires": { "is-number": "4.0.0" @@ -4820,7 +4820,7 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", "dev": true } } @@ -4828,7 +4828,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", "dev": true }, "isobject": { @@ -4840,7 +4840,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", "dev": true }, "micromatch": { @@ -4867,7 +4867,7 @@ "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", "dev": true, "requires": { "arr-diff": "4.0.0", @@ -6477,13 +6477,13 @@ "globals": { "version": "9.18.0", "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", "dev": true }, "globby": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", - "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "integrity": "sha1-ta1IuKqAs1uBT8EoHsyFHx0rW1A=", "dev": true, "requires": { "array-union": "1.0.2", @@ -6498,7 +6498,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -6587,7 +6587,7 @@ "gonzales-pe": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.2.3.tgz", - "integrity": "sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw==", + "integrity": "sha1-QQkXA2JUMyheCu46pHgp/B++tvI=", "dev": true, "requires": { "minimist": "1.1.3" @@ -6916,7 +6916,7 @@ "gulp-clean-css": { "version": "3.9.3", "resolved": "https://registry.npmjs.org/gulp-clean-css/-/gulp-clean-css-3.9.3.tgz", - "integrity": "sha512-mw5Qrio7W3rvswmVlZ7eaxOhBIp6zQMBFLgcHoi/xbOtaKT5zmElkHt8mvbRre7fMt5eLgppIkW+j9Cm+O/UqQ==", + "integrity": "sha1-R7961i9Elw+G5KxL3u1orZBOZcU=", "dev": true, "requires": { "clean-css": "4.1.11", @@ -6953,7 +6953,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -6962,7 +6962,7 @@ "plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "integrity": "sha1-dwFr2JGdCsN3/c3QMiMolTyleBw=", "dev": true, "requires": { "ansi-colors": "1.1.0", @@ -6982,7 +6982,7 @@ "gulp-cli": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz", - "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==", + "integrity": "sha1-eEfiIMs2YvK+im1XK/FOF75amUs=", "dev": true, "requires": { "ansi-colors": "1.1.0", @@ -7538,7 +7538,7 @@ "gulp-rev-replace": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/gulp-rev-replace/-/gulp-rev-replace-0.4.4.tgz", - "integrity": "sha512-2yiDel/TGamn/HgHyo8H1rYEEL2zLsOYODerItoX8batOo0gPAe7uX7t6NlaqB7FEHpS5tGzUr5CKUEmrgdHyQ==", + "integrity": "sha1-lpaFQTECS68mQBCx9R/4oTgquUo=", "dev": true, "requires": { "plugin-error": "0.1.2", @@ -8615,7 +8615,7 @@ "hexo-bunyan": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/hexo-bunyan/-/hexo-bunyan-1.0.0.tgz", - "integrity": "sha512-RymT8Ck+K77mLt9BEYNb4uyfC7RIQnU5N3laXowMrS28jj2h89VHJCOnhV00mmta4fHRqNa07kP1Hrn17nvMkQ==", + "integrity": "sha1-shBrJlR7Iy8BlduGPLXV/4Un/TY=", "requires": { "moment": "2.21.0", "mv": "2.1.1", @@ -8625,7 +8625,7 @@ "hexo-cli": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hexo-cli/-/hexo-cli-1.1.0.tgz", - "integrity": "sha512-IWQPppwgmj1iBUcP5mpcMg3Tre6a8Qlr8ejXw6naZiJNSepSgh4mS3KiNPKDa2qQIgPDqJYJzNVFLw+RLA9CkA==", + "integrity": "sha1-SW0jjUZG2/0c8Ee23FJxv7XLeY8=", "requires": { "abbrev": "1.1.1", "bluebird": "3.5.0", @@ -8666,7 +8666,7 @@ "hexo-fs": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/hexo-fs/-/hexo-fs-0.2.2.tgz", - "integrity": "sha512-boZoDQYieQJJ4drW40B5XI1Tol/ucEGXSV2qjVWI51NsGbFTNw0PBIZjwSs2rum6QnJIYw50K7uBTo8WXGp/aw==", + "integrity": "sha1-C5e3n2jfEh92XRKRuOkPrjJtAA4=", "requires": { "bluebird": "3.5.0", "chokidar": "1.7.0", @@ -8703,7 +8703,7 @@ "hexo-log": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/hexo-log/-/hexo-log-0.2.0.tgz", - "integrity": "sha512-fzoc+GQexxPPILTjoOQILnA3ZG2MFgqMBVel4xvJ11pXptw9+f97ynTgDAExXafyp9Nz2ChXRuqlCYgPtZSlxQ==", + "integrity": "sha1-0w/UXhoSqDyIAzWGZASF78XfWm8=", "requires": { "chalk": "1.1.3", "hexo-bunyan": "1.0.0" @@ -9810,7 +9810,7 @@ "js-base64": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.3.tgz", - "integrity": "sha512-H7ErYLM34CvDMto3GbD6xD0JLUGYXR3QTcH6B/tr4Hi/QpSThnCsIp+Sy5FRTw3B0d6py4HcNkW7nO/wdtGWEw==", + "integrity": "sha1-LlRewrDylX9BNWUQIFIU6Y+tZYI=", "dev": true }, "js-tokens": { @@ -9822,7 +9822,7 @@ "js-yaml": { "version": "3.11.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "integrity": "sha1-WXwai9VxUvJtYizkEXhRpR9euu8=", "requires": { "argparse": "1.0.9", "esprima": "4.0.0" @@ -9960,7 +9960,7 @@ "known-css-properties": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.6.1.tgz", - "integrity": "sha512-nQRpMcHm1cQ6gmztdvLcIvxocznSMqH/y6XtERrWrHaymOYdDGroRqetJvJycxGEr1aakXiigDgn7JnzuXlk6A==", + "integrity": "sha1-MbUSOtA9jRo/Nr1BVUWcmBFzR4s=", "dev": true }, "last-run": { @@ -10141,7 +10141,7 @@ "lodash": { "version": "4.17.5", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=" }, "lodash._basecopy": { "version": "3.0.1", @@ -10342,7 +10342,7 @@ "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", "dev": true, "requires": { "chalk": "2.3.2" @@ -10351,7 +10351,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "dev": true, "requires": { "color-convert": "1.9.0" @@ -10360,7 +10360,7 @@ "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", "dev": true, "requires": { "ansi-styles": "3.2.1", @@ -10377,7 +10377,7 @@ "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", "dev": true, "requires": { "has-flag": "3.0.0" @@ -10404,7 +10404,7 @@ "longest-streak": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", + "integrity": "sha1-JCG2upOaRDu5/+v1llhaULTDji4=", "dev": true }, "loud-rejection": { @@ -10690,7 +10690,7 @@ "braces": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", - "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "integrity": "sha1-cIbJE7TloI2+N6wO5qJQDEumkbs=", "dev": true, "requires": { "arr-flatten": "1.1.0", @@ -10730,7 +10730,7 @@ "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "integrity": "sha1-1Flono1lS6d+AqgX+HENcCyxbp0=", "dev": true, "requires": { "is-descriptor": "1.0.2", @@ -10773,7 +10773,7 @@ "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "integrity": "sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco=", "dev": true, "requires": { "is-accessor-descriptor": "0.1.6", @@ -10784,7 +10784,7 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "integrity": "sha1-cpyR4thXt6QZofmqZWhcTDP1hF0=", "dev": true } } @@ -10802,7 +10802,7 @@ "is-extendable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "integrity": "sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ=", "dev": true, "requires": { "is-plain-object": "2.0.4" @@ -10813,7 +10813,7 @@ "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "integrity": "sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM=", "dev": true, "requires": { "array-unique": "0.3.2", @@ -10932,7 +10932,7 @@ "is-odd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", - "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "integrity": "sha1-dkZiRnH9fqVYzNmieVGC8pWPGyQ=", "dev": true, "requires": { "is-number": "4.0.0" @@ -10941,7 +10941,7 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "integrity": "sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8=", "dev": true } } @@ -10949,7 +10949,7 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "integrity": "sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0=", "dev": true }, "isobject": { @@ -10961,7 +10961,7 @@ "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "integrity": "sha1-ARRrNqYhjmTljzqNZt5df8b20FE=", "dev": true }, "micromatch": { @@ -10988,7 +10988,7 @@ "nanomatch": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", - "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "integrity": "sha1-h59xUMstq3pHElkGbBBO7m4Pp8I=", "dev": true, "requires": { "arr-diff": "4.0.0", @@ -11156,7 +11156,7 @@ "merge2": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.1.tgz", - "integrity": "sha512-wUqcG5pxrAcaFI1lkqkMnk3Q7nUxV/NWfpAFSeWUwG9TRODnBDCUHa75mi3o3vLWQ5N4CQERWCauSlP0I3ZqUg==", + "integrity": "sha1-Jx0lFv9S1K9/e3ELi/Phbhg/72Y=", "dev": true }, "methods": { @@ -11232,7 +11232,7 @@ "minimist-options": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "integrity": "sha1-+6TIGRM54T7PTWG+sD8HAQPz2VQ=", "dev": true, "requires": { "arrify": "1.0.1", @@ -11288,7 +11288,7 @@ "moment": { "version": "2.21.0", "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz", - "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==" + "integrity": "sha1-KhFLUdKm7J5tg8+AP4OKh42KAjo=" }, "moment-timezone": { "version": "0.5.14", @@ -11837,7 +11837,7 @@ "nunjucks": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-3.1.2.tgz", - "integrity": "sha512-pJXncV07mmiuIDL9OqdNkcpvifuDMzMq9qBQT9SHasAS7AEwzNp/r/jHNl+9O0+zsldcdWG9ZtXo/nwu2cTqXA==", + "integrity": "sha1-hZRaZruCObs37O+D2rTMHxUqq7k=", "requires": { "a-sync-waterfall": "1.0.0", "asap": "2.0.6", @@ -12338,7 +12338,7 @@ "p-limit": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "integrity": "sha1-DpK2vty1nwIsE9DxlJ3ILRWQnxw=", "dev": true, "requires": { "p-try": "1.0.0" @@ -12879,7 +12879,7 @@ "postcss-reporter": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "integrity": "sha1-oUF3/RNCgp0pFlPyeG79ZxEDMsM=", "dev": true, "requires": { "chalk": "2.3.2", @@ -12891,7 +12891,7 @@ "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", "dev": true, "requires": { "color-convert": "1.9.0" @@ -12900,7 +12900,7 @@ "chalk": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "integrity": "sha1-JQ3JawdJG/1gHmSNZt319gx6XGU=", "dev": true, "requires": { "ansi-styles": "3.2.1", @@ -12917,7 +12917,7 @@ "supports-color": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "integrity": "sha1-WySsFduA+pJ89SJ6SjP9PEx2dsA=", "dev": true, "requires": { "has-flag": "3.0.0" @@ -12943,7 +12943,7 @@ "postcss-sass": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.3.0.tgz", - "integrity": "sha512-nZJEFS2bT007CmzMjlZfZwcZKpSJ/JeFiVEdgrgvGZtAnORU+5BvN0cioNuDAVxwXHXp3hksCJzbZYPWkuw41Q==", + "integrity": "sha1-3CWC7g5hVBqoi6/cWorrtT3qrnU=", "dev": true, "requires": { "gonzales-pe": "4.2.3", @@ -12953,7 +12953,7 @@ "postcss-scss": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.4.tgz", - "integrity": "sha512-IFj42Hz2cBHHFvZTqkJqU08JCCM/MZU5/uNkTUZBaBFP2d4C5unw4HyCL52RfCwJb6KoVUD3eoepxMh1dfBFCQ==", + "integrity": "sha1-YxD+GhW+QYcHos/XfyHdSgbR4J0=", "dev": true, "requires": { "postcss": "6.0.19" @@ -13413,7 +13413,7 @@ "registry-auth-token": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "integrity": "sha1-hR/UkDjuy1hpERFa+EUmDuyYPyA=", "requires": { "rc": "1.2.1", "safe-buffer": "5.1.1" @@ -13843,7 +13843,7 @@ "safe-json-stringify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.1.0.tgz", - "integrity": "sha512-EzBtUaFH9bHYPc69wqjp0efJI/DPNHdFbGE3uIMn4sVbO0zx8vZ8cG4WKxQfOpUOKsQyGBiT2mTqnCw+6nLswA==", + "integrity": "sha1-vSttrR66+rPCRnKjlVJ/AYBLfhk=", "optional": true }, "sax": { @@ -14067,7 +14067,7 @@ "shelljs": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.1.tgz", - "integrity": "sha512-YA/iYtZpzFe5HyWVGrb02FjPxc4EMCfpoU/Phg9fQoyMC72u9598OUBrsU8IrtwAKG0tO8IYaqbaLIw+k3IRGA==", + "integrity": "sha1-cp4DjEE6IlTEB4uV7UbgOXFUqfE=", "dev": true, "requires": { "glob": "7.1.2", @@ -14078,7 +14078,7 @@ "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", "dev": true, "requires": { "fs.realpath": "1.0.0", @@ -14461,7 +14461,7 @@ "specificity": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", + "integrity": "sha1-meZRHs7vD42bV5JJN6rCyxPRPEI=", "dev": true }, "split": { @@ -15243,7 +15243,7 @@ "sugarss": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", - "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", + "integrity": "sha1-voJtkAPg8kdzX5I2XcP9fxuunkQ=", "dev": true, "requires": { "postcss": "6.0.19" @@ -15318,7 +15318,7 @@ "js-yaml": { "version": "3.10.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", "dev": true, "optional": true, "requires": { @@ -15331,7 +15331,7 @@ "sw-precache": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/sw-precache/-/sw-precache-5.2.1.tgz", - "integrity": "sha512-8FAy+BP/FXE+ILfiVTt+GQJ6UEf4CVHD9OfhzH0JX+3zoy2uFk7Vn9EfXASOtVmmIVbL3jE/W8Z66VgPSZcMhw==", + "integrity": "sha1-BhNPMZ7saPO5WDzppwNrHBGfcXk=", "requires": { "dom-urls": "1.1.0", "es6-promise": "4.1.1", @@ -16209,7 +16209,7 @@ "uc.micro": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", + "integrity": "sha1-DGXxX4FaoItWCmHOi023/8P0U3Y=", "dev": true }, "uglify-js": { @@ -16300,7 +16300,7 @@ "unified": { "version": "6.1.6", "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz", - "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==", + "integrity": "sha1-Xqf4B6CJjx+Kze7+XyX6oBDMQrE=", "dev": true, "requires": { "bail": "1.0.2", @@ -16404,7 +16404,7 @@ "unist-util-visit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.3.0.tgz", - "integrity": "sha512-9ntYcxPFtl44gnwXrQKZ5bMqXMY0ZHzUpqMFiU4zcc8mmf/jzYm8GhYgezuUlX4cJIM1zIDYaO6fG/fI+L6iiQ==", + "integrity": "sha1-Qcp8gpgf0c5sdiqsOX/CTjVxFEQ=", "dev": true, "requires": { "unist-util-is": "2.1.1" @@ -16537,7 +16537,7 @@ "urijs": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", - "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" + "integrity": "sha1-Ww/1MMDL3oOG9jQiNbpcpumV0lo=" }, "urix": { "version": "0.1.0", @@ -16698,7 +16698,7 @@ "v8flags": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", - "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", + "integrity": "sha1-rWp4ogprI9A6jevBEhHjzCMUlHc=", "dev": true, "requires": { "homedir-polyfill": "1.0.1" @@ -16756,7 +16756,7 @@ "vfile": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "integrity": "sha1-5i2OcrIOg8MkvGxnJ47ickiL+Eo=", "dev": true, "requires": { "is-buffer": "1.1.5", @@ -16782,7 +16782,7 @@ "vfile-message": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz", - "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==", + "integrity": "sha1-pq2wR06kAPol2Snx1nOr6moX41k=", "dev": true, "requires": { "unist-util-stringify-position": "1.1.1" @@ -17155,7 +17155,7 @@ "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", "requires": { "is-fullwidth-code-point": "2.0.0", "strip-ansi": "4.0.0" @@ -17224,7 +17224,7 @@ "write-file-atomic": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "integrity": "sha1-H/YVdcLipOjlENb6TiQ8zhg5mas=", "requires": { "graceful-fs": "4.1.11", "imurmurhash": "0.1.4", diff --git a/package.json b/package.json index 2ad935a6e..1ccbf6a02 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "markdown-toc": "^1.2.0", "marked": "^0.3.17", "md-2-json": "^1.0.5", + "mkdirp": "^0.5.1", "moment": "^2.21.0", "normalize-path": "^2.1.1", "pify": "^3.0.0", diff --git a/src/content/404.md b/src/content/404.md index b520b14aa..e4c18bd8a 100644 --- a/src/content/404.md +++ b/src/content/404.md @@ -4,4 +4,5 @@ layout: "error" originalFile: "404.md" permalink: "404/index.html" title: "Oh oh" +contentType: "details" --- diff --git a/src/content/about.md b/src/content/about.md index 72903eb5b..4787d79ad 100644 --- a/src/content/about.md +++ b/src/content/about.md @@ -5,6 +5,7 @@ layout: "about" originalFile: "about.md" permalink: "about/index.html" title: "About" +contentType: "details" --- * [Changelog](about/CHANGELOG.md) * [Code of Conduct](https://js.foundation/community/code-of-conduct) diff --git a/src/content/docs/index.md b/src/content/docs/index.md index fcdb766d9..83a5f080d 100644 --- a/src/content/docs/index.md +++ b/src/content/docs/index.md @@ -5,6 +5,7 @@ layout: "docs" originalFile: "docs/index.md" permalink: "docs/index.html" title: "Documentation" +contentType: "index" --- * [Contributor Guide](contributor-guide/) diff --git a/src/sonarwhal-theme/helper/index.js b/src/sonarwhal-theme/helper/index.js index 7e1047a15..1d8f6ec96 100644 --- a/src/sonarwhal-theme/helper/index.js +++ b/src/sonarwhal-theme/helper/index.js @@ -220,6 +220,10 @@ module.exports = function () { // `navs` is the menu data saved in `menu.yml`. return navs[2].items; }, + getDocumentItems: (navs) => { + // `navs` is the menu data saved in `menu.yml`. + return navs[1].items; + }, getEditLink: (originalFile) => { const ruleRegex = /.*\/rules\/(rule-.+)\.md/ig; const match = ruleRegex.exec(originalFile); @@ -227,15 +231,11 @@ module.exports = function () { if (match) { const ruleName = match.pop(); - return 'packages/' + ruleName + '/README.md' + return 'packages/' + ruleName + '/README.md'; } return 'packages/sonarwhal/' + originalFile; }, - getDocumentItems: (navs) => { - // `navs` is the menu data saved in `menu.yml`. - return navs[1].items; - }, getLength: function (messages, unit) { const length = messages.length; const units = self.pluralize(unit, length); @@ -243,7 +243,14 @@ module.exports = function () { return length + ' ' + units; }, getPagesByToCTitle: (title, pages) => { - return pages[title]; + return pages[title].filter((page) => { + return page.contentType === 'details'; + }); + }, + getRulesCount: (rules) => { + return rules.filter((rule) => { + return !rule.isSummary; + }).length; }, getSignalIssueQuery: (root, title, directory) => { const issueTitle = `[docs] Issue with '${title}'`; @@ -287,6 +294,9 @@ module.exports = function () { return options.inverse(this); }, + isActiveItem: (page, target) => { + return (page.tocTitle === target) && (page.contentType === 'details'); + }, isError: (status) => { return status === jobStatus.error; }, @@ -392,6 +402,12 @@ module.exports = function () { return headChunk + ' … ' + tailChunk; }, + showMdContent: (page) => { + // If the markdown Content should be used. + const guildeIndexes = ['contributor guide', 'user guide']; + + return page.contentType === 'details' || guildeIndexes.includes(page.title.toLowerCase()); + }, // Sort out `Developer guide` or `User guide` pages sortPagesByCategory: (allPages, category) => { const pages = allPages.reduce((acc, page) => { diff --git a/src/sonarwhal-theme/layout/docs.hbs b/src/sonarwhal-theme/layout/docs.hbs index 5b3e0cb51..770b73fc2 100644 --- a/src/sonarwhal-theme/layout/docs.hbs +++ b/src/sonarwhal-theme/layout/docs.hbs @@ -18,6 +18,7 @@ + diff --git a/src/sonarwhal-theme/layout/partials/rule-category.hbs b/src/sonarwhal-theme/layout/partials/rule-category.hbs new file mode 100644 index 000000000..c660bcff2 --- /dev/null +++ b/src/sonarwhal-theme/layout/partials/rule-category.hbs @@ -0,0 +1,12 @@ +
+

{{description}}

+
+
+
+ +
+
diff --git a/src/sonarwhal-theme/layout/partials/rules-index.hbs b/src/sonarwhal-theme/layout/partials/rules-index.hbs new file mode 100644 index 000000000..7a3c341f8 --- /dev/null +++ b/src/sonarwhal-theme/layout/partials/rules-index.hbs @@ -0,0 +1,12 @@ +
+ {{#each categories}} +
+

{{name}}

+

{{description}}

+
+

{{getRulesCount rules}} Rules

+ View All +
+
+ {{/each}} +
diff --git a/src/sonarwhal-theme/layout/partials/sub-page.hbs b/src/sonarwhal-theme/layout/partials/sub-page.hbs index 7b86297b4..49580c805 100644 --- a/src/sonarwhal-theme/layout/partials/sub-page.hbs +++ b/src/sonarwhal-theme/layout/partials/sub-page.hbs @@ -66,7 +66,12 @@