@inrupt/solid-client-authn-browser 1.11.7 → 1.11.8-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/ClientAuthentication.d.ts +18 -17
  2. package/dist/Session.d.ts +35 -36
  3. package/dist/Session.js +2 -45
  4. package/dist/Session.js.map +1 -1
  5. package/dist/constant.d.ts +2 -2
  6. package/dist/defaultSession.d.ts +9 -9
  7. package/dist/dependencies.d.ts +6 -6
  8. package/dist/iframe.d.ts +3 -3
  9. package/dist/index.d.ts +4 -4
  10. package/dist/index.es.js +1693 -0
  11. package/dist/index.js +1717 -27
  12. package/dist/login/AggregateLoginHandler.d.ts +4 -4
  13. package/dist/login/oidc/AggregateOidcHandler.d.ts +4 -4
  14. package/dist/login/oidc/ClientRegistrar.d.ts +6 -6
  15. package/dist/login/oidc/IssuerConfigFetcher.d.ts +8 -8
  16. package/dist/login/oidc/OidcLoginHandler.d.ts +10 -10
  17. package/dist/login/oidc/Redirector.d.ts +4 -4
  18. package/dist/login/oidc/oidcHandlers/AuthorizationCodeWithPkceOidcHandler.d.ts +8 -8
  19. package/dist/login/oidc/oidcHandlers/OidcHandlerCanHandleTest.d.ts +9 -9
  20. package/dist/login/oidc/redirectHandler/AggregateRedirectHandler.d.ts +4 -4
  21. package/dist/login/oidc/redirectHandler/AuthCodeRedirectHandler.d.ts +15 -16
  22. package/dist/login/oidc/redirectHandler/AuthCodeRedirectHandler.js +1 -23
  23. package/dist/login/oidc/redirectHandler/AuthCodeRedirectHandler.js.map +1 -1
  24. package/dist/login/oidc/redirectHandler/ErrorOidcHandler.d.ts +9 -9
  25. package/dist/login/oidc/redirectHandler/FallbackRedirectHandler.d.ts +7 -7
  26. package/dist/login/oidc/refresh/TokenRefresher.d.ts +10 -10
  27. package/dist/login/webid/WebIdLoginHandler.d.ts +5 -5
  28. package/dist/logout/GeneralLogoutHandler.d.ts +7 -7
  29. package/dist/sessionInfo/SessionInfoManager.d.ts +16 -16
  30. package/dist/sessionInfo/SessionInfoManager.js +0 -8
  31. package/dist/sessionInfo/SessionInfoManager.js.map +1 -1
  32. package/dist/solid-client-authn.bundle.js +1720 -2
  33. package/dist/storage/BrowserStorage.d.ts +7 -7
  34. package/dist/storage/StorageUtility.d.ts +4 -4
  35. package/dist/util/UuidGenerator.d.ts +6 -6
  36. package/dist/util/urlPath.d.ts +1 -1
  37. package/examples/demoClientApp/package-lock.json +85 -18
  38. package/examples/demoClientApp/package.json +2 -1
  39. package/examples/demoClientApp/src/DemoClientApp.js +9 -1
  40. package/examples/single/bundle/package-lock.json +18 -18
  41. package/jest.config.js +6 -1
  42. package/package.json +17 -29
  43. package/rollup.config.js +57 -0
  44. package/src/ClientAuthentication.spec.ts +69 -1
  45. package/src/ClientAuthentication.ts +32 -14
  46. package/src/Session.spec.ts +0 -224
  47. package/src/Session.ts +8 -88
  48. package/src/login/oidc/__mocks__/Redirector.ts +9 -9
  49. package/src/login/oidc/oidcHandlers/AuthorizationCodeWithPkceOidcHandler.spec.ts +34 -18
  50. package/src/login/oidc/redirectHandler/AuthCodeRedirectHandler.spec.ts +3 -171
  51. package/src/login/oidc/redirectHandler/AuthCodeRedirectHandler.ts +0 -68
  52. package/src/login/oidc/redirectHandler/__mocks__/RedirectHandler.ts +13 -0
  53. package/src/sessionInfo/SessionInfoManager.spec.ts +0 -27
  54. package/src/sessionInfo/SessionInfoManager.ts +0 -10
  55. package/src/index.browser.spec.ts +0 -27
  56. package/src/index.browser.ts +0 -24
  57. package/webpack.browser.js +0 -19
  58. package/webpack.common.js +0 -22
  59. package/webpack.config.js +0 -8
  60. package/webpack.dev.js +0 -17
  61. package/webpack.prod.js +0 -3
