@internetarchive/recaptcha-manager 0.0.1-alpha.4 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,7 +2,36 @@
2
2
 
3
3
  # Internet Archive reCaptcha Manager
4
4
 
5
- A library to lazy load and more easily interact with reCaptcha
5
+ A library to lazy load and interact with reCaptcha
6
+
7
+ ## Installation
8
+
9
+ ```shell
10
+ > yarn add @internetarchive/recaptcha-manager
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```ts
16
+ const recaptchaManager = new RecaptchaManager({
17
+ defaultSiteKey: 'your-site-key',
18
+ });
19
+
20
+ // will load recaptcha library if it's not loaded
21
+ const recaptchaWidget = await recaptchaManager.getRecaptchaWidget({
22
+ recaptchaParams: {
23
+ tabindex: 0,
24
+ theme: 'light',
25
+ type: 'image',
26
+ },
27
+ });
28
+
29
+ const token = await recaptchaWidget.execute();
30
+
31
+ // submit token with your post and validate on the backend
32
+ ```
33
+
34
+ For more usage examples, see `demo/app-root.ts` and `test/recaptcha-manager.test.ts`.
6
35
 
7
36
  ## Local Demo with `web-dev-server`
8
37
  ```bash
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: '6LeTUvYUAAAAAPTvW98MaXyS8c6vxk4-9n8DI1ve',
16
+ defaultSiteKey: '<your-site-key>',
17
17
  });
18
18
 
19
19
  private recaptcha1?: RecaptchaWidget;
