@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.
Files changed (49) hide show
  1. package/.github/workflows/ci.yml +8 -7
  2. package/.github/workflows/gh-pages-main.yml +39 -0
  3. package/.github/workflows/pr-preview.yml +63 -0
  4. package/.husky/pre-commit +0 -3
  5. package/.prettierignore +1 -0
  6. package/README.md +6 -28
  7. package/coverage/.gitignore +3 -0
  8. package/demo/app-root.ts +1 -1
  9. package/dist/demo/app-root.js +1 -1
  10. package/dist/demo/app-root.js.map +1 -1
  11. package/dist/src/recaptcha-manager.d.ts +0 -1
  12. package/dist/src/recaptcha-manager.js +2 -0
  13. package/dist/src/recaptcha-manager.js.map +1 -1
  14. package/dist/src/recaptcha-widget.d.ts +1 -2
  15. package/dist/src/recaptcha-widget.js.map +1 -1
  16. package/dist/test/mock-grecaptcha.d.ts +1 -2
  17. package/dist/test/mock-grecaptcha.js +10 -12
  18. package/dist/test/mock-grecaptcha.js.map +1 -1
  19. package/dist/test/mock-lazy-loader.js +1 -0
  20. package/dist/test/mock-lazy-loader.js.map +1 -1
  21. package/dist/test/recaptcha-manager.test.js.map +1 -1
  22. package/dist/vite.config.d.ts +2 -0
  23. package/dist/vite.config.js +25 -0
  24. package/dist/vite.config.js.map +1 -0
  25. package/eslint.config.mjs +53 -0
  26. package/package.json +41 -62
  27. package/renovate.json +6 -0
  28. package/src/recaptcha-manager.ts +3 -1
  29. package/src/recaptcha-widget.ts +3 -3
  30. package/ssl/server.crt +22 -0
  31. package/ssl/server.key +28 -0
  32. package/test/mock-grecaptcha.ts +1 -3
  33. package/test/mock-lazy-loader.ts +2 -1
  34. package/test/recaptcha-manager.test.ts +2 -2
  35. package/tsconfig.json +11 -0
  36. package/vite.config.ts +25 -0
  37. package/web-dev-server.config.mjs +6 -2
  38. package/dist/src/recaptcha-manager copy.d.ts +0 -82
  39. package/dist/src/recaptcha-manager copy.js +0 -140
  40. package/dist/src/recaptcha-manager copy.js.map +0 -1
  41. package/dist/src/recaptcha-manager-bak.d.ts +0 -82
  42. package/dist/src/recaptcha-manager-bak.js +0 -140
  43. package/dist/src/recaptcha-manager-bak.js.map +0 -1
  44. package/dist/src/recaptcha.d.ts +0 -28
  45. package/dist/src/recaptcha.js +0 -87
  46. package/dist/src/recaptcha.js.map +0 -1
  47. package/dist/test/your-webcomponent.test.js +0 -4
  48. package/dist/test/your-webcomponent.test.js.map +0 -1
  49. /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.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
- "prepare": "tsc && husky install",
17
- "lint": "eslint --ext .ts,.html . --ignore-path .gitignore && prettier \"**/*.ts\" --check --ignore-path .gitignore",
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 && yarn run lint && yarn run circular && wtr --coverage",
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": "^7.0.0",
30
- "@open-wc/testing": "^3.0.3",
31
- "@typescript-eslint/eslint-plugin": "^5.3.1",
32
- "@typescript-eslint/parser": "^5.3.1",
33
- "@web/dev-server": "^0.1.28",
34
- "@web/test-runner": "^0.13.22",
35
- "concurrently": "^6.3.0",
36
- "eslint": "^8.2.0",
37
- "eslint-config-prettier": "^8.3.0",
38
- "eslint-plugin-import": "^2.25.3",
39
- "eslint-plugin-lit-a11y": "^2.2.0",
40
- "eslint-plugin-wc": "^1.3.2",
41
- "husky": "^7.0.0",
42
- "lit": "^2.2.0",
43
- "madge": "^5.0.1",
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": "^2.4.1",
46
- "sinon": "^12.0.1",
47
- "tslib": "^2.3.1",
48
- "typescript": "^4.4.4"
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
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": [
3
+ "config:base",
4
+ ":preserveSemverRanges"
5
+ ]
6
+ }
@@ -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;
@@ -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: any): void {
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-----
@@ -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);
@@ -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
- /** Confgure bare import resolve plugin */
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"]}