From 382cc7107bf7b20d430e07b03f2c9bf376242cf6 Mon Sep 17 00:00:00 2001 From: Owen Buckley Date: Wed, 1 Jun 2022 21:48:09 -0400 Subject: [PATCH 01/11] handle bare specifiers and add specs --- package-lock.json | 143 +++++++++++++++++- package.json | 3 +- src/wcc.js | 9 +- test/cases/node-modules/node-modules.spec.js | 67 ++++++++ .../src/components/events-list.js | 20 +++ test/cases/node-modules/src/index.js | 23 +++ 6 files changed, 260 insertions(+), 5 deletions(-) create mode 100644 test/cases/node-modules/node-modules.spec.js create mode 100644 test/cases/node-modules/src/components/events-list.js create mode 100644 test/cases/node-modules/src/index.js diff --git a/package-lock.json b/package-lock.json index 1d4e89e8..01529a12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wc-compiler", - "version": "0.1.0", + "version": "0.2.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "wc-compiler", - "version": "0.1.0", + "version": "0.2.1", "license": "MIT", "dependencies": { "acorn": "^8.7.0", @@ -22,6 +22,7 @@ "http-server": "^14.1.0", "jsdom": "^19.0.0", "mocha": "^9.2.2", + "node-fetch": "^3.2.5", "nodemon": "^2.0.15", "prismjs": "^1.28.0", "rehype-raw": "^6.1.1", @@ -1269,6 +1270,15 @@ "dev": true, "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -1973,6 +1983,29 @@ "dev": true, "license": "MIT" }, + "node_modules/fetch-blob": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", + "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -2113,6 +2146,18 @@ "node": ">= 6" } }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", @@ -5445,6 +5490,43 @@ "dev": true, "license": "MIT" }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.5.tgz", + "integrity": "sha512-u7zCHdJp8JXBwF09mMfo2CL6kp37TslDl1KP3hRGTlCInBtag+UO3LGVy+NF0VzvnL3PVMpA2hXh1EtECFnyhQ==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, "node_modules/nodemon": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", @@ -7437,6 +7519,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -8673,6 +8764,12 @@ } } }, + "data-uri-to-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz", + "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==", + "dev": true + }, "data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -9167,6 +9264,16 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fetch-blob": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.5.tgz", + "integrity": "sha512-N64ZpKqoLejlrwkIAnb9iLSA3Vx/kjgzpcDhygcqJ2KKjky8nCgUQ+dzXtbrLaWZGZNmNfQTsiQ0weZ1svglHg==", + "dev": true, + "requires": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + } + }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -9253,6 +9360,15 @@ "mime-types": "^2.1.12" } }, + "formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "requires": { + "fetch-blob": "^3.1.2" + } + }, "fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", @@ -11503,6 +11619,23 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true + }, + "node-fetch": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.2.5.tgz", + "integrity": "sha512-u7zCHdJp8JXBwF09mMfo2CL6kp37TslDl1KP3hRGTlCInBtag+UO3LGVy+NF0VzvnL3PVMpA2hXh1EtECFnyhQ==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, "nodemon": { "version": "2.0.15", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.15.tgz", @@ -12882,6 +13015,12 @@ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", "dev": true }, + "web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/package.json b/package.json index d93d84da..8fdc2000 100644 --- a/package.json +++ b/package.json @@ -40,13 +40,14 @@ "http-server": "^14.1.0", "jsdom": "^19.0.0", "mocha": "^9.2.2", + "node-fetch": "^3.2.5", "nodemon": "^2.0.15", "prismjs": "^1.28.0", - "simple.css": "^0.1.3", "rehype-raw": "^6.1.1", "rehype-stringify": "^9.0.3", "remark-parse": "^10.0.1", "remark-rehype": "^10.1.0", + "simple.css": "^0.1.3", "unified": "^10.1.2" } } diff --git a/src/wcc.js b/src/wcc.js index 2bb34c59..cbed750e 100644 --- a/src/wcc.js +++ b/src/wcc.js @@ -57,9 +57,14 @@ async function registerDependencies(moduleURL) { sourceType: 'module' }), { async ImportDeclaration(node) { - const dependencyModuleURL = new URL(node.source.value, moduleURL); + const specifier = node.source.value; + const isBareSpecifier = specifier.indexOf('.') !== 0 && specifier.indexOf('/') !== 0; - await registerDependencies(dependencyModuleURL); + if (!isBareSpecifier) { + const dependencyModuleURL = new URL(node.source.value, moduleURL); + + await registerDependencies(dependencyModuleURL); + } }, async ExpressionStatement(node) { if (isCustomElementDefinitionNode(node)) { diff --git a/test/cases/node-modules/node-modules.spec.js b/test/cases/node-modules/node-modules.spec.js new file mode 100644 index 00000000..adf394a7 --- /dev/null +++ b/test/cases/node-modules/node-modules.spec.js @@ -0,0 +1,67 @@ +/* + * Use Case + * Run wcc against a custom element using a dependency from node-modules + * + * User Result + * Should run without error. + * + * User Workspace + * src/ + * components/ + * events-list.js + * index.js + */ + +import chai from 'chai'; +import { JSDOM } from 'jsdom'; +import { renderToString } from '../../../src/wcc.js'; + +const expect = chai.expect; + +describe('Run WCC For ', function() { + const LABEL = 'Custom Element w/ a node modules dependency'; + let dom; + let pageContentsDom; + + before(async function() { + // await renderToString(new URL('./src/index.js', import.meta.url)); + + // console.debug({ html }); + // dom = new JSDOM(html); + // pageContentsDom = new JSDOM(dom.window.document.querySelectorAll('template[shadowroot="open"]')[0].innerHTML); + }); + + describe(LABEL, function() { + it('should not fail', function() { + Promise.resolve(renderToString(new URL('./src/index.js', import.meta.url))); + // expect(true).to.equal(true); + // expect(dom).to.be.not.undefined; + }); + + // describe('static page content', function() { + // it('should have the expected static content for the page', function() { + // expect(pageContentsDom.window.document.querySelector('h1').textContent).to.equal('Counter'); + // }); + // }); + + // describe('custom element', function() { + // let counterContentsDom; + // let count; + + // before(function() { + // counterContentsDom = new JSDOM(pageContentsDom.window.document.querySelectorAll('wcc-counter template[shadowroot="open"]')[0].innerHTML); + // count = JSON.parse(counterContentsDom.window.document.querySelector('script[type="application/json"]').textContent).count; + // }); + + // it('should have two