diff --git a/.editorconfig b/.editorconfig index 99117d6..070f5e8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,3 +1,18 @@ -[*.js] +# All files unless overridden: UTF-8, Unix style line endings and +# final newline, no tabs, 2-space indentation. +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 indent_style = space -indent_size = 2 \ No newline at end of file +insert_final_newline = true +trim_trailing_whitespace = true + +# Trailing whitespace is significant in Markdown +[*.md] +trim_trailing_whitespace = false + +# Makefiles must be indented with tabs +[Makefile] +indent_size = 8 +indent_style = tab diff --git a/.eslintrc.yml b/.eslintrc.yml new file mode 100644 index 0000000..5e20088 --- /dev/null +++ b/.eslintrc.yml @@ -0,0 +1,14 @@ +extends: + - eslint:recommended + - plugin:prettier/recommended + +env: + browser: false + node: true + mocha: true + +rules: + # Allow an escape hatch for unused arguments. + no-unused-vars: + - error + - argsIgnorePattern: '^_(ignored|unused)(_[a-z0-9]+)?' diff --git a/.gitignore b/.gitignore index d0cd323..6489cbf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules +package-lock.json test/fixtures/*/build/* -.DS_Store \ No newline at end of file +.DS_Store +.eslintcache diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..bab7d76 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#! /bin/sh +. "${0%/*}/_/husky.sh" + +npx lint-staged diff --git a/.lintstagedrc.yml b/.lintstagedrc.yml new file mode 100644 index 0000000..101e656 --- /dev/null +++ b/.lintstagedrc.yml @@ -0,0 +1,5 @@ +# notes: +# - for JS files, eslint runs prettier +# - I don't like what prettier does to Markdown +'*.js': 'eslint --cache --fix' +'*.{json,yml,yaml}': 'prettier --loglevel warn --write' diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..0730484 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +.eslintcache +package-lock.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..b5d8c88 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "endOfLine": "lf", + "tabWidth": 2, + "useTabs": false, + "trailingComma": "es5", + "printWidth": 80, + "singleQuote": true +} diff --git a/lib/index.js b/lib/index.js index 0049d08..b3a7892 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,11 +1,10 @@ - var basename = require('path').basename; var debug = require('debug')('metalsmith-markdown'); var dirname = require('path').dirname; var extname = require('path').extname; var join = require('path').join; var markdownIt = require('markdown-it'); -var minimatch = require('minimatch'); +var micromatch = require('micromatch'); /** * Expose `plugin`. @@ -18,18 +17,18 @@ module.exports = plugin; * * @param {Object} options (optional) - options to pass to markdownIt * @param {Object} options.plugin (optional) - options used by the plugin. Will not be passed to MarkdownIt - * @param {string} options.plugin.pattern - glob pattern for filtering which files to process (passed to minimatch.filter) + * @param {string} options.plugin.pattern - glob pattern for filtering which files to process (passed to micromatch()) * @param {string|Array} options.plugin.fields - field or list of fields which MarkdownIt should process * @param {string} options.plugin.extension - file extension for output files * @return {Function} */ -function plugin(preset, options){ +function plugin(preset, options) { var defaults = { pattern: '**/*.@(md|markdown)', fields: 'contents', - extension: 'html' - } + extension: 'html', + }; var pluginOptions = defaults; // handle cases where a preset isn't specified @@ -37,26 +36,29 @@ function plugin(preset, options){ if (options && options.plugin) { pluginOpts = options.plugin; delete options.plugin; - } else if (!options && typeof preset === 'object' && preset.plugin){ + } else if (!options && typeof preset === 'object' && preset.plugin) { pluginOpts = preset.plugin; delete preset.plugin; } if (pluginOpts) { // merge defaults with supplied options - for (var prop in pluginOpts) { + for (var prop in pluginOpts) { pluginOptions[prop] = pluginOpts[prop]; } } // normalize pluginOptions.fields into an array - if (typeof pluginOptions.fields === 'string') pluginOptions.fields = [pluginOptions.fields] + if (typeof pluginOptions.fields === 'string') + pluginOptions.fields = [pluginOptions.fields]; var markdown = new markdownIt(preset, options), - envSetter = function(){}; + envSetter = function () {}; - var plugin = function(files, metalsmith, done){ + var plugin = function (files, metalsmith, done) { setImmediate(done); - Object.keys(files).filter(minimatch.filter(pluginOptions.pattern)).forEach(function(file){ + micromatch(Object.keys(files), pluginOptions.pattern).forEach(function ( + file + ) { var data = files[file]; var dir = dirname(file); var html = basename(file, extname(file)) + '.' + pluginOptions.extension; @@ -68,13 +70,13 @@ function plugin(preset, options){ } debug('converting file: %s', file); - pluginOptions.fields.forEach(function(field){ + pluginOptions.fields.forEach(function (field) { debug('- checking field: %s', field); - if (!data[field]) return + if (!data[field]) return; debug('- converting field: %s', field); var str = markdown.render(data[field].toString(), env); - data[field] = new Buffer(str); - }) + data[field] = Buffer.from(str); + }); delete files[file]; files[html] = data; @@ -85,23 +87,23 @@ function plugin(preset, options){ /* proxy parser methods to return plugin for inline use */ - ['use', 'set', 'enable', 'disable'].forEach(function(fn){ - plugin[fn] = function(){ + ['use', 'set', 'enable', 'disable'].forEach(function (fn) { + plugin[fn] = function () { var args = Array.prototype.slice.call(arguments); markdown[fn].apply(markdown, args); return plugin; - } + }; }); - plugin.env = function(setter){ + plugin.env = function (setter) { envSetter = setter; return plugin; - } + }; - plugin.withParser = function(fn){ + plugin.withParser = function (fn) { fn(markdown); return plugin; - } + }; return plugin; -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index ecad97e..0000000 --- a/package-lock.json +++ /dev/null @@ -1,789 +0,0 @@ -{ - "name": "metalsmith-markdownit", - "version": "0.5.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "assert-dir-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assert-dir-equal/-/assert-dir-equal-1.1.0.tgz", - "integrity": "sha1-nOsU3IHeguz4NmJIaM0bWP/C9fs=", - "dev": true, - "requires": { - "buffer-equal": "0.0.0", - "fs-readdir-recursive": "0.0.1", - "is-utf8": "~0.2.0" - }, - "dependencies": { - "buffer-equal": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.0.tgz", - "integrity": "sha1-SmgZasM1ItqhfsmYWLMCpja2LPE=", - "dev": true - }, - "fs-readdir-recursive": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-0.0.1.tgz", - "integrity": "sha1-8iI6tAKT5DZpbTO2f2s+bS5qjBI=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - } - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "requires": { - "ms": "^2.1.1" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=" - } - } - }, - "markdown-it": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", - "integrity": "sha1-OG+YmY3BWjdyKqdyIIT0Agvdm1Q=", - "requires": { - "argparse": "^1.0.7", - "entities": "~1.1.1", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - } - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=" - }, - "linkify-it": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz", - "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=", - "requires": { - "uc.micro": "^1.0.1" - } - }, - "mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" - }, - "uc.micro": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha1-DGXxX4FaoItWCmHOi023/8P0U3Y=" - } - } - }, - "markdown-it-abbr": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/markdown-it-abbr/-/markdown-it-abbr-1.0.4.tgz", - "integrity": "sha1-1mtTZFIcuz3Yqlna37ovtoZcj9g=", - "dev": true - }, - "metalsmith": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/metalsmith/-/metalsmith-2.3.0.tgz", - "integrity": "sha1-gzr7taKmOF4tmuPZNeOeM+rqUjE=", - "dev": true, - "requires": { - "absolute": "0.0.1", - "chalk": "^1.1.3", - "clone": "^1.0.2", - "co-fs-extra": "^1.2.1", - "commander": "^2.6.0", - "gray-matter": "^2.0.0", - "has-generators": "^1.0.1", - "is": "^3.1.0", - "is-utf8": "~0.2.0", - "recursive-readdir": "^2.1.0", - "rimraf": "^2.2.8", - "stat-mode": "^0.2.0", - "thunkify": "^2.1.2", - "unyield": "0.0.1", - "ware": "^1.2.0", - "win-fork": "^1.1.1" - }, - "dependencies": { - "absolute": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/absolute/-/absolute-0.0.1.tgz", - "integrity": "sha1-wigi+H4ck59XmIdQTZwQnEFzgp0=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - } - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "co-fs-extra": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/co-fs-extra/-/co-fs-extra-1.2.1.tgz", - "integrity": "sha1-O2rXfPJhRTD2d7HPYmZPW6dWtyI=", - "dev": true, - "requires": { - "co-from-stream": "~0.0.0", - "fs-extra": "~0.26.5", - "thunkify-wrap": "~1.0.4" - }, - "dependencies": { - "co-from-stream": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/co-from-stream/-/co-from-stream-0.0.0.tgz", - "integrity": "sha1-GlzYztdyY5RglPo58kmaYyl7yvk=", - "dev": true, - "requires": { - "co-read": "0.0.1" - }, - "dependencies": { - "co-read": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/co-read/-/co-read-0.0.1.tgz", - "integrity": "sha1-+Bs+uKhmdf7FHj2IOn9WToc8k4k=", - "dev": true - } - } - }, - "fs-extra": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.7.tgz", - "integrity": "sha1-muH92UiXeY7at20JGM9C0MMYT6k=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.9" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - } - } - }, - "thunkify-wrap": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/thunkify-wrap/-/thunkify-wrap-1.0.4.tgz", - "integrity": "sha1-tSvlSN3+/aIOALWMYJZ2K0PdaIA=", - "dev": true, - "requires": { - "enable": "1" - }, - "dependencies": { - "enable": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/enable/-/enable-1.3.2.tgz", - "integrity": "sha1-nrpoN9FtCYK1n4fYib91REPVKTE=", - "dev": true - } - } - } - } - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha1-9hmKqE5bg8RgVLlN3tv+1e6f8So=", - "dev": true - }, - "gray-matter": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-2.1.1.tgz", - "integrity": "sha1-MELZrewqHe1qdwep7SOA+KF6Qw4=", - "dev": true, - "requires": { - "ansi-red": "^0.1.1", - "coffee-script": "^1.12.4", - "extend-shallow": "^2.0.1", - "js-yaml": "^3.8.1", - "toml": "^2.3.2" - }, - "dependencies": { - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - }, - "dependencies": { - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - } - } - }, - "coffee-script": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", - "integrity": "sha1-wF2uDLeVkdBbMHCoQzqYyaiczFM=", - "dev": true - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - } - } - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha1-6u1lbsg0TxD1J8a/obbiJE3hZ9E=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - } - } - }, - "toml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/toml/-/toml-2.3.3.tgz", - "integrity": "sha1-jWg9cpV3yyhiMd/HqK/+WNMXKPs=", - "dev": true - } - } - }, - "has-generators": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-generators/-/has-generators-1.0.1.tgz", - "integrity": "sha1-pqLlVIYBGUBILhPiyTeRxEms9Ek=", - "dev": true - }, - "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "recursive-readdir": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", - "integrity": "sha1-mUb7MnThYo3m42svZxSVO0hFCU8=", - "dev": true, - "requires": { - "minimatch": "3.0.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", - "dev": true, - "requires": { - "glob": "^7.0.5" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - } - } - } - } - }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, - "thunkify": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/thunkify/-/thunkify-2.1.2.tgz", - "integrity": "sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=", - "dev": true - }, - "unyield": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/unyield/-/unyield-0.0.1.tgz", - "integrity": "sha1-FQ5l2kK/d0JEW5WKZOubhdHSsYA=", - "dev": true, - "requires": { - "co": "~3.1.0" - }, - "dependencies": { - "co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true - } - } - }, - "ware": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ware/-/ware-1.3.0.tgz", - "integrity": "sha1-0bFPOdLiy0q4xAmPdW/ksWTkc9Q=", - "dev": true, - "requires": { - "wrap-fn": "^0.1.0" - }, - "dependencies": { - "wrap-fn": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/wrap-fn/-/wrap-fn-0.1.5.tgz", - "integrity": "sha1-8htuQQFv9KfjFyDbxjoJAWvfmEU=", - "dev": true, - "requires": { - "co": "3.1.0" - }, - "dependencies": { - "co": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/co/-/co-3.1.0.tgz", - "integrity": "sha1-TqVOpaCJOBUxheFSEMaNkJK8G3g=", - "dev": true - } - } - } - } - }, - "win-fork": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/win-fork/-/win-fork-1.1.1.tgz", - "integrity": "sha1-j1jgZW/KAK3IyGoriePNLWotXl4=", - "dev": true - } - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "^1.1.7" - }, - "dependencies": { - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - }, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - } - } - } - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha1-bYrlCPWRZ/lA8rWzxKYSrlDJCuY=", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", - "dev": true - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha1-30boZ9D8Kuxmo0ZitAapzK//Ww8=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", - "dev": true, - "requires": { - "ms": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - }, - "dependencies": { - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - } - } - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } - } - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha1-HGszdALCE3YF7+GfEP7DkPb6q1Q=", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - } - } - } - } - } - } -} diff --git a/package.json b/package.json index 2927968..2f28ee8 100644 --- a/package.json +++ b/package.json @@ -6,17 +6,25 @@ "license": "MIT", "main": "lib/index.js", "dependencies": { - "debug": "^3.2.6", - "markdown-it": "^8.4.2", - "minimatch": "^3.0.4" + "debug": "^4.3.0", + "markdown-it": "^13.0.0", + "micromatch": "^4.0.0" }, "devDependencies": { - "mocha": "5.x", - "metalsmith": "2.x", - "assert-dir-equal": "1.x", - "markdown-it-abbr": "^1.0.4" + "assert-dir-equal": "^1.1.0", + "eslint": "^8.25.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-prettier": "^4.2.0", + "husky": "^8.0.0", + "lint-staged": "^13.0.0", + "markdown-it-abbr": "^1.0.0", + "metalsmith": "^2.5.0", + "mocha": "^10.1.0", + "prettier": "^2.7.0" }, "scripts": { + "prepare": "husky install", + "lint": "eslint --cache --fix lib test", "test": "mocha" } } diff --git a/test/index.js b/test/index.js index 3faf69b..48ddfbd 100644 --- a/test/index.js +++ b/test/index.js @@ -1,172 +1,196 @@ - -var assert = require('assert'); var equal = require('assert-dir-equal'); var Metalsmith = require('metalsmith'); var markdown = require('..'); -describe('metalsmith-markdown', function(){ - it('should convert markdown files with no parameters', function(done){ +describe('metalsmith-markdown', function () { + it('should convert markdown files with no parameters', function (done) { Metalsmith('test/fixtures/basic') .use(markdown()) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/basic/expected', 'test/fixtures/basic/build'); done(); }); }); - it('should convert markdown files with presets', function(done){ + it('should convert markdown files with presets', function (done) { Metalsmith('test/fixtures/preset') .use(markdown('default')) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/preset/expected', 'test/fixtures/preset/build'); done(); }); }); - it('should convert markdown files with options', function(done){ + it('should convert markdown files with options', function (done) { Metalsmith('test/fixtures/options') .use(markdown({ html: true })) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/options/expected', 'test/fixtures/options/build'); done(); }); }); - it('should convert markdown files with preset and options combination', function(done){ + it('should convert markdown files with preset and options combination', function (done) { Metalsmith('test/fixtures/combo') .use(markdown('default', { typographer: true })) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/combo/expected', 'test/fixtures/combo/build'); done(); }); }); - it('should give access to markdown parser', function(done){ + it('should give access to markdown parser', function (done) { var md = markdown('zero'); md.parser.enable('emphasis'); Metalsmith('test/fixtures/parser') .use(md) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/parser/expected', 'test/fixtures/parser/build'); done(); }); }); - it('should expose the markdown parser via proxy', function(done){ + it('should expose the markdown parser via proxy', function (done) { Metalsmith('test/fixtures/parser') .use(markdown('zero').enable('emphasis')) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/parser/expected', 'test/fixtures/parser/build'); done(); }); }); - it('should use plugins via the direct parser', function(done){ + it('should use plugins via the direct parser', function (done) { var md = markdown('default'); md.parser.use(require('markdown-it-abbr')); Metalsmith('test/fixtures/plugin') .use(md) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/plugin/expected', 'test/fixtures/plugin/build'); - done() + done(); }); }); - it('should be able to use a plugin', function(done){ + it('should be able to use a plugin', function (done) { Metalsmith('test/fixtures/plugin') .use(markdown('default').use(require('markdown-it-abbr'))) - .build(function(err){ + .build(function (err) { if (err) return done(err); equal('test/fixtures/plugin/expected', 'test/fixtures/plugin/build'); done(); }); }); - it('should be able to set the rendering environment per-page', function(done){ + it('should be able to set the rendering environment per-page', function (done) { Metalsmith('test/fixtures/env-plugin') - .metadata({siteName: 'The test build'}) - .use(markdown('default') - .env(function(page, metadata){ return {title: page.title, siteName: metadata.siteName}; }) - .use(function(md){ - md.inline.ruler.push('vars', function(state, silent){ - var pos = state.pos, - max = state.posMax; - if (state.src.charCodeAt(pos) !== '@'.charCodeAt(0)) { return false; } - while (pos < max) { - pos++; - if (state.md.utils.isSpace(state.src.charCodeAt(pos))){break;} - } - if (!silent) { - var name = state.src.slice(state.pos + 1, pos), - token = state.push('vars', '', 0); - token.markup = "@" + name; - token.content = state.env[name]; - } - state.pos = pos; - return true; - }); - md.renderer.rules['vars'] = function(tokens, id, options, env, self){ - var token = tokens[id]; - return token.content; - } - })) - .build(function(err){ + .metadata({ siteName: 'The test build' }) + .use( + markdown('default') + .env(function (page, metadata) { + return { title: page.title, siteName: metadata.siteName }; + }) + .use(function (md) { + md.inline.ruler.push('vars', function (state, silent) { + var pos = state.pos, + max = state.posMax; + if (state.src.charCodeAt(pos) !== '@'.charCodeAt(0)) { + return false; + } + while (pos < max) { + pos++; + if (state.md.utils.isSpace(state.src.charCodeAt(pos))) { + break; + } + } + if (!silent) { + var name = state.src.slice(state.pos + 1, pos), + token = state.push('vars', '', 0); + token.markup = '@' + name; + token.content = state.env[name]; + } + state.pos = pos; + return true; + }); + md.renderer.rules['vars'] = function ( + tokens, + id, + _unused_options, + _unused_env, + _unused_self + ) { + var token = tokens[id]; + return token.content; + }; + }) + ) + .build(function (err) { if (err) return done(err); - equal('test/fixtures/env-plugin/expected', 'test/fixtures/env-plugin/build'); + equal( + 'test/fixtures/env-plugin/expected', + 'test/fixtures/env-plugin/build' + ); done(); - }) - }) + }); + }); - it('should accept plugin options', function(done){ + it('should accept plugin options', function (done) { Metalsmith('test/fixtures/plugin-options') - .use(markdown({ - plugin: { - pattern: '**/*.html', - fields: ['contents', 'excerpt'], - extension: 'htm' - } - })) - .use(function(files, metalsmith, done){ + .use( + markdown({ + plugin: { + pattern: '**/*.html', + fields: ['contents', 'excerpt'], + extension: 'htm', + }, + }) + ) + .use(function (files, metalsmith, done) { var f = files['index.htm']; // concat the excerpt into the main content - f.contents = f.contents.toString() + '\n' + f.excerpt.toString() - done() + f.contents = f.contents.toString() + '\n' + f.excerpt.toString(); + done(); }) - .build(function(err){ + .build(function (err) { if (err) return done(err); - equal('test/fixtures/plugin-options/expected', 'test/fixtures/plugin-options/build'); + equal( + 'test/fixtures/plugin-options/expected', + 'test/fixtures/plugin-options/build' + ); done(); }); }); - it('should accept plugin options with a preset', function(done){ + it('should accept plugin options with a preset', function (done) { Metalsmith('test/fixtures/plugin-options-preset') - .use(markdown('default', { - plugin: { - pattern: '**/*.html', - fields: ['contents', 'excerpt'], - extension: 'htm' - } - })) - .use(function(files, metalsmith, done){ + .use( + markdown('default', { + plugin: { + pattern: '**/*.html', + fields: ['contents', 'excerpt'], + extension: 'htm', + }, + }) + ) + .use(function (files, metalsmith, done) { var f = files['index.htm']; // concat the excerpt into the main content - f.contents = f.contents.toString() + '\n' + f.excerpt.toString() - done() + f.contents = f.contents.toString() + '\n' + f.excerpt.toString(); + done(); }) - .build(function(err){ + .build(function (err) { if (err) return done(err); - equal('test/fixtures/plugin-options-preset/expected', 'test/fixtures/plugin-options/build'); + equal( + 'test/fixtures/plugin-options-preset/expected', + 'test/fixtures/plugin-options/build' + ); done(); }); }); - });