@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/package.json
CHANGED
|
@@ -7,82 +7,56 @@
|
|
|
7
7
|
},
|
|
8
8
|
"license": "AGPL-3.0-only",
|
|
9
9
|
"author": "Internet Archive",
|
|
10
|
-
"version": "0.1.
|
|
10
|
+
"version": "0.1.2-webdev-7354.0",
|
|
11
11
|
"main": "dist/index.js",
|
|
12
12
|
"module": "dist/index.js",
|
|
13
13
|
"scripts": {
|
|
14
14
|
"start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
|
|
15
|
+
"prepare": "rimraf dist && tsc && husky install",
|
|
15
16
|
"build": "tsc",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"format": "eslint --ext .ts,.html . --fix --ignore-path .gitignore && prettier \"**/*.ts\" --write --ignore-path .gitignore",
|
|
17
|
+
"lint": "eslint . && prettier \"**/*.ts\" --check",
|
|
18
|
+
"format": "eslint . --fix && prettier \"**/*.ts\" --write",
|
|
19
19
|
"circular": "madge --circular --extensions ts .",
|
|
20
|
-
"test": "tsc &&
|
|
21
|
-
"test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\""
|
|
20
|
+
"test": "tsc && npm run lint && npm run circular && wtr --coverage",
|
|
21
|
+
"test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\"",
|
|
22
|
+
"ghpages:build": "rimraf ghpages && npm run prepare && vite build",
|
|
23
|
+
"ghpages:publish": "npm run ghpages:prepare -e $(git branch --show-current)",
|
|
24
|
+
"ghpages:prepare": "npm run ghpages:build && touch ghpages/.nojekyll && npm run ghpages:generate",
|
|
25
|
+
"ghpages:generate": "gh-pages -t -d ghpages -m \"Build for $(git log --pretty=format:\"%h %an %ai %s\" -n1) [skip ci]\""
|
|
22
26
|
},
|
|
23
27
|
"types": "dist/index.d.ts",
|
|
24
|
-
"dependencies": {
|
|
25
|
-
"@internetarchive/lazy-loader-service": "^0.2.0",
|
|
26
|
-
"@types/grecaptcha": "^2"
|
|
27
|
-
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@open-wc/eslint-config": "^
|
|
30
|
-
"@open-wc/testing": "^
|
|
31
|
-
"@
|
|
32
|
-
"@typescript-eslint/
|
|
33
|
-
"@
|
|
34
|
-
"@web/
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"eslint
|
|
38
|
-
"eslint-
|
|
39
|
-
"eslint-plugin-
|
|
40
|
-
"eslint-plugin-
|
|
41
|
-
"
|
|
42
|
-
"lit": "^
|
|
43
|
-
"
|
|
29
|
+
"@open-wc/eslint-config": "^12.0.3",
|
|
30
|
+
"@open-wc/testing": "^4.0.0",
|
|
31
|
+
"@types/mocha": "^10.0.10",
|
|
32
|
+
"@typescript-eslint/eslint-plugin": "^8.19.1",
|
|
33
|
+
"@typescript-eslint/parser": "^8.19.1",
|
|
34
|
+
"@web/dev-server": "^0.4.6",
|
|
35
|
+
"@web/test-runner": "^0.20.0",
|
|
36
|
+
"concurrently": "^9.1.2",
|
|
37
|
+
"eslint": "^9.17.0",
|
|
38
|
+
"eslint-config-prettier": "^10.1.1",
|
|
39
|
+
"eslint-plugin-html": "^8.1.2",
|
|
40
|
+
"eslint-plugin-import": "^2.31.0",
|
|
41
|
+
"eslint-plugin-lit": "^1.15.0",
|
|
42
|
+
"eslint-plugin-lit-a11y": "^4.1.4",
|
|
43
|
+
"eslint-plugin-no-only-tests": "^3.3.0",
|
|
44
|
+
"eslint-plugin-wc": "^2.2.0",
|
|
45
|
+
"gh-pages": "^6.3.0",
|
|
46
|
+
"husky": "^9.1.7",
|
|
47
|
+
"madge": "^8.0.0",
|
|
44
48
|
"nanoevents": "^6.0.2",
|
|
45
|
-
"prettier": "^
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
+
"prettier": "^3.4.2",
|
|
50
|
+
"rimraf": "^6.0.1",
|
|
51
|
+
"sinon": "^19.0.2",
|
|
52
|
+
"ts-lit-plugin": "^2.0.2",
|
|
53
|
+
"tslib": "^2.8.1",
|
|
54
|
+
"typescript": "^5.7.2",
|
|
55
|
+
"vite": "^6.0.7"
|
|
49
56
|
},
|
|
50
57
|
"publishConfig": {
|
|
51
58
|
"access": "public"
|
|
52
59
|
},
|
|
53
|
-
"eslintConfig": {
|
|
54
|
-
"parser": "@typescript-eslint/parser",
|
|
55
|
-
"extends": [
|
|
56
|
-
"@open-wc",
|
|
57
|
-
"prettier"
|
|
58
|
-
],
|
|
59
|
-
"plugins": [
|
|
60
|
-
"@typescript-eslint"
|
|
61
|
-
],
|
|
62
|
-
"globals": {
|
|
63
|
-
"ReCaptchaV2": "readonly"
|
|
64
|
-
},
|
|
65
|
-
"rules": {
|
|
66
|
-
"no-unused-vars": "off",
|
|
67
|
-
"@typescript-eslint/no-unused-vars": [
|
|
68
|
-
"error"
|
|
69
|
-
],
|
|
70
|
-
"no-shadow": "off",
|
|
71
|
-
"@typescript-eslint/no-shadow": [
|
|
72
|
-
"error"
|
|
73
|
-
],
|
|
74
|
-
"class-methods-use-this": "off",
|
|
75
|
-
"import/no-unresolved": "off",
|
|
76
|
-
"import/extensions": [
|
|
77
|
-
"off",
|
|
78
|
-
"ignorePackages",
|
|
79
|
-
{
|
|
80
|
-
"js": "never",
|
|
81
|
-
"ts": "never"
|
|
82
|
-
}
|
|
83
|
-
]
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
60
|
"prettier": {
|
|
87
61
|
"singleQuote": true,
|
|
88
62
|
"arrowParens": "avoid"
|
|
@@ -93,5 +67,10 @@
|
|
|
93
67
|
"prettier --write",
|
|
94
68
|
"git add"
|
|
95
69
|
]
|
|
70
|
+
},
|
|
71
|
+
"dependencies": {
|
|
72
|
+
"lit": "^2.8.0",
|
|
73
|
+
"@internetarchive/lazy-loader-service": "^0.2.0",
|
|
74
|
+
"@types/grecaptcha": "^2"
|
|
96
75
|
}
|
|
97
76
|
}
|
package/renovate.json
ADDED
package/src/recaptcha-manager.ts
CHANGED
|
@@ -50,7 +50,7 @@ export class RecaptchaManager implements RecaptchaManagerInterface {
|
|
|
50
50
|
siteKey: key,
|
|
51
51
|
grecaptchaLibrary,
|
|
52
52
|
},
|
|
53
|
-
options?.recaptchaParams
|
|
53
|
+
options?.recaptchaParams,
|
|
54
54
|
);
|
|
55
55
|
|
|
56
56
|
this.recaptchaCache[key] = recaptcha;
|
|
@@ -67,9 +67,11 @@ export class RecaptchaManager implements RecaptchaManagerInterface {
|
|
|
67
67
|
return this.grecaptchaLibraryCache;
|
|
68
68
|
}
|
|
69
69
|
return new Promise(resolve => {
|
|
70
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
71
|
(window as any).grecaptchaLoadedCallback = (): void => {
|
|
71
72
|
setTimeout(() => {
|
|
72
73
|
// remove the callback when we're done with it
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
75
|
delete (window as any).grecaptchaLoadedCallback;
|
|
74
76
|
}, 10);
|
|
75
77
|
this.grecaptchaLibraryCache = window.grecaptcha;
|
package/src/recaptcha-widget.ts
CHANGED
|
@@ -40,7 +40,7 @@ export class RecaptchaWidget implements RecaptchaWidgetInterface {
|
|
|
40
40
|
siteKey: string;
|
|
41
41
|
grecaptchaLibrary: ReCaptchaV2.ReCaptcha;
|
|
42
42
|
},
|
|
43
|
-
widgetConfig?: RecaptchaWidgetConfig
|
|
43
|
+
widgetConfig?: RecaptchaWidgetConfig,
|
|
44
44
|
) {
|
|
45
45
|
this.siteKey = config.siteKey;
|
|
46
46
|
this.grecaptchaLibrary = config.grecaptchaLibrary;
|
|
@@ -95,7 +95,7 @@ export class RecaptchaWidget implements RecaptchaWidgetInterface {
|
|
|
95
95
|
|
|
96
96
|
private setup(
|
|
97
97
|
container: HTMLElement,
|
|
98
|
-
widgetConfig?: ReCaptchaV2.Parameters
|
|
98
|
+
widgetConfig?: ReCaptchaV2.Parameters,
|
|
99
99
|
): void {
|
|
100
100
|
this.widgetId = this.grecaptchaLibrary.render(container, {
|
|
101
101
|
callback: this.responseHandler.bind(this),
|
|
@@ -125,7 +125,7 @@ export class RecaptchaWidget implements RecaptchaWidgetInterface {
|
|
|
125
125
|
return element;
|
|
126
126
|
}
|
|
127
127
|
|
|
128
|
-
private responseHandler(response:
|
|
128
|
+
private responseHandler(response: string): void {
|
|
129
129
|
if (this.executionSuccessBlock) {
|
|
130
130
|
this.executionSuccessBlock(response);
|
|
131
131
|
this.executionSuccessBlock = undefined;
|
package/ssl/server.crt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
|
2
|
+
MIIDszCCApugAwIBAgIUYr5csS2ntaMTww0b5QoFI0xlOpUwDQYJKoZIhvcNAQEL
|
|
3
|
+
BQAwaTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh
|
|
4
|
+
bmNpc2NvMRkwFwYDVQQKDBBJbnRlcm5ldCBBcmNoaXZlMRowGAYDVQQDDBFsb2Nh
|
|
5
|
+
bC5hcmNoaXZlLm9yZzAeFw0yNTAzMDcxOTM1MzRaFw0yNTA0MDYxOTM1MzRaMGkx
|
|
6
|
+
CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNj
|
|
7
|
+
bzEZMBcGA1UECgwQSW50ZXJuZXQgQXJjaGl2ZTEaMBgGA1UEAwwRbG9jYWwuYXJj
|
|
8
|
+
aGl2ZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZqbS9hNS3
|
|
9
|
+
8AtcA7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3U
|
|
10
|
+
XRCUDAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5
|
|
11
|
+
DSF1CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Y
|
|
12
|
+
cj1WlOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpd
|
|
13
|
+
JxBUxYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbM
|
|
14
|
+
QkUJc8dow3sVAgMBAAGjUzBRMB0GA1UdDgQWBBSla0L0Yhpx9/DEV4uJ6OoHH92Q
|
|
15
|
+
bTAfBgNVHSMEGDAWgBSla0L0Yhpx9/DEV4uJ6OoHH92QbTAPBgNVHRMBAf8EBTAD
|
|
16
|
+
AQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBEzt9sgWtwjLI7AVrejDSE6F/01ng4bTni
|
|
17
|
+
0PJXa7IpwjhAApVWcjxDKp8SkDUAcZNULqBGvpPicqjnKf+wxk3xTMc7pvLqzOor
|
|
18
|
+
pm+plDUBfCEbrv1ouLDMgOtxQxbwbBUPySsLoNmDUGAGnL2zENX7qidOOmmSQEN4
|
|
19
|
+
jZuPtiEkgTqmtkfHaRX/7jhmGVfxMxj0Krlar1/cSbvwaVs4kRSjiL9/avT+AX59
|
|
20
|
+
0QoNYTLGcBP0RKia8NF2A3cgUivIMFZQDvdsiAvqY+DbC7Mnyv4Sj/ZHHwVa9+8k
|
|
21
|
+
iRU56DrOt7sgaa/oQfzWnvRtL0F5eXC3veqM4qZrXs9hHeGlgPFo
|
|
22
|
+
-----END CERTIFICATE-----
|
package/ssl/server.key
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZqbS9hNS38Atc
|
|
3
|
+
A7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3UXRCU
|
|
4
|
+
DAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5DSF1
|
|
5
|
+
CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Ycj1W
|
|
6
|
+
lOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpdJxBU
|
|
7
|
+
xYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbMQkUJ
|
|
8
|
+
c8dow3sVAgMBAAECggEANgLpITAhcuVDhFk9L3m4H1bF/dCpDmCXfl2pXR/guicm
|
|
9
|
+
C4M9HUeheaOzvVWbXThiOe/HyfylpmFTmFEmCPNlPrDAyYzQXE/MNmYO/TQ3Eihk
|
|
10
|
+
iSG68I764XKHbsG+Byoa2rW8NSaqEjniZ/7Rtkt4qasXMmdxlGgUP9bq6O45g8HV
|
|
11
|
+
kHxneFlA2KbrvmWnBi7NTea9+tp61NWiq5n97UgHacQR6KkYIpbxd7uNSnCSdmXt
|
|
12
|
+
pcwzO4ZPabJ2/DKRjePhU5OggPh+9AhJ3jsBo99GwYPgSZDh8E3vh2OWOtLBMUH3
|
|
13
|
+
rmAYwlRT2aZ5hy5yi+4QD98WoUQtsr+9n757F8V6MQKBgQDzZycdgaKwWd5d34NN
|
|
14
|
+
0TkFtPQPwxxJTCCs3I3q02uWcS3svQzBK0cWb4nISO04TnJ3MnXo83dgGhCMF+uZ
|
|
15
|
+
FCXxAA53z8F92iZo+ELlXFDFwNeNYih/afDA42tWZ6TlVsDnZ4zQgRjHS7jEF/JV
|
|
16
|
+
0ZgwGpw5725JQt64dic8wTOcDQKBgQDk7YYACQcWTnmjDhZQ3PZSX4fcTtzPZKZj
|
|
17
|
+
fa1GrXEaUH1hSyc9VmY6qJpUmXexpvtr194nXE+O5wbThOHcBjVlo2Qv+vswmUX3
|
|
18
|
+
WEcVzTVN4/fODCLCqFcMNIr+BzwZfwpT+p0u8g9FxDy1gGmvkxwIu8DCpnUT12Xj
|
|
19
|
+
hm2wO+UxKQKBgFxCSDBF9+2SUtgQJYv0dwGzwiLLWMhro6MCAoT02D3w7nBihBgg
|
|
20
|
+
GFTnuDkDc285ROfrZ4gB6MizeHwxgOrIGU2NMO62/+d9LbvyBiE76Z3bZ5i+kQ0i
|
|
21
|
+
kc/7I69fn8ASLxJHTLenh0XbbNBfJ0riJCZvn7HSEGKShysyFdNQhAhtAoGAFYVi
|
|
22
|
+
0IQIv4cXFkYPwQBUw7+pVQOw7GpI3heFf5x0goXIk6nuAW0q5R7Oi192CiRphGTh
|
|
23
|
+
xI+ABy4ezSmz1exbfreShpQwowv1sOACpsEI3s6skBlB90y+Ci6yVlk1xCvWO7jW
|
|
24
|
+
qAAngWaGUoXE6bWJsCR+ZY4ieYAJWw9bJnMrA6kCgYAzV4Xeoh5ofENZM21wKW3W
|
|
25
|
+
iCzRibPObv6Vb/j9A9yT57yzI3BdfvsX5zmuSvOJm1DimgGY9nCJUzUEYG0a1Dhh
|
|
26
|
+
/rqObPoVIFGesmvwflVYFktmVHk7ycEDVreSTz23cvmraPz1fnpdKeuEs4sRQJV7
|
|
27
|
+
iJhLoxX5SJlJc0RXMhgHGQ==
|
|
28
|
+
-----END PRIVATE KEY-----
|
package/test/mock-grecaptcha.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
/* eslint-disable camelcase */
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
1
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
4
2
|
|
|
5
3
|
export type MockGrecaptchaMode = 'success' | 'expired' | 'error';
|
|
@@ -28,7 +26,7 @@ export class MockGrecaptcha implements ReCaptchaV2.ReCaptcha {
|
|
|
28
26
|
render(
|
|
29
27
|
container: string | HTMLElement,
|
|
30
28
|
parameters?: ReCaptchaV2.Parameters | undefined,
|
|
31
|
-
inherit?: boolean | undefined
|
|
29
|
+
inherit?: boolean | undefined,
|
|
32
30
|
): number {
|
|
33
31
|
this.callback = parameters?.callback?.bind(this);
|
|
34
32
|
this['error-callback'] = parameters?.['error-callback']?.bind(this);
|
package/test/mock-lazy-loader.ts
CHANGED
|
@@ -12,7 +12,7 @@ export class MockLazyLoaderService implements LazyLoaderServiceInterface {
|
|
|
12
12
|
|
|
13
13
|
on<E extends keyof LazyLoaderServiceEvents>(
|
|
14
14
|
event: E,
|
|
15
|
-
callback: LazyLoaderServiceEvents[E]
|
|
15
|
+
callback: LazyLoaderServiceEvents[E],
|
|
16
16
|
): Unsubscribe {
|
|
17
17
|
throw new Error('Method not implemented.');
|
|
18
18
|
}
|
|
@@ -33,6 +33,7 @@ export class MockLazyLoaderService implements LazyLoaderServiceInterface {
|
|
|
33
33
|
window.grecaptcha = new MockGrecaptcha({
|
|
34
34
|
mode: 'success',
|
|
35
35
|
});
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
36
37
|
(window as any).grecaptchaLoadedCallback();
|
|
37
38
|
}
|
|
38
39
|
}
|
|
@@ -36,7 +36,7 @@ describe('ReCaptcha Management', () => {
|
|
|
36
36
|
expect.fail('should not get here');
|
|
37
37
|
} catch (e) {
|
|
38
38
|
expect((e as Error).message).to.equal(
|
|
39
|
-
'The reCaptcha widget requires a site key'
|
|
39
|
+
'The reCaptcha widget requires a site key',
|
|
40
40
|
);
|
|
41
41
|
}
|
|
42
42
|
});
|
|
@@ -64,7 +64,7 @@ describe('ReCaptcha Management', () => {
|
|
|
64
64
|
await recaptchaManager.getRecaptchaWidget();
|
|
65
65
|
const loadUrl = mockLazyLoader.loadScriptSrc;
|
|
66
66
|
expect(
|
|
67
|
-
loadUrl?.includes('recaptcha/api.js?onload=grecaptchaLoadedCallback')
|
|
67
|
+
loadUrl?.includes('recaptcha/api.js?onload=grecaptchaLoadedCallback'),
|
|
68
68
|
).to.be.true;
|
|
69
69
|
});
|
|
70
70
|
});
|
package/tsconfig.json
CHANGED
|
@@ -15,6 +15,17 @@
|
|
|
15
15
|
"inlineSources": true,
|
|
16
16
|
"rootDir": "./",
|
|
17
17
|
"declaration": true,
|
|
18
|
+
"plugins": [
|
|
19
|
+
{
|
|
20
|
+
"name": "ts-lit-plugin"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"paths": {
|
|
24
|
+
// workaround for: https://github.com/vitest-dev/vitest/issues/4567
|
|
25
|
+
"rollup/parseAst": [
|
|
26
|
+
"./node_modules/rollup/dist/parseAst"
|
|
27
|
+
]
|
|
28
|
+
}
|
|
18
29
|
},
|
|
19
30
|
"include": ["**/*.ts"]
|
|
20
31
|
}
|
package/vite.config.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { defineConfig } from 'vite';
|
|
2
|
+
import { resolve } from 'path';
|
|
3
|
+
|
|
4
|
+
// https://vitejs.dev/config/
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
base: './',
|
|
7
|
+
root: resolve(__dirname, './demo'),
|
|
8
|
+
build: {
|
|
9
|
+
/**
|
|
10
|
+
* This is the directory where the built files will be placed
|
|
11
|
+
* that we upload to GitHub Pages.
|
|
12
|
+
*/
|
|
13
|
+
outDir: '../ghpages/demo',
|
|
14
|
+
emptyOutDir: true,
|
|
15
|
+
manifest: true,
|
|
16
|
+
rollupOptions: {
|
|
17
|
+
input: {
|
|
18
|
+
main: resolve(__dirname, 'demo/index.html'),
|
|
19
|
+
},
|
|
20
|
+
output: {
|
|
21
|
+
entryFileNames: 'app-root.js',
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
});
|
|
@@ -5,8 +5,12 @@ const hmr = process.argv.includes('--hmr');
|
|
|
5
5
|
|
|
6
6
|
export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
|
|
7
7
|
nodeResolve: true,
|
|
8
|
-
open: '/demo
|
|
8
|
+
open: '/demo',
|
|
9
9
|
watch: !hmr,
|
|
10
|
+
sslCert: './ssl/server.crt',
|
|
11
|
+
sslKey: './ssl/server.key',
|
|
12
|
+
hostname: 'local.archive.org',
|
|
13
|
+
http2: true,
|
|
10
14
|
|
|
11
15
|
/** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
|
|
12
16
|
// esbuildTarget: 'auto'
|
|
@@ -14,7 +18,7 @@ export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
|
|
|
14
18
|
/** Set appIndex to enable SPA routing */
|
|
15
19
|
// appIndex: 'demo/index.html',
|
|
16
20
|
|
|
17
|
-
/**
|
|
21
|
+
/** Configure bare import resolve plugin */
|
|
18
22
|
// nodeResolve: {
|
|
19
23
|
// exportConditions: ['browser', 'development']
|
|
20
24
|
// },
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
/// <reference types="grecaptcha" />
|
|
2
|
-
import { LazyLoaderServiceInterface } from '@internetarchive/lazy-loader-service';
|
|
3
|
-
export interface RecaptchaManagerInterface {
|
|
4
|
-
/**
|
|
5
|
-
* Executes the recaptcha and returns a token
|
|
6
|
-
*
|
|
7
|
-
* Example:
|
|
8
|
-
*
|
|
9
|
-
* try {
|
|
10
|
-
* const recaptchaResult = await recaptchaManager.execute();
|
|
11
|
-
* console.log('recaptcha token:', recaptchaResult);
|
|
12
|
-
* } catch {
|
|
13
|
-
* console.error('something happened')
|
|
14
|
-
* }
|
|
15
|
-
*/
|
|
16
|
-
execute(): Promise<string>;
|
|
17
|
-
/**
|
|
18
|
-
* Create the recaptcha widget.
|
|
19
|
-
*
|
|
20
|
-
* If the `container` is not passed in, one will be created.
|
|
21
|
-
*
|
|
22
|
-
* @param options
|
|
23
|
-
*/
|
|
24
|
-
setup(options?: {
|
|
25
|
-
container?: HTMLElement;
|
|
26
|
-
tabIndex?: number;
|
|
27
|
-
theme?: ReCaptchaV2.Theme;
|
|
28
|
-
type?: ReCaptchaV2.Type;
|
|
29
|
-
size?: ReCaptchaV2.Size;
|
|
30
|
-
}): void;
|
|
31
|
-
}
|
|
32
|
-
export declare class RecaptchaManager implements RecaptchaManagerInterface {
|
|
33
|
-
/**
|
|
34
|
-
* This is a convenience initializer that also lazily loads
|
|
35
|
-
* the recaptcha library from Google.
|
|
36
|
-
*
|
|
37
|
-
* @param options
|
|
38
|
-
* @returns
|
|
39
|
-
*/
|
|
40
|
-
static getRecaptchaManager(siteKey: string, options?: {
|
|
41
|
-
lazyLoader?: LazyLoaderServiceInterface;
|
|
42
|
-
tabIndex?: number;
|
|
43
|
-
theme?: ReCaptchaV2.Theme;
|
|
44
|
-
type?: ReCaptchaV2.Type;
|
|
45
|
-
size?: ReCaptchaV2.Size;
|
|
46
|
-
}): Promise<RecaptchaManagerInterface>;
|
|
47
|
-
/**
|
|
48
|
-
* Load the Recaptch library from Google.
|
|
49
|
-
*
|
|
50
|
-
* @param options
|
|
51
|
-
* @returns
|
|
52
|
-
*/
|
|
53
|
-
static loadRecaptchaLibrary(options?: {
|
|
54
|
-
lazyLoader?: LazyLoaderServiceInterface;
|
|
55
|
-
}): Promise<ReCaptchaV2.ReCaptcha>;
|
|
56
|
-
private grecaptchaLibrary;
|
|
57
|
-
private siteKey;
|
|
58
|
-
constructor(options: {
|
|
59
|
-
grecaptchaLibrary: ReCaptchaV2.ReCaptcha;
|
|
60
|
-
siteKey: string;
|
|
61
|
-
});
|
|
62
|
-
private executionSuccessBlock?;
|
|
63
|
-
private executionExpiredBlock?;
|
|
64
|
-
private executionErrorBlock?;
|
|
65
|
-
private isExecuting;
|
|
66
|
-
private containerElement;
|
|
67
|
-
/** @inheritdoc */
|
|
68
|
-
execute(): Promise<string>;
|
|
69
|
-
/** @inheritdoc */
|
|
70
|
-
setup(options?: {
|
|
71
|
-
container?: HTMLElement;
|
|
72
|
-
tabIndex?: number;
|
|
73
|
-
theme?: ReCaptchaV2.Theme;
|
|
74
|
-
type?: ReCaptchaV2.Type;
|
|
75
|
-
size?: ReCaptchaV2.Size;
|
|
76
|
-
}): void;
|
|
77
|
-
private createContainer;
|
|
78
|
-
private finishExecution;
|
|
79
|
-
private responseHandler;
|
|
80
|
-
private expiredHandler;
|
|
81
|
-
private errorHandler;
|
|
82
|
-
}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { LazyLoaderService, } from '@internetarchive/lazy-loader-service';
|
|
2
|
-
export class RecaptchaManager {
|
|
3
|
-
constructor(options) {
|
|
4
|
-
this.isExecuting = false;
|
|
5
|
-
this.containerElement = null;
|
|
6
|
-
this.grecaptchaLibrary = options.grecaptchaLibrary;
|
|
7
|
-
this.siteKey = options.siteKey;
|
|
8
|
-
}
|
|
9
|
-
/**
|
|
10
|
-
* This is a convenience initializer that also lazily loads
|
|
11
|
-
* the recaptcha library from Google.
|
|
12
|
-
*
|
|
13
|
-
* @param options
|
|
14
|
-
* @returns
|
|
15
|
-
*/
|
|
16
|
-
static async getRecaptchaManager(siteKey, options) {
|
|
17
|
-
const grecaptchaLibrary = await RecaptchaManager.loadRecaptchaLibrary({
|
|
18
|
-
lazyLoader: options === null || options === void 0 ? void 0 : options.lazyLoader,
|
|
19
|
-
});
|
|
20
|
-
const manager = new RecaptchaManager({
|
|
21
|
-
grecaptchaLibrary,
|
|
22
|
-
siteKey,
|
|
23
|
-
});
|
|
24
|
-
manager.setup({
|
|
25
|
-
tabIndex: options === null || options === void 0 ? void 0 : options.tabIndex,
|
|
26
|
-
theme: options === null || options === void 0 ? void 0 : options.theme,
|
|
27
|
-
type: options === null || options === void 0 ? void 0 : options.type,
|
|
28
|
-
size: options === null || options === void 0 ? void 0 : options.size,
|
|
29
|
-
});
|
|
30
|
-
return manager;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Load the Recaptch library from Google.
|
|
34
|
-
*
|
|
35
|
-
* @param options
|
|
36
|
-
* @returns
|
|
37
|
-
*/
|
|
38
|
-
static async loadRecaptchaLibrary(options) {
|
|
39
|
-
var _a;
|
|
40
|
-
const service = (_a = options === null || options === void 0 ? void 0 : options.lazyLoader) !== null && _a !== void 0 ? _a : new LazyLoaderService();
|
|
41
|
-
return new Promise(resolve => {
|
|
42
|
-
window.grecaptchaLoadedCallback = () => {
|
|
43
|
-
setTimeout(() => {
|
|
44
|
-
// remove the callback when we're done with it
|
|
45
|
-
delete window.grecaptchaLoadedCallback;
|
|
46
|
-
}, 10);
|
|
47
|
-
resolve(window.grecaptcha);
|
|
48
|
-
};
|
|
49
|
-
service.loadScript({
|
|
50
|
-
src: 'https://www.google.com/recaptcha/api.js?onload=grecaptchaLoadedCallback&render=explicit',
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
/** @inheritdoc */
|
|
55
|
-
execute() {
|
|
56
|
-
if (this.isExecuting) {
|
|
57
|
-
throw new Error('Recaptcha is already executing');
|
|
58
|
-
}
|
|
59
|
-
this.isExecuting = true;
|
|
60
|
-
return new Promise((resolve, reject) => {
|
|
61
|
-
this.executionSuccessBlock = (token) => {
|
|
62
|
-
this.finishExecution();
|
|
63
|
-
resolve(token);
|
|
64
|
-
};
|
|
65
|
-
this.executionExpiredBlock = () => {
|
|
66
|
-
this.finishExecution();
|
|
67
|
-
reject(new Error('expired'));
|
|
68
|
-
};
|
|
69
|
-
this.executionErrorBlock = () => {
|
|
70
|
-
this.finishExecution();
|
|
71
|
-
reject(new Error('error'));
|
|
72
|
-
};
|
|
73
|
-
this.grecaptchaLibrary.execute();
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
/** @inheritdoc */
|
|
77
|
-
setup(options) {
|
|
78
|
-
var _a, _b;
|
|
79
|
-
const container = (_a = options === null || options === void 0 ? void 0 : options.container) !== null && _a !== void 0 ? _a : this.createContainer();
|
|
80
|
-
// we've already rendered this container, don't do it again
|
|
81
|
-
if (container === this.containerElement)
|
|
82
|
-
return;
|
|
83
|
-
this.containerElement = container;
|
|
84
|
-
this.grecaptchaLibrary.render(container, {
|
|
85
|
-
callback: this.responseHandler.bind(this),
|
|
86
|
-
'expired-callback': this.expiredHandler.bind(this),
|
|
87
|
-
'error-callback': this.errorHandler.bind(this),
|
|
88
|
-
sitekey: this.siteKey,
|
|
89
|
-
tabindex: options === null || options === void 0 ? void 0 : options.tabIndex,
|
|
90
|
-
theme: options === null || options === void 0 ? void 0 : options.theme,
|
|
91
|
-
type: options === null || options === void 0 ? void 0 : options.type,
|
|
92
|
-
size: (_b = options === null || options === void 0 ? void 0 : options.size) !== null && _b !== void 0 ? _b : 'invisible',
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
createContainer() {
|
|
96
|
-
const elementId = `recaptchaManager-${this.siteKey}`;
|
|
97
|
-
let element = document.getElementById(elementId);
|
|
98
|
-
if (!element) {
|
|
99
|
-
element = document.createElement('div');
|
|
100
|
-
element.id = elementId;
|
|
101
|
-
element.style.position = 'fixed';
|
|
102
|
-
element.style.top = '50%';
|
|
103
|
-
element.style.left = '50%';
|
|
104
|
-
element.style.outline = '1px solid purple';
|
|
105
|
-
element.style.width = '10px';
|
|
106
|
-
element.style.height = '10px';
|
|
107
|
-
// #recaptcha - TopCollections {
|
|
108
|
-
// position: fixed;
|
|
109
|
-
// top: 50 %;
|
|
110
|
-
// left: 50 %;
|
|
111
|
-
// }
|
|
112
|
-
document.body.insertBefore(element, document.body.firstChild);
|
|
113
|
-
}
|
|
114
|
-
return element;
|
|
115
|
-
}
|
|
116
|
-
finishExecution() {
|
|
117
|
-
this.isExecuting = false;
|
|
118
|
-
this.grecaptchaLibrary.reset();
|
|
119
|
-
}
|
|
120
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
121
|
-
responseHandler(response) {
|
|
122
|
-
if (this.executionSuccessBlock) {
|
|
123
|
-
this.executionSuccessBlock(response);
|
|
124
|
-
this.executionSuccessBlock = undefined;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
expiredHandler() {
|
|
128
|
-
if (this.executionExpiredBlock) {
|
|
129
|
-
this.executionExpiredBlock();
|
|
130
|
-
this.executionExpiredBlock = undefined;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
errorHandler() {
|
|
134
|
-
if (this.executionErrorBlock) {
|
|
135
|
-
this.executionErrorBlock();
|
|
136
|
-
this.executionErrorBlock = undefined;
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
//# sourceMappingURL=recaptcha-manager%20copy.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"recaptcha-manager copy.js","sourceRoot":"","sources":["../../src/recaptcha-manager copy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LazyLoaderService,\n LazyLoaderServiceInterface,\n} from '@internetarchive/lazy-loader-service';\n\nexport interface RecaptchaManagerInterface {\n /**\n * Executes the recaptcha and returns a token\n *\n * Example:\n *\n * try {\n * const recaptchaResult = await recaptchaManager.execute();\n * console.log('recaptcha token:', recaptchaResult);\n * } catch {\n * console.error('something happened')\n * }\n */\n execute(): Promise<string>;\n\n /**\n * Create the recaptcha widget.\n *\n * If the `container` is not passed in, one will be created.\n *\n * @param options\n */\n setup(options?: {\n container?: HTMLElement;\n tabIndex?: number;\n theme?: ReCaptchaV2.Theme;\n type?: ReCaptchaV2.Type;\n size?: ReCaptchaV2.Size;\n }): void;\n}\n\nexport class RecaptchaManager implements RecaptchaManagerInterface {\n /**\n * This is a convenience initializer that also lazily loads\n * the recaptcha library from Google.\n *\n * @param options\n * @returns\n */\n static async getRecaptchaManager(\n siteKey: string,\n options?: {\n lazyLoader?: LazyLoaderServiceInterface;\n tabIndex?: number;\n theme?: ReCaptchaV2.Theme;\n type?: ReCaptchaV2.Type;\n size?: ReCaptchaV2.Size;\n }\n ): Promise<RecaptchaManagerInterface> {\n const grecaptchaLibrary = await RecaptchaManager.loadRecaptchaLibrary({\n lazyLoader: options?.lazyLoader,\n });\n\n const manager = new RecaptchaManager({\n grecaptchaLibrary,\n siteKey,\n });\n\n manager.setup({\n tabIndex: options?.tabIndex,\n theme: options?.theme,\n type: options?.type,\n size: options?.size,\n });\n\n return manager;\n }\n\n /**\n * Load the Recaptch library from Google.\n *\n * @param options\n * @returns\n */\n static async loadRecaptchaLibrary(options?: {\n lazyLoader?: LazyLoaderServiceInterface;\n }): Promise<ReCaptchaV2.ReCaptcha> {\n const service = options?.lazyLoader ?? new LazyLoaderService();\n\n return new Promise(resolve => {\n (window as any).grecaptchaLoadedCallback = (): void => {\n setTimeout(() => {\n // remove the callback when we're done with it\n delete (window as any).grecaptchaLoadedCallback;\n }, 10);\n resolve(window.grecaptcha);\n };\n\n service.loadScript({\n src: 'https://www.google.com/recaptcha/api.js?onload=grecaptchaLoadedCallback&render=explicit',\n });\n });\n }\n\n private grecaptchaLibrary: ReCaptchaV2.ReCaptcha;\n\n private siteKey: string;\n\n constructor(options: {\n grecaptchaLibrary: ReCaptchaV2.ReCaptcha;\n siteKey: string;\n }) {\n this.grecaptchaLibrary = options.grecaptchaLibrary;\n this.siteKey = options.siteKey;\n }\n\n private executionSuccessBlock?: (token: string) => void;\n\n private executionExpiredBlock?: () => void;\n\n private executionErrorBlock?: () => void;\n\n private isExecuting = false;\n\n private containerElement: HTMLElement | null = null;\n\n /** @inheritdoc */\n execute(): Promise<string> {\n if (this.isExecuting) {\n throw new Error('Recaptcha is already executing');\n }\n\n this.isExecuting = true;\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();\n });\n }\n\n /** @inheritdoc */\n setup(options?: {\n container?: HTMLElement;\n tabIndex?: number;\n theme?: ReCaptchaV2.Theme;\n type?: ReCaptchaV2.Type;\n size?: ReCaptchaV2.Size;\n }): void {\n const container = options?.container ?? this.createContainer();\n\n // we've already rendered this container, don't do it again\n if (container === this.containerElement) return;\n\n this.containerElement = container;\n 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: options?.tabIndex,\n theme: options?.theme,\n type: options?.type,\n size: options?.size ?? 'invisible',\n });\n }\n\n private createContainer(): 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.outline = '1px solid purple';\n element.style.width = '10px';\n element.style.height = '10px';\n // #recaptcha - TopCollections {\n // position: fixed;\n // top: 50 %;\n // left: 50 %;\n // }\n\n document.body.insertBefore(element, document.body.firstChild);\n }\n return element;\n }\n\n private finishExecution(): void {\n this.isExecuting = false;\n this.grecaptchaLibrary.reset();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private responseHandler(response: any): 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"]}
|