@virtualsearchtable/virtualsearchtable 0.0.1-security → 0.1.0

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.

Potentially problematic release.


This version of @virtualsearchtable/virtualsearchtable might be problematic. Click here for more details.

Files changed (69) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +8 -0
  3. package/.github/dependabot.yml +24 -0
  4. package/.github/workflows/audit.yml +14 -0
  5. package/.github/workflows/ci.yml +53 -0
  6. package/.github/workflows/release.yml +31 -0
  7. package/.github/workflows/reusable-audit.yml +41 -0
  8. package/.github/workflows/reusable-lint.yml +33 -0
  9. package/CODEOWNERS +1 -0
  10. package/LICENSE.md +18 -0
  11. package/README.md +27 -3
  12. package/e2e/browser/test/e2e.playwright.ts +67 -0
  13. package/e2e/browser/test/globalSetup.ts +30 -0
  14. package/e2e/browser/test-app/.eslintrc.js +6 -0
  15. package/e2e/browser/test-app/README.md +46 -0
  16. package/e2e/browser/test-app/components/appContainer/index.tsx +109 -0
  17. package/e2e/browser/test-app/components/solidClient/index.tsx +149 -0
  18. package/e2e/browser/test-app/next-env.d.ts +5 -0
  19. package/e2e/browser/test-app/next.config.js +6 -0
  20. package/e2e/browser/test-app/package-lock.json +1982 -0
  21. package/e2e/browser/test-app/package.json +25 -0
  22. package/e2e/browser/test-app/pages/_app.tsx +28 -0
  23. package/e2e/browser/test-app/pages/index.tsx +36 -0
  24. package/e2e/browser/test-app/tsconfig.json +20 -0
  25. package/eslint-configs/README.md +75 -0
  26. package/eslint-configs/eslint-config-base/README.md +29 -0
  27. package/eslint-configs/eslint-config-base/index.js +159 -0
  28. package/eslint-configs/eslint-config-base/license-header.js +20 -0
  29. package/eslint-configs/eslint-config-base/package.json +41 -0
  30. package/eslint-configs/eslint-config-lib/README.md +51 -0
  31. package/eslint-configs/eslint-config-lib/index.js +83 -0
  32. package/eslint-configs/eslint-config-lib/package.json +29 -0
  33. package/eslint-configs/eslint-config-react/README.md +97 -0
  34. package/eslint-configs/eslint-config-react/index.js +75 -0
  35. package/eslint-configs/eslint-config-react/package.json +32 -0
  36. package/lerna.json +4 -0
  37. package/package.json +45 -3
  38. package/packages/base-rollup-config/README.md +22 -0
  39. package/packages/base-rollup-config/index.mjs +59 -0
  40. package/packages/base-rollup-config/package.json +25 -0
  41. package/packages/internal-playwright-helpers/README.md +30 -0
  42. package/packages/internal-playwright-helpers/package.json +29 -0
  43. package/packages/internal-playwright-helpers/rollup.config.mjs +57 -0
  44. package/packages/internal-playwright-helpers/src/fixtures.ts +51 -0
  45. package/packages/internal-playwright-helpers/src/flows/auth.ts +93 -0
  46. package/packages/internal-playwright-helpers/src/index.ts +26 -0
  47. package/packages/internal-playwright-helpers/src/pages/cognito.ts +48 -0
  48. package/packages/internal-playwright-helpers/src/pages/open-id.ts +56 -0
  49. package/packages/internal-playwright-helpers/src/pages/testPage.ts +74 -0
  50. package/packages/internal-playwright-helpers/tsconfig.json +8 -0
  51. package/packages/internal-playwright-testids/package.json +22 -0
  52. package/packages/internal-playwright-testids/rollup.config.mjs +56 -0
  53. package/packages/internal-playwright-testids/src/index.ts +35 -0
  54. package/packages/internal-playwright-testids/tsconfig.json +8 -0
  55. package/packages/internal-test-env/README.md +44 -0
  56. package/packages/internal-test-env/env/.env.example +36 -0
  57. package/packages/internal-test-env/index.ts +474 -0
  58. package/packages/internal-test-env/package.json +30 -0
  59. package/packages/internal-test-env/rollup.config.mjs +80 -0
  60. package/packages/internal-test-env/tsconfig.json +20 -0
  61. package/packages/internal-test-env/utils.ts +31 -0
  62. package/packages/jest-jsdom-polyfills/README.md +21 -0
  63. package/packages/jest-jsdom-polyfills/index.js +80 -0
  64. package/packages/jest-jsdom-polyfills/package.json +36 -0
  65. package/playwright.config.ts +76 -0
  66. package/scripts/index.js +1 -0
  67. package/scripts/prepare-release.sh +32 -0
  68. package/scripts/release.sh +36 -0
  69. package/tsconfig.base.json +17 -0
