changeset 29:45ed53428e74

fix configs to run tests (all in one bundle though)
author drewp@bigasterisk.com
date Sun, 15 Dec 2019 21:18:42 -0800
parents c751380b70c5
children 2d88804484e5
files jasmine.json jest.config.js package.json src/json_ld_quads.test.ts src/suffixLabels.test.ts tasks.py tsconfig.json webpack.config.js yarn.lock
diffstat 9 files changed, 399 insertions(+), 143 deletions(-) [+]
line wrap: on
line diff
--- a/jasmine.json	Sun Dec 15 12:38:11 2019 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-{
-    "spec_dir": "build",
-    "spec_files": [
-      "test.bundle.js"
-    ],
-    "oneFailurePerSpec": false
-  }
\ No newline at end of file
--- a/jest.config.js	Sun Dec 15 12:38:11 2019 -0800
+++ b/jest.config.js	Sun Dec 15 21:18:42 2019 -0800
@@ -9,6 +9,8 @@
   globals: {
     'ts-jest': {
       packageJson: 'package.json',
+      babelConfig: true
     }
-  }
+  },
+  resolver: require.resolve(`jest-pnp-resolver`)
 };
\ No newline at end of file
--- a/package.json	Sun Dec 15 12:38:11 2019 -0800
+++ b/package.json	Sun Dec 15 21:18:42 2019 -0800
@@ -1,26 +1,17 @@
 {
   "name": "streamed-graph",
   "notinstalled": {
-    "@babel/core": "^7.7.5",
     "@babel/preset-env": "^7.7.6",
     "@babel/preset-typescript": "^7.7.4",
     "@berry/pnpify": "^0.1.0",
     "@types/eventsource": "^1.1.2",
-    "@types/jasmine": "^3.5.0",
     "@types/node": "^12.12.14",
     "@webcomponents/webcomponentsjs": "^2.4.0",
-    "ava": "^2.4.0",
-    "babel-jest": "^24.9.0",
     "file-loader": "^5.0.2",
     "ts-node": "^8.5.4"
   },
-  "newer": {
-    "@types/jest": "^24.0.23",
-    "jest": "^24.9.0",
-    "ts-jest": "^24.2.0",
-    "typescript": "^3.7.3"
-  },
   "dependencies": {
+    "@babel/core": "^7.7.5",
     "@polymer/decorators": "^3.0.0",
     "@polymer/polymer": "^3.3.1",
     "@types/jest": "^24.0.23",
@@ -29,8 +20,12 @@
     "@types/webpack": "^4.41.0",
     "@types/webpack-dev-server": "^3.9.0",
     "@yarnpkg/pnpify": "^2.0.0-rc.12",
+    "babel-jest": "^24.9.0",
+    "glob": "^7.1.6",
     "jest": "^24.9.0",
+    "jest-cli": "^24.9.0",
     "jest-pnp-resolver": "^1.2.1",
+    "jest-webpack": "^0.5.1",
     "jsonld": "^2.0.1",
     "lit-html": "^1.1.2",
     "n3": "^1.3.4",
@@ -48,9 +43,24 @@
   },
   "scripts": {
     "compile": "tsc",
-    "webpack-build": "webpack-cli --config webpack.config.js --mode production",
-    "webpack-build-forever": "webpack-cli --config webpack.config.js --mode production --watch",
-    "webpack-dev-server": "webpack-dev-server --config webpack.config.js --mode development",
-    "test": "jest --env=node --colors --resolver=jest-pnp-resolver --coverage test"
+    "webpack-build": "        webpack-cli        --config webpack.config.js --config-name main --mode production",
+    "webpack-build-forever": "webpack-cli        --config webpack.config.js --config-name main --mode production --watch",
+    "webpack-dev-server": "   webpack-dev-server --config webpack.config.js --config-name main --mode development",
+    "test": "                 webpack-cli        --config webpack.config.js --config-name test --mode production",
+    "test-forever": "         webpack-cli        --config webpack.config.js --config-name test --mode production --watch"
+  },
+  "jest": {
+    "verbose": true,
+    "resolver": "jest-pnp-resolver",
+    "collectCoverage": true,
+    "globals": {
+      "ts-jest": {
+        "verbose": true,
+        "diagnostics": true,
+        "babelConfig": {
+          "comments": false
+        }
+      }
+    }
   }
 }
--- a/src/json_ld_quads.test.ts	Sun Dec 15 12:38:11 2019 -0800
+++ b/src/json_ld_quads.test.ts	Sun Dec 15 21:18:42 2019 -0800
@@ -1,19 +1,26 @@
-//import { eachJsonLdQuad } from './json_ld_quads';
+import { eachJsonLdQuad } from './json_ld_quads';
+import { Literal, DataFactory } from 'n3';
+const { literal } = DataFactory;
 
