From 1cf46d71a5df5e75ea5a401aac5d29c2814bcc34 Mon Sep 17 00:00:00 2001 From: Kirill Rogovoy Date: Sun, 13 Jan 2019 17:30:09 +0200 Subject: [PATCH 1/8] WIP --- .../src/packagers/MarkdownPackager.js | 38 +++++++++++++++++++ .../parcel-bundler/src/packagers/index.js | 2 + 2 files changed, 40 insertions(+) create mode 100644 packages/core/parcel-bundler/src/packagers/MarkdownPackager.js diff --git a/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js b/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js new file mode 100644 index 00000000000..160e42bbe2d --- /dev/null +++ b/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js @@ -0,0 +1,38 @@ +const Packager = require('./Packager'); +const path = require('path'); +const fs = require('@parcel/fs'); + +class MarkdownPackager extends Packager { + static shouldAddAsset() { + // We cannot combine multiple raw assets together - they should be written as separate bundles. + return false; + } + + // Override so we don't create a file for this bundle. + // Each asset will be emitted as a separate file instead. + setup() {} + + async addAsset(asset) { + console.log('asset added', asset); + let contents = asset.generated[this.bundle.type]; + if (!contents || (contents && contents.path)) { + contents = await fs.readFile(contents ? contents.path : asset.name); + } + + // Create sub-directories if needed + if (this.bundle.name.includes(path.sep)) { + await fs.mkdirp(path.dirname(this.bundle.name)); + } + + this.size = contents.length; + await fs.writeFile(this.bundle.name, contents); + } + + getSize() { + return this.size || 0; + } + + end() {} +} + +module.exports = MarkdownPackager; diff --git a/packages/core/parcel-bundler/src/packagers/index.js b/packages/core/parcel-bundler/src/packagers/index.js index 7c6e0b18150..aea6b1d8c72 100644 --- a/packages/core/parcel-bundler/src/packagers/index.js +++ b/packages/core/parcel-bundler/src/packagers/index.js @@ -4,6 +4,7 @@ const CSSPackager = require('./CSSPackager'); const HTMLPackager = require('./HTMLPackager'); const SourceMapPackager = require('./SourceMapPackager'); const RawPackager = require('./RawPackager'); +const MarkdownPackager = require('./MarkdownPackager'); class PackagerRegistry { constructor(options) { @@ -11,6 +12,7 @@ class PackagerRegistry { this.add('css', CSSPackager); this.add('html', HTMLPackager); + this.add('md', MarkdownPackager); this.add('map', SourceMapPackager); this.add('js', options.scopeHoist ? JSConcatPackager : JSPackager); } From b8b4b47192f6c8e6720d5fcfa06c4a640f4c6201 Mon Sep 17 00:00:00 2001 From: Ben Hart Date: Sun, 13 Jan 2019 11:03:03 -0500 Subject: [PATCH 2/8] added marked --- packages/core/parcel-bundler/package.json | 1 + .../core/parcel-bundler/src/packagers/MarkdownPackager.js | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/parcel-bundler/package.json b/packages/core/parcel-bundler/package.json index 5fa76b6ed63..26b15386ad2 100644 --- a/packages/core/parcel-bundler/package.json +++ b/packages/core/parcel-bundler/package.json @@ -53,6 +53,7 @@ "is-url": "^1.2.2", "js-yaml": "^3.10.0", "json5": "^1.0.1", + "marked": "^0.6.0", "micromatch": "^3.0.4", "mkdirp": "^0.5.1", "node-forge": "^0.7.1", diff --git a/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js b/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js index 160e42bbe2d..977a6f304cf 100644 --- a/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js +++ b/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js @@ -1,6 +1,7 @@ const Packager = require('./Packager'); const path = require('path'); const fs = require('@parcel/fs'); +const marked = require('marked'); class MarkdownPackager extends Packager { static shouldAddAsset() { @@ -13,8 +14,8 @@ class MarkdownPackager extends Packager { setup() {} async addAsset(asset) { - console.log('asset added', asset); let contents = asset.generated[this.bundle.type]; + console.log('asset added', contents); if (!contents || (contents && contents.path)) { contents = await fs.readFile(contents ? contents.path : asset.name); } @@ -25,7 +26,7 @@ class MarkdownPackager extends Packager { } this.size = contents.length; - await fs.writeFile(this.bundle.name, contents); + await fs.writeFile(this.bundle.name, marked(contents)); } getSize() { From 99ca23d20080a36e361a5230a0901d20f380b359 Mon Sep 17 00:00:00 2001 From: Kirill Rogovoy Date: Sun, 13 Jan 2019 18:32:51 +0200 Subject: [PATCH 3/8] Add MarkdownAsset --- packages/core/parcel-bundler/src/Parser.js | 1 + .../src/assets/MarkdownAsset.js | 15 +++++++ .../src/packagers/MarkdownPackager.js | 39 ------------------- .../parcel-bundler/src/packagers/index.js | 2 - yarn.lock | 5 +++ 5 files changed, 21 insertions(+), 41 deletions(-) create mode 100644 packages/core/parcel-bundler/src/assets/MarkdownAsset.js delete mode 100644 packages/core/parcel-bundler/src/packagers/MarkdownPackager.js 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/assets/MarkdownAsset.js b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js new file mode 100644 index 00000000000..5a0fc90e32a --- /dev/null +++ b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js @@ -0,0 +1,15 @@ +const marked = require('marked'); +const posthtmlTransform = require('../transforms/posthtml'); +const api = require('posthtml/lib/api'); +const HTMLAsset = require('./HTMLAsset'); + +class MarkdownAsset extends HTMLAsset { + async parse(code) { + let res = await posthtmlTransform.parse(marked(code), this); + res.walk = api.walk; + res.match = api.match; + return res; + } +} + +module.exports = MarkdownAsset; diff --git a/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js b/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js deleted file mode 100644 index 977a6f304cf..00000000000 --- a/packages/core/parcel-bundler/src/packagers/MarkdownPackager.js +++ /dev/null @@ -1,39 +0,0 @@ -const Packager = require('./Packager'); -const path = require('path'); -const fs = require('@parcel/fs'); -const marked = require('marked'); - -class MarkdownPackager extends Packager { - static shouldAddAsset() { - // We cannot combine multiple raw assets together - they should be written as separate bundles. - return false; - } - - // Override so we don't create a file for this bundle. - // Each asset will be emitted as a separate file instead. - setup() {} - - async addAsset(asset) { - let contents = asset.generated[this.bundle.type]; - console.log('asset added', contents); - if (!contents || (contents && contents.path)) { - contents = await fs.readFile(contents ? contents.path : asset.name); - } - - // Create sub-directories if needed - if (this.bundle.name.includes(path.sep)) { - await fs.mkdirp(path.dirname(this.bundle.name)); - } - - this.size = contents.length; - await fs.writeFile(this.bundle.name, marked(contents)); - } - - getSize() { - return this.size || 0; - } - - end() {} -} - -module.exports = MarkdownPackager; diff --git a/packages/core/parcel-bundler/src/packagers/index.js b/packages/core/parcel-bundler/src/packagers/index.js index aea6b1d8c72..7c6e0b18150 100644 --- a/packages/core/parcel-bundler/src/packagers/index.js +++ b/packages/core/parcel-bundler/src/packagers/index.js @@ -4,7 +4,6 @@ const CSSPackager = require('./CSSPackager'); const HTMLPackager = require('./HTMLPackager'); const SourceMapPackager = require('./SourceMapPackager'); const RawPackager = require('./RawPackager'); -const MarkdownPackager = require('./MarkdownPackager'); class PackagerRegistry { constructor(options) { @@ -12,7 +11,6 @@ class PackagerRegistry { this.add('css', CSSPackager); this.add('html', HTMLPackager); - this.add('md', MarkdownPackager); this.add('map', SourceMapPackager); this.add('js', options.scopeHoist ? JSConcatPackager : JSPackager); } diff --git a/yarn.lock b/yarn.lock index a848cd60b05..b5b7aa26ee0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6717,6 +6717,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +marked@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.0.tgz#a18d01cfdcf8d15c3c455b71c8329e5e0f01faa1" + integrity sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g== + "match-stream@>= 0.0.2 < 1": version "0.0.2" resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" From 7c0d812021129b66bea9cc21872d6225309eedb0 Mon Sep 17 00:00:00 2001 From: Ben Hart Date: Sun, 13 Jan 2019 12:06:36 -0500 Subject: [PATCH 4/8] added dynamic install of marked, + DRYed parse method --- .../test/integration/markdown/index.md | 3 +++ packages/core/parcel-bundler/package.json | 1 - .../core/parcel-bundler/src/assets/MarkdownAsset.js | 10 +++------- yarn.lock | 5 ----- 4 files changed, 6 insertions(+), 13 deletions(-) create mode 100644 packages/core/integration-tests/test/integration/markdown/index.md 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..c641f4265c9 --- /dev/null +++ b/packages/core/integration-tests/test/integration/markdown/index.md @@ -0,0 +1,3 @@ +# heading1 + +content content content diff --git a/packages/core/parcel-bundler/package.json b/packages/core/parcel-bundler/package.json index 26b15386ad2..5fa76b6ed63 100644 --- a/packages/core/parcel-bundler/package.json +++ b/packages/core/parcel-bundler/package.json @@ -53,7 +53,6 @@ "is-url": "^1.2.2", "js-yaml": "^3.10.0", "json5": "^1.0.1", - "marked": "^0.6.0", "micromatch": "^3.0.4", "mkdirp": "^0.5.1", "node-forge": "^0.7.1", diff --git a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js index 5a0fc90e32a..b18b072d558 100644 --- a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js +++ b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js @@ -1,14 +1,10 @@ -const marked = require('marked'); -const posthtmlTransform = require('../transforms/posthtml'); -const api = require('posthtml/lib/api'); +const localRequire = require('../utils/localRequire'); const HTMLAsset = require('./HTMLAsset'); class MarkdownAsset extends HTMLAsset { async parse(code) { - let res = await posthtmlTransform.parse(marked(code), this); - res.walk = api.walk; - res.match = api.match; - return res; + let marked = await localRequire('marked', this.name); + return HTMLAsset.prototype.parse.bind(this)(marked(code)); } } diff --git a/yarn.lock b/yarn.lock index b5b7aa26ee0..a848cd60b05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6717,11 +6717,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.0.tgz#a18d01cfdcf8d15c3c455b71c8329e5e0f01faa1" - integrity sha512-HduzIW2xApSXKXJSpCipSxKyvMbwRRa/TwMbepmlZziKdH8548WSoDP4SxzulEKjlo8BE39l+2fwJZuRKOln6g== - "match-stream@>= 0.0.2 < 1": version "0.0.2" resolved "https://registry.yarnpkg.com/match-stream/-/match-stream-0.0.2.tgz#99eb050093b34dffade421b9ac0b410a9cfa17cf" From ed6c6cfadddcfb109ec79b875f2f89cdc6489d1c Mon Sep 17 00:00:00 2001 From: Kirill Rogovoy Date: Sun, 13 Jan 2019 20:01:46 +0200 Subject: [PATCH 5/8] Add tests --- .../test/integration/markdown/100x100.png | Bin 0 -> 255 bytes .../test/integration/markdown/index.md | 2 ++ .../core/integration-tests/test/markdown.js | 33 ++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 packages/core/integration-tests/test/integration/markdown/100x100.png create mode 100644 packages/core/integration-tests/test/markdown.js 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 0000000000000000000000000000000000000000..8a1daa0121d524256c1d1b45ff5e7ed771784c52 GIT binary patch literal 255 zcmeAS@N?(olHy`uVBq!ia0vp^DImVS)*E46%Oq(`s&YU^>_U&7| zc=6GrN4Ia^zG~H~jT<-Ko_$0QsEo6~BeIx*f$sR&2=kJHM z&5N9@w|=XzipNCbb|s-xrJeH)f2E%im~OIrio1Qy&Sj1+>x<+1)+oPni}kGd6Ohy! z>6x1RttNZTv!7LG>?+Ii&zjEnadB}e3778<6P>u`Anzuis~9|8{an^LB{Ts5qZeh6 literal 0 HcmV?d00001 diff --git a/packages/core/integration-tests/test/integration/markdown/index.md b/packages/core/integration-tests/test/integration/markdown/index.md index c641f4265c9..d1d6628f15c 100644 --- a/packages/core/integration-tests/test/integration/markdown/index.md +++ b/packages/core/integration-tests/test/integration/markdown/index.md @@ -1,3 +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)); + } + } + }); +}); From e5a00e70e191cad179f52809dae2b9b6ed8ad3d9 Mon Sep 17 00:00:00 2001 From: Ben Hart Date: Sun, 20 Jan 2019 13:11:18 -0500 Subject: [PATCH 6/8] it works goshdanggit --- packages/core/parcel-bundler/src/Pipeline.js | 3 +-- .../core/parcel-bundler/src/assets/MarkdownAsset.js | 13 +++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/core/parcel-bundler/src/Pipeline.js b/packages/core/parcel-bundler/src/Pipeline.js index e076fa90f81..9b531379616 100644 --- a/packages/core/parcel-bundler/src/Pipeline.js +++ b/packages/core/parcel-bundler/src/Pipeline.js @@ -49,7 +49,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) { @@ -117,7 +116,7 @@ class Pipeline { type, value: asset.generated[type], // for scope hoisting, we need to post process all JS - final: !(type === 'js' && this.options.scopeHoist) + final: !((type === 'js' && this.options.scopeHoist) || type === 'html') }; } } diff --git a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js index b18b072d558..53a57e99626 100644 --- a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js +++ b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js @@ -1,11 +1,16 @@ const localRequire = require('../utils/localRequire'); -const HTMLAsset = require('./HTMLAsset'); +const Asset = require('../Asset'); -class MarkdownAsset extends HTMLAsset { +class MarkdownAsset extends Asset { + constructor(name, options) { + super(name, options); + this.type = 'html'; + this.hmrPageReload = true; + } async parse(code) { let marked = await localRequire('marked', this.name); - return HTMLAsset.prototype.parse.bind(this)(marked(code)); + this.contents = marked(code); + return this.contents; } } - module.exports = MarkdownAsset; From 6c78aca2eb33a2223f5a0ef7c6d3a5ea61c9e06e Mon Sep 17 00:00:00 2001 From: Kirill Rogovoy Date: Sun, 20 Jan 2019 20:34:43 +0200 Subject: [PATCH 7/8] add needsPipelineProcessing to the Asset --- packages/core/parcel-bundler/src/Pipeline.js | 4 +++- packages/core/parcel-bundler/src/assets/MarkdownAsset.js | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/parcel-bundler/src/Pipeline.js b/packages/core/parcel-bundler/src/Pipeline.js index 9b531379616..d4ca95e2490 100644 --- a/packages/core/parcel-bundler/src/Pipeline.js +++ b/packages/core/parcel-bundler/src/Pipeline.js @@ -116,7 +116,9 @@ class Pipeline { type, value: asset.generated[type], // for scope hoisting, we need to post process all JS - final: !((type === 'js' && this.options.scopeHoist) || type === 'html') + final: asset.hasOwnProperty('needsPipelineProcessing') + ? !asset.needsPipelineProcessing + : !(type === 'js' && this.options.scopeHoist) }; } } diff --git a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js index 53a57e99626..7c24aa38d1e 100644 --- a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js +++ b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js @@ -5,6 +5,7 @@ class MarkdownAsset extends Asset { constructor(name, options) { super(name, options); this.type = 'html'; + this.needsPipelineProcessing = true; this.hmrPageReload = true; } async parse(code) { From 199fe189f0d727b42e1c258a3c5937c16842b7f8 Mon Sep 17 00:00:00 2001 From: Kirill Rogovoy Date: Mon, 21 Jan 2019 11:09:43 +0200 Subject: [PATCH 8/8] Remove needsPipelineProcessing --- packages/core/parcel-bundler/src/Pipeline.js | 4 +--- packages/core/parcel-bundler/src/assets/MarkdownAsset.js | 6 ++---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/packages/core/parcel-bundler/src/Pipeline.js b/packages/core/parcel-bundler/src/Pipeline.js index d4ca95e2490..103f7bfe1ab 100644 --- a/packages/core/parcel-bundler/src/Pipeline.js +++ b/packages/core/parcel-bundler/src/Pipeline.js @@ -116,9 +116,7 @@ class Pipeline { type, value: asset.generated[type], // for scope hoisting, we need to post process all JS - final: asset.hasOwnProperty('needsPipelineProcessing') - ? !asset.needsPipelineProcessing - : !(type === 'js' && this.options.scopeHoist) + final: !(type === 'js' && this.options.scopeHoist) }; } } diff --git a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js index 7c24aa38d1e..076667c8405 100644 --- a/packages/core/parcel-bundler/src/assets/MarkdownAsset.js +++ b/packages/core/parcel-bundler/src/assets/MarkdownAsset.js @@ -5,13 +5,11 @@ class MarkdownAsset extends Asset { constructor(name, options) { super(name, options); this.type = 'html'; - this.needsPipelineProcessing = true; this.hmrPageReload = true; } - async parse(code) { + async generate() { let marked = await localRequire('marked', this.name); - this.contents = marked(code); - return this.contents; + return marked(this.contents); } } module.exports = MarkdownAsset;