@atcute/oauth-types 0.1.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/README.md +6 -5
  2. package/dist/build-client-metadata.d.ts +5 -320
  3. package/dist/build-client-metadata.d.ts.map +1 -1
  4. package/dist/build-client-metadata.js +3 -2
  5. package/dist/build-client-metadata.js.map +1 -1
  6. package/dist/index.d.ts +31 -31
  7. package/dist/schemas/atcute-client-shared.d.ts +8 -0
  8. package/dist/schemas/atcute-client-shared.d.ts.map +1 -0
  9. package/dist/schemas/atcute-client-shared.js +15 -0
  10. package/dist/schemas/atcute-client-shared.js.map +1 -0
  11. package/dist/schemas/atcute-confidential-client-metadata.d.ts +228 -4
  12. package/dist/schemas/atcute-confidential-client-metadata.d.ts.map +1 -1
  13. package/dist/schemas/atcute-confidential-client-metadata.js +48 -88
  14. package/dist/schemas/atcute-confidential-client-metadata.js.map +1 -1
  15. package/dist/schemas/atcute-public-client-metadata.d.ts +75 -35
  16. package/dist/schemas/atcute-public-client-metadata.d.ts.map +1 -1
  17. package/dist/schemas/atcute-public-client-metadata.js +25 -110
  18. package/dist/schemas/atcute-public-client-metadata.js.map +1 -1
  19. package/dist/schemas/atproto-authorization-server-metadata.d.ts +786 -4
  20. package/dist/schemas/atproto-authorization-server-metadata.d.ts.map +1 -1
  21. package/dist/schemas/atproto-authorization-server-metadata.js +2 -18
  22. package/dist/schemas/atproto-authorization-server-metadata.js.map +1 -1
  23. package/dist/schemas/atproto-oauth-scope.d.ts +3 -3
  24. package/dist/schemas/atproto-oauth-scope.d.ts.map +1 -1
  25. package/dist/schemas/atproto-oauth-scope.js +2 -2
  26. package/dist/schemas/atproto-oauth-scope.js.map +1 -1
  27. package/dist/schemas/atproto-oauth-token-response.d.ts +17 -17
  28. package/dist/schemas/atproto-oauth-token-response.d.ts.map +1 -1
  29. package/dist/schemas/atproto-oauth-token-response.js +6 -6
  30. package/dist/schemas/atproto-oauth-token-response.js.map +1 -1
  31. package/dist/schemas/atproto-protected-resource-metadata.d.ts +100 -4
  32. package/dist/schemas/atproto-protected-resource-metadata.d.ts.map +1 -1
  33. package/dist/schemas/atproto-protected-resource-metadata.js +2 -11
  34. package/dist/schemas/atproto-protected-resource-metadata.js.map +1 -1
  35. package/dist/schemas/jwk.d.ts +4289 -42
  36. package/dist/schemas/jwk.d.ts.map +1 -1
  37. package/dist/schemas/jwk.js +58 -91
  38. package/dist/schemas/jwk.js.map +1 -1
  39. package/dist/schemas/jwks.d.ts +87 -42
  40. package/dist/schemas/jwks.d.ts.map +1 -1
  41. package/dist/schemas/jwks.js +13 -29
  42. package/dist/schemas/jwks.js.map +1 -1
  43. package/dist/schemas/oauth-authorization-details.d.ts +18 -18
  44. package/dist/schemas/oauth-authorization-details.d.ts.map +1 -1
  45. package/dist/schemas/oauth-authorization-details.js +7 -7
  46. package/dist/schemas/oauth-authorization-details.js.map +1 -1
  47. package/dist/schemas/oauth-authorization-server-metadata.d.ts +462 -48
  48. package/dist/schemas/oauth-authorization-server-metadata.d.ts.map +1 -1
  49. package/dist/schemas/oauth-authorization-server-metadata.js +46 -65
  50. package/dist/schemas/oauth-authorization-server-metadata.js.map +1 -1
  51. package/dist/schemas/oauth-client-id-discoverable.d.ts +2 -2
  52. package/dist/schemas/oauth-client-id-discoverable.d.ts.map +1 -1
  53. package/dist/schemas/oauth-client-id-discoverable.js +20 -22
  54. package/dist/schemas/oauth-client-id-discoverable.js.map +1 -1
  55. package/dist/schemas/oauth-client-id.d.ts +3 -3
  56. package/dist/schemas/oauth-client-id.d.ts.map +1 -1
  57. package/dist/schemas/oauth-client-id.js +2 -2
  58. package/dist/schemas/oauth-client-id.js.map +1 -1
  59. package/dist/schemas/oauth-client-metadata.d.ts +73 -51
  60. package/dist/schemas/oauth-client-metadata.d.ts.map +1 -1
  61. package/dist/schemas/oauth-client-metadata.js +33 -40
  62. package/dist/schemas/oauth-client-metadata.js.map +1 -1
  63. package/dist/schemas/oauth-code-challenge-method.d.ts +3 -3
  64. package/dist/schemas/oauth-code-challenge-method.d.ts.map +1 -1
  65. package/dist/schemas/oauth-code-challenge-method.js +2 -2
  66. package/dist/schemas/oauth-code-challenge-method.js.map +1 -1
  67. package/dist/schemas/oauth-endpoint-auth-method.d.ts +3 -3
  68. package/dist/schemas/oauth-endpoint-auth-method.d.ts.map +1 -1
  69. package/dist/schemas/oauth-endpoint-auth-method.js +10 -2
  70. package/dist/schemas/oauth-endpoint-auth-method.js.map +1 -1
  71. package/dist/schemas/oauth-grant-type.d.ts +3 -3
  72. package/dist/schemas/oauth-grant-type.d.ts.map +1 -1
  73. package/dist/schemas/oauth-grant-type.js +10 -3
  74. package/dist/schemas/oauth-grant-type.js.map +1 -1
  75. package/dist/schemas/oauth-issuer-identifier.d.ts +3 -3
  76. package/dist/schemas/oauth-issuer-identifier.d.ts.map +1 -1
  77. package/dist/schemas/oauth-issuer-identifier.js +16 -9
  78. package/dist/schemas/oauth-issuer-identifier.js.map +1 -1
  79. package/dist/schemas/oauth-par-response.d.ts +5 -5
  80. package/dist/schemas/oauth-par-response.d.ts.map +1 -1
  81. package/dist/schemas/oauth-par-response.js +3 -3
  82. package/dist/schemas/oauth-par-response.js.map +1 -1
  83. package/dist/schemas/oauth-prompt.d.ts +3 -3
  84. package/dist/schemas/oauth-prompt.d.ts.map +1 -1
  85. package/dist/schemas/oauth-prompt.js +2 -2
  86. package/dist/schemas/oauth-prompt.js.map +1 -1
  87. package/dist/schemas/oauth-protected-resource-metadata.d.ts +88 -16
  88. package/dist/schemas/oauth-protected-resource-metadata.d.ts.map +1 -1
  89. package/dist/schemas/oauth-protected-resource-metadata.js +14 -26
  90. package/dist/schemas/oauth-protected-resource-metadata.js.map +1 -1
  91. package/dist/schemas/oauth-redirect-uri.d.ts +5 -5
  92. package/dist/schemas/oauth-redirect-uri.d.ts.map +1 -1
  93. package/dist/schemas/oauth-redirect-uri.js +3 -16
  94. package/dist/schemas/oauth-redirect-uri.js.map +1 -1
  95. package/dist/schemas/oauth-response-mode.d.ts +3 -3
  96. package/dist/schemas/oauth-response-mode.d.ts.map +1 -1
  97. package/dist/schemas/oauth-response-mode.js +2 -2
  98. package/dist/schemas/oauth-response-mode.js.map +1 -1
  99. package/dist/schemas/oauth-response-type.d.ts +3 -3
  100. package/dist/schemas/oauth-response-type.d.ts.map +1 -1
  101. package/dist/schemas/oauth-response-type.js +13 -7
  102. package/dist/schemas/oauth-response-type.js.map +1 -1
  103. package/dist/schemas/oauth-scope.d.ts +3 -3
  104. package/dist/schemas/oauth-scope.d.ts.map +1 -1
  105. package/dist/schemas/oauth-scope.js +2 -2
  106. package/dist/schemas/oauth-scope.js.map +1 -1
  107. package/dist/schemas/oauth-token-response.d.ts +17 -17
  108. package/dist/schemas/oauth-token-response.d.ts.map +1 -1
  109. package/dist/schemas/oauth-token-response.js +7 -7
  110. package/dist/schemas/oauth-token-response.js.map +1 -1
  111. package/dist/schemas/oauth-token-type.d.ts +3 -3
  112. package/dist/schemas/oauth-token-type.d.ts.map +1 -1
  113. package/dist/schemas/oauth-token-type.js +8 -7
  114. package/dist/schemas/oauth-token-type.js.map +1 -1
  115. package/dist/schemas/uri.d.ts +7 -7
  116. package/dist/schemas/uri.d.ts.map +1 -1
  117. package/dist/schemas/uri.js +44 -44
  118. package/dist/schemas/uri.js.map +1 -1
  119. package/dist/schemas/utils.d.ts.map +1 -1
  120. package/dist/schemas/utils.js.map +1 -1
  121. package/dist/scope.d.ts.map +1 -1
  122. package/dist/scope.js.map +1 -1
  123. package/lib/build-client-metadata.ts +9 -7
  124. package/lib/index.ts +31 -31
  125. package/lib/schemas/atcute-client-shared.ts +25 -0
  126. package/lib/schemas/atcute-confidential-client-metadata.ts +81 -111
  127. package/lib/schemas/atcute-public-client-metadata.ts +70 -166
  128. package/lib/schemas/atproto-authorization-server-metadata.ts +22 -23
  129. package/lib/schemas/atproto-oauth-scope.ts +8 -5
  130. package/lib/schemas/atproto-oauth-token-response.ts +10 -9
  131. package/lib/schemas/atproto-protected-resource-metadata.ts +15 -15
  132. package/lib/schemas/jwk.ts +104 -120
  133. package/lib/schemas/jwks.ts +28 -40
  134. package/lib/schemas/oauth-authorization-details.ts +10 -10
  135. package/lib/schemas/oauth-authorization-server-metadata.ts +72 -74
  136. package/lib/schemas/oauth-client-id-discoverable.ts +43 -48
  137. package/lib/schemas/oauth-client-id.ts +3 -3
  138. package/lib/schemas/oauth-client-metadata.ts +45 -49
  139. package/lib/schemas/oauth-code-challenge-method.ts +3 -3
  140. package/lib/schemas/oauth-endpoint-auth-method.ts +11 -11
  141. package/lib/schemas/oauth-grant-type.ts +11 -11
  142. package/lib/schemas/oauth-issuer-identifier.ts +35 -27
  143. package/lib/schemas/oauth-par-response.ts +4 -4
  144. package/lib/schemas/oauth-prompt.ts +3 -9
  145. package/lib/schemas/oauth-protected-resource-metadata.ts +26 -35
  146. package/lib/schemas/oauth-redirect-uri.ts +15 -23
  147. package/lib/schemas/oauth-response-mode.ts +3 -7
  148. package/lib/schemas/oauth-response-type.ts +12 -12
  149. package/lib/schemas/oauth-scope.ts +3 -3
  150. package/lib/schemas/oauth-token-response.ts +10 -10
  151. package/lib/schemas/oauth-token-type.ts +16 -12
  152. package/lib/schemas/uri.ts +89 -76
  153. package/package.json +9 -8