-// describe("eachJsonLdQuad", () => {
-//     test("finds multiple graphs", () => {
-//     });
-// //     test("returns quads", async () => {
-// //         let results = [];
-// //         await eachJsonLdQuad([
-// //             {
-// //                 "@id": "http://example.com/g1",
-// //                 "@graph": [{
-// //                     "@id": "http://example.com/s1",
-// //                     "http://example.com/p1": [{ "@value": "lit1" }]
-// //                 }],
-// //             }
-// //         ], results.push);
-// //         expect(results).toEqual('f')
-// //     });
-// });
\ No newline at end of file
+describe("eachJsonLdQuad", () => {
+    test("finds multiple graphs", () => {
+    });
+    test("returns quads", async () => {
+        let results: Array<any> = [];
+        await eachJsonLdQuad([
+            {
+                "@id": "http://example.com/g1",
+                "@graph": [{
+                    "@id": "http://example.com/s1",
+                    "http://example.com/p1": [{ "@value": "lit1" }]
+                }],
+            }
+        ], (res: any) => results.push(res));
+        expect(results).toHaveLength(1);
+        expect(results[0].subject.value).toEqual("http://example.com/s1");
+        expect(results[0].predicate.value).toEqual("http://example.com/p1");
+        expect((results[0].object as Literal).equals(literal("lit1"))).toBeTruthy();
+        expect(results[0].graph.value).toEqual("http://example.com/g1");
+
+    });
+});
\ No newline at end of file
--- a/src/suffixLabels.test.ts	Sun Dec 15 12:38:11 2019 -0800
+++ b/src/suffixLabels.test.ts	Sun Dec 15 21:18:42 2019 -0800
@@ -1,71 +1,70 @@
-// import {describe, test, expect} from 'jest';
-// import { SuffixLabels } from './suffixLabels';
-
-// describe('_tailSegments', () => {
-//   test("returns right amount", () => {
-//     expect(SuffixLabels._tailSegments('http://foo/a/bb', 0)).toEqual('');
-//     //   t.is(SuffixLabels._tailSegments('http://foo/a/bb', 1), 'bb');
-//     //   t.is(SuffixLabels._tailSegments('http://foo/a/bb', 2), 'a/bb');
-//     //   t.is(SuffixLabels._tailSegments('http://foo/a/bb', 3), 'foo/a/bb');
-//     //   t.is(SuffixLabels._tailSegments('http://foo/a/bb', 4), '/foo/a/bb');
-//     //   t.is(SuffixLabels._tailSegments('http://foo/a/bb', 5), 'http://foo/a/bb');
-//   });
-//   // test("_tailSegments ok with trailing slash", (t) => {
-//   //   t.is(SuffixLabels._tailSegments('http://foo/', 0), '');
-//   //   t.is(SuffixLabels._tailSegments('http://foo/', 1), '');
-//   //   t.is(SuffixLabels._tailSegments('http://foo/', 2), 'foo/');
-// });
+import { SuffixLabels } from './suffixLabels';
 
-
-// describe("suffixLabels", () => {
-//   const fakeNode = (uri: string) => { return { nominalValue: uri } };
-
-//   it("returns whole url segments", () => {
-//     const suf = new SuffixLabels();
-//     suf._planDisplayForUri('http://a/b/c/dd');
-//     suf._planDisplayForUri('http://a/b/c/ee');
+describe('_tailSegments', () => {
+  it("returns right amount", () => {
+    expect(SuffixLabels._tailSegments('http://foo/a/bb', 0)).toEqual('');
+    expect(SuffixLabels._tailSegments('http://foo/a/bb', 1)).toEqual('bb');
+    expect(SuffixLabels._tailSegments('http://foo/a/bb', 2)).toEqual('a/bb');
+    expect(SuffixLabels._tailSegments('http://foo/a/bb', 3)).toEqual('foo/a/bb');
+    expect(SuffixLabels._tailSegments('http://foo/a/bb', 4)).toEqual('/foo/a/bb');
+    expect(SuffixLabels._tailSegments('http://foo/a/bb', 5)).toEqual('http://foo/a/bb');
+  });
+  it("_tailSegments ok with trailing slash", () => {
+    expect(SuffixLabels._tailSegments('http://foo/', 0)).toEqual('');
+    expect(SuffixLabels._tailSegments('http://foo/', 1)).toEqual('');
+    expect(SuffixLabels._tailSegments('http://foo/', 2)).toEqual('foo/');
+  });
+});
 
