@keytrace/runner 0.0.3
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 +139 -0
- package/dist/actions/css-select.d.ts +6 -0
- package/dist/actions/css-select.d.ts.map +1 -0
- package/dist/actions/css-select.js +14 -0
- package/dist/actions/css-select.js.map +1 -0
- package/dist/actions/dns-txt.d.ts +6 -0
- package/dist/actions/dns-txt.d.ts.map +1 -0
- package/dist/actions/dns-txt.js +17 -0
- package/dist/actions/dns-txt.js.map +1 -0
- package/dist/actions/http-get.d.ts +6 -0
- package/dist/actions/http-get.d.ts.map +1 -0
- package/dist/actions/http-get.js +19 -0
- package/dist/actions/http-get.js.map +1 -0
- package/dist/actions/index.d.ts +6 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +6 -0
- package/dist/actions/index.js.map +1 -0
- package/dist/actions/json-path.d.ts +12 -0
- package/dist/actions/json-path.d.ts.map +1 -0
- package/dist/actions/json-path.js +26 -0
- package/dist/actions/json-path.js.map +1 -0
- package/dist/actions/regex-match.d.ts +6 -0
- package/dist/actions/regex-match.d.ts.map +1 -0
- package/dist/actions/regex-match.js +14 -0
- package/dist/actions/regex-match.js.map +1 -0
- package/dist/claim.d.ts +38 -0
- package/dist/claim.d.ts.map +1 -0
- package/dist/claim.js +253 -0
- package/dist/claim.js.map +1 -0
- package/dist/constants.d.ts +17 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +17 -0
- package/dist/constants.js.map +1 -0
- package/dist/expect.d.ts +12 -0
- package/dist/expect.d.ts.map +1 -0
- package/dist/expect.js +33 -0
- package/dist/expect.js.map +1 -0
- package/dist/fetchers/activitypub.d.ts +25 -0
- package/dist/fetchers/activitypub.d.ts.map +1 -0
- package/dist/fetchers/activitypub.js +32 -0
- package/dist/fetchers/activitypub.js.map +1 -0
- package/dist/fetchers/dns.d.ts +21 -0
- package/dist/fetchers/dns.d.ts.map +1 -0
- package/dist/fetchers/dns.js +61 -0
- package/dist/fetchers/dns.js.map +1 -0
- package/dist/fetchers/http.d.ts +10 -0
- package/dist/fetchers/http.d.ts.map +1 -0
- package/dist/fetchers/http.js +30 -0
- package/dist/fetchers/http.js.map +1 -0
- package/dist/fetchers/index.d.ts +16 -0
- package/dist/fetchers/index.d.ts.map +1 -0
- package/dist/fetchers/index.js +22 -0
- package/dist/fetchers/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolate.d.ts +12 -0
- package/dist/interpolate.d.ts.map +1 -0
- package/dist/interpolate.js +23 -0
- package/dist/interpolate.js.map +1 -0
- package/dist/profile.d.ts +42 -0
- package/dist/profile.d.ts.map +1 -0
- package/dist/profile.js +176 -0
- package/dist/profile.js.map +1 -0
- package/dist/recipes/dns-txt.d.ts +9 -0
- package/dist/recipes/dns-txt.d.ts.map +1 -0
- package/dist/recipes/dns-txt.js +45 -0
- package/dist/recipes/dns-txt.js.map +1 -0
- package/dist/recipes/github-gist.d.ts +9 -0
- package/dist/recipes/github-gist.d.ts.map +1 -0
- package/dist/recipes/github-gist.js +52 -0
- package/dist/recipes/github-gist.js.map +1 -0
- package/dist/recipes/index.d.ts +3 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +3 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/runner.d.ts +7 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +100 -0
- package/dist/runner.js.map +1 -0
- package/dist/serviceProviders/activitypub.d.ts +10 -0
- package/dist/serviceProviders/activitypub.d.ts.map +1 -0
- package/dist/serviceProviders/activitypub.js +73 -0
- package/dist/serviceProviders/activitypub.js.map +1 -0
- package/dist/serviceProviders/bsky.d.ts +10 -0
- package/dist/serviceProviders/bsky.d.ts.map +1 -0
- package/dist/serviceProviders/bsky.js +63 -0
- package/dist/serviceProviders/bsky.js.map +1 -0
- package/dist/serviceProviders/dns.d.ts +10 -0
- package/dist/serviceProviders/dns.d.ts.map +1 -0
- package/dist/serviceProviders/dns.js +65 -0
- package/dist/serviceProviders/dns.js.map +1 -0
- package/dist/serviceProviders/github.d.ts +10 -0
- package/dist/serviceProviders/github.d.ts.map +1 -0
- package/dist/serviceProviders/github.js +100 -0
- package/dist/serviceProviders/github.js.map +1 -0
- package/dist/serviceProviders/index.d.ts +26 -0
- package/dist/serviceProviders/index.d.ts.map +1 -0
- package/dist/serviceProviders/index.js +55 -0
- package/dist/serviceProviders/index.js.map +1 -0
- package/dist/serviceProviders/npm.d.ts +10 -0
- package/dist/serviceProviders/npm.d.ts.map +1 -0
- package/dist/serviceProviders/npm.js +99 -0
- package/dist/serviceProviders/npm.js.map +1 -0
- package/dist/serviceProviders/types.d.ts +106 -0
- package/dist/serviceProviders/types.d.ts.map +1 -0
- package/dist/serviceProviders/types.js +2 -0
- package/dist/serviceProviders/types.js.map +1 -0
- package/dist/types.d.ts +165 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/package.json +37 -0
- package/src/actions/css-select.ts +14 -0
- package/src/actions/dns-txt.ts +16 -0
- package/src/actions/http-get.ts +19 -0
- package/src/actions/index.ts +5 -0
- package/src/actions/json-path.ts +29 -0
- package/src/actions/regex-match.ts +13 -0
- package/src/claim.ts +293 -0
- package/src/constants.ts +19 -0
- package/src/expect.ts +36 -0
- package/src/fetchers/activitypub.ts +53 -0
- package/src/fetchers/dns.ts +82 -0
- package/src/fetchers/http.ts +38 -0
- package/src/fetchers/index.ts +30 -0
- package/src/index.ts +57 -0
- package/src/interpolate.ts +20 -0
- package/src/profile.ts +229 -0
- package/src/recipes/dns-txt.ts +46 -0
- package/src/recipes/github-gist.ts +53 -0
- package/src/recipes/index.ts +2 -0
- package/src/runner.ts +116 -0
- package/src/serviceProviders/activitypub.ts +84 -0
- package/src/serviceProviders/bsky.ts +73 -0
- package/src/serviceProviders/dns.ts +75 -0
- package/src/serviceProviders/github.ts +112 -0
- package/src/serviceProviders/index.ts +65 -0
- package/src/serviceProviders/npm.ts +116 -0
- package/src/serviceProviders/types.ts +121 -0
- package/src/types.ts +181 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ServiceProvider } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* DNS TXT record service provider
|
|
4
|
+
*
|
|
5
|
+
* Users prove domain ownership by adding a TXT record containing their DID.
|
|
6
|
+
* The claim URI format is: dns:example.com
|
|
7
|
+
*/
|
|
8
|
+
declare const dns: ServiceProvider;
|
|
9
|
+
export default dns;
|
|
10
|
+
//# sourceMappingURL=dns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns.d.ts","sourceRoot":"","sources":["../../src/serviceProviders/dns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;GAKG;AACH,QAAA,MAAM,GAAG,EAAE,eAgEV,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DNS TXT record service provider
|
|
3
|
+
*
|
|
4
|
+
* Users prove domain ownership by adding a TXT record containing their DID.
|
|
5
|
+
* The claim URI format is: dns:example.com
|
|
6
|
+
*/
|
|
7
|
+
const dns = {
|
|
8
|
+
id: "dns",
|
|
9
|
+
name: "Domain",
|
|
10
|
+
homepage: "",
|
|
11
|
+
// Match dns:domain.tld URIs (must contain at least one dot)
|
|
12
|
+
reUri: /^dns:([a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?)+)$/,
|
|
13
|
+
isAmbiguous: false,
|
|
14
|
+
ui: {
|
|
15
|
+
description: "Link via DNS TXT record",
|
|
16
|
+
icon: "globe",
|
|
17
|
+
inputLabel: "Domain",
|
|
18
|
+
inputPlaceholder: "example.com",
|
|
19
|
+
instructions: [
|
|
20
|
+
"Open your domain's DNS settings (usually in your registrar or hosting provider)",
|
|
21
|
+
"Add a new **TXT record** at the root domain (or at `_keytrace.yourdomain.com`)",
|
|
22
|
+
"Set the record value to the verification content below",
|
|
23
|
+
"Save and wait for DNS propagation (may take a few minutes to an hour)",
|
|
24
|
+
"Enter your domain below and verify",
|
|
25
|
+
],
|
|
26
|
+
proofTemplate: "keytrace-verification={did}",
|
|
27
|
+
},
|
|
28
|
+
processURI(uri, match) {
|
|
29
|
+
const [, domain] = match;
|
|
30
|
+
return {
|
|
31
|
+
profile: {
|
|
32
|
+
display: domain,
|
|
33
|
+
uri: `https://${domain}`,
|
|
34
|
+
},
|
|
35
|
+
proof: {
|
|
36
|
+
request: {
|
|
37
|
+
uri: domain,
|
|
38
|
+
fetcher: "dns",
|
|
39
|
+
format: "json",
|
|
40
|
+
},
|
|
41
|
+
target: [
|
|
42
|
+
// Look for DID in any TXT record
|
|
43
|
+
{ path: ["records", "txt"], relation: "contains", format: "text" },
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
getProofText(did) {
|
|
49
|
+
return `keytrace-verification=${did}`;
|
|
50
|
+
},
|
|
51
|
+
getProofLocation(match) {
|
|
52
|
+
const [, domain] = match;
|
|
53
|
+
return `Add a TXT record at the root of ${domain} (or at _keytrace.${domain})`;
|
|
54
|
+
},
|
|
55
|
+
tests: [
|
|
56
|
+
{ uri: "dns:example.com", shouldMatch: true },
|
|
57
|
+
{ uri: "dns:sub.example.com", shouldMatch: true },
|
|
58
|
+
{ uri: "dns:a.b.c.example.com", shouldMatch: true },
|
|
59
|
+
{ uri: "dns:example", shouldMatch: false },
|
|
60
|
+
{ uri: "dns:-invalid.com", shouldMatch: false },
|
|
61
|
+
{ uri: "https://example.com", shouldMatch: false },
|
|
62
|
+
],
|
|
63
|
+
};
|
|
64
|
+
export default dns;
|
|
65
|
+
//# sourceMappingURL=dns.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dns.js","sourceRoot":"","sources":["../../src/serviceProviders/dns.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,GAAG,GAAoB;IAC3B,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,EAAE;IAEZ,4DAA4D;IAC5D,KAAK,EAAE,iGAAiG;IAExG,WAAW,EAAE,KAAK;IAElB,EAAE,EAAE;QACF,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,QAAQ;QACpB,gBAAgB,EAAE,aAAa;QAC/B,YAAY,EAAE;YACZ,iFAAiF;YACjF,gFAAgF;YAChF,wDAAwD;YACxD,uEAAuE;YACvE,oCAAoC;SACrC;QACD,aAAa,EAAE,6BAA6B;KAC7C;IAED,UAAU,CAAC,GAAG,EAAE,KAAK;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;QAEzB,OAAO;YACL,OAAO,EAAE;gBACP,OAAO,EAAE,MAAM;gBACf,GAAG,EAAE,WAAW,MAAM,EAAE;aACzB;YACD,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP,GAAG,EAAE,MAAM;oBACX,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;iBACf;gBACD,MAAM,EAAE;oBACN,iCAAiC;oBACjC,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;iBACnE;aACF;SACF,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,GAAG;QACd,OAAO,yBAAyB,GAAG,EAAE,CAAC;IACxC,CAAC;IAED,gBAAgB,CAAC,KAAK;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC;QACzB,OAAO,mCAAmC,MAAM,qBAAqB,MAAM,GAAG,CAAC;IACjF,CAAC;IAED,KAAK,EAAE;QACL,EAAE,GAAG,EAAE,iBAAiB,EAAE,WAAW,EAAE,IAAI,EAAE;QAC7C,EAAE,GAAG,EAAE,qBAAqB,EAAE,WAAW,EAAE,IAAI,EAAE;QACjD,EAAE,GAAG,EAAE,uBAAuB,EAAE,WAAW,EAAE,IAAI,EAAE;QACnD,EAAE,GAAG,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,EAAE;QAC1C,EAAE,GAAG,EAAE,kBAAkB,EAAE,WAAW,EAAE,KAAK,EAAE;QAC/C,EAAE,GAAG,EAAE,qBAAqB,EAAE,WAAW,EAAE,KAAK,EAAE;KACnD;CACF,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ServiceProvider } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub Gist service provider
|
|
4
|
+
*
|
|
5
|
+
* Users prove ownership by creating a public gist containing their DID.
|
|
6
|
+
* The gist URL is used as the claim URI.
|
|
7
|
+
*/
|
|
8
|
+
declare const github: ServiceProvider;
|
|
9
|
+
export default github;
|
|
10
|
+
//# sourceMappingURL=github.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.d.ts","sourceRoot":"","sources":["../../src/serviceProviders/github.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;GAKG;AACH,QAAA,MAAM,MAAM,EAAE,eAqGb,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Gist service provider
|
|
3
|
+
*
|
|
4
|
+
* Users prove ownership by creating a public gist containing their DID.
|
|
5
|
+
* The gist URL is used as the claim URI.
|
|
6
|
+
*/
|
|
7
|
+
const github = {
|
|
8
|
+
id: "github",
|
|
9
|
+
name: "GitHub",
|
|
10
|
+
homepage: "https://github.com",
|
|
11
|
+
// Match GitHub Gist URLs: https://gist.github.com/username/gistid
|
|
12
|
+
reUri: /^https:\/\/gist\.github\.com\/([^/]+)\/([a-f0-9]+)\/?$/,
|
|
13
|
+
isAmbiguous: false,
|
|
14
|
+
ui: {
|
|
15
|
+
description: "Link via a public gist",
|
|
16
|
+
icon: "github",
|
|
17
|
+
inputLabel: "Gist URL",
|
|
18
|
+
inputPlaceholder: "https://gist.github.com/username/abc123...",
|
|
19
|
+
instructions: [
|
|
20
|
+
"Go to [gist.github.com](https://gist.github.com) and create a new gist",
|
|
21
|
+
"Name the file `keytrace.json` (or `keytrace.md` or `proof.md`)",
|
|
22
|
+
"Paste the verification content below into the file",
|
|
23
|
+
"Make sure the gist is **public**, then save it",
|
|
24
|
+
"Copy the gist URL and paste it below",
|
|
25
|
+
],
|
|
26
|
+
proofTemplate: '{\n "did": "{did}"\n}',
|
|
27
|
+
},
|
|
28
|
+
processURI(uri, match) {
|
|
29
|
+
const [, username, gistId] = match;
|
|
30
|
+
return {
|
|
31
|
+
profile: {
|
|
32
|
+
display: `@${username}`,
|
|
33
|
+
uri: `https://github.com/${username}`,
|
|
34
|
+
},
|
|
35
|
+
proof: {
|
|
36
|
+
request: {
|
|
37
|
+
uri: `https://api.github.com/gists/${gistId}`,
|
|
38
|
+
fetcher: "http",
|
|
39
|
+
format: "json",
|
|
40
|
+
options: {
|
|
41
|
+
headers: {
|
|
42
|
+
Accept: "application/vnd.github.v3+json",
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
target: [
|
|
47
|
+
// Check keytrace.json file content
|
|
48
|
+
{
|
|
49
|
+
path: ["files", "keytrace.json", "content"],
|
|
50
|
+
relation: "contains",
|
|
51
|
+
format: "text",
|
|
52
|
+
},
|
|
53
|
+
// Check proof.md file content
|
|
54
|
+
{
|
|
55
|
+
path: ["files", "proof.md", "content"],
|
|
56
|
+
relation: "contains",
|
|
57
|
+
format: "text",
|
|
58
|
+
},
|
|
59
|
+
// Check keytrace.md file content
|
|
60
|
+
{
|
|
61
|
+
path: ["files", "keytrace.md", "content"],
|
|
62
|
+
relation: "contains",
|
|
63
|
+
format: "text",
|
|
64
|
+
},
|
|
65
|
+
// Check openpgp.md for backwards compatibility with Keyoxide
|
|
66
|
+
{
|
|
67
|
+
path: ["files", "openpgp.md", "content"],
|
|
68
|
+
relation: "contains",
|
|
69
|
+
format: "text",
|
|
70
|
+
},
|
|
71
|
+
// Check gist description
|
|
72
|
+
{ path: ["description"], relation: "contains", format: "text" },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
postprocess(data, match) {
|
|
78
|
+
const [, username] = match;
|
|
79
|
+
const gist = data;
|
|
80
|
+
return {
|
|
81
|
+
subject: gist.owner?.login ?? username,
|
|
82
|
+
avatarUrl: gist.owner?.avatar_url,
|
|
83
|
+
profileUrl: `https://github.com/${gist.owner?.login ?? username}`,
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
getProofText(did) {
|
|
87
|
+
return `Verifying my identity on keytrace: ${did}`;
|
|
88
|
+
},
|
|
89
|
+
getProofLocation() {
|
|
90
|
+
return `Create a public gist with a file named keytrace.json, keytrace.md, or proof.md containing the proof text`;
|
|
91
|
+
},
|
|
92
|
+
tests: [
|
|
93
|
+
{ uri: "https://gist.github.com/alice/abc123def456", shouldMatch: true },
|
|
94
|
+
{ uri: "https://gist.github.com/alice/abc123def456/", shouldMatch: true },
|
|
95
|
+
{ uri: "https://github.com/alice", shouldMatch: false },
|
|
96
|
+
{ uri: "https://gist.gitlab.com/alice/abc123", shouldMatch: false },
|
|
97
|
+
],
|
|
98
|
+
};
|
|
99
|
+
export default github;
|
|
100
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/serviceProviders/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import github from "./github.js";
|
|
2
|
+
import dns from "./dns.js";
|
|
3
|
+
import activitypub from "./activitypub.js";
|
|
4
|
+
import bsky from "./bsky.js";
|
|
5
|
+
import npm from "./npm.js";
|
|
6
|
+
import type { ServiceProvider, ServiceProviderMatch } from "./types.js";
|
|
7
|
+
export type { ServiceProvider, ServiceProviderMatch, ServiceProviderUI, ProofTarget, ProofRequest, ProcessedURI } from "./types.js";
|
|
8
|
+
/**
|
|
9
|
+
* Get a service provider by ID
|
|
10
|
+
*/
|
|
11
|
+
export declare function getProvider(id: string): ServiceProvider | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Get all registered service providers
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAllProviders(): ServiceProvider[];
|
|
16
|
+
/**
|
|
17
|
+
* Match a URI against all service providers
|
|
18
|
+
* Returns all matching providers, with unambiguous matches stopping the search
|
|
19
|
+
*/
|
|
20
|
+
export declare function matchUri(uri: string): ServiceProviderMatch[];
|
|
21
|
+
/**
|
|
22
|
+
* Get the proof text a user should add to verify a claim
|
|
23
|
+
*/
|
|
24
|
+
export declare function getProofTextForProvider(providerId: string, did: string, handle?: string): string | undefined;
|
|
25
|
+
export { github, dns, activitypub, bsky, npm };
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/serviceProviders/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,KAAK,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAExE,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAUpI;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAEnE;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,eAAe,EAAE,CAEnD;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAmB5D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5G;AAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import github from "./github.js";
|
|
2
|
+
import dns from "./dns.js";
|
|
3
|
+
import activitypub from "./activitypub.js";
|
|
4
|
+
import bsky from "./bsky.js";
|
|
5
|
+
import npm from "./npm.js";
|
|
6
|
+
const providers = {
|
|
7
|
+
github,
|
|
8
|
+
dns,
|
|
9
|
+
activitypub,
|
|
10
|
+
bsky,
|
|
11
|
+
npm,
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Get a service provider by ID
|
|
15
|
+
*/
|
|
16
|
+
export function getProvider(id) {
|
|
17
|
+
return providers[id];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get all registered service providers
|
|
21
|
+
*/
|
|
22
|
+
export function getAllProviders() {
|
|
23
|
+
return Object.values(providers);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Match a URI against all service providers
|
|
27
|
+
* Returns all matching providers, with unambiguous matches stopping the search
|
|
28
|
+
*/
|
|
29
|
+
export function matchUri(uri) {
|
|
30
|
+
const matches = [];
|
|
31
|
+
for (const provider of Object.values(providers)) {
|
|
32
|
+
const match = uri.match(provider.reUri);
|
|
33
|
+
if (match) {
|
|
34
|
+
matches.push({
|
|
35
|
+
provider,
|
|
36
|
+
match,
|
|
37
|
+
isAmbiguous: provider.isAmbiguous ?? false,
|
|
38
|
+
});
|
|
39
|
+
// Stop on unambiguous match
|
|
40
|
+
if (!provider.isAmbiguous) {
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return matches;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the proof text a user should add to verify a claim
|
|
49
|
+
*/
|
|
50
|
+
export function getProofTextForProvider(providerId, did, handle) {
|
|
51
|
+
const provider = providers[providerId];
|
|
52
|
+
return provider?.getProofText(did, handle);
|
|
53
|
+
}
|
|
54
|
+
export { github, dns, activitypub, bsky, npm };
|
|
55
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/serviceProviders/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,GAAG,MAAM,UAAU,CAAC;AAK3B,MAAM,SAAS,GAAoC;IACjD,MAAM;IACN,GAAG;IACH,WAAW;IACX,IAAI;IACJ,GAAG;CACJ,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC;gBACX,QAAQ;gBACR,KAAK;gBACL,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,KAAK;aAC3C,CAAC,CAAC;YACH,4BAA4B;YAC5B,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;gBAC1B,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,UAAkB,EAAE,GAAW,EAAE,MAAe;IACtF,MAAM,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IACvC,OAAO,QAAQ,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ServiceProvider } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* npm service provider
|
|
4
|
+
*
|
|
5
|
+
* Users prove ownership by publishing an npm package named keytrace-[handle]
|
|
6
|
+
* containing their DID in the package.json keytrace field.
|
|
7
|
+
*/
|
|
8
|
+
declare const npm: ServiceProvider;
|
|
9
|
+
export default npm;
|
|
10
|
+
//# sourceMappingURL=npm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.d.ts","sourceRoot":"","sources":["../../src/serviceProviders/npm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAWlD;;;;;GAKG;AACH,QAAA,MAAM,GAAG,EAAE,eAgGV,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slugify a handle for use in npm package names.
|
|
3
|
+
* Replaces dots with dashes since npm doesn't allow dots.
|
|
4
|
+
* e.g. "orta.io" -> "orta-io"
|
|
5
|
+
*/
|
|
6
|
+
function slugifyHandle(handle) {
|
|
7
|
+
return handle.replace(/\./g, "-").toLowerCase();
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* npm service provider
|
|
11
|
+
*
|
|
12
|
+
* Users prove ownership by publishing an npm package named keytrace-[handle]
|
|
13
|
+
* containing their DID in the package.json keytrace field.
|
|
14
|
+
*/
|
|
15
|
+
const npm = {
|
|
16
|
+
id: "npm",
|
|
17
|
+
name: "npm",
|
|
18
|
+
homepage: "https://www.npmjs.com",
|
|
19
|
+
// Match npm package URLs: https://www.npmjs.com/package/keytrace-username
|
|
20
|
+
reUri: /^https:\/\/(?:www\.)?npmjs\.com\/package\/(keytrace-[a-z0-9_-]+)\/?$/i,
|
|
21
|
+
isAmbiguous: false,
|
|
22
|
+
ui: {
|
|
23
|
+
description: "Link via an npm package",
|
|
24
|
+
icon: "npm",
|
|
25
|
+
inputLabel: "npm Package URL",
|
|
26
|
+
inputPlaceholder: "https://www.npmjs.com/package/keytrace-yourhandle",
|
|
27
|
+
inputDefaultTemplate: "https://www.npmjs.com/package/keytrace-{slugHandle}",
|
|
28
|
+
instructions: [
|
|
29
|
+
"Create a new folder with a `package.json` containing the verification content below",
|
|
30
|
+
"Run `npm publish --access public` to publish",
|
|
31
|
+
"Paste the npm package URL below",
|
|
32
|
+
],
|
|
33
|
+
proofTemplate: `{
|
|
34
|
+
"name": "keytrace-{slugHandle}",
|
|
35
|
+
"version": "0.0.1",
|
|
36
|
+
"keytrace": "{claimId}",
|
|
37
|
+
"did": "{did}"
|
|
38
|
+
}`,
|
|
39
|
+
},
|
|
40
|
+
processURI(uri, match) {
|
|
41
|
+
const [, packageName] = match;
|
|
42
|
+
// Extract the handle from keytrace-handle
|
|
43
|
+
const handle = packageName.replace(/^keytrace-/i, "");
|
|
44
|
+
return {
|
|
45
|
+
profile: {
|
|
46
|
+
display: `~${handle}`,
|
|
47
|
+
uri: `https://www.npmjs.com/~${handle}`,
|
|
48
|
+
},
|
|
49
|
+
proof: {
|
|
50
|
+
request: {
|
|
51
|
+
// Use npm registry to get the packument with full metadata
|
|
52
|
+
uri: `https://registry.npmjs.org/${packageName}`,
|
|
53
|
+
fetcher: "http",
|
|
54
|
+
format: "json",
|
|
55
|
+
},
|
|
56
|
+
target: [
|
|
57
|
+
// Check for DID in the did field of any version
|
|
58
|
+
// The packument has versions as an object: { versions: { "0.0.1": { did: "did:...", keytrace: "..." } } }
|
|
59
|
+
{
|
|
60
|
+
path: ["versions", "*", "did"],
|
|
61
|
+
relation: "contains",
|
|
62
|
+
format: "text",
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
},
|
|
68
|
+
postprocess(data, _match) {
|
|
69
|
+
const packument = data;
|
|
70
|
+
// Get the first maintainer's npm username
|
|
71
|
+
const maintainer = packument.maintainers?.[0];
|
|
72
|
+
const npmUsername = maintainer?.name;
|
|
73
|
+
return {
|
|
74
|
+
subject: npmUsername,
|
|
75
|
+
profileUrl: npmUsername ? `https://www.npmjs.com/~${npmUsername}` : undefined,
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
getProofText(did, handle) {
|
|
79
|
+
const slug = handle ? slugifyHandle(handle) : "[your-handle]";
|
|
80
|
+
return `{
|
|
81
|
+
"name": "keytrace-${slug}",
|
|
82
|
+
"version": "0.0.1",
|
|
83
|
+
"keytrace": "[claim-id]",
|
|
84
|
+
"did": "${did}"
|
|
85
|
+
}`;
|
|
86
|
+
},
|
|
87
|
+
getProofLocation() {
|
|
88
|
+
return `Publish an npm package named keytrace-[your-handle] with your DID in the keytrace field of package.json`;
|
|
89
|
+
},
|
|
90
|
+
tests: [
|
|
91
|
+
{ uri: "https://www.npmjs.com/package/keytrace-alice", shouldMatch: true },
|
|
92
|
+
{ uri: "https://npmjs.com/package/keytrace-alice", shouldMatch: true },
|
|
93
|
+
{ uri: "https://www.npmjs.com/package/keytrace-alice/", shouldMatch: true },
|
|
94
|
+
{ uri: "https://www.npmjs.com/package/some-other-pkg", shouldMatch: false },
|
|
95
|
+
{ uri: "https://www.npmjs.com/~alice", shouldMatch: false },
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
export default npm;
|
|
99
|
+
//# sourceMappingURL=npm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/serviceProviders/npm.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,SAAS,aAAa,CAAC,MAAc;IACnC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,GAAG,GAAoB;IAC3B,EAAE,EAAE,KAAK;IACT,IAAI,EAAE,KAAK;IACX,QAAQ,EAAE,uBAAuB;IAEjC,0EAA0E;IAC1E,KAAK,EAAE,uEAAuE;IAE9E,WAAW,EAAE,KAAK;IAElB,EAAE,EAAE;QACF,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,KAAK;QACX,UAAU,EAAE,iBAAiB;QAC7B,gBAAgB,EAAE,mDAAmD;QACrE,oBAAoB,EAAE,qDAAqD;QAC3E,YAAY,EAAE;YACZ,qFAAqF;YACrF,8CAA8C;YAC9C,iCAAiC;SAClC;QACD,aAAa,EAAE;;;;;EAKjB;KACC;IAED,UAAU,CAAC,GAAG,EAAE,KAAK;QACnB,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC;QAC9B,0CAA0C;QAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;QAEtD,OAAO;YACL,OAAO,EAAE;gBACP,OAAO,EAAE,IAAI,MAAM,EAAE;gBACrB,GAAG,EAAE,0BAA0B,MAAM,EAAE;aACxC;YACD,KAAK,EAAE;gBACL,OAAO,EAAE;oBACP,2DAA2D;oBAC3D,GAAG,EAAE,8BAA8B,WAAW,EAAE;oBAChD,OAAO,EAAE,MAAM;oBACf,MAAM,EAAE,MAAM;iBACf;gBACD,MAAM,EAAE;oBACN,gDAAgD;oBAChD,0GAA0G;oBAC1G;wBACE,IAAI,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,KAAK,CAAC;wBAC9B,QAAQ,EAAE,UAAU;wBACpB,MAAM,EAAE,MAAM;qBACf;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAI,EAAE,MAAM;QACtB,MAAM,SAAS,GAAG,IAGjB,CAAC;QAEF,0CAA0C;QAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,UAAU,EAAE,IAAI,CAAC;QAErC,OAAO;YACL,OAAO,EAAE,WAAW;YACpB,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS;SAC9E,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,GAAG,EAAE,MAAM;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9D,OAAO;sBACW,IAAI;;;YAGd,GAAG;EACb,CAAC;IACD,CAAC;IAED,gBAAgB;QACd,OAAO,yGAAyG,CAAC;IACnH,CAAC;IAED,KAAK,EAAE;QACL,EAAE,GAAG,EAAE,8CAA8C,EAAE,WAAW,EAAE,IAAI,EAAE;QAC1E,EAAE,GAAG,EAAE,0CAA0C,EAAE,WAAW,EAAE,IAAI,EAAE;QACtE,EAAE,GAAG,EAAE,+CAA+C,EAAE,WAAW,EAAE,IAAI,EAAE;QAC3E,EAAE,GAAG,EAAE,8CAA8C,EAAE,WAAW,EAAE,KAAK,EAAE;QAC3E,EAAE,GAAG,EAAE,8BAA8B,EAAE,WAAW,EAAE,KAAK,EAAE;KAC5D;CACF,CAAC;AAEF,eAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A match between a URI and a service provider
|
|
3
|
+
*/
|
|
4
|
+
export interface ServiceProviderMatch {
|
|
5
|
+
provider: ServiceProvider;
|
|
6
|
+
match: RegExpMatchArray;
|
|
7
|
+
isAmbiguous: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Where to look for proof in the fetched response
|
|
11
|
+
*/
|
|
12
|
+
export interface ProofTarget {
|
|
13
|
+
/** JSON path to search for proof (e.g., ['description'], ['files', '*', 'content']) */
|
|
14
|
+
path: string[];
|
|
15
|
+
/** How to match: 'contains', 'equals', 'startsWith' */
|
|
16
|
+
relation: "contains" | "equals" | "startsWith";
|
|
17
|
+
/** Format of data at path */
|
|
18
|
+
format: "text" | "uri" | "json";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* How to fetch the proof
|
|
22
|
+
*/
|
|
23
|
+
export interface ProofRequest {
|
|
24
|
+
/** URL template with {placeholders} */
|
|
25
|
+
uri: string;
|
|
26
|
+
/** Fetcher to use: 'http', 'dns', 'activitypub' */
|
|
27
|
+
fetcher: string;
|
|
28
|
+
/** Expected response format */
|
|
29
|
+
format: "json" | "text";
|
|
30
|
+
/** Additional fetch options */
|
|
31
|
+
options?: {
|
|
32
|
+
headers?: Record<string, string>;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Result of processing a URI
|
|
37
|
+
*/
|
|
38
|
+
export interface ProcessedURI {
|
|
39
|
+
/** Profile display info */
|
|
40
|
+
profile: {
|
|
41
|
+
/** Display name for the identity (e.g., username, domain) */
|
|
42
|
+
display: string;
|
|
43
|
+
/** URL to the identity's profile page */
|
|
44
|
+
uri: string;
|
|
45
|
+
};
|
|
46
|
+
/** How to fetch and verify the proof */
|
|
47
|
+
proof: {
|
|
48
|
+
request: ProofRequest;
|
|
49
|
+
target: ProofTarget[];
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* UI configuration for the add claim wizard
|
|
54
|
+
*/
|
|
55
|
+
export interface ServiceProviderUI {
|
|
56
|
+
/** Short description for service picker (e.g., "Link via a public gist") */
|
|
57
|
+
description: string;
|
|
58
|
+
/** Lucide icon name (e.g., "github", "globe") */
|
|
59
|
+
icon: string;
|
|
60
|
+
/** Label for the claim URI input field */
|
|
61
|
+
inputLabel: string;
|
|
62
|
+
/** Placeholder text for the claim URI input */
|
|
63
|
+
inputPlaceholder: string;
|
|
64
|
+
/** Default value template for input. Supports {did}, {handle}, {slugHandle} placeholders */
|
|
65
|
+
inputDefaultTemplate?: string;
|
|
66
|
+
/** Step-by-step instructions (markdown supported) */
|
|
67
|
+
instructions: string[];
|
|
68
|
+
/** Template for proof content. Supports {did} and {handle} placeholders */
|
|
69
|
+
proofTemplate: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A service provider that can verify identity claims
|
|
73
|
+
*/
|
|
74
|
+
export interface ServiceProvider {
|
|
75
|
+
/** Unique identifier */
|
|
76
|
+
id: string;
|
|
77
|
+
/** Display name */
|
|
78
|
+
name: string;
|
|
79
|
+
/** Homepage URL */
|
|
80
|
+
homepage: string;
|
|
81
|
+
/** Regex to match claim URIs */
|
|
82
|
+
reUri: RegExp;
|
|
83
|
+
/** Whether matches are potentially ambiguous (could match multiple providers) */
|
|
84
|
+
isAmbiguous?: boolean;
|
|
85
|
+
/** UI configuration for the add claim wizard */
|
|
86
|
+
ui: ServiceProviderUI;
|
|
87
|
+
/** Process matched URI into verification config */
|
|
88
|
+
processURI(uri: string, match: RegExpMatchArray): ProcessedURI;
|
|
89
|
+
/** Optional post-processing after fetch to extract identity metadata */
|
|
90
|
+
postprocess?(data: unknown, match: RegExpMatchArray): {
|
|
91
|
+
subject?: string;
|
|
92
|
+
avatarUrl?: string;
|
|
93
|
+
profileUrl?: string;
|
|
94
|
+
displayName?: string;
|
|
95
|
+
};
|
|
96
|
+
/** Generate proof text for user to add to their profile */
|
|
97
|
+
getProofText(did: string, handle?: string): string;
|
|
98
|
+
/** Human-readable instructions for where to place the proof */
|
|
99
|
+
getProofLocation?(match: RegExpMatchArray): string;
|
|
100
|
+
/** Test cases for validation */
|
|
101
|
+
tests: {
|
|
102
|
+
uri: string;
|
|
103
|
+
shouldMatch: boolean;
|
|
104
|
+
}[];
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/serviceProviders/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,EAAE,gBAAgB,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,uFAAuF;IACvF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uDAAuD;IACvD,QAAQ,EAAE,UAAU,GAAG,QAAQ,GAAG,YAAY,CAAC;IAC/C,6BAA6B;IAC7B,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,mDAAmD;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,+BAA+B;IAC/B,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,+BAA+B;IAC/B,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,OAAO,EAAE;QACP,6DAA6D;QAC7D,OAAO,EAAE,MAAM,CAAC;QAChB,yCAAyC;QACzC,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,wCAAwC;IACxC,KAAK,EAAE;QACL,OAAO,EAAE,YAAY,CAAC;QACtB,MAAM,EAAE,WAAW,EAAE,CAAC;KACvB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,qDAAqD;IACrD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,QAAQ,EAAE,MAAM,CAAC;IAEjB,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IAEd,iFAAiF;IACjF,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,gDAAgD;IAChD,EAAE,EAAE,iBAAiB,CAAC;IAEtB,mDAAmD;IACnD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,YAAY,CAAC;IAE/D,wEAAwE;IACxE,WAAW,CAAC,CACV,IAAI,EAAE,OAAO,EACb,KAAK,EAAE,gBAAgB,GACtB;QACD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,2DAA2D;IAC3D,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEnD,+DAA+D;IAC/D,gBAAgB,CAAC,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAEnD,gCAAgC;IAChC,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,EAAE,OAAO,CAAC;KACtB,EAAE,CAAC;CACL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/serviceProviders/types.ts"],"names":[],"mappings":""}
|