@internetarchive/recaptcha-manager 0.1.1 → 0.1.2-webdev-7354.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.
- package/.github/workflows/ci.yml +8 -7
- package/.github/workflows/gh-pages-main.yml +39 -0
- package/.github/workflows/pr-preview.yml +63 -0
- package/.husky/pre-commit +0 -3
- package/.prettierignore +1 -0
- package/README.md +6 -28
- package/coverage/.gitignore +3 -0
- package/demo/app-root.ts +1 -1
- package/dist/demo/app-root.js +1 -1
- package/dist/demo/app-root.js.map +1 -1
- package/dist/src/recaptcha-manager.d.ts +0 -1
- package/dist/src/recaptcha-manager.js +2 -0
- package/dist/src/recaptcha-manager.js.map +1 -1
- package/dist/src/recaptcha-widget.d.ts +1 -2
- package/dist/src/recaptcha-widget.js.map +1 -1
- package/dist/test/mock-grecaptcha.d.ts +1 -2
- package/dist/test/mock-grecaptcha.js +10 -12
- package/dist/test/mock-grecaptcha.js.map +1 -1
- package/dist/test/mock-lazy-loader.js +1 -0
- package/dist/test/mock-lazy-loader.js.map +1 -1
- package/dist/test/recaptcha-manager.test.js.map +1 -1
- package/dist/vite.config.d.ts +2 -0
- package/dist/vite.config.js +25 -0
- package/dist/vite.config.js.map +1 -0
- package/eslint.config.mjs +53 -0
- package/package.json +41 -62
- package/renovate.json +6 -0
- package/src/recaptcha-manager.ts +3 -1
- package/src/recaptcha-widget.ts +3 -3
- package/ssl/server.crt +22 -0
- package/ssl/server.key +28 -0
- package/test/mock-grecaptcha.ts +1 -3
- package/test/mock-lazy-loader.ts +2 -1
- package/test/recaptcha-manager.test.ts +2 -2
- package/tsconfig.json +11 -0
- package/vite.config.ts +25 -0
- package/web-dev-server.config.mjs +6 -2
- package/dist/src/recaptcha-manager copy.d.ts +0 -82
- package/dist/src/recaptcha-manager copy.js +0 -140
- package/dist/src/recaptcha-manager copy.js.map +0 -1
- package/dist/src/recaptcha-manager-bak.d.ts +0 -82
- package/dist/src/recaptcha-manager-bak.js +0 -140
- package/dist/src/recaptcha-manager-bak.js.map +0 -1
- package/dist/src/recaptcha.d.ts +0 -28
- package/dist/src/recaptcha.js +0 -87
- package/dist/src/recaptcha.js.map +0 -1
- package/dist/test/your-webcomponent.test.js +0 -4
- package/dist/test/your-webcomponent.test.js.map +0 -1
- /package/{dist/test/your-webcomponent.test.d.ts → coverage/.placeholder} +0 -0
package/.github/workflows/ci.yml
CHANGED
|
@@ -11,16 +11,17 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
|
|
13
13
|
steps:
|
|
14
|
-
- uses: actions/checkout@
|
|
15
|
-
- uses: actions/setup-node@
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: actions/setup-node@v4
|
|
16
16
|
with:
|
|
17
|
-
node-version:
|
|
17
|
+
node-version: latest
|
|
18
18
|
|
|
19
19
|
- name: Install dependencies
|
|
20
|
-
run:
|
|
20
|
+
run: npm install
|
|
21
21
|
|
|
22
22
|
- name: Run tests
|
|
23
|
-
run:
|
|
23
|
+
run: npm run test
|
|
24
24
|
|
|
25
|
-
-
|
|
26
|
-
|
|
25
|
+
- uses: codecov/codecov-action@v5
|
|
26
|
+
with:
|
|
27
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# This workflow will generate the static page under `main` subdirectory inside the `gh-pages` branch
|
|
2
|
+
|
|
3
|
+
# This workflow will run every time new changes were pushed to the `main` branch
|
|
4
|
+
|
|
5
|
+
name: App build CI/CD to main branch
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [ main ]
|
|
10
|
+
|
|
11
|
+
jobs:
|
|
12
|
+
build:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v4
|
|
17
|
+
with:
|
|
18
|
+
persist-credentials: false
|
|
19
|
+
- uses: actions/setup-node@v4
|
|
20
|
+
with:
|
|
21
|
+
node-version: latest
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
- name: Install dependencies
|
|
25
|
+
run: npm install
|
|
26
|
+
|
|
27
|
+
- name: Create build files for gh-pages deploy
|
|
28
|
+
run: npm run ghpages:build
|
|
29
|
+
|
|
30
|
+
# Reference: https://github.com/JamesIves/github-pages-deploy-action
|
|
31
|
+
- name: Deploy 🚀
|
|
32
|
+
uses: JamesIves/github-pages-deploy-action@v4.5.0
|
|
33
|
+
with:
|
|
34
|
+
branch: gh-pages
|
|
35
|
+
folder: ghpages
|
|
36
|
+
clean-exclude: pr/
|
|
37
|
+
force: false
|
|
38
|
+
target-folder: main
|
|
39
|
+
token: ${{ secrets.GH_TOKEN }}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# This workflow will generate the static page under `pr` subdirectory inside the `gh-pages` branch
|
|
2
|
+
|
|
3
|
+
# This workflow will run every time there's a PR opened, reopened, synchronize, or closed
|
|
4
|
+
|
|
5
|
+
name: Deploy PR previews
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
pull_request:
|
|
9
|
+
types:
|
|
10
|
+
- opened
|
|
11
|
+
- reopened
|
|
12
|
+
- synchronize
|
|
13
|
+
- closed
|
|
14
|
+
|
|
15
|
+
concurrency: preview-${{ github.ref }}
|
|
16
|
+
|
|
17
|
+
env:
|
|
18
|
+
PREVIEW_BRANCH: gh-pages
|
|
19
|
+
jobs:
|
|
20
|
+
deploy-preview:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout
|
|
24
|
+
uses: actions/checkout@v4
|
|
25
|
+
- uses: actions/setup-node@v4
|
|
26
|
+
with:
|
|
27
|
+
node-version: latest
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
- name: Install and Build
|
|
31
|
+
run: |
|
|
32
|
+
npm install
|
|
33
|
+
npm run ghpages:build
|
|
34
|
+
|
|
35
|
+
# Reference: https://github.com/rossjrw/pr-preview-action
|
|
36
|
+
- name: Deploy preview
|
|
37
|
+
uses: rossjrw/pr-preview-action@v1
|
|
38
|
+
id: preview-step
|
|
39
|
+
with:
|
|
40
|
+
source-dir: ./ghpages/
|
|
41
|
+
umbrella-dir: pr
|
|
42
|
+
preview-branch: ${{ env.PREVIEW_BRANCH }}
|
|
43
|
+
comment: false
|
|
44
|
+
|
|
45
|
+
- uses: marocchino/sticky-pull-request-comment@v2
|
|
46
|
+
if: steps.preview-step.outputs.deployment-action == 'deploy'
|
|
47
|
+
with:
|
|
48
|
+
header: pr-preview
|
|
49
|
+
message: |
|
|
50
|
+
[PR Preview Action](https://github.com/rossjrw/pr-preview-action) ${{ steps.preview-step.outputs.action-version }}
|
|
51
|
+
:---:
|
|
52
|
+
| <p></p> :rocket: View preview at <br> ${{ steps.preview-step.outputs.preview-url }}demo/ <br><br>
|
|
53
|
+
| <h6>Built to branch [`${{ env.PREVIEW_BRANCH }}`](${{ github.server_url }}/${{ github.repository }}/tree/${{ env.PREVIEW_BRANCH }}) at ${{ steps.preview-step.outputs.action-start-time }}. <br> Preview will be ready when the [GitHub Pages deployment](${{ github.server_url }}/${{ github.repository }}/deployments) is complete. <br><br> </h6>
|
|
54
|
+
|
|
55
|
+
- uses: marocchino/sticky-pull-request-comment@v2
|
|
56
|
+
if: steps.preview-step.outputs.deployment-action == 'remove'
|
|
57
|
+
with:
|
|
58
|
+
header: pr-preview
|
|
59
|
+
message: |
|
|
60
|
+
[PR Preview Action](https://github.com/rossjrw/pr-preview-action) ${{ steps.preview-step.outputs.action-version }}
|
|
61
|
+
:---:
|
|
62
|
+
Preview removed because the pull request was closed.
|
|
63
|
+
${{ steps.preview-step.outputs.action-start-time }}
|
package/.husky/pre-commit
CHANGED
package/.prettierignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
coverage
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@ A library to lazy load and interact with reCaptcha
|
|
|
7
7
|
## Installation
|
|
8
8
|
|
|
9
9
|
```shell
|
|
10
|
-
>
|
|
10
|
+
> npm install @internetarchive/recaptcha-manager
|
|
11
11
|
```
|
|
12
12
|
|
|
13
13
|
## Usage
|
|
@@ -35,51 +35,29 @@ For more usage examples, see `demo/app-root.ts` and `test/recaptcha-manager.test
|
|
|
35
35
|
|
|
36
36
|
## Local Demo with `web-dev-server`
|
|
37
37
|
```bash
|
|
38
|
-
|
|
38
|
+
npm run start
|
|
39
39
|
```
|
|
40
40
|
To run a local development server that serves the basic demo located in `demo/index.html`
|
|
41
41
|
|
|
42
42
|
## Testing with Web Test Runner
|
|
43
43
|
To run the suite of Web Test Runner tests, run
|
|
44
44
|
```bash
|
|
45
|
-
|
|
45
|
+
npm run test
|
|
46
46
|
```
|
|
47
47
|
|
|
48
48
|
To run the tests in watch mode (for <abbr title="test driven development">TDD</abbr>, for example), run
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
|
|
51
|
+
npm run test:watch
|
|
52
52
|
```
|
|
53
53
|
|
|
54
54
|
## Linting with ESLint, Prettier, and Types
|
|
55
55
|
To scan the project for linting errors, run
|
|
56
56
|
```bash
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
You can lint with ESLint and Prettier individually as well
|
|
61
|
-
```bash
|
|
62
|
-
yarn run lint:eslint
|
|
63
|
-
```
|
|
64
|
-
```bash
|
|
65
|
-
yarn run lint:prettier
|
|
57
|
+
npm run lint
|
|
66
58
|
```
|
|
67
59
|
|
|
68
60
|
To automatically fix many linting errors, run
|
|
69
61
|
```bash
|
|
70
|
-
|
|
62
|
+
npm run format
|
|
71
63
|
```
|
|
72
|
-
|
|
73
|
-
You can format using ESLint and Prettier individually as well
|
|
74
|
-
```bash
|
|
75
|
-
yarn run format:eslint
|
|
76
|
-
```
|
|
77
|
-
```bash
|
|
78
|
-
yarn run format:prettier
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
## Tooling configs
|
|
82
|
-
|
|
83
|
-
For most of the tools, the configuration is in the `package.json` to reduce the amount of files in your project.
|
|
84
|
-
|
|
85
|
-
If you customize the configuration a lot, you can consider moving them to individual files.
|
package/demo/app-root.ts
CHANGED
|
@@ -13,7 +13,7 @@ export class AppRoot extends LitElement {
|
|
|
13
13
|
@state() result2?: string;
|
|
14
14
|
|
|
15
15
|
private recaptchaManager: RecaptchaManagerInterface = new RecaptchaManager({
|
|
16
|
-
defaultSiteKey: '
|
|
16
|
+
defaultSiteKey: '6Ld64a8UAAAAAGbDwi1927ztGNw7YABQ-dqzvTN2',
|
|
17
17
|
});
|
|
18
18
|
|
|
19
19
|
private recaptcha1?: RecaptchaWidgetInterface;
|
package/dist/demo/app-root.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-root.js","sourceRoot":"","sources":["../../demo/app-root.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EACL,gBAAgB,GAEjB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"app-root.js","sourceRoot":"","sources":["../../demo/app-root.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,EACL,gBAAgB,GAEjB,MAAM,0BAA0B,CAAC;AAG3B,IAAM,OAAO,GAAb,MAAM,OAAQ,SAAQ,UAAU;IAAhC;;QAKG,qBAAgB,GAA8B,IAAI,gBAAgB,CAAC;YACzE,cAAc,EAAE,0CAA0C;SAC3D,CAAC,CAAC;IA4EL,CAAC;IAtEC,MAAM;QACJ,OAAO,IAAI,CAAA;;0BAEW,IAAI,CAAC,aAAa;2BACjB,IAAI,CAAC,gBAAgB;;QAExC,IAAI,CAAC,MAAM;YACX,CAAC,CAAC,IAAI,CAAA;iBACG,IAAI,CAAC,MAAM,MAAM;YAC1B,CAAC,CAAC,EAAE;;0BAEc,IAAI,CAAC,cAAc;2BAClB,IAAI,CAAC,iBAAiB;;;;QAIzC,IAAI,CAAC,OAAO;YACZ,CAAC,CAAC,IAAI,CAAA;iBACG,IAAI,CAAC,OAAO,MAAM;YAC3B,CAAC,CAAC,EAAE;KACP,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,aAAa;;QACzB,IAAI,CAAC,UAAU,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,gBAAgB,0CAAE,kBAAkB,CAAC;YAChE,eAAe,EAAE;gBACf,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE,OAAO;gBACd,IAAI,EAAE,OAAO;aACd;SACF,CAAC,CAAA,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IAChD,CAAC;IAEO,KAAK,CAAC,cAAc;;QAC1B,IAAI,CAAC,UAAU,GAAG,MAAM,CAAA,MAAA,IAAI,CAAC,gBAAgB,0CAAE,kBAAkB,CAAC;YAChE,OAAO,EAAE,iBAAiB;SAC3B,CAAC,CAAA,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;;AAEM,cAAM,GAAG,GAAG,CAAA;;;;GAIlB,AAJY,CAIX;AAjFO;IAAR,KAAK,EAAE;uCAAiB;AAEhB;IAAR,KAAK,EAAE;wCAAkB;AAHf,OAAO;IADnB,aAAa,CAAC,UAAU,CAAC;GACb,OAAO,CAmFnB","sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { RecaptchaWidgetInterface } from '../src/recaptcha-widget';\nimport {\n RecaptchaManager,\n RecaptchaManagerInterface,\n} from '../src/recaptcha-manager';\n\n@customElement('app-root')\nexport class AppRoot extends LitElement {\n @state() result?: string;\n\n @state() result2?: string;\n\n private recaptchaManager: RecaptchaManagerInterface = new RecaptchaManager({\n defaultSiteKey: '6Ld64a8UAAAAAGbDwi1927ztGNw7YABQ-dqzvTN2',\n });\n\n private recaptcha1?: RecaptchaWidgetInterface;\n\n private recaptcha2?: RecaptchaWidgetInterface;\n\n render() {\n return html`\n <p>\n <button @click=\"${this.loadRecaptcha}\">Load Recaptcha</button\n ><button @click=\"${this.executeRecaptcha}\">Execute Recaptcha</button>\n </p>\n ${this.result\n ? html`<p><strong>Token:</strong></p>\n <p>${this.result}</p>`\n : ''}\n <p>\n <button @click=\"${this.loadRecaptcha2}\">Load Another Recaptcha</button\n ><button @click=\"${this.executeRecaptcha2}\">\n Execute Another Recaptcha\n </button>\n </p>\n ${this.result2\n ? html`<p><strong>Token 2:</strong></p>\n <p>${this.result2}</p>`\n : ''}\n `;\n }\n\n private async loadRecaptcha() {\n this.recaptcha1 = await this.recaptchaManager?.getRecaptchaWidget({\n recaptchaParams: {\n tabindex: 0,\n theme: 'light',\n type: 'image',\n },\n });\n }\n\n private async executeRecaptcha() {\n if (!this.recaptcha1) {\n await this.loadRecaptcha();\n }\n\n if (!this.recaptcha1) {\n console.error('error loading recaptcha');\n return;\n }\n\n this.result = await this.recaptcha1.execute();\n }\n\n private async loadRecaptcha2() {\n this.recaptcha2 = await this.recaptchaManager?.getRecaptchaWidget({\n siteKey: '<your-site-key>',\n });\n }\n\n private async executeRecaptcha2() {\n if (!this.recaptcha2) {\n await this.loadRecaptcha();\n }\n\n if (!this.recaptcha2) {\n console.error('error loading recaptcha');\n return;\n }\n\n this.result2 = await this.recaptcha2.execute();\n }\n\n static styles = css`\n :host {\n display: block;\n }\n `;\n}\n"]}
|
|
@@ -36,9 +36,11 @@ export class RecaptchaManager {
|
|
|
36
36
|
return this.grecaptchaLibraryCache;
|
|
37
37
|
}
|
|
38
38
|
return new Promise(resolve => {
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
40
|
window.grecaptchaLoadedCallback = () => {
|
|
40
41
|
setTimeout(() => {
|
|
41
42
|
// remove the callback when we're done with it
|
|
43
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
44
|
delete window.grecaptchaLoadedCallback;
|
|
43
45
|
}, 10);
|
|
44
46
|
this.grecaptchaLibraryCache = window.grecaptcha;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-manager.js","sourceRoot":"","sources":["../../src/recaptcha-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAElB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,eAAe,EAA4B,MAAM,oBAAoB,CAAC;AAY/E,MAAM,OAAO,gBAAgB;IAO3B,YAAY,OAIX;;QANO,mBAAc,GAAoC,EAAE,CAAC;QAO3D,IAAI,CAAC,cAAc,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,IAAI,iBAAiB,EAAE,CAAC;QACjE,IAAI,CAAC,sBAAsB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,CAAC;IAC3D,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,kBAAkB,CAAC,OAGxB;;QACC,MAAM,GAAG,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,IAAI,CAAC,cAAc,CAAC;QACpD,IAAI,CAAC,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"recaptcha-manager.js","sourceRoot":"","sources":["../../src/recaptcha-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,GAElB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,eAAe,EAA4B,MAAM,oBAAoB,CAAC;AAY/E,MAAM,OAAO,gBAAgB;IAO3B,YAAY,OAIX;;QANO,mBAAc,GAAoC,EAAE,CAAC;QAO3D,IAAI,CAAC,cAAc,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,CAAC;QAC9C,IAAI,CAAC,UAAU,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,IAAI,iBAAiB,EAAE,CAAC;QACjE,IAAI,CAAC,sBAAsB,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,CAAC;IAC3D,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,kBAAkB,CAAC,OAGxB;;QACC,MAAM,GAAG,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,mCAAI,IAAI,CAAC,cAAc,CAAC;QACpD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3D,MAAM,SAAS,GAAG,IAAI,eAAe,CACnC;YACE,OAAO,EAAE,GAAG;YACZ,iBAAiB;SAClB,EACD,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,eAAe,CACzB,CAAC;QAEF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;QACrC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,mBAAmB;QAC/B,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC,sBAAsB,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,8DAA8D;YAC7D,MAAc,CAAC,wBAAwB,GAAG,GAAS,EAAE;gBACpD,UAAU,CAAC,GAAG,EAAE;oBACd,8CAA8C;oBAC9C,8DAA8D;oBAC9D,OAAQ,MAAc,CAAC,wBAAwB,CAAC;gBAClD,CAAC,EAAE,EAAE,CAAC,CAAC;gBACP,IAAI,CAAC,sBAAsB,GAAG,MAAM,CAAC,UAAU,CAAC;gBAChD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC7B,CAAC,CAAC;YAEF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;gBACzB,GAAG,EAAE,yFAAyF;aAC/F,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CAIF","sourcesContent":["import {\n LazyLoaderService,\n LazyLoaderServiceInterface,\n} from '@internetarchive/lazy-loader-service';\nimport { RecaptchaWidget, RecaptchaWidgetInterface } from './recaptcha-widget';\n\nexport interface RecaptchaManagerInterface {\n /**\n * Load a recaptcha widget for a given site key or the default site key.\n */\n getRecaptchaWidget(options?: {\n siteKey?: string;\n recaptchaParams?: ReCaptchaV2.Parameters;\n }): Promise<RecaptchaWidgetInterface>;\n}\n\nexport class RecaptchaManager implements RecaptchaManagerInterface {\n private lazyLoader: LazyLoaderServiceInterface;\n\n private defaultSiteKey?: string;\n\n private recaptchaCache: Record<string, RecaptchaWidget> = {};\n\n constructor(options?: {\n defaultSiteKey?: string;\n lazyLoader?: LazyLoaderServiceInterface;\n grecaptchaLibrary?: ReCaptchaV2.ReCaptcha; // allows dependency injection or will be lazy loaded\n }) {\n this.defaultSiteKey = options?.defaultSiteKey;\n this.lazyLoader = options?.lazyLoader ?? new LazyLoaderService();\n this.grecaptchaLibraryCache = options?.grecaptchaLibrary;\n }\n\n /** @inheritdoc */\n async getRecaptchaWidget(options?: {\n siteKey?: string;\n recaptchaParams?: ReCaptchaV2.Parameters;\n }): Promise<RecaptchaWidgetInterface> {\n const key = options?.siteKey ?? this.defaultSiteKey;\n if (!key) {\n throw new Error('The reCaptcha widget requires a site key');\n }\n\n const cached = this.recaptchaCache[key];\n if (cached) return cached;\n\n const grecaptchaLibrary = await this.getRecaptchaLibrary();\n const recaptcha = new RecaptchaWidget(\n {\n siteKey: key,\n grecaptchaLibrary,\n },\n options?.recaptchaParams,\n );\n\n this.recaptchaCache[key] = recaptcha;\n return recaptcha;\n }\n\n /**\n * Load the Recaptch library from Google.\n *\n * @returns Promise<ReCaptchaV2.ReCaptcha>\n */\n private async getRecaptchaLibrary(): Promise<ReCaptchaV2.ReCaptcha> {\n if (this.grecaptchaLibraryCache) {\n return this.grecaptchaLibraryCache;\n }\n return new Promise(resolve => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).grecaptchaLoadedCallback = (): void => {\n setTimeout(() => {\n // remove the callback when we're done with it\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delete (window as any).grecaptchaLoadedCallback;\n }, 10);\n this.grecaptchaLibraryCache = window.grecaptcha;\n resolve(window.grecaptcha);\n };\n\n this.lazyLoader.loadScript({\n src: 'https://www.google.com/recaptcha/api.js?onload=grecaptchaLoadedCallback&render=explicit',\n });\n });\n }\n\n /** don't use directly, use `getRecaptchaLibrary()` */\n private grecaptchaLibraryCache?: ReCaptchaV2.ReCaptcha;\n}\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/// <reference types="grecaptcha" />
|
|
2
1
|
/**
|
|
3
2
|
* This encompasses a widget for a given site key.
|
|
4
3
|
*/
|
|
@@ -10,7 +9,7 @@ export interface RecaptchaWidgetInterface {
|
|
|
10
9
|
* The combines parameters from the Recaptcha config and adds the zIndex, which
|
|
11
10
|
* allows us to control the z-index of the recaptcha widget.
|
|
12
11
|
*/
|
|
13
|
-
export
|
|
12
|
+
export type RecaptchaWidgetConfig = Pick<ReCaptchaV2.Parameters, 'tabindex' | 'theme' | 'type' | 'size' | 'badge'> & {
|
|
14
13
|
zIndex?: number;
|
|
15
14
|
};
|
|
16
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-widget.js","sourceRoot":"","sources":["../../src/recaptcha-widget.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,OAAO,eAAe;IAe1B,YACE,MAGC,EACD,YAAoC;QAT9B,aAAQ,GAAkB,IAAI,CAAC;QAE/B,gBAAW,GAAG,KAAK,CAAC;QAS1B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,CAAC;QAElD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACtC,CAAC;IAED,kBAAkB;IAClB,KAAK,CAAC,OAAO;QACX,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAE1B,IAAI,QAAQ,KAAK,IAAI,EAAE;
|
|
1
|
+
{"version":3,"file":"recaptcha-widget.js","sourceRoot":"","sources":["../../src/recaptcha-widget.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * This encompasses a widget for a given site key.\n */\nexport interface RecaptchaWidgetInterface {\n /** execute the recaptcha request and returns a token */\n execute(): Promise<string>;\n}\n\n/**\n * The combines parameters from the Recaptcha config and adds the zIndex, which\n * allows us to control the z-index of the recaptcha widget.\n */\nexport type RecaptchaWidgetConfig = Pick<\n ReCaptchaV2.Parameters,\n 'tabindex' | 'theme' | 'type' | 'size' | 'badge'\n> & {\n zIndex?: number;\n};\n\n/**\n * This encompasses a widget for a given site key.\n */\nexport class RecaptchaWidget implements RecaptchaWidgetInterface {\n private executionSuccessBlock?: (token: string) => void;\n\n private executionExpiredBlock?: () => void;\n\n private executionErrorBlock?: () => void;\n\n private grecaptchaLibrary: ReCaptchaV2.ReCaptcha;\n\n private siteKey: string;\n\n private widgetId: number | null = null;\n\n private isExecuting = false;\n\n constructor(\n config: {\n siteKey: string;\n grecaptchaLibrary: ReCaptchaV2.ReCaptcha;\n },\n widgetConfig?: RecaptchaWidgetConfig,\n ) {\n this.siteKey = config.siteKey;\n this.grecaptchaLibrary = config.grecaptchaLibrary;\n\n const container = this.createContainer();\n this.setup(container, widgetConfig);\n }\n\n /** @inheritdoc */\n async execute(): Promise<string> {\n const { widgetId } = this;\n\n if (widgetId === null) {\n throw new Error('Recaptcha is not setup');\n }\n\n if (this.isExecuting) {\n // there is no way to know when users have dismissed a previous recaptcha\n // so if we're still in the middle of execution when we call execute again,\n // just reset it and execute it again\n this.finishExecution();\n }\n\n this.isExecuting = true;\n\n return new Promise((resolve, reject) => {\n this.executionSuccessBlock = (token: string): void => {\n this.finishExecution();\n resolve(token);\n };\n\n this.executionExpiredBlock = (): void => {\n this.finishExecution();\n reject(new Error('expired'));\n };\n\n this.executionErrorBlock = (): void => {\n this.finishExecution();\n reject(new Error('error'));\n };\n\n this.grecaptchaLibrary.execute(widgetId);\n });\n }\n\n private finishExecution() {\n this.isExecuting = false;\n const { widgetId } = this;\n if (widgetId === null) return;\n this.grecaptchaLibrary.reset(widgetId);\n }\n\n private setup(\n container: HTMLElement,\n widgetConfig?: ReCaptchaV2.Parameters,\n ): void {\n this.widgetId = this.grecaptchaLibrary.render(container, {\n callback: this.responseHandler.bind(this),\n 'expired-callback': this.expiredHandler.bind(this),\n 'error-callback': this.errorHandler.bind(this),\n sitekey: this.siteKey,\n tabindex: widgetConfig?.tabindex,\n theme: widgetConfig?.theme,\n type: widgetConfig?.type,\n size: widgetConfig?.size ?? 'invisible',\n badge: widgetConfig?.badge,\n });\n }\n\n private createContainer(zIndex?: number): HTMLElement {\n const elementId = `recaptchaManager-${this.siteKey}`;\n let element: HTMLElement | null = document.getElementById(elementId);\n if (!element) {\n element = document.createElement('div');\n element.id = elementId;\n element.style.position = 'fixed';\n element.style.top = '50%';\n element.style.left = '50%';\n element.style.zIndex = zIndex ? `${zIndex}` : '10';\n document.body.appendChild(element);\n }\n return element;\n }\n\n private responseHandler(response: string): void {\n if (this.executionSuccessBlock) {\n this.executionSuccessBlock(response);\n this.executionSuccessBlock = undefined;\n }\n }\n\n private expiredHandler(): void {\n if (this.executionExpiredBlock) {\n this.executionExpiredBlock();\n this.executionExpiredBlock = undefined;\n }\n }\n\n private errorHandler(): void {\n if (this.executionErrorBlock) {\n this.executionErrorBlock();\n this.executionErrorBlock = undefined;\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export declare type MockGrecaptchaMode = 'success' | 'expired' | 'error';
|
|
1
|
+
export type MockGrecaptchaMode = 'success' | 'expired' | 'error';
|
|
3
2
|
export declare class MockGrecaptcha implements ReCaptchaV2.ReCaptcha {
|
|
4
3
|
response: string;
|
|
5
4
|
renderCalled: boolean;
|
|
@@ -1,17 +1,5 @@
|
|
|
1
|
-
/* eslint-disable camelcase */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
1
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
4
2
|
export class MockGrecaptcha {
|
|
5
|
-
constructor(options) {
|
|
6
|
-
var _a;
|
|
7
|
-
this.response = 'foo';
|
|
8
|
-
this.renderCalled = false;
|
|
9
|
-
this.executeCalled = false;
|
|
10
|
-
this.resetCallCount = 0;
|
|
11
|
-
this.getResponseCalled = false;
|
|
12
|
-
this.mode = options.mode;
|
|
13
|
-
this.addDelay = (_a = options.addDelay) !== null && _a !== void 0 ? _a : false;
|
|
14
|
-
}
|
|
15
3
|
render(container, parameters, inherit) {
|
|
16
4
|
var _a, _b, _c;
|
|
17
5
|
this.callback = (_a = parameters === null || parameters === void 0 ? void 0 : parameters.callback) === null || _a === void 0 ? void 0 : _a.bind(this);
|
|
@@ -58,5 +46,15 @@ export class MockGrecaptcha {
|
|
|
58
46
|
break;
|
|
59
47
|
}
|
|
60
48
|
}
|
|
49
|
+
constructor(options) {
|
|
50
|
+
var _a;
|
|
51
|
+
this.response = 'foo';
|
|
52
|
+
this.renderCalled = false;
|
|
53
|
+
this.executeCalled = false;
|
|
54
|
+
this.resetCallCount = 0;
|
|
55
|
+
this.getResponseCalled = false;
|
|
56
|
+
this.mode = options.mode;
|
|
57
|
+
this.addDelay = (_a = options.addDelay) !== null && _a !== void 0 ? _a : false;
|
|
58
|
+
}
|
|
61
59
|
}
|
|
62
60
|
//# sourceMappingURL=mock-grecaptcha.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-grecaptcha.js","sourceRoot":"","sources":["../../test/mock-grecaptcha.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"mock-grecaptcha.js","sourceRoot":"","sources":["../../test/mock-grecaptcha.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAItD,MAAM,OAAO,cAAc;IAqBzB,MAAM,CACJ,SAA+B,EAC/B,UAA+C,EAC/C,OAA6B;;QAE7B,IAAI,CAAC,QAAQ,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ,0CAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,gBAAgB,CAAC,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,gBAAgB,CAAC,0CAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,kBAAkB,CAAC,GAAG,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,kBAAkB,CAAC,0CAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,KAAK,CAAC,aAAkC;QACtC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,WAAW,CAAC,aAAkC;QAC5C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,aAAsB;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAE1B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAoB,IAAS,CAAC;IAE5B,YAAY;QAClB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,SAAS;gBACZ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACvB,CAAC;gBACD,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;oBAC3B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC3B,CAAC;gBACD,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;oBAC7B,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC7B,CAAC;gBACD,MAAM;YACR;gBACE,MAAM;QACV,CAAC;IACH,CAAC;IAED,YAAY,OAAyD;;QA3ErE,aAAQ,GAAG,KAAK,CAAC;QAEjB,iBAAY,GAAG,KAAK,CAAC;QAErB,kBAAa,GAAG,KAAK,CAAC;QAEtB,mBAAc,GAAG,CAAC,CAAC;QAEnB,sBAAiB,GAAG,KAAK,CAAC;QAoExB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,KAAK,CAAC;IAC5C,CAAC;CACF","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n\nexport type MockGrecaptchaMode = 'success' | 'expired' | 'error';\n\nexport class MockGrecaptcha implements ReCaptchaV2.ReCaptcha {\n response = 'foo';\n\n renderCalled = false;\n\n executeCalled = false;\n\n resetCallCount = 0;\n\n getResponseCalled = false;\n\n mode: MockGrecaptchaMode;\n\n addDelay: boolean;\n\n callback?: (response: string) => void;\n\n 'expired-callback'?: () => void;\n\n 'error-callback'?: () => void;\n\n render(\n container: string | HTMLElement,\n parameters?: ReCaptchaV2.Parameters | undefined,\n inherit?: boolean | undefined,\n ): number {\n this.callback = parameters?.callback?.bind(this);\n this['error-callback'] = parameters?.['error-callback']?.bind(this);\n this['expired-callback'] = parameters?.['expired-callback']?.bind(this);\n this.renderCalled = true;\n return 1;\n }\n\n reset(opt_widget_id?: number | undefined): void {\n this.resetCallCount += 1;\n }\n\n getResponse(opt_widget_id?: number | undefined): string {\n this.getResponseCalled = true;\n return 'foo';\n }\n\n execute(opt_widget_id?: number): void {\n this.executeCalled = true;\n\n if (this.addDelay) {\n setTimeout(this.callCallback.bind(this), 100);\n } else {\n this.callCallback();\n }\n }\n\n ready(callback: () => void): void {}\n\n private callCallback(): void {\n switch (this.mode) {\n case 'success':\n if (this.callback) {\n this.callback('foo');\n }\n break;\n case 'error':\n if (this['error-callback']) {\n this['error-callback']();\n }\n break;\n case 'expired':\n if (this['expired-callback']) {\n this['expired-callback']();\n }\n break;\n default:\n break;\n }\n }\n\n constructor(options: { mode: MockGrecaptchaMode; addDelay?: boolean }) {\n this.mode = options.mode;\n this.addDelay = options.addDelay ?? false;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock-lazy-loader.js","sourceRoot":"","sources":["../../test/mock-lazy-loader.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,OAAO,qBAAqB;IAGhC,EAAE,CACA,KAAQ,EACR,QAAoC;QAEpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAGhB;QACC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAIhB;QACC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;QACjC,MAAM,CAAC,UAAU,GAAG,IAAI,cAAc,CAAC;YACrC,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mock-lazy-loader.js","sourceRoot":"","sources":["../../test/mock-lazy-loader.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,OAAO,qBAAqB;IAGhC,EAAE,CACA,KAAQ,EACR,QAAoC;QAEpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAGhB;QACC,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAIhB;QACC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC;QACjC,MAAM,CAAC,UAAU,GAAG,IAAI,cAAc,CAAC;YACrC,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QACH,8DAA8D;QAC7D,MAAc,CAAC,wBAAwB,EAAE,CAAC;IAC7C,CAAC;CACF","sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\nimport {\n BundleType,\n LazyLoaderServiceEvents,\n LazyLoaderServiceInterface,\n} from '@internetarchive/lazy-loader-service';\nimport { Unsubscribe } from 'nanoevents';\nimport { MockGrecaptcha } from './mock-grecaptcha';\n\nexport class MockLazyLoaderService implements LazyLoaderServiceInterface {\n loadScriptSrc?: string;\n\n on<E extends keyof LazyLoaderServiceEvents>(\n event: E,\n callback: LazyLoaderServiceEvents[E],\n ): Unsubscribe {\n throw new Error('Method not implemented.');\n }\n\n async loadBundle(bundle: {\n module?: string;\n nomodule?: string;\n }): Promise<void> {\n console.debug('loadBundle', bundle);\n }\n\n async loadScript(options: {\n src: string;\n bundleType?: BundleType;\n attributes?: Record<string, string>;\n }): Promise<void> {\n this.loadScriptSrc = options.src;\n window.grecaptcha = new MockGrecaptcha({\n mode: 'success',\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).grecaptchaLoadedCallback();\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-manager.test.js","sourceRoot":"","sources":["../../test/recaptcha-manager.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,MAAM,cAAc,GAAG,IAAI,qBAAqB,EAAE,CAAC;AAEnD,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;gBACxC,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,cAAc,CAAC,QAAQ,GAAG,KAAK,CAAC;YAChC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;gBAC5C,UAAU,EAAE,cAAc;gBAC1B,iBAAiB,EAAE,cAAc;gBACjC,cAAc,EAAE,KAAK;aACtB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;YACzC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;gBACxC,IAAI,EAAE,SAAS;aAChB,CAAC,CAAC;YACH,cAAc,CAAC,QAAQ,GAAG,KAAK,CAAC;YAChC,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;gBAC5C,UAAU,EAAE,cAAc;gBAC1B,iBAAiB,EAAE,cAAc;aAClC,CAAC,CAAC;YACH,IAAI;
|
|
1
|
+
{"version":3,"file":"recaptcha-manager.test.js","sourceRoot":"","sources":["../../test/recaptcha-manager.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { expect } from '@open-wc/testing';\nimport { MockGrecaptcha } from './mock-grecaptcha';\nimport { RecaptchaManager } from '../src/recaptcha-manager';\nimport { MockLazyLoaderService } from './mock-lazy-loader';\n\nconst mockLazyLoader = new MockLazyLoaderService();\n\ndescribe('ReCaptcha Management', () => {\n describe('ReCaptcha Manager', () => {\n it('can return recaptchas', async () => {\n const mockGrecaptcha = new MockGrecaptcha({\n mode: 'success',\n });\n mockGrecaptcha.response = 'foo';\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n grecaptchaLibrary: mockGrecaptcha,\n defaultSiteKey: '123',\n });\n const recaptcha = await recaptchaManager.getRecaptchaWidget();\n const result = await recaptcha.execute();\n expect(result).to.equal('foo');\n });\n\n it('throws an error if no site key found', async () => {\n const mockGrecaptcha = new MockGrecaptcha({\n mode: 'success',\n });\n mockGrecaptcha.response = 'foo';\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n grecaptchaLibrary: mockGrecaptcha,\n });\n try {\n await recaptchaManager.getRecaptchaWidget();\n expect.fail('should not get here');\n } catch (e) {\n expect((e as Error).message).to.equal(\n 'The reCaptcha widget requires a site key',\n );\n }\n });\n\n it('returns a cached version if one already exists for a given site key', async () => {\n const mockGrecaptcha = new MockGrecaptcha({\n mode: 'success',\n });\n mockGrecaptcha.response = 'foo';\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n grecaptchaLibrary: mockGrecaptcha,\n defaultSiteKey: '123',\n });\n const recaptcha1 = await recaptchaManager.getRecaptchaWidget();\n const recaptcha2 = await recaptchaManager.getRecaptchaWidget();\n expect(recaptcha1).to.equal(recaptcha2);\n });\n\n it('loads the recaptcha library if needed', async () => {\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n defaultSiteKey: '123',\n });\n await recaptchaManager.getRecaptchaWidget();\n const loadUrl = mockLazyLoader.loadScriptSrc;\n expect(\n loadUrl?.includes('recaptcha/api.js?onload=grecaptchaLoadedCallback'),\n ).to.be.true;\n });\n });\n\n describe('ReCaptcha Widget', () => {\n it('can error properly like a Promise', async () => {\n const mockGrecaptcha = new MockGrecaptcha({\n mode: 'error',\n });\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n grecaptchaLibrary: mockGrecaptcha,\n defaultSiteKey: '123',\n });\n const recaptcha = await recaptchaManager.getRecaptchaWidget();\n\n try {\n await recaptcha.execute();\n expect.fail('should not get here');\n } catch (error) {\n expect((error as Error).message).to.equal('error');\n }\n });\n\n it('can expire properly like a Promise', async () => {\n const mockGrecaptcha = new MockGrecaptcha({\n mode: 'expired',\n });\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n grecaptchaLibrary: mockGrecaptcha,\n defaultSiteKey: '123',\n });\n const recaptcha = await recaptchaManager.getRecaptchaWidget();\n\n try {\n await recaptcha.execute();\n expect.fail('should not get here');\n } catch (error) {\n expect((error as Error).message).to.equal('expired');\n }\n });\n\n it('resets the captcha after execution', async () => {\n const mockGrecaptcha = new MockGrecaptcha({\n mode: 'success',\n addDelay: true,\n });\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n grecaptchaLibrary: mockGrecaptcha,\n defaultSiteKey: '123',\n });\n const recaptcha = await recaptchaManager.getRecaptchaWidget();\n\n expect(mockGrecaptcha.resetCallCount).to.equal(0);\n await recaptcha.execute();\n expect(mockGrecaptcha.resetCallCount).to.equal(1);\n await recaptcha.execute();\n expect(mockGrecaptcha.resetCallCount).to.equal(2);\n });\n\n // there's no way to know if the user has dismissed the captcha so if another execution\n // comes through while the captcha is still active, it will be reset\n it('resets the captcha if another execution gets called', async () => {\n const mockGrecaptcha = new MockGrecaptcha({\n mode: 'success',\n addDelay: true,\n });\n const recaptchaManager = new RecaptchaManager({\n lazyLoader: mockLazyLoader,\n grecaptchaLibrary: mockGrecaptcha,\n defaultSiteKey: '123',\n });\n const recaptcha = await recaptchaManager.getRecaptchaWidget();\n\n expect(mockGrecaptcha.resetCallCount).to.equal(0);\n recaptcha.execute();\n expect(mockGrecaptcha.resetCallCount).to.equal(0);\n await recaptcha.execute();\n expect(mockGrecaptcha.resetCallCount).to.equal(2);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
// https://vitejs.dev/config/
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
base: './',
|
|
6
|
+
root: resolve(__dirname, './demo'),
|
|
7
|
+
build: {
|
|
8
|
+
/**
|
|
9
|
+
* This is the directory where the built files will be placed
|
|
10
|
+
* that we upload to GitHub Pages.
|
|
11
|
+
*/
|
|
12
|
+
outDir: '../ghpages/demo',
|
|
13
|
+
emptyOutDir: true,
|
|
14
|
+
manifest: true,
|
|
15
|
+
rollupOptions: {
|
|
16
|
+
input: {
|
|
17
|
+
main: resolve(__dirname, 'demo/index.html'),
|
|
18
|
+
},
|
|
19
|
+
output: {
|
|
20
|
+
entryFileNames: 'app-root.js',
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=vite.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vite.config.js","sourceRoot":"","sources":["../vite.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,6BAA6B;AAC7B,eAAe,YAAY,CAAC;IAC1B,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,QAAQ,CAAC;IAClC,KAAK,EAAE;QACL;;;WAGG;QACH,MAAM,EAAE,iBAAiB;QACzB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE;YACb,KAAK,EAAE;gBACL,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,iBAAiB,CAAC;aAC5C;YACD,MAAM,EAAE;gBACN,cAAc,EAAE,aAAa;aAC9B;SACF;KACF;CACF,CAAC,CAAC","sourcesContent":["import { defineConfig } from 'vite';\nimport { resolve } from 'path';\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n base: './',\n root: resolve(__dirname, './demo'),\n build: {\n /**\n * This is the directory where the built files will be placed\n * that we upload to GitHub Pages.\n */\n outDir: '../ghpages/demo',\n emptyOutDir: true,\n manifest: true,\n rollupOptions: {\n input: {\n main: resolve(__dirname, 'demo/index.html'),\n },\n output: {\n entryFileNames: 'app-root.js',\n },\n },\n },\n});\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import typescriptEslint from '@typescript-eslint/eslint-plugin';
|
|
2
|
+
import html from 'eslint-plugin-html';
|
|
3
|
+
import tsParser from '@typescript-eslint/parser';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import js from '@eslint/js';
|
|
7
|
+
import { FlatCompat } from '@eslint/eslintrc';
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
const compat = new FlatCompat({
|
|
12
|
+
baseDirectory: __dirname,
|
|
13
|
+
recommendedConfig: js.configs.recommended,
|
|
14
|
+
allConfig: js.configs.all,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export default [
|
|
18
|
+
...compat.extends('plugin:@typescript-eslint/recommended'),
|
|
19
|
+
{
|
|
20
|
+
plugins: {
|
|
21
|
+
'@typescript-eslint': typescriptEslint,
|
|
22
|
+
html,
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
languageOptions: {
|
|
26
|
+
parser: tsParser,
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
settings: {
|
|
30
|
+
'import/resolver': {
|
|
31
|
+
node: {
|
|
32
|
+
extensions: ['.ts', '.tsx'],
|
|
33
|
+
moduleDirectory: ['node_modules', 'src', 'demo'],
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
rules: {
|
|
39
|
+
'@typescript-eslint/no-unsafe-function-type': 'warn',
|
|
40
|
+
'@typescript-eslint/no-unused-vars': 'warn',
|
|
41
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
ignores: ['**/*.js', '**/*.mjs'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
files: ['**/*.test.ts'],
|
|
49
|
+
rules: {
|
|
50
|
+
'@typescript-eslint/no-unused-expressions': 'off',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
];
|