-//     t.is(suf.getLabelForNode('http://a/b/c/dd'), 'dd');
-//     t.is(suf.getLabelForNode('http://a/b/c/ee'), 'ee');
-//   });
+describe("suffixLabels", () => {
+  const fakeNode = (uri: string) => { return { nominalValue: uri } };
+
+  it("returns whole url segments", () => {
+    const suf = new SuffixLabels();
+    suf._planDisplayForUri('http://a/b/c/dd');
+    suf._planDisplayForUri('http://a/b/c/ee');
 
-//   it("doesn't treat a repeated uri as a name clash", () => {
-//     const suf = new SuffixLabels();
-//     suf._planDisplayForUri('http://a/b/c');
-//     suf._planDisplayForUri('http://a/b/c');
+    expect(suf.getLabelForNode('http://a/b/c/dd')).toEqual('dd');
+    expect(suf.getLabelForNode('http://a/b/c/ee')).toEqual('ee');
+  });
+
+  it("doesn't treat a repeated uri as a name clash", () => {
+    const suf = new SuffixLabels();
+    suf._planDisplayForUri('http://a/b/c');
+    suf._planDisplayForUri('http://a/b/c');
 
-//     t.is(suf.getLabelForNode('http://a/b/c'), 'c');
-//   });
+    expect(suf.getLabelForNode('http://a/b/c')).toEqual('c');
+  });
 
-//   it("moves to two segments when needed", () => {
-//     const suf = new SuffixLabels();
-//     suf._planDisplayForUri('http://a/b/c/d');
-//     suf._planDisplayForUri('http://a/b/f/d');
+  it("moves to two segments when needed", () => {
+    const suf = new SuffixLabels();
+    suf._planDisplayForUri('http://a/b/c/d');
+    suf._planDisplayForUri('http://a/b/f/d');
 
-//     t.is(suf.getLabelForNode('http://a/b/c/d'), 'c/d');
-//     t.is(suf.getLabelForNode('http://a/b/f/d'), 'f/d');
-//   });
+    expect(suf.getLabelForNode('http://a/b/c/d')).toEqual('c/d');
+    expect(suf.getLabelForNode('http://a/b/f/d')).toEqual('f/d');
+  });
 
-//   it("is ok with clashes at different segment positions", () => {
-//     const suf = new SuffixLabels();
-//     suf._planDisplayForUri('http://z/z/z/a/b/c');
-//     suf._planDisplayForUri('http://a/b/c');
+  it("is ok with clashes at different segment positions", () => {
+    const suf = new SuffixLabels();
+    suf._planDisplayForUri('http://z/z/z/a/b/c');
+    suf._planDisplayForUri('http://a/b/c');
 
-//     t.is(suf.getLabelForNode('http://z/z/z/a/b/c'), 'z/a/b/c');
-//     t.is(suf.getLabelForNode('http://a/b/c'), '/a/b/c');
-//   });
+    expect(suf.getLabelForNode('http://z/z/z/a/b/c')).toEqual('z/a/b/c');
+    expect(suf.getLabelForNode('http://a/b/c')).toEqual('/a/b/c');
+  });
 
-//   it("uses appropriately long suffixes per uri", () => {
-//     const suf = new SuffixLabels();
-//     suf._planDisplayForUri('http://a/b/c/d/e');
-//     suf._planDisplayForUri('http://a/b/f/d/e');
-//     suf._planDisplayForUri('http://a/b/c/g');
-//     suf._planDisplayForUri('http://a/z');
+  it("uses appropriately long suffixes per uri", () => {
+    const suf = new SuffixLabels();
+    suf._planDisplayForUri('http://a/b/c/d/e');
+    suf._planDisplayForUri('http://a/b/f/d/e');
+    suf._planDisplayForUri('http://a/b/c/g');
+    suf._planDisplayForUri('http://a/z');
 
-//     t.is(suf.getLabelForNode('http://a/b/c/d/e'), 'c/d/e');
-//     t.is(suf.getLabelForNode('http://a/b/f/d/e'), 'f/d/e');
-//     t.is(suf.getLabelForNode('http://a/b/c/g'), 'g');
-//     t.is(suf.getLabelForNode('http://a/z'), 'z');
-//   });
+    expect(suf.getLabelForNode('http://a/b/c/d/e')).toEqual('c/d/e');
+    expect(suf.getLabelForNode('http://a/b/f/d/e')).toEqual('f/d/e');
+    expect(suf.getLabelForNode('http://a/b/c/g')).toEqual('g');
+    expect(suf.getLabelForNode('http://a/z')).toEqual('z');
+  });
 
-// });
\ No newline at end of file
+});
\ No newline at end of file
--- a/tasks.py	Sun Dec 15 12:38:11 2019 -0800
+++ b/tasks.py	Sun Dec 15 21:18:42 2019 -0800
@@ -7,18 +7,29 @@
 
 @task
 def serve_demo(ctx):
