@multiplatform.one/gpg 6.0.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 (58) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cjs/GpgButton.cjs +56 -0
  3. package/dist/cjs/GpgButton.native.js +78 -0
  4. package/dist/cjs/GpgButton.native.js.map +1 -0
  5. package/dist/cjs/GpgContext.cjs +37 -0
  6. package/dist/cjs/GpgContext.native.js +40 -0
  7. package/dist/cjs/GpgContext.native.js.map +1 -0
  8. package/dist/cjs/GpgProvider.cjs +112 -0
  9. package/dist/cjs/GpgProvider.native.js +127 -0
  10. package/dist/cjs/GpgProvider.native.js.map +1 -0
  11. package/dist/cjs/SignInWithGpg.cjs +132 -0
  12. package/dist/cjs/SignInWithGpg.native.js +159 -0
  13. package/dist/cjs/SignInWithGpg.native.js.map +1 -0
  14. package/dist/cjs/index.cjs +54 -0
  15. package/dist/cjs/index.native.js +57 -0
  16. package/dist/cjs/index.native.js.map +1 -0
  17. package/dist/cjs/screens.cjs +70 -0
  18. package/dist/cjs/screens.native.js +79 -0
  19. package/dist/cjs/screens.native.js.map +1 -0
  20. package/dist/cjs/useGpg.cjs +70 -0
  21. package/dist/cjs/useGpg.native.js +77 -0
  22. package/dist/cjs/useGpg.native.js.map +1 -0
  23. package/dist/esm/GpgButton.mjs +30 -0
  24. package/dist/esm/GpgButton.mjs.map +1 -0
  25. package/dist/esm/GpgButton.native.js +38 -0
  26. package/dist/esm/GpgButton.native.js.map +1 -0
  27. package/dist/esm/GpgContext.mjs +11 -0
  28. package/dist/esm/GpgContext.mjs.map +1 -0
  29. package/dist/esm/GpgContext.native.js +11 -0
  30. package/dist/esm/GpgContext.native.js.map +1 -0
  31. package/dist/esm/GpgProvider.mjs +86 -0
  32. package/dist/esm/GpgProvider.mjs.map +1 -0
  33. package/dist/esm/GpgProvider.native.js +98 -0
  34. package/dist/esm/GpgProvider.native.js.map +1 -0
  35. package/dist/esm/SignInWithGpg.mjs +107 -0
  36. package/dist/esm/SignInWithGpg.mjs.map +1 -0
  37. package/dist/esm/SignInWithGpg.native.js +120 -0
  38. package/dist/esm/SignInWithGpg.native.js.map +1 -0
  39. package/dist/esm/index.mjs +8 -0
  40. package/dist/esm/index.mjs.map +1 -0
  41. package/dist/esm/index.native.js +8 -0
  42. package/dist/esm/index.native.js.map +1 -0
  43. package/dist/esm/screens.mjs +32 -0
  44. package/dist/esm/screens.mjs.map +1 -0
  45. package/dist/esm/screens.native.js +38 -0
  46. package/dist/esm/screens.native.js.map +1 -0
  47. package/dist/esm/useGpg.mjs +45 -0
  48. package/dist/esm/useGpg.mjs.map +1 -0
  49. package/dist/esm/useGpg.native.js +49 -0
  50. package/dist/esm/useGpg.native.js.map +1 -0
  51. package/package.json +73 -0
  52. package/src/GpgButton.tsx +37 -0
  53. package/src/GpgContext.tsx +49 -0
  54. package/src/GpgProvider.tsx +126 -0
  55. package/src/SignInWithGpg.tsx +101 -0
  56. package/src/index.ts +14 -0
  57. package/src/screens.tsx +50 -0
  58. package/src/useGpg.ts +57 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var useGpg_exports = {};
