From 724c1c1228aa601fdbbed93dde68a5a9fa9c5ae9 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Wed, 20 Jul 2022 09:12:11 -0400
Subject: added a 'guest' login mode.  added ability for mainView to be any
 doc, not just a docking collection.

---
 .../views/collections/CollectionDockingView.tsx    | 70 ++++++++++++----------
 1 file changed, 39 insertions(+), 31 deletions(-)

(limited to 'src/client/views/collections/CollectionDockingView.tsx')

diff --git a/src/client/views/collections/CollectionDockingView.tsx b/src/client/views/collections/CollectionDockingView.tsx
index 42f9bb981..ed9054107 100644
--- a/src/client/views/collections/CollectionDockingView.tsx
+++ b/src/client/views/collections/CollectionDockingView.tsx
@@ -29,7 +29,7 @@ const _global = (window /* browser */ || global) /* node */ as any;
 
 @observer
 export class CollectionDockingView extends CollectionSubView() {
-    @observable public static Instance: CollectionDockingView;
+    @observable public static Instance: CollectionDockingView | undefined;
     public static makeDocumentConfig(document: Doc, panelName?: string, width?: number) {
         return {
             type: 'react-component',
@@ -103,12 +103,14 @@ export class CollectionDockingView extends CollectionSubView() {
 
     @undoBatch
     public static CloseSplit(document: Opt<Doc>, panelName?: string): boolean {
-        const tab = Array.from(CollectionDockingView.Instance.tabMap.keys()).find(tab => (panelName ? tab.contentItem.config.props.panelName === panelName : tab.DashDoc === document));
-        if (tab) {
-            const j = tab.header.parent.contentItems.indexOf(tab.contentItem);
-            if (j !== -1) {
-                tab.header.parent.contentItems[j].remove();
-                return CollectionDockingView.Instance.layoutChanged();
+        if (CollectionDockingView.Instance) {
+            const tab = Array.from(CollectionDockingView.Instance.tabMap.keys()).find(tab => (panelName ? tab.contentItem.config.props.panelName === panelName : tab.DashDoc === document));
+            if (tab) {
+                const j = tab.header.parent.contentItems.indexOf(tab.contentItem);
+                if (j !== -1) {
+                    tab.header.parent.contentItems[j].remove();
+                    return CollectionDockingView.Instance.layoutChanged();
+                }
             }
         }
 
@@ -119,19 +121,21 @@ export class CollectionDockingView extends CollectionSubView() {
     public static OpenFullScreen(doc: Doc) {
         SelectionManager.DeselectAll();
         const instance = CollectionDockingView.Instance;
-        if (doc._viewType === CollectionViewType.Docking && doc.layoutKey === 'layout') {
-            return DashboardView.openDashboard(doc);
+        if (instance) {
+            if (doc._viewType === CollectionViewType.Docking && doc.layoutKey === 'layout') {
+                return DashboardView.openDashboard(doc);
+            }
+            const newItemStackConfig = {
+                type: 'stack',
+                content: [CollectionDockingView.makeDocumentConfig(Doc.MakeAlias(doc))],
+            };
+            const docconfig = instance._goldenLayout.root.layoutManager.createContentItem(newItemStackConfig, instance._goldenLayout);
+            instance._goldenLayout.root.contentItems[0].addChild(docconfig);
+            docconfig.callDownwards('_$init');
+            instance._goldenLayout._$maximiseItem(docconfig);
+            instance._goldenLayout.emit('stateChanged');
+            instance.stateChanged();
         }
-        const newItemStackConfig = {
-            type: 'stack',
-            content: [CollectionDockingView.makeDocumentConfig(Doc.MakeAlias(doc))],
-        };
-        const docconfig = instance._goldenLayout.root.layoutManager.createContentItem(newItemStackConfig, instance._goldenLayout);
-        instance._goldenLayout.root.contentItems[0].addChild(docconfig);
-        docconfig.callDownwards('_$init');
-        instance._goldenLayout._$maximiseItem(docconfig);
-        instance._goldenLayout.emit('stateChanged');
-        instance.stateChanged();
         return true;
     }
 
@@ -146,21 +150,23 @@ export class CollectionDockingView extends CollectionSubView() {
             const newContentItem = stack.layoutManager.createContentItem(newConfig, instance._goldenLayout);
             stack.addChild(newContentItem.contentItems[0], undefined);
             stack.contentItems[activeContentItemIndex].remove();
-            return CollectionDockingView.Instance.layoutChanged();
+            return instance.layoutChanged();
         }
-        const tab = Array.from(CollectionDockingView.Instance.tabMap.keys()).find(tab => tab.contentItem.config.props.panelName === panelName);
+        const tab = Array.from(instance.tabMap.keys()).find(tab => tab.contentItem.config.props.panelName === panelName);
         if (tab) {
             tab.header.parent.addChild(newConfig, undefined);
             const j = tab.header.parent.contentItems.indexOf(tab.contentItem);
             !addToSplit && j !== -1 && tab.header.parent.contentItems[j].remove();
-            return CollectionDockingView.Instance.layoutChanged();
+            return instance.layoutChanged();
         }
         return CollectionDockingView.AddSplit(document, panelName, stack, panelName);
     }
 
     @undoBatch
     public static ToggleSplit(doc: Doc, location: string, stack?: any, panelName?: string) {
-        return Array.from(CollectionDockingView.Instance.tabMap.keys()).findIndex(tab => tab.DashDoc === doc) !== -1 ? CollectionDockingView.CloseSplit(doc) : CollectionDockingView.AddSplit(doc, location, stack, panelName);
+        return CollectionDockingView.Instance && Array.from(CollectionDockingView.Instance.tabMap.keys()).findIndex(tab => tab.DashDoc === doc) !== -1
+            ? CollectionDockingView.CloseSplit(doc)
+            : CollectionDockingView.AddSplit(doc, location, stack, panelName);
     }
 
     //
@@ -170,7 +176,7 @@ export class CollectionDockingView extends CollectionSubView() {
     @action
     public static AddSplit(document: Doc, pullSide: string, stack?: any, panelName?: string) {
         if (document._viewType === CollectionViewType.Docking) return DashboardView.openDashboard(document);
-
+        if (!CollectionDockingView.Instance) return false;
         const tab = Array.from(CollectionDockingView.Instance.tabMap).find(tab => tab.DashDoc === document);
         if (tab) {
             tab.header.parent.setActiveContentItem(tab.contentItem);
@@ -453,13 +459,15 @@ export class CollectionDockingView extends CollectionSubView() {
             Doc.AddDocToList(Doc.MyHeaderBar, 'data', tab.DashDoc);
             Doc.AddDocToList(Doc.MyRecentlyClosed, 'data', tab.DashDoc, undefined, true, true);
         }
-        const dview = CollectionDockingView.Instance.props.Document;
-        const fieldKey = CollectionDockingView.Instance.props.fieldKey;
-        Doc.RemoveDocFromList(dview, fieldKey, tab.DashDoc);
-        this.tabMap.delete(tab);
-        tab._disposers && Object.values(tab._disposers).forEach((disposer: any) => disposer?.());
-        tab.reactComponents?.forEach((ele: any) => ReactDOM.unmountComponentAtNode(ele));
-        this.stateChanged();
+        if (CollectionDockingView.Instance) {
+            const dview = CollectionDockingView.Instance.props.Document;
+            const fieldKey = CollectionDockingView.Instance.props.fieldKey;
+            Doc.RemoveDocFromList(dview, fieldKey, tab.DashDoc);
+            this.tabMap.delete(tab);
+            tab._disposers && Object.values(tab._disposers).forEach((disposer: any) => disposer?.());
+            tab.reactComponents?.forEach((ele: any) => ReactDOM.unmountComponentAtNode(ele));
+            this.stateChanged();
+        }
     };
     tabCreated = (tab: any) => {
         this.tabMap.add(tab);
-- 
cgit v1.2.3-70-g09d2


From 8597999f53a7599d9bdeeb70150baec95b2f6dd0 Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Thu, 28 Jul 2022 10:51:14 -0400
Subject: fixed an issue with tab closing not being serialized correctly
 causing incorrect state on reload

---
 src/client/views/collections/CollectionDockingView.tsx | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

(limited to 'src/client/views/collections/CollectionDockingView.tsx')

diff --git a/src/client/views/collections/CollectionDockingView.tsx b/src/client/views/collections/CollectionDockingView.tsx
index ed9054107..39e2cc17d 100644
--- a/src/client/views/collections/CollectionDockingView.tsx
+++ b/src/client/views/collections/CollectionDockingView.tsx
@@ -466,7 +466,7 @@ export class CollectionDockingView extends CollectionSubView() {
             this.tabMap.delete(tab);
             tab._disposers && Object.values(tab._disposers).forEach((disposer: any) => disposer?.());
             tab.reactComponents?.forEach((ele: any) => ReactDOM.unmountComponentAtNode(ele));
-            this.stateChanged();
+            setTimeout(this.stateChanged);
         }
     };
     tabCreated = (tab: any) => {
-- 
cgit v1.2.3-70-g09d2


From 1f42bac078fc96d2d63c54f62281941d19abf1be Mon Sep 17 00:00:00 2001
From: bobzel <zzzman@gmail.com>
Date: Tue, 9 Aug 2022 09:33:43 -0400
Subject: fixed presbox pinning from crashing/failing by making it a
 prefetchproxy.  update user cache when switching active page.

---
 .vscode/launch.json                                | 188 +++++++++------------
 .../views/collections/CollectionDockingView.tsx    |   2 +-
 src/client/views/collections/TabDocView.tsx        |  27 +--
 src/fields/Doc.ts                                  |   3 +-
 webpack.config.js                                  | 162 +++++++++---------
 5 files changed, 183 insertions(+), 199 deletions(-)

(limited to 'src/client/views/collections/CollectionDockingView.tsx')

diff --git a/.vscode/launch.json b/.vscode/launch.json
index 9692c79d9..ce9f50f67 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -4,110 +4,86 @@
     // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
     "version": "0.2.0",
     "configurations": [
-      {
-        "type": "chrome",
-        "request": "launch",
-        "name": "Launch Chrome against localhost",
-        "sourceMaps": true,
-        "breakOnLoad": true,
-        "url": "http://localhost:1050/login",
-        "webRoot": "${workspaceFolder}",
-        "runtimeArgs": [
-          "--experimental-modules"
-        ]
-      },
-      {
-        "type": "chrome",
-        "request": "launch",
-        "name": "Launch Chromium against localhost",
-        "sourceMaps": true,
-        "breakOnLoad": true,
-        "url": "http://localhost:1050/login",
-        "webRoot": "${workspaceFolder}",
-        "runtimeExecutable": "/usr/bin/chromium",
-        "runtimeArgs": [
-          "--experimental-modules"
-        ]
-      },
-      {
-        "type": "firefox",
-        "request": "launch",
-        "name": "Launch Firefox against localhost",
-        "reAttach": true,
-        "url": "http://localhost:1050/login",
-        "webRoot": "${workspaceFolder}",
-        "pathMappings": [
-          {
-            "url": "webpack://dash/src",
-            "path": "${workspaceFolder}/src"
-          }
-        ]
-      },
-      {
-        "type": "chrome",
-        "request": "launch",
-        "name": "Launch Chrome against Dash server",
-        "sourceMaps": true,
-        "breakOnLoad": true,
-        "url": "https://browndash.com/login",
-        "webRoot": "${workspaceFolder}"
-      },
-      {
-        "type": "node",
-        "request": "attach",
-        "name": "Typescript Server",
-        "protocol": "inspector",
-        "port": 9229,
-        "localRoot": "${workspaceFolder}",
-        "remoteRoot": "${workspaceFolder}"
-      },
-      {
-        "type": "node",
-        "request": "launch",
-        "name": "Current TS File",
-        "runtimeExecutable": "npx",
-        "runtimeArgs": [
-          "ts-node-dev",
-          "--nolazy",
-          "--inspect",
-          "--",
-          "${relativeFile}"
-        ],
-        "port": 9229
-      },
-      {
-        "type": "node",
-        "request": "launch",
-        "name": "Mocha Tests",
-        "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
-        "args": [
-          "-r",
-          "ts-node/register",
-          "--timeout",
-          "999999",
-          "--colors",
-          "${workspaceFolder}/test/**/*.ts"
-        ],
-        "console": "integratedTerminal",
-        "internalConsoleOptions": "openOnSessionStart",
-        "protocol": "inspector"
-      },
-      {
-        "type": "node",
-        "request": "launch",
-        "name": "Mocha Current File",
-        "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
-        "args": [
-          "-r",
-          "ts-node/register",
-          "--timeout",
-          "999999",
-          "--colors",
-          "${file}"
-        ],
-        "console": "integratedTerminal",
-        "internalConsoleOptions": "openOnSessionStart",
-        "protocol": "inspector"
-      }
+        {
+            "type": "chrome",
+            "request": "launch",
+            "name": "Launch Chrome against localhost",
+            "sourceMaps": true,
+            "breakOnLoad": true,
+            "url": "http://localhost:1050/login",
+            "webRoot": "${workspaceFolder}",
+            "runtimeArgs": ["--experimental-modules"]
+        },
+        {
+            "type": "chrome",
+            "request": "launch",
+            "name": "Launch Chromium against localhost",
+            "sourceMaps": true,
+            "breakOnLoad": true,
+            "url": "http://localhost:1050/login",
+            "webRoot": "${workspaceFolder}",
+            "runtimeExecutable": "/usr/bin/chromium",
+            "runtimeArgs": ["--experimental-modules"]
+        },
+        {
+            "type": "firefox",
+            "request": "launch",
+            "name": "Launch Firefox against localhost",
+            "reAttach": true,
+            "url": "http://localhost:1050/login",
+            "webRoot": "${workspaceFolder}",
+            "pathMappings": [
+                {
+                    "url": "webpack://dash/src",
+                    "path": "${workspaceFolder}/src"
+                }
+            ]
+        },
+        {
+            "type": "chrome",
+            "request": "launch",
+            "name": "Launch Chrome against Dash server",
+            "sourceMaps": true,
+            "breakOnLoad": true,
+            "url": "https://browndash.com/login",
+            "webRoot": "${workspaceFolder}"
+        },
+        {
+            "type": "node",
+            "request": "attach",
+            "name": "Typescript Server",
+            "protocol": "inspector",
+            "port": 9229,
+            "localRoot": "${workspaceFolder}",
+            "remoteRoot": "${workspaceFolder}"
+        },
+        {
+            "type": "node",
+            "request": "launch",
+            "name": "Current TS File",
+            "runtimeExecutable": "npx",
+            "runtimeArgs": ["ts-node-dev", "--nolazy", "--inspect", "--", "${relativeFile}"],
+            "port": 9229
+        },
+        {
+            "type": "node",
+            "request": "launch",
+            "name": "Mocha Tests",
+            "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
+            "args": ["-r", "ts-node/register", "--timeout", "999999", "--colors", "${workspaceFolder}/test/**/*.ts"],
+            "console": "integratedTerminal",
+            "internalConsoleOptions": "openOnSessionStart",
+            "protocol": "inspector"
+        },
+        {
+            "type": "node",
+            "request": "launch",
+            "name": "Mocha Current File",
+            "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
+            "args": ["-r", "ts-node/register", "--timeout", "999999", "--colors", "${file}"],
+            "console": "integratedTerminal",
+            "internalConsoleOptions": "openOnSessionStart",
+            "protocol": "inspector"
+        }
     ]
-}
\ No newline at end of file
+}
diff --git a/src/client/views/collections/CollectionDockingView.tsx b/src/client/views/collections/CollectionDockingView.tsx
index 39e2cc17d..6d70cc0d2 100644
--- a/src/client/views/collections/CollectionDockingView.tsx
+++ b/src/client/views/collections/CollectionDockingView.tsx
@@ -175,7 +175,7 @@ export class CollectionDockingView extends CollectionSubView() {
     @undoBatch
     @action
     public static AddSplit(document: Doc, pullSide: string, stack?: any, panelName?: string) {
-        if (document._viewType === CollectionViewType.Docking) return DashboardView.openDashboard(document);
+        if (document?._viewType === CollectionViewType.Docking) return DashboardView.openDashboard(document);
         if (!CollectionDockingView.Instance) return false;
         const tab = Array.from(CollectionDockingView.Instance.tabMap).find(tab => tab.DashDoc === document);
         if (tab) {
diff --git a/src/client/views/collections/TabDocView.tsx b/src/client/views/collections/TabDocView.tsx
index 2d08b1c09..ec291e72c 100644
--- a/src/client/views/collections/TabDocView.tsx
+++ b/src/client/views/collections/TabDocView.tsx
@@ -212,11 +212,11 @@ export class TabDocView extends React.Component<TabDocViewProps> {
     @action
     public static PinDoc(docs: Doc | Doc[], pinProps?: PinProps) {
         const docList = docs instanceof Doc ? [docs] : docs;
-        const batch = UndoManager.StartBatch('pinning doc');
 
         // all docs will be added to the ActivePresentation as stored on CurrentUserUtils
         const curPres = Doc.ActivePresentation;
-        curPres &&
+        if (curPres) {
+            const batch = UndoManager.StartBatch('pinning doc');
             docList.forEach(doc => {
                 // Edge Case 1: Cannot pin document to itself
                 if (doc === curPres) {
@@ -301,18 +301,19 @@ export class TabDocView extends React.Component<TabDocViewProps> {
                 PresBox.Instance?._selectedArray.clear();
                 pinDoc && PresBox.Instance?._selectedArray.set(pinDoc, undefined); //Update selected array
             });
-        if (
-            CollectionDockingView.Instance &&
-            !Array.from(CollectionDockingView.Instance.tabMap)
-                .map(d => d.DashDoc)
-                .includes(curPres)
-        ) {
-            const docs = Cast(Doc.MyOverlayDocs.data, listSpec(Doc), []);
-            if (docs.includes(curPres)) docs.splice(docs.indexOf(curPres), 1);
-            CollectionDockingView.AddSplit(curPres, 'right');
-            setTimeout(() => DocumentManager.Instance.jumpToDocument(docList.lastElement(), false, undefined, []), 100); // keeps the pinned doc in view since the sidebar shifts things
+            if (
+                CollectionDockingView.Instance &&
+                !Array.from(CollectionDockingView.Instance.tabMap)
+                    .map(d => d.DashDoc)
+                    .includes(curPres)
+            ) {
+                const docs = Cast(Doc.MyOverlayDocs.data, listSpec(Doc), []);
+                if (docs.includes(curPres)) docs.splice(docs.indexOf(curPres), 1);
+                CollectionDockingView.AddSplit(curPres, 'right');
+                setTimeout(() => DocumentManager.Instance.jumpToDocument(docList.lastElement(), false, undefined, []), 100); // keeps the pinned doc in view since the sidebar shifts things
+            }
+            setTimeout(batch.end, 500); // need to wait until dockingview (goldenlayout) updates all its structurs
         }
-        setTimeout(batch.end, 500); // need to wait until dockingview (goldenlayout) updates all its structurs
     }
 
     componentDidMount() {
diff --git a/src/fields/Doc.ts b/src/fields/Doc.ts
index 0c7504913..8d56ebf8c 100644
--- a/src/fields/Doc.ts
+++ b/src/fields/Doc.ts
@@ -211,6 +211,7 @@ export class Doc extends RefField {
     }
     public static set ActivePage(val) {
         Doc.UserDoc().activePage = val;
+        DocServer.UPDATE_SERVER_CACHE();
     }
     public static get ActiveDashboard() {
         return DocCast(Doc.UserDoc().activeDashboard);
@@ -228,7 +229,7 @@ export class Doc extends RefField {
         return DocCast(Doc.UserDoc().activePresentation);
     }
     public static set ActivePresentation(val) {
-        Doc.UserDoc().activePresentation = val;
+        Doc.UserDoc().activePresentation = new PrefetchProxy(val);
     }
     constructor(id?: FieldId, forceSave?: boolean) {
         super(id);
diff --git a/webpack.config.js b/webpack.config.js
index 5a954db19..01625988c 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,38 +1,38 @@
-var path = require('path');
-var webpack = require('webpack');
-const CopyWebpackPlugin = require("copy-webpack-plugin");
+const path = require('path');
+const webpack = require('webpack');
+const CopyWebpackPlugin = require('copy-webpack-plugin');
 const HtmlWebpackPlugin = require('html-webpack-plugin');
-const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
 
 const plugins = [
-    new CopyWebpackPlugin([{
-        from: "deploy",
-        to: path.join(__dirname, "build")
-    }]),
+    new CopyWebpackPlugin([
+        {
+            from: 'deploy',
+            to: path.join(__dirname, 'build'),
+        },
+    ]),
     new HtmlWebpackPlugin({
         title: 'Caching',
     }),
     new ForkTsCheckerWebpackPlugin({
         tslint: true,
         //  memoryLimit: 4096,
-        useTypescriptIncrementalApi: true
+        useTypescriptIncrementalApi: true,
     }),
-    new webpack.ProvidePlugin({ Buffer: ['buffer', 'Buffer'], }),
-    new webpack.ProvidePlugin({ process: 'process/browser', }),
+    new webpack.ProvidePlugin({ Buffer: ['buffer', 'Buffer'] }),
+    new webpack.ProvidePlugin({ process: 'process/browser' }),
     new webpack.HotModuleReplacementPlugin(),
 ];
 
 function transferEnvironmentVariables() {
-    const prefix = "_CLIENT_";
-    const {
-        parsed
-    } = require('dotenv').config();
+    const prefix = '_CLIENT_';
+    const { parsed } = require('dotenv').config();
     if (!parsed) {
         return;
     }
     const resolvedClientSide = Object.keys(parsed).reduce((mapping, envKey) => {
         if (envKey.startsWith(prefix)) {
-            mapping[`process.env.${envKey.replace(prefix, "")}`] = JSON.stringify(parsed[envKey]);
+            mapping[`process.env.${envKey.replace(prefix, '')}`] = JSON.stringify(parsed[envKey]);
         }
         return mapping;
     }, {});
@@ -44,18 +44,18 @@ transferEnvironmentVariables();
 module.exports = {
     mode: 'development',
     entry: {
-        bundle: ["./src/client/views/Main.tsx", 'webpack-hot-middleware/client?reload=true'],
-        viewer: ["./src/debug/Viewer.tsx", 'webpack-hot-middleware/client?reload=true'],
-        repl: ["./src/debug/Repl.tsx", 'webpack-hot-middleware/client?reload=true'],
-        test: ["./src/debug/Test.tsx", 'webpack-hot-middleware/client?reload=true'],
-        inkControls: ["./src/mobile/InkControls.tsx", 'webpack-hot-middleware/client?reload=true'],
-        mobileInterface: ["./src/client/views/Main.tsx", 'webpack-hot-middleware/client?reload=true'],
+        bundle: ['./src/client/views/Main.tsx', 'webpack-hot-middleware/client?reload=true'],
+        viewer: ['./src/debug/Viewer.tsx', 'webpack-hot-middleware/client?reload=true'],
+        repl: ['./src/debug/Repl.tsx', 'webpack-hot-middleware/client?reload=true'],
+        test: ['./src/debug/Test.tsx', 'webpack-hot-middleware/client?reload=true'],
+        inkControls: ['./src/mobile/InkControls.tsx', 'webpack-hot-middleware/client?reload=true'],
+        mobileInterface: ['./src/client/views/Main.tsx', 'webpack-hot-middleware/client?reload=true'],
     },
-    devtool: "source-map",
+    devtool: 'source-map',
     output: {
-        filename: "[name].js",
-        path: path.resolve(__dirname, "build"),
-        publicPath: "/",
+        filename: '[name].js',
+        path: path.resolve(__dirname, 'build'),
+        publicPath: '/',
     },
     resolve: {
         extensions: ['.js', '.ts', '.tsx'],
@@ -68,67 +68,73 @@ module.exports = {
             crypto: false,
             assert: false,
             os: false,
-            path: require.resolve("path-browserify"),
-            http: require.resolve("http-browserify"),
-            https: require.resolve("https-browserify"),
-            stream: require.resolve("stream-browserify"),
-            buffer: require.resolve("buffer")
-        }
+            path: require.resolve('path-browserify'),
+            http: require.resolve('http-browserify'),
+            https: require.resolve('https-browserify'),
+            stream: require.resolve('stream-browserify'),
+            buffer: require.resolve('buffer'),
+        },
     },
     module: {
-        rules: [{
-            test: [/\.tsx?$/],
-            use: [{
-                loader: 'ts-loader',
-                options: {
-                    transpileOnly: true
-                }
-            }]
-        },
-        {
-            test: /\.m?js/,
-            resolve: {
-                fullySpecified: false
-            }
-        },
-        {
-            test: /\.(woff|woff2|ttf|eot|otf|svg)$/,
-            use: 'file-loader?name=fonts/[name].[ext]!static'
-        },
-        {
-            test: /\.scss|css$/,
-            use: [{
-                loader: "style-loader"
+        rules: [
+            {
+                test: [/\.tsx?$/],
+                use: [
+                    {
+                        loader: 'ts-loader',
+                        options: {
+                            transpileOnly: true,
+                        },
+                    },
+                ],
             },
             {
-                loader: "css-loader"
+                test: /\.m?js/,
+                resolve: {
+                    fullySpecified: false,
+                },
             },
             {
-                loader: "sass-loader"
+                test: /\.(woff|woff2|ttf|eot|otf|svg)$/,
+                use: 'file-loader?name=fonts/[name].[ext]!static',
+            },
+            {
+                test: /\.scss|css$/,
+                use: [
+                    {
+                        loader: 'style-loader',
+                    },
+                    {
+                        loader: 'css-loader',
+                    },
+                    {
+                        loader: 'sass-loader',
+                    },
+                ],
+            },
+            {
+                test: /\.(jpg|png|pdf)$/,
+                use: [
+                    {
+                        loader: 'file-loader',
+                    },
+                ],
+            },
+            {
+                test: /\.(png|jpg|gif)$/i,
+                use: [
+                    {
+                        loader: 'url-loader',
+                        options: {
+                            limit: 8192,
+                        },
+                    },
+                ],
             },
-            ]
-        },
-        {
-            test: /\.(jpg|png|pdf)$/,
-            use: [{
-                loader: 'file-loader'
-            }]
-        },
-        {
-            test: /\.(png|jpg|gif)$/i,
-            use: [{
-                loader: 'url-loader',
-                options: {
-                    limit: 8192
-                }
-            }]
-        }
         ],
 
         noParse: [require.resolve('typescript/lib/typescript.js')],
     },
     plugins,
-    externals: [
-        'child_process'
-    ],
-};
\ No newline at end of file
+    externals: ['child_process'],
+};
-- 
cgit v1.2.3-70-g09d2