package/.eslintignore ADDED
@@ -0,0 +1,2 @@
1
+ **/dist/
2
+ e2e/browser/test-app/
package/.eslintrc.js ADDED
@@ -0,0 +1,8 @@
1
+ require("@rushstack/eslint-patch/modern-module-resolution");
2
+
3
+ module.exports = {
4
+ extends: ["@inrupt/eslint-config-lib"],
5
+ rules: {
6
+ "import/prefer-default-export": "off"
7
+ }
8
+ }
@@ -0,0 +1,24 @@
1
+ version: 2
2
+ updates:
3
+ # We use "/" as the directory, as this repository is managed by npm workspaces,
4
+ # and that's where the package-lock.json is located
5
+ - package-ecosystem: npm
6
+ directory: "/"
7
+ schedule:
8
+ interval: "weekly"
9
+ # The following is required for workspaces to be updated: see https://github.com/dependabot/dependabot-core/issues/5226.
10
+ versioning-strategy: increase
11
+ open-pull-requests-limit: 10
12
+ - package-ecosystem: npm
13
+ directory: "/eslint-configs/*"
14
+ schedule:
15
+ interval: "weekly"
16
+ open-pull-requests-limit: 10
17
+ - package-ecosystem: "github-actions"
18
+ directory: "/"
19
+ schedule:
20
+ interval: "weekly"
21
+ - package-ecosystem: npm
22
+ directory: "e2e/browser/test-app"
23
+ schedule:
24
+ interval: "weekly"
@@ -0,0 +1,14 @@
1
+ name: Audit
2
+
3
+ on:
4
+ push:
5
+ schedule:
6
+ - cron: "40 10 * * *"
7
+ concurrency:
8
+ group: ${{ github.workflow }}-${{ github.ref }}
9
+ cancel-in-progress: true
10
+ jobs:
11
+ audit:
12
+ uses: ./.github/workflows/reusable-audit.yml
13
+ secrets:
14
+ WEBHOOK_E2E_FAILURE: ${{ secrets.WEBHOOK_E2E_FAILURE }}
@@ -0,0 +1,53 @@
1
+ name: CI
2
+
3
+ on: [push]
4
+
5
+ env:
6
+ CI: true
7
+ jobs:
8
+ lint:
9
+ uses: ./.github/workflows/reusable-lint.yml
10
+ with:
11
+ build: true
12
+
13
+ build:
14
+ runs-on: ${{ matrix.os }}
15
+ environment:
16
+ name: ${{ matrix.environment-name }}
17
+ strategy:
18
+ fail-fast: true
19
+ matrix:
20
+ environment-name: ["ESS PodSpaces"]
21
+ os: [ubuntu-latest]
22
+ # Workspaces support was added from npm 7, so Node 14 isn't supported to
23
+ # build this library.
24
+ node-version: ["16", "18", "20"]
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ - uses: actions/setup-node@v3
28
+ with:
29
+ node-version: ${{ matrix.node-version }}
30
+ cache: npm
31
+ registry-url: "https://registry.npmjs.org"
32
+ - run: npm ci --workspaces
33
+ # Running top-level ci should happen after workspaces level, running these
34
+ # the other way around results in top-level dependencies (namely, lerna)
35
+ # not being installed.
36
+ - run: npm ci
37
+ - run: npm run build
38
+ - run: npx playwright install --with-deps
39
+ - run: npm run e2e:test:setup
40
+ - # Dependabot cannot access secrets, so it doesn't have a token to authenticate to ESS.
41
+ # We want jobs in this workflow to be gating PRs, so the whole matrix must
42
+ # run even for dependabot so that the matrixed jobs are skipped, instead
43
+ # of the whole pipeline.
44
+ if: ${{ github.actor != 'dependabot[bot]' }}
45
+ run: npm t
46
+ env:
47
+ E2E_DEMO_CLIENT_APP_URL: http://localhost:3001
48
+ E2E_TEST_USER: ${{ secrets.E2E_TEST_USER }}
49
+ E2E_TEST_PASSWORD: ${{ secrets.E2E_TEST_PASSWORD }}
50
+ E2E_TEST_IDP: ${{ secrets.E2E_TEST_IDP }}
51
+ E2E_TEST_OWNER_CLIENT_ID: ${{ secrets.E2E_TEST_OWNER_CLIENT_ID }}
52
+ E2E_TEST_OWNER_CLIENT_SECRET: ${{ secrets.E2E_TEST_OWNER_CLIENT_SECRET }}
53
+ E2E_TEST_ENVIRONMENT: ${{ matrix.environment-name }}
@@ -0,0 +1,31 @@
1
+ name: Release
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+ types: [closed]
8
+
9
+ env:
10
+ CI: true
11
+ jobs:
12
+ release-new-version:
13
+ if: ${{ github.event.pull_request.merged && startsWith(github.head_ref, 'release/') }}
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: actions/setup-node@v3
18
+ with:
19
+ node-version: 20
20
+ cache: npm
21
+ registry-url: "https://registry.npmjs.org"
22
+ - run: npm ci --workspaces
23
+ # Running top-level ci should happen after workspaces level, running these
24
+ # the other way around results in top-level dependencies (namely, lerna)
25
+ # not being installed.
26
+ - run: npm ci
27
+ - run: npm run build
28
+ - run: npm run release
29
+ env:
30
+ NODE_AUTH_TOKEN: ${{ secrets.INRUPT_NPM_TOKEN }}
31
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
@@ -0,0 +1,41 @@
1
+ name: Reusable Audit Workflow
2
+
3
+ on:
4
+ workflow_call:
5
+ secrets:
6
+ WEBHOOK_E2E_FAILURE:
7
+ required: true
8
+
9
+ jobs:
10
+ audit:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v4
14
+ - uses: actions/setup-node@v3
15
+ with:
16
+ node-version: "20"
17
+ registry-url: "https://registry.npmjs.org"
18
+ cache: "npm"
19
+ # Install dependencies so license-checker actually checks them:
20
+ - run: npm ci
21
+ # We check the dependency licenses as part of the audit job, as a
22
+ # misconfigured or inappropriate dependency license is in the same
23
+ # category of issues as an npm audit security failure: we consider
24
+ # bad licenses a vulnerability.
25
+ - run: npx license-checker --production --failOn "AGPL-1.0-only; AGPL-1.0-or-later; AGPL-3.0-only; AGPL-3.0-or-later; Beerware; CC-BY-NC-1.0; CC-BY-NC-2.0; CC-BY-NC-2.5; CC-BY-NC-3.0; CC-BY-NC-4.0; CC-BY-NC-ND-1.0; CC-BY-NC-ND-2.0; CC-BY-NC-ND-2.5; CC-BY-NC-ND-3.0; CC-BY-NC-ND-4.0; CC-BY-NC-SA-1.0; CC-BY-NC-SA-2.0; CC-BY-NC-SA-2.5; CC-BY-NC-SA-3.0; CC-BY-NC-SA-4.0; CPAL-1.0; EUPL-1.0; EUPL-1.1; EUPL-1.1; GPL-1.0-only; GPL-1.0-or-later; GPL-2.0-only; GPL-2.0-or-later; GPL-3.0; GPL-3.0-only; GPL-3.0-or-later; SISSL; SISSL-1.2; WTFPL"
26
+ # Run the audit and capture the results
27
+ - run: npm audit --audit-level=moderate --omit=dev --json true | tee audit.json
28
+ # Run the audit to check the signatures
29
+ - run: npm audit signatures
30
+ - name: Archive audit report
31
+ uses: actions/upload-artifact@v3
32
+ continue-on-error: true
33
+ with:
34
+ name: audit.json
35
+ path: audit.json
36
+ # Publishes a notification to a slack channel:
37
+ - name: Send a notification that the audit has failed
38
+ if: failure() && github.event_name == 'schedule'
39
+ run: "curl -X POST -H Content-type: 'application/json' --data \"{\\\"text\\\":\\\"Automated npm audit --audit-level=moderate failed. View <https://github.com/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID|the execution log> for more details.\\\"}\" $WEBHOOK_E2E_FAILURE"
40
+ env:
41
+ WEBHOOK_E2E_FAILURE: ${{ secrets.WEBHOOK_E2E_FAILURE }}
@@ -0,0 +1,33 @@
1
+ name: Reusable Lint Workflow
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ usePackageCheck:
7
+ required: false
8
+ default: false
9
+ type: boolean
10
+ build:
11
+ required: false
12
+ default: false
13
+ type: boolean
14
+
15
+ jobs:
16
+ lint:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+ - uses: actions/setup-node@v3
21
+ with:
22
+ node-version: "20"
23
+ cache: "npm"
24
+ # Check the package.json is correctly formed
25
+ - if: ${{inputs.usePackageCheck}}
26
+ run: npx @skypack/package-check
27
+ # Install dependencies:
28
+ - run: npm ci --ignore-scripts
29
+ # Build the package(s)
30
+ - if: ${{inputs.build}}
31
+ run: npm run build
32
+ # Run the linting command:
33
+ - run: npm run lint
package/CODEOWNERS ADDED
@@ -0,0 +1 @@
1
+ * @inrupt/sdk-owners
package/LICENSE.md ADDED
@@ -0,0 +1,18 @@
1
+ Copyright 2020 Inrupt Inc.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to use,
6
+ copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
7
+ Software, and to permit persons to whom the Software is furnished to do so,
8
+ subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
14
+ INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
15
+ PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
16
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
18
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,5 +1,29 @@
1
- # Security holding package
1
+ # Overview
2
2
 
