From e861b4ddd42f0af95e7bab127886266be906dd79 Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Sat, 12 Nov 2022 01:36:26 -0600 Subject: [PATCH] fix: fix marked.use with multiple args --- src/marked.js | 16 ++++++++-------- test/unit/marked-spec.js | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/marked.js b/src/marked.js index feb500397f..157c8ec2e9 100644 --- a/src/marked.js +++ b/src/marked.js @@ -153,20 +153,23 @@ marked.defaults = defaults; */ marked.use = function(...args) { - const opts = merge({}, ...args); const extensions = marked.defaults.extensions || { renderers: {}, childTokens: {} }; - let hasExtensions; args.forEach((pack) => { + // copy options to new object + const opts = merge({}, pack); + + // set async to true if it was set to true before + opts.async = marked.defaults.async || opts.async; + // ==-- Parse "addon" extensions --== // if (pack.extensions) { - hasExtensions = true; pack.extensions.forEach((ext) => { if (!ext.name) { throw new Error('extension name required'); } if (ext.renderer) { // Renderer extensions - const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null; + const prevRenderer = extensions.renderers[ext.name]; if (prevRenderer) { // Replace extension with func to run new extension but fall back if false extensions.renderers[ext.name] = function(...args) { @@ -209,6 +212,7 @@ marked.use = function(...args) { extensions.childTokens[ext.name] = ext.childTokens; } }); + opts.extensions = extensions; } // ==-- Parse "overwrite" extensions --== // @@ -256,10 +260,6 @@ marked.use = function(...args) { }; } - if (hasExtensions) { - opts.extensions = extensions; - } - marked.setOptions(opts); }); }; diff --git a/test/unit/marked-spec.js b/test/unit/marked-spec.js index d72d0fba72..e9bfba1782 100644 --- a/test/unit/marked-spec.js +++ b/test/unit/marked-spec.js @@ -1,4 +1,4 @@ -import { marked, Renderer, Slugger, lexer, parseInline, use, getDefaults, walkTokens as _walkTokens } from '../../src/marked.js'; +import { marked, Renderer, Slugger, lexer, parseInline, use, getDefaults, walkTokens as _walkTokens, defaults, setOptions } from '../../src/marked.js'; describe('Test heading ID functionality', () => { it('should add id attribute by default', () => { @@ -612,6 +612,41 @@ used extension2 walked

runTest(); }); + + it('should merge extensions correctly', () => { + use( + {}, + { tokenizer: {} }, + { renderer: {} }, + { walkTokens: () => {} }, + { extensions: [] } + ); + + expect(() => marked('# test')).not.toThrow(); + }); + }); + + it('should be async if any extension in use args is async', () => { + use( + { async: true }, + { async: false } + ); + + expect(defaults.async).toBeTrue(); + }); + + it('should be async if any extension in use is async', () => { + use({ async: true }); + use({ async: false }); + + expect(defaults.async).toBeTrue(); + }); + + it('should reset async with setOptions', () => { + use({ async: true }); + setOptions({ async: false }); + + expect(defaults.async).toBeFalse(); }); it('should allow deleting/editing tokens', () => {