@vercel/sandbox 1.9.0 → 1.9.2

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 (190) hide show
  1. package/README.md +8 -0
  2. package/dist/_virtual/rolldown_runtime.cjs +29 -0
  3. package/dist/api-client/api-client.cjs +375 -0
  4. package/dist/api-client/api-client.cjs.map +1 -0
  5. package/dist/api-client/api-client.d.cts +403 -0
  6. package/dist/api-client/api-client.d.ts +397 -392
  7. package/dist/api-client/api-client.js +365 -405
  8. package/dist/api-client/api-client.js.map +1 -1
  9. package/dist/api-client/api-error.cjs +31 -0
  10. package/dist/api-client/api-error.cjs.map +1 -0
  11. package/dist/api-client/api-error.d.cts +27 -0
  12. package/dist/api-client/api-error.d.ts +19 -16
  13. package/dist/api-client/api-error.js +27 -32
  14. package/dist/api-client/api-error.js.map +1 -1
  15. package/dist/api-client/base-client.cjs +113 -0
  16. package/dist/api-client/base-client.cjs.map +1 -0
  17. package/dist/api-client/base-client.d.cts +38 -0
  18. package/dist/api-client/base-client.d.ts +31 -36
  19. package/dist/api-client/base-client.js +101 -118
  20. package/dist/api-client/base-client.js.map +1 -1
  21. package/dist/api-client/file-writer.cjs +62 -0
  22. package/dist/api-client/file-writer.cjs.map +1 -0
  23. package/dist/api-client/file-writer.d.cts +66 -0
  24. package/dist/api-client/file-writer.d.ts +56 -52
  25. package/dist/api-client/file-writer.js +57 -61
  26. package/dist/api-client/file-writer.js.map +1 -1
  27. package/dist/api-client/index.cjs +2 -0
  28. package/dist/api-client/index.d.ts +2 -2
  29. package/dist/api-client/index.js +4 -21
  30. package/dist/api-client/validators.cjs +149 -0
  31. package/dist/api-client/validators.cjs.map +1 -0
  32. package/dist/api-client/validators.d.cts +1677 -0
  33. package/dist/api-client/validators.d.ts +1501 -2412
  34. package/dist/api-client/validators.js +124 -154
  35. package/dist/api-client/validators.js.map +1 -1
  36. package/dist/api-client/with-retry.cjs +89 -0
  37. package/dist/api-client/with-retry.cjs.map +1 -0
  38. package/dist/api-client/with-retry.d.cts +10 -0
  39. package/dist/api-client/with-retry.d.ts +9 -13
  40. package/dist/api-client/with-retry.js +81 -102
  41. package/dist/api-client/with-retry.js.map +1 -1
  42. package/dist/auth/api.cjs +29 -0
  43. package/dist/auth/api.cjs.map +1 -0
  44. package/dist/auth/api.js +26 -25
  45. package/dist/auth/api.js.map +1 -1
  46. package/dist/auth/error.cjs +13 -0
  47. package/dist/auth/error.cjs.map +1 -0
  48. package/dist/auth/error.js +11 -11
  49. package/dist/auth/error.js.map +1 -1
  50. package/dist/auth/file.cjs +64 -0
  51. package/dist/auth/file.cjs.map +1 -0
  52. package/dist/auth/file.d.cts +26 -0
  53. package/dist/auth/file.d.ts +19 -15
  54. package/dist/auth/file.js +49 -64
  55. package/dist/auth/file.js.map +1 -1
  56. package/dist/auth/index.cjs +12 -0
  57. package/dist/auth/index.d.cts +5 -0
  58. package/dist/auth/index.d.ts +5 -6
  59. package/dist/auth/index.js +6 -27
  60. package/dist/auth/linked-project.cjs +38 -0
  61. package/dist/auth/linked-project.cjs.map +1 -0
  62. package/dist/auth/linked-project.js +30 -64
  63. package/dist/auth/linked-project.js.map +1 -1
  64. package/dist/auth/oauth.cjs +205 -0
  65. package/dist/auth/oauth.cjs.map +1 -0
  66. package/dist/auth/oauth.d.cts +135 -0
  67. package/dist/auth/oauth.d.ts +113 -109
  68. package/dist/auth/oauth.js +185 -252
  69. package/dist/auth/oauth.js.map +1 -1
  70. package/dist/auth/poll-for-token.cjs +82 -0
  71. package/dist/auth/poll-for-token.cjs.map +1 -0
  72. package/dist/auth/poll-for-token.d.cts +28 -0
  73. package/dist/auth/poll-for-token.d.ts +23 -15
  74. package/dist/auth/poll-for-token.js +79 -64
  75. package/dist/auth/poll-for-token.js.map +1 -1
  76. package/dist/auth/project.cjs +80 -0
  77. package/dist/auth/project.cjs.map +1 -0
  78. package/dist/auth/project.d.cts +44 -0
  79. package/dist/auth/project.d.ts +12 -8
  80. package/dist/auth/project.js +70 -72
  81. package/dist/auth/project.js.map +1 -1
  82. package/dist/auth/zod.cjs +22 -0
  83. package/dist/auth/zod.cjs.map +1 -0
  84. package/dist/auth/zod.js +18 -17
  85. package/dist/auth/zod.js.map +1 -1
  86. package/dist/command.cjs +328 -0
  87. package/dist/command.cjs.map +1 -0
  88. package/dist/command.d.cts +289 -0
  89. package/dist/command.d.ts +265 -171
  90. package/dist/command.js +323 -226
  91. package/dist/command.js.map +1 -1
  92. package/dist/constants.d.cts +5 -0
  93. package/dist/constants.d.ts +5 -1
  94. package/dist/index.cjs +11 -0
  95. package/dist/index.d.cts +6 -0
  96. package/dist/index.d.ts +6 -5
  97. package/dist/index.js +6 -15
  98. package/dist/network-policy.d.cts +100 -0
  99. package/dist/network-policy.d.ts +32 -28
  100. package/dist/sandbox.cjs +543 -0
  101. package/dist/sandbox.cjs.map +1 -0
  102. package/dist/sandbox.d.cts +538 -0
  103. package/dist/sandbox.d.ts +521 -479
  104. package/dist/sandbox.js +539 -512
  105. package/dist/sandbox.js.map +1 -1
  106. package/dist/snapshot.cjs +116 -0
  107. package/dist/snapshot.cjs.map +1 -0
  108. package/dist/snapshot.d.cts +109 -0
  109. package/dist/snapshot.d.ts +100 -92
  110. package/dist/snapshot.js +114 -114
  111. package/dist/snapshot.js.map +1 -1
  112. package/dist/utils/array.cjs +17 -0
  113. package/dist/utils/array.cjs.map +1 -0
  114. package/dist/utils/array.js +12 -15
  115. package/dist/utils/array.js.map +1 -1
  116. package/dist/utils/consume-readable.cjs +18 -0
  117. package/dist/utils/consume-readable.cjs.map +1 -0
  118. package/dist/utils/consume-readable.js +13 -12
  119. package/dist/utils/consume-readable.js.map +1 -1
  120. package/dist/utils/decode-base64-url.cjs +15 -0
  121. package/dist/utils/decode-base64-url.cjs.map +1 -0
  122. package/dist/utils/decode-base64-url.js +10 -9
  123. package/dist/utils/decode-base64-url.js.map +1 -1
  124. package/dist/utils/dev-credentials.cjs +142 -0
  125. package/dist/utils/dev-credentials.cjs.map +1 -0
  126. package/dist/utils/dev-credentials.js +126 -184
  127. package/dist/utils/dev-credentials.js.map +1 -1
  128. package/dist/utils/get-credentials.cjs +123 -0
  129. package/dist/utils/get-credentials.cjs.map +1 -0
  130. package/dist/utils/get-credentials.d.cts +21 -0
  131. package/dist/utils/get-credentials.d.ts +19 -61
  132. package/dist/utils/get-credentials.js +106 -140
  133. package/dist/utils/get-credentials.js.map +1 -1
  134. package/dist/utils/log.cjs +25 -0
  135. package/dist/utils/log.cjs.map +1 -0
  136. package/dist/utils/log.js +15 -17
  137. package/dist/utils/log.js.map +1 -1
  138. package/dist/utils/network-policy.cjs +65 -0
  139. package/dist/utils/network-policy.cjs.map +1 -0
  140. package/dist/utils/network-policy.js +58 -77
  141. package/dist/utils/network-policy.js.map +1 -1
  142. package/dist/utils/normalizePath.cjs +27 -0
  143. package/dist/utils/normalizePath.cjs.map +1 -0
  144. package/dist/utils/normalizePath.js +21 -28
  145. package/dist/utils/normalizePath.js.map +1 -1
  146. package/dist/utils/resolveSignal.cjs +20 -0
  147. package/dist/utils/resolveSignal.cjs.map +1 -0
  148. package/dist/utils/resolveSignal.d.cts +15 -0
  149. package/dist/utils/resolveSignal.d.ts +12 -10
  150. package/dist/utils/resolveSignal.js +14 -17
  151. package/dist/utils/resolveSignal.js.map +1 -1
  152. package/dist/utils/sandbox-snapshot.cjs +14 -0
  153. package/dist/utils/sandbox-snapshot.cjs.map +1 -0
  154. package/dist/utils/sandbox-snapshot.d.cts +10 -0
  155. package/dist/utils/sandbox-snapshot.d.ts +11 -0
  156. package/dist/utils/sandbox-snapshot.js +14 -0
  157. package/dist/utils/sandbox-snapshot.js.map +1 -0
  158. package/dist/utils/types.cjs +13 -0
  159. package/dist/utils/types.cjs.map +1 -0
  160. package/dist/utils/types.d.cts +11 -0
  161. package/dist/utils/types.d.ts +5 -7
  162. package/dist/utils/types.js +8 -8
  163. package/dist/utils/types.js.map +1 -1
  164. package/dist/version.cjs +7 -0
  165. package/dist/version.cjs.map +1 -0
  166. package/dist/version.js +5 -5
  167. package/dist/version.js.map +1 -1
  168. package/package.json +23 -3
  169. package/dist/api-client/index.js.map +0 -1
  170. package/dist/auth/api.d.ts +0 -6
  171. package/dist/auth/error.d.ts +0 -11
  172. package/dist/auth/index.js.map +0 -1
  173. package/dist/auth/linked-project.d.ts +0 -10
  174. package/dist/auth/zod.d.ts +0 -5
  175. package/dist/constants.js +0 -3
  176. package/dist/constants.js.map +0 -1
  177. package/dist/index.js.map +0 -1
  178. package/dist/network-policy.js +0 -3
  179. package/dist/network-policy.js.map +0 -1
  180. package/dist/utils/array.d.ts +0 -9
  181. package/dist/utils/consume-readable.d.ts +0 -5
  182. package/dist/utils/convert-sandbox.d.ts +0 -6
  183. package/dist/utils/convert-sandbox.js +0 -14
  184. package/dist/utils/convert-sandbox.js.map +0 -1
  185. package/dist/utils/decode-base64-url.d.ts +0 -7
  186. package/dist/utils/dev-credentials.d.ts +0 -37
  187. package/dist/utils/log.d.ts +0 -2
  188. package/dist/utils/network-policy.d.ts +0 -7
  189. package/dist/utils/normalizePath.d.ts +0 -17
  190. package/dist/version.d.ts +0 -1