@@ -35,11 +35,8 @@ import { CodeExchangeResult, getBearerToken } from "@inrupt/oidc-client-ext";
35
35
  import { Response } from "cross-fetch";
36
36
  import { JWK, importJWK } from "jose";
37
37
  import { KeyObject } from "crypto";
38
- import {
39
- AuthCodeRedirectHandler,
40
- DEFAULT_LIFESPAN,
41
- } from "./AuthCodeRedirectHandler";
42
- import { RedirectorMock } from "../__mocks__/Redirector";
38
+ import { AuthCodeRedirectHandler } from "./AuthCodeRedirectHandler";
39
+ import { mockRedirector } from "../__mocks__/Redirector";
43
40
  import { SessionInfoManagerMock } from "../../../sessionInfo/__mocks__/SessionInfoManager";
44
41
  import { LocalStorageMock } from "../../../storage/__mocks__/LocalStorage";
45
42
  import {
@@ -211,7 +208,7 @@ const mockFetch = (response: Response) => {
211
208
 
212
209
  const defaultMocks = {
213
210
  storageUtility: StorageUtilityMock,
214
- redirector: RedirectorMock,
211
+ redirector: mockRedirector(),
215
212
  sessionInfoManager: SessionInfoManagerMock,
216
213
  clientRegistrar: mockClientRegistrar(mockClient()),
217
214
  issuerConfigFetcher: mockIssuerConfigFetcher(mockIssuer()),
@@ -514,15 +511,11 @@ describe("AuthCodeRedirectHandler", () => {
514
511
  it("returns the expiration time normalised to the current time", async () => {
515
512
  mockOidcClient();
516
513
  window.fetch = jest.fn();
517
- mockLocalStorage({
518
- "tmp-resource-server-session-enabled": "false",
519
- });
520
514
  const MOCK_TIMESTAMP = 10000;
521
515
  Date.now = jest
522
516
  .fn()
523
517
  // Date.now is called twice: once to be able to calculate the auth token expiry time,
524
518
  // and once to set the cookie expiry. We only care about the second in this test.
525
- .mockReturnValueOnce(MOCK_TIMESTAMP)
526
519
  .mockReturnValueOnce(MOCK_TIMESTAMP) as typeof Date.now;
527
520
 
528
521
  const authCodeRedirectHandler = getAuthCodeRedirectHandler({
@@ -541,9 +534,6 @@ describe("AuthCodeRedirectHandler", () => {
541
534
  it("returns null for the expiration time if none was provided", async () => {
542
535
  const mockedOidcClient = mockOidcClient();
543
536
  window.fetch = jest.fn();
544
- mockLocalStorage({
545
- "tmp-resource-server-session-enabled": "false",
546
- });
547
537
  mockedOidcClient.getBearerToken = jest
548
538
  .fn(getBearerToken)
549
539
  .mockResolvedValueOnce({
@@ -582,165 +572,7 @@ describe("AuthCodeRedirectHandler", () => {
582
572
  });
583
573
  });
584
574
 
585
- it("stores information about the resource server cookie in local storage on successful authentication", async () => {
586
- mockOidcClient();
587
-
588
- // This mocks the fetch to the Resource Server session endpoint
589
- // Note: Currently, the endpoint only returns the webid in plain/text, it could
590
- // be extended later to also provide the cookie expiration.
591
- mockFetch(
592
- new Response("https://my.webid", {
593
- status: 200,
594
- })
595
- );
596
-
597
- const MOCK_TIMESTAMP = 10000;
598
- Date.now = jest
599
- .fn()
600
- // Date.now is called twice: once to be able to calculate the auth token expiry time,
601
- // and once to set the cookie expiry. We only care about the second in this test.
602
- .mockReturnValueOnce(MOCK_TIMESTAMP)
603
- .mockReturnValueOnce(MOCK_TIMESTAMP) as typeof Date.now;
604
-
605
- const mockedStorage = mockDefaultStorageUtility();
606
-
607
- const authCodeRedirectHandler = getAuthCodeRedirectHandler({
608
- storageUtility: mockedStorage,
609
- });
610
-
611
- await authCodeRedirectHandler.handle(mockRedirectUrl());
612
- expect(
613
- JSON.parse(
614
- (await mockedStorage.get("tmp-resource-server-session-info")) as string
615
- )
616
- ).toEqual({
617
- webId: "https://my.webid",
618
- sessions: {
619
- "https://my.webid": {
620
- expiration: MOCK_TIMESTAMP + DEFAULT_LIFESPAN,
621
- },
622
- },
623
- });
624
- });
625
-
626
- it("does not look the session endpoint up if the ESS cookie workaround has been disabled", async () => {
627
- mockOidcClient();
628
- mockLocalStorage({
629
- "tmp-resource-server-session-enabled": "false",
630
- });
631
-
632
- // This mocks the fetch to the Resource Server session endpoint
633
- // Note: Currently, the endpoint only returns the webid in plain/text, it could
634
- // be extended later to also provide the cookie expiration.
635
- mockFetch(
636
- new Response("https://my.webid", {
637
- status: 200,
638
- })
639
- );
640
-
641
- const MOCK_TIMESTAMP = 10000;
642
- Date.now = jest
643
- .fn()
644
- // Date.now is called twice: once to be able to calculate the auth token expiry time,
645
- // and once to set the cookie expiry. We only care about the second in this test.
646
- .mockReturnValueOnce(MOCK_TIMESTAMP)
647
- .mockReturnValueOnce(MOCK_TIMESTAMP) as typeof Date.now;
648
-
649
- const mockedStorage = mockDefaultStorageUtility();
650
-
651
- const authCodeRedirectHandler = getAuthCodeRedirectHandler({
652
- storageUtility: mockedStorage,
653
- });
654
-
655
- await authCodeRedirectHandler.handle(mockRedirectUrl());
656
- expect(
657
- JSON.parse(
658
- (await mockedStorage.get("tmp-resource-server-session-info")) ?? "{}"
659
- )
660
- ).toEqual({});
661
- });
662
-
663
- it("store nothing if the resource server has no session endpoint", async () => {
664
- mockOidcClient();
665
- mockLocalStorage({});
666
- // This mocks the fetch to the Resource Server session endpoint
667
- // Note: Currently, the endpoint only returns the WebID in plain/text, it could
668
- // be extended later to also provide the cookie expiration.
669
- mockFetch(
670
- new Response("", {
671
- status: 404,
672
- })
673
- );
674
-
675
- const mockedStorage = mockDefaultStorageUtility();
676
-
677
- const authCodeRedirectHandler = getAuthCodeRedirectHandler({
678
- storageUtility: mockedStorage,
679
- });
680
-
681
- await authCodeRedirectHandler.handle(mockRedirectUrl());
682
- expect(
683
- JSON.parse(
684
- (await mockedStorage.get("tmp-resource-server-session-info")) ?? "{}"
685
- )
686
- ).toEqual({});
687
- });
688
-
689
- it("swallows the exception if the fetch to the session endpoint fails", async () => {
690
- mockOidcClient();
691
- mockLocalStorage({});
692
- window.fetch = (jest.fn() as any)
693
- .mockResolvedValueOnce(
694
- new Response("https://my.webid", {
695
- status: 200,
696
- })
697
- )
698
- .mockRejectedValueOnce("Some error");
699
-
700
- const mockedStorage = mockDefaultStorageUtility();
701
-
702
- const authCodeRedirectHandler = getAuthCodeRedirectHandler({
703
- storageUtility: mockedStorage,
704
- });
705
-
706
- await authCodeRedirectHandler.handle(mockRedirectUrl());
707
- expect(
708
- JSON.parse(
709
- (await mockedStorage.get("tmp-resource-server-session-info")) ?? "{}"
710
- )
711
- ).toEqual({});
712
- });
713
-
714
- it("store nothing if the resource server does not recognize the user", async () => {
715
- mockOidcClient();
716
- mockLocalStorage({});
717
- // This mocks the fetch to the Resource Server session endpoint
718
- // Note: Currently, the endpoint only returns the WebID in plain/text, it could
719
- // be extended later to also provide the cookie expiration.
720
- mockFetch(
721
- new Response("", {
722
- status: 401,
723
- })
724
- );
725
-
726
- const mockedStorage = mockDefaultStorageUtility({ dpop: false });
727
-
728
- const authCodeRedirectHandler = getAuthCodeRedirectHandler({
729
- storageUtility: mockedStorage,
730
- });
731
-
732
- await authCodeRedirectHandler.handle(mockRedirectUrl());
733
- expect(
734
- JSON.parse(
735
- (await mockedStorage.get("tmp-resource-server-session-info")) ?? "{}"
736
- )
737
- ).toEqual({});
738
- });
739
-
740
575
  it("returns a fetch that supports the refresh flow", async () => {
741
- mockLocalStorage({
742
- "tmp-resource-server-session-enabled": "false",
743
- });
744
576
  mockOidcClient();
745
577
  const mockedStorage = mockDefaultStorageUtility();
746
578
  const coreModule = jest.requireActual(
@@ -44,62 +44,6 @@ import {
44
44
  } from "@inrupt/oidc-client-ext";
45
45
  import { EventEmitter } from "events";
46
46
 
47
- // A lifespan of 30 minutes is ESS's default. This could be removed if we
48
- // configure the server to return the remaining lifespan of the cookie.
49
- export const DEFAULT_LIFESPAN = 30 * 60 * 1000;
50
-
51
- /**
52
- * Stores the resource server session information in local storage, so that they
53
- * can be used on refresh.
54
- * @param webId
55
- * @param authenticatedFetch
56
- * @param storageUtility
57
- */
58
- async function setupResourceServerSession(
59
- webId: string,
60
- authenticatedFetch: typeof fetch,
61
- storageUtility: IStorageUtility
62
- ): Promise<void> {
63
- const webIdAsUrl = new URL(webId);
64
- const resourceServerIri = webIdAsUrl.origin;
65
- // Querying the /session endpoint does not set the cookie, but issuing an
66
- // authenticated request to any actual resource (even public ones) does,
67
- // so we fetch the user's WebID before checking the /session endpoint.
68
- await authenticatedFetch(webId);
69
- try {
70
- const resourceServerResponse = await authenticatedFetch(
71
- `${resourceServerIri}/session`
72
- );
73
-
74
- if (resourceServerResponse.status === 200) {
75
- await storageUtility.storeResourceServerSessionInfo(
76
- webId,
77
- resourceServerIri,
78
- // Note that here, if the lifespan of the cookie was returned by the
79
- // server, we'd expect a relative value (the remaining time of validity)
80
- // rather than an absolute one (the moment when the cookie expires).
81
- Date.now() + DEFAULT_LIFESPAN
82
- );
83
- return;
84
- }
85
- // In this case, the resource server either:
86
- // - does not have the expected endpoint, or
87
- // - does not recognize the user
88
- // Either way, no cookie is expected to be set there, and any existing
89
- // session information should be cleared.
90
- await storageUtility.clearResourceServerSessionInfo(resourceServerIri);
91
- } catch (_e) {
92
- // Setting the `credentials=include` option on fetch, which is required in
93
- // the current approach based on a RS cookie, may result in an error if
94
- // attempting to access an URL, depending on the CORS policies.
95
- // Since this internal fetch is necessary, and out of control of the
96
- // calling library, there is no other solution but to swallow the exception.
97
- // This may happen depending on how the target RS handles a request to the
98
- // /session endpoint.
99
- await storageUtility.clearResourceServerSessionInfo(resourceServerIri);
100
- }
101
- }
102
-
103
47
  /**
104
48
  * @hidden
105
49
  */
@@ -233,18 +177,6 @@ export class AuthCodeRedirectHandler implements IRedirectHandler {
233
177
  secure: false,
234
178
  }
235
179
  );
236
- // TODO: This is a temporary workaround. When deprecating the cookie-based auth,
237
- // this should be all cleared.
238
- const essWorkaroundDisabled =
239
- window.localStorage.getItem("tmp-resource-server-session-enabled") ===
240
- "false";
241
- if (!essWorkaroundDisabled) {
242
- await setupResourceServerSession(
243
- tokens.webId,
244
- authFetch,
245
- this.storageUtility
246
- );
247
- }
248
180
 
249
181
  const sessionInfo = await this.sessionInfoManager.get(storedSessionId);
250
182
  if (!sessionInfo) {
@@ -45,3 +45,16 @@ export const RedirectHandlerMock: jest.Mocked<IRedirectHandler> = {
45
45
  ),
46
46
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
47
  } as any;
48
+
49
+ /**
50
+ * @hidden
51
+ */
52
+ export const RedirectFailureHandlerMock: jest.Mocked<IRedirectHandler> = {
53
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
+ canHandle: jest.fn((url: string) => Promise.resolve(true)),
55
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
56
+ handle: jest.fn((url: string) =>
57
+ Promise.reject(new Error("Something went wrong"))
58
+ ),
59
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
60
+ } as any;
@@ -274,33 +274,6 @@ describe("SessionInfoManager", () => {
274
274
  await mockedStorage.getForUser("mySession", "key", { secure: false })
275
275
  ).toBeUndefined();
276
276
  });
277
-
278
- it("clears resource server session info from local storage", async () => {
279
- const mockedStorage = mockStorageUtility(
280
- {
281
- "solidClientAuthenticationUser:mySession": {
282
- webId: "https://my.pod/profile#me",
283
- },
284
- },
285
- true
286
- );
287
- await mockedStorage.storeResourceServerSessionInfo(
288
- "https://my.pod/profile#me",
289
- "https://my.pod",
290
- 10000
291
- );
292
- const sessionManager = getSessionInfoManager({
293
- storageUtility: mockedStorage,
294
- });
295
- await sessionManager.clear("mySession");
296
- expect(
297
- JSON.parse(
298
- (await mockedStorage.get("tmp-resource-server-session-info", {
299
- secure: false,
300
- })) ?? ""
301
- )
302
- ).toEqual({});
303
- });
304
277
  });
305
278
 
306
279
  describe("getAll", () => {
@@ -54,16 +54,6 @@ export async function clear(
54
54
  sessionId: string,
55
55
  storage: IStorageUtility
56
56
  ): Promise<void> {
57
- const storedSessionCookieReference = await storage.get(
58
- "tmp-resource-server-session-info"
59
- );
60
- const reference = JSON.parse(storedSessionCookieReference ?? "{}");
61
- const { webId } = reference;
62
- if (webId !== undefined) {
63
- const webIdAsUrl = new URL(webId);
64
- const resourceServerIri = webIdAsUrl.origin;
65
- await storage.clearResourceServerSessionInfo(resourceServerIri);
66
- }
67
57
  await Promise.all([
68
58
  storage.deleteAllUserData(sessionId, { secure: false }),
69
59
  storage.deleteAllUserData(sessionId, { secure: true }),
@@ -1,27 +0,0 @@
1
- /*
2
- * Copyright 2022 Inrupt Inc.
3
- *
4
- * Permission is hereby granted, free of charge, to any person obtaining a copy
5
- * of this software and associated documentation files (the "Software"), to deal in
6
- * the Software without restriction, including without limitation the rights to use,
7
- * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
8
- * Software, and to permit persons to whom the Software is furnished to do so,
9
- * subject to the following conditions:
10
- *
11
- * The above copyright notice and this permission notice shall be included in
12
- * all copies or substantial portions of the Software.
13
- *
14
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16
- * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
17
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
18
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
- */
21
-
22
- import { it, expect } from "@jest/globals";
23
- import * as solidClientAuthentication from "./index.browser";
24
-
25
- it("exports the public API from the entrypoint", () => {
26
- expect(solidClientAuthentication).toBeDefined();
27
- });
@@ -1,24 +0,0 @@
1
- /*
2
- * Copyright 2022 Inrupt Inc.
3
- *
4
- * Permission is hereby granted, free of charge, to any person obtaining a copy
5
- * of this software and associated documentation files (the "Software"), to deal in
6
- * the Software without restriction, including without limitation the rights to use,
7
- * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
8
- * Software, and to permit persons to whom the Software is furnished to do so,
9
- * subject to the following conditions:
10
- *
11
- * The above copyright notice and this permission notice shall be included in
12
- * all copies or substantial portions of the Software.
13
- *
14
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
15
- * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
16
- * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
17
- * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
18
- * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
19
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
- */
21
-
22
- import * as solidClientAuthentication from "./index";
23
-
24
- module.exports = solidClientAuthentication;
@@ -1,19 +0,0 @@
1
- const { merge } = require("webpack-merge");
2
- const path = require("path");
3
-
4
- const commonConfig = require("./webpack.common.js");
5
-
6
- module.exports = () => {
7
- const envConfig = require(`./webpack.prod.js`);
8
-
9
- const browserConfig = {
10
- output: {
11
- libraryTarget: "var",
12
- library: "solidClientAuthentication",
13
- filename: "solid-client-authn.bundle.js",
14
- path: path.resolve(__dirname, "dist"),
15
- },
16
- };
17
-
18
- return merge(commonConfig, envConfig, browserConfig);
19
- };
package/webpack.common.js DELETED
@@ -1,22 +0,0 @@
1
- module.exports = {
2
- entry: "./src/index.browser.ts",
3
- module: {
4
- rules: [
5
- {
6
- test: /\.tsx?$/,
7
- use: [
8
- {
9
- loader: "ts-loader",
10
- options: {
11
- configFile: "tsconfig.json",
12
- },
13
- },
14
- ],
15
- exclude: /node_modules/,
16
- },
17
- ],
18
- },
19
- resolve: {
20
- extensions: [".tsx", ".ts", ".js"],
21
- },
22
- };
package/webpack.config.js DELETED
@@ -1,8 +0,0 @@
1
- const { merge } = require("webpack-merge");
2
-
3
- const commonConfig = require("./webpack.common.js");
4
-
5
- module.exports = ({ env, addon }) => {
6
- const envConfig = require(`./webpack.${env}.js`);
7
- return merge(commonConfig, envConfig);
8
- };
package/webpack.dev.js DELETED
@@ -1,17 +0,0 @@
1
- const path = require("path");
2
- const HtmlWebpackPlugin = require("html-webpack-plugin");
3
-
4
- module.exports = {
5
- mode: "development",
6
- devtool: "inline-source-map",
7
- devServer: {
8
- contentBase: path.join(__dirname, "browserDist"),
9
- port: 9000,
10
- },
11
- plugins: [
12
- new HtmlWebpackPlugin({
13
- title: "Solid Authenticator Test Page",
14
- template: "./src/index.html",
15
- }),
16
- ],
17
- };
package/webpack.prod.js DELETED
@@ -1,3 +0,0 @@
1
- module.exports = {
2
- mode: "production",
3
- };