@samebase/alchemy-convex 0.19.0 → 0.19.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/lib/{HubClient-C0XxgkK3.js → HubClient-NUvPkolM.js} +12 -4
- package/lib/HubClient-NUvPkolM.js.map +1 -0
- package/lib/cli.js +1 -1
- package/lib/index.d.ts +7 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -1
- package/package.json +1 -1
- package/src/ManagementApi.ts +22 -1
- package/src/Push.ts +10 -6
- package/lib/HubClient-C0XxgkK3.js.map +0 -1
package/lib/index.d.ts
CHANGED
|
@@ -97,6 +97,13 @@ interface ManagementApiService {
|
|
|
97
97
|
* that key would revoke the credential.
|
|
98
98
|
*/
|
|
99
99
|
readonly isCredentialToken: (secret: string) => Effect.Effect<boolean>;
|
|
100
|
+
/**
|
|
101
|
+
* True when the Management API credential is an OAuth token, `team:<slug>|...`
|
|
102
|
+
* or `project:...|...`. A team access token and the Convex CLI login have no
|
|
103
|
+
* such prefix. Convex answers HTTP 400 to create_deploy_key with
|
|
104
|
+
* `allowedActions` or `expiresAt` from an OAuth token.
|
|
105
|
+
*/
|
|
106
|
+
readonly isOAuthCredential: Effect.Effect<boolean>;
|
|
100
107
|
/**
|
|
101
108
|
* The same calls with another bearer token, such as a preview deploy key,
|
|
102
109
|
* which the Management API takes for the preview deployments of its project.
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Credentials.ts","../src/ManagementApi.ts","../src/Providers.ts","../src/Push.ts","../src/Deployment.ts","../src/Component.ts","../src/Project.ts","../src/HubClient.ts","../src/RunRecord.ts","../src/State.ts"],"mappings":";;;;;;;;;;;;;;;;UA6BiB;;WAEN,aAAa,SAAS;;WAEtB;;UAGM;;WAEN,aAAa,OAAO,OAAO;;WAE3B,gBAAgB,OAAO;;WAEvB,WAAW,OAAO,OAAO,SAAS;;;qBAGhC,oBAAoB;;qBAKpB;;qBAGA;;;;qBAOA,yBAAyB;;;;;;;;;qBAiCzB,kBAAiB,MAAM,MAAM;;qBA0B7B,aAAc;WAChB,cAAc,SAAS;WACvB,YAAY,SAAS;MAC5B,MAAM,MAAM;;;KC3GJ,mBAAmB,kBAAkB;KACrC,mBAAmB,kBAAkB;;UAGhC,YAAY;WAClB,OAAO;WACP;WACA,UAAU;;;;;;;;;;;;;qBAQR,uBAAuB;UAuBnB;;WAEN,UAAU,GACjB,mBACA,MAAM,QAAQ,qBAAqB,QAAQ,YAAY,QACpD,OAAO,OAAO,GAAG;;WAEb,cACP,mBACA,MAAM,QAAQ,qBAAqB,QAAQ,0BACxC,OAAO,aAAa;;WAEhB,oBAAoB,GAC3B,mBACA,6BACA,WAAW,SAAS,kBACpB,MAAM,QAAQ,qBAAqB,QAAQ,YAAY,QACpD,OAAO,OAAO,GAAG;;;;;;;;WAQb,gBACP,sCACG,OAAO,eAAe;;;;;;;;WAQlB,oBAAoB,mBAAmB,OAAO;;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/Credentials.ts","../src/ManagementApi.ts","../src/Providers.ts","../src/Push.ts","../src/Deployment.ts","../src/Component.ts","../src/Project.ts","../src/HubClient.ts","../src/RunRecord.ts","../src/State.ts"],"mappings":"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"}
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { A as PushTargetMismatch, B as DEPLOY_KEY_ENV, C as DeploymentProvider, D as ConvexAppNotFound, E as CodePushFailed, F as ManagementApi, H as fromValues, I as ManagementApiLive, L as ACCESS_TOKEN_ENV, N as parseDeployOutput, O as ConvexCliNotFound, P as ConvexApiError, R as Credentials, S as DeploymentIdentityChange, T as ProductionDeploymentNotFound, V as fromConfig, _ as ProjectProvider, b as AmbiguousDeployment, c as RUN_RECORD_KEY, d as withRunRecord, f as AmbiguousProject, g as ProjectNotFound, h as ProjectDeploymentChange, i as HubClientProvider, j as VariablesOwnedBySomeoneElse, k as EnvironmentNeedsDeployKey, l as RunRecordError, m as Project, n as HubClient, o as STORE_PROJECT_NAME, p as CreatedProjectNotFound, r as HubClientFailed, s as state, t as HUB_PROJECT_NAME, u as runRecord, v as ProjectTeamChange, w as DeploymentResource, x as Deployment, y as AbsoluteRootDir, z as CredentialsError } from "./HubClient-
|
|
1
|
+
import { A as PushTargetMismatch, B as DEPLOY_KEY_ENV, C as DeploymentProvider, D as ConvexAppNotFound, E as CodePushFailed, F as ManagementApi, H as fromValues, I as ManagementApiLive, L as ACCESS_TOKEN_ENV, N as parseDeployOutput, O as ConvexCliNotFound, P as ConvexApiError, R as Credentials, S as DeploymentIdentityChange, T as ProductionDeploymentNotFound, V as fromConfig, _ as ProjectProvider, b as AmbiguousDeployment, c as RUN_RECORD_KEY, d as withRunRecord, f as AmbiguousProject, g as ProjectNotFound, h as ProjectDeploymentChange, i as HubClientProvider, j as VariablesOwnedBySomeoneElse, k as EnvironmentNeedsDeployKey, l as RunRecordError, m as Project, n as HubClient, o as STORE_PROJECT_NAME, p as CreatedProjectNotFound, r as HubClientFailed, s as state, t as HUB_PROJECT_NAME, u as runRecord, v as ProjectTeamChange, w as DeploymentResource, x as Deployment, y as AbsoluteRootDir, z as CredentialsError } from "./HubClient-NUvPkolM.js";
|
|
2
2
|
import { toPath } from "alchemy/FQN";
|
|
3
3
|
import { Stack } from "alchemy/Stack";
|
|
4
4
|
import * as Effect from "effect/Effect";
|
package/package.json
CHANGED
package/src/ManagementApi.ts
CHANGED
|
@@ -87,6 +87,13 @@ export interface ManagementApiService {
|
|
|
87
87
|
* that key would revoke the credential.
|
|
88
88
|
*/
|
|
89
89
|
readonly isCredentialToken: (secret: string) => Effect.Effect<boolean>;
|
|
90
|
+
/**
|
|
91
|
+
* True when the Management API credential is an OAuth token, `team:<slug>|...`
|
|
92
|
+
* or `project:...|...`. A team access token and the Convex CLI login have no
|
|
93
|
+
* such prefix. Convex answers HTTP 400 to create_deploy_key with
|
|
94
|
+
* `allowedActions` or `expiresAt` from an OAuth token.
|
|
95
|
+
*/
|
|
96
|
+
readonly isOAuthCredential: Effect.Effect<boolean>;
|
|
90
97
|
/**
|
|
91
98
|
* The same calls with another bearer token, such as a preview deploy key,
|
|
92
99
|
* which the Management API takes for the preview deployments of its project.
|
|
@@ -199,7 +206,16 @@ const TokenDetails = Schema.Union([
|
|
|
199
206
|
]);
|
|
200
207
|
|
|
201
208
|
/** The service for one way to get the bearer token. */
|
|
202
|
-
const makeService = (
|
|
209
|
+
const makeService = (source: Effect.Effect<ResolvedCredentials>): ManagementApiService => {
|
|
210
|
+
// An HTTP header drops the white space around a token, so every use here takes the value that
|
|
211
|
+
// Convex sees. isCredentialToken must compare that value: a miss deletes an OAuth credential.
|
|
212
|
+
const credentials = source.pipe(
|
|
213
|
+
Effect.map((resolved) => ({
|
|
214
|
+
...resolved,
|
|
215
|
+
accessToken: Redacted.make(Redacted.value(resolved.accessToken).trim()),
|
|
216
|
+
})),
|
|
217
|
+
);
|
|
218
|
+
|
|
203
219
|
const client = Effect.cached(
|
|
204
220
|
credentials.pipe(
|
|
205
221
|
Effect.map((resolved) => createManagementClient(Redacted.value(resolved.accessToken))),
|
|
@@ -328,6 +344,10 @@ const makeService = (credentials: Effect.Effect<ResolvedCredentials>): Managemen
|
|
|
328
344
|
),
|
|
329
345
|
);
|
|
330
346
|
|
|
347
|
+
const isOAuthCredential: ManagementApiService["isOAuthCredential"] = credentials.pipe(
|
|
348
|
+
Effect.map((resolved) => /^(team|project):/.test(Redacted.value(resolved.accessToken))),
|
|
349
|
+
);
|
|
350
|
+
|
|
331
351
|
const withToken: ManagementApiService["withToken"] = (token) =>
|
|
332
352
|
makeService(Effect.succeed({ accessToken: token, source: "explicit" }));
|
|
333
353
|
|
|
@@ -337,6 +357,7 @@ const makeService = (credentials: Effect.Effect<ResolvedCredentials>): Managemen
|
|
|
337
357
|
deploymentRequest,
|
|
338
358
|
resolveTeamId,
|
|
339
359
|
isCredentialToken,
|
|
360
|
+
isOAuthCredential,
|
|
340
361
|
withToken,
|
|
341
362
|
};
|
|
342
363
|
};
|
package/src/Push.ts
CHANGED
|
@@ -376,7 +376,8 @@ const cliEnvironment = (home: string): Record<string, string | undefined> => ({
|
|
|
376
376
|
/**
|
|
377
377
|
* A deploy key of `deployment` that expires after PUSH_KEY_LIFETIME_MS, with
|
|
378
378
|
* only `allowedActions`, or every action when that is undefined. Delete it
|
|
379
|
-
* with {@link deleteDeployKey} when the work is done.
|
|
379
|
+
* with {@link deleteDeployKey} when the work is done. An OAuth credential sends
|
|
380
|
+
* only the name: Convex refuses both limits and returns the OAuth token.
|
|
380
381
|
*/
|
|
381
382
|
export const createDeployKey = (
|
|
382
383
|
api: ManagementApiService,
|
|
@@ -386,14 +387,17 @@ export const createDeployKey = (
|
|
|
386
387
|
) =>
|
|
387
388
|
Effect.gen(function* () {
|
|
388
389
|
const now = yield* Clock.currentTimeMillis;
|
|
390
|
+
const oauth = yield* api.isOAuthCredential;
|
|
389
391
|
const created = yield* api.request("create deploy key", (client) =>
|
|
390
392
|
client.POST("/deployments/{deployment_name}/create_deploy_key", {
|
|
391
393
|
params: { path: { deployment_name: deployment } },
|
|
392
|
-
body:
|
|
393
|
-
name
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
394
|
+
body: oauth
|
|
395
|
+
? { name }
|
|
396
|
+
: {
|
|
397
|
+
name,
|
|
398
|
+
...(allowedActions === undefined ? {} : { allowedActions: [...allowedActions] }),
|
|
399
|
+
expiresAt: now + PUSH_KEY_LIFETIME_MS,
|
|
400
|
+
},
|
|
397
401
|
}),
|
|
398
402
|
);
|
|
399
403
|
return Redacted.make(Schema.decodeUnknownSync(CreatedDeployKey)(created).deployKey);
|