marko 4.27.0 → 4.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -103,6 +103,7 @@ const helpers = {
103
103
  forIn: "marko/runtime/helpers/for-in",
104
104
  forRange: "marko/runtime/helpers/for-range",
105
105
  getWidgetFromOut: "marko/runtime/components/legacy/helper-getWidgetFromOut",
106
+ interopRequireDefault: "marko/runtime/helpers/interop-require",
106
107
  loadNestedTag: "marko/runtime/helpers/load-nested-tag",
107
108
  loadTag: "marko/runtime/helpers/load-tag",
108
109
  loadTemplate: "marko/runtime/helpers/load-template",
@@ -480,6 +480,7 @@ class CustomTag extends HtmlElement {
480
480
  let tagVar = codegen.addStaticVar(tagVarName, loadTag);
481
481
 
482
482
  renderTagNode = this.generateRenderTagCode(codegen, tagVar, [inputProps, builder.identifierOut()]);
483
+ renderTagNode._isTagCall = true;
483
484
  } else {
484
485
  if (rendererRequirePath) {
485
486
  codegen.pushMeta("tags", rendererRequirePath, true);
@@ -516,8 +517,10 @@ class CustomTag extends HtmlElement {
516
517
 
517
518
  if (isNestedTag) {
518
519
  renderTagNode = builder.functionCall(tagVar, tagArgs);
520
+ renderTagNode._isNestedTagCall = true;
519
521
  } else {
520
522
  renderTagNode = this.generateRenderTagCode(codegen, tagVar, tagArgs);
523
+ renderTagNode._isTagCall = true;
521
524
  }
522
525
  }
523
526
 
@@ -533,10 +536,22 @@ class CustomTag extends HtmlElement {
533
536
  let renderBodyFunction;
534
537
 
535
538
  if (hasBody) {
536
- if (this._mergedRenderBodyStart !== undefined) {
537
- const mergedRenderBody = builder.renderBodyFunction(body.slice(this._mergedRenderBodyStart));
538
- body = body.slice(0, this._mergedRenderBodyStart);
539
- body.push(builder.returnStatement(mergedRenderBody));
539
+ if (this._hasDynamicNestedTags) {
540
+ const renderBody = [];
541
+ const newBody = [];
542
+
543
+ for (const child of body) {
544
+ if (hasHTML(child, context)) {
545
+ renderBody.push(child);
546
+ } else {
547
+ newBody.push(child);
548
+ }
549
+ }
550
+
551
+ if (renderBody.length) {
552
+ newBody.push(builder.returnStatement(builder.renderBodyFunction(renderBody)));
553
+ body = newBody;
554
+ }
540
555
  }
541
556
 
542
557
  if (tagDef.bodyFunction) {
@@ -625,27 +640,7 @@ class CustomTag extends HtmlElement {
625
640
  return null;
626
641
  } else {
627
642
  this._isDirectlyNestedTag = false;
628
-
629
- if (!parentCustomTag._hasDynamicNestedTags) {
630
- parentCustomTag._hasDynamicNestedTags = true;
631
-
632
- let nextBodyContent = parentCustomTag.firstChild;
633
- let i = 0;
634
-
635
- do {
636
- if (nextBodyContent.type === "Text" || nextBodyContent.type === "Scriptlet" || (nextBodyContent.type === "HtmlElement" || nextBodyContent.type === "CustomTag") && !(nextBodyContent.tagDef && (nextBodyContent.tagDef.isNestedTag || nextBodyContent.tagDef.codeGeneratorModulePath))) {
637
- parentCustomTag._mergedRenderBodyStart = i;
638
- break;
639
- }
640
-
641
- nextBodyContent = nextBodyContent.nextSibling;
642
- i++;
643
- } while (nextBodyContent);
644
-
645
- if (!i) {
646
- context.addError(parentCustomTag, "Render body content must come after any dynamic nested attribute tags.");
647
- }
648
- }
643
+ parentCustomTag._hasDynamicNestedTags = true;
649
644
  }
650
645
  }
651
646
 
@@ -660,4 +655,21 @@ class CustomTag extends HtmlElement {
660
655
  }
661
656
  }
662
657
 
658
+ function hasHTML(node, context) {
659
+ let hasHTML = false;
660
+ const walker = context.createWalker({
661
+ enter(node) {
662
+ if (node.type === "Html" || node.type === "TextVDOM" || node._isTagCall) {
663
+ hasHTML = true;
664
+ walker.stop();
665
+ } else if (node._isNestedTagCall) {
666
+ walker.skip();
667
+ }
668
+ }
669
+ });
670
+
671
+ walker.walk(node);
672
+ return hasHTML;
673
+ }
674
+
663
675
  module.exports = CustomTag;
@@ -94,7 +94,7 @@ module.exports = function handleComponentBind(options) {
94
94
  if (rendererModule.inlineId) {
95
95
  markoComponentVar = rendererModule.inlineId;
96
96
  } else if (!isImplicitComponent) {
97
- markoComponentVar = context.addStaticVar("marko_component", builder.require(builder.literal(rendererModule.requirePath)));
97
+ markoComponentVar = context.addStaticVar("marko_component", builder.functionCall(context.helper("interopRequireDefault"), [builder.require(builder.literal(rendererModule.requirePath))]));
98
98
  }
99
99
  }
100
100
 
@@ -27,6 +27,8 @@ var deferredDefs;
27
27
  var pendingDefs;
28
28
 
29
29
  function register(type, def) {
30
+ if (def.default) def = def.default;
31
+
30
32
  var pendingForType;
31
33
  if (pendingDefs) {
32
34
  pendingForType = pendingDefs[type];
@@ -5,6 +5,7 @@ var changeCase = require("./_change-case");
5
5
  var ComponentsContext = require("../components/ComponentsContext");
6
6
  var getComponentsContext = ComponentsContext.U_;
7
7
  var ComponentDef = require("../components/ComponentDef");
8
+ var interopRequire = require("./interop-require");
8
9
  var w10NOOP = require("warp10/constants").NOOP;
9
10
  var RENDER_BODY_TO_JSON = function () {
10
11
  return w10NOOP;
@@ -44,6 +45,8 @@ module.exports = function dynamicTag(out, tag, getAttrs, renderBody, args, props
44
45
  }
45
46
  }
46
47
 
48
+ tag = interopRequire(tag);
49
+
47
50
  var renderer = tag._ || (tag.renderer ? tag.renderer.renderer || tag.renderer : tag.render);
48
51
 
49
52
  // eslint-disable-next-line no-constant-condition
@@ -0,0 +1,3 @@
1
+ module.exports = function interopRequireDefault(mod) {
2
+ return mod.default || mod;
3
+ };
@@ -219,8 +219,12 @@ function morphdom(fromNode, toNode, host, componentsContext) {
219
219
  if (!curToNodeChild.ae_) {
220
220
  // We just skip over the fromNode if it is preserved
221
221
 
222
- if (compareNodeNames(curToNodeChild, curVFromNodeChild)) {
223
- morphEl(curFromNodeChild, curVFromNodeChild, curToNodeChild, parentComponent);
222
+ if (curVFromNodeChild && curToNodeType === curVFromNodeChild.bX_ && (curToNodeType !== ELEMENT_NODE || compareNodeNames(curToNodeChild, curVFromNodeChild))) {
223
+ if (curToNodeType === ELEMENT_NODE) {
224
+ morphEl(curFromNodeChild, curVFromNodeChild, curToNodeChild, parentComponent);
225
+ } else {
226
+ morphChildren(curFromNodeChild, curToNodeChild, parentComponent);
227
+ }
224
228
  } else {
225
229
  // Remove the old node
226
230
  detachNode(curFromNodeChild, fromNode, ownerComponent);
@@ -300,7 +304,7 @@ function morphdom(fromNode, toNode, host, componentsContext) {
300
304
  if (!curToNodeChild.ae_) {
301
305
  curVFromNodeChild = vElementByDOMNode.get(matchingFromEl);
302
306
 
303
- if (compareNodeNames(curVFromNodeChild, curToNodeChild)) {
307
+ if (curVFromNodeChild && curToNodeType === curVFromNodeChild.bX_ && (curToNodeType !== ELEMENT_NODE || compareNodeNames(curVFromNodeChild, curToNodeChild))) {
304
308
  if (fromNextSibling === matchingFromEl) {
305
309
  // Single element removal:
306
310
  // A <-> A
@@ -348,7 +352,11 @@ function morphdom(fromNode, toNode, host, componentsContext) {
348
352
  }
349
353
  }
350
354
 
351
- morphEl(matchingFromEl, curVFromNodeChild, curToNodeChild, parentComponent);
355
+ if (curToNodeType === ELEMENT_NODE) {
356
+ morphEl(matchingFromEl, curVFromNodeChild, curToNodeChild, parentComponent);
357
+ } else {
358
+ morphChildren(matchingFromEl, curToNodeChild, parentComponent);
359
+ }
352
360
  } else {
353
361
  insertVirtualNodeBefore(curToNodeChild, curToNodeKey, curFromNodeChild, fromNode, ownerComponent, parentComponent);
354
362
  detachNode(matchingFromEl, fromNode, ownerComponent);
@@ -124,7 +124,7 @@ function find(dirname, registeredTaglibs) {
124
124
  if (!excludedPackages[name]) {
125
125
  let taglibPath = resolveFrom(rootPkg.__dirname, name + "/marko.json");
126
126
  if (taglibPath) {
127
- var taglib = taglibLoader.loadTaglibFromFile(taglibPath);
127
+ var taglib = taglibLoader.loadTaglibFromFile(taglibPath, true);
128
128
  helper.addTaglib(taglib);
129
129
  }
130
130
  }
@@ -28,9 +28,10 @@ function handleImport(taglib, importedTaglib) {
28
28
  }
29
29
 
30
30
  class Taglib {
31
- constructor(filePath) {
31
+ constructor(filePath, isFromPackageJson) {
32
32
  ok(filePath, '"filePath" expected');
33
33
  this.filePath = this.path /* deprecated */ = this.id = filePath;
34
+ this.isFromPackageJson = isFromPackageJson === true;
34
35
  this.dirname = path.dirname(this.filePath);
35
36
  this.tags = {};
36
37
  this.textTransformers = [];
@@ -8,8 +8,8 @@ function loadTaglibFromProps(taglib, taglibProps) {
8
8
  return loaders.loadTaglibFromProps(taglib, taglibProps);
9
9
  }
10
10
 
11
- function loadTaglibFromFile(filePath) {
12
- return loaders.loadTaglibFromFile(filePath);
11
+ function loadTaglibFromFile(filePath, isFromPackageJson) {
12
+ return loaders.loadTaglibFromFile(filePath, isFromPackageJson);
13
13
  }
14
14
 
15
15
  function loadTaglibFromDir(filePath) {
@@ -5,7 +5,7 @@ var loaders = require("./loaders");
5
5
 
6
6
  var ok = require("assert").ok;
7
7
 
8
- function loadFromFile(filePath) {
8
+ function loadFromFile(filePath, isFromPackageJson) {
9
9
  ok(filePath, '"filePath" is required');
10
10
 
11
11
  var taglib = cache.get(filePath);
@@ -13,7 +13,7 @@ function loadFromFile(filePath) {
13
13
  // Only load a taglib once by caching the loaded taglibs using the file
14
14
  // system file path as the key
15
15
  if (!taglib) {
16
- taglib = new types.Taglib(filePath);
16
+ taglib = new types.Taglib(filePath, isFromPackageJson);
17
17
  cache.put(filePath, taglib);
18
18
 
19
19
  var taglibProps = jsonFileReader.readFileSync(filePath);
@@ -221,6 +221,18 @@ class TaglibLoader {
221
221
  }
222
222
  }
223
223
 
224
+ exports(dir) {
225
+ var taglib = this.taglib;
226
+ var path = this.filePath;
227
+ var dirname = this.dirname;
228
+
229
+ if (taglib.isFromPackageJson) {
230
+ taglib.tagsDir = false;
231
+
232
+ scanTagsDir(path, dirname, dir, taglib, this.dependencyChain.append(`exports`));
233
+ }
234
+ }
235
+
224
236
  taglibImports(imports) {
225
237
  if (!resolveFrom) {
226
238
  return;
package/package.json CHANGED
@@ -1,10 +1,9 @@
1
1
  {
2
2
  "name": "marko",
3
- "version": "4.27.0",
3
+ "version": "4.28.1",
4
4
  "license": "MIT",
5
5
  "description": "UI Components + streaming, async, high performance, HTML templating for Node.js and the browser.",
6
6
  "dependencies": {
7
- "acorn": "^7.4.0",
8
7
  "app-module-path": "^2.2.0",
9
8
  "argly": "^1.0.0",
10
9
  "browser-refresh-client": "^1.0.0",
@@ -106,6 +106,7 @@ const helpers = {
106
106
  forIn: "marko/runtime/helpers/for-in",
107
107
  forRange: "marko/runtime/helpers/for-range",
108
108
  getWidgetFromOut: "marko/runtime/components/legacy/helper-getWidgetFromOut",
109
+ interopRequireDefault: "marko/runtime/helpers/interop-require",
109
110
  loadNestedTag: "marko/runtime/helpers/load-nested-tag",
110
111
  loadTag: "marko/runtime/helpers/load-tag",
111
112
  loadTemplate: "marko/runtime/helpers/load-template",
@@ -560,6 +560,7 @@ class CustomTag extends HtmlElement {
560
560
  inputProps,
561
561
  builder.identifierOut(),
562
562
  ]);
563
+ renderTagNode._isTagCall = true;
563
564
  } else {
564
565
  if (rendererRequirePath) {
565
566
  codegen.pushMeta("tags", rendererRequirePath, true);
@@ -623,8 +624,10 @@ class CustomTag extends HtmlElement {
623
624
 
624
625
  if (isNestedTag) {
625
626
  renderTagNode = builder.functionCall(tagVar, tagArgs);
627
+ renderTagNode._isNestedTagCall = true
626
628
  } else {
627
629
  renderTagNode = this.generateRenderTagCode(codegen, tagVar, tagArgs);
630
+ renderTagNode._isTagCall = true;
628
631
  }
629
632
  }
630
633
 
@@ -640,12 +643,22 @@ class CustomTag extends HtmlElement {
640
643
  let renderBodyFunction;
641
644
 
642
645
  if (hasBody) {
643
- if (this._mergedRenderBodyStart !== undefined) {
644
- const mergedRenderBody = builder.renderBodyFunction(
645
- body.slice(this._mergedRenderBodyStart)
646
- );
647
- body = body.slice(0, this._mergedRenderBodyStart);
648
- body.push(builder.returnStatement(mergedRenderBody));
646
+ if (this._hasDynamicNestedTags) {
647
+ const renderBody = [];
648
+ const newBody = [];
649
+
650
+ for (const child of body) {
651
+ if (hasHTML(child, context)) {
652
+ renderBody.push(child);
653
+ } else {
654
+ newBody.push(child);
655
+ }
656
+ }
657
+
658
+ if (renderBody.length) {
659
+ newBody.push(builder.returnStatement(builder.renderBodyFunction(renderBody)));
660
+ body = newBody;
661
+ }
649
662
  }
650
663
 
651
664
  if (tagDef.bodyFunction) {
@@ -756,40 +769,7 @@ class CustomTag extends HtmlElement {
756
769
  return null;
757
770
  } else {
758
771
  this._isDirectlyNestedTag = false;
759
-
760
- if (!parentCustomTag._hasDynamicNestedTags) {
761
- parentCustomTag._hasDynamicNestedTags = true;
762
-
763
- let nextBodyContent = parentCustomTag.firstChild;
764
- let i = 0;
765
-
766
- do {
767
- if (
768
- nextBodyContent.type === "Text" ||
769
- nextBodyContent.type === "Scriptlet" ||
770
- ((nextBodyContent.type === "HtmlElement" ||
771
- nextBodyContent.type === "CustomTag") &&
772
- !(
773
- nextBodyContent.tagDef &&
774
- (nextBodyContent.tagDef.isNestedTag ||
775
- nextBodyContent.tagDef.codeGeneratorModulePath)
776
- ))
777
- ) {
778
- parentCustomTag._mergedRenderBodyStart = i;
779
- break;
780
- }
781
-
782
- nextBodyContent = nextBodyContent.nextSibling;
783
- i++;
784
- } while (nextBodyContent);
785
-
786
- if (!i) {
787
- context.addError(
788
- parentCustomTag,
789
- "Render body content must come after any dynamic nested attribute tags."
790
- );
791
- }
792
- }
772
+ parentCustomTag._hasDynamicNestedTags = true;
793
773
  }
794
774
  }
795
775
 
@@ -812,4 +792,21 @@ class CustomTag extends HtmlElement {
812
792
  }
813
793
  }
814
794
 
795
+ function hasHTML(node, context) {
796
+ let hasHTML = false;
797
+ const walker = context.createWalker({
798
+ enter(node) {
799
+ if (node.type === "Html" || node.type === "TextVDOM" || node._isTagCall) {
800
+ hasHTML = true;
801
+ walker.stop();
802
+ } else if (node._isNestedTagCall) {
803
+ walker.skip();
804
+ }
805
+ },
806
+ });
807
+
808
+ walker.walk(node);
809
+ return hasHTML;
810
+ }
811
+
815
812
  module.exports = CustomTag;
@@ -115,7 +115,9 @@ module.exports = function handleComponentBind(options) {
115
115
  } else if (!isImplicitComponent) {
116
116
  markoComponentVar = context.addStaticVar(
117
117
  "marko_component",
118
- builder.require(builder.literal(rendererModule.requirePath))
118
+ builder.functionCall(context.helper("interopRequireDefault"), [
119
+ builder.require(builder.literal(rendererModule.requirePath))
120
+ ])
119
121
  );
120
122
  }
121
123
  }
@@ -14,7 +14,7 @@ var stateToJSONDef = {
14
14
  return this;
15
15
  }
16
16
  };
17
- function noop() { }
17
+ function noop() {}
18
18
 
19
19
  module.exports = function defineWidget(def, renderer) {
20
20
  def = def.Widget || def;
@@ -23,7 +23,7 @@ module.exports = function defineWidget(def, renderer) {
23
23
  return def;
24
24
  }
25
25
 
26
- var ComponentClass = function () { };
26
+ var ComponentClass = function () {};
27
27
  var proto;
28
28
  var legacyInit;
29
29
 
@@ -29,6 +29,8 @@ var deferredDefs;
29
29
  var pendingDefs;
30
30
 
31
31
  function register(type, def) {
32
+ if (def.default) def = def.default;
33
+
32
34
  var pendingForType;
33
35
  if (pendingDefs) {
34
36
  pendingForType = pendingDefs[type];
@@ -5,6 +5,7 @@ var changeCase = require("./_change-case");
5
5
  var ComponentsContext = require("../components/ComponentsContext");
6
6
  var getComponentsContext = ComponentsContext.___getComponentsContext;
7
7
  var ComponentDef = require("../components/ComponentDef");
8
+ var interopRequire = require("./interop-require");
8
9
  var w10NOOP = require("warp10/constants").NOOP;
9
10
  var RENDER_BODY_TO_JSON = function () {
10
11
  return w10NOOP;
@@ -66,6 +67,8 @@ module.exports = function dynamicTag(
66
67
  }
67
68
  }
68
69
 
70
+ tag = interopRequire(tag);
71
+
69
72
  var renderer =
70
73
  tag._ ||
71
74
  (tag.renderer ? tag.renderer.renderer || tag.renderer : tag.render);
@@ -0,0 +1,3 @@
1
+ module.exports = function interopRequireDefault(mod) {
2
+ return mod.default || mod;
3
+ }
@@ -281,13 +281,26 @@ function morphdom(fromNode, toNode, host, componentsContext) {
281
281
  if (!curToNodeChild.___preserve) {
282
282
  // We just skip over the fromNode if it is preserved
283
283
 
284
- if (compareNodeNames(curToNodeChild, curVFromNodeChild)) {
285
- morphEl(
286
- curFromNodeChild,
287
- curVFromNodeChild,
288
- curToNodeChild,
289
- parentComponent
290
- );
284
+ if (
285
+ curVFromNodeChild &&
286
+ curToNodeType === curVFromNodeChild.___nodeType &&
287
+ (curToNodeType !== ELEMENT_NODE ||
288
+ compareNodeNames(curToNodeChild, curVFromNodeChild))
289
+ ) {
290
+ if (curToNodeType === ELEMENT_NODE) {
291
+ morphEl(
292
+ curFromNodeChild,
293
+ curVFromNodeChild,
294
+ curToNodeChild,
295
+ parentComponent,
296
+ );
297
+ } else {
298
+ morphChildren(
299
+ curFromNodeChild,
300
+ curToNodeChild,
301
+ parentComponent,
302
+ );
303
+ }
291
304
  } else {
292
305
  // Remove the old node
293
306
  detachNode(curFromNodeChild, fromNode, ownerComponent);
@@ -404,7 +417,12 @@ function morphdom(fromNode, toNode, host, componentsContext) {
404
417
  if (!curToNodeChild.___preserve) {
405
418
  curVFromNodeChild = vElementByDOMNode.get(matchingFromEl);
406
419
 
407
- if (compareNodeNames(curVFromNodeChild, curToNodeChild)) {
420
+ if (
421
+ curVFromNodeChild &&
422
+ curToNodeType === curVFromNodeChild.___nodeType &&
423
+ (curToNodeType !== ELEMENT_NODE ||
424
+ compareNodeNames(curVFromNodeChild, curToNodeChild))
425
+ ) {
408
426
  if (fromNextSibling === matchingFromEl) {
409
427
  // Single element removal:
410
428
  // A <-> A
@@ -455,12 +473,21 @@ function morphdom(fromNode, toNode, host, componentsContext) {
455
473
  }
456
474
  }
457
475
 
458
- morphEl(
459
- matchingFromEl,
460
- curVFromNodeChild,
461
- curToNodeChild,
462
- parentComponent
463
- );
476
+ if (curToNodeType === ELEMENT_NODE) {
477
+ morphEl(
478
+ matchingFromEl,
479
+ curVFromNodeChild,
480
+ curToNodeChild,
481
+ parentComponent
482
+ );
483
+ } else {
484
+ morphChildren(
485
+ matchingFromEl,
486
+ curToNodeChild,
487
+ parentComponent,
488
+ );
489
+ }
490
+
464
491
  } else {
465
492
  insertVirtualNodeBefore(
466
493
  curToNodeChild,
@@ -123,7 +123,7 @@ function find(dirname, registeredTaglibs) {
123
123
  if (!excludedPackages[name]) {
124
124
  let taglibPath = resolveFrom(rootPkg.__dirname, name + "/marko.json");
125
125
  if (taglibPath) {
126
- var taglib = taglibLoader.loadTaglibFromFile(taglibPath);
126
+ var taglib = taglibLoader.loadTaglibFromFile(taglibPath, true);
127
127
  helper.addTaglib(taglib);
128
128
  }
129
129
  }
@@ -27,9 +27,10 @@ function handleImport(taglib, importedTaglib) {
27
27
  }
28
28
 
29
29
  class Taglib {
30
- constructor(filePath) {
30
+ constructor(filePath, isFromPackageJson) {
31
31
  ok(filePath, '"filePath" expected');
32
32
  this.filePath = this.path /* deprecated */ = this.id = filePath;
33
+ this.isFromPackageJson = isFromPackageJson === true;
33
34
  this.dirname = path.dirname(this.filePath);
34
35
  this.tags = {};
35
36
  this.textTransformers = [];
@@ -8,8 +8,8 @@ function loadTaglibFromProps(taglib, taglibProps) {
8
8
  return loaders.loadTaglibFromProps(taglib, taglibProps);
9
9
  }
10
10
 
11
- function loadTaglibFromFile(filePath) {
12
- return loaders.loadTaglibFromFile(filePath);
11
+ function loadTaglibFromFile(filePath, isFromPackageJson) {
12
+ return loaders.loadTaglibFromFile(filePath, isFromPackageJson);
13
13
  }
14
14
 
15
15
  function loadTaglibFromDir(filePath) {
@@ -5,7 +5,7 @@ var loaders = require("./loaders");
5
5
 
6
6
  var ok = require("assert").ok;
7
7
 
8
- function loadFromFile(filePath) {
8
+ function loadFromFile(filePath, isFromPackageJson) {
9
9
  ok(filePath, '"filePath" is required');
10
10
 
11
11
  var taglib = cache.get(filePath);
@@ -13,7 +13,7 @@ function loadFromFile(filePath) {
13
13
  // Only load a taglib once by caching the loaded taglibs using the file
14
14
  // system file path as the key
15
15
  if (!taglib) {
16
- taglib = new types.Taglib(filePath);
16
+ taglib = new types.Taglib(filePath, isFromPackageJson);
17
17
  cache.put(filePath, taglib);
18
18
 
19
19
  var taglibProps = jsonFileReader.readFileSync(filePath);
@@ -258,6 +258,24 @@ class TaglibLoader {
258
258
  }
259
259
  }
260
260
 
261
+ exports(dir) {
262
+ var taglib = this.taglib;
263
+ var path = this.filePath;
264
+ var dirname = this.dirname;
265
+
266
+ if (taglib.isFromPackageJson) {
267
+ taglib.tagsDir = false;
268
+
269
+ scanTagsDir(
270
+ path,
271
+ dirname,
272
+ dir,
273
+ taglib,
274
+ this.dependencyChain.append(`exports`)
275
+ );
276
+ }
277
+ }
278
+
261
279
  taglibImports(imports) {
262
280
  if (!resolveFrom) {
263
281
  return;