@@ -1,66 +1,30 @@
1
- import * as v from '@badrap/valita';
2
-
3
- import { atprotoOAuthScopeSchema } from './atproto-oauth-scope.js';
4
- import { oauthClientIdDiscoverableSchema } from './oauth-client-id-discoverable.js';
5
- import { loopbackRedirectUriSchema, oauthRedirectUriSchema } from './oauth-redirect-uri.js';
6
- import { nonLocalWebUriSchema, privateUseUriSchema, webUriSchema } from './uri.js';
7
- import { isLoopbackHost } from './utils.js';
8
-
9
- const SINGLE_SCOPE_RE = /^[\x21\x23-\x5B\x5D-\x7E]+$/;
10
-
11
- const singleScopeSchema = v.string().assert((input) => SINGLE_SCOPE_RE.test(input), `invalid OAuth scope`);
12
-
13
- const scopeSchema = v.union(
14
- atprotoOAuthScopeSchema.chain((input) => {
15
- const scopes = input.split(/\s+/);
16
-
17
- for (let i = 0, len = scopes.length; i < len; i++) {
18
- const aka = scopes[i];
19
-
20
- for (let j = 0; j < i; j++) {
21
- if (aka === scopes[j]) {
22
- return v.err(`duplicate "${aka}" scope`);
23
- }
24
- }
25
- }
26
-
27
- return v.ok(input);
28
- }),
29
- v.array(singleScopeSchema).chain((input) => {
30
- if (!input.includes('atproto')) {
31
- input = ['atproto', ...input];
1
+ import * as v from 'valibot';
2
+
3
+ import { scopeSchema } from './atcute-client-shared.ts';
4
+ import { oauthClientIdDiscoverableSchema } from './oauth-client-id-discoverable.ts';
5
+ import { loopbackRedirectUriSchema, oauthRedirectUriSchema } from './oauth-redirect-uri.ts';
6
+ import { nonLocalWebUriSchema, webUriSchema } from './uri.ts';
7
+
8
+ const redirectUrisSchema = v.pipe(
9
+ v.array(oauthRedirectUriSchema),
10
+ v.minLength(1, `must have at least one redirect URI`),
11
+ v.checkItems((uri) => {
12
+ // private-use URIs don't have URL-style credentials
13
+ if (!uri.includes('://')) {
14
+ return true;
32
15
  }
33
-
34
- for (let i = 0, len = input.length; i < len; i++) {
35
- const aka = input[i];
36
-
37
- for (let j = 0; j < i; j++) {
38
- if (aka === input[j]) {
39
- return v.err(`duplicate "${aka}" scope`);
40
- }
41
- }
42
- }
43
-
44
- return v.ok(input);
45
- }),
16
+ const url = new URL(uri);
17
+ return !url.username && !url.password;
18
+ }, `redirect URI must not contain credentials`),
46
19
  );
47
20
 
48
- const redirectUrisSchema = v
49
- .array(oauthRedirectUriSchema)
50
- .assert((arr) => arr.length > 0, `must have at least one redirect URI`)
51
- .assert((arr) => {
52
- for (const uri of arr) {
53
- // private-use URIs don't have URL-style credentials
54
- if (!uri.includes('://')) {
55
- continue;
56
- }
57
- const url = new URL(uri);
58
- if (url.username || url.password) {
59
- return false;
60
- }
61
- }
62
- return true;
63
- }, `redirect URIs must not contain credentials`);
21
+ const loopbackRedirectUrisSchema = v.pipe(
22
+ redirectUrisSchema,
23
+ v.checkItems(
24
+ (uri) => v.is(loopbackRedirectUriSchema, uri),
25
+ `loopback clients require loopback redirect URIs (127.0.0.1 or [::1])`,
26
+ ),
27
+ );
64
28
 
65
29
  /**
66
30
  * user-facing client metadata for configuring a loopback public OAuth client.
@@ -69,48 +33,24 @@ const redirectUrisSchema = v
69
33
  * `http://localhost` as the client_id origin, which is built automatically
70
34
  * from the redirect_uris and scope.
71
35
  */
72
- export const loopbackClientMetadataSchema = v
73
- .object({
74
- /** must not be provided for loopback clients */
75
- client_id: v.undefined().optional(),
36
+ export const loopbackClientMetadataSchema = v.looseObject({
37
+ /** must not be provided for loopback clients */
38
+ client_id: v.optional(v.undefined()),
76
39
 
77
- /**
78
- * redirect URIs for authorization responses.
79
- *
80
- * must be loopback IP addresses (127.0.0.1 or [::1]).
81
- * per RFC 8252, port numbers are ignored during redirect URI matching,
82
- * allowing ephemeral ports.
83
- */
84
- redirect_uris: redirectUrisSchema,
40
+ /**
41
+ * redirect URIs for authorization responses.
42
+ *
43
+ * must be loopback IP addresses (127.0.0.1 or [::1]).
44
+ * per RFC 8252, port numbers are ignored during redirect URI matching,
45
+ * allowing ephemeral ports.
46
+ */
47
+ redirect_uris: loopbackRedirectUrisSchema,
85
48
 
86
- /** OAuth scope (must include "atproto") */
87
- scope: scopeSchema,
88
- })
89
- .chain((input) => {
90
- // validate all redirect URIs are loopback
91
- for (let i = 0; i < input.redirect_uris.length; i++) {
92
- const uri = input.redirect_uris[i];
93
- const result = loopbackRedirectUriSchema.try(uri, { mode: 'strict' });
94
- if (!result.ok) {
95
- return v.err({
96
- message: `loopback clients require loopback redirect URIs (127.0.0.1 or [::1]): ${result.message}`,
97
- path: ['redirect_uris', i],
98
- });
99
- }
49
+ /** OAuth scope (must include "atproto") */
50
+ scope: scopeSchema,
51
+ });
100
52
 
101
- const url = new URL(uri);
102
- if (!isLoopbackHost(url.hostname) || url.hostname === 'localhost') {
103
- return v.err({
104
- message: `loopback redirect URIs must use 127.0.0.1 or [::1], not ${url.hostname}`,
105
- path: ['redirect_uris', i],
106
- });
107
- }
108
- }
109
-
110
- return v.ok(input);
111
- });
112
-
113
- export type LoopbackClientMetadata = v.Infer<typeof loopbackClientMetadataSchema>;
53
+ export type LoopbackClientMetadata = v.InferOutput<typeof loopbackClientMetadataSchema>;
114
54
 
115
55
  /**
116
56
  * user-facing client metadata for configuring a discoverable public OAuth client.
@@ -118,70 +58,34 @@ export type LoopbackClientMetadata = v.Infer<typeof loopbackClientMetadataSchema
118
58
  * discoverable public clients have an HTTPS client_id URL where metadata is hosted,
119
59
  * but don't use a keyset (token_endpoint_auth_method: 'none').
120
60
  */
121
- export const discoverablePublicClientMetadataSchema = v
122
- .object({
123
- /** discoverable HTTPS client_id URL */
124
- client_id: oauthClientIdDiscoverableSchema,
125
-
126
- /** redirect URIs for authorization responses */
127
- redirect_uris: redirectUrisSchema,
128
-
129
- /** OAuth scope (must include "atproto") */
130
- scope: scopeSchema,
131
-
132
- /**
133
- * application type - defaults to 'web'.
134
- */
135
- application_type: v.union(v.literal('web'), v.literal('native')).optional(),
136
-
137
- /** optional client homepage */
138
- client_uri: webUriSchema.optional(),
139
- /** optional display name */
140
- client_name: v.string().optional(),
141
- /** optional policy url */
142
- policy_uri: nonLocalWebUriSchema.optional(),
143
- /** optional terms of service url */
144
- tos_uri: nonLocalWebUriSchema.optional(),
145
- /** optional logo url */
146
- logo_uri: nonLocalWebUriSchema.optional(),
147
- })
148
- .chain((input) => {
149
- // validate redirect URIs are HTTPS, loopback, or private-use
150
- for (let i = 0; i < input.redirect_uris.length; i++) {
151
- const uri = input.redirect_uris[i];
152
-
153
- // private-use URIs are allowed
154
- if (!uri.includes('://')) {
155
- const result = privateUseUriSchema.try(uri, { mode: 'strict' });
156
- if (!result.ok) {
157
- return v.err({
158
- message: `invalid redirect URI: ${result.message}`,
159
- path: ['redirect_uris', i],
160
- });
161
- }
162
- continue;
163
- }
164
-
165
- const url = new URL(uri);
166
-
167
- // loopback http URIs are allowed for native apps
168
- if (url.protocol === 'http:' && isLoopbackHost(url.hostname)) {
169
- continue;
170
- }
171
-
172
- // otherwise must be https
173
- if (url.protocol !== 'https:') {
174
- return v.err({
175
- message: `redirect URI must use https:, http: loopback, or private-use scheme`,
176
- path: ['redirect_uris', i],
177
- });
178
- }
179
- }
180
-
181
- return v.ok(input);
182
- });
183
-
184
- export type DiscoverablePublicClientMetadata = v.Infer<typeof discoverablePublicClientMetadataSchema>;
61
+ export const discoverablePublicClientMetadataSchema = v.looseObject({
62
+ /** discoverable HTTPS client_id URL */
63
+ client_id: oauthClientIdDiscoverableSchema,
64
+
65
+ /** redirect URIs for authorization responses */
66
+ redirect_uris: redirectUrisSchema,
67
+
68
+ /** OAuth scope (must include "atproto") */
69
+ scope: scopeSchema,
70
+
71
+ /**
72
+ * application type - defaults to 'web'.
73
+ */
74
+ application_type: v.optional(v.picklist(['web', 'native'])),
75
+
76
+ /** optional client homepage */
77
+ client_uri: v.optional(webUriSchema),
78
+ /** optional display name */
79
+ client_name: v.optional(v.string()),
80
+ /** optional policy url */
81
+ policy_uri: v.optional(nonLocalWebUriSchema),
82
+ /** optional terms of service url */
83
+ tos_uri: v.optional(nonLocalWebUriSchema),
84
+ /** optional logo url */
85
+ logo_uri: v.optional(nonLocalWebUriSchema),
86
+ });
87
+
88
+ export type DiscoverablePublicClientMetadata = v.InferOutput<typeof discoverablePublicClientMetadataSchema>;
185
89
 
186
90
  /**
187
91
  * user-facing client metadata for configuring a public OAuth client.
@@ -189,9 +93,9 @@ export type DiscoverablePublicClientMetadata = v.Infer<typeof discoverablePublic
189
93
  * - if `client_id` is omitted: loopback client (for localhost dev / CLI tools)
190
94
  * - if `client_id` is provided: discoverable public client (HTTPS URL)
191
95
  */
192
- export const publicClientMetadataSchema = v.union(
96
+ export const publicClientMetadataSchema = v.union([
193
97
  loopbackClientMetadataSchema,
194
98
  discoverablePublicClientMetadataSchema,
195
- );
99
+ ]);
196
100
 
197
- export type PublicClientMetadata = v.Infer<typeof publicClientMetadataSchema>;
101
+ export type PublicClientMetadata = v.InferOutput<typeof publicClientMetadataSchema>;
@@ -1,32 +1,31 @@
1
- import * as v from '@badrap/valita';
1
+ import * as v from 'valibot';
2
2
 
3
- import { oauthAuthorizationServerMetadataValidator } from './oauth-authorization-server-metadata.js';
3
+ import { oauthAuthorizationServerMetadataValidator } from './oauth-authorization-server-metadata.ts';
4
4
 
5
5
  /**
6
6
  * AT Protocol authorization server metadata with required fields and assertions.
7
7
  *
8
8
  * @see {@link https://atproto.com/specs/oauth}
9
9
  */
10
- export const atprotoAuthorizationServerMetadataValidator = oauthAuthorizationServerMetadataValidator.chain(
11
- (data) => {
12
- // atproto requires client_id_metadata_document support
13
- if (data.client_id_metadata_document_supported !== true) {
14
- return v.err({
15
- message: `atproto requires client_id_metadata_document_supported to be true`,
16
- path: ['client_id_metadata_document_supported'],
17
- });
18
- }
19
-
20
- // atproto requires PAR
21
- if (!data.pushed_authorization_request_endpoint) {
22
- return v.err({
23
- message: `atproto requires pushed_authorization_request_endpoint to be true`,
24
- path: ['pushed_authorization_request_endpoint'],
25
- });
26
- }
27
-
28
- return v.ok(data as typeof data & { pushed_authorization_request_endpoint: string });
29
- },
10
+ export const atprotoAuthorizationServerMetadataValidator = v.pipe(
11
+ oauthAuthorizationServerMetadataValidator,
12
+ v.forward(
13
+ v.check(
14
+ (data) => data.client_id_metadata_document_supported === true,
15
+ `atproto requires client_id_metadata_document_supported to be true`,
16
+ ),
17
+ ['client_id_metadata_document_supported'],
18
+ ),
19
+ v.forward(
20
+ v.check(
21
+ (data) => !!data.pushed_authorization_request_endpoint,
22
+ `atproto requires pushed_authorization_request_endpoint to be true`,
23
+ ),
24
+ ['pushed_authorization_request_endpoint'],
25
+ ),
26
+ v.transform((data) => data as typeof data & { pushed_authorization_request_endpoint: string }),
30
27
  );
31
28
 
32
- export type AtprotoAuthorizationServerMetadata = v.Infer<typeof atprotoAuthorizationServerMetadataValidator>;
29
+ export type AtprotoAuthorizationServerMetadata = v.InferOutput<
30
+ typeof atprotoAuthorizationServerMetadataValidator
31
+ >;
@@ -1,7 +1,7 @@
1
- import * as v from '@badrap/valita';
1
+ import * as v from 'valibot';
2
2
 
3
- import { isOAuthScope } from './oauth-scope.js';
4
- import { isSpaceSeparatedValue } from './utils.js';
3
+ import { isOAuthScope } from './oauth-scope.ts';
4
+ import { isSpaceSeparatedValue } from './utils.ts';
5
5
 
6
6
  export const ATPROTO_SCOPE_VALUE = 'atproto';
7
7
 
@@ -10,9 +10,12 @@ const isAtprotoOAuthScope = (input: string): boolean => {
10
10
  };
11
11
 
12
12
  /** atproto OAuth scope (must include "atproto") */
13
- export const atprotoOAuthScopeSchema = v.string().assert(isAtprotoOAuthScope, `invalid atproto OAuth scope`);
13
+ export const atprotoOAuthScopeSchema = v.pipe(
14
+ v.string(),
15
+ v.check(isAtprotoOAuthScope, `invalid atproto OAuth scope`),
16
+ );
14
17
 
15
- export type AtprotoOAuthScope = v.Infer<typeof atprotoOAuthScopeSchema>;
18
+ export type AtprotoOAuthScope = v.InferOutput<typeof atprotoOAuthScopeSchema>;
16
19
 
17
20
  /** default scope is for reading identity (did) only */
18
21
  export const DEFAULT_ATPROTO_OAUTH_SCOPE: AtprotoOAuthScope = ATPROTO_SCOPE_VALUE;
@@ -1,20 +1,21 @@
1
1
  import { isAtprotoDid } from '@atcute/identity';
2
+ import type { Did } from '@atcute/lexicons/syntax';
2
3
 
3
- import * as v from '@badrap/valita';
4
+ import * as v from 'valibot';
4
5
 
5
- import { atprotoOAuthScopeSchema } from './atproto-oauth-scope.js';
6
- import { oauthAuthorizationDetailsSchema } from './oauth-authorization-details.js';
6
+ import { atprotoOAuthScopeSchema } from './atproto-oauth-scope.ts';
7
+ import { oauthAuthorizationDetailsSchema } from './oauth-authorization-details.ts';
7
8
 
8
- export const atprotoOAuthTokenResponseSchema = v.object({
9
+ export const atprotoOAuthTokenResponseSchema = v.looseObject({
9
10
  access_token: v.string(),
10
11
  token_type: v.literal('DPoP'),
11
- sub: v.string().assert(isAtprotoDid, `must be a did:plc or did:web`),
12
+ sub: v.custom<Did>(isAtprotoDid, `must be a did:plc or did:web`),
12
13
  scope: atprotoOAuthScopeSchema,
13
- refresh_token: v.string().optional(),
14
- expires_in: v.number().optional(),
14
+ refresh_token: v.optional(v.string()),
15
+ expires_in: v.optional(v.number()),
15
16
  // https://datatracker.ietf.org/doc/html/rfc9396#name-enriched-authorization-deta
16
- authorization_details: oauthAuthorizationDetailsSchema.optional(),
17
+ authorization_details: v.optional(oauthAuthorizationDetailsSchema),
17
18
  // OpenID is not compatible with atproto identities
18
19
  });
19
20
 
20
- export type AtprotoOAuthTokenResponse = v.Infer<typeof atprotoOAuthTokenResponseSchema>;
21
+ export type AtprotoOAuthTokenResponse = v.InferOutput<typeof atprotoOAuthTokenResponseSchema>;
@@ -1,24 +1,24 @@
1
- import * as v from '@badrap/valita';
1
+ import * as v from 'valibot';
2
2
 
3
- import { oauthProtectedResourceMetadataValidator } from './oauth-protected-resource-metadata.js';
3
+ import { oauthProtectedResourceMetadataValidator } from './oauth-protected-resource-metadata.ts';
4
4
 
5
5
  /**
6
6
  * AT Protocol protected resource metadata with required fields.
7
7
  *
8
8
  * @see {@link https://atproto.com/specs/oauth}
9
9
  */
10
- export const atprotoProtectedResourceMetadataValidator = oauthProtectedResourceMetadataValidator.chain(
11
- (data) => {
12
- // atproto requires exactly one authorization server
13
- if (data.authorization_servers?.length !== 1) {
14
- return v.err({
15
- message: `atproto requires exactly one authorization server`,
16
- path: ['authorization_servers'],
17
- });
18
- }
19
-
20
- return v.ok(data as typeof data & { authorization_servers: [string] });
21
- },
10
+ export const atprotoProtectedResourceMetadataValidator = v.pipe(
11
+ oauthProtectedResourceMetadataValidator,
12
+ v.forward(
13
+ v.check(
14
+ (data) => data.authorization_servers?.length === 1,
15
+ `atproto requires exactly one authorization server`,
16
+ ),
17
+ ['authorization_servers'],
18
+ ),
19
+ v.transform((data) => data as typeof data & { authorization_servers: [string] }),
22
20
  );
23
21
 
24
- export type AtprotoProtectedResourceMetadata = v.Infer<typeof atprotoProtectedResourceMetadataValidator>;
22
+ export type AtprotoProtectedResourceMetadata = v.InferOutput<
23
+ typeof atprotoProtectedResourceMetadataValidator
24
+ >;