@prosopo/procaptcha-wrapper 2.6.102 → 2.6.104

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 (46) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +11 -9
  2. package/.turbo/turbo-build$colon$tsc.log +9 -9
  3. package/.turbo/turbo-build.log +13 -10
  4. package/CHANGELOG.md +48 -0
  5. package/dist/_virtual/_rolldown/runtime.js +3 -0
  6. package/dist/cjs/index.cjs +5 -7
  7. package/dist/cjs/render/renderFunction.cjs +34 -31
  8. package/dist/cjs/render/renderer.cjs +16 -19
  9. package/dist/index.d.ts +2 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +7 -8
  12. package/dist/render/renderFunction.d.ts +1 -0
  13. package/dist/render/renderFunction.d.ts.map +1 -1
  14. package/dist/render/renderFunction.js +34 -32
  15. package/dist/render/renderFunction.js.map +1 -1
  16. package/dist/render/renderer.d.ts +3 -3
  17. package/dist/render/renderer.d.ts.map +1 -1
  18. package/dist/render/renderer.js +16 -19
  19. package/dist/render/renderer.js.map +1 -1
  20. package/dist/tests/index.unit.test.d.ts +2 -0
  21. package/dist/tests/index.unit.test.d.ts.map +1 -0
  22. package/dist/tests/index.unit.test.js +26 -0
  23. package/dist/tests/index.unit.test.js.map +1 -0
  24. package/dist/tests/renderFunction.unit.test.d.ts +2 -0
  25. package/dist/tests/renderFunction.unit.test.d.ts.map +1 -0
  26. package/dist/tests/renderFunction.unit.test.js +186 -0
  27. package/dist/tests/renderFunction.unit.test.js.map +1 -0
  28. package/dist/tests/renderer.test-d.d.ts +2 -0
  29. package/dist/tests/renderer.test-d.d.ts.map +1 -0
  30. package/dist/tests/renderer.test-d.js +92 -0
  31. package/dist/tests/renderer.test-d.js.map +1 -0
  32. package/dist/tests/renderer.unit.test.d.ts +2 -0
  33. package/dist/tests/renderer.unit.test.d.ts.map +1 -0
  34. package/dist/tests/renderer.unit.test.js +207 -0
  35. package/dist/tests/renderer.unit.test.js.map +1 -0
  36. package/package.json +15 -6
  37. package/src/index.ts +7 -1
  38. package/src/render/renderFunction.ts +13 -3
  39. package/src/render/renderer.ts +21 -7
  40. package/src/tests/index.unit.test.ts +47 -0
  41. package/src/tests/renderFunction.unit.test.ts +275 -0
  42. package/src/tests/renderer.test-d.ts +175 -0
  43. package/src/tests/renderer.unit.test.ts +331 -0
  44. package/tsconfig.tsbuildinfo +1 -1
  45. package/vite.test.config.ts +39 -0
  46. package/.turbo/turbo-typecheck.log +0 -4
@@ -1,5 +1,5 @@
1
1
 
2
- > @prosopo/procaptcha-wrapper@2.6.102 build:cjs
2
+ > @prosopo/procaptcha-wrapper@2.6.104 build:cjs
3
3
  > NODE_ENV=${NODE_ENV:-development}; vite build --config vite.cjs.config.ts --mode $NODE_ENV
4
4
 
5
5
  ViteCommonJSConfig: .
@@ -19,13 +19,15 @@ ViteCommonJSConfig: .
19
19
  '@prosopo/util-crypto'
20
20
  ]
21
21
  }
22
- vite v6.4.1 building SSR bundle for production...
22
+ The plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the resolve.tsconfigPaths option. You can remove the plugin and set resolve.tsconfigPaths: true in your Vite config instead.
23
+ vite v8.1.5 building ssr environment for production...
23
24
  Bundle build started
24
- transforming...
25
- Build end
26
- ✓ 3 modules transformed.
25
+ 
26
+ ✓ 4 modules transformed.
27
27
  rendering chunks...
28
- dist/cjs/index.cjs 0.38 kB
29
- dist/cjs/render/renderer.cjs 0.69 kB
30
- dist/cjs/render/renderFunction.cjs 1.00 kB
31
- ✓ built in 126ms
28
+ computing gzip size...
29
+ dist/cjs/index.cjs 0.32 kB │ gzip: 0.22 kB
30
+ dist/cjs/render/renderer.cjs 0.60 kB │ gzip: 0.30 kB
31
+ dist/cjs/render/renderFunction.cjs 1.07 kB │ gzip: 0.52 kB
32
+
33
+ ✓ built in 58ms
@@ -1,8 +1,8 @@
1
1
 
