@atproto/did 0.1.5 → 0.2.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atproto/did
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#4216](https://github.com/bluesky-social/atproto/pull/4216) [`09439d7d6`](https://github.com/bluesky-social/atproto/commit/09439d7d688294ad1a0c78a74b901ba2f7c5f4c3) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Minor typing improvements
8
+
9
+ ## 0.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Enforce proper formatting of relative uris fragments
14
+
15
+ ### Patch Changes
16
+
17
+ - [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Export `AtprotoAudience` type and validation function
18
+
19
+ - [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Small performance improvement
20
+
21
+ - [#4108](https://github.com/bluesky-social/atproto/pull/4108) [`f9dc9aa4c`](https://github.com/bluesky-social/atproto/commit/f9dc9aa4c9eaf2f82d140fbf011a9015e7f1a00d) Thanks [@matthieusieben](https://github.com/matthieusieben)! - Small performance improvement
22
+
3
23
  ## 0.1.5
4
24
 
5
25
  ### Patch Changes
package/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  Dual MIT/Apache-2.0 License
2
2
 
3
- Copyright (c) 2022-2024 Bluesky PBC, and Contributors
3
+ Copyright (c) 2022-2025 Bluesky Social PBC, and Contributors
4
4
 
5
5
  Except as otherwise noted in individual files, this software is licensed under the MIT license (<http://opensource.org/licenses/MIT>), or the Apache License, Version 2.0 (<http://www.apache.org/licenses/LICENSE-2.0>).
6
6
 
package/dist/atproto.d.ts CHANGED
@@ -4,11 +4,13 @@ export type AtprotoIdentityDidMethods = 'plc' | 'web';
4
4
  export type AtprotoDid = Did<AtprotoIdentityDidMethods>;
5
5
  export declare const atprotoDidSchema: z.ZodEffects<z.ZodString, `did:plc:${string}` | `did:web:${string}`, string>;
6
6
  export declare function isAtprotoDid(input: unknown): input is AtprotoDid;
7
- export declare function asAtprotoDid(input: unknown): AtprotoDid;
7
+ export declare function asAtprotoDid<T>(input: T): (T & `did:plc:${string}`) | (T & `did:web:${string}`);
8
8
  export declare function assertAtprotoDid(input: unknown): asserts input is AtprotoDid;
9
9
  export declare function assertAtprotoDidWeb(input: unknown): asserts input is Did<'web'>;
10
10
  /**
11
11
  * @see {@link https://atproto.com/specs/did#blessed-did-methods}
12
12
  */
13
13
  export declare function isAtprotoDidWeb(input: unknown): input is Did<'web'>;
14
+ export type AtprotoAudience = `${AtprotoDid}#${string}`;
15
+ export declare const isAtprotoAudience: (value: unknown) => value is AtprotoAudience;
14
16
  //# sourceMappingURL=atproto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"atproto.d.ts","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAW9B,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,KAAK,CAAA;AACrD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAEvD,eAAO,MAAM,gBAAgB,8EAE6C,CAAA;AAE1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAahE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAGvD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAa5E;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAmB7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAOnE"}
1
+ {"version":3,"file":"atproto.d.ts","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAa9B,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,KAAK,CAAA;AACrD,MAAM,MAAM,UAAU,GAAG,GAAG,CAAC,yBAAyB,CAAC,CAAA;AAEvD,eAAO,MAAM,gBAAgB,8EAE6C,CAAA;AAE1E,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,yDAGvC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAa5E;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAgB7B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAcnE;AA+BD,MAAM,MAAM,eAAe,GAAG,GAAG,UAAU,IAAI,MAAM,EAAE,CAAA;AACvD,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,eAQ3D,CAAA"}
package/dist/atproto.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.atprotoDidSchema = void 0;
3
+ exports.isAtprotoAudience = exports.atprotoDidSchema = void 0;
4
4
  exports.isAtprotoDid = isAtprotoDid;
5
5
  exports.asAtprotoDid = asAtprotoDid;
6
6
  exports.assertAtprotoDid = assertAtprotoDid;
@@ -8,25 +8,13 @@ exports.assertAtprotoDidWeb = assertAtprotoDidWeb;
8
8
  exports.isAtprotoDidWeb = isAtprotoDidWeb;
9
9
  const zod_1 = require("zod");
10
10
  const did_error_js_1 = require("./did-error.js");
11
+ const uri_js_1 = require("./lib/uri.js");
11
12
  const methods_js_1 = require("./methods.js");
12
13
  exports.atprotoDidSchema = zod_1.z
13
14
  .string()
14
15
  .refine(isAtprotoDid, `Atproto only allows "plc" and "web" DID methods`);
15
16
  function isAtprotoDid(input) {
16
- // Optimized equivalent of:
17
- // return isDidPlc(input) || isAtprotoDidWeb(input)
18
- if (typeof input !== 'string') {
19
- return false;
20
- }
21
- else if (input.startsWith(methods_js_1.DID_PLC_PREFIX)) {
22
- return (0, methods_js_1.isDidPlc)(input);
23
- }
24
- else if (input.startsWith(methods_js_1.DID_WEB_PREFIX)) {
25
- return isAtprotoDidWeb(input);
26
- }
27
- else {
28
- return false;
29
- }
17
+ return (0, methods_js_1.isDidPlc)(input) || isAtprotoDidWeb(input);
30
18
  }
31
19
  function asAtprotoDid(input) {
32
20
  assertAtprotoDid(input);
@@ -48,11 +36,10 @@ function assertAtprotoDid(input) {
48
36
  }
49
37
  function assertAtprotoDidWeb(input) {
50
38
  (0, methods_js_1.assertDidWeb)(input);
51
- if (input.includes(':', methods_js_1.DID_WEB_PREFIX.length)) {
39
+ if (isDidWebWithPath(input)) {
52
40
  throw new did_error_js_1.InvalidDidError(input, `Atproto does not allow path components in Web DIDs`);
53
41
  }
54
- if (input.includes('%3A', methods_js_1.DID_WEB_PREFIX.length) &&
55
- !input.startsWith('did:web:localhost%3A')) {
42
+ if (isDidWebWithHttpsPort(input)) {
56
43
  throw new did_error_js_1.InvalidDidError(input, `Atproto does not allow port numbers in Web DIDs, except for localhost`);
57
44
  }
58
45
  }
@@ -60,12 +47,47 @@ function assertAtprotoDidWeb(input) {
60
47
  * @see {@link https://atproto.com/specs/did#blessed-did-methods}
61
48
  */
62
49
  function isAtprotoDidWeb(input) {
63
- try {
64
- assertAtprotoDidWeb(input);
65
- return true;
50
+ if (!(0, methods_js_1.isDidWeb)(input)) {
51
+ return false;
52
+ }
53
+ if (isDidWebWithPath(input)) {
54
+ return false;
66
55
  }
67
- catch {
56
+ if (isDidWebWithHttpsPort(input)) {
68
57
  return false;
69
58
  }
59
+ return true;
60
+ }
61
+ function isDidWebWithPath(did) {
62
+ return did.includes(':', methods_js_1.DID_WEB_PREFIX.length);
63
+ }
64
+ function isLocalhostDid(did) {
65
+ return (did === 'did:web:localhost' ||
66
+ did.startsWith('did:web:localhost:') ||
67
+ did.startsWith('did:web:localhost%3A'));
70
68
  }
69
+ function isDidWebWithHttpsPort(did) {
70
+ if (isLocalhostDid(did))
71
+ return false;
72
+ const pathIdx = did.indexOf(':', methods_js_1.DID_WEB_PREFIX.length);
73
+ const hasPort = pathIdx === -1
74
+ ? // No path component, check if there's a port separator anywhere after
75
+ // the "did:web:" prefix
76
+ did.includes('%3A', methods_js_1.DID_WEB_PREFIX.length)
77
+ : // There is a path component; if there is an encoded colon *before* it,
78
+ // then there is a port number
79
+ did.lastIndexOf('%3A', pathIdx) !== -1;
80
+ return hasPort;
81
+ }
82
+ const isAtprotoAudience = (value) => {
83
+ if (typeof value !== 'string')
84
+ return false;
85
+ const hashIndex = value.indexOf('#');
86
+ if (hashIndex === -1)
87
+ return false;
88
+ if (value.indexOf('#', hashIndex + 1) !== -1)
89
+ return false;
90
+ return ((0, uri_js_1.isFragment)(value, hashIndex + 1) && isAtprotoDid(value.slice(0, hashIndex)));
91
+ };
92
+ exports.isAtprotoAudience = isAtprotoAudience;
71
93
  //# sourceMappingURL=atproto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"atproto.js","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":";;;AAoBA,oCAaC;AAED,oCAGC;AAED,4CAaC;AAED,kDAqBC;AAKD,0CAOC;AAxFD,6BAAuB;AACvB,iDAAgD;AAEhD,6CAMqB;AAOR,QAAA,gBAAgB,GAAG,OAAC;KAC9B,MAAM,EAAE;KACR,MAAM,CAAC,YAAY,EAAE,iDAAiD,CAAC,CAAA;AAE1E,SAAgB,YAAY,CAAC,KAAc;IACzC,2BAA2B;IAC3B,mDAAmD;IAEnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAA;IACd,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,OAAO,IAAA,qBAAQ,EAAC,KAAK,CAAC,CAAA;IACxB,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,OAAO,eAAe,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;SAAM,CAAC;QACN,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,gBAAgB,CAAC,KAAK,CAAC,CAAA;IACvB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,8BAAe,CAAC,OAAO,KAAK,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,IAAA,yBAAY,EAAC,KAAK,CAAC,CAAA;IACrB,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,CAAC,2BAAc,CAAC,EAAE,CAAC;QAC5C,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,iDAAiD,CAClD,CAAA;IACH,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CACjC,KAAc;IAEd,IAAA,yBAAY,EAAC,KAAK,CAAC,CAAA;IAEnB,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,2BAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,oDAAoD,CACrD,CAAA;IACH,CAAC;IAED,IACE,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,2BAAc,CAAC,MAAM,CAAC;QAC5C,CAAC,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,EACzC,CAAC;QACD,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,uEAAuE,CACxE,CAAA;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,KAAc;IAC5C,IAAI,CAAC;QACH,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAC1B,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"atproto.js","sourceRoot":"","sources":["../src/atproto.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { InvalidDidError } from './did-error.js'\nimport { Did } from './did.js'\nimport { isFragment } from './lib/uri.js'\nimport {\n DID_PLC_PREFIX,\n DID_WEB_PREFIX,\n assertDidPlc,\n assertDidWeb,\n isDidPlc,\n isDidWeb,\n} from './methods.js'\n\n// This file contains atproto-specific DID validation utilities.\n\nexport type AtprotoIdentityDidMethods = 'plc' | 'web'\nexport type AtprotoDid = Did<AtprotoIdentityDidMethods>\n\nexport const atprotoDidSchema = z\n .string()\n .refine(isAtprotoDid, `Atproto only allows \"plc\" and \"web\" DID methods`)\n\nexport function isAtprotoDid(input: unknown): input is AtprotoDid {\n return isDidPlc(input) || isAtprotoDidWeb(input)\n}\n\nexport function asAtprotoDid<T>(input: T) {\n assertAtprotoDid(input)\n return input\n}\n\nexport function assertAtprotoDid(input: unknown): asserts input is AtprotoDid {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n } else if (input.startsWith(DID_PLC_PREFIX)) {\n assertDidPlc(input)\n } else if (input.startsWith(DID_WEB_PREFIX)) {\n assertAtprotoDidWeb(input)\n } else {\n throw new InvalidDidError(\n input,\n `Atproto only allows \"plc\" and \"web\" DID methods`,\n )\n }\n}\n\nexport function assertAtprotoDidWeb(\n input: unknown,\n): asserts input is Did<'web'> {\n assertDidWeb(input)\n\n if (isDidWebWithPath(input)) {\n throw new InvalidDidError(\n input,\n `Atproto does not allow path components in Web DIDs`,\n )\n }\n\n if (isDidWebWithHttpsPort(input)) {\n throw new InvalidDidError(\n input,\n `Atproto does not allow port numbers in Web DIDs, except for localhost`,\n )\n }\n}\n\n/**\n * @see {@link https://atproto.com/specs/did#blessed-did-methods}\n */\nexport function isAtprotoDidWeb(input: unknown): input is Did<'web'> {\n if (!isDidWeb(input)) {\n return false\n }\n\n if (isDidWebWithPath(input)) {\n return false\n }\n\n if (isDidWebWithHttpsPort(input)) {\n return false\n }\n\n return true\n}\n\nfunction isDidWebWithPath(did: Did<'web'>): boolean {\n return did.includes(':', DID_WEB_PREFIX.length)\n}\n\nfunction isLocalhostDid(did: Did<'web'>): boolean {\n return (\n did === 'did:web:localhost' ||\n did.startsWith('did:web:localhost:') ||\n did.startsWith('did:web:localhost%3A')\n )\n}\n\nfunction isDidWebWithHttpsPort(did: Did<'web'>): boolean {\n if (isLocalhostDid(did)) return false\n\n const pathIdx = did.indexOf(':', DID_WEB_PREFIX.length)\n\n const hasPort =\n pathIdx === -1\n ? // No path component, check if there's a port separator anywhere after\n // the \"did:web:\" prefix\n did.includes('%3A', DID_WEB_PREFIX.length)\n : // There is a path component; if there is an encoded colon *before* it,\n // then there is a port number\n did.lastIndexOf('%3A', pathIdx) !== -1\n\n return hasPort\n}\n\nexport type AtprotoAudience = `${AtprotoDid}#${string}`\nexport const isAtprotoAudience = (value: unknown): value is AtprotoAudience => {\n if (typeof value !== 'string') return false\n const hashIndex = value.indexOf('#')\n if (hashIndex === -1) return false\n if (value.indexOf('#', hashIndex + 1) !== -1) return false\n return (\n isFragment(value, hashIndex + 1) && isAtprotoDid(value.slice(0, hashIndex))\n )\n}\n"]}
@@ -5,9 +5,9 @@ import { Did } from './did.js';
5
5
  * @see {@link https://www.w3.org/TR/did-core/#services}
6
6
  */
7
7
  declare const didServiceSchema: z.ZodObject<{
8
- id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
8
+ id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
9
9
  type: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
10
- serviceEndpoint: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>, z.ZodArray<z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>]>, "atleastone">]>;
10
+ serviceEndpoint: z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>, "atleastone">]>;
11
11
  }, "strip", z.ZodTypeAny, {
12
12
  type: string | string[];
13
13
  id: string;
@@ -26,11 +26,11 @@ export declare const didDocumentSchema: z.ZodObject<{
26
26
  '@context': z.ZodUnion<[z.ZodLiteral<"https://www.w3.org/ns/did/v1">, z.ZodEffects<z.ZodArray<z.ZodString, "atleastone">, [string, ...string[]], [string, ...string[]]>]>;
27
27
  id: z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>;
28
28
  controller: z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>>;
29
- alsoKnownAs: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
29
+ alsoKnownAs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
30
30
  service: z.ZodOptional<z.ZodArray<z.ZodObject<{
31
- id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
31
+ id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
32
32
  type: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
33
- serviceEndpoint: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>, z.ZodArray<z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>]>, "atleastone">]>;
33
+ serviceEndpoint: z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>, "atleastone">]>;
34
34
  }, "strip", z.ZodTypeAny, {
35
35
  type: string | string[];
36
36
  id: string;
@@ -40,8 +40,8 @@ export declare const didDocumentSchema: z.ZodObject<{
40
40
  id: string;
41
41
  serviceEndpoint: string | Record<string, string> | [string | Record<string, string>, ...(string | Record<string, string>)[]];
42
42
  }>, "many">>;
43
- authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>, z.ZodObject<{
44
- id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
43
+ authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>, z.ZodObject<{
44
+ id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
45
45
  type: z.ZodString;
46
46
  controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
47
47
  publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -60,7 +60,7 @@ export declare const didDocumentSchema: z.ZodObject<{
60
60
  publicKeyMultibase?: string | undefined;
61
61
  }>]>, "many">>;
62
62
  verificationMethod: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodObject<{
63
- id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
63
+ id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
64
64
  type: z.ZodString;
65
65
  controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
66
66
  publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -77,7 +77,7 @@ export declare const didDocumentSchema: z.ZodObject<{
77
77
  controller: string | string[];
78
78
  publicKeyJwk?: Record<string, unknown> | undefined;
79
79
  publicKeyMultibase?: string | undefined;
80
- }>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>]>, "many">>;
80
+ }>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>]>, "many">>;
81
81
  }, "strip", z.ZodTypeAny, {
82
82
  id: `did:${string}:${string}`;
83
83
  '@context': "https://www.w3.org/ns/did/v1" | [string, ...string[]];
@@ -134,11 +134,11 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
134
134
  '@context': z.ZodUnion<[z.ZodLiteral<"https://www.w3.org/ns/did/v1">, z.ZodEffects<z.ZodArray<z.ZodString, "atleastone">, [string, ...string[]], [string, ...string[]]>]>;
135
135
  id: z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>;
136
136
  controller: z.ZodOptional<z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>>;
137
- alsoKnownAs: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
137
+ alsoKnownAs: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
138
138
  service: z.ZodOptional<z.ZodArray<z.ZodObject<{
139
- id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
139
+ id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
140
140
  type: z.ZodUnion<[z.ZodString, z.ZodArray<z.ZodString, "many">]>;
141
- serviceEndpoint: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>, z.ZodArray<z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodRecord<z.ZodString, z.ZodEffects<z.ZodString, string, string>>]>, "atleastone">]>;
141
+ serviceEndpoint: z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodRecord<z.ZodString, z.ZodString>]>, "atleastone">]>;
142
142
  }, "strip", z.ZodTypeAny, {
143
143
  type: string | string[];
144
144
  id: string;
@@ -148,8 +148,8 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
148
148
  id: string;
149
149
  serviceEndpoint: string | Record<string, string> | [string | Record<string, string>, ...(string | Record<string, string>)[]];
150
150
  }>, "many">>;
151
- authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>, z.ZodObject<{
152
- id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
151
+ authentication: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>, z.ZodObject<{
152
+ id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
153
153
  type: z.ZodString;
154
154
  controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
155
155
  publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -168,7 +168,7 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
168
168
  publicKeyMultibase?: string | undefined;
169
169
  }>]>, "many">>;
170
170
  verificationMethod: z.ZodOptional<z.ZodArray<z.ZodUnion<[z.ZodObject<{
171
- id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>;
171
+ id: z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>;
172
172
  type: z.ZodString;
173
173
  controller: z.ZodUnion<[z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, z.ZodArray<z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>, "many">]>;
174
174
  publicKeyJwk: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
@@ -185,7 +185,7 @@ export declare const didDocumentValidator: z.ZodEffects<z.ZodObject<{
185
185
  controller: string | string[];
186
186
  publicKeyJwk?: Record<string, unknown> | undefined;
187
187
  publicKeyMultibase?: string | undefined;
188
- }>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodString]>]>, "many">>;
188
+ }>, z.ZodUnion<[z.ZodEffects<z.ZodString, string, string>, z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>]>]>, "many">>;
189
189
  }, "strip", z.ZodTypeAny, {
190
190
  id: `did:${string}:${string}`;
191
191
  '@context': "https://www.w3.org/ns/did/v1" | [string, ...string[]];
@@ -1 +1 @@
1
- {"version":3,"file":"did-document.d.ts","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,GAAG,EAAa,MAAM,UAAU,CAAA;AAqEzC;;;GAGG;AACH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;EAIpB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAQzD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB5B,CAAA;AAEF,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,KAAK,CAC/D,OAAO,iBAAiB,CACzB,GAAG;IAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAGvB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB7B,CAAA"}
1
+ {"version":3,"file":"did-document.d.ts","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,GAAG,EAAa,MAAM,UAAU,CAAA;AA+EzC;;;GAGG;AACH,QAAA,MAAM,gBAAgB;;;;;;;;;;;;EAIpB,CAAA;AAEF,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAA;AAQzD;;;GAGG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkB5B,CAAA;AAEF,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI,CAAC,CAAC,KAAK,CAC/D,OAAO,iBAAiB,CACzB,GAAG;IAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAGvB,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwB7B,CAAA"}
@@ -3,27 +3,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.didDocumentValidator = exports.didDocumentSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const did_js_1 = require("./did.js");
6
+ const uri_js_1 = require("./lib/uri.js");
6
7
  /**
7
8
  * RFC3968 compliant URI
8
9
  *
9
10
  * @see {@link https://www.rfc-editor.org/rfc/rfc3986}
10
11
  */
11
- const rfc3968UriSchema = zod_1.z.string().refine((data) => {
12
- try {
13
- new URL(data);
14
- return true;
15
- }
16
- catch {
17
- return false;
18
- }
19
- }, 'RFC3968 compliant URI');
12
+ const rfc3968UriSchema = zod_1.z.string().url('RFC3968 compliant URI');
20
13
  const didControllerSchema = zod_1.z.union([did_js_1.didSchema, zod_1.z.array(did_js_1.didSchema)]);
21
14
  /**
22
- * @note this schema might be too permissive
15
+ * @note this schema is too permissive
23
16
  */
24
17
  const didRelativeUriSchema = zod_1.z.union([
25
- rfc3968UriSchema,
26
- zod_1.z.string().regex(/^#[^#]+$/),
18
+ rfc3968UriSchema.refine((value) => {
19
+ const fragmentIndex = value.indexOf('#');
20
+ if (fragmentIndex === -1)
21
+ return false;
22
+ return (0, uri_js_1.isFragment)(value, fragmentIndex + 1);
23
+ }, {
24
+ message: 'Missing or invalid fragment in RFC3968 URI',
25
+ }),
26
+ zod_1.z
27
+ .string()
28
+ .refine((value) => value.charCodeAt(0) === 35 /* # */, {
29
+ message: 'Fragment must start with #',
30
+ })
31
+ .refine((value) => (0, uri_js_1.isFragment)(value, 1), {
32
+ message: 'Invalid char in URI fragment',
33
+ }),
27
34
  ]);
28
35
  const didVerificationMethodSchema = zod_1.z.object({
29
36
  id: didRelativeUriSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"did-document.js","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"did-document.js","sourceRoot":"","sources":["../src/did-document.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { Did, didSchema } from './did.js'\nimport { isFragment } from './lib/uri.js'\n\n/**\n * RFC3968 compliant URI\n *\n * @see {@link https://www.rfc-editor.org/rfc/rfc3986}\n */\nconst rfc3968UriSchema = z.string().url('RFC3968 compliant URI')\n\nconst didControllerSchema = z.union([didSchema, z.array(didSchema)])\n\n/**\n * @note this schema is too permissive\n */\nconst didRelativeUriSchema = z.union([\n rfc3968UriSchema.refine(\n (value) => {\n const fragmentIndex = value.indexOf('#')\n if (fragmentIndex === -1) return false\n return isFragment(value, fragmentIndex + 1)\n },\n {\n message: 'Missing or invalid fragment in RFC3968 URI',\n },\n ),\n z\n .string()\n .refine((value) => value.charCodeAt(0) === 35 /* # */, {\n message: 'Fragment must start with #',\n })\n .refine((value) => isFragment(value, 1), {\n message: 'Invalid char in URI fragment',\n }),\n])\n\nconst didVerificationMethodSchema = z.object({\n id: didRelativeUriSchema,\n type: z.string().min(1),\n controller: didControllerSchema,\n publicKeyJwk: z.record(z.string(), z.unknown()).optional(),\n publicKeyMultibase: z.string().optional(),\n})\n\n/**\n * The value of the id property MUST be a URI conforming to [RFC3986]. A\n * conforming producer MUST NOT produce multiple service entries with the same\n * id. A conforming consumer MUST produce an error if it detects multiple\n * service entries with the same id.\n *\n * @note Normally, only rfc3968UriSchema should be allowed here. However, the\n * did:plc uses relative URI. For this reason, we also allow relative URIs\n * here.\n */\nconst didServiceIdSchema = didRelativeUriSchema\n\n/**\n * The value of the type property MUST be a string or a set of strings. In order\n * to maximize interoperability, the service type and its associated properties\n * SHOULD be registered in the DID Specification Registries\n * [DID-SPEC-REGISTRIES].\n */\nconst didServiceTypeSchema = z.union([z.string(), z.array(z.string())])\n\n/**\n * The value of the serviceEndpoint property MUST be a string, a map, or a set\n * composed of one or more strings and/or maps. All string values MUST be valid\n * URIs conforming to [RFC3986] and normalized according to the Normalization\n * and Comparison rules in RFC3986 and to any normalization rules in its\n * applicable URI scheme specification.\n */\nconst didServiceEndpointSchema = z.union([\n rfc3968UriSchema,\n z.record(z.string(), rfc3968UriSchema),\n z\n .array(z.union([rfc3968UriSchema, z.record(z.string(), rfc3968UriSchema)]))\n .nonempty(),\n])\n\n/**\n * Each service map MUST contain id, type, and serviceEndpoint properties.\n * @see {@link https://www.w3.org/TR/did-core/#services}\n */\nconst didServiceSchema = z.object({\n id: didServiceIdSchema,\n type: didServiceTypeSchema,\n serviceEndpoint: didServiceEndpointSchema,\n})\n\nexport type DidService = z.infer<typeof didServiceSchema>\n\nconst didAuthenticationSchema = z.union([\n //\n didRelativeUriSchema,\n didVerificationMethodSchema,\n])\n\n/**\n * @note This schema is incomplete\n * @see {@link https://www.w3.org/TR/did-core/#production-0}\n */\nexport const didDocumentSchema = z.object({\n '@context': z.union([\n z.literal('https://www.w3.org/ns/did/v1'),\n z\n .array(z.string().url())\n .nonempty()\n .refine((data) => data[0] === 'https://www.w3.org/ns/did/v1', {\n message: 'First @context must be https://www.w3.org/ns/did/v1',\n }),\n ]),\n id: didSchema,\n controller: didControllerSchema.optional(),\n alsoKnownAs: z.array(rfc3968UriSchema).optional(),\n service: z.array(didServiceSchema).optional(),\n authentication: z.array(didAuthenticationSchema).optional(),\n verificationMethod: z\n .array(z.union([didVerificationMethodSchema, didRelativeUriSchema]))\n .optional(),\n})\n\nexport type DidDocument<Method extends string = string> = z.infer<\n typeof didDocumentSchema\n> & { id: Did<Method> }\n\n// @TODO: add other refinements ?\nexport const didDocumentValidator = didDocumentSchema\n // Ensure that every service id is unique\n .superRefine(({ id: did, service }, ctx) => {\n if (service) {\n const visited = new Set()\n\n for (let i = 0; i < service.length; i++) {\n const current = service[i]\n\n const serviceId = current.id.startsWith('#')\n ? `${did}${current.id}`\n : current.id\n\n if (!visited.has(serviceId)) {\n visited.add(serviceId)\n } else {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate service id (${current.id}) found in the document`,\n path: ['service', i, 'id'],\n })\n }\n }\n }\n })\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"did-error.js","sourceRoot":"","sources":["../src/did-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,QAAS,SAAQ,KAAK;IACjC,YACkB,GAAW,EAC3B,OAAe,EACC,IAAY,EACZ,SAAS,GAAG,EAC5B,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QANzB;;;;mBAAgB,GAAG;WAAQ;QAE3B;;;;mBAAgB,IAAI;WAAQ;QAC5B;;;;mBAAgB,MAAM;WAAM;IAI9B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAEQ,QAAQ;QACf,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IAC/E,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAc,EAAE,GAAW;QACrC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,OAAO,GACX,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,2BAA2B,CAAA;QAEnC,MAAM,MAAM,GACV,CAAC,OAAO,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,QAAQ;YACxC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;YACrB,CAAC,CAAC,SAAS,CAAC;YACd,CAAC,OAAO,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAEvE,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACvE,CAAC;CACF;AA1CD,4BA0CC;AAED,MAAa,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,GAAW,EAAE,OAAe,EAAE,KAAe;QACvD,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;CACF;AAJD,0CAIC"}
1
+ {"version":3,"file":"did-error.js","sourceRoot":"","sources":["../src/did-error.ts"],"names":[],"mappings":";;;AAAA,MAAa,QAAS,SAAQ,KAAK;IACjC,YACkB,GAAW,EAC3B,OAAe,EACC,IAAY,EACZ,SAAS,GAAG,EAC5B,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;QANzB;;;;mBAAgB,GAAG;WAAQ;QAE3B;;;;mBAAgB,IAAI;WAAQ;QAC5B;;;;mBAAgB,MAAM;WAAM;IAI9B,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAEQ,QAAQ;QACf,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;IAC/E,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,KAAc,EAAE,GAAW;QACrC,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,OAAO,GACX,KAAK,YAAY,KAAK;YACpB,CAAC,CAAC,KAAK,CAAC,OAAO;YACf,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;gBACzB,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,2BAA2B,CAAA;QAEnC,MAAM,MAAM,GACV,CAAC,OAAO,KAAK,EAAE,CAAC,YAAY,CAAC,KAAK,QAAQ;YACxC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;YACrB,CAAC,CAAC,SAAS,CAAC;YACd,CAAC,OAAO,KAAK,EAAE,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAEvE,OAAO,IAAI,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;IACvE,CAAC;CACF;AA1CD,4BA0CC;AAED,MAAa,eAAgB,SAAQ,QAAQ;IAC3C,YAAY,GAAW,EAAE,OAAe,EAAE,KAAe;QACvD,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;IAChD,CAAC;CACF;AAJD,0CAIC","sourcesContent":["export class DidError extends Error {\n constructor(\n public readonly did: string,\n message: string,\n public readonly code: string,\n public readonly status = 400,\n cause?: unknown,\n ) {\n super(message, { cause })\n }\n\n /**\n * For compatibility with error handlers in common HTTP frameworks.\n */\n get statusCode() {\n return this.status\n }\n\n override toString() {\n return `${this.constructor.name} ${this.code} (${this.did}): ${this.message}`\n }\n\n static from(cause: unknown, did: string): DidError {\n if (cause instanceof DidError) {\n return cause\n }\n\n const message =\n cause instanceof Error\n ? cause.message\n : typeof cause === 'string'\n ? cause\n : 'An unknown error occurred'\n\n const status =\n (typeof cause?.['statusCode'] === 'number'\n ? cause['statusCode']\n : undefined) ??\n (typeof cause?.['status'] === 'number' ? cause['status'] : undefined)\n\n return new DidError(did, message, 'did-unknown-error', status, cause)\n }\n}\n\nexport class InvalidDidError extends DidError {\n constructor(did: string, message: string, cause?: unknown) {\n super(did, message, 'did-invalid', 400, cause)\n }\n}\n"]}
package/dist/did.d.ts CHANGED
@@ -52,6 +52,6 @@ export declare function extractDidMethod<D extends Did>(did: D): D extends Did<i
52
52
  export declare function assertDidMsid(input: string, start?: number, end?: number): void;
53
53
  export declare function assertDid(input: unknown): asserts input is Did;
54
54
  export declare function isDid(input: unknown): input is Did;
55
- export declare function asDid(input: unknown): Did;
55
+ export declare function asDid<T>(input: T): T & `did:${string}:${string}`;
56
56
  export declare const didSchema: z.ZodEffects<z.ZodString, `did:${string}:${string}`, string>;
57
57
  //# sourceMappingURL=did.d.ts.map
package/dist/did.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,QAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAA;AAE9E;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC,GACzC,MAAM,GACN,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAE9B,KAAK,gBAAgB,GAAG,SAAS,GAAG,cAAc,CAAA;AAClD,KAAK,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAC1E,KAAK,cAAc,GACf,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,CAAA;AAEP,KAAK,mBAAmB,CACtB,CAAC,EACD,GAAG,SAAS,MAAM,IAChB,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,GAChC,CAAC,SAAS,gBAAgB,GACxB,mBAAmB,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GACpC,KAAK,GACP,GAAG,SAAS,EAAE,GACZ,KAAK,GACL,GAAG,CAAA;AAET;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CA0BN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,GAGnC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CACrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CAuEN;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAqB9D;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAYlD;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAGzC;AAED,eAAO,MAAM,SAAS,8DAalB,CAAA"}
1
+ {"version":3,"file":"did.d.ts","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,QAAA,MAAM,UAAU,SAAS,CAAA;AAEzB,OAAO,EAAE,UAAU,EAAE,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAA;AAE9E;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,MAAM,SAAS,CAAC,GACzC,MAAM,GACN,mBAAmB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AAE9B,KAAK,gBAAgB,GAAG,SAAS,GAAG,cAAc,CAAA;AAClD,KAAK,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;AAC1E,KAAK,cAAc,GACf,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,GACH,GAAG,CAAA;AAEP,KAAK,mBAAmB,CACtB,CAAC,EACD,GAAG,SAAS,MAAM,IAChB,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,GAChC,CAAC,SAAS,gBAAgB,GACxB,mBAAmB,CAAC,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GACpC,KAAK,GACP,GAAG,SAAS,EAAE,GACZ,KAAK,GACL,GAAG,CAAA;AAET;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CA0BN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,GAAG,EAAE,GAAG,EAAE,CAAC,GAGnC,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CACrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,MAAM,EACb,KAAK,SAAI,EACT,GAAG,SAAe,GACjB,IAAI,CAuEN;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAqB9D;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAYlD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,iCAGhC;AAED,eAAO,MAAM,SAAS,8DAalB,CAAA"}
package/dist/did.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"did.js","sourceRoot":"","sources":["../src/did.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from 'zod'\nimport { DidError, InvalidDidError } from './did-error.js'\n\nconst DID_PREFIX = 'did:'\nconst DID_PREFIX_LENGTH = DID_PREFIX.length\nexport { DID_PREFIX }\n\n/**\n * Type representation of a Did, with method.\n *\n * ```bnf\n * did = \"did:\" method-name \":\" method-specific-id\n * method-name = 1*method-char\n * method-char = %x61-7A / DIGIT\n * method-specific-id = *( *idchar \":\" ) 1*idchar\n * idchar = ALPHA / DIGIT / \".\" / \"-\" / \"_\" / pct-encoded\n * pct-encoded = \"%\" HEXDIG HEXDIG\n * ```\n *\n * @example\n * ```ts\n * type DidWeb = Did<'web'> // `did:web:${string}`\n * type DidCustom = Did<'web' | 'plc'> // `did:${'web' | 'plc'}:${string}`\n * type DidNever = Did<' invalid 🥴 '> // never\n * type DidFoo = Did<'foo' | ' invalid 🥴 '> // `did:foo:${string}`\n * ```\n *\n * @see {@link https://www.w3.org/TR/did-core/#did-syntax}\n */\nexport type Did<M extends string = string> = `did:${AsDidMethod<M>}:${string}`\n\n/**\n * DID Method\n */\nexport type AsDidMethod<M> = string extends M\n ? string // can't know...\n : AsDidMethodInternal<M, ''>\n\ntype AlphanumericChar = DigitChar | LowerAlphaChar\ntype DigitChar = '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'\ntype LowerAlphaChar =\n | 'a'\n | 'b'\n | 'c'\n | 'd'\n | 'e'\n | 'f'\n | 'g'\n | 'h'\n | 'i'\n | 'j'\n | 'k'\n | 'l'\n | 'm'\n | 'n'\n | 'o'\n | 'p'\n | 'q'\n | 'r'\n | 's'\n | 't'\n | 'u'\n | 'v'\n | 'w'\n | 'x'\n | 'y'\n | 'z'\n\ntype AsDidMethodInternal<\n S,\n Acc extends string,\n> = S extends `${infer H}${infer T}`\n ? H extends AlphanumericChar\n ? AsDidMethodInternal<T, `${Acc}${H}`>\n : never\n : Acc extends ''\n ? never\n : Acc\n\n/**\n * DID Method-name check function.\n *\n * Check if the input is a valid DID method name, at the position between\n * `start` (inclusive) and `end` (exclusive).\n */\nexport function assertDidMethod(\n input: string,\n start = 0,\n end = input.length,\n): void {\n if (\n !Number.isFinite(end) ||\n !Number.isFinite(start) ||\n end < start ||\n end > input.length\n ) {\n throw new TypeError('Invalid start or end position')\n }\n if (end === start) {\n throw new InvalidDidError(input, `Empty method name`)\n }\n\n let c: number\n for (let i = start; i < end; i++) {\n c = input.charCodeAt(i)\n if (\n (c < 0x61 || c > 0x7a) && // a-z\n (c < 0x30 || c > 0x39) // 0-9\n ) {\n throw new InvalidDidError(\n input,\n `Invalid character at position ${i} in DID method name`,\n )\n }\n }\n}\n\n/**\n * This method assumes the input is a valid Did\n */\nexport function extractDidMethod<D extends Did>(did: D) {\n const msidSep = did.indexOf(':', DID_PREFIX_LENGTH)\n const method = did.slice(DID_PREFIX_LENGTH, msidSep)\n return method as D extends Did<infer M> ? M : string\n}\n\n/**\n * DID Method-specific identifier check function.\n *\n * Check if the input is a valid DID method-specific identifier, at the position\n * between `start` (inclusive) and `end` (exclusive).\n */\nexport function assertDidMsid(\n input: string,\n start = 0,\n end = input.length,\n): void {\n if (\n !Number.isFinite(end) ||\n !Number.isFinite(start) ||\n end < start ||\n end > input.length\n ) {\n throw new TypeError('Invalid start or end position')\n }\n if (end === start) {\n throw new InvalidDidError(input, `DID method-specific id must not be empty`)\n }\n\n let c: number\n for (let i = start; i < end; i++) {\n c = input.charCodeAt(i)\n\n // Check for frequent chars first\n if (\n (c < 0x61 || c > 0x7a) && // a-z\n (c < 0x41 || c > 0x5a) && // A-Z\n (c < 0x30 || c > 0x39) && // 0-9\n c !== 0x2e && // .\n c !== 0x2d && // -\n c !== 0x5f // _\n ) {\n // Less frequent chars are checked here\n\n // \":\"\n if (c === 0x3a) {\n if (i === end - 1) {\n throw new InvalidDidError(input, `DID cannot end with \":\"`)\n }\n continue\n }\n\n // pct-encoded\n if (c === 0x25) {\n c = input.charCodeAt(++i)\n if ((c < 0x30 || c > 0x39) && (c < 0x41 || c > 0x46)) {\n throw new InvalidDidError(\n input,\n `Invalid pct-encoded character at position ${i}`,\n )\n }\n\n c = input.charCodeAt(++i)\n if ((c < 0x30 || c > 0x39) && (c < 0x41 || c > 0x46)) {\n throw new InvalidDidError(\n input,\n `Invalid pct-encoded character at position ${i}`,\n )\n }\n\n // There must always be 2 HEXDIG after a \"%\"\n if (i >= end) {\n throw new InvalidDidError(\n input,\n `Incomplete pct-encoded character at position ${i - 2}`,\n )\n }\n\n continue\n }\n\n throw new InvalidDidError(\n input,\n `Disallowed character in DID at position ${i}`,\n )\n }\n }\n}\n\nexport function assertDid(input: unknown): asserts input is Did {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n }\n\n const { length } = input\n if (length > 2048) {\n throw new InvalidDidError(input, `DID is too long (2048 chars max)`)\n }\n\n if (!input.startsWith(DID_PREFIX)) {\n throw new InvalidDidError(input, `DID requires \"${DID_PREFIX}\" prefix`)\n }\n\n const idSep = input.indexOf(':', DID_PREFIX_LENGTH)\n if (idSep === -1) {\n throw new InvalidDidError(input, `Missing colon after method name`)\n }\n\n assertDidMethod(input, DID_PREFIX_LENGTH, idSep)\n assertDidMsid(input, idSep + 1, length)\n}\n\nexport function isDid(input: unknown): input is Did {\n try {\n assertDid(input)\n return true\n } catch (err) {\n if (err instanceof DidError) {\n return false\n }\n\n // Unexpected TypeError (should never happen)\n throw err\n }\n}\n\nexport function asDid<T>(input: T) {\n assertDid(input)\n return input\n}\n\nexport const didSchema = z\n .string()\n .superRefine((value: string, ctx: z.RefinementCtx): value is Did => {\n try {\n assertDid(value)\n return true\n } catch (err) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: err instanceof Error ? err.message : 'Unexpected error',\n })\n return false\n }\n })\n"]}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,oDAAiC;AACjC,iDAA8B;AAC9B,2CAAwB;AACxB,+CAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA4B;AAC5B,oDAAiC;AACjC,iDAA8B;AAC9B,2CAAwB;AACxB,+CAA4B","sourcesContent":["export * from './atproto.js'\nexport * from './did-document.js'\nexport * from './did-error.js'\nexport * from './did.js'\nexport * from './methods.js'\n"]}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}
3
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}
4
+ */
5
+ export declare function isFragment(value: string, startIdx?: number, endIdx?: number): boolean;
6
+ export declare function isHexDigit(code: number): boolean;
7
+ //# sourceMappingURL=uri.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri.d.ts","sourceRoot":"","sources":["../../src/lib/uri.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,QAAQ,SAAI,EACZ,MAAM,SAAe,GACpB,OAAO,CAkDT;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMhD"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isFragment = isFragment;
4
+ exports.isHexDigit = isHexDigit;
5
+ /**
6
+ * @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}
7
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}
8
+ */
9
+ function isFragment(value, startIdx = 0, endIdx = value.length) {
10
+ let charCode;
11
+ for (let i = startIdx; i < endIdx; i++) {
12
+ charCode = value.charCodeAt(i);
13
+ // fragment = *( pchar / "/" / "?" )
14
+ // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
15
+ // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
16
+ // pct-encoded = "%" HEXDIG HEXDIG
17
+ // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
18
+ if ((charCode >= 65 /* A */ && charCode <= 90) /* Z */ ||
19
+ (charCode >= 97 /* a */ && charCode <= 122) /* z */ ||
20
+ (charCode >= 48 /* 0 */ && charCode <= 57) /* 9 */ ||
21
+ charCode === 45 /* "-" */ ||
22
+ charCode === 46 /* "." */ ||
23
+ charCode === 95 /* "_" */ ||
24
+ charCode === 126 /* "~" */) {
25
+ // unreserved
26
+ }
27
+ else if (charCode === 33 /* "!" */ ||
28
+ charCode === 36 /* "$" */ ||
29
+ charCode === 38 /* "&" */ ||
30
+ charCode === 39 /* "'" */ ||
31
+ charCode === 40 /* "(" */ ||
32
+ charCode === 41 /* ")" */ ||
33
+ charCode === 42 /* "*" */ ||
34
+ charCode === 43 /* "+" */ ||
35
+ charCode === 44 /* "," */ ||
36
+ charCode === 59 /* ";" */ ||
37
+ charCode === 61 /* "=" */) {
38
+ // sub-delims
39
+ }
40
+ else if (charCode === 58 /* ":" */ || charCode === 64 /* "@" */) {
41
+ // pchar extra
42
+ }
43
+ else if (charCode === 47 /* "/" */ || charCode === 63 /* "?" */) {
44
+ // fragment extra
45
+ }
46
+ else if (charCode === 37 /* "%" */) {
47
+ // pct-enc
48
+ if (i + 2 >= endIdx)
49
+ return false;
50
+ if (!isHexDigit(value.charCodeAt(i + 1)))
51
+ return false;
52
+ if (!isHexDigit(value.charCodeAt(i + 2)))
53
+ return false;
54
+ i += 2;
55
+ }
56
+ else {
57
+ return false;
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+ function isHexDigit(code) {
63
+ return ((code >= 48 && code <= 57) || // 0-9
64
+ (code >= 65 && code <= 70) || // A-F
65
+ (code >= 97 && code <= 102) // a-f
66
+ );
67
+ }
68
+ //# sourceMappingURL=uri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri.js","sourceRoot":"","sources":["../../src/lib/uri.ts"],"names":[],"mappings":";;AAIA,gCAsDC;AAED,gCAMC;AAlED;;;GAGG;AACH,SAAgB,UAAU,CACxB,KAAa,EACb,QAAQ,GAAG,CAAC,EACZ,MAAM,GAAG,KAAK,CAAC,MAAM;IAErB,IAAI,QAAgB,CAAA;IACpB,KAAK,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;QAE9B,uCAAuC;QACvC,kEAAkE;QAClE,sDAAsD;QACtD,kCAAkC;QAClC,gFAAgF;QAChF,IACE,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO;YAClD,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,IAAI,QAAQ,IAAI,GAAG,CAAC,CAAC,OAAO;YACnD,CAAC,QAAQ,IAAI,EAAE,CAAC,OAAO,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO;YAClD,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,GAAG,CAAC,SAAS,EAC1B,CAAC;YACD,aAAa;QACf,CAAC;aAAM,IACL,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS;YACzB,QAAQ,KAAK,EAAE,CAAC,SAAS,EACzB,CAAC;YACD,aAAa;QACf,CAAC;aAAM,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;YAClE,cAAc;QAChB,CAAC;aAAM,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;YAClE,iBAAiB;QACnB,CAAC;aAAM,IAAI,QAAQ,KAAK,EAAE,CAAC,SAAS,EAAE,CAAC;YACrC,UAAU;YACV,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM;gBAAE,OAAO,KAAK,CAAA;YACjC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;YACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;YACtD,CAAC,IAAI,CAAC,CAAA;QACR,CAAC;aAAM,CAAC;YACN,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,CACL,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM;QACpC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,MAAM;QACpC,CAAC,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,MAAM;KACnC,CAAA;AACH,CAAC","sourcesContent":["/**\n * @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}\n * @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}\n */\nexport function isFragment(\n value: string,\n startIdx = 0,\n endIdx = value.length,\n): boolean {\n let charCode: number\n for (let i = startIdx; i < endIdx; i++) {\n charCode = value.charCodeAt(i)\n\n // fragment = *( pchar / \"/\" / \"?\" )\n // pchar = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\n // unreserved = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\n // pct-encoded = \"%\" HEXDIG HEXDIG\n // sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\" / \"*\" / \"+\" / \",\" / \";\" / \"=\"\n if (\n (charCode >= 65 /* A */ && charCode <= 90) /* Z */ ||\n (charCode >= 97 /* a */ && charCode <= 122) /* z */ ||\n (charCode >= 48 /* 0 */ && charCode <= 57) /* 9 */ ||\n charCode === 45 /* \"-\" */ ||\n charCode === 46 /* \".\" */ ||\n charCode === 95 /* \"_\" */ ||\n charCode === 126 /* \"~\" */\n ) {\n // unreserved\n } else if (\n charCode === 33 /* \"!\" */ ||\n charCode === 36 /* \"$\" */ ||\n charCode === 38 /* \"&\" */ ||\n charCode === 39 /* \"'\" */ ||\n charCode === 40 /* \"(\" */ ||\n charCode === 41 /* \")\" */ ||\n charCode === 42 /* \"*\" */ ||\n charCode === 43 /* \"+\" */ ||\n charCode === 44 /* \",\" */ ||\n charCode === 59 /* \";\" */ ||\n charCode === 61 /* \"=\" */\n ) {\n // sub-delims\n } else if (charCode === 58 /* \":\" */ || charCode === 64 /* \"@\" */) {\n // pchar extra\n } else if (charCode === 47 /* \"/\" */ || charCode === 63 /* \"?\" */) {\n // fragment extra\n } else if (charCode === 37 /* \"%\" */) {\n // pct-enc\n if (i + 2 >= endIdx) return false\n if (!isHexDigit(value.charCodeAt(i + 1))) return false\n if (!isHexDigit(value.charCodeAt(i + 2))) return false\n i += 2\n } else {\n return false\n }\n }\n\n return true\n}\n\nexport function isHexDigit(code: number): boolean {\n return (\n (code >= 48 && code <= 57) || // 0-9\n (code >= 65 && code <= 70) || // A-F\n (code >= 97 && code <= 102) // a-f\n )\n}\n"]}
@@ -2,6 +2,6 @@ import { Did } from '../did.js';
2
2
  declare const DID_PLC_PREFIX = "did:plc:";
3
3
  export { DID_PLC_PREFIX };
4
4
  export declare function isDidPlc(input: unknown): input is Did<'plc'>;
5
- export declare function asDidPlc(input: unknown): Did<'plc'>;
5
+ export declare function asDidPlc<T>(input: T): T & `did:plc:${string}`;
6
6
  export declare function assertDidPlc(input: unknown): asserts input is Did<'plc'>;
7
7
  //# sourceMappingURL=plc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plc.d.ts","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAE/B,QAAA,MAAM,cAAc,aAAa,CAAA;AAIjC,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAS5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAGnD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAyBxE"}
1
+ {"version":3,"file":"plc.d.ts","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAE/B,QAAA,MAAM,cAAc,aAAa,CAAA;AAIjC,OAAO,EAAE,cAAc,EAAE,CAAA;AAEzB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAS5D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,2BAGnC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAyBxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"plc.js","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":";;;AASA,4BASC;AAED,4BAGC;AAED,oCAyBC;AAlDD,kDAAiD;AAGjD,MAAM,cAAc,GAAG,UAAU,CAAA;AAIxB,wCAAc;AAHvB,MAAM,qBAAqB,GAAG,cAAc,CAAC,MAAM,CAAA;AACnD,MAAM,cAAc,GAAG,EAAE,CAAA;AAIzB,SAAgB,QAAQ,CAAC,KAAc;IACrC,8DAA8D;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc;QAAE,OAAO,KAAK,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAA;IACnD,KAAK,IAAI,CAAC,GAAG,qBAAqB,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACtD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,QAAQ,CAAC,KAAc;IACrC,YAAY,CAAC,KAAK,CAAC,CAAA;IACnB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,8BAAe,CAAC,OAAO,KAAK,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,mBAAmB,cAAc,kBAAkB,CACpD,CAAA;IACH,CAAC;IAED,2EAA2E;IAE3E,8CAA8C;IAE9C,KAAK,IAAI,CAAC,GAAG,qBAAqB,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,iCAAiC,CAAC,EAAE,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAS,EAAW,EAAE,CAC1C,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA,CAAC,WAAW"}
1
+ {"version":3,"file":"plc.js","sourceRoot":"","sources":["../../src/methods/plc.ts"],"names":[],"mappings":";;;AASA,4BASC;AAED,4BAGC;AAED,oCAyBC;AAlDD,kDAAiD;AAGjD,MAAM,cAAc,GAAG,UAAU,CAAA;AAIxB,wCAAc;AAHvB,MAAM,qBAAqB,GAAG,cAAc,CAAC,MAAM,CAAA;AACnD,MAAM,cAAc,GAAG,EAAE,CAAA;AAIzB,SAAgB,QAAQ,CAAC,KAAc;IACrC,8DAA8D;IAC9D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc;QAAE,OAAO,KAAK,CAAA;IACjD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC;QAAE,OAAO,KAAK,CAAA;IACnD,KAAK,IAAI,CAAC,GAAG,qBAAqB,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAA;IACtD,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAgB,QAAQ,CAAI,KAAQ;IAClC,YAAY,CAAC,KAAK,CAAC,CAAA;IACnB,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,8BAAe,CAAC,OAAO,KAAK,EAAE,sBAAsB,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAA;IAC5D,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,cAAc,EAAE,CAAC;QACpC,MAAM,IAAI,8BAAe,CACvB,KAAK,EACL,mBAAmB,cAAc,kBAAkB,CACpD,CAAA;IACH,CAAC;IAED,2EAA2E;IAE3E,8CAA8C;IAE9C,KAAK,IAAI,CAAC,GAAG,qBAAqB,EAAE,CAAC,GAAG,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACvC,MAAM,IAAI,8BAAe,CAAC,KAAK,EAAE,iCAAiC,CAAC,EAAE,CAAC,CAAA;QACxE,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,CAAS,EAAW,EAAE,CAC1C,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,CAAA,CAAC,WAAW","sourcesContent":["import { InvalidDidError } from '../did-error.js'\nimport { Did } from '../did.js'\n\nconst DID_PLC_PREFIX = `did:plc:`\nconst DID_PLC_PREFIX_LENGTH = DID_PLC_PREFIX.length\nconst DID_PLC_LENGTH = 32\n\nexport { DID_PLC_PREFIX }\n\nexport function isDidPlc(input: unknown): input is Did<'plc'> {\n // Optimization: equivalent to try/catch around \"assertDidPlc\"\n if (typeof input !== 'string') return false\n if (input.length !== DID_PLC_LENGTH) return false\n if (!input.startsWith(DID_PLC_PREFIX)) return false\n for (let i = DID_PLC_PREFIX_LENGTH; i < DID_PLC_LENGTH; i++) {\n if (!isBase32Char(input.charCodeAt(i))) return false\n }\n return true\n}\n\nexport function asDidPlc<T>(input: T) {\n assertDidPlc(input)\n return input\n}\n\nexport function assertDidPlc(input: unknown): asserts input is Did<'plc'> {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n }\n\n if (!input.startsWith(DID_PLC_PREFIX)) {\n throw new InvalidDidError(input, `Invalid did:plc prefix`)\n }\n\n if (input.length !== DID_PLC_LENGTH) {\n throw new InvalidDidError(\n input,\n `did:plc must be ${DID_PLC_LENGTH} characters long`,\n )\n }\n\n // The following check is not necessary, as the check below is more strict:\n\n // assertDidMsid(input, DID_PLC_PREFIX.length)\n\n for (let i = DID_PLC_PREFIX_LENGTH; i < DID_PLC_LENGTH; i++) {\n if (!isBase32Char(input.charCodeAt(i))) {\n throw new InvalidDidError(input, `Invalid character at position ${i}`)\n }\n }\n}\n\nconst isBase32Char = (c: number): boolean =>\n (c >= 0x61 && c <= 0x7a) || (c >= 0x32 && c <= 0x37) // [a-z2-7]\n"]}
@@ -4,10 +4,11 @@ export declare const DID_WEB_PREFIX = "did:web:";
4
4
  * This function checks if the input is a valid Web DID, as per DID spec.
5
5
  */
6
6
  export declare function isDidWeb(input: unknown): input is Did<'web'>;
7
- export declare function asDidWeb(input: unknown): Did<'web'>;
7
+ export declare function asDidWeb<T>(input: T): T & `did:web:${string}`;
8
8
  export declare function assertDidWeb(input: unknown): asserts input is Did<'web'>;
9
9
  export declare function didWebToUrl(did: Did<'web'>): URL & {
10
10
  protocol: "http:" | "https:";
11
11
  };
12
12
  export declare function urlToDidWeb(url: URL): Did<'web'>;
13
+ export declare function buildDidWebUrl(did: Did<'web'>): string;
13
14
  //# sourceMappingURL=web.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAiB,MAAM,WAAW,CAAA;AAE9C,eAAO,MAAM,cAAc,aAAkC,CAAA;AAE7D;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAY5D;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,CAGnD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAcxE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;cAahB,OAAO,GAAG,QAAQ;EAQ5C;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAKhD"}
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAiB,MAAM,WAAW,CAAA;AAE9C,eAAO,MAAM,cAAc,aAAkC,CAAA;AAa7D;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAa5D;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,2BAGnC;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,CAmBxE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC;cAG3B,OAAO,GAAG,QAAQ;EAKjC;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAKhD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAetD"}
@@ -6,9 +6,20 @@ exports.asDidWeb = asDidWeb;
6
6
  exports.assertDidWeb = assertDidWeb;
7
7
  exports.didWebToUrl = didWebToUrl;
8
8
  exports.urlToDidWeb = urlToDidWeb;
9
+ exports.buildDidWebUrl = buildDidWebUrl;
9
10
  const did_error_js_1 = require("../did-error.js");
10
11
  const did_js_1 = require("../did.js");
11
12
  exports.DID_WEB_PREFIX = `did:web:`;
13
+ const canParse = URL.canParse?.bind(URL) ??
14
+ ((url, base) => {
15
+ try {
16
+ new URL(url, base);
17
+ return true;
18
+ }
19
+ catch {
20
+ return false;
21
+ }
22
+ });
12
23
  /**
13
24
  * This function checks if the input is a valid Web DID, as per DID spec.
14
25
  */
@@ -21,12 +32,12 @@ function isDidWeb(input) {
21
32
  if (input.charAt(exports.DID_WEB_PREFIX.length) === ':')
22
33
  return false;
23
34
  try {
24
- didWebToUrl(input);
25
- return true;
35
+ (0, did_js_1.assertDidMsid)(input, exports.DID_WEB_PREFIX.length);
26
36
  }
27
37
  catch {
28
38
  return false;
29
39
  }
40
+ return canParse(buildDidWebUrl(input));
30
41
  }
31
42
  function asDidWeb(input) {
32
43
  assertDidWeb(input);
@@ -42,21 +53,15 @@ function assertDidWeb(input) {
42
53
  if (input.charAt(exports.DID_WEB_PREFIX.length) === ':') {
43
54
  throw new did_error_js_1.InvalidDidError(input, 'did:web MSID must not start with a colon');
44
55
  }
45
- void didWebToUrl(input);
56
+ // Make sure every char is valid (per DID spec)
57
+ (0, did_js_1.assertDidMsid)(input, exports.DID_WEB_PREFIX.length);
58
+ if (!canParse(buildDidWebUrl(input))) {
59
+ throw new did_error_js_1.InvalidDidError(input, 'Invalid Web DID');
60
+ }
46
61
  }
47
62
  function didWebToUrl(did) {
48
- // Make sure every char is valid (per DID spec)
49
- (0, did_js_1.assertDidMsid)(did, exports.DID_WEB_PREFIX.length);
50
- const hostIdx = exports.DID_WEB_PREFIX.length;
51
- const pathIdx = did.indexOf(':', hostIdx);
52
- const host = pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx);
53
- const path = pathIdx === -1 ? '' : did.slice(pathIdx);
54
63
  try {
55
- const url = new URL(`https://${host.replaceAll('%3A', ':')}${path.replaceAll(':', '/')}`);
56
- if (url.hostname === 'localhost') {
57
- url.protocol = 'http:';
58
- }
59
- return url;
64
+ return new URL(buildDidWebUrl(did));
60
65
  }
61
66
  catch (cause) {
62
67
  throw new did_error_js_1.InvalidDidError(did, 'Invalid Web DID', cause);
@@ -67,4 +72,16 @@ function urlToDidWeb(url) {
67
72
  const path = url.pathname === '/' ? '' : url.pathname.replaceAll('/', ':');
68
73
  return `did:web:${url.hostname}${port}${path}`;
69
74
  }
75
+ function buildDidWebUrl(did) {
76
+ const hostIdx = exports.DID_WEB_PREFIX.length;
77
+ const pathIdx = did.indexOf(':', hostIdx);
78
+ const hostEnc = pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx);
79
+ const host = hostEnc.replaceAll('%3A', ':');
80
+ const path = pathIdx === -1 ? '' : did.slice(pathIdx).replaceAll(':', '/');
81
+ const proto = host.startsWith('localhost') &&
82
+ (host.length === 9 || host.charCodeAt(9) === 58) /* ':' */
83
+ ? 'http'
84
+ : 'https';
85
+ return `${proto}://${host}${path}`;
86
+ }
70
87
  //# sourceMappingURL=web.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../src/methods/web.ts"],"names":[],"mappings":"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","sourcesContent":["import { InvalidDidError } from '../did-error.js'\nimport { Did, assertDidMsid } from '../did.js'\n\nexport const DID_WEB_PREFIX = `did:web:` satisfies Did<'web'>\n\nconst canParse =\n URL.canParse?.bind(URL) ??\n ((url, base) => {\n try {\n new URL(url, base)\n return true\n } catch {\n return false\n }\n })\n\n/**\n * This function checks if the input is a valid Web DID, as per DID spec.\n */\nexport function isDidWeb(input: unknown): input is Did<'web'> {\n // Optimization: make cheap checks first\n if (typeof input !== 'string') return false\n if (!input.startsWith(DID_WEB_PREFIX)) return false\n if (input.charAt(DID_WEB_PREFIX.length) === ':') return false\n\n try {\n assertDidMsid(input, DID_WEB_PREFIX.length)\n } catch {\n return false\n }\n\n return canParse(buildDidWebUrl(input as Did<'web'>))\n}\n\nexport function asDidWeb<T>(input: T) {\n assertDidWeb(input)\n return input\n}\n\nexport function assertDidWeb(input: unknown): asserts input is Did<'web'> {\n if (typeof input !== 'string') {\n throw new InvalidDidError(typeof input, `DID must be a string`)\n }\n\n if (!input.startsWith(DID_WEB_PREFIX)) {\n throw new InvalidDidError(input, `Invalid did:web prefix`)\n }\n\n if (input.charAt(DID_WEB_PREFIX.length) === ':') {\n throw new InvalidDidError(input, 'did:web MSID must not start with a colon')\n }\n\n // Make sure every char is valid (per DID spec)\n assertDidMsid(input, DID_WEB_PREFIX.length)\n\n if (!canParse(buildDidWebUrl(input as Did<'web'>))) {\n throw new InvalidDidError(input, 'Invalid Web DID')\n }\n}\n\nexport function didWebToUrl(did: Did<'web'>) {\n try {\n return new URL(buildDidWebUrl(did)) as URL & {\n protocol: 'http:' | 'https:'\n }\n } catch (cause) {\n throw new InvalidDidError(did, 'Invalid Web DID', cause)\n }\n}\n\nexport function urlToDidWeb(url: URL): Did<'web'> {\n const port = url.port ? `%3A${url.port}` : ''\n const path = url.pathname === '/' ? '' : url.pathname.replaceAll('/', ':')\n\n return `did:web:${url.hostname}${port}${path}`\n}\n\nexport function buildDidWebUrl(did: Did<'web'>): string {\n const hostIdx = DID_WEB_PREFIX.length\n const pathIdx = did.indexOf(':', hostIdx)\n\n const hostEnc =\n pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx)\n const host = hostEnc.replaceAll('%3A', ':')\n const path = pathIdx === -1 ? '' : did.slice(pathIdx).replaceAll(':', '/')\n const proto =\n host.startsWith('localhost') &&\n (host.length === 9 || host.charCodeAt(9) === 58) /* ':' */\n ? 'http'\n : 'https'\n\n return `${proto}://${host}${path}`\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,mDAAgC"}
1
+ {"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/methods.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,mDAAgC","sourcesContent":["export * from './methods/plc.js'\nexport * from './methods/web.js'\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/did",
3
- "version": "0.1.5",
3
+ "version": "0.2.1",
4
4
  "license": "MIT",
5
5
  "description": "DID resolution and verification library",
6
6
  "keywords": [
package/src/atproto.ts CHANGED
@@ -1,12 +1,14 @@
1
1
  import { z } from 'zod'
2
2
  import { InvalidDidError } from './did-error.js'
3
3
  import { Did } from './did.js'
4
+ import { isFragment } from './lib/uri.js'
4
5
  import {
5
6
  DID_PLC_PREFIX,
6
7
  DID_WEB_PREFIX,
7
8
  assertDidPlc,
8
9
  assertDidWeb,
9
10
  isDidPlc,
11
+ isDidWeb,
10
12
  } from './methods.js'
11
13
 
12
14
  // This file contains atproto-specific DID validation utilities.
@@ -19,21 +21,10 @@ export const atprotoDidSchema = z
19
21
  .refine(isAtprotoDid, `Atproto only allows "plc" and "web" DID methods`)
20
22
 
21
23
  export function isAtprotoDid(input: unknown): input is AtprotoDid {
22
- // Optimized equivalent of:
23
- // return isDidPlc(input) || isAtprotoDidWeb(input)
24
-
25
- if (typeof input !== 'string') {
26
- return false
27
- } else if (input.startsWith(DID_PLC_PREFIX)) {
28
- return isDidPlc(input)
29
- } else if (input.startsWith(DID_WEB_PREFIX)) {
30
- return isAtprotoDidWeb(input)
31
- } else {
32
- return false
33
- }
24
+ return isDidPlc(input) || isAtprotoDidWeb(input)
34
25
  }
35
26
 
36
- export function asAtprotoDid(input: unknown): AtprotoDid {
27
+ export function asAtprotoDid<T>(input: T) {
37
28
  assertAtprotoDid(input)
38
29
  return input
39
30
  }
@@ -58,17 +49,14 @@ export function assertAtprotoDidWeb(
58
49
  ): asserts input is Did<'web'> {
59
50
  assertDidWeb(input)
60
51
 
61
- if (input.includes(':', DID_WEB_PREFIX.length)) {
52
+ if (isDidWebWithPath(input)) {
62
53
  throw new InvalidDidError(
63
54
  input,
64
55
  `Atproto does not allow path components in Web DIDs`,
65
56
  )
66
57
  }
67
58
 
68
- if (
69
- input.includes('%3A', DID_WEB_PREFIX.length) &&
70
- !input.startsWith('did:web:localhost%3A')
71
- ) {
59
+ if (isDidWebWithHttpsPort(input)) {
72
60
  throw new InvalidDidError(
73
61
  input,
74
62
  `Atproto does not allow port numbers in Web DIDs, except for localhost`,
@@ -80,10 +68,57 @@ export function assertAtprotoDidWeb(
80
68
  * @see {@link https://atproto.com/specs/did#blessed-did-methods}
81
69
  */
82
70
  export function isAtprotoDidWeb(input: unknown): input is Did<'web'> {
83
- try {
84
- assertAtprotoDidWeb(input)
85
- return true
86
- } catch {
71
+ if (!isDidWeb(input)) {
87
72
  return false
88
73
  }
74
+
75
+ if (isDidWebWithPath(input)) {
76
+ return false
77
+ }
78
+
79
+ if (isDidWebWithHttpsPort(input)) {
80
+ return false
81
+ }
82
+
83
+ return true
84
+ }
85
+
86
+ function isDidWebWithPath(did: Did<'web'>): boolean {
87
+ return did.includes(':', DID_WEB_PREFIX.length)
88
+ }
89
+
90
+ function isLocalhostDid(did: Did<'web'>): boolean {
91
+ return (
92
+ did === 'did:web:localhost' ||
93
+ did.startsWith('did:web:localhost:') ||
94
+ did.startsWith('did:web:localhost%3A')
95
+ )
96
+ }
97
+
98
+ function isDidWebWithHttpsPort(did: Did<'web'>): boolean {
99
+ if (isLocalhostDid(did)) return false
100
+
101
+ const pathIdx = did.indexOf(':', DID_WEB_PREFIX.length)
102
+
103
+ const hasPort =
104
+ pathIdx === -1
105
+ ? // No path component, check if there's a port separator anywhere after
106
+ // the "did:web:" prefix
107
+ did.includes('%3A', DID_WEB_PREFIX.length)
108
+ : // There is a path component; if there is an encoded colon *before* it,
109
+ // then there is a port number
110
+ did.lastIndexOf('%3A', pathIdx) !== -1
111
+
112
+ return hasPort
113
+ }
114
+
115
+ export type AtprotoAudience = `${AtprotoDid}#${string}`
116
+ export const isAtprotoAudience = (value: unknown): value is AtprotoAudience => {
117
+ if (typeof value !== 'string') return false
118
+ const hashIndex = value.indexOf('#')
119
+ if (hashIndex === -1) return false
120
+ if (value.indexOf('#', hashIndex + 1) !== -1) return false
121
+ return (
122
+ isFragment(value, hashIndex + 1) && isAtprotoDid(value.slice(0, hashIndex))
123
+ )
89
124
  }
@@ -1,28 +1,38 @@
1
1
  import { z } from 'zod'
2
2
  import { Did, didSchema } from './did.js'
3
+ import { isFragment } from './lib/uri.js'
3
4
 
4
5
  /**
5
6
  * RFC3968 compliant URI
6
7
  *
7
8
  * @see {@link https://www.rfc-editor.org/rfc/rfc3986}
8
9
  */
9
- const rfc3968UriSchema = z.string().refine((data) => {
10
- try {
11
- new URL(data)
12
- return true
13
- } catch {
14
- return false
15
- }
16
- }, 'RFC3968 compliant URI')
10
+ const rfc3968UriSchema = z.string().url('RFC3968 compliant URI')
17
11
 
18
12
  const didControllerSchema = z.union([didSchema, z.array(didSchema)])
19
13
 
20
14
  /**
21
- * @note this schema might be too permissive
15
+ * @note this schema is too permissive
22
16
  */
23
17
  const didRelativeUriSchema = z.union([
24
- rfc3968UriSchema,
25
- z.string().regex(/^#[^#]+$/),
18
+ rfc3968UriSchema.refine(
19
+ (value) => {
20
+ const fragmentIndex = value.indexOf('#')
21
+ if (fragmentIndex === -1) return false
22
+ return isFragment(value, fragmentIndex + 1)
23
+ },
24
+ {
25
+ message: 'Missing or invalid fragment in RFC3968 URI',
26
+ },
27
+ ),
28
+ z
29
+ .string()
30
+ .refine((value) => value.charCodeAt(0) === 35 /* # */, {
31
+ message: 'Fragment must start with #',
32
+ })
33
+ .refine((value) => isFragment(value, 1), {
34
+ message: 'Invalid char in URI fragment',
35
+ }),
26
36
  ])
27
37
 
28
38
  const didVerificationMethodSchema = z.object({
package/src/did.ts CHANGED
@@ -244,7 +244,7 @@ export function isDid(input: unknown): input is Did {
244
244
  }
245
245
  }
246
246
 
247
- export function asDid(input: unknown): Did {
247
+ export function asDid<T>(input: T) {
248
248
  assertDid(input)
249
249
  return input
250
250
  }
package/src/lib/uri.ts ADDED
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @see {@link https://www.w3.org/TR/did-1.0/#dfn-did-fragments}
3
+ * @see {@link https://datatracker.ietf.org/doc/html/rfc3986#section-3.5}
4
+ */
5
+ export function isFragment(
6
+ value: string,
7
+ startIdx = 0,
8
+ endIdx = value.length,
9
+ ): boolean {
10
+ let charCode: number
11
+ for (let i = startIdx; i < endIdx; i++) {
12
+ charCode = value.charCodeAt(i)
13
+
14
+ // fragment = *( pchar / "/" / "?" )
15
+ // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
16
+ // unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
17
+ // pct-encoded = "%" HEXDIG HEXDIG
18
+ // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
19
+ if (
20
+ (charCode >= 65 /* A */ && charCode <= 90) /* Z */ ||
21
+ (charCode >= 97 /* a */ && charCode <= 122) /* z */ ||
22
+ (charCode >= 48 /* 0 */ && charCode <= 57) /* 9 */ ||
23
+ charCode === 45 /* "-" */ ||
24
+ charCode === 46 /* "." */ ||
25
+ charCode === 95 /* "_" */ ||
26
+ charCode === 126 /* "~" */
27
+ ) {
28
+ // unreserved
29
+ } else if (
30
+ charCode === 33 /* "!" */ ||
31
+ charCode === 36 /* "$" */ ||
32
+ charCode === 38 /* "&" */ ||
33
+ charCode === 39 /* "'" */ ||
34
+ charCode === 40 /* "(" */ ||
35
+ charCode === 41 /* ")" */ ||
36
+ charCode === 42 /* "*" */ ||
37
+ charCode === 43 /* "+" */ ||
38
+ charCode === 44 /* "," */ ||
39
+ charCode === 59 /* ";" */ ||
40
+ charCode === 61 /* "=" */
41
+ ) {
42
+ // sub-delims
43
+ } else if (charCode === 58 /* ":" */ || charCode === 64 /* "@" */) {
44
+ // pchar extra
45
+ } else if (charCode === 47 /* "/" */ || charCode === 63 /* "?" */) {
46
+ // fragment extra
47
+ } else if (charCode === 37 /* "%" */) {
48
+ // pct-enc
49
+ if (i + 2 >= endIdx) return false
50
+ if (!isHexDigit(value.charCodeAt(i + 1))) return false
51
+ if (!isHexDigit(value.charCodeAt(i + 2))) return false
52
+ i += 2
53
+ } else {
54
+ return false
55
+ }
56
+ }
57
+
58
+ return true
59
+ }
60
+
61
+ export function isHexDigit(code: number): boolean {
62
+ return (
63
+ (code >= 48 && code <= 57) || // 0-9
64
+ (code >= 65 && code <= 70) || // A-F
65
+ (code >= 97 && code <= 102) // a-f
66
+ )
67
+ }
@@ -18,7 +18,7 @@ export function isDidPlc(input: unknown): input is Did<'plc'> {
18
18
  return true
19
19
  }
20
20
 
21
- export function asDidPlc(input: unknown): Did<'plc'> {
21
+ export function asDidPlc<T>(input: T) {
22
22
  assertDidPlc(input)
23
23
  return input
24
24
  }
@@ -3,6 +3,17 @@ import { Did, assertDidMsid } from '../did.js'
3
3
 
4
4
  export const DID_WEB_PREFIX = `did:web:` satisfies Did<'web'>
5
5
 
6
+ const canParse =
7
+ URL.canParse?.bind(URL) ??
8
+ ((url, base) => {
9
+ try {
10
+ new URL(url, base)
11
+ return true
12
+ } catch {
13
+ return false
14
+ }
15
+ })
16
+
6
17
  /**
7
18
  * This function checks if the input is a valid Web DID, as per DID spec.
8
19
  */
@@ -13,14 +24,15 @@ export function isDidWeb(input: unknown): input is Did<'web'> {
13
24
  if (input.charAt(DID_WEB_PREFIX.length) === ':') return false
14
25
 
15
26
  try {
16
- didWebToUrl(input as Did<'web'>)
17
- return true
27
+ assertDidMsid(input, DID_WEB_PREFIX.length)
18
28
  } catch {
19
29
  return false
20
30
  }
31
+
32
+ return canParse(buildDidWebUrl(input as Did<'web'>))
21
33
  }
22
34
 
23
- export function asDidWeb(input: unknown): Did<'web'> {
35
+ export function asDidWeb<T>(input: T) {
24
36
  assertDidWeb(input)
25
37
  return input
26
38
  }
@@ -38,27 +50,19 @@ export function assertDidWeb(input: unknown): asserts input is Did<'web'> {
38
50
  throw new InvalidDidError(input, 'did:web MSID must not start with a colon')
39
51
  }
40
52
 
41
- void didWebToUrl(input as Did<'web'>)
42
- }
43
-
44
- export function didWebToUrl(did: Did<'web'>) {
45
53
  // Make sure every char is valid (per DID spec)
46
- assertDidMsid(did, DID_WEB_PREFIX.length)
47
-
48
- const hostIdx = DID_WEB_PREFIX.length
49
- const pathIdx = did.indexOf(':', hostIdx)
54
+ assertDidMsid(input, DID_WEB_PREFIX.length)
50
55
 
51
- const host = pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx)
52
- const path = pathIdx === -1 ? '' : did.slice(pathIdx)
56
+ if (!canParse(buildDidWebUrl(input as Did<'web'>))) {
57
+ throw new InvalidDidError(input, 'Invalid Web DID')
58
+ }
59
+ }
53
60
 
61
+ export function didWebToUrl(did: Did<'web'>) {
54
62
  try {
55
- const url = new URL(
56
- `https://${host.replaceAll('%3A', ':')}${path.replaceAll(':', '/')}`,
57
- ) as URL & { protocol: 'http:' | 'https:' }
58
- if (url.hostname === 'localhost') {
59
- url.protocol = 'http:'
63
+ return new URL(buildDidWebUrl(did)) as URL & {
64
+ protocol: 'http:' | 'https:'
60
65
  }
61
- return url
62
66
  } catch (cause) {
63
67
  throw new InvalidDidError(did, 'Invalid Web DID', cause)
64
68
  }
@@ -70,3 +74,20 @@ export function urlToDidWeb(url: URL): Did<'web'> {
70
74
 
71
75
  return `did:web:${url.hostname}${port}${path}`
72
76
  }
77
+
78
+ export function buildDidWebUrl(did: Did<'web'>): string {
79
+ const hostIdx = DID_WEB_PREFIX.length
80
+ const pathIdx = did.indexOf(':', hostIdx)
81
+
82
+ const hostEnc =
83
+ pathIdx === -1 ? did.slice(hostIdx) : did.slice(hostIdx, pathIdx)
84
+ const host = hostEnc.replaceAll('%3A', ':')
85
+ const path = pathIdx === -1 ? '' : did.slice(pathIdx).replaceAll(':', '/')
86
+ const proto =
87
+ host.startsWith('localhost') &&
88
+ (host.length === 9 || host.charCodeAt(9) === 58) /* ':' */
89
+ ? 'http'
90
+ : 'https'
91
+
92
+ return `${proto}://${host}${path}`
93
+ }
@@ -1 +1 @@
1
- {"root":["./src/atproto.ts","./src/did-document.ts","./src/did-error.ts","./src/did.ts","./src/index.ts","./src/methods.ts","./src/methods/plc.ts","./src/methods/web.ts"],"version":"5.6.3"}
1
+ {"root":["./src/atproto.ts","./src/did-document.ts","./src/did-error.ts","./src/did.ts","./src/index.ts","./src/methods.ts","./src/lib/uri.ts","./src/methods/plc.ts","./src/methods/web.ts"],"version":"5.8.2"}