@@ -1,269 +1,202 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.OAuth = OAuth;
7
- exports.isOAuthError = isOAuthError;
8
- const os_1 = __importDefault(require("os"));
9
- const zod_1 = require("zod");
10
- const version_1 = require("../version");
11
- const USER_AGENT = `${os_1.default.hostname()} @ vercel/sandbox/${version_1.VERSION} node-${process.version} ${os_1.default.platform()} (${os_1.default.arch()})`;
1
+ import { VERSION } from "../version.js";
2
+ import { z } from "zod";
3
+ import os from "os";
4
+
5
+ //#region src/auth/oauth.ts
6
+ const USER_AGENT = `${os.hostname()} @ vercel/sandbox/${VERSION} node-${process.version} ${os.platform()} (${os.arch()})`;
12
7
  const ISSUER = new URL("https://vercel.com");
13
8
  const CLIENT_ID = "cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp";
14
- const AuthorizationServerMetadata = zod_1.z.object({
15
- issuer: zod_1.z.string().url(),
16
- device_authorization_endpoint: zod_1.z.string().url(),
17
- token_endpoint: zod_1.z.string().url(),
18
- revocation_endpoint: zod_1.z.string().url(),
19
- jwks_uri: zod_1.z.string().url(),
20
- introspection_endpoint: zod_1.z.string().url(),
9
+ const AuthorizationServerMetadata = z.object({
10
+ issuer: z.string().url(),
11
+ device_authorization_endpoint: z.string().url(),
12
+ token_endpoint: z.string().url(),
13
+ revocation_endpoint: z.string().url(),
14
+ jwks_uri: z.string().url(),
15
+ introspection_endpoint: z.string().url()
21
16
  });
22
17
  let _as;
23
- const DeviceAuthorization = zod_1.z.object({
24
- device_code: zod_1.z.string(),
25
- user_code: zod_1.z.string(),
26
- verification_uri: zod_1.z.string().url(),
27
- verification_uri_complete: zod_1.z.string().url(),
28
- expires_in: zod_1.z.number(),
29
- interval: zod_1.z.number(),
18
+ const DeviceAuthorization = z.object({
19
+ device_code: z.string(),
20
+ user_code: z.string(),
21
+ verification_uri: z.string().url(),
22
+ verification_uri_complete: z.string().url(),
23
+ expires_in: z.number(),
24
+ interval: z.number()
30
25
  });
31
- const IntrospectionResponse = zod_1.z
32
- .object({
33
- active: zod_1.z.literal(true),
34
- client_id: zod_1.z.string(),
35
- session_id: zod_1.z.string(),
36
- })
37
- .or(zod_1.z.object({ active: zod_1.z.literal(false) }));
26
+ const IntrospectionResponse = z.object({
27
+ active: z.literal(true),
28
+ client_id: z.string(),
29
+ session_id: z.string()
30
+ }).or(z.object({ active: z.literal(false) }));
38
31
  /**
39
- * Returns the Authorization Server Metadata
40
- *
41
- * @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest
42
- * @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationResponse
43
- */
32
+ * Returns the Authorization Server Metadata
33
+ *
34
+ * @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest
35
+ * @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationResponse
36
+ */
44
37
  async function authorizationServerMetadata() {
45
- if (_as)
46
- return _as;
47
- const response = await fetch(new URL(".well-known/openid-configuration", ISSUER), {
48
- headers: { "Content-Type": "application/json", "user-agent": USER_AGENT },
49
- });
50
- _as = AuthorizationServerMetadata.parse(await response.json());
51
- return _as;
38
+ if (_as) return _as;
39
+ const response = await fetch(new URL(".well-known/openid-configuration", ISSUER), { headers: {
40
+ "Content-Type": "application/json",
41
+ "user-agent": USER_AGENT
42
+ } });
43
+ _as = AuthorizationServerMetadata.parse(await response.json());
44
+ return _as;
52
45
  }
53
46
  async function OAuth() {
54
- const as = await authorizationServerMetadata();
55
- return {
56
- /**
57
- * Perform the Device Authorization Request
58
- *
59
- * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.1
60
- * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.2
61
- */
62
- async deviceAuthorizationRequest() {
63
- const response = await fetch(as.device_authorization_endpoint, {
64
- method: "POST",
65
- headers: {
66
- "Content-Type": "application/x-www-form-urlencoded",
67
- "user-agent": USER_AGENT,
68
- },
69
- body: new URLSearchParams({
70
- client_id: CLIENT_ID,
71
- scope: "openid offline_access",
72
- }),
73
- });
74
- const json = await response.json();
75
- const parsed = DeviceAuthorization.safeParse(json);
76
- if (!parsed.success) {
77
- throw new OAuthError(`Failed to parse device authorization response: ${parsed.error.message}`, json);
78
- }
79
- return {
80
- device_code: parsed.data.device_code,
81
- user_code: parsed.data.user_code,
82
- verification_uri: parsed.data.verification_uri,
83
- verification_uri_complete: parsed.data.verification_uri_complete,
84
- expiresAt: Date.now() + parsed.data.expires_in * 1000,
85
- interval: parsed.data.interval,
86
- };
87
- },
88
- /**
89
- * Perform the Device Access Token Request
90
- *
91
- * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.4
92
- */
93
- async deviceAccessTokenRequest(device_code) {
94
- try {
95
- return [
96
- null,
97
- await fetch(as.token_endpoint, {
98
- method: "POST",
99
- headers: {
100
- "Content-Type": "application/x-www-form-urlencoded",
101
- "user-agent": USER_AGENT,
102
- },
103
- body: new URLSearchParams({
104
- client_id: CLIENT_ID,
105
- grant_type: "urn:ietf:params:oauth:grant-type:device_code",
106
- device_code,
107
- }),
108
- signal: AbortSignal.timeout(10 * 1000),
109
- }),
110
- ];
111
- }
112
- catch (error) {
113
- if (error instanceof Error)
114
- return [error];
115
- return [
116
- new Error("An unknown error occurred. See the logs for details.", {
117
- cause: error,
118
- }),
119
- ];
120
- }
121
- },
122
- /**
123
- * Process the Token request Response
124
- *
125
- * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.5
126
- */
127
- async processTokenResponse(response) {
128
- const json = await response.json();
129
- const processed = TokenSet.safeParse(json);
130
- if (!processed.success) {
131
- return [
132
- new OAuthError(`Failed to parse token response: ${processed.error.message}`, json),
133
- ];
134
- }
135
- return [null, processed.data];
136
- },
137
- /**
138
- * Perform a Token Revocation Request.
139
- *
140
- * @see https://datatracker.ietf.org/doc/html/rfc7009#section-2.1
141
- * @see https://datatracker.ietf.org/doc/html/rfc7009#section-2.2
142
- */
143
- async revokeToken(token) {
144
- const response = await fetch(as.revocation_endpoint, {
145
- method: "POST",
146
- headers: {
147
- "Content-Type": "application/x-www-form-urlencoded",
148
- "user-agent": USER_AGENT,
149
- },
150
- body: new URLSearchParams({ token, client_id: CLIENT_ID }),
151
- });
152
- if (response.ok)
153
- return;
154
- const json = await response.json();
155
- return new OAuthError("Revocation request failed", json);
156
- },
157
- /**
158
- * Perform Refresh Token Request.
159
- *
160
- * @see https://datatracker.ietf.org/doc/html/rfc6749#section-6
161
- */
162
- async refreshToken(token) {
163
- const response = await fetch(as.token_endpoint, {
164
- method: "POST",
165
- headers: {
166
- "Content-Type": "application/x-www-form-urlencoded",
167
- "user-agent": USER_AGENT,
168
- },
169
- body: new URLSearchParams({
170
- client_id: CLIENT_ID,
171
- grant_type: "refresh_token",
172
- refresh_token: token,
173
- }),
174
- });
175
- const [tokensError, tokenSet] = await this.processTokenResponse(response);
176
- if (tokensError)
177
- throw tokensError;
178
- return tokenSet;
179
- },
180
- /**
181
- * Perform Token Introspection Request.
182
- *
183
- * @see https://datatracker.ietf.org/doc/html/rfc7662#section-2.1
184
- */
185
- async introspectToken(token) {
186
- const response = await fetch(as.introspection_endpoint, {
187
- method: "POST",
188
- headers: {
189
- "Content-Type": "application/x-www-form-urlencoded",
190
- "user-agent": USER_AGENT,
191
- },
192
- body: new URLSearchParams({ token }),
193
- });
194
- const json = await response.json();
195
- const processed = IntrospectionResponse.safeParse(json);
196
- if (!processed.success) {
197
- throw new OAuthError(`Failed to parse introspection response: ${processed.error.message}`, json);
198
- }
199
- return processed.data;
200
- },
201
- };
47
+ const as = await authorizationServerMetadata();
48
+ return {
49
+ async deviceAuthorizationRequest() {
50
+ const json = await (await fetch(as.device_authorization_endpoint, {
51
+ method: "POST",
52
+ headers: {
53
+ "Content-Type": "application/x-www-form-urlencoded",
54
+ "user-agent": USER_AGENT
55
+ },
56
+ body: new URLSearchParams({
57
+ client_id: CLIENT_ID,
58
+ scope: "openid offline_access"
59
+ })
60
+ })).json();
61
+ const parsed = DeviceAuthorization.safeParse(json);
62
+ if (!parsed.success) throw new OAuthError(`Failed to parse device authorization response: ${parsed.error.message}`, json);
63
+ return {
64
+ device_code: parsed.data.device_code,
65
+ user_code: parsed.data.user_code,
66
+ verification_uri: parsed.data.verification_uri,
67
+ verification_uri_complete: parsed.data.verification_uri_complete,
68
+ expiresAt: Date.now() + parsed.data.expires_in * 1e3,
69
+ interval: parsed.data.interval
70
+ };
71
+ },
72
+ async deviceAccessTokenRequest(device_code) {
73
+ try {
74
+ return [null, await fetch(as.token_endpoint, {
75
+ method: "POST",
76
+ headers: {
77
+ "Content-Type": "application/x-www-form-urlencoded",
78
+ "user-agent": USER_AGENT
79
+ },
80
+ body: new URLSearchParams({
81
+ client_id: CLIENT_ID,
82
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
83
+ device_code
84
+ }),
85
+ signal: AbortSignal.timeout(10 * 1e3)
86
+ })];
87
+ } catch (error) {
88
+ if (error instanceof Error) return [error];
89
+ return [new Error("An unknown error occurred. See the logs for details.", { cause: error })];
90
+ }
91
+ },
92
+ async processTokenResponse(response) {
93
+ const json = await response.json();
94
+ const processed = TokenSet.safeParse(json);
95
+ if (!processed.success) return [new OAuthError(`Failed to parse token response: ${processed.error.message}`, json)];
96
+ return [null, processed.data];
97
+ },
98
+ async revokeToken(token) {
99
+ const response = await fetch(as.revocation_endpoint, {
100
+ method: "POST",
101
+ headers: {
102
+ "Content-Type": "application/x-www-form-urlencoded",
103
+ "user-agent": USER_AGENT
104
+ },
105
+ body: new URLSearchParams({
106
+ token,
107
+ client_id: CLIENT_ID
108
+ })
109
+ });
110
+ if (response.ok) return;
111
+ return new OAuthError("Revocation request failed", await response.json());
112
+ },
113
+ async refreshToken(token) {
114
+ const response = await fetch(as.token_endpoint, {
115
+ method: "POST",
116
+ headers: {
117
+ "Content-Type": "application/x-www-form-urlencoded",
118
+ "user-agent": USER_AGENT
119
+ },
120
+ body: new URLSearchParams({
121
+ client_id: CLIENT_ID,
122
+ grant_type: "refresh_token",
123
+ refresh_token: token
124
+ })
125
+ });
126
+ const [tokensError, tokenSet] = await this.processTokenResponse(response);
127
+ if (tokensError) throw tokensError;
128
+ return tokenSet;
129
+ },
130
+ async introspectToken(token) {
131
+ const json = await (await fetch(as.introspection_endpoint, {
132
+ method: "POST",
133
+ headers: {
134
+ "Content-Type": "application/x-www-form-urlencoded",
135
+ "user-agent": USER_AGENT
136
+ },
137
+ body: new URLSearchParams({ token })
138
+ })).json();
139
+ const processed = IntrospectionResponse.safeParse(json);
140
+ if (!processed.success) throw new OAuthError(`Failed to parse introspection response: ${processed.error.message}`, json);
141
+ return processed.data;
142
+ }
143
+ };
202
144
  }
203
- const TokenSet = zod_1.z.object({
204
- /** The access token issued by the authorization server. */
205
- access_token: zod_1.z.string(),
206
- /** The type of the token issued */
207
- token_type: zod_1.z.literal("Bearer"),
208
- /** The lifetime in seconds of the access token. */
209
- expires_in: zod_1.z.number(),
210
- /** The refresh token, which can be used to obtain new access tokens. */
211
- refresh_token: zod_1.z.string().optional(),
212
- /** The scope of the access token. */
213
- scope: zod_1.z.string().optional(),
145
+ const TokenSet = z.object({
146
+ access_token: z.string(),
147
+ token_type: z.literal("Bearer"),
148
+ expires_in: z.number(),
149
+ refresh_token: z.string().optional(),
150
+ scope: z.string().optional()
214
151
  });
215
- const OAuthErrorResponse = zod_1.z.object({
216
- error: zod_1.z.enum([
217
- "invalid_request",
218
- "invalid_client",
219
- "invalid_grant",
220
- "unauthorized_client",
221
- "unsupported_grant_type",
222
- "invalid_scope",
223
- "server_error",
224
- // Device Authorization Response Errors
225
- "authorization_pending",
226
- "slow_down",
227
- "access_denied",
228
- "expired_token",
229
- // Revocation Response Errors
230
- "unsupported_token_type",
231
- ]),
232
- error_description: zod_1.z.string().optional(),
233
- error_uri: zod_1.z.string().optional(),
152
+ const OAuthErrorResponse = z.object({
153
+ error: z.enum([
154
+ "invalid_request",
155
+ "invalid_client",
156
+ "invalid_grant",
157
+ "unauthorized_client",
158
+ "unsupported_grant_type",
159
+ "invalid_scope",
160
+ "server_error",
161
+ "authorization_pending",
162
+ "slow_down",
163
+ "access_denied",
164
+ "expired_token",
165
+ "unsupported_token_type"
166
+ ]),
167
+ error_description: z.string().optional(),
168
+ error_uri: z.string().optional()
234
169
  });
235
170
  function processOAuthErrorResponse(json) {
236
- try {
237
- return OAuthErrorResponse.parse(json);
238
- }
239
- catch (error) {
240
- if (error instanceof zod_1.z.ZodError) {
241
- return new TypeError(`Invalid OAuth error response: ${error.message}`);
242
- }
243
- return new TypeError("Failed to parse OAuth error response");
244
- }
245
- }
246
- class OAuthError extends Error {
247
- constructor(message, response) {
248
- super(message);
249
- this.name = "OAuthError";
250
- const error = processOAuthErrorResponse(response);
251
- if (error instanceof TypeError) {
252
- const message = `Unexpected server response: ${JSON.stringify(response)}`;
253
- this.cause = new Error(message, { cause: error });
254
- this.code = "server_error";
255
- return;
256
- }
257
- let cause = error.error;
258
- if (error.error_description)
259
- cause += `: ${error.error_description}`;
260
- if (error.error_uri)
261
- cause += ` (${error.error_uri})`;
262
- this.cause = new Error(cause);
263
- this.code = error.error;
264
- }
171
+ try {
172
+ return OAuthErrorResponse.parse(json);
173
+ } catch (error) {
174
+ if (error instanceof z.ZodError) return /* @__PURE__ */ new TypeError(`Invalid OAuth error response: ${error.message}`);
175
+ return /* @__PURE__ */ new TypeError("Failed to parse OAuth error response");
176
+ }
265
177
  }
178
+ var OAuthError = class extends Error {
179
+ constructor(message, response) {
180
+ super(message);
181
+ this.name = "OAuthError";
182
+ const error = processOAuthErrorResponse(response);
183
+ if (error instanceof TypeError) {
184
+ const message$1 = `Unexpected server response: ${JSON.stringify(response)}`;
185
+ this.cause = new Error(message$1, { cause: error });
186
+ this.code = "server_error";
187
+ return;
188
+ }
189
+ let cause = error.error;
190
+ if (error.error_description) cause += `: ${error.error_description}`;
191
+ if (error.error_uri) cause += ` (${error.error_uri})`;
192
+ this.cause = new Error(cause);
193
+ this.code = error.error;
194
+ }
195
+ };
266
196
  function isOAuthError(error) {
267
- return error instanceof OAuthError;
197
+ return error instanceof OAuthError;
268
198
  }
199
+
200
+ //#endregion
201
+ export { OAuth, isOAuthError };
269
202
  //# sourceMappingURL=oauth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"oauth.js","names":["_as: AuthorizationServerMetadata","message"],"sources":["../../src/auth/oauth.ts"],"sourcesContent":["import os from \"os\";\nimport { z } from \"zod\";\nimport { VERSION } from \"../version.js\";\n\nconst USER_AGENT = `${os.hostname()} @ vercel/sandbox/${VERSION} node-${\n process.version\n} ${os.platform()} (${os.arch()})`;\n\nconst ISSUER = new URL(\"https://vercel.com\");\nconst CLIENT_ID = \"cl_HYyOPBNtFMfHhaUn9L4QPfTZz6TP47bp\";\n\nconst AuthorizationServerMetadata = z.object({\n issuer: z.string().url(),\n device_authorization_endpoint: z.string().url(),\n token_endpoint: z.string().url(),\n revocation_endpoint: z.string().url(),\n jwks_uri: z.string().url(),\n introspection_endpoint: z.string().url(),\n});\ntype AuthorizationServerMetadata = z.infer<typeof AuthorizationServerMetadata>;\nlet _as: AuthorizationServerMetadata;\n\nconst DeviceAuthorization = z.object({\n device_code: z.string(),\n user_code: z.string(),\n verification_uri: z.string().url(),\n verification_uri_complete: z.string().url(),\n expires_in: z.number(),\n interval: z.number(),\n});\n\nconst IntrospectionResponse = z\n .object({\n active: z.literal(true),\n client_id: z.string(),\n session_id: z.string(),\n })\n .or(z.object({ active: z.literal(false) }));\n\n/**\n * Returns the Authorization Server Metadata\n *\n * @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest\n * @see https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationResponse\n */\nasync function authorizationServerMetadata(): Promise<AuthorizationServerMetadata> {\n if (_as) return _as;\n\n const response = await fetch(\n new URL(\".well-known/openid-configuration\", ISSUER),\n {\n headers: { \"Content-Type\": \"application/json\", \"user-agent\": USER_AGENT },\n },\n );\n\n _as = AuthorizationServerMetadata.parse(await response.json());\n return _as;\n}\n\nexport async function OAuth() {\n const as = await authorizationServerMetadata();\n return {\n /**\n * Perform the Device Authorization Request\n *\n * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.1\n * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.2\n */\n async deviceAuthorizationRequest(): Promise<DeviceAuthorizationRequest> {\n const response = await fetch(as.device_authorization_endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": USER_AGENT,\n },\n body: new URLSearchParams({\n client_id: CLIENT_ID,\n scope: \"openid offline_access\",\n }),\n });\n\n const json = await response.json();\n const parsed = DeviceAuthorization.safeParse(json);\n\n if (!parsed.success) {\n throw new OAuthError(\n `Failed to parse device authorization response: ${parsed.error.message}`,\n json,\n );\n }\n\n return {\n device_code: parsed.data.device_code,\n user_code: parsed.data.user_code,\n verification_uri: parsed.data.verification_uri,\n verification_uri_complete: parsed.data.verification_uri_complete,\n expiresAt: Date.now() + parsed.data.expires_in * 1000,\n interval: parsed.data.interval,\n };\n },\n /**\n * Perform the Device Access Token Request\n *\n * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.4\n */\n async deviceAccessTokenRequest(\n device_code: string,\n ): Promise<[Error] | [null, Response]> {\n try {\n return [\n null,\n await fetch(as.token_endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": USER_AGENT,\n },\n body: new URLSearchParams({\n client_id: CLIENT_ID,\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code,\n }),\n signal: AbortSignal.timeout(10 * 1000),\n }),\n ];\n } catch (error) {\n if (error instanceof Error) return [error];\n return [\n new Error(\"An unknown error occurred. See the logs for details.\", {\n cause: error,\n }),\n ];\n }\n },\n /**\n * Process the Token request Response\n *\n * @see https://datatracker.ietf.org/doc/html/rfc8628#section-3.5\n */\n async processTokenResponse(\n response: Response,\n ): Promise<[OAuthError] | [null, TokenSet]> {\n const json = await response.json();\n const processed = TokenSet.safeParse(json);\n\n if (!processed.success) {\n return [\n new OAuthError(\n `Failed to parse token response: ${processed.error.message}`,\n json,\n ),\n ];\n }\n\n return [null, processed.data];\n },\n /**\n * Perform a Token Revocation Request.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc7009#section-2.1\n * @see https://datatracker.ietf.org/doc/html/rfc7009#section-2.2\n */\n async revokeToken(token: string): Promise<OAuthError | void> {\n const response = await fetch(as.revocation_endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": USER_AGENT,\n },\n body: new URLSearchParams({ token, client_id: CLIENT_ID }),\n });\n\n if (response.ok) return;\n const json = await response.json();\n\n return new OAuthError(\"Revocation request failed\", json);\n },\n /**\n * Perform Refresh Token Request.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc6749#section-6\n */\n async refreshToken(token: string): Promise<TokenSet> {\n const response = await fetch(as.token_endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": USER_AGENT,\n },\n body: new URLSearchParams({\n client_id: CLIENT_ID,\n grant_type: \"refresh_token\",\n refresh_token: token,\n }),\n });\n\n const [tokensError, tokenSet] = await this.processTokenResponse(response);\n if (tokensError) throw tokensError;\n return tokenSet;\n },\n /**\n * Perform Token Introspection Request.\n *\n * @see https://datatracker.ietf.org/doc/html/rfc7662#section-2.1\n */\n async introspectToken(\n token: string,\n ): Promise<z.infer<typeof IntrospectionResponse>> {\n const response = await fetch(as.introspection_endpoint, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n \"user-agent\": USER_AGENT,\n },\n body: new URLSearchParams({ token }),\n });\n\n const json = await response.json();\n const processed = IntrospectionResponse.safeParse(json);\n if (!processed.success) {\n throw new OAuthError(\n `Failed to parse introspection response: ${processed.error.message}`,\n json,\n );\n }\n\n return processed.data;\n },\n };\n}\n\nexport type OAuth = Awaited<ReturnType<typeof OAuth>>;\n\nconst TokenSet = z.object({\n /** The access token issued by the authorization server. */\n access_token: z.string(),\n /** The type of the token issued */\n token_type: z.literal(\"Bearer\"),\n /** The lifetime in seconds of the access token. */\n expires_in: z.number(),\n /** The refresh token, which can be used to obtain new access tokens. */\n refresh_token: z.string().optional(),\n /** The scope of the access token. */\n scope: z.string().optional(),\n});\n\ntype TokenSet = z.infer<typeof TokenSet>;\n\nconst OAuthErrorResponse = z.object({\n error: z.enum([\n \"invalid_request\",\n \"invalid_client\",\n \"invalid_grant\",\n \"unauthorized_client\",\n \"unsupported_grant_type\",\n \"invalid_scope\",\n \"server_error\",\n // Device Authorization Response Errors\n \"authorization_pending\",\n \"slow_down\",\n \"access_denied\",\n \"expired_token\",\n // Revocation Response Errors\n \"unsupported_token_type\",\n ]),\n error_description: z.string().optional(),\n error_uri: z.string().optional(),\n});\n\ntype OAuthErrorResponse = z.infer<typeof OAuthErrorResponse>;\n\nfunction processOAuthErrorResponse(\n json: unknown,\n): OAuthErrorResponse | TypeError {\n try {\n return OAuthErrorResponse.parse(json);\n } catch (error) {\n if (error instanceof z.ZodError) {\n return new TypeError(`Invalid OAuth error response: ${error.message}`);\n }\n return new TypeError(\"Failed to parse OAuth error response\");\n }\n}\n\nclass OAuthError extends Error {\n name = \"OAuthError\";\n code: OAuthErrorResponse[\"error\"];\n cause: Error;\n constructor(message: string, response: unknown) {\n super(message);\n const error = processOAuthErrorResponse(response);\n if (error instanceof TypeError) {\n const message = `Unexpected server response: ${JSON.stringify(response)}`;\n this.cause = new Error(message, { cause: error });\n this.code = \"server_error\";\n return;\n }\n let cause = error.error;\n if (error.error_description) cause += `: ${error.error_description}`;\n if (error.error_uri) cause += ` (${error.error_uri})`;\n\n this.cause = new Error(cause);\n this.code = error.error;\n }\n}\n\nexport function isOAuthError(error: unknown): error is OAuthError {\n return error instanceof OAuthError;\n}\n\nexport interface DeviceAuthorizationRequest {\n /** The device verification code. */\n device_code: string;\n /** The end-user verification code. */\n user_code: string;\n /**\n * The minimum amount of time in seconds that the client\n * SHOULD wait between polling requests to the token endpoint.\n */\n interval: number;\n /** The end-user verification URI on the authorization server. */\n verification_uri: string;\n /**\n * The end-user verification URI on the authorization server,\n * including the `user_code`, without redirection.\n */\n verification_uri_complete: string;\n /**\n * The absolute lifetime of the `device_code` and `user_code`.\n * Calculated from `expires_in`.\n */\n expiresAt: number;\n}\n"],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
+ const require_file = require('./file.cjs');
3
+ const require_oauth = require('./oauth.cjs');
4
+ let node_timers_promises = require("node:timers/promises");
5
+
6
+ //#region src/auth/poll-for-token.ts
7
+ async function* pollForToken({ request, oauth }) {
8
+ const controller = new AbortController();
9
+ try {
10
+ let intervalMs = request.interval * 1e3;
11
+ while (Date.now() < request.expiresAt) {
12
+ const [tokenResponseError, tokenResponse] = await oauth.deviceAccessTokenRequest(request.device_code);
13
+ if (tokenResponseError) {
14
+ if (tokenResponseError.message.includes("timeout")) {
15
+ intervalMs *= 2;
16
+ yield {
17
+ _tag: "Timeout",
18
+ newInterval: intervalMs
19
+ };
20
+ await (0, node_timers_promises.setTimeout)(intervalMs, { signal: controller.signal });
21
+ continue;
22
+ }
23
+ yield {
24
+ _tag: "Error",
25
+ error: tokenResponseError
26
+ };
27
+ return;
28
+ }
29
+ yield {
30
+ _tag: "Response",
31
+ response: tokenResponse.clone()
32
+ };
33
+ const [tokensError, tokens] = await oauth.processTokenResponse(tokenResponse);
34
+ if (require_oauth.isOAuthError(tokensError)) {
35
+ const { code } = tokensError;
36
+ switch (code) {
37
+ case "authorization_pending":
38
+ await (0, node_timers_promises.setTimeout)(intervalMs, { signal: controller.signal });
39
+ continue;
40
+ case "slow_down":
41
+ intervalMs += 5 * 1e3;
42
+ yield {
43
+ _tag: "SlowDown",
44
+ newInterval: intervalMs
45
+ };
46
+ await (0, node_timers_promises.setTimeout)(intervalMs, { signal: controller.signal });
47
+ continue;
48
+ default:
49
+ yield {
50
+ _tag: "Error",
51
+ error: tokensError.cause
52
+ };
53
+ return;
54
+ }
55
+ }
56
+ if (tokensError) {
57
+ yield {
58
+ _tag: "Error",
59
+ error: tokensError
60
+ };
61
+ return;
62
+ }
63
+ require_file.updateAuthConfig({
64
+ token: tokens.access_token,
65
+ expiresAt: new Date(Date.now() + tokens.expires_in * 1e3),
66
+ refreshToken: tokens.refresh_token
67
+ });
68
+ return;
69
+ }
70
+ yield {
71
+ _tag: "Error",
72
+ error: /* @__PURE__ */ new Error("Timed out waiting for authentication. Please try again.")
73
+ };
74
+ return;
75
+ } finally {
76
+ controller.abort();
77
+ }
78
+ }
79
+
80
+ //#endregion
81
+ exports.pollForToken = pollForToken;
82
+ //# sourceMappingURL=poll-for-token.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll-for-token.cjs","names":["isOAuthError"],"sources":["../../src/auth/poll-for-token.ts"],"sourcesContent":["import { setTimeout } from \"node:timers/promises\";\nimport { updateAuthConfig } from \"./file.js\";\nimport { DeviceAuthorizationRequest, isOAuthError, OAuth } from \"./oauth.js\";\n\nexport type PollTokenItem =\n | { _tag: \"Timeout\"; newInterval: number }\n | { _tag: \"SlowDown\"; newInterval: number }\n | { _tag: \"Error\"; error: Error }\n | {\n _tag: \"Response\";\n response: { text(): Promise<string> };\n };\n\nexport async function* pollForToken({\n request,\n oauth,\n}: {\n request: DeviceAuthorizationRequest;\n oauth: OAuth;\n}): AsyncGenerator<PollTokenItem, void, void> {\n const controller = new AbortController();\n try {\n let intervalMs = request.interval * 1000;\n while (Date.now() < request.expiresAt) {\n const [tokenResponseError, tokenResponse] =\n await oauth.deviceAccessTokenRequest(request.device_code);\n\n if (tokenResponseError) {\n // 2x backoff on connection timeouts per spec https://datatracker.ietf.org/doc/html/rfc8628#section-3.5\n if (tokenResponseError.message.includes(\"timeout\")) {\n intervalMs *= 2;\n yield { _tag: \"Timeout\" as const, newInterval: intervalMs };\n await setTimeout(intervalMs, { signal: controller.signal });\n continue;\n }\n yield { _tag: \"Error\" as const, error: tokenResponseError };\n return;\n }\n\n yield {\n _tag: \"Response\" as const,\n response: tokenResponse.clone() as { text(): Promise<string> },\n };\n\n const [tokensError, tokens] =\n await oauth.processTokenResponse(tokenResponse);\n\n if (isOAuthError(tokensError)) {\n const { code } = tokensError;\n switch (code) {\n case \"authorization_pending\":\n await setTimeout(intervalMs, { signal: controller.signal });\n continue;\n case \"slow_down\":\n intervalMs += 5 * 1000;\n yield { _tag: \"SlowDown\" as const, newInterval: intervalMs };\n await setTimeout(intervalMs, { signal: controller.signal });\n continue;\n default:\n yield { _tag: \"Error\", error: tokensError.cause };\n return;\n }\n }\n\n if (tokensError) {\n yield { _tag: \"Error\", error: tokensError };\n return;\n }\n\n updateAuthConfig({\n token: tokens.access_token,\n expiresAt: new Date(Date.now() + tokens.expires_in * 1000),\n refreshToken: tokens.refresh_token,\n });\n\n return;\n }\n\n yield {\n _tag: \"Error\" as const,\n error: new Error(\n \"Timed out waiting for authentication. Please try again.\",\n ),\n };\n return;\n } finally {\n controller.abort();\n }\n}\n"],"mappings":";;;;;;AAaA,gBAAuB,aAAa,EAClC,SACA,SAI4C;CAC5C,MAAM,aAAa,IAAI,iBAAiB;AACxC,KAAI;EACF,IAAI,aAAa,QAAQ,WAAW;AACpC,SAAO,KAAK,KAAK,GAAG,QAAQ,WAAW;GACrC,MAAM,CAAC,oBAAoB,iBACzB,MAAM,MAAM,yBAAyB,QAAQ,YAAY;AAE3D,OAAI,oBAAoB;AAEtB,QAAI,mBAAmB,QAAQ,SAAS,UAAU,EAAE;AAClD,mBAAc;AACd,WAAM;MAAE,MAAM;MAAoB,aAAa;MAAY;AAC3D,gDAAiB,YAAY,EAAE,QAAQ,WAAW,QAAQ,CAAC;AAC3D;;AAEF,UAAM;KAAE,MAAM;KAAkB,OAAO;KAAoB;AAC3D;;AAGF,SAAM;IACJ,MAAM;IACN,UAAU,cAAc,OAAO;IAChC;GAED,MAAM,CAAC,aAAa,UAClB,MAAM,MAAM,qBAAqB,cAAc;AAEjD,OAAIA,2BAAa,YAAY,EAAE;IAC7B,MAAM,EAAE,SAAS;AACjB,YAAQ,MAAR;KACE,KAAK;AACH,iDAAiB,YAAY,EAAE,QAAQ,WAAW,QAAQ,CAAC;AAC3D;KACF,KAAK;AACH,oBAAc,IAAI;AAClB,YAAM;OAAE,MAAM;OAAqB,aAAa;OAAY;AAC5D,iDAAiB,YAAY,EAAE,QAAQ,WAAW,QAAQ,CAAC;AAC3D;KACF;AACE,YAAM;OAAE,MAAM;OAAS,OAAO,YAAY;OAAO;AACjD;;;AAIN,OAAI,aAAa;AACf,UAAM;KAAE,MAAM;KAAS,OAAO;KAAa;AAC3C;;AAGF,iCAAiB;IACf,OAAO,OAAO;IACd,WAAW,IAAI,KAAK,KAAK,KAAK,GAAG,OAAO,aAAa,IAAK;IAC1D,cAAc,OAAO;IACtB,CAAC;AAEF;;AAGF,QAAM;GACJ,MAAM;GACN,uBAAO,IAAI,MACT,0DACD;GACF;AACD;WACQ;AACR,aAAW,OAAO"}
@@ -0,0 +1,28 @@
1
+ import { DeviceAuthorizationRequest, OAuth } from "./oauth.cjs";
2
+
3
+ //#region src/auth/poll-for-token.d.ts
4
+ type PollTokenItem = {
5
+ _tag: "Timeout";
6
+ newInterval: number;
7
+ } | {
8
+ _tag: "SlowDown";
9
+ newInterval: number;
10
+ } | {
11
+ _tag: "Error";
12
+ error: Error;
13
+ } | {
14
+ _tag: "Response";
15
+ response: {
16
+ text(): Promise<string>;
17
+ };
18
+ };
19
+ declare function pollForToken({
20
+ request,
21
+ oauth
22
+ }: {
23
+ request: DeviceAuthorizationRequest;
24
+ oauth: OAuth;
25
+ }): AsyncGenerator<PollTokenItem, void, void>;
26
+ //#endregion
27
+ export { pollForToken };
28
+ //# sourceMappingURL=poll-for-token.d.cts.map