From b187eece96db44ab85c817adbda28744f93899f2 Mon Sep 17 00:00:00 2001 From: Lars den Bakker Date: Sun, 8 Dec 2019 12:40:37 +0100 Subject: [PATCH 1/3] feat(building-rollup): support optional chaining and nullish coalescing --- packages/building-rollup/demo/js/demo-app.js | 4 ++ packages/building-rollup/demo/js/index.html | 2 + .../building-rollup/demo/ts-babel/demo-app.ts | 4 ++ .../building-rollup/demo/ts-babel/index.html | 2 + .../modern-and-legacy-config.js | 8 +++ packages/building-rollup/modern-config.js | 8 +++ packages/building-rollup/package.json | 2 + .../building-rollup/test/integration.test.js | 2 + yarn.lock | 52 +++++++++++-------- 9 files changed, 62 insertions(+), 22 deletions(-) diff --git a/packages/building-rollup/demo/js/demo-app.js b/packages/building-rollup/demo/js/demo-app.js index be5296ab6..157bc2d99 100644 --- a/packages/building-rollup/demo/js/demo-app.js +++ b/packages/building-rollup/demo/js/demo-app.js @@ -34,7 +34,11 @@ class DemoApp extends LitElement { customElements.define('demo-app', DemoApp); const cssText = DemoApp.styles.cssText.replace(/\s/g, ''); +const foo = { bar: 'lorem ipsum' }; +const loremIpsum = undefined; +window.__optionalChaining = foo?.bar === 'lorem ipsum' && foo?.bar?.loremIpsum === undefined; +window.__nullishCoalescing = (loremIpsum ?? 'lorem ipsum') === 'lorem ipsum'; window.__partialCSS = cssText.includes('font-size:16px') && cssText.includes('display:block'); window.__litElement = (async () => { await import('./lazy-component.js'); diff --git a/packages/building-rollup/demo/js/index.html b/packages/building-rollup/demo/js/index.html index 2b2f4fdc1..aa0a5a935 100644 --- a/packages/building-rollup/demo/js/index.html +++ b/packages/building-rollup/demo/js/index.html @@ -31,6 +31,8 @@

Static content in index.html is preserved

importMeta2: window.__importMeta2 || false, asyncFunction: await window.__asyncFunction || false, forOf: window.__forOf || false, + optionalChaining: window.__optionalChaining || false, + nullishCoalescing: window.__nullishCoalescing || false, }; document.getElementById('test').innerHTML = `
${JSON.stringify(window.__tests, null, 2)}
`; })(); diff --git a/packages/building-rollup/demo/ts-babel/demo-app.ts b/packages/building-rollup/demo/ts-babel/demo-app.ts index d053cce37..e3b232644 100644 --- a/packages/building-rollup/demo/ts-babel/demo-app.ts +++ b/packages/building-rollup/demo/ts-babel/demo-app.ts @@ -31,7 +31,11 @@ class DemoApp extends LitElement { } const cssText = DemoApp.styles.cssText.replace(/\s/g, ''); +const foo = { bar: 'lorem ipsum' }; +const loremIpsum = undefined; +window.__optionalChaining = foo?.bar === 'lorem ipsum' && foo?.bar?.loremIpsum === undefined; +window.__nullishCoalescing = (loremIpsum ?? 'lorem ipsum') === 'lorem ipsum'; window.__partialCSS = cssText.includes('font-size:16px') && cssText.includes('display:block'); window.__litElement = (async () => { await import('./lazy-component.ts'); diff --git a/packages/building-rollup/demo/ts-babel/index.html b/packages/building-rollup/demo/ts-babel/index.html index 02c99ed03..468b15e23 100644 --- a/packages/building-rollup/demo/ts-babel/index.html +++ b/packages/building-rollup/demo/ts-babel/index.html @@ -31,6 +31,8 @@

Static content in index.html is preserved

importMeta2: window.__importMeta2 || false, asyncFunction: await window.__asyncFunction || false, forOf: window.__forOf || false, + optionalChaining: window.__optionalChaining || false, + nullishCoalescing: window.__nullishCoalescing || false, }; document.getElementById('test').innerHTML = `
${JSON.stringify(window.__tests, null, 2)}
`; })(); diff --git a/packages/building-rollup/modern-and-legacy-config.js b/packages/building-rollup/modern-and-legacy-config.js index 00bf9cc46..2172401d0 100644 --- a/packages/building-rollup/modern-and-legacy-config.js +++ b/packages/building-rollup/modern-and-legacy-config.js @@ -77,6 +77,14 @@ function createConfig(_options, legacy) { plugins: [ '@babel/plugin-syntax-dynamic-import', '@babel/plugin-syntax-import-meta', + /** + * This can be removed when https://github.com/babel/babel/pull/10811 is released + */ + [ + require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'), + { loose: true }, + ], + [require.resolve('@babel/plugin-proposal-optional-chaining'), { loose: true }], // rollup rewrites import.meta.url, but makes them point to the file location after bundling // we want the location before bundling ['bundled-import-meta', { importStyle: 'baseURI' }], diff --git a/packages/building-rollup/modern-config.js b/packages/building-rollup/modern-config.js index 5cee2b315..1f5b648ef 100644 --- a/packages/building-rollup/modern-config.js +++ b/packages/building-rollup/modern-config.js @@ -67,6 +67,14 @@ module.exports = function createBasicConfig(_options) { plugins: [ '@babel/plugin-syntax-dynamic-import', '@babel/plugin-syntax-import-meta', + /** + * This can be removed when https://github.com/babel/babel/pull/10811 is released + */ + [ + require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'), + { loose: true }, + ], + [require.resolve('@babel/plugin-proposal-optional-chaining'), { loose: true }], // rollup rewrites import.meta.url, but makes them point to the file location after bundling // we want the location before bundling 'bundled-import-meta', diff --git a/packages/building-rollup/package.json b/packages/building-rollup/package.json index c0bcf7c1c..4dc492c15 100644 --- a/packages/building-rollup/package.json +++ b/packages/building-rollup/package.json @@ -40,6 +40,8 @@ ], "dependencies": { "@babel/core": "^7.7.2", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.7.4", + "@babel/plugin-proposal-optional-chaining": "^7.7.5", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-import-meta": "^7.2.0", "@babel/preset-env": "^7.7.1", diff --git a/packages/building-rollup/test/integration.test.js b/packages/building-rollup/test/integration.test.js index b6ae9ca8f..b98cf769a 100644 --- a/packages/building-rollup/test/integration.test.js +++ b/packages/building-rollup/test/integration.test.js @@ -78,6 +78,8 @@ describe('integration tests', () => { importMeta2: true, asyncFunction: true, forOf: true, + optionalChaining: true, + nullishCoalescing: true, }); }); diff --git a/yarn.lock b/yarn.lock index 371bd8728..ff9d5eed0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -331,6 +331,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0" +"@babel/plugin-proposal-nullish-coalescing-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28" + integrity sha512-TbYHmr1Gl1UC7Vo2HVuj/Naci5BEGNZ0AJhzqD2Vpr6QPFWpUmBRLrIDjedzx7/CShq0bRDS2gI4FIs77VHLVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.7.4" + "@babel/plugin-proposal-object-rest-spread@7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.3.4", "@babel/plugin-proposal-object-rest-spread@^7.6.2": version "7.6.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" @@ -355,6 +363,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-chaining" "^7.2.0" +"@babel/plugin-proposal-optional-chaining@^7.7.5": + version "7.7.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.5.tgz#f0835f044cef85b31071a924010a2a390add11d4" + integrity sha512-sOwFqT8JSchtJeDD+CjmWCaiFoLxY4Ps7NjvwHC/U7l4e9i5pTRNt8nDMIFSOUL+ncFbYSwruHM8WknYItWdXw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-chaining" "^7.7.4" + "@babel/plugin-proposal-private-methods@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.6.0.tgz#19ddc493c7b5d47afdd4291e740c609a83c9fae4" @@ -427,6 +443,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-nullish-coalescing-operator@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.7.4.tgz#e53b751d0c3061b1ba3089242524b65a7a9da12b" + integrity sha512-XKh/yIRPiQTOeBg0QJjEus5qiSKucKAiApNtO1psqG7D17xmE+X2i5ZqBEuSvo0HRuyPaKaSN/Gy+Ha9KFQolw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-numeric-separator@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.2.0.tgz#7470fe070c2944469a756752a69a6963135018be" @@ -455,6 +478,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-optional-chaining@^7.7.4": + version "7.7.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.7.4.tgz#c91fdde6de85d2eb8906daea7b21944c3610c901" + integrity sha512-2MqYD5WjZSbJdUagnJvIdSfkb/ucOC9/1fRJxm7GAxY6YQLWlUvkfxoNbUPcPLHJyetKUDQ4+yyuUyAoc0HriA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-top-level-await@^7.7.0": version "7.7.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.0.tgz#f5699549f50bbe8d12b1843a4e82f0a37bb65f4d" @@ -2105,28 +2135,6 @@ dependencies: standard-version "^7.0.1" -"@open-wc/testing-karma-bs@file:./packages/testing-karma-bs": - version "1.3.9" - dependencies: - "@open-wc/testing-karma" "^3.2.9" - "@types/node" "^11.13.0" - karma-browserstack-launcher "^1.0.0" - -"@open-wc/testing-karma@file:./packages/testing-karma": - version "3.2.9" - dependencies: - "@open-wc/karma-esm" "^2.11.2" - axe-core "^3.3.1" - karma "^4.1.0" - karma-chrome-launcher "^2.0.0" - karma-coverage-istanbul-reporter "^2.0.0" - karma-mocha "^1.0.0" - karma-mocha-reporter "^2.0.0" - karma-mocha-snapshot "^0.2.1" - karma-snapshot "^0.6.0" - karma-source-map-support "^1.3.0" - mocha "^6.2.2" - "@reach/router@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.2.1.tgz#34ae3541a5ac44fa7796e5506a5d7274a162be4e" From cbeacb48bd77f11008793ad27b048324d739f6bd Mon Sep 17 00:00:00 2001 From: Lars den Bakker Date: Sun, 8 Dec 2019 12:47:21 +0100 Subject: [PATCH 2/3] feat(building-webpack): support optional chaining and nullish coalescing --- packages/building-webpack/demo/js/demo-app.js | 4 ++++ packages/building-webpack/demo/js/index.js | 2 ++ packages/building-webpack/demo/ts-babel/demo-app.ts | 4 ++++ packages/building-webpack/demo/ts-babel/index.ts | 2 ++ packages/building-webpack/modern-and-legacy-config.js | 8 ++++++++ packages/building-webpack/modern-config.js | 8 ++++++++ packages/building-webpack/package.json | 2 ++ packages/building-webpack/test/integration.test.js | 2 ++ 8 files changed, 32 insertions(+) diff --git a/packages/building-webpack/demo/js/demo-app.js b/packages/building-webpack/demo/js/demo-app.js index be5296ab6..157bc2d99 100644 --- a/packages/building-webpack/demo/js/demo-app.js +++ b/packages/building-webpack/demo/js/demo-app.js @@ -34,7 +34,11 @@ class DemoApp extends LitElement { customElements.define('demo-app', DemoApp); const cssText = DemoApp.styles.cssText.replace(/\s/g, ''); +const foo = { bar: 'lorem ipsum' }; +const loremIpsum = undefined; +window.__optionalChaining = foo?.bar === 'lorem ipsum' && foo?.bar?.loremIpsum === undefined; +window.__nullishCoalescing = (loremIpsum ?? 'lorem ipsum') === 'lorem ipsum'; window.__partialCSS = cssText.includes('font-size:16px') && cssText.includes('display:block'); window.__litElement = (async () => { await import('./lazy-component.js'); diff --git a/packages/building-webpack/demo/js/index.js b/packages/building-webpack/demo/js/index.js index 156564b32..450feadab 100644 --- a/packages/building-webpack/demo/js/index.js +++ b/packages/building-webpack/demo/js/index.js @@ -11,6 +11,8 @@ import './syntax.js'; importMeta2: window.__importMeta2 || false, asyncFunction: (await window.__asyncFunction) || false, forOf: window.__forOf || false, + optionalChaining: window.__optionalChaining || false, + nullishCoalescing: window.__nullishCoalescing || false, }; document.getElementById('test').innerHTML = `
${JSON.stringify(
     window.__tests,
diff --git a/packages/building-webpack/demo/ts-babel/demo-app.ts b/packages/building-webpack/demo/ts-babel/demo-app.ts
index d053cce37..e3b232644 100644
--- a/packages/building-webpack/demo/ts-babel/demo-app.ts
+++ b/packages/building-webpack/demo/ts-babel/demo-app.ts
@@ -31,7 +31,11 @@ class DemoApp extends LitElement {
 }
 
 const cssText = DemoApp.styles.cssText.replace(/\s/g, '');
+const foo = { bar: 'lorem ipsum' };
+const loremIpsum = undefined;
 
+window.__optionalChaining = foo?.bar === 'lorem ipsum' && foo?.bar?.loremIpsum === undefined;
+window.__nullishCoalescing = (loremIpsum ?? 'lorem ipsum') === 'lorem ipsum';
 window.__partialCSS = cssText.includes('font-size:16px') && cssText.includes('display:block');
 window.__litElement = (async () => {
   await import('./lazy-component.ts');
diff --git a/packages/building-webpack/demo/ts-babel/index.ts b/packages/building-webpack/demo/ts-babel/index.ts
index 17a9d7b0c..2c7d08230 100644
--- a/packages/building-webpack/demo/ts-babel/index.ts
+++ b/packages/building-webpack/demo/ts-babel/index.ts
@@ -11,6 +11,8 @@ import './syntax.ts';
     importMeta2: window.__importMeta2 || false,
     asyncFunction: (await window.__asyncFunction) || false,
     forOf: window.__forOf || false,
+    optionalChaining: window.__optionalChaining || false,
+    nullishCoalescing: window.__nullishCoalescing || false,
   };
   document.getElementById('test').innerHTML = `
${JSON.stringify(
     window.__tests,
diff --git a/packages/building-webpack/modern-and-legacy-config.js b/packages/building-webpack/modern-and-legacy-config.js
index 357fd6b2d..c23cf39e9 100644
--- a/packages/building-webpack/modern-and-legacy-config.js
+++ b/packages/building-webpack/modern-and-legacy-config.js
@@ -78,6 +78,14 @@ function createConfig(options, legacy) {
               plugins: [
                 '@babel/plugin-syntax-dynamic-import',
                 '@babel/plugin-syntax-import-meta',
+                /**
+                 * This can be removed when https://github.com/babel/babel/pull/10811 is released
+                 */
+                [
+                  require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'),
+                  { loose: true },
+                ],
+                [require.resolve('@babel/plugin-proposal-optional-chaining'), { loose: true }],
                 production && [
                   'template-html-minifier',
                   {
diff --git a/packages/building-webpack/modern-config.js b/packages/building-webpack/modern-config.js
index de670cf44..fc1b2d18d 100644
--- a/packages/building-webpack/modern-config.js
+++ b/packages/building-webpack/modern-config.js
@@ -78,6 +78,14 @@ module.exports = userOptions => {
               plugins: [
                 '@babel/plugin-syntax-dynamic-import',
                 '@babel/plugin-syntax-import-meta',
+                /**
+                 * This can be removed when https://github.com/babel/babel/pull/10811 is released
+                 */
+                [
+                  require.resolve('@babel/plugin-proposal-nullish-coalescing-operator'),
+                  { loose: true },
+                ],
+                [require.resolve('@babel/plugin-proposal-optional-chaining'), { loose: true }],
                 production && [
                   'template-html-minifier',
                   {
diff --git a/packages/building-webpack/package.json b/packages/building-webpack/package.json
index b07f8cc45..ef5ae201d 100644
--- a/packages/building-webpack/package.json
+++ b/packages/building-webpack/package.json
@@ -41,6 +41,8 @@
   ],
   "dependencies": {
     "@babel/core": "^7.7.2",
+    "@babel/plugin-proposal-nullish-coalescing-operator": "^7.7.4",
+    "@babel/plugin-proposal-optional-chaining": "^7.7.5",
     "@babel/plugin-syntax-dynamic-import": "^7.2.0",
     "@babel/plugin-syntax-import-meta": "^7.2.0",
     "@babel/preset-env": "^7.7.1",
diff --git a/packages/building-webpack/test/integration.test.js b/packages/building-webpack/test/integration.test.js
index 0210e0185..877fdb861 100644
--- a/packages/building-webpack/test/integration.test.js
+++ b/packages/building-webpack/test/integration.test.js
@@ -92,6 +92,8 @@ describe('integration tests', () => {
             importMeta2: true,
             asyncFunction: true,
             forOf: true,
+            optionalChaining: true,
+            nullishCoalescing: true,
           });
         });
 

From 17ac47733f41c6c00964d1dfda2381cdebd32868 Mon Sep 17 00:00:00 2001
From: Lars den Bakker 
Date: Sun, 8 Dec 2019 13:08:51 +0100
Subject: [PATCH 3/3] chore: update linting dependencies

---
 package.json                           | 12 ++--
 packages/building-webpack/package.json |  1 -
 packages/create/package.json           |  2 +-
 packages/es-dev-server/package.json    |  4 +-
 packages/eslint-config/package.json    |  8 +--
 packages/lit-helpers/src/live.js       |  2 +-
 packages/prettier-config/package.json  |  2 +-
 yarn.lock                              | 93 +++++++++++++++-----------
 8 files changed, 68 insertions(+), 56 deletions(-)

diff --git a/package.json b/package.json
index cc689b30b..6ee7cfd0c 100644
--- a/package.json
+++ b/package.json
@@ -43,22 +43,22 @@
     "@open-wc/testing-karma-bs": "file:./packages/testing-karma-bs",
     "@types/chai-fs": "^2.0.2",
     "@vuepress/plugin-google-analytics": "^1.0.0-alpha.30",
-    "babel-eslint": "^10.0.0",
+    "babel-eslint": "^10.0.3",
     "core-js": "2.6.10",
-    "eslint": "^6.1.0",
+    "eslint": "^6.7.2",
     "eslint-config-airbnb-base": "^14.0.0",
     "eslint-plugin-html": "^6.0.0",
-    "eslint-plugin-import": "^2.18.0",
-    "eslint-plugin-no-only-tests": "^2.3.1",
+    "eslint-plugin-import": "^2.18.2",
+    "eslint-plugin-no-only-tests": "^2.4.0",
     "eslint-plugin-wc": "^1.2.0",
     "husky": "3.0.0",
     "lerna": "3.4.3",
     "lint-staged": "^9.2.0",
     "npm-run-all": "4.1.3",
-    "prettier": "^1.18.2",
+    "prettier": "^1.19.1",
     "prettier-plugin-package": "^0.3.1",
     "rimraf": "^3.0.0",
-    "typescript-temporary-fork-for-jsdoc": "^3.6.0-insiders.20190802",
+    "typescript": "^3.7.3",
     "vuepress": "^1.0.0-alpha.30",
     "webpack-merge": "^4.1.5"
   },
diff --git a/packages/building-webpack/package.json b/packages/building-webpack/package.json
index ef5ae201d..747e7329e 100644
--- a/packages/building-webpack/package.json
+++ b/packages/building-webpack/package.json
@@ -69,7 +69,6 @@
     "puppeteer": "^2.0.0",
     "rimraf": "^3.0.0",
     "ts-loader": "^5.3.3",
-    "typescript": "^3.3.3333",
     "webpack": "^4.28.0",
     "webpack-bundle-analyzer": "^3.0.3",
     "webpack-cli": "^3.3.9",
diff --git a/packages/create/package.json b/packages/create/package.json
index bc4a1b3b6..751b19e85 100644
--- a/packages/create/package.json
+++ b/packages/create/package.json
@@ -51,7 +51,7 @@
     "babel-plugin-transform-dynamic-import": "^2.1.0",
     "chai": "^4.2.0",
     "chai-fs": "^2.0.0",
-    "eslint": "^6.1.0",
+    "eslint": "^6.7.2",
     "mocha": "^6.2.2",
     "onchange": "^5.2.0",
     "rimraf": "^3.0.0"
diff --git a/packages/es-dev-server/package.json b/packages/es-dev-server/package.json
index 4bbd27509..8d4002cc2 100644
--- a/packages/es-dev-server/package.json
+++ b/packages/es-dev-server/package.json
@@ -91,8 +91,8 @@
     "@babel/cli": "^7.7.0",
     "@babel/plugin-proposal-class-properties": "^7.7.0",
     "@babel/plugin-proposal-decorators": "^7.7.0",
-    "@babel/plugin-proposal-nullish-coalescing-operator": "^7.4.4",
-    "@babel/plugin-proposal-optional-chaining": "^7.6.0",
+    "@babel/plugin-proposal-nullish-coalescing-operator": "^7.7.4",
+    "@babel/plugin-proposal-optional-chaining": "^7.7.5",
     "@babel/plugin-proposal-private-methods": "^7.6.0",
     "@babel/plugin-transform-modules-systemjs": "^7.7.0",
     "@babel/preset-typescript": "^7.7.2",
diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json
index 7a6946776..dde9a82bc 100644
--- a/packages/eslint-config/package.json
+++ b/packages/eslint-config/package.json
@@ -23,13 +23,13 @@
     "config"
   ],
   "dependencies": {
-    "babel-eslint": "^10.0.0",
-    "eslint": "^6.1.0",
+    "babel-eslint": "^10.0.3",
+    "eslint": "^6.7.2",
     "eslint-config-airbnb-base": "^14.0.0",
     "eslint-plugin-html": "^6.0.0",
-    "eslint-plugin-import": "^2.18.0",
+    "eslint-plugin-import": "^2.18.2",
     "eslint-plugin-lit": "^1.2.0",
-    "eslint-plugin-no-only-tests": "^2.3.1",
+    "eslint-plugin-no-only-tests": "^2.4.0",
     "eslint-plugin-wc": "^1.2.0"
   }
 }
diff --git a/packages/lit-helpers/src/live.js b/packages/lit-helpers/src/live.js
index 3b689b47c..02cd2859e 100644
--- a/packages/lit-helpers/src/live.js
+++ b/packages/lit-helpers/src/live.js
@@ -1,4 +1,4 @@
-/* eslint-disable no-param-reassign, no-restricted-syntax, guard-for-in */
+/* eslint-disable no-param-reassign, no-restricted-syntax, guard-for-in, no-console */
 import { directive, PropertyPart, AttributePart } from 'lit-html';
 
 export const live = directive((/** @type {unknown} */ value) => (
diff --git a/packages/prettier-config/package.json b/packages/prettier-config/package.json
index 7d4a2fd6b..4087f9628 100644
--- a/packages/prettier-config/package.json
+++ b/packages/prettier-config/package.json
@@ -25,6 +25,6 @@
   ],
   "dependencies": {
     "eslint-config-prettier": "^3.3.0",
-    "prettier": "^1.18.2"
+    "prettier": "^1.19.1"
   }
 }
diff --git a/yarn.lock b/yarn.lock
index ff9d5eed0..4f1ce03d3 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -323,14 +323,6 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-json-strings" "^7.2.0"
 
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz#41c360d59481d88e0ce3a3f837df10121a769b39"
-  integrity sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-nullish-coalescing-operator" "^7.2.0"
-
 "@babel/plugin-proposal-nullish-coalescing-operator@^7.7.4":
   version "7.7.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.7.4.tgz#7db302c83bc30caa89e38fee935635ef6bd11c28"
@@ -355,14 +347,6 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
 
-"@babel/plugin-proposal-optional-chaining@^7.6.0":
-  version "7.6.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.6.0.tgz#e9bf1f9b9ba10c77c033082da75f068389041af8"
-  integrity sha512-kj4gkZ6qUggkprRq3Uh5KP8XnE1MdIO0J7MhdDX8+rAbB6dJ2UrensGIS+0NPZAaaJ1Vr0PN6oLUgXMU1uMcSg==
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-optional-chaining" "^7.2.0"
-
 "@babel/plugin-proposal-optional-chaining@^7.7.5":
   version "7.7.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.7.5.tgz#f0835f044cef85b31071a924010a2a390add11d4"
@@ -2135,6 +2119,28 @@
   dependencies:
     standard-version "^7.0.1"
 
+"@open-wc/testing-karma-bs@file:./packages/testing-karma-bs":
+  version "1.3.11"
+  dependencies:
+    "@open-wc/testing-karma" "^3.2.11"
+    "@types/node" "^11.13.0"
+    karma-browserstack-launcher "^1.0.0"
+
+"@open-wc/testing-karma@file:./packages/testing-karma":
+  version "3.2.11"
+  dependencies:
+    "@open-wc/karma-esm" "^2.11.4"
+    axe-core "^3.3.1"
+    karma "^4.1.0"
+    karma-chrome-launcher "^2.0.0"
+    karma-coverage-istanbul-reporter "^2.0.0"
+    karma-mocha "^1.0.0"
+    karma-mocha-reporter "^2.0.0"
+    karma-mocha-snapshot "^0.2.1"
+    karma-snapshot "^0.6.0"
+    karma-source-map-support "^1.3.0"
+    mocha "^6.2.2"
+
 "@reach/router@^1.2.1":
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.2.1.tgz#34ae3541a5ac44fa7796e5506a5d7274a162be4e"
@@ -3571,7 +3577,7 @@ babel-code-frame@^6.26.0:
     esutils "^2.0.2"
     js-tokens "^3.0.2"
 
-babel-eslint@^10.0.0:
+babel-eslint@^10.0.3:
   version "10.0.3"
   resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
   integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==
@@ -6763,7 +6769,7 @@ eslint-plugin-html@^6.0.0:
   dependencies:
     htmlparser2 "^3.10.1"
 
-eslint-plugin-import@^2.18.0:
+eslint-plugin-import@^2.18.2:
   version "2.18.2"
   resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz#02f1180b90b077b33d447a17a2326ceb400aceb6"
   integrity sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==
@@ -6789,10 +6795,10 @@ eslint-plugin-lit@^1.2.0:
     parse5-htmlparser2-tree-adapter "^5.1.0"
     requireindex "^1.2.0"
 
-eslint-plugin-no-only-tests@^2.3.1:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.3.1.tgz#7b24a4df55b818d0838410aa96b24a5a4a072262"
-  integrity sha512-LzCzeQrlkNjEwUWEoGhfjz+Kgqe0080W6qC8I8eFwSMXIsr1zShuIQnRuSZc4Oi7k1vdUaNGDc+/GFvg6IHSHA==
+eslint-plugin-no-only-tests@^2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.4.0.tgz#7d565434aa7d16ccc7eea957c391d98f827332ca"
+  integrity sha512-azP9PwQYfGtXJjW273nIxQH9Ygr+5/UyeW2wEjYoDtVYPI+WPKwbj0+qcAKYUXFZLRumq4HKkFaoDBAwBoXImQ==
 
 eslint-plugin-wc@^1.2.0:
   version "1.2.0"
@@ -6830,10 +6836,10 @@ eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
   integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
 
-eslint@^6.1.0:
-  version "6.6.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.6.0.tgz#4a01a2fb48d32aacef5530ee9c5a78f11a8afd04"
-  integrity sha512-PpEBq7b6qY/qrOmpYQ/jTMDYfuQMELR4g4WI1M/NaSDDD/bdcMb+dj4Hgks7p41kW2caXsPsEZAEAyAgjVVC0g==
+eslint@^6.7.2:
+  version "6.7.2"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1"
+  integrity sha512-qMlSWJaCSxDFr8fBPvJM9kJwbazrhNcBU3+DszDW1OlEwKBBRWsJc7NJFelvwQpanHCR14cOLD41x8Eqvo3Nng==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     ajv "^6.10.0"
@@ -6850,7 +6856,7 @@ eslint@^6.1.0:
     file-entry-cache "^5.0.1"
     functional-red-black-tree "^1.0.1"
     glob-parent "^5.0.0"
-    globals "^11.7.0"
+    globals "^12.1.0"
     ignore "^4.0.6"
     import-fresh "^3.0.0"
     imurmurhash "^0.1.4"
@@ -6863,7 +6869,7 @@ eslint@^6.1.0:
     minimatch "^3.0.4"
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
-    optionator "^0.8.2"
+    optionator "^0.8.3"
     progress "^2.0.0"
     regexpp "^2.0.1"
     semver "^6.1.2"
@@ -7905,11 +7911,18 @@ global@^4.3.2, global@^4.4.0:
     min-document "^2.19.0"
     process "^0.11.10"
 
-globals@^11.1.0, globals@^11.7.0:
+globals@^11.1.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
+globals@^12.1.0:
+  version "12.3.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-12.3.0.tgz#1e564ee5c4dded2ab098b0f88f24702a3c56be13"
+  integrity sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==
+  dependencies:
+    type-fest "^0.8.1"
+
 globals@^9.18.0:
   version "9.18.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
@@ -11341,7 +11354,7 @@ optimize-css-assets-webpack-plugin@^5.0.1:
     cssnano "^4.1.10"
     last-call-webpack-plugin "^3.0.0"
 
-optionator@^0.8.2:
+optionator@^0.8.3:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
   integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@@ -12277,7 +12290,7 @@ prettier-plugin-package@^0.3.1:
   resolved "https://registry.yarnpkg.com/prettier-plugin-package/-/prettier-plugin-package-0.3.1.tgz#dbb78fa0408c2ab18045ac23868bad4560607a93"
   integrity sha512-aCx+dVwRwgzsqulCFZcLTS7gTMmn+TXhRIDTbn8ev50n0abIlvukHLLZ9qiJN+6tdSZtd40rlqMx5oQ/mvw1+w==
 
-prettier@^1.16.4, prettier@^1.18.2:
+prettier@^1.16.4, prettier@^1.18.2, prettier@^1.19.1:
   version "1.19.1"
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
   integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
@@ -14880,6 +14893,11 @@ type-fest@^0.6.0:
   resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
   integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
 
+type-fest@^0.8.1:
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+  integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
 type-is@^1.6.16, type-is@~1.6.17, type-is@~1.6.18:
   version "1.6.18"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -14898,15 +14916,10 @@ typedarray@^0.0.6:
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
 
-typescript-temporary-fork-for-jsdoc@^3.6.0-insiders.20190802:
-  version "3.6.0-insiders.20190802"
-  resolved "https://registry.yarnpkg.com/typescript-temporary-fork-for-jsdoc/-/typescript-temporary-fork-for-jsdoc-3.6.0-insiders.20190802.tgz#aece6f3f5d53c6e06e5e1c4af5a19183d7124ab6"
-  integrity sha512-j76opNh6ljAXDUDXr03+pOkITiATPbUlQlMp9pxD/SR3eNKAtIdHwOTf3dDspyGs8TGJQjQXMUiYqJr0gW+nCg==
-
-typescript@^3.3.3333:
-  version "3.7.2"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb"
-  integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ==
+typescript@^3.7.3:
+  version "3.7.3"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69"
+  integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw==
 
 typical@^4.0.0:
   version "4.0.0"