2
- > @prosopo/procaptcha-wrapper@2.6.102 build:tsc
2
+ > @prosopo/procaptcha-wrapper@2.6.104 build:tsc
3
3
  > tsc --build --verbose
4
4
 
5
- 12:16:59 PM - Projects in this build:
5
+ 8:58:57 PM - Projects in this build:
6
6
  * ../../dev/config/tsconfig.json
7
7
  * ../locale/tsconfig.json
8
8
  * ../util/tsconfig.json
@@ -10,17 +10,17 @@
10
10
  * ../types/tsconfig.json
11
11
  * tsconfig.json
12
12
 
13
- 12:16:59 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/index.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
13
+ 8:58:57 PM - Project '../../dev/config/tsconfig.json' is up to date because newest input '../../dev/config/src/webpack/webpack.config.ts' is older than output '../../dev/config/tsconfig.tsbuildinfo'
14
14
 
15
- 12:16:59 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
15
+ 8:58:58 PM - Project '../locale/tsconfig.json' is up to date because newest input '../locale/src/translationKey.ts' is older than output '../locale/tsconfig.tsbuildinfo'
16
16
 
17
- 12:16:59 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
17
+ 8:58:58 PM - Project '../util/tsconfig.json' is up to date because newest input '../util/src/url.ts' is older than output '../util/tsconfig.tsbuildinfo'
18
18
 
19
- 12:16:59 PM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
19
+ 8:58:58 PM - Project '../util-crypto/tsconfig.json' is up to date because newest input '../util-crypto/src/types.ts' is older than output '../util-crypto/tsconfig.tsbuildinfo'
20
20
 
21
- 12:16:59 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/provider/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
21
+ 8:58:58 PM - Project '../types/tsconfig.json' is up to date because newest input '../types/src/provider/api.ts' is older than output '../types/tsconfig.tsbuildinfo'
22
22
 
23
- 12:16:59 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
23
+ 8:58:58 PM - Project 'tsconfig.json' is out of date because output file 'tsconfig.tsbuildinfo' does not exist
24
24
 
25
- 12:16:59 PM - Building project '/home/runner/work/captcha/captcha/packages/procaptcha-wrapper/tsconfig.json'...
25
+ 8:58:58 PM - Building project '/home/runner/work/captcha/captcha/packages/procaptcha-wrapper/tsconfig.json'...
26
26
 
@@ -1,9 +1,9 @@
1
1
 
2
- > @prosopo/procaptcha-wrapper@2.6.102 build
2
+ > @prosopo/procaptcha-wrapper@2.6.104 build
3
3
  > npm run build:cross-env -- --mode ${NODE_ENV:-development}
4
4
 
5
5
 
6
- > @prosopo/procaptcha-wrapper@2.6.102 build:cross-env
6
+ > @prosopo/procaptcha-wrapper@2.6.104 build:cross-env
7
7
  > vite build --config vite.esm.config.ts --mode production
8
8
 
9
9
  ViteEsmConfig: .
@@ -23,13 +23,16 @@ ViteEsmConfig: .
23
23
  '@prosopo/util-crypto'
24
24
  ]
25
25
  }
26
- vite v6.4.1 building SSR bundle for production...
26
+ The plugin "vite-tsconfig-paths" is detected. Vite now supports tsconfig paths resolution natively via the resolve.tsconfigPaths option. You can remove the plugin and set resolve.tsconfigPaths: true in your Vite config instead.
27
+ vite v8.1.5 building ssr environment for production...
27
28
  Bundle build started
28
- transforming...
29
- Build end
30
- ✓ 3 modules transformed.
29
+ 
30
+ ✓ 4 modules transformed.
31
31
  rendering chunks...
32
- dist/index.js 0.27 kB
33
- dist/render/renderer.js 0.57 kB
34
- dist/render/renderFunction.js 0.90 kB
35
- ✓ built in 126ms
32
+ computing gzip size...
33
+ dist/_virtual/_rolldown/runtime.js 0.04 kB │ gzip: 0.06 kB
34
+ dist/index.js 0.29 kB │ gzip: 0.20 kB
35
+ dist/render/renderer.js 0.56 kB │ gzip: 0.29 kB
36
+ dist/render/renderFunction.js 1.03 kB │ gzip: 0.51 kB
37
+
38
+ ✓ built in 57ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,53 @@
1
1
  # @prosopo/procaptcha-wrapper