3
- This package contained malicious code and was removed from the registry by the npm security team. A placeholder was published to ensure users are not affected in the future.
3
+ This repository contains the following:
4
4
 
5
- Please refer to www.npmjs.com/advisories?search=%40virtualsearchtable%2Fvirtualsearchtable for more information.
5
+ - ESLint configurations (see [`eslint-configs/README.md`](./eslint-configs/README.md))
6
+ - Shared GitHub Workflows (see `.github/workflows/reusable-*.yml`)
7
+ - Shared E2E test helpers (coming soon!)
8
+
9
+ ## Releasing
10
+
11
+ First, decide on what type of release to perform, then:
12
+
13
+ 1. Run: `npm run prepare-release`
14
+
15
+ Follow the prompt and select the type of release:
16
+
17
+ - Patch (1.0.1)
18
+ - Minor (1.1.0)
19
+ - Major (2.0.0)
20
+ - Prepatch (1.0.1-alpha.0)
21
+ - Preminor (1.1.0-alpha.0)
22
+ - Premajor (2.0.0-alpha.0)
23
+
24
+ After confirming, this will update all the `package.json` versions to that new version number,
25
+ checkout a new branch `release/<version>` and commit the changed files.
26
+
27
+ 2. Push the branch & create a pull request
28
+
29
+ 3. Merge the pull request, and then let automation do the rest.
@@ -0,0 +1,67 @@
1
+ //
2
+ // Copyright 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
+ /* eslint-disable jest/no-done-callback */
23
+
24
+ import { test, expect } from "@inrupt/internal-playwright-helpers";
25
+
26
+ test("creating and removing empty Containers", async ({ page, auth }) => {
27
+ await auth.login({ allow: true });
28
+
29
+ // The button is only shown once the app is ready.
30
+ await page.waitForSelector("button[data-testid=createContainer]");
31
+
32
+ // A root container should have been found.
33
+ await expect(page.getByTestId("parentContainerUrl")).toContainText(
34
+ /https:\/\//,
35
+ );
36
+ // No child container should be available yet.
37
+ await expect(page.getByTestId("childContainerUrl")).toContainText("None");
38
+
39
+ await Promise.all([
40
+ page.waitForRequest((request) => request.method() === "POST"),
41
+ page.waitForResponse((response) => response.status() === 201),
42
+ page.click("button[data-testid=createContainer]"),
43
+ ]);
44
+
45
+ // The delete button is only shown once the state has been updated after creation.
46
+ await page.waitForSelector("button[data-testid=deleteContainer]");
47
+
48
+ // The child container should have been created under the parent
49
+ await expect(
50
+ page.locator("span[data-testid=childContainerUrl]"),
51
+ ).toContainText(
52
+ await page.locator("span[data-testid=childContainerUrl]").allInnerTexts(),
53
+ );
54
+
55
+ await Promise.all([
56
+ page.waitForRequest((request) => request.method() === "DELETE"),
57
+ page.waitForResponse((response) => response.status() === 204),
58
+ page.click("button[data-testid=deleteContainer]"),
59
+ ]);
60
+
61
+ await page.waitForSelector("button[data-testid=createContainer]");
62
+
63
+ // The child container should have been deleted.
64
+ await expect(
65
+ page.locator("span[data-testid=childContainerUrl]"),
66
+ ).toContainText("None");
67
+ });
@@ -0,0 +1,30 @@
1
+ //
2
+ // Copyright 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 { setupEnv } from "@inrupt/internal-test-env";
23
+
24
+ async function globalSetup() {
25
+ setupEnv();
26
+ // Return the teardown function.
27
+ return async () => {};
28
+ }
29
+
30
+ export default globalSetup;
@@ -0,0 +1,6 @@
1
+ module.exports = {
2
+ extends: ["../../../.eslintrc.js", "next/core-web-vitals"],
3
+ parserOptions: {
4
+ project: "./tsconfig.json",
5
+ },
6
+ };
@@ -0,0 +1,46 @@
1
+ This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2
+
3
+ ## Getting Started
4
+
5
+ First, in the root of the project, run:
6
+
7
+ ```bash
8
+ npm run build
9
+ ```
10
+
11
+ Then, on the `test-app` directory, run:
12
+
13
+ ```bash
14
+ npm ci
15
+ ```
16
+
17
+ Then run the development server:
18
+
19
+ ```bash
20
+ npm run dev
21
+ # or
22
+ yarn dev
23
+ ```
24
+
25
+ Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
26
+
27
+ You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
28
+
29
+ [API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
30
+
31
+ The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
32
+
33
+ ## Learn More
34
+
35
+ To learn more about Next.js, take a look at the following resources:
36
+
37
+ - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
38
+ - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
39
+
40
+ You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
41
+
42
+ ## Deploy on Vercel
43
+
44
+ The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
45
+
46
+ Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
@@ -0,0 +1,109 @@
1
+ //
2
+ // Copyright 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
+ // Disabling the following prevents from having to install before linting from
23
+ // the root.
24
+ // eslint-disable-next-line import/no-unresolved
25
+ import React, { useState, useEffect } from "react";
26
+ import {
27
+ login,
28
+ logout,
29
+ handleIncomingRedirect,
30
+ getDefaultSession,
31
+ ISessionInfo,
32
+ } from "@inrupt/solid-client-authn-browser";
33
+ import SolidClient from "../solidClient";
34
+
35
+ const REDIRECT_URL = window.location.href;
36
+ const APP_NAME = "Solid client browser-based tests app";
37
+ const DEFAULT_ISSUER = "https://login.inrupt.com/";
38
+
39
+ export default function AppContainer() {
40
+ const [sessionInfo, setSessionInfo] = useState<ISessionInfo>();
41
+ const [issuer, setIssuer] = useState<string>(DEFAULT_ISSUER);
42
+
43
+ useEffect(() => {
44
+ handleIncomingRedirect().then(setSessionInfo).catch(console.error);
45
+ }, []);
46
+
47
+ const handleLogin = async () => {
48
+ try {
49
+ // Login will redirect the user away so that they can log in the OIDC issuer,
50
+ // and back to the provided redirect URL (which should be controlled by your app).
51
+ await login({
52
+ redirectUrl: REDIRECT_URL,
53
+ oidcIssuer: issuer,
54
+ clientName: APP_NAME,
55
+ });
56
+ } catch (err) {
57
+ console.error(err);
58
+ }
59
+ };
60
+
61
+ const handleLogout = async () => {
62
+ await logout();
63
+ setSessionInfo(undefined);
64
+ };
65
+
66
+ return (
67
+ <>
68
+ <h1>{APP_NAME}</h1>
69
+ <p>
70
+ {sessionInfo?.isLoggedIn
71
+ ? `Logged in as ${sessionInfo.webId}`
72
+ : "Not logged in yet"}
73
+ </p>
74
+ <form>
75
+ <input
76
+ data-testid="identityProviderInput"
77
+ type="text"
78
+ value={issuer}
79
+ onChange={(e) => {
80
+ setIssuer(e.target.value);
81
+ }}
82
+ />
83
+ <button
84
+ data-testid="loginButton"
85
+ onClick={async (e) => {
86
+ e.preventDefault();
87
+ await handleLogin();
88
+ }}
89
+ >
90
+ Log In
91
+ </button>
92
+ <button
93
+ data-testid="logoutButton"
94
+ onClick={async (e) => {
95
+ e.preventDefault();
96
+ await handleLogout();
97
+ }}
98
+ >
99
+ Log Out
100
+ </button>
101
+ </form>
102
+ {sessionInfo?.isLoggedIn ? (
103
+ <SolidClient session={getDefaultSession()} />
104
+ ) : (
105
+ <></>
106
+ )}
107
+ </>
108
+ );
109
+ }