@@ -68,7 +68,7 @@ export class AppRoot extends LitElement {
68
68
 
69
69
  private async loadRecaptcha2() {
70
70
  this.recaptcha2 = await this.recaptchaManager?.getRecaptchaWidget({
71
- siteKey: '6LfDgOgeAAAAAEIzkbGeW4N_yQoN3PxhUYdkxbS6',
71
+ siteKey: '<your-site-key>',
72
72
  });
73
73
  }
74
74
 
@@ -6,7 +6,7 @@ let AppRoot = class AppRoot extends LitElement {
6
6
  constructor() {
7
7
  super(...arguments);
8
8
  this.recaptchaManager = new RecaptchaManager({
9
- defaultSiteKey: '6LeTUvYUAAAAAPTvW98MaXyS8c6vxk4-9n8DI1ve',
9
+ defaultSiteKey: '<your-site-key>',
10
10
  });
11
11
  }
12
12
  render() {
@@ -54,7 +54,7 @@ let AppRoot = class AppRoot extends LitElement {
54
54
  async loadRecaptcha2() {
55
55
  var _a;
56
56
  this.recaptcha2 = await ((_a = this.recaptchaManager) === null || _a === void 0 ? void 0 : _a.getRecaptchaWidget({
57
- siteKey: '6LfDgOgeAAAAAEIzkbGeW4N_yQoN3PxhUYdkxbS6',
57
+ siteKey: '<your-site-key>',
58
58
  }));
59
59
  }
60
60
  async executeRecaptcha2() {
@@ -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;AAGlC,IAAa,OAAO,GAApB,MAAa,OAAQ,SAAQ,UAAU;IAAvC;;QAKU,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;YACpB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;SAC5B;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO;SACR;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,0CAA0C;SACpD,CAAC,CAAA,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;SAC5B;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO;SACR;QAED,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;CAOF,CAAA;AALQ,cAAM,GAAG,GAAG,CAAA;;;;GAIlB,CAAC;AAjFO;IAAR,KAAK,EAAE;uCAAiB;AAEhB;IAAR,KAAK,EAAE;wCAAkB;AAHf,OAAO;IADnB,aAAa,CAAC,UAAU,CAAC;GACb,OAAO,CAmFnB;SAnFY,OAAO","sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { RecaptchaWidget } 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: '6LeTUvYUAAAAAPTvW98MaXyS8c6vxk4-9n8DI1ve',\n });\n\n private recaptcha1?: RecaptchaWidget;\n\n private recaptcha2?: RecaptchaWidget;\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: '6LfDgOgeAAAAAEIzkbGeW4N_yQoN3PxhUYdkxbS6',\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"]}
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;AAGlC,IAAa,OAAO,GAApB,MAAa,OAAQ,SAAQ,UAAU;IAAvC;;QAKU,qBAAgB,GAA8B,IAAI,gBAAgB,CAAC;YACzE,cAAc,EAAE,iBAAiB;SAClC,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;YACpB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;SAC5B;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO;SACR;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;YACpB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;SAC5B;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACzC,OAAO;SACR;QAED,IAAI,CAAC,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC;CAOF,CAAA;AALQ,cAAM,GAAG,GAAG,CAAA;;;;GAIlB,CAAC;AAjFO;IAAR,KAAK,EAAE;uCAAiB;AAEhB;IAAR,KAAK,EAAE;wCAAkB;AAHf,OAAO;IADnB,aAAa,CAAC,UAAU,CAAC;GACb,OAAO,CAmFnB;SAnFY,OAAO","sourcesContent":["import { html, css, LitElement } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { RecaptchaWidget } 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: '<your-site-key>',\n });\n\n private recaptcha1?: RecaptchaWidget;\n\n private recaptcha2?: RecaptchaWidget;\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"]}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
1
  export { RecaptchaManager, RecaptchaManagerInterface, } from './src/recaptcha-manager';
2
- export { RecaptchaWidget, RecaptchaWidgetInterface, } from './src/recaptcha-widget';
2
+ export { RecaptchaWidget, RecaptchaWidgetInterface, RecaptchaWidgetConfig, } from './src/recaptcha-widget';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAEjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC","sourcesContent":["export {\n RecaptchaManager,\n RecaptchaManagerInterface,\n} from './src/recaptcha-manager';\n\nexport {\n RecaptchaWidget,\n RecaptchaWidgetInterface,\n} from './src/recaptcha-widget';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAEjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,eAAe,GAGhB,MAAM,wBAAwB,CAAC","sourcesContent":["export {\n RecaptchaManager,\n RecaptchaManagerInterface,\n} from './src/recaptcha-manager';\n\nexport {\n RecaptchaWidget,\n RecaptchaWidgetInterface,\n RecaptchaWidgetConfig,\n} from './src/recaptcha-widget';\n"]}
@@ -13,7 +13,7 @@ export class RecaptchaManager {
13
13
  var _a;
14
14
  const key = (_a = options === null || options === void 0 ? void 0 : options.siteKey) !== null && _a !== void 0 ? _a : this.defaultSiteKey;
15
15
  if (!key) {
16
- throw new Error('RecaptchaManager requires a site key');
16
+ throw new Error('The reCaptcha widget requires a site key');
17
17
  }
18
18
  const cached = this.recaptchaCache[key];
19
19
  if (cached)
@@ -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,EAAE,MAAM,oBAAoB,CAAC;AAYrD,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;YACR,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;SACzD;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;YAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC;SACpC;QACD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAc,CAAC,wBAAwB,GAAG,GAAS,EAAE;gBACpD,UAAU,CAAC,GAAG,EAAE;oBACd,8CAA8C;oBAC9C,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 } 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<RecaptchaWidget>;\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<RecaptchaWidget> {\n const key = options?.siteKey ?? this.defaultSiteKey;\n if (!key) {\n throw new Error('RecaptchaManager 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 (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 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
+ {"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,EAAE,MAAM,oBAAoB,CAAC;AAYrD,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;YACR,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;SAC7D;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;YAC/B,OAAO,IAAI,CAAC,sBAAsB,CAAC;SACpC;QACD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC1B,MAAc,CAAC,wBAAwB,GAAG,GAAS,EAAE;gBACpD,UAAU,CAAC,GAAG,EAAE;oBACd,8CAA8C;oBAC9C,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 } 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<RecaptchaWidget>;\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<RecaptchaWidget> {\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 (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 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"]}
@@ -22,6 +22,7 @@ export class RecaptchaWidget {
22
22
  // just reset it and execute it again
23
23
  this.finishExecution();
24
24
  }
25
+ this.isExecuting = true;
25
26
  return new Promise((resolve, reject) => {
26
27
  this.executionSuccessBlock = (token) => {
27
28
  this.finishExecution();
@@ -1 +1 @@
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 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: 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"]}
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: 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"]}
@@ -0,0 +1,24 @@
1
+ /// <reference types="grecaptcha" />
2
+ export declare type MockGrecaptchaMode = 'success' | 'expired' | 'error';
3
+ export declare class MockGrecaptcha implements ReCaptchaV2.ReCaptcha {
4
+ response: string;
5
+ renderCalled: boolean;
6
+ executeCalled: boolean;
7
+ resetCallCount: number;
8
+ getResponseCalled: boolean;
9
+ mode: MockGrecaptchaMode;
10
+ addDelay: boolean;
11
+ callback?: (response: string) => void;
12
+ 'expired-callback'?: () => void;
13
+ 'error-callback'?: () => void;
14
+ render(container: string | HTMLElement, parameters?: ReCaptchaV2.Parameters | undefined, inherit?: boolean | undefined): number;
15
+ reset(opt_widget_id?: number | undefined): void;
16
+ getResponse(opt_widget_id?: number | undefined): string;
17
+ execute(opt_widget_id?: number): void;
18
+ ready(callback: () => void): void;
19
+ private callCallback;
20
+ constructor(options: {
21
+ mode: MockGrecaptchaMode;
22
+ addDelay?: boolean;
23
+ });
24
+ }
@@ -1,99 +1,62 @@
1
- "use strict";
2
- // /* eslint-disable camelcase */
3
- // /* eslint-disable @typescript-eslint/no-explicit-any */
4
- // /* eslint-disable @typescript-eslint/no-unused-vars */
5
- // export enum MockGrecaptchaMode {
6
- // Success,
7
- // Expired,
8
- // Error,
9
- // }
10
- // export class MockGrecaptcha implements ReCaptchaV2.ReCaptcha {
11
- // renderCalled = false;
12
- // executeCalled = false;
13
- // resetCalled = false;
14
- // getResponseCalled = false;
15
- // mode: MockGrecaptchaMode;
16
- // addDelay: boolean;
17
- // callback?: (response: string) => void;
18
- // 'expired-callback'?: () => void;
19
- // 'error-callback'?: () => void;
20
- // render(
21
- // container: string | HTMLElement,
22
- // parameters?: ReCaptchaV2.Parameters | undefined,
23
- // inherit?: boolean | undefined,
24
- // ): number {
25
- // this.callback = parameters?.callback?.bind(this);
26
- // this['error-callback'] = parameters?.['error-callback']?.bind(this);
27
- // this['expired-callback'] = parameters?.['expired-callback']?.bind(this);
28
- // this.renderCalled = true;
29
- // return 1;
30
- // }
31
- // reset(opt_widget_id?: number | undefined): void {
32
- // this.resetCalled = true;
33
- // }
34
- // getResponse(opt_widget_id?: number | undefined): string {
35
- // this.getResponseCalled = true;
36
- // return 'foo';
37
- // }
38
- // // execute(opt_widget_id?: number): void {
39
- // // this.executeCalled = true;
40
- // // if (this.addDelay) {
41
- // // setTimeout(this.callCallback, 100);
42
- // // } else {
43
- // // this.callCallback();
44
- // // }
45
- // // }
46
- // // /**
47
- // // * Programatically invoke the reCAPTCHA check. Used if the invisible reCAPTCHA is on a div instead of a button.
48
- // // * @param siteKey the key of your site
49
- // // * @param action the action
50
- // // *
51
- // // * @return a promise-like object containing the token
52
- // // */
53
- // // async execute(siteKey: string, action: ReCaptchaV2.Action): Promise<string> {
54
- // // return '';
55
- // // }
56
- // // execute(opt_widget_id?: number): void {
57
- // // this.executeCalled = true;
58
- // // if (this.addDelay) {
59
- // // setTimeout(this.callCallback, 100);
60
- // // } else {
61
- // // this.callCallback();
62
- // // }
63
- // // }
64
- // // execute(opt_widget_id?: number): void {
65
- // // }
66
- // // async execute(siteKey: string, action: ReCaptchaV2.Action): PromiseLike<string> {
67
- // // return '';
68
- // // }
69
- // // async execute(siteKey?: any, action?: any): void | PromiseLike<string> {
70
- // // }
71
- // ready(callback: () => void): void {
72
- // }
73
- // private callCallback(): void {
74
- // switch (this.mode) {
75
- // case MockGrecaptchaMode.Success:
76
- // if (this.callback) {
77
- // this.callback('foo');
78
- // }
79
- // break;
80
- // case MockGrecaptchaMode.Error:
81
- // if (this['error-callback']) {
82
- // this['error-callback']();
83
- // }
84
- // break;
85
- // case MockGrecaptchaMode.Expired:
86
- // if (this['expired-callback']) {
87
- // this['expired-callback']();
88
- // }
89
- // break;
90
- // default:
91
- // break;
92
- // }
93
- // }
94
- // constructor(mode: MockGrecaptchaMode, addDelay = false) {
95
- // this.mode = mode;
96
- // this.addDelay = addDelay;
97
- // }
98
- // }
1
+ /* eslint-disable camelcase */
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ /* eslint-disable @typescript-eslint/no-unused-vars */
4
+ 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
+ render(container, parameters, inherit) {
16
+ var _a, _b, _c;
17
+ this.callback = (_a = parameters === null || parameters === void 0 ? void 0 : parameters.callback) === null || _a === void 0 ? void 0 : _a.bind(this);
18
+ this['error-callback'] = (_b = parameters === null || parameters === void 0 ? void 0 : parameters['error-callback']) === null || _b === void 0 ? void 0 : _b.bind(this);
19
+ this['expired-callback'] = (_c = parameters === null || parameters === void 0 ? void 0 : parameters['expired-callback']) === null || _c === void 0 ? void 0 : _c.bind(this);
20
+ this.renderCalled = true;
21
+ return 1;
22
+ }
23
+ reset(opt_widget_id) {
24
+ this.resetCallCount += 1;
25
+ }
26
+ getResponse(opt_widget_id) {
27
+ this.getResponseCalled = true;
28
+ return 'foo';
29
+ }
30
+ execute(opt_widget_id) {
31
+ this.executeCalled = true;
32
+ if (this.addDelay) {
33
+ setTimeout(this.callCallback.bind(this), 100);
34
+ }
35
+ else {
36
+ this.callCallback();
37
+ }
38
+ }
39
+ ready(callback) { }
40
+ callCallback() {
41
+ switch (this.mode) {
42
+ case 'success':
43
+ if (this.callback) {
44
+ this.callback('foo');
45
+ }
46
+ break;
47
+ case 'error':
48
+ if (this['error-callback']) {
49
+ this['error-callback']();
50
+ }
51
+ break;
52
+ case 'expired':
53
+ if (this['expired-callback']) {
54
+ this['expired-callback']();
55
+ }
56
+ break;
57
+ default:
58
+ break;
59
+ }
60
+ }
61
+ }
99
62
  //# sourceMappingURL=mock-grecaptcha.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-grecaptcha.js","sourceRoot":"","sources":["../../test/mock-grecaptcha.ts"],"names":[],"mappings":";AAAA,iCAAiC;AACjC,0DAA0D;AAC1D,yDAAyD;AAEzD,mCAAmC;AACnC,aAAa;AACb,aAAa;AACb,WAAW;AACX,IAAI;AAEJ,iEAAiE;AACjE,0BAA0B;AAE1B,2BAA2B;AAE3B,yBAAyB;AAEzB,+BAA+B;AAE/B,8BAA8B;AAE9B,uBAAuB;AAEvB,2CAA2C;AAE3C,qCAAqC;AAErC,mCAAmC;AAEnC,YAAY;AACZ,uCAAuC;AACvC,uDAAuD;AACvD,qCAAqC;AACrC,gBAAgB;AAChB,wDAAwD;AACxD,2EAA2E;AAC3E,+EAA+E;AAC/E,gCAAgC;AAChC,gBAAgB;AAChB,MAAM;AAEN,sDAAsD;AACtD,+BAA+B;AAC/B,MAAM;AAEN,8DAA8D;AAC9D,qCAAqC;AACrC,oBAAoB;AACpB,MAAM;AAEN,+CAA+C;AAC/C,oCAAoC;AAEpC,8BAA8B;AAC9B,+CAA+C;AAC/C,kBAAkB;AAClB,gCAAgC;AAChC,WAAW;AACX,SAAS;AACT,WAAW;AACX,uHAAuH;AACvH,8CAA8C;AAC9C,mCAAmC;AACnC,UAAU;AACV,6DAA6D;AAC7D,WAAW;AAEX,qFAAqF;AACrF,oBAAoB;AACpB,SAAS;AAET,+CAA+C;AAC/C,oCAAoC;AAEpC,8BAA8B;AAC9B,+CAA+C;AAC/C,kBAAkB;AAClB,gCAAgC;AAChC,WAAW;AACX,SAAS;AAET,+CAA+C;AAE/C,SAAS;AAET,yFAAyF;AACzF,oBAAoB;AACpB,SAAS;AAET,gFAAgF;AAEhF,SAAS;AAET,wCAAwC;AAExC,MAAM;AAEN,mCAAmC;AACnC,2BAA2B;AAC3B,yCAAyC;AACzC,+BAA+B;AAC/B,kCAAkC;AAClC,YAAY;AACZ,iBAAiB;AACjB,uCAAuC;AACvC,wCAAwC;AACxC,sCAAsC;AACtC,YAAY;AACZ,iBAAiB;AACjB,yCAAyC;AACzC,0CAA0C;AAC1C,wCAAwC;AACxC,YAAY;AACZ,iBAAiB;AACjB,iBAAiB;AACjB,iBAAiB;AACjB,QAAQ;AACR,MAAM;AAEN,8DAA8D;AAC9D,wBAAwB;AACxB,gCAAgC;AAChC,MAAM;AACN,IAAI","sourcesContent":["// /* eslint-disable camelcase */\n// /* eslint-disable @typescript-eslint/no-explicit-any */\n// /* eslint-disable @typescript-eslint/no-unused-vars */\n\n// export enum MockGrecaptchaMode {\n// Success,\n// Expired,\n// Error,\n// }\n\n// export class MockGrecaptcha implements ReCaptchaV2.ReCaptcha {\n// renderCalled = false;\n\n// executeCalled = false;\n\n// resetCalled = false;\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.resetCalled = true;\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, 100);\n// // } else {\n// // this.callCallback();\n// // }\n// // }\n// // /**\n// // * Programatically invoke the reCAPTCHA check. Used if the invisible reCAPTCHA is on a div instead of a button.\n// // * @param siteKey the key of your site\n// // * @param action the action\n// // *\n// // * @return a promise-like object containing the token\n// // */\n\n// // async execute(siteKey: string, action: ReCaptchaV2.Action): Promise<string> {\n// // return '';\n// // }\n\n// // execute(opt_widget_id?: number): void {\n// // this.executeCalled = true;\n\n// // if (this.addDelay) {\n// // setTimeout(this.callCallback, 100);\n// // } else {\n// // this.callCallback();\n// // }\n// // }\n\n// // execute(opt_widget_id?: number): void {\n\n// // }\n\n// // async execute(siteKey: string, action: ReCaptchaV2.Action): PromiseLike<string> {\n// // return '';\n// // }\n\n// // async execute(siteKey?: any, action?: any): void | PromiseLike<string> {\n\n// // }\n\n// ready(callback: () => void): void {\n\n// }\n\n// private callCallback(): void {\n// switch (this.mode) {\n// case MockGrecaptchaMode.Success:\n// if (this.callback) {\n// this.callback('foo');\n// }\n// break;\n// case MockGrecaptchaMode.Error:\n// if (this['error-callback']) {\n// this['error-callback']();\n// }\n// break;\n// case MockGrecaptchaMode.Expired:\n// if (this['expired-callback']) {\n// this['expired-callback']();\n// }\n// break;\n// default:\n// break;\n// }\n// }\n\n// constructor(mode: MockGrecaptchaMode, addDelay = false) {\n// this.mode = mode;\n// this.addDelay = addDelay;\n// }\n// }\n"]}
1
+ {"version":3,"file":"mock-grecaptcha.js","sourceRoot":"","sources":["../../test/mock-grecaptcha.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,uDAAuD;AACvD,sDAAsD;AAItD,MAAM,OAAO,cAAc;IA4EzB,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;IA1DD,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;YACjB,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;SAC/C;aAAM;YACL,IAAI,CAAC,YAAY,EAAE,CAAC;SACrB;IACH,CAAC;IAED,KAAK,CAAC,QAAoB,IAAS,CAAC;IAE5B,YAAY;QAClB,QAAQ,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,SAAS;gBACZ,IAAI,IAAI,CAAC,QAAQ,EAAE;oBACjB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;iBACtB;gBACD,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE;oBAC1B,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC;iBAC1B;gBACD,MAAM;YACR,KAAK,SAAS;gBACZ,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE;oBAC5B,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC;iBAC5B;gBACD,MAAM;YACR;gBACE,MAAM;SACT;IACH,CAAC;CAMF","sourcesContent":["/* eslint-disable camelcase */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* 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"]}
@@ -0,0 +1,15 @@
1
+ import { BundleType, LazyLoaderServiceEvents, LazyLoaderServiceInterface } from '@internetarchive/lazy-loader-service';
2
+ import { Unsubscribe } from 'nanoevents';
3
+ export declare class MockLazyLoaderService implements LazyLoaderServiceInterface {
4
+ loadScriptSrc?: string;
5
+ on<E extends keyof LazyLoaderServiceEvents>(event: E, callback: LazyLoaderServiceEvents[E]): Unsubscribe;
6
+ loadBundle(bundle: {
7
+ module?: string;
8
+ nomodule?: string;
9
+ }): Promise<void>;
10
+ loadScript(options: {
11
+ src: string;
12
+ bundleType?: BundleType;
13
+ attributes?: Record<string, string>;
14
+ }): Promise<void>;
15
+ }
@@ -0,0 +1,17 @@
1
+ import { MockGrecaptcha } from './mock-grecaptcha';
2
+ export class MockLazyLoaderService {
3
+ on(event, callback) {
4
+ throw new Error('Method not implemented.');
5
+ }
6
+ async loadBundle(bundle) {
7
+ console.debug('loadBundle', bundle);
8
+ }
9
+ async loadScript(options) {
10
+ this.loadScriptSrc = options.src;
11
+ window.grecaptcha = new MockGrecaptcha({
12
+ mode: 'success',
13
+ });
14
+ window.grecaptchaLoadedCallback();
15
+ }
16
+ }
17
+ //# sourceMappingURL=mock-lazy-loader.js.map
@@ -0,0 +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;QACF,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 (window as any).grecaptchaLoadedCallback();\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ export {};