diff --git a/.changeset/grumpy-kids-check.md b/.changeset/grumpy-kids-check.md new file mode 100644 index 0000000000..d4ef898acf --- /dev/null +++ b/.changeset/grumpy-kids-check.md @@ -0,0 +1,6 @@ +--- +"@marko/compiler": minor +"marko": minor +--- + +Add "exports" to marko.json diff --git a/packages/compiler/src/taglib/finder/index.js b/packages/compiler/src/taglib/finder/index.js index b9547d18f2..fc123387f6 100644 --- a/packages/compiler/src/taglib/finder/index.js +++ b/packages/compiler/src/taglib/finder/index.js @@ -120,7 +120,7 @@ function find(dirname, registeredTaglibs) { nodePath.join(name, "marko.json") ); if (taglibPath) { - var taglib = taglibLoader.loadTaglibFromFile(taglibPath); + var taglib = taglibLoader.loadTaglibFromFile(taglibPath, true); helper.addTaglib(taglib); } } diff --git a/packages/compiler/src/taglib/loader/Taglib.js b/packages/compiler/src/taglib/loader/Taglib.js index 9a7dd7856c..c169cfd258 100644 --- a/packages/compiler/src/taglib/loader/Taglib.js +++ b/packages/compiler/src/taglib/loader/Taglib.js @@ -26,9 +26,10 @@ function handleImport(taglib, importedTaglib) { } class Taglib { - constructor(filePath) { + constructor(filePath, isFromPackageJson) { ok(filePath, '"filePath" expected'); this.filePath = this.path /* deprecated */ = this.id = filePath; + this.isFromPackageJson = isFromPackageJson === true; this.dirname = path.dirname(this.filePath); this.scriptLang = undefined; this.tags = {}; diff --git a/packages/compiler/src/taglib/loader/index.js b/packages/compiler/src/taglib/loader/index.js index 4fd5a1e894..2fd12b7996 100644 --- a/packages/compiler/src/taglib/loader/index.js +++ b/packages/compiler/src/taglib/loader/index.js @@ -8,8 +8,8 @@ function loadTaglibFromProps(taglib, taglibProps) { return loaders.loadTaglibFromProps(taglib, taglibProps); } -function loadTaglibFromFile(filePath) { - return loaders.loadTaglibFromFile(filePath); +function loadTaglibFromFile(filePath, isFromPackageJson) { + return loaders.loadTaglibFromFile(filePath, isFromPackageJson); } function loadTaglibFromDir(filePath) { diff --git a/packages/compiler/src/taglib/loader/loadTaglibFromFile.js b/packages/compiler/src/taglib/loader/loadTaglibFromFile.js index 657b248f5b..62ec78653b 100644 --- a/packages/compiler/src/taglib/loader/loadTaglibFromFile.js +++ b/packages/compiler/src/taglib/loader/loadTaglibFromFile.js @@ -5,7 +5,7 @@ var loaders = require("./loaders"); var ok = require("assert").ok; -function loadFromFile(filePath) { +function loadFromFile(filePath, isFromPackageJson) { ok(filePath, '"filePath" is required'); var taglib = cache.get(filePath); @@ -13,7 +13,7 @@ function loadFromFile(filePath) { // Only load a taglib once by caching the loaded taglibs using the file // system file path as the key if (!taglib) { - taglib = new types.Taglib(filePath); + taglib = new types.Taglib(filePath, isFromPackageJson); cache.put(filePath, taglib); var taglibProps = jsonFileReader.readFileSync(filePath); diff --git a/packages/compiler/src/taglib/loader/loadTaglibFromProps.js b/packages/compiler/src/taglib/loader/loadTaglibFromProps.js index 691070453d..da4445304e 100644 --- a/packages/compiler/src/taglib/loader/loadTaglibFromProps.js +++ b/packages/compiler/src/taglib/loader/loadTaglibFromProps.js @@ -252,6 +252,24 @@ class TaglibLoader { } } + exports(dir) { + var taglib = this.taglib; + var path = this.filePath; + var dirname = this.dirname; + + if (taglib.isFromPackageJson) { + taglib.tagsDir = false; + + scanTagsDir( + path, + dirname, + dir, + taglib, + this.dependencyChain.append(`exports`) + ); + } + } + taglibImports(imports) { // The "taglib-imports" property allows another taglib to be imported // into this taglib so that the tags defined in the imported taglib diff --git a/packages/marko/docs/marko-json.md b/packages/marko/docs/marko-json.md index b6e5ce3d75..ea1905bd02 100644 --- a/packages/marko/docs/marko-json.md +++ b/packages/marko/docs/marko-json.md @@ -131,6 +131,7 @@ Similar to [`marko-tag.json`](#single-component-definition), this file is discov ```js { "taglib-id": "my-custom-tag-library", // Names the component library, for better errors. + "exports": "./dist", // Where to export the compiled components. "tags-dir": "./ui-modules", // What directory to crawl to autodiscover components. Default:`./components/` "taglib-imports": ["./some-folder/marko.json", "./other-folder/marko.json"], // Creates a _combined_ tag library by referencing others. diff --git a/packages/marko/test/taglib-finder/fixtures/exports/_dist/components/dist-tag.marko b/packages/marko/test/taglib-finder/fixtures/exports/_dist/components/dist-tag.marko new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/marko/test/taglib-finder/fixtures/exports/components/dev-tag.marko b/packages/marko/test/taglib-finder/fixtures/exports/components/dev-tag.marko new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/marko/test/taglib-finder/fixtures/exports/marko.json b/packages/marko/test/taglib-finder/fixtures/exports/marko.json new file mode 100644 index 0000000000..749ba06d90 --- /dev/null +++ b/packages/marko/test/taglib-finder/fixtures/exports/marko.json @@ -0,0 +1,3 @@ +{ + "exports": "_dist/components" +} diff --git a/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/_dist/components/included-tag.marko b/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/_dist/components/included-tag.marko new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/marko.json b/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/marko.json new file mode 100644 index 0000000000..0b02ca0254 --- /dev/null +++ b/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/marko.json @@ -0,0 +1,3 @@ +{ + "exports": "_dist/components" +} \ No newline at end of file diff --git a/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/package.json b/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/package.json new file mode 100644 index 0000000000..3e24efe297 --- /dev/null +++ b/packages/marko/test/taglib-finder/fixtures/exports/node_modules/included-dependency/package.json @@ -0,0 +1,4 @@ +{ + "name": "included-dependency", + "version": "0.0.1" +} diff --git a/packages/marko/test/taglib-finder/fixtures/exports/package.json b/packages/marko/test/taglib-finder/fixtures/exports/package.json new file mode 100644 index 0000000000..c0378fd737 --- /dev/null +++ b/packages/marko/test/taglib-finder/fixtures/exports/package.json @@ -0,0 +1,7 @@ +{ + "name": "taglib-finder-test", + "version": "0.0.0", + "dependencies": { + "included-dependency": "0.0.1" + } +} diff --git a/packages/marko/test/taglib-finder/fixtures/exports/test.js b/packages/marko/test/taglib-finder/fixtures/exports/test.js new file mode 100644 index 0000000000..baab01d849 --- /dev/null +++ b/packages/marko/test/taglib-finder/fixtures/exports/test.js @@ -0,0 +1,11 @@ +var expect = require("chai").expect; + +exports.check = function (taglibFinder) { + const discoveredTags = taglibFinder + .find(__dirname, []) + .flatMap((taglib) => Object.keys(taglib.tags)); + + expect(discoveredTags).to.include("included-tag"); + expect(discoveredTags).to.include("dev-tag"); + expect(discoveredTags).to.not.include("dist-tag"); +};