26
+ __export(useGpg_exports, {
27
+ useGpg: () => useGpg
28
+ });
29
+ module.exports = __toCommonJS(useGpg_exports);
30
+ var import_react = require("react");
31
+ var import_GpgContext = require("./GpgContext.native.js");
32
+ var useGpg = function useGpg2() {
33
+ var gpg = (0, import_react.useContext)(import_GpgContext.GpgContext);
34
+ if (!gpg) {
35
+ return {
36
+ message: null,
37
+ command: null,
38
+ status: import_GpgContext.GpgStatusState.ERROR,
39
+ error: new Error("useGpg hook must be inside a GpgProvider."),
40
+ isLoading: false,
41
+ isSuccess: false,
42
+ isError: true,
43
+ isReady: false,
44
+ signIn: function signIn2() {
45
+ return Promise.reject();
46
+ },
47
+ reset: function reset() {}
48
+ };
49
+ }
50
+ var {
51
+ nonce,
52
+ message,
53
+ command,
54
+ status,
55
+ signIn,
56
+ resetStatus
57
+ } = gpg;
58
+ var isLoading = status === import_GpgContext.GpgStatusState.LOADING || nonce.isLoading;
59
+ var isSuccess = status === import_GpgContext.GpgStatusState.SUCCESS;
60
+ var isError = status === import_GpgContext.GpgStatusState.ERROR;
61
+ var isReady = !!message && !isLoading;
62
+ return {
63
+ message,
64
+ command,
65
+ status,
66
+ error: nonce.error,
67
+ isLoading,
68
+ isSuccess,
69
+ isError,
70
+ isReady,
71
+ signIn,
72
+ reset: function reset() {
73
+ return resetStatus();
74
+ }
75
+ };
76
+ };
77
+ //# sourceMappingURL=useGpg.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","useGpg_exports","__export","useGpg","module","exports","import_react","require","import_GpgContext","useGpg2","gpg","useContext","GpgContext","message","command","status","GpgStatusState","ERROR","error","Error","isLoading","isSuccess","isError","isReady","signIn","signIn2","Promise","reject","reset","nonce","resetStatus","LOADING","SUCCESS"],"sources":["../../src/useGpg.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,cAAA;AAAAC,QAAA,CAAAD,cAAA;EAAAE,MAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAAAT,YAA2B,CAAAK,cAAA;AAC3B,IAAAK,YAAA,GAAAC,OAA2C;AAoBpC,IAAAC,iBAAsC,GAAAD,OAAA;AAC3C,IAAAJ,MAAM,YAAMM,QAAA;EACZ,IAAIC,GAAC,GAAK,IAAAJ,YAAA,CAAAK,UAAA,EAAAH,iBAAA,CAAAI,UAAA;EACR,KAAAF,GAAA,EAAO;IAAA,OACL;MACAG,OAAA,EAAS;MACTC,OAAA,EAAQ;MACRC,MAAA,EAAOP,iBAAU,CAAAQ,cAAA,CAAAC,KAAA;MACjBC,KAAA,MAAWC,KAAA;MACXC,SAAA,EAAW;MACXC,SAAS;MACTC,OAAA,EAAS;MACTC,OAAA,EAAQ,KAAM;MACdC,MAAA,EAAO,SAAMC,QAAA;QAAC,OAAAC,OAAA,CAAAC,MAAA;MAChB;MACFC,KAAA,WAAAA,MAAA,GAEA;IACA;EACA;EACA;IAAMC,KAAA;IAAAhB,OAAU;IAAAC,OAAW;IAAAC,MAAA;IAAAS,MAAA;IAAAM;EAAA,CAAe,GAAApB,GAAA;EAC1C,IAAAU,SAAM,GAAUL,MAAE,KAAAP,iBAAY,CAAAQ,cAAA,CAAAe,OAAA,IAAAF,KAAA,CAAAT,SAAA;EAE9B,IAAAC,SAAO,GAAAN,MAAA,KAAAP,iBAAA,CAAAQ,cAAA,CAAAgB,OAAA;EAAA,IACLV,OAAA,GAAAP,MAAA,KAAAP,iBAAA,CAAAQ,cAAA,CAAAC,KAAA;EAAA,IACAM,OAAA,KAAAV,OAAA,KAAAO,SAAA;EAAA,OACA;IACAP,OAAO;IACPC,OAAA;IACAC,MAAA;IACAG,KAAA,EAAAW,KAAA,CAAAX,KAAA;IACAE,SAAA;IACAC,SAAA;IACAC,OAAO;IACTC,OAAA;IACFC,MAAA","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ import { Button, ResetContainer, useModal } from "@multiplatform.one/connectkit";
2
+ import { jsx } from "react/jsx-runtime";
3
+ const GPGButton = ({
4
+ children
5
+ }) => {
6
+ const {
7
+ openScreen
8
+ } = useModal();
9
+ return /* @__PURE__ */jsx(Button, {
10
+ style: {
11
+ margin: 0
12
+ },
13
+ arrow: true,
14
+ onClick: e => {
15
+ e?.preventDefault?.();
16
+ openScreen("signInWithGpg");
17
+ },
18
+ children: children ?? "Sign in with GPG"
19
+ }, "button");
20
+ };
21
+ const GPGButtonComponent = ({
22
+ ...props
23
+ }) => /* @__PURE__ */jsx(ResetContainer, {
24
+ children: /* @__PURE__ */jsx(GPGButton, {
25
+ ...props
26
+ })
27
+ });
28
+ var GpgButton_default = GPGButtonComponent;
29
+ export { GPGButton, GpgButton_default as default };
30
+ //# sourceMappingURL=GpgButton.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Button","ResetContainer","useModal","jsx","GPGButton","children","openScreen","style","margin","arrow","onClick","e","preventDefault","GPGButtonComponent","props","GpgButton_default"],"sources":["../../src/GpgButton.tsx"],"sourcesContent":[null],"mappings":"AACA,SAASA,MAAA,EAAQC,cAAA,EAAgBC,QAAA,QAAgB;AAc7C,SAAAC,GAAA;AALG,MAAMC,SAAA,GAAmCA,CAAC;EAAEC;AAAS,MAAM;EAGhE,MAAM;IAAEC;EAAW,IAAIJ,QAAA,CAAS;EAChC,OACE,eAAAC,GAAA,CAACH,MAAA;IAECO,KAAA,EAAO;MAAEC,MAAA,EAAQ;IAAE;IACnBC,KAAA,EAAK;IAGLC,OAAA,EAAUC,CAAA,IAAwC;MAChDA,CAAA,EAAGC,cAAA,GAAiB;MACpBN,UAAA,CAAW,eAAe;IAC5B;IAECD,QAAA,EAAAA,QAAA,IAAY;EAAA,GAVT,QAWN;AAEJ;AAEA,MAAMQ,kBAAA,GAA4CA,CAAC;EAAE,GAAGC;AAAM,MAC5D,eAAAX,GAAA,CAACF,cAAA;EACCI,QAAA,iBAAAF,GAAA,CAACC,SAAA;IAAW,GAAGU;EAAA,CAAO;AAAA,CACxB;AAEF,IAAOC,iBAAA,GAAQF,kBAAA","ignoreList":[]}
@@ -0,0 +1,38 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import React from "react";
3
+ import { Button, ResetContainer, useModal } from "@multiplatform.one/connectkit";
4
+ var GPGButton = function GPGButton2(param) {
5
+ var {
6
+ children
7
+ } = param;
8
+ var {
9
+ openScreen
10
+ } = useModal();
11
+ return /* @__PURE__ */_jsx(Button, {
12
+ style: {
13
+ margin: 0
14
+ },
15
+ arrow: true,
16
+ // preventDefault so we never submit a surrounding host <form> (e.g. keycloak's
17
+ // login form) — the underlying styled button can render as type=submit.
18
+ onClick: function onClick(e) {
19
+ var _e_preventDefault;
20
+ e === null || e === void 0 ? void 0 : (_e_preventDefault = e.preventDefault) === null || _e_preventDefault === void 0 ? void 0 : _e_preventDefault.call(e);
21
+ openScreen("signInWithGpg");
22
+ },
23
+ children: children !== null && children !== void 0 ? children : "Sign in with GPG"
24
+ }, "button");
25
+ };
26
+ var GPGButtonComponent = function GPGButtonComponent2(param) {
27
+ var {
28
+ ...props
29
+ } = param;
30
+ return /* @__PURE__ */_jsx(ResetContainer, {
31
+ children: /* @__PURE__ */_jsx(GPGButton, {
32
+ ...props
33
+ })
34
+ });
35
+ };
36
+ var GpgButton_default = GPGButtonComponent;
37
+ export { GPGButton, GpgButton_default as default };
38
+ //# sourceMappingURL=GpgButton.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["jsx","_jsx","React","Button","ResetContainer","useModal","GPGButton","GPGButton2","param","children","openScreen","style","margin","arrow","onClick","e","_e_preventDefault","preventDefault","call"],"sources":["../../src/GpgButton.tsx"],"sourcesContent":[null],"mappings":"AACA,SAASA,GAAA,IAAAC,IAAQ,2BAAgB;AAc7B,OAAAC,KAAA;AALG,SAAMC,MAAA,EAAAC,cAA+C,EAAAC,QAAM;AAGhE,IAAAC,SAAQ,YAAeC,UAASA,CAAAC,KAAA;EAChC;IAAAC;EACE,IAAAD,KAAA;EAAA,IAAC;IAAAE;EAAA,IAAAL,QAAA;EAAA,sBAAAJ,IAAA,CAAAE,MAAA;IAAAQ,KAEC;MACAC,MAAA,EAAK;IAAA;IAIHC,KAAA,EAAG;IACH;IAA0B;IAC5BC,OAEC,WAAAA,OAAYA,CAAAC,CAAA;MAAA,IAAAC,iBAAA;MAVTD,CAAA,aAAAA,CAAA,wBAAAC,iBAAA,GAAAD,CAAA,CAAAE,cAAA,cAAAD,iBAAA,uBAAAA,iBAAA,CAAAE,IAAA,CAAAH,CAAA;MAWNL,UAAA;IAEJ;IAEAD,QAAM,EAAAA,QAAA,KAA4C,IAAG,IAAGA,QAAM,KAC5D,SAAAA,QAAC;EAIH,GAAO","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import { createContext } from "react";
2
+ var GpgStatusState = /* @__PURE__ */(GpgStatusState2 => {
3
+ GpgStatusState2["READY"] = "ready";
4
+ GpgStatusState2["LOADING"] = "loading";
5
+ GpgStatusState2["SUCCESS"] = "success";
6
+ GpgStatusState2["ERROR"] = "error";
7
+ return GpgStatusState2;
8
+ })(GpgStatusState || {});
9
+ const GpgContext = createContext(null);
10
+ export { GpgContext, GpgStatusState };
11
+ //# sourceMappingURL=GpgContext.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","GpgStatusState","GpgStatusState2","GpgContext"],"sources":["../../src/GpgContext.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,aAAA,QAAqB;AAQvB,IAAKC,cAAA,GAAL,gBAAKC,eAAA,IAAL;EACLA,eAAA,YAAQ;EACRA,eAAA,cAAU;EACVA,eAAA,cAAU;EACVA,eAAA,YAAQ;EAJE,OAAAA,eAAA;AAAA,GAAAD,cAAA;AAwCL,MAAME,UAAA,GAAaH,aAAA,CAAsC,IAAI","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import { createContext } from "react";
2
+ var GpgStatusState = /* @__PURE__ */function (GpgStatusState2) {
3
+ GpgStatusState2["READY"] = "ready";
4
+ GpgStatusState2["LOADING"] = "loading";
5
+ GpgStatusState2["SUCCESS"] = "success";
6
+ GpgStatusState2["ERROR"] = "error";
7
+ return GpgStatusState2;
8
+ }({});
9
+ var GpgContext = /* @__PURE__ */createContext(null);
10
+ export { GpgContext, GpgStatusState };
11
+ //# sourceMappingURL=GpgContext.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","GpgStatusState","GpgStatusState2","GpgContext"],"sources":["../../src/GpgContext.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAASA,aAAA,QAAqB;AAQvB,IAAKC,cAAA,GAAL,yBAAKC,eAAL;EACLA,eAAA,YAAQ;EACRA,eAAA,cAAU;EACVA,eAAA,cAAU;EACVA,eAAA,YAAQ;EAJE,OAAAA,eAAA;AAAA;AAwCL,IAAAC,UAAM,kBAAmDH,aAAI","ignoreList":[]}
@@ -0,0 +1,86 @@
1
+ import { useContext, useMemo, useState } from "react";
2
+ import { useQuery } from "@tanstack/react-query";
3
+ import { Context as ConnectKitContext } from "@multiplatform.one/connectkit";
4
+ import { GpgContext, GpgStatusState } from "./GpgContext.mjs";
5
+ import { jsx } from "react/jsx-runtime";
6
+ const GPG_NONCE_QUERY_KEY = "ckGpgNonce";
7
+ const b64 = s => window.btoa(unescape(encodeURIComponent(s)));
8
+ function defaultBuildMessage({
9
+ nonce
10
+ }) {
11
+ return `${window.location.host} wants you to sign in with your GPG key.
12
+
13
+ URI: ${window.location.origin}
14
+ Version: 1
15
+ Nonce: ${nonce}
16
+ Issued At: ${(/* @__PURE__ */new Date()).toISOString()}`;
17
+ }
18
+ const GpgProvider = ({
19
+ children,
20
+ enabled = true,
21
+ nonceRefetchInterval = 1e3 * 60 * 5,
22
+ buildMessage,
23
+ onSignIn,
24
+ ...gpgConfig
25
+ }) => {
26
+ const [status, setStatus] = useState(GpgStatusState.READY);
27
+ const resetStatus = () => setStatus(GpgStatusState.READY);
28
+ if (useContext(GpgContext)) {
29
+ throw new Error("Multiple, nested usages of GpgProvider detected. Please use only one.");
30
+ }
31
+ if (useContext(ConnectKitContext)) {
32
+ throw new Error("ConnectKitProvider must be mounted inside GpgProvider.");
33
+ }
34
+ const nonce = useQuery({
35
+ queryKey: [GPG_NONCE_QUERY_KEY],
36
+ queryFn: () => gpgConfig.getNonce(),
37
+ refetchInterval: nonceRefetchInterval
38
+ });
39
+ const message = useMemo(() => nonce.data ? (buildMessage ?? defaultBuildMessage)({
40
+ nonce: nonce.data
41
+ }) : null, [nonce.data, buildMessage]);
42
+ const command = useMemo(() => message ? `{ printf %s '${message}' | gpg --detach-sign --armor; gpg --armor --export; }` : null, [message]);
43
+ const signIn = async pastedBlob => {
44
+ const blob = pastedBlob.trim();
45
+ if (!blob.includes("-----BEGIN PGP SIGNATURE-----") || !blob.includes("-----BEGIN PGP PUBLIC KEY BLOCK-----")) {
46
+ setStatus(GpgStatusState.ERROR);
47
+ throw new Error("Paste the FULL output \u2014 it must contain both a PGP SIGNATURE and a PUBLIC KEY block.");
48
+ }
49
+ if (!message) {
50
+ setStatus(GpgStatusState.ERROR);
51
+ throw new Error("Could not fetch nonce");
52
+ }
53
+ try {
54
+ setStatus(GpgStatusState.LOADING);
55
+ const result = await gpgConfig.onSign({
56
+ username: b64(blob),
57
+ password: b64(message),
58
+ message
59
+ });
60
+ if (result === false) throw new Error("GPG sign-in was rejected");
61
+ setStatus(GpgStatusState.SUCCESS);
62
+ onSignIn?.();
63
+ return true;
64
+ } catch (error) {
65
+ setStatus(GpgStatusState.ERROR);
66
+ throw error;
67
+ }
68
+ };
69
+ return /* @__PURE__ */jsx(GpgContext.Provider, {
70
+ value: {
71
+ enabled,
72
+ nonceRefetchInterval,
73
+ buildMessage,
74
+ ...gpgConfig,
75
+ nonce,
76
+ message,
77
+ command,
78
+ status,
79
+ signIn,
80
+ resetStatus
81
+ },
82
+ children
83
+ });
84
+ };
85
+ export { GPG_NONCE_QUERY_KEY, GpgProvider };
86
+ //# sourceMappingURL=GpgProvider.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useContext","useMemo","useState","useQuery","Context","ConnectKitContext","GpgContext","GpgStatusState","jsx","GPG_NONCE_QUERY_KEY","b64","s","window","btoa","unescape","encodeURIComponent","defaultBuildMessage","nonce","location","host","origin","Date","toISOString","GpgProvider","children","enabled","nonceRefetchInterval","buildMessage","onSignIn","gpgConfig","status","setStatus","READY","resetStatus","Error","queryKey","queryFn","getNonce","refetchInterval","message","data","command","signIn","pastedBlob","blob","trim","includes","ERROR","LOADING","result","onSign","username","password","SUCCESS","error","Provider","value"],"sources":["../../src/GpgProvider.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAAoBA,UAAA,EAAYC,OAAA,EAASC,QAAA,QAAgB;AACzD,SAASC,QAAA,QAAgB;AAEzB,SAASC,OAAA,IAAWC,iBAAA,QAAyB;AAC7C,SAASC,UAAA,EAAuBC,cAAA,QAAsB;AAwGlD,SAAAC,GAAA;AAjGG,MAAMC,mBAAA,GAAsB;AAInC,MAAMC,GAAA,GAAOC,CAAA,IAAcC,MAAA,CAAOC,IAAA,CAAKC,QAAA,CAASC,kBAAA,CAAmBJ,CAAC,CAAC,CAAC;AAItE,SAASK,oBAAoB;EAAEC;AAAM,GAA8B;EACjE,OACE,GAAGL,MAAA,CAAOM,QAAA,CAASC,IAAI;AAAA;AAAA,OACfP,MAAA,CAAOM,QAAA,CAASE,MAAM;AAAA;AAAA,SAEpBH,KAAK;AAAA,cACD,mBAAII,IAAA,CAAK,GAAEC,WAAA,CAAY,CAAC;AAE1C;AAEO,MAAMC,WAAA,GAAcA,CAAC;EAC1BC,QAAA;EACAC,OAAA,GAAU;EACVC,oBAAA,GAAuB,MAAO,KAAK;EACnCC,YAAA;EACAC,QAAA;EACA,GAAGC;AACL,MAAa;EACX,MAAM,CAACC,MAAA,EAAQC,SAAS,IAAI7B,QAAA,CAAyBK,cAAA,CAAeyB,KAAK;EACzE,MAAMC,WAAA,GAAcA,CAAA,KAAMF,SAAA,CAAUxB,cAAA,CAAeyB,KAAK;EAIxD,IAAIhC,UAAA,CAAWM,UAAU,GAAG;IAC1B,MAAM,IAAI4B,KAAA,CAAM,uEAAuE;EACzF;EACA,IAAIlC,UAAA,CAAWK,iBAAiB,GAAG;IACjC,MAAM,IAAI6B,KAAA,CAAM,wDAAwD;EAC1E;EAEA,MAAMjB,KAAA,GAAQd,QAAA,CAAS;IACrBgC,QAAA,EAAU,CAAC1B,mBAAmB;IAC9B2B,OAAA,EAASA,CAAA,KAAMP,SAAA,CAAUQ,QAAA,CAAS;IAClCC,eAAA,EAAiBZ;EACnB,CAAC;EAKD,MAAMa,OAAA,GAAUtC,OAAA,CACd,MAAOgB,KAAA,CAAMuB,IAAA,IAAQb,YAAA,IAAgBX,mBAAA,EAAqB;IAAEC,KAAA,EAAOA,KAAA,CAAMuB;EAAK,CAAC,IAAI,MACnF,CAACvB,KAAA,CAAMuB,IAAA,EAAMb,YAAY,CAC3B;EAIA,MAAMc,OAAA,GAAUxC,OAAA,CACd,MACEsC,OAAA,GACI,gBAAgBA,OAAO,2DACvB,MACN,CAACA,OAAO,CACV;EAEA,MAAMG,MAAA,GAAS,MAAOC,UAAA,IAAyC;IAC7D,MAAMC,IAAA,GAAOD,UAAA,CAAWE,IAAA,CAAK;IAC7B,IACE,CAACD,IAAA,CAAKE,QAAA,CAAS,+BAA+B,KAC9C,CAACF,IAAA,CAAKE,QAAA,CAAS,sCAAsC,GACrD;MACAf,SAAA,CAAUxB,cAAA,CAAewC,KAAK;MAC9B,MAAM,IAAIb,KAAA,CACR,2FACF;IACF;IACA,IAAI,CAACK,OAAA,EAAS;MACZR,SAAA,CAAUxB,cAAA,CAAewC,KAAK;MAC9B,MAAM,IAAIb,KAAA,CAAM,uBAAuB;IACzC;IACA,IAAI;MACFH,SAAA,CAAUxB,cAAA,CAAeyC,OAAO;MAEhC,MAAMC,MAAA,GAAS,MAAMpB,SAAA,CAAUqB,MAAA,CAAO;QACpCC,QAAA,EAAUzC,GAAA,CAAIkC,IAAI;QAClBQ,QAAA,EAAU1C,GAAA,CAAI6B,OAAO;QACrBA;MACF,CAAC;MAED,IAAIU,MAAA,KAAW,OAAO,MAAM,IAAIf,KAAA,CAAM,0BAA0B;MAChEH,SAAA,CAAUxB,cAAA,CAAe8C,OAAO;MAChCzB,QAAA,GAAW;MACX,OAAO;IACT,SAAS0B,KAAA,EAAO;MACdvB,SAAA,CAAUxB,cAAA,CAAewC,KAAK;MAC9B,MAAMO,KAAA;IACR;EACF;EAEA,OACE,eAAA9C,GAAA,CAACF,UAAA,CAAWiD,QAAA,EAAX;IACCC,KAAA,EAAO;MACL/B,OAAA;MACAC,oBAAA;MACAC,YAAA;MACA,GAAGE,SAAA;MACHZ,KAAA;MACAsB,OAAA;MACAE,OAAA;MACAX,MAAA;MACAY,MAAA;MACAT;IACF;IAECT;EAAA,CACH;AAEJ","ignoreList":[]}
@@ -0,0 +1,98 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useContext, useMemo, useState } from "react";
3
+ import { useQuery } from "@tanstack/react-query";
4
+ import { Context as ConnectKitContext } from "@multiplatform.one/connectkit";
5
+ import { GpgContext, GpgStatusState } from "./GpgContext.native.js";
6
+ var GPG_NONCE_QUERY_KEY = "ckGpgNonce";
7
+ var b64 = function b642(s) {
8
+ return window.btoa(unescape(encodeURIComponent(s)));
9
+ };
10
+ function defaultBuildMessage(param) {
11
+ var {
12
+ nonce
13
+ } = param;
14
+ return `${window.location.host} wants you to sign in with your GPG key.
15
+
16
+ URI: ${window.location.origin}
17
+ Version: 1
18
+ Nonce: ${nonce}
19
+ Issued At: ${(/* @__PURE__ */new Date()).toISOString()}`;
20
+ }
21
+ var GpgProvider = function GpgProvider2(param) {
22
+ var {
23
+ children,
24
+ enabled = true,
25
+ nonceRefetchInterval = 1e3 * 60 * 5,
26
+ buildMessage,
27
+ onSignIn,
28
+ ...gpgConfig
29
+ } = param;
30
+ var [status, setStatus] = useState(GpgStatusState.READY);
31
+ var resetStatus = function resetStatus2() {
32
+ return setStatus(GpgStatusState.READY);
33
+ };
34
+ if (useContext(GpgContext)) {
35
+ throw new Error("Multiple, nested usages of GpgProvider detected. Please use only one.");
36
+ }
37
+ if (useContext(ConnectKitContext)) {
38
+ throw new Error("ConnectKitProvider must be mounted inside GpgProvider.");
39
+ }
40
+ var nonce = useQuery({
41
+ queryKey: [GPG_NONCE_QUERY_KEY],
42
+ queryFn: function queryFn() {
43
+ return gpgConfig.getNonce();
44
+ },
45
+ refetchInterval: nonceRefetchInterval
46
+ });
47
+ var message = useMemo(function () {
48
+ return nonce.data ? (buildMessage !== null && buildMessage !== void 0 ? buildMessage : defaultBuildMessage)({
49
+ nonce: nonce.data
50
+ }) : null;
51
+ }, [nonce.data, buildMessage]);
52
+ var command = useMemo(function () {
53
+ return message ? `{ printf %s '${message}' | gpg --detach-sign --armor; gpg --armor --export; }` : null;
54
+ }, [message]);
55
+ var signIn = async function signIn2(pastedBlob) {
56
+ var blob = pastedBlob.trim();
57
+ if (!blob.includes("-----BEGIN PGP SIGNATURE-----") || !blob.includes("-----BEGIN PGP PUBLIC KEY BLOCK-----")) {
58
+ setStatus(GpgStatusState.ERROR);
59
+ throw new Error("Paste the FULL output \u2014 it must contain both a PGP SIGNATURE and a PUBLIC KEY block.");
60
+ }
61
+ if (!message) {
62
+ setStatus(GpgStatusState.ERROR);
63
+ throw new Error("Could not fetch nonce");
64
+ }
65
+ try {
66
+ setStatus(GpgStatusState.LOADING);
67
+ var result = await gpgConfig.onSign({
68
+ username: b64(blob),
69
+ password: b64(message),
70
+ message
71
+ });
72
+ if (result === false) throw new Error("GPG sign-in was rejected");
73
+ setStatus(GpgStatusState.SUCCESS);
74
+ onSignIn === null || onSignIn === void 0 ? void 0 : onSignIn();
75
+ return true;
76
+ } catch (error) {
77
+ setStatus(GpgStatusState.ERROR);
78
+ throw error;
79
+ }
80
+ };
81
+ return /* @__PURE__ */_jsx(GpgContext.Provider, {
82
+ value: {
83
+ enabled,
84
+ nonceRefetchInterval,
85
+ buildMessage,
86
+ ...gpgConfig,
87
+ nonce,
88
+ message,
89
+ command,
90
+ status,
91
+ signIn,
92
+ resetStatus
93
+ },
94
+ children
95
+ });
96
+ };
97
+ export { GPG_NONCE_QUERY_KEY, GpgProvider };
98
+ //# sourceMappingURL=GpgProvider.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["jsx","_jsx","useContext","useMemo","useState","useQuery","Context","ConnectKitContext","GpgContext","GpgStatusState","GPG_NONCE_QUERY_KEY","b64","b642","s","window","btoa","unescape","encodeURIComponent","defaultBuildMessage","param","nonce","location","host","origin","Date","toISOString","GpgProvider","GpgProvider2","children","enabled","nonceRefetchInterval","buildMessage","onSignIn","gpgConfig","status","setStatus","READY","resetStatus","resetStatus2","Error","queryKey","queryFn","getNonce","refetchInterval","message","data","command","signIn","signIn2","pastedBlob","blob","trim","includes","ERROR","LOADING","result","onSign","username","password","SUCCESS","error","Provider","value"],"sources":["../../src/GpgProvider.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,107 @@
1
+ import { useState } from "react";
2
+ import { useContext, PageContent, ModalBody, ModalContent, Button, CopyToClipboard } from "@multiplatform.one/connectkit";
3
+ import { useGpg } from "./useGpg.mjs";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ const textarea = {
6
+ width: "100%",
7
+ boxSizing: "border-box",
8
+ fontFamily: "var(--ck-font-family, monospace)",
9
+ fontSize: 11,
10
+ lineHeight: 1.4,
11
+ padding: 8,
12
+ borderRadius: "var(--ck-primary-button-border-radius, 12px)",
13
+ border: "1px solid var(--ck-body-divider, #d3d3d3)",
14
+ background: "var(--ck-body-background-secondary, #f6f7f9)",
15
+ color: "var(--ck-body-color, inherit)",
16
+ resize: "vertical"
17
+ };
18
+ const label = {
19
+ textAlign: "left",
20
+ fontSize: 14,
21
+ fontWeight: 500,
22
+ margin: "4px 0"
23
+ };
24
+ const SignInWithGpg = () => {
25
+ const context = useContext();
26
+ const {
27
+ message,
28
+ command,
29
+ signIn,
30
+ isLoading,
31
+ isReady
32
+ } = useGpg();
33
+ const [pasted, setPasted] = useState("");
34
+ const [error, setError] = useState(null);
35
+ const [busy, setBusy] = useState(false);
36
+ const onSubmit = async () => {
37
+ setError(null);
38
+ setBusy(true);
39
+ try {
40
+ await signIn(pasted);
41
+ setTimeout(() => context.setOpen(false), 1e3);
42
+ } catch (e) {
43
+ setError(e instanceof Error ? e.message : "GPG sign-in failed");
44
+ setBusy(false);
45
+ }
46
+ };
47
+ return /* @__PURE__ */jsx(PageContent, {
48
+ style: {
49
+ width: 320
50
+ },
51
+ children: /* @__PURE__ */jsxs(ModalContent, {
52
+ style: {
53
+ paddingBottom: 8,
54
+ gap: 6
55
+ },
56
+ children: [/* @__PURE__ */jsx(ModalBody, {
57
+ style: label,
58
+ children: "1. Sign the challenge in your terminal:"
59
+ }), /* @__PURE__ */jsxs("div", {
60
+ style: {
61
+ display: "flex",
62
+ flexDirection: "column",
63
+ gap: 6
64
+ },
65
+ children: [/* @__PURE__ */jsx(CopyToClipboard, {
66
+ variant: "button",
67
+ string: command ?? "",
68
+ children: "Copy gpg command"
69
+ }), /* @__PURE__ */jsx(CopyToClipboard, {
70
+ variant: "button",
71
+ string: message ?? "",
72
+ children: "Copy message only"
73
+ })]
74
+ }), /* @__PURE__ */jsx("textarea", {
75
+ readOnly: true,
76
+ rows: 4,
77
+ value: message ?? (isLoading ? "Loading challenge\u2026" : ""),
78
+ style: textarea
79
+ }), /* @__PURE__ */jsx(ModalBody, {
80
+ style: label,
81
+ children: "2. Paste the full output below:"
82
+ }), /* @__PURE__ */jsx("textarea", {
83
+ rows: 6,
84
+ value: pasted,
85
+ onChange: e => setPasted(e.target.value),
86
+ placeholder: "-----BEGIN PGP SIGNATURE----- \u2026 and your -----BEGIN PGP PUBLIC KEY BLOCK-----",
87
+ style: textarea
88
+ }), /* @__PURE__ */jsx(Button, {
89
+ onClick: onSubmit,
90
+ disabled: !isReady || !pasted || busy,
91
+ waiting: busy,
92
+ arrow: true,
93
+ children: "Sign in"
94
+ }), error && /* @__PURE__ */jsx(ModalBody, {
95
+ style: {
96
+ color: "var(--ck-body-color-danger, #c9190b)",
97
+ fontSize: 13,
98
+ textAlign: "left"
99
+ },
100
+ children: error
101
+ })]
102
+ })
103
+ });
104
+ };
105
+ var SignInWithGpg_default = SignInWithGpg;
106
+ export { SignInWithGpg_default as default };
107
+ //# sourceMappingURL=SignInWithGpg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useState","useContext","PageContent","ModalBody","ModalContent","Button","CopyToClipboard","useGpg","jsx","jsxs","textarea","width","boxSizing","fontFamily","fontSize","lineHeight","padding","borderRadius","border","background","color","resize","label","textAlign","fontWeight","margin","SignInWithGpg","context","message","command","signIn","isLoading","isReady","pasted","setPasted","error","setError","busy","setBusy","onSubmit","setTimeout","setOpen","e","Error","style","children","paddingBottom","gap","display","flexDirection","variant","string","readOnly","rows","value","onChange","target","placeholder","onClick","disabled","waiting","arrow","SignInWithGpg_default"],"sources":["../../src/SignInWithGpg.tsx"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,120 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState } from "react";
3
+ import { useContext, PageContent, ModalBody, ModalContent, Button, CopyToClipboard } from "@multiplatform.one/connectkit";
4
+ import { useGpg } from "./useGpg.native.js";
5
+ function _instanceof(left, right) {
6
+ "@swc/helpers - instanceof";
7
+
8
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
9
+ return !!right[Symbol.hasInstance](left);
10
+ } else {
11
+ return left instanceof right;
12
+ }
13
+ }
14
+ var textarea = {
15
+ width: "100%",
16
+ boxSizing: "border-box",
17
+ fontFamily: "var(--ck-font-family, monospace)",
18
+ fontSize: 11,
19
+ lineHeight: 1.4,
20
+ padding: 8,
21
+ borderRadius: "var(--ck-primary-button-border-radius, 12px)",
22
+ border: "1px solid var(--ck-body-divider, #d3d3d3)",
23
+ background: "var(--ck-body-background-secondary, #f6f7f9)",
24
+ color: "var(--ck-body-color, inherit)",
25
+ resize: "vertical"
26
+ };
27
+ var label = {
28
+ textAlign: "left",
29
+ fontSize: 14,
30
+ fontWeight: 500,
31
+ margin: "4px 0"
32
+ };
33
+ var SignInWithGpg = function SignInWithGpg2() {
34
+ var context = useContext();
35
+ var {
36
+ message,
37
+ command,
38
+ signIn,
39
+ isLoading,
40
+ isReady
41
+ } = useGpg();
42
+ var [pasted, setPasted] = useState("");
43
+ var [error, setError] = useState(null);
44
+ var [busy, setBusy] = useState(false);
45
+ var onSubmit = async function onSubmit2() {
46
+ setError(null);
47
+ setBusy(true);
48
+ try {
49
+ await signIn(pasted);
50
+ setTimeout(function () {
51
+ return context.setOpen(false);
52
+ }, 1e3);
53
+ } catch (e) {
54
+ setError(_instanceof(e, Error) ? e.message : "GPG sign-in failed");
55
+ setBusy(false);
56
+ }
57
+ };
58
+ return /* @__PURE__ */_jsx(PageContent, {
59
+ style: {
60
+ width: 320
61
+ },
62
+ children: /* @__PURE__ */_jsxs(ModalContent, {
63
+ style: {
64
+ paddingBottom: 8,
65
+ gap: 6
66
+ },
67
+ children: [/* @__PURE__ */_jsx(ModalBody, {
68
+ style: label,
69
+ children: "1. Sign the challenge in your terminal:"
70
+ }), /* @__PURE__ */_jsxs("div", {
71
+ style: {
72
+ display: "flex",
73
+ flexDirection: "column",
74
+ gap: 6
75
+ },
76
+ children: [/* @__PURE__ */_jsx(CopyToClipboard, {
77
+ variant: "button",
78
+ string: command !== null && command !== void 0 ? command : "",
79
+ children: "Copy gpg command"
80
+ }), /* @__PURE__ */_jsx(CopyToClipboard, {
81
+ variant: "button",
82
+ string: message !== null && message !== void 0 ? message : "",
83
+ children: "Copy message only"
84
+ })]
85
+ }), /* @__PURE__ */_jsx("textarea", {
86
+ readOnly: true,
87
+ rows: 4,
88
+ value: message !== null && message !== void 0 ? message : isLoading ? "Loading challenge\u2026" : "",
89
+ style: textarea
90
+ }), /* @__PURE__ */_jsx(ModalBody, {
91
+ style: label,
92
+ children: "2. Paste the full output below:"
93
+ }), /* @__PURE__ */_jsx("textarea", {
94
+ rows: 6,
95
+ value: pasted,
96
+ onChange: function onChange(e) {
97
+ return setPasted(e.target.value);
98
+ },
99
+ placeholder: "-----BEGIN PGP SIGNATURE----- \u2026 and your -----BEGIN PGP PUBLIC KEY BLOCK-----",
100
+ style: textarea
101
+ }), /* @__PURE__ */_jsx(Button, {
102
+ onClick: onSubmit,
103
+ disabled: !isReady || !pasted || busy,
104
+ waiting: busy,
105
+ arrow: true,
106
+ children: "Sign in"
107
+ }), error && /* @__PURE__ */_jsx(ModalBody, {
108
+ style: {
109
+ color: "var(--ck-body-color-danger, #c9190b)",
110
+ fontSize: 13,
111
+ textAlign: "left"
112
+ },
113
+ children: error
114
+ })]
115
+ })
116
+ });
117
+ };
118
+ var SignInWithGpg_default = SignInWithGpg;
119
+ export { SignInWithGpg_default as default };
120
+ //# sourceMappingURL=SignInWithGpg.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["jsx","_jsx","jsxs","_jsxs","React","useState","useContext","PageContent","ModalBody","ModalContent","Button","CopyToClipboard","useGpg","_instanceof","left","right","Symbol","hasInstance","textarea","width","boxSizing","fontFamily","fontSize","lineHeight","padding","borderRadius","border","background","color","resize","label","textAlign","fontWeight","margin","SignInWithGpg","SignInWithGpg2","context","message","command","signIn","isLoading","isReady","pasted","setPasted","error","setError","busy","setBusy","onSubmit","onSubmit2","setTimeout","setOpen","e","Error","style","children","paddingBottom","gap","display","flexDirection","variant","string","readOnly","rows","value"],"sources":["../../src/SignInWithGpg.tsx"],"sourcesContent":[null],"mappings":"AAAA,SAA+BA,GAAA,IAAAC,IAAA,EAAAC,IAAgB,IAAAC,KAAA;AAE/C,OAAAC,KAAA,IAAAC,QAAA;AAAA,SACEC,UAAA,EAAAC,WAAA,EAAAC,SAAA,EAAAC,YAAA,EAAAC,MAAA,EAAAC,eAAA;AAAA,SACAC,MAAA;AAAA,SACAC,YAAAC,IAAA,EAAAC,KAAA;EACA;;EACA,IAAAA,KAAA,mBAAAC,MAAA,oBAAAD,KAAA,CAAAC,MAAA,CAAAC,WAAA;IACA,SAAAF,KAAA,CAAAC,MAAA,CAAAC,WAAA,EAAAH,IAAA;EAAA,OACK;IACP,OAASA,IAAA,YAAcC,KAAA;EAgDf;AA3CR;AAAgC,IAC9BG,QAAO;EACPC,KAAA,QAAW;EACXC,SAAA,cAAY;EACZC,UAAU;EACVC,QAAA,IAAY;EACZC,UAAS;EACTC,OAAA;EACAC,YAAQ;EACRC,MAAA,6CAAY;EACZC,UAAO;EACPC,KAAA,iCAAQ;EACVC,MAAA;AACA;AAA6B,IAC3BC,KAAA;EACAC,SAAA,EAAU;EACVT,QAAA,IAAY;EACZU,UAAQ;EACVC,MAAA;AAEA;AACE,IAAAC,aAAM,GAAU,SAAWC,eAAA;EAC3B,IAAAC,OAAQ,GAAA9B,UAAS,EAAS;EAC1B;IAAM+B,OAAC;IAAQC,OAAA;IAASC,MAAI;IAAAC,SAAW;IAAAC;EAAA,IAAA7B,MAAA;EACvC,KAAA8B,MAAO,EAAAC,SAAe,IAAItC,QAAA,CAAwB;EAClD,KAAAuC,KAAO,EAAAC,QAAa,IAAIxC,QAAA,CAAS,KAAK;EAEtC,KAAAyC,IAAM,EAAAC,OAAW,IAAA1C,QAAY;EAC3B,IAAA2C,QAAS,GAAI,eAAAC,UAAA;IACbJ,QAAQ,KAAI;IACZE,OAAI;IACF;MAEA,MAAAR,MAAW,CAAAG,MAAM;MACnBQ,UAAY;QACV,OAASd,OAAA,CAAAe,OAAa,MAAQ;MAC9B;IACF,SAAAC,CAAA;MACFP,QAAA,CAAAhC,WAAA,CAAAuC,CAAA,EAAAC,KAAA,IAAAD,CAAA,CAAAf,OAAA;MAEAU,OACE;IAEI;EAAgE;EAE9D,sBAAA9C,IAAC,CAAAM,WAAA;IAED+C,KACA;MAEAnC,KACF;IACA;IAAAoC,QAAC,iBAAApD,KAAA,CAAAM,YAAA;MAAA6C,KAAA;QACCE,aAAQ;QACRC,GAAA;MAAM;MACgDF,QACtD,EAAO,gBAAAtD,IAAA,CAAAO,SAAA;QACT8C,KAAA,EAAAxB,KAAA;QACAyB,QAAA;MACA,IAAC,eAAApD,KAAA;QAAAmD,KAAA;UACCI,OAAM;UACNC,aAAO;UACPF,GAAA;QACA;QACAF,QAAO,kBAAAtD,IAAA,CAAAU,eAAA;UACTiD,OAAA;UACAC,MAAA,EAAAvB,OAAC,KAAO,QAAAA,OAAS,KAAU,SAAUA,OAAC,KAAW;UAI/CiB,QAAA;QAAC,mBAAAtD,IAAA,CAAAU,eAAA;UACCiD,OAAO;UACLC,MAAO,EAAAxB,OAAA,aAAAA,OAAA,cAAAA,OAAA;UACPkB,QAAU;QACV;MAGD,mBAAAtD,IAAA;QACH6D,QAAA;QAGNC,IAAA;QAEJC,KAAA,EAAA3B,OAAA,aAAAA,OAAA,cAAAA,OAAA,GAAAG,SAAA;QAEOc,KAAA,EAAApC","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ import { useGpg } from "./useGpg.mjs";
2
+ import { GpgProvider, GPG_NONCE_QUERY_KEY } from "./GpgProvider.mjs";
3
+ import { GpgContext, GpgStatusState } from "./GpgContext.mjs";
4
+ import { default as default2 } from "./SignInWithGpg.mjs";
5
+ import { default as default3, GPGButton } from "./GpgButton.mjs";
6
+ import { gpgScreen, GpgScreenRegistrar, GpgBridge } from "./screens.mjs";
7
+ export { GPGButton, GPG_NONCE_QUERY_KEY, GpgBridge, GpgContext, GpgProvider, GpgScreenRegistrar, GpgStatusState, default2 as SignInWithGpg, default3 as SignInWithGpgButton, gpgScreen, useGpg };
8
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useGpg","GpgProvider","GPG_NONCE_QUERY_KEY","GpgContext","GpgStatusState","default","default2","default3","GPGButton","gpgScreen","GpgScreenRegistrar","GpgBridge"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAKA,SAASA,MAAA,QAAc;AACvB,SAASC,WAAA,EAAaC,mBAAA,QAA2B;AACjD,SAASC,UAAA,EAAYC,cAAA,QAAsB;AAG3C,SAAoBC,OAAA,IAAXC,QAAA,QAAgC;AACzC,SAAoBD,OAAA,IAAXE,QAAA,EAAgCC,SAAA,QAAiB;AAE1D,SAASC,SAAA,EAAWC,kBAAA,EAAoBC,SAAA,QAAiB","ignoreList":[]}