2
2
 
3
+ ## 2.6.104
4
+ ### Patch Changes
5
+
6
+ - 0e1d1f7: fix(procaptcha-wrapper): export ProcaptchaLanguages as a usable type
7
+
8
+ Writing type tests for this package's public surface exposed a real defect.
9
+ `Languages` in `@prosopo/locale` is a const object, so it carries no type
10
+ meaning of its own — re-exporting the name as `ProcaptchaLanguages` gave
11
+ consumers a binding they could not actually use in a type position. It is now
12
+ the union of the object's values, which is exactly what
13
+ `ProcaptchaRenderOptions["language"]` already accepts, and a type test keeps
14
+ the two aligned.
15
+
16
+ The accompanying type tests pin the rest of the published contract: the
17
+ `RendererFunction` signature (`HTMLElement`, not a bare `Element` — the render
18
+ script reaches for properties only `HTMLElement` has), the optional loader
19
+ override on `createRenderer` that makes the renderer testable without a
20
+ network, and `window.procaptcha` being declared possibly-absent so consumers
21
+ are forced to narrow before reaching for `render`.
22
+ - c79b252: test(procaptcha-wrapper): add unit test suite and fix script-loading defects
23
+
24
+ Adds 37 unit tests covering the renderer and the render-script loader, reaching
25
+ 100% statement, branch, function and line coverage, and wires the package into
26
+ `turbo run test` so it runs in CI.
27
+
28
+ Fixes found while writing them:
29
+
30
+ - Two concurrent `render()` calls both saw an empty cache and each injected a
31
+ script tag for the same id. The in-flight promise is now cached, not just the
32
+ resolved function, so the script loads once.
33
+ - A failed script load left the dead `<script>` tag in the document, so a retry
34
+ appended a second tag carrying a duplicate id.
35
+ - A load failure rejected with the raw DOM `Event`, which carries no message and
36
+ breaks any caller reading `error.message`. It now rejects with an `Error`
37
+ naming the url that failed.
38
+ - Updated dependencies [0e1171c]
39
+ - Updated dependencies [103318c]
40
+ - Updated dependencies [270a8d8]
41
+ - Updated dependencies [e14fce6]
42
+ - @prosopo/locale@3.2.8
43
+ - @prosopo/types@4.10.0
44
+
45
+ ## 2.6.103
46
+ ### Patch Changes
47
+
48
+ - Updated dependencies [a0cb39e]
49
+ - @prosopo/types@4.9.12
50
+
3
51
  ## 2.6.102
4
52
  ### Patch Changes
5
53
 
