diff --git a/packages/core/integration-tests/test/integration/markdown/100x100.png b/packages/core/integration-tests/test/integration/markdown/100x100.png new file mode 100644 index 00000000000..8a1daa0121d Binary files /dev/null and b/packages/core/integration-tests/test/integration/markdown/100x100.png differ diff --git a/packages/core/integration-tests/test/integration/markdown/index.md b/packages/core/integration-tests/test/integration/markdown/index.md new file mode 100644 index 00000000000..d1d6628f15c --- /dev/null +++ b/packages/core/integration-tests/test/integration/markdown/index.md @@ -0,0 +1,5 @@ +# heading1 + +content content content + +[image](./100x100.png) diff --git a/packages/core/integration-tests/test/markdown.js b/packages/core/integration-tests/test/markdown.js new file mode 100644 index 00000000000..017e8fe9d33 --- /dev/null +++ b/packages/core/integration-tests/test/markdown.js @@ -0,0 +1,33 @@ +const assert = require('assert'); +const path = require('path'); +const fs = require('@parcel/fs'); +const {bundle, run, assertBundleTree} = require('./utils'); + +describe('markdown', function() { + it('should support bundling Markdown', async function() { + let b = await bundle( + path.join(__dirname, '/integration/markdown/index.md') + ); + + await assertBundleTree(b, { + name: 'index.html', + assets: ['index.md'], + childBundles: [ + { + type: 'png', + assets: ['100x100.png'], + childBundles: [] + } + ] + }); + + let files = await fs.readdir(path.join(__dirname, '/dist')); + let html = await fs.readFile(path.join(__dirname, '/dist/index.html')); + for (let file of files) { + let ext = file.match(/\.([0-9a-z]+)(?:[?#]|$)/i)[0]; + if (file !== 'index.html' && ext !== '.map') { + assert(html.includes(file)); + } + } + }); +}); diff --git a/packages/core/parcel-bundler/src/Parser.js b/packages/core/parcel-bundler/src/Parser.js index 09163cb6d4a..2042e19171f 100644 --- a/packages/core/parcel-bundler/src/Parser.js +++ b/packages/core/parcel-bundler/src/Parser.js @@ -51,6 +51,7 @@ class Parser { this.registerExtension('jade', './assets/PugAsset'); this.registerExtension('pug', './assets/PugAsset'); + this.registerExtension('md', './assets/MarkdownAsset'); let extensions = options.extensions || {}; for (let ext in extensions) { diff --git a/packages/core/parcel-bundler/src/Pipeline.js b/packages/core/parcel-bundler/src/Pipeline.js index 0b016006fbc..6377259b123 100644 --- a/packages/core/parcel-bundler/src/Pipeline.js +++ b/packages/core/parcel-bundler/src/Pipeline.js @@ -50,7 +50,6 @@ class Pipeline { let inputType = path.extname(asset.name).slice(1); let generated = []; - for (let rendition of this.iterateRenditions(asset)) { let {type, value} = rendition; if (typeof value !== 'string' || rendition.final) { diff --git a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js new file mode 100644 index 00000000000..076667c8405 --- /dev/null +++ b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js @@ -0,0 +1,15 @@ +const localRequire = require('../utils/localRequire'); +const Asset = require('../Asset'); + +class MarkdownAsset extends Asset { + constructor(name, options) { + super(name, options); + this.type = 'html'; + this.hmrPageReload = true; + } + async generate() { + let marked = await localRequire('marked', this.name); + return marked(this.contents); + } +} +module.exports = MarkdownAsset;