-    ctx.run('yarn webpack-dev-server --config webpack-dev.config.ts  --port 8082')
+    ctx.run('yarn webpack-dev-server')
 
 @task
 def build(ctx):
-    ctx.run(f'yarn run webpack-cli --config webpack.config.js --mode production')  # --debug --display-error-details
+    ctx.run(f'yarn run webpack-build')  # --debug --display-error-details
     ctx.run(f'cp build/streamed-graph.bundle.js /my/site/homepage/www/rdf/streamed-graph.bundle.js')
-    ctx.run(f'cp streamed-graph.css /my/site/homepage/www/rdf/streamed-graph.css')
+    ctx.run(f'cp src/streamed-graph.css         /my/site/homepage/www/rdf/streamed-graph.css')
+
+@task
+def build_forever(ctx):
+    ctx.run(f'yarn run webpack-build-forever')
+
+@task
+def dev_server(ctx):
+    ctx.run(f'yarn webpack-dev-server')
 
 @task
 def test(ctx):
-    ctx.run(f'node_modules/.bin/webpack-cli --config webpack-test.config.ts')
-    ctx.run(f'node_modules/.bin/ts-node node_modules/.bin/jasmine --config=jasmine.json')
+    ctx.run(f'yarn test', pty=True)
+
+@task
+def test_forever(ctx):
+    ctx.run(f'yarn test-forever', pty=True)
 
 # one time per machine:
 # yarn policies set-version v2
--- a/tsconfig.json	Sun Dec 15 12:38:11 2019 -0800
+++ b/tsconfig.json	Sun Dec 15 21:18:42 2019 -0800
@@ -22,13 +22,10 @@
         // "noUnusedLocals": true,
         // "noUnusedParameters": true,
          "rootDir": ".",
-        // "types": [ "node", "jest" ],
+        "types": ["jest"],
         "sourceMap": true
     },
     "include": [
         "src/**/*.ts"
-    ],
-    "exclude": [
-        "src/**/*.test.ts"
     ]
 }
\ No newline at end of file
--- a/webpack.config.js	Sun Dec 15 12:38:11 2019 -0800
+++ b/webpack.config.js	Sun Dec 15 21:18:42 2019 -0800
@@ -1,45 +1,62 @@
+const glob = require('glob');
+const jest = require('jest');
 const path = require("path");
-const webpack = require('webpack');
 const PnpWebpackPlugin = require('pnp-webpack-plugin');
 
-module.exports = {
-    entry: ['./src/streamed-graph.ts'],
-    output: {
-        filename: 'streamed-graph.bundle.js',
-        path: path.resolve(__dirname, 'build'),
-        publicPath: '/build/'
-    },
+const base = {
+    devtool: 'source-map',
     module: {
         rules: [
             {
                 test: /\.ts$/,
                 loader: require.resolve('ts-loader'),
-                options: PnpWebpackPlugin.tsLoaderOptions({
-                    // ... regular options go there ...
-                })
+                options: PnpWebpackPlugin.tsLoaderOptions({})
             },
-            { test: /\.css$/i, use: ['file-loader'] },
+            {
+                test: /\.css$/i,
+                use: ['file-loader']
+            },
         ]
     },
-    devtool: 'source-map',
     resolve: {
         extensions: [".ts", ".js"],
-        plugins: [
-            PnpWebpackPlugin,
-        ],
-    },
-    resolveLoader: {
-        plugins: [
-            PnpWebpackPlugin.moduleLoader(module),
-        ],
-    },
-    watchOptions: {
-        ignored: /node_modules/,
-        poll: 200
-    },
-    devServer: {
-        port: 8082,
-        publicPath: '/build/',
-        contentBase: __dirname
+        plugins: [PnpWebpackPlugin],
     }
 };
+
+function outputToBundle(bundleName) {
+    return {
+        filename: bundleName,
+        path: path.resolve(__dirname, 'build'),
+        publicPath: '/build/'
+    };
+}
+
+module.exports = [
+    Object.assign({
+        name: "main",
+        entry: ['./src/streamed-graph.ts'],
+        output: outputToBundle('streamed-graph.bundle.js'),
+        devServer: {
+            port: 8082,
+            publicPath: '/build/',
+            contentBase: __dirname
+        }
+    }, base),
+    Object.assign({
+        name: "test",
+        entry: glob.sync('src/**/*.test.ts').map((p) => './' + p),
+        output: outputToBundle('test.bundle.js'),
+        plugins: [
+            {
+                apply: (compiler) => {
+                    compiler.hooks.afterEmit.tap('AfterEmitPlugin', (compilation) => {
+                        jest.run([
+                            '--detectOpenHandles', // not just to debug; having this quiets a jest error.
+                            '--testRegex', 'test.bundle.js', 'build/test.bundle.js']);
+                    });
+                }
+            }
+        ]
+    }, base)
+];
--- a/yarn.lock	Sun Dec 15 12:38:11 2019 -0800
+++ b/yarn.lock	Sun Dec 15 21:18:42 2019 -0800
@@ -13,7 +13,7 @@
   languageName: node
   linkType: hard
 
-"@babel/core@npm:^7.1.0":
+"@babel/core@npm:^7.1.0, @babel/core@npm:^7.7.5":
   version: 7.7.5
   resolution: "@babel/core@npm:7.7.5"
   dependencies:
@@ -2199,6 +2199,17 @@
   languageName: node
   linkType: hard
 
+"cross-spawn@npm:^5.0.1":
+  version: 5.1.0
+  resolution: "cross-spawn@npm:5.1.0"
+  dependencies:
+    lru-cache: ^4.0.1
+    shebang-command: ^1.2.0
+    which: ^1.2.9
+  checksum: 86ed15a14b2c256004f2545d95ccdbeeec1017314b83ca39100f19b99ba29ca10f8fc03fcff93db749c20aec923aba498635dc8898c0a96cd15baa7dafc98898
+  languageName: node
+  linkType: hard
+
 "cross-spawn@npm:^7.0.0":
   version: 7.0.1
   resolution: "cross-spawn@npm:7.0.1"
@@ -2308,7 +2319,7 @@
   languageName: node
   linkType: hard
 
-"decamelize@npm:^1.2.0":
+"decamelize@npm:^1.1.1, decamelize@npm:^1.2.0":
   version: 1.2.0
   resolution: "decamelize@npm:1.2.0"
   checksum: b4f9874e4777db39289cfe0d34d079df9531b10b50290ec8443e342faa840abbd1e7003ea0d735e03ea143d0bb34151afcb3711e7bc02fdcf19fe002683699ba
@@ -2865,6 +2876,21 @@
   languageName: node
   linkType: hard
 
+"execa@npm:^0.7.0":
+  version: 0.7.0
+  resolution: "execa@npm:0.7.0"
+  dependencies:
+    cross-spawn: ^5.0.1
+    get-stream: ^3.0.0
+    is-stream: ^1.1.0
+    npm-run-path: ^2.0.0
+    p-finally: ^1.0.0
+    signal-exit: ^3.0.0
+    strip-eof: ^1.0.0
+  checksum: 417bbd970475587af27a3e175e547a39e6904fbece3cf0424f609420f7ab48cab761fb2c9d189f23c06fe6c21d67bb5712ca711ec0381f842e6b665ec6db18c4
+  languageName: node
+  linkType: hard
+
 "execa@npm:^1.0.0":
   version: 1.0.0
   resolution: "execa@npm:1.0.0"
@@ -3153,6 +3179,15 @@
   languageName: node
   linkType: hard
 
+"find-up@npm:^2.1.0":
+  version: 2.1.0
+  resolution: "find-up@npm:2.1.0"
+  dependencies:
+    locate-path: ^2.0.0
+  checksum: f3c078cf000e01ecd04ee85553939614fb7eb36fea12711234b0aa822440ef09df3a173ba5a86e7c83c3d1a8c50388171a45b48f2ae4c3fa132e0bbae52fd2af
+  languageName: node
+  linkType: hard
+
 "find-up@npm:^3.0.0":
   version: 3.0.0
   resolution: "find-up@npm:3.0.0"
@@ -3336,6 +3371,13 @@
   languageName: node
   linkType: hard
 
+"get-stream@npm:^3.0.0":
+  version: 3.0.0
+  resolution: "get-stream@npm:3.0.0"
+  checksum: f8d6da8f2ec0190488f0ed9c4c265b522c645b226fe9b1c06dd44c442704d864ff2700e3ef468fcc35e20daa76d59d323d239a1eccd3dee5789ba04d0d73fb2d
+  languageName: node
+  linkType: hard
+
 "get-stream@npm:^4.0.0":
   version: 4.1.0
   resolution: "get-stream@npm:4.1.0"
@@ -3389,7 +3431,7 @@
   languageName: node
   linkType: hard
 
-"glob@npm:^7.0.3, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4":
+"glob@npm:^7.0.3, glob@npm:^7.1.1, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6":
   version: 7.1.6
   resolution: "glob@npm:7.1.6"
   dependencies:
@@ -3933,6 +3975,13 @@
   languageName: node
   linkType: hard
 
+"invert-kv@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "invert-kv@npm:1.0.0"
+  checksum: b81df4e63c056d31d9821fdc5e8116e4ed3237477186d2598248c1162e3078286377ef04910328b36b824420e22bc5a84edfe405d8e9df0807724f4361e142f0
+  languageName: node
+  linkType: hard
+
 "invert-kv@npm:^2.0.0":
   version: 2.0.0
   resolution: "invert-kv@npm:2.0.0"
@@ -4776,6 +4825,27 @@
   languageName: node
   linkType: hard
 
+"jest-webpack@npm:^0.5.1":
+  version: 0.5.1
+  resolution: "jest-webpack@npm:0.5.1"
+  dependencies:
+    find-up: ^2.1.0
+    mkdirp: ^0.5.1
+    node-object-hash: ^1.2.0
+    pify: ^3.0.0
+    regenerator-runtime: ^0.10.5
+    webpack-sources: ^1.0.1
+    yargs: ^10.0.3
+  peerDependencies:
+    jest: ">=21.0.0"
+    webpack: ">=4.0.0"
+    webpack-cli: ">=3.0.0"
+  bin:
+    jest-webpack: ./jest-webpack.js
+  checksum: 193b39a51de5b1f38e7568f4e2907124f1eedcbe26843271fef6a7635041167e454a4d23df27c0eb396e3382a80d1d77e84b653bbbf40183cba68297062096c5
+  languageName: node
+  linkType: hard
+
 "jest-worker@npm:^24.6.0, jest-worker@npm:^24.9.0":
   version: 24.9.0
   resolution: "jest-worker@npm:24.9.0"
@@ -5110,6 +5180,15 @@
   languageName: node
   linkType: hard
 
+"lcid@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "lcid@npm:1.0.0"
+  dependencies:
+    invert-kv: ^1.0.0
+  checksum: fd42ba6b3540b4cd7dacfee863b068f0db4e2dfd3f72add8d0f477a14c51b78e6d1a446cf5f2305ebdb6a9006c2c3b11904ab458c5e8924db70a8b2510a9a536
+  languageName: node
+  linkType: hard
+
 "lcid@npm:^2.0.0":
   version: 2.0.0
   resolution: "lcid@npm:2.0.0"
@@ -5200,6 +5279,16 @@
   languageName: node
   linkType: hard
 
+"locate-path@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "locate-path@npm:2.0.0"
+  dependencies:
+    p-locate: ^2.0.0
+    path-exists: ^3.0.0
+  checksum: b5a809a7ffd9ac5355424602a4bc3a716b51cfe18a7a656b69bc7c7e722314b5ba6bfc6d1117c6e8856d347b6a0d4b43f54a0c7429e64265331f64ad36ab6a7a
+  languageName: node
+  linkType: hard
+
 "locate-path@npm:^3.0.0":
   version: 3.0.0
   resolution: "locate-path@npm:3.0.0"
@@ -5265,6 +5354,16 @@
   languageName: node
   linkType: hard
 
+"lru-cache@npm:^4.0.1":
+  version: 4.1.5
+  resolution: "lru-cache@npm:4.1.5"
+  dependencies:
+    pseudomap: ^1.0.2
+    yallist: ^2.1.2
+  checksum: 93a0c9e2fdd8c58e4d952598217d77b221c9f3fcd8945fcc6a1107727421b0ee2ec15f2e0bb2e68829ad05362ed0ef01f1f0e1bf8e07499ccb26e3e10956cd4d
+  languageName: node
+  linkType: hard
+
 "lru-cache@npm:^5.1.1":
   version: 5.1.1
   resolution: "lru-cache@npm:5.1.1"
@@ -5350,6 +5449,15 @@
   languageName: node
   linkType: hard
 
+"mem@npm:^1.1.0":
+  version: 1.1.0
+  resolution: "mem@npm:1.1.0"
+  dependencies:
+    mimic-fn: ^1.0.0
+  checksum: 297fe7437511141cb09cb85f1b19a81322327f5ba6e7cbbe196a38a85772c748b09bb647646692f2746f29ef338ff81d0f80a79eccdaedb69b05640657a487e9
+  languageName: node
+  linkType: hard
+
 "mem@npm:^4.0.0":
   version: 4.3.0
   resolution: "mem@npm:4.3.0"
@@ -5486,6 +5594,13 @@
   languageName: node
   linkType: hard
 
+"mimic-fn@npm:^1.0.0":
+  version: 1.2.0
+  resolution: "mimic-fn@npm:1.2.0"
+  checksum: c207185575da12b8f36c670b860774ca84fcdf6372c0910c4890b1f802deb06286d748137fb2136f93979ced92e70bdb1c1921b58681eb0053cb8d8d35982450
+  languageName: node
+  linkType: hard
+
 "mimic-fn@npm:^2.0.0, mimic-fn@npm:^2.1.0":
   version: 2.1.0
   resolution: "mimic-fn@npm:2.1.0"
@@ -5829,6 +5944,13 @@
   languageName: node
   linkType: hard
 
+"node-object-hash@npm:^1.2.0":
+  version: 1.4.2
+  resolution: "node-object-hash@npm:1.4.2"
+  checksum: e6019aed9c9945b2459aa294fc0840705e880fef37ad73629f706329b672b974317381d92116762831119d47bc069c0a74151e22161b5d40d1bbc9e18be63eab
+  languageName: node
+  linkType: hard
+
 "node-pre-gyp@npm:^0.12.0":
   version: 0.12.0
   resolution: "node-pre-gyp@npm:0.12.0"
@@ -6153,6 +6275,17 @@
   languageName: node
   linkType: hard
 
+"os-locale@npm:^2.0.0":
+  version: 2.1.0
+  resolution: "os-locale@npm:2.1.0"
+  dependencies:
+    execa: ^0.7.0
+    lcid: ^1.0.0
+    mem: ^1.1.0
+  checksum: 216739b989835a1c1f2a612b3cd38d3ae9f64c7693d3d63e0877d33b8e5b75cd41e6df5ebb30e1c607547352d5b598a88a4adac1bd96bf6ce3e6c2eda5835e17
+  languageName: node
+  linkType: hard
+
 "os-locale@npm:^3.0.0, os-locale@npm:^3.1.0":
   version: 3.1.0
   resolution: "os-locale@npm:3.1.0"
@@ -6225,6 +6358,15 @@
   languageName: node
   linkType: hard
 
+"p-limit@npm:^1.1.0":
+  version: 1.3.0
+  resolution: "p-limit@npm:1.3.0"
+  dependencies:
+    p-try: ^1.0.0
+  checksum: c08e3a74db853e01b61fc95547135ca38dac5f968a7d2dea5adc9cfa6c466bc68f5e0a6dbe83484696a0580e792b438cc905ade90faac75432416832e84f113c
+  languageName: node
+  linkType: hard
+
 "p-limit@npm:^2.0.0, p-limit@npm:^2.2.0":
   version: 2.2.1
   resolution: "p-limit@npm:2.2.1"
@@ -6234,6 +6376,15 @@
   languageName: node
   linkType: hard
 
+"p-locate@npm:^2.0.0":
+  version: 2.0.0
+  resolution: "p-locate@npm:2.0.0"
+  dependencies:
+    p-limit: ^1.1.0
+  checksum: 0f43ac9656bea6f3d25e52fb7bec0f7375dde4d74b14d90a327e8bb85b8364a643ef2fc2e88373d8e2782a740ba4d639c3d86e455a8bcb1f59c2eea2c837a820
+  languageName: node
+  linkType: hard
+
 "p-locate@npm:^3.0.0":
   version: 3.0.0
   resolution: "p-locate@npm:3.0.0"
@@ -6275,6 +6426,13 @@
   languageName: node
   linkType: hard
 
+"p-try@npm:^1.0.0":
+  version: 1.0.0
+  resolution: "p-try@npm:1.0.0"
+  checksum: 963055d21dd1db934c7fac8590e46f7783832574318c5f5c46701632c383db461316fc21960a4c5e1e0789dae7fc7631ab1ef439a47670e68dcee05cf2f7f674
+  languageName: node
+  linkType: hard
+
 "p-try@npm:^2.0.0":
   version: 2.2.0
   resolution: "p-try@npm:2.2.0"
@@ -6661,6 +6819,13 @@
   languageName: node
   linkType: hard
 
+"pseudomap@npm:^1.0.2":
+  version: 1.0.2
+  resolution: "pseudomap@npm:1.0.2"
+  checksum: 65f6a2ddc864845d10e93a3425579e9b6c420f30640c895404832afc79e327066c5bfda9e82f3a08945e9158195137ae5bee79edcc18f241aa7e79fcf97bc9ea
+  languageName: node
+  linkType: hard
+
 "psl@npm:^1.1.24, psl@npm:^1.1.28":
   version: 1.6.0
   resolution: "psl@npm:1.6.0"
@@ -6937,6 +7102,13 @@
   languageName: node
   linkType: hard
 
+"regenerator-runtime@npm:^0.10.5":
+  version: 0.10.5
+  resolution: "regenerator-runtime@npm:0.10.5"
+  checksum: 36fbe8a0fdeb309830a07a6e0db0c2b0a64415c1ee1764ea7fdbe023177f3c32acdad4953c0daadcb9be9de159c2ae64bbb30d279e00f8e0279acb2a7165bda3
+  languageName: node
+  linkType: hard
+
 "regenerator-runtime@npm:^0.13.2":
   version: 0.13.3
   resolution: "regenerator-runtime@npm:0.13.3"
@@ -7765,6 +7937,7 @@
   version: 0.0.0-use.local
   resolution: "streamed-graph@workspace:."
   dependencies:
+    "@babel/core": ^7.7.5
     "@polymer/decorators": ^3.0.0
     "@polymer/polymer": ^3.3.1
     "@types/jest": ^24.0.23
@@ -7773,8 +7946,12 @@
     "@types/webpack": ^4.41.0
     "@types/webpack-dev-server": ^3.9.0
     "@yarnpkg/pnpify": ^2.0.0-rc.12
+    babel-jest: ^24.9.0
+    glob: ^7.1.6
     jest: ^24.9.0
+    jest-cli: ^24.9.0
     jest-pnp-resolver: ^1.2.1
+    jest-webpack: ^0.5.1
     jsonld: ^2.0.1
     lit-html: ^1.1.2
     n3: ^1.3.4
@@ -8731,7 +8908,7 @@
   languageName: node
   linkType: hard
 
-"webpack-sources@npm:^1.4.0, webpack-sources@npm:^1.4.1":
+"webpack-sources@npm:^1.0.1, webpack-sources@npm:^1.4.0, webpack-sources@npm:^1.4.1":
   version: 1.4.3
   resolution: "webpack-sources@npm:1.4.3"
   dependencies:
@@ -8987,6 +9164,13 @@
   languageName: node
   linkType: hard
 
+"y18n@npm:^3.2.1":
+  version: 3.2.1
+  resolution: "y18n@npm:3.2.1"
+  checksum: 45531473309f7d666442ffc976609e6ca075729d9773cd8ec5acfa2471beaf04d1a0f68f8bbe569fa8ca2ec7ad4375aeaeb02d6d003b8eb0d20550512d3b7644
+  languageName: node
+  linkType: hard
+
 "y18n@npm:^3.2.1 || ^4.0.0, y18n@npm:^4.0.0":
   version: 4.0.0
   resolution: "y18n@npm:4.0.0"
@@ -8994,6 +9178,13 @@
   languageName: node
   linkType: hard
 
+"yallist@npm:^2.1.2":
+  version: 2.1.2
+  resolution: "yallist@npm:2.1.2"
+  checksum: 50828b467fad2581ff97c1c49ecb0d605bca40e3dfa95c0fabff8a2bbff470df6f3a9a27beecbfa2f370db4c9f8c1a622ed0472394d248e54a0646181cccae0d
+  languageName: node
+  linkType: hard
+
 "yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.0.3":
   version: 3.1.1
   resolution: "yallist@npm:3.1.1"
@@ -9040,6 +9231,15 @@
   languageName: node
   linkType: hard
 
+"yargs-parser@npm:^8.1.0":
+  version: 8.1.0
+  resolution: "yargs-parser@npm:8.1.0"
+  dependencies:
+    camelcase: ^4.1.0
+  checksum: bbe658e8dd461b8c14e6af5420c88624eeabb220be39411f33af65d70dd569947aed12fc4c98685a9277840a896136a6568e3a77b06d63901103d98196febf1b
+  languageName: node
+  linkType: hard
+
 "yargs@npm:12.0.5":
   version: 12.0.5
   resolution: "yargs@npm:12.0.5"
@@ -9079,6 +9279,26 @@
   languageName: node
   linkType: hard
 
+"yargs@npm:^10.0.3":
+  version: 10.1.2
+  resolution: "yargs@npm:10.1.2"
+  dependencies:
+    cliui: ^4.0.0
+    decamelize: ^1.1.1
+    find-up: ^2.1.0
+    get-caller-file: ^1.0.1
+    os-locale: ^2.0.0
+    require-directory: ^2.1.1
+    require-main-filename: ^1.0.1
+    set-blocking: ^2.0.0
+    string-width: ^2.0.0
+    which-module: ^2.0.0
+    y18n: ^3.2.1
+    yargs-parser: ^8.1.0
+  checksum: 78728c3265ac96c182b8bcf9a1d8444ed3c8f100bcac4f8e504e3e2ffae80e5ef469c74d13988006ceeb52af54483b8767c1d6fdac08bc1f5b849ab18f2525a1
+  languageName: node
+  linkType: hard
+
 "yargs@npm:^13.3.0":
   version: 13.3.0
   resolution: "yargs@npm:13.3.0"