@@ -0,0 +1,3 @@
1
+ import "node:module";
2
+ //#endregion
3
+ export {};
@@ -1,10 +1,8 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const renderer = require("./render/renderer.cjs");
4
- const renderProcaptcha = renderer.createRenderer({
5
- // @ts-expect-error
6
- scriptUrl: "https://js.prosopo.io/js/procaptcha.bundle.js",
7
- // @ts-expect-error
8
- scriptId: "procaptcha-bundle"
2
+ //#region src/index.ts
3
+ var renderProcaptcha = require("./render/renderer.cjs").createRenderer({
4
+ scriptUrl: "https://js.prosopo.io/js/procaptcha.bundle.js",
5
+ scriptId: "procaptcha-bundle"
9
6
  });
7
+ //#endregion
10
8
  exports.renderProcaptcha = renderProcaptcha;
@@ -1,35 +1,38 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const loadRenderFunction = async (scriptUrl, scriptId) => {
4
- await loadScript(scriptUrl, {
5
- id: scriptId,
6
- type: "module",
7
- async: true,
8
- defer: true
9
- });
10
- if (void 0 === window.procaptcha?.render) {
11
- throw new Error("Render script does not contain the render function");
12
- }
13
- return window.procaptcha.render;
1
+ //#region src/render/renderFunction.ts
2
+ var loadRenderFunction = async (scriptUrl, scriptId) => {
3
+ await loadScript(scriptUrl, {
4
+ id: scriptId,
5
+ type: "module",
6
+ async: true,
7
+ defer: true
8
+ });
9
+ if (void 0 === window.procaptcha?.render) {
10
+ document.getElementById(scriptId)?.remove();
11
+ throw new Error("Render script does not contain the render function");
12
+ }
13
+ return window.procaptcha.render;
14
14
  };
15
- const loadScript = async (url, attributes) => {
16
- const scriptTag = document.createElement("script");
17
- const scriptAttributes = {
18
- src: url,
19
- ...attributes
20
- };
21
- Object.assign(scriptTag, scriptAttributes);
22
- await insertScriptTag(document.head, scriptTag);
15
+ var loadScript = async (url, attributes) => {
16
+ const scriptTag = document.createElement("script");
17
+ const scriptAttributes = {
18
+ src: url,
19
+ ...attributes
20
+ };
21
+ Object.assign(scriptTag, scriptAttributes);
22
+ await insertScriptTag(document.head, scriptTag);
23
23
  };
24
- const insertScriptTag = async (target, scriptTag) => {
25
- return new Promise((resolve, reject) => {
26
- scriptTag.onload = () => {
27
- resolve();
28
- };
29
- scriptTag.onerror = (event) => {
30
- reject(event);
31
- };
32
- target.appendChild(scriptTag);
33
- });
24
+ var insertScriptTag = async (target, scriptTag) => {
25
+ return new Promise((resolve, reject) => {
26
+ scriptTag.onload = () => {
27
+ resolve();
28
+ };
29
+ scriptTag.onerror = () => {
30
+ scriptTag.remove();
31
+ reject(/* @__PURE__ */ new Error(`Failed to load script: ${scriptTag.src}`));
32
+ };
33
+ target.appendChild(scriptTag);
34
+ });
34
35
  };
36
+ //#endregion
35
37
  exports.loadRenderFunction = loadRenderFunction;
38
+ exports.loadScript = loadScript;
@@ -1,21 +1,18 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const renderFunction = require("./renderFunction.cjs");
4
- const createRenderer = (settings) => {
5
- let renderFunction$1;
6
- const getRenderFunction = async () => {
7
- if (!renderFunction$1) {
8
- renderFunction$1 = await renderFunction.loadRenderFunction(
9
- settings.scriptUrl,
10
- settings.scriptId
11
- );
12
- }
13
- return renderFunction$1;
14
- };
15
- return async (element, options) => {
16
- const renderOptions = Object.assign({}, options);
17
- const renderFunction2 = await getRenderFunction();
18
- await renderFunction2(element, renderOptions);
19
- };
1
+ const require_renderFunction = require("./renderFunction.cjs");
2
+ //#region src/render/renderer.ts
3
+ var createRenderer = (settings, load = require_renderFunction.loadRenderFunction) => {
4
+ let pending;
5
+ const getRenderFunction = async () => {
6
+ if (!pending) pending = load(settings.scriptUrl, settings.scriptId).catch((error) => {
7
+ pending = void 0;
8
+ throw error;
9
+ });
10
+ return pending;
11
+ };
12
+ return async (element, options) => {
13
+ const renderOptions = Object.assign({}, options);
14
+ await (await getRenderFunction())(element, renderOptions);
15
+ };
20
16
  };
17
+ //#endregion
21
18
  exports.createRenderer = createRenderer;
package/dist/index.d.ts CHANGED
@@ -2,5 +2,6 @@ import type { Languages } from "@prosopo/locale";
2
2
  import type { CaptchaType, ProcaptchaRenderOptions } from "@prosopo/types";
3
3
  import type { RendererFunction } from "./render/renderFunction.js";
4
4
  export declare const renderProcaptcha: RendererFunction;
5
- export type { ProcaptchaRenderOptions, CaptchaType as ProcaptchaType, Languages as ProcaptchaLanguages, };
5
+ type ProcaptchaLanguages = (typeof Languages)[keyof typeof Languages];
6
+ export type { ProcaptchaRenderOptions, CaptchaType as ProcaptchaType, ProcaptchaLanguages, };
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,eAAO,MAAM,gBAAgB,EAAE,gBAK7B,CAAC;AAEH,YAAY,EACX,uBAAuB,EACvB,WAAW,IAAI,cAAc,EAC7B,SAAS,IAAI,mBAAmB,GAChC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,eAAO,MAAM,gBAAgB,EAAE,gBAK7B,CAAC;AAMH,KAAK,mBAAmB,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEtE,YAAY,EACX,uBAAuB,EACvB,WAAW,IAAI,cAAc,EAC7B,mBAAmB,GACnB,CAAC"}
package/dist/index.js CHANGED
@@ -1,10 +1,9 @@
1
+ import "./_virtual/_rolldown/runtime.js";
1
2
  import { createRenderer } from "./render/renderer.js";
2
- const renderProcaptcha = createRenderer({
3
- // @ts-expect-error
4
- scriptUrl: "https://js.prosopo.io/js/procaptcha.bundle.js",
5
- // @ts-expect-error
6
- scriptId: "procaptcha-bundle"
3
+ //#region src/index.ts
4
+ var renderProcaptcha = createRenderer({
5
+ scriptUrl: "https://js.prosopo.io/js/procaptcha.bundle.js",
6
+ scriptId: "procaptcha-bundle"
7
7
  });
8
- export {
9
- renderProcaptcha
10
- };
8
+ //#endregion
9
+ export { renderProcaptcha };
@@ -1,6 +1,7 @@
1
1
  import type { ProcaptchaRenderOptions } from "@prosopo/types";
2
2
  export type RendererFunction = (element: HTMLElement, options: ProcaptchaRenderOptions) => Promise<void>;
3
3
  export declare const loadRenderFunction: (scriptUrl: string, scriptId: string) => Promise<RendererFunction>;
4
+ export declare const loadScript: (url: string, attributes?: Partial<HTMLScriptElement>) => Promise<void>;
4
5
  declare global {
5
6
  interface Window {
6
7
  procaptcha: {
@@ -1 +1 @@
1
- {"version":3,"file":"renderFunction.d.ts","sourceRoot":"","sources":["../../src/render/renderFunction.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,CAC9B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,uBAAuB,KAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,eAAO,MAAM,kBAAkB,cACnB,MAAM,YACP,MAAM,KACd,OAAO,CAAC,gBAAgB,CAa1B,CAAC;AAmCF,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,UAAU,EACP;YACA,MAAM,EAAE,gBAAgB,CAAC;SACxB,GACD,SAAS,CAAC;KACb;CACD"}
1
+ {"version":3,"file":"renderFunction.d.ts","sourceRoot":"","sources":["../../src/render/renderFunction.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GAAG,CAC9B,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,uBAAuB,KAC5B,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,eAAO,MAAM,kBAAkB,cACnB,MAAM,YACP,MAAM,KACd,OAAO,CAAC,gBAAgB,CAiB1B,CAAC;AAEF,eAAO,MAAM,UAAU,QACjB,MAAM,eACE,OAAO,CAAC,iBAAiB,CAAC,KACrC,OAAO,CAAC,IAAI,CAWd,CAAC;AAyBF,OAAO,CAAC,MAAM,CAAC;IACd,UAAU,MAAM;QACf,UAAU,EACP;YACA,MAAM,EAAE,gBAAgB,CAAC;SACxB,GACD,SAAS,CAAC;KACb;CACD"}
@@ -1,35 +1,37 @@
1
- const loadRenderFunction = async (scriptUrl, scriptId) => {
2
- await loadScript(scriptUrl, {
3
- id: scriptId,
4
- type: "module",
5
- async: true,
6
- defer: true
7
- });
8
- if (void 0 === window.procaptcha?.render) {
9
- throw new Error("Render script does not contain the render function");
10
- }
11
- return window.procaptcha.render;
1
+ //#region src/render/renderFunction.ts
2
+ var loadRenderFunction = async (scriptUrl, scriptId) => {
3
+ await loadScript(scriptUrl, {
4
+ id: scriptId,
5
+ type: "module",
6
+ async: true,
7
+ defer: true
8
+ });
9
+ if (void 0 === window.procaptcha?.render) {
10
+ document.getElementById(scriptId)?.remove();
11
+ throw new Error("Render script does not contain the render function");
12
+ }
13
+ return window.procaptcha.render;
12
14
  };
13
- const loadScript = async (url, attributes) => {
14
- const scriptTag = document.createElement("script");
15
- const scriptAttributes = {
16
- src: url,
17
- ...attributes
18
- };
19
- Object.assign(scriptTag, scriptAttributes);
20
- await insertScriptTag(document.head, scriptTag);
15
+ var loadScript = async (url, attributes) => {
16
+ const scriptTag = document.createElement("script");
17
+ const scriptAttributes = {
18
+ src: url,
19
+ ...attributes
20
+ };
21
+ Object.assign(scriptTag, scriptAttributes);
22
+ await insertScriptTag(document.head, scriptTag);
21
23
  };
22
- const insertScriptTag = async (target, scriptTag) => {
23
- return new Promise((resolve, reject) => {
24
- scriptTag.onload = () => {
25
- resolve();
26
- };
27
- scriptTag.onerror = (event) => {
28
- reject(event);
29
- };
30
- target.appendChild(scriptTag);
31
- });
32
- };
33
- export {
34
- loadRenderFunction
24
+ var insertScriptTag = async (target, scriptTag) => {
25
+ return new Promise((resolve, reject) => {
26
+ scriptTag.onload = () => {
27
+ resolve();
28
+ };
29
+ scriptTag.onerror = () => {
30
+ scriptTag.remove();
31
+ reject(/* @__PURE__ */ new Error(`Failed to load script: ${scriptTag.src}`));
32
+ };
33
+ target.appendChild(scriptTag);
34
+ });
35
35
  };
36
+ //#endregion
37
+ export { loadRenderFunction, loadScript };
@@ -1 +1 @@
1
- {"version":3,"file":"renderFunction.js","sourceRoot":"","sources":["../../src/render/renderFunction.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACtC,SAAiB,EACjB,QAAgB,EACY,EAAE;IAC9B,MAAM,UAAU,CAAC,SAAS,EAAE;QAC3B,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,IAAI,SAAS,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,KAAK,EACvB,GAAW,EACX,UAAuC,EACvB,EAAE;IAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEnD,MAAM,gBAAgB,GAA+B;QACpD,GAAG,EAAE,GAAG;QACR,GAAG,UAAU;KACb,CAAC;IAEF,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAE3C,MAAM,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAC5B,MAAmB,EACnB,SAA4B,EACZ,EAAE;IAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE;YACvB,OAAO,EAAE,CAAC;QACX,CAAC,CAAC;QAEF,SAAS,CAAC,OAAO,GAAG,CAAC,KAAqB,EAAE,EAAE;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC;QACf,CAAC,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"renderFunction.js","sourceRoot":"","sources":["../../src/render/renderFunction.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EACtC,SAAiB,EACjB,QAAgB,EACY,EAAE;IAC9B,MAAM,UAAU,CAAC,SAAS,EAAE;QAC3B,EAAE,EAAE,QAAQ;QACZ,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,IAAI;QACX,KAAK,EAAE,IAAI;KACX,CAAC,CAAC;IAEH,IAAI,SAAS,KAAK,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAI7C,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,KAAK,EAC9B,GAAW,EACX,UAAuC,EACvB,EAAE;IAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEnD,MAAM,gBAAgB,GAA+B;QACpD,GAAG,EAAE,GAAG;QACR,GAAG,UAAU;KACb,CAAC;IAEF,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAE3C,MAAM,eAAe,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,KAAK,EAC5B,MAAmB,EACnB,SAA4B,EACZ,EAAE;IAClB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,SAAS,CAAC,MAAM,GAAG,GAAG,EAAE;YACvB,OAAO,EAAE,CAAC;QACX,CAAC,CAAC;QAEF,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;YAIxB,SAAS,CAAC,MAAM,EAAE,CAAC;YAGnB,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { type RendererFunction } from "./renderFunction.js";
2
- interface RendererSettings {
2
+ export interface RendererSettings {
3
3
  scriptUrl: string;
4
4
  scriptId: string;
5
5
  }
6
- export declare const createRenderer: (settings: RendererSettings) => RendererFunction;
7
- export {};
6
+ export type LoadRenderFunction = (scriptUrl: string, scriptId: string) => Promise<RendererFunction>;
7
+ export declare const createRenderer: (settings: RendererSettings, load?: LoadRenderFunction) => RendererFunction;
8
8
  //# sourceMappingURL=renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAEhF,UAAU,gBAAgB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,cAAc,aAChB,gBAAgB,KACxB,gBA0BF,CAAC"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,KAAK,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAEhF,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,MAAM,kBAAkB,GAAG,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,KACZ,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAE/B,eAAO,MAAM,cAAc,aAChB,gBAAgB,SACpB,kBAAkB,KACtB,gBAiCF,CAAC"}
@@ -1,21 +1,18 @@
1
1
  import { loadRenderFunction } from "./renderFunction.js";
2
- const createRenderer = (settings) => {
3
- let renderFunction;
4
- const getRenderFunction = async () => {
5
- if (!renderFunction) {
6
- renderFunction = await loadRenderFunction(
7
- settings.scriptUrl,
8
- settings.scriptId
9
- );
10
- }
11
- return renderFunction;
12
- };
13
- return async (element, options) => {
14
- const renderOptions = Object.assign({}, options);
15
- const renderFunction2 = await getRenderFunction();
16
- await renderFunction2(element, renderOptions);
17
- };
18
- };
19
- export {
20
- createRenderer
2
+ //#region src/render/renderer.ts
3
+ var createRenderer = (settings, load = loadRenderFunction) => {
4
+ let pending;
5
+ const getRenderFunction = async () => {
6
+ if (!pending) pending = load(settings.scriptUrl, settings.scriptId).catch((error) => {
7
+ pending = void 0;
8
+ throw error;
9
+ });
10
+ return pending;
11
+ };
12
+ return async (element, options) => {
13
+ const renderOptions = Object.assign({}, options);
14
+ await (await getRenderFunction())(element, renderOptions);
15
+ };
21
16
  };
17
+ //#endregion
18
+ export { createRenderer };
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AAeA,OAAO,EAAyB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAOhF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,QAA0B,EACP,EAAE;IACrB,IAAI,cAAgC,CAAC;IAErC,MAAM,iBAAiB,GAAG,KAAK,IAA+B,EAAE;QAC/D,IAAI,CAAC,cAAc,EAAE,CAAC;YACrB,cAAc,GAAG,MAAM,kBAAkB,CACxC,QAAQ,CAAC,SAAS,EAClB,QAAQ,CAAC,QAAQ,CACjB,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC;IACvB,CAAC,CAAC;IAEF,OAAO,KAAK,EACX,OAAoB,EACpB,OAAgC,EAChB,EAAE;QAGlB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEjD,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../src/render/renderer.ts"],"names":[],"mappings":"AAeA,OAAO,EAAyB,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAahF,MAAM,CAAC,MAAM,cAAc,GAAG,CAC7B,QAA0B,EAC1B,OAA2B,kBAAkB,EAC1B,EAAE;IAIrB,IAAI,OAA8C,CAAC;IAEnD,MAAM,iBAAiB,GAAG,KAAK,IAA+B,EAAE;QAC/D,IAAI,CAAC,OAAO,EAAE,CAAC;YAGd,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAC1D,CAAC,KAAc,EAAE,EAAE;gBAClB,OAAO,GAAG,SAAS,CAAC;gBACpB,MAAM,KAAK,CAAC;YACb,CAAC,CACD,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,KAAK,EACX,OAAoB,EACpB,OAAgC,EAChB,EAAE;QAGlB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,cAAc,GAAG,MAAM,iBAAiB,EAAE,CAAC;QAEjD,MAAM,cAAc,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC9C,CAAC,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/index.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import { afterEach, describe, expect, it } from "vitest";
2
+ import { renderProcaptcha } from "../index.js";
3
+ afterEach(() => {
4
+ document.head.innerHTML = "";
5
+ document.body.innerHTML = "";
6
+ window.procaptcha = undefined;
7
+ });
8
+ describe("renderProcaptcha", () => {
9
+ it("is exported as a renderer function", () => {
10
+ expect(typeof renderProcaptcha).toBe("function");
11
+ });
12
+ it("does not touch the DOM until it is called", () => {
13
+ expect(document.head.querySelectorAll("script")).toHaveLength(0);
14
+ });
15
+ it("injects the build-time script url on first render", async () => {
16
+ const rendering = renderProcaptcha(document.createElement("div"), {
17
+ siteKey: "site-key",
18
+ });
19
+ await Promise.resolve();
20
+ const script = document.head.querySelector("script");
21
+ expect(script).not.toBeNull();
22
+ script?.dispatchEvent(new Event("error"));
23
+ await expect(rendering).rejects.toThrow("Failed to load script");
24
+ });
25
+ });
26
+ //# sourceMappingURL=index.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.unit.test.js","sourceRoot":"","sources":["../../src/tests/index.unit.test.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,SAAS,CAAC,GAAG,EAAE;IACd,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IAC7B,MAAM,CAAC,UAAU,GAAG,SAAS,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,OAAO,gBAAgB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QAGpD,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE;YACjE,OAAO,EAAE,UAAU;SACnB,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAExB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAE9B,MAAM,EAAE,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC1C,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=renderFunction.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderFunction.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/renderFunction.unit.test.ts"],"names":[],"mappings":""}