@knpkv/atlassian-common 1.4.1 → 1.6.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.
- package/CHANGELOG.md +14 -0
- package/README.md +32 -1
- package/dist/Brand.d.ts +2 -2
- package/dist/Brand.d.ts.map +1 -1
- package/dist/Brand.js.map +1 -1
- package/dist/Hash.js +2 -2
- package/dist/Hash.js.map +1 -1
- package/dist/auth/OAuthEndpoints.js +3 -3
- package/dist/auth/OAuthEndpoints.js.map +1 -1
- package/dist/auth/OAuthOperations.d.ts +1 -1
- package/dist/auth/OAuthOperations.d.ts.map +1 -1
- package/dist/auth/OAuthOperations.js +8 -8
- package/dist/auth/OAuthOperations.js.map +1 -1
- package/dist/bin.js +2 -2
- package/dist/bin.js.map +1 -1
- package/dist/cli-auth/AtlassianCliAuth.d.ts +102 -0
- package/dist/cli-auth/AtlassianCliAuth.d.ts.map +1 -0
- package/dist/cli-auth/AtlassianCliAuth.js +298 -0
- package/dist/cli-auth/AtlassianCliAuth.js.map +1 -0
- package/dist/cli-auth/index.d.ts +13 -0
- package/dist/cli-auth/index.d.ts.map +1 -0
- package/dist/cli-auth/index.js +13 -0
- package/dist/cli-auth/index.js.map +1 -0
- package/dist/cli-auth/internal/NodeLayers.d.ts +5 -0
- package/dist/cli-auth/internal/NodeLayers.d.ts.map +1 -0
- package/dist/cli-auth/internal/NodeLayers.js +17 -0
- package/dist/cli-auth/internal/NodeLayers.js.map +1 -0
- package/dist/cli-auth/internal/oauthServer.d.ts +54 -0
- package/dist/cli-auth/internal/oauthServer.d.ts.map +1 -0
- package/dist/cli-auth/internal/oauthServer.js +94 -0
- package/dist/cli-auth/internal/oauthServer.js.map +1 -0
- package/dist/cli-auth/openBrowser.d.ts +16 -0
- package/dist/cli-auth/openBrowser.d.ts.map +1 -0
- package/dist/cli-auth/openBrowser.js +30 -0
- package/dist/cli-auth/openBrowser.js.map +1 -0
- package/dist/config/ConfigPaths.js +2 -2
- package/dist/config/ProfileManager.d.ts +1 -1
- package/dist/config/ProfileManager.d.ts.map +1 -1
- package/dist/config/ProfileManager.js +3 -3
- package/dist/config/ProfileManager.js.map +1 -1
- package/package.json +11 -7
- package/src/Brand.ts +5 -5
- package/src/Hash.ts +2 -2
- package/src/auth/OAuthEndpoints.ts +3 -3
- package/src/auth/OAuthOperations.ts +14 -24
- package/src/bin.ts +2 -2
- package/src/cli-auth/AtlassianCliAuth.ts +530 -0
- package/src/cli-auth/index.ts +18 -0
- package/src/cli-auth/internal/NodeLayers.ts +25 -0
- package/src/cli-auth/internal/oauthServer.ts +168 -0
- package/src/cli-auth/openBrowser.ts +47 -0
- package/src/config/ConfigPaths.ts +3 -3
- package/src/config/ProfileManager.ts +3 -3
- package/test/ApiUpdateWorkflows.test.ts +286 -10
- package/test/OAuthOperations.test.ts +2 -2
- package/test/ProfileManager.test.ts +1 -1
- package/test/cliAuth.guardrails.test.ts +76 -0
- package/test/cliAuth.login.test.ts +319 -0
- package/test/cliAuth.oauthServer.test.ts +276 -0
- package/test/cliAuth.openBrowser.test.ts +70 -0
- package/test/cliAuth.refresh.test.ts +304 -0
|
@@ -43,7 +43,7 @@ export class HomeDirectoryError extends Data.TaggedError("HomeDirectoryError") {
|
|
|
43
43
|
*/
|
|
44
44
|
export class HomeDirectoryTag extends Context.Service()("@knpkv/atlassian-common/HomeDirectory") {
|
|
45
45
|
}
|
|
46
|
-
const HomeConfig = Config.option(Config.
|
|
46
|
+
const HomeConfig = Config.option(Config.String("HOME")).pipe(Config.orElse(() => Config.option(Config.String("USERPROFILE"))));
|
|
47
47
|
/**
|
|
48
48
|
* Default implementation using HOME/USERPROFILE env vars.
|
|
49
49
|
*
|
|
@@ -58,7 +58,7 @@ export const HomeDirectoryLive = Layer.succeed(HomeDirectoryTag, {
|
|
|
58
58
|
});
|
|
59
59
|
})
|
|
60
60
|
});
|
|
61
|
-
const XdgConfigHome = Config.option(Config.
|
|
61
|
+
const XdgConfigHome = Config.option(Config.String("XDG_CONFIG_HOME"));
|
|
62
62
|
/**
|
|
63
63
|
* XDG config directory for Atlassian tools.
|
|
64
64
|
* Returns ~/.config/atlassian by default.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
2
|
import * as FileSystem from "effect/FileSystem";
|
|
3
|
+
import type { HttpClient } from "effect/http";
|
|
3
4
|
import * as Path from "effect/Path";
|
|
4
5
|
import type * as PlatformError from "effect/PlatformError";
|
|
5
|
-
import type { HttpClient } from "effect/unstable/http";
|
|
6
6
|
import { OAuthError } from "../auth/OAuthErrors.js";
|
|
7
7
|
import { type AuthProfile } from "./AuthProfiles.js";
|
|
8
8
|
import { type HomeDirectoryError, HomeDirectoryTag } from "./ConfigPaths.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileManager.d.ts","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ProfileManager.d.ts","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD,OAAO,EACL,KAAK,WAAW,EAMjB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAmB,KAAK,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAE,KAAK,UAAU,EAAoB,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAqC,MAAM,mBAAmB,CAAA;AAEtF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,QAAQ,CAAC,cAAc,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC/C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAC/C;AAED,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,MAAM,CAOtD,CAAA;AAED,+EAA+E;AAC/E,eAAO,MAAM,6BAA6B,EAAE,aAAa,CAAC,MAAM,CAK/D,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,EAAE,aAAa,CAAC,MAAM,CAM5D,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,aAAa,CAAC,uBAAuB,CAqBlE,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,CAAA;;;;AAEpD,qBAAa,oBAAqB,SAAQ,0BAAyC;IACjF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED,qBAAa,uBAAwB,SAAQ,6BAA4C;IACvF,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAA;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,aAAa,EAAE,WAAW,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,WAAW,CAAC,CAAA;IAC7C,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAA;IACpD,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;IAC7C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;CAClC;AA2CD,eAAO,MAAM,WAAW,UAAW,UAAU,KAAG,WAAW,CAAC,MAAM,CACa,CAAA;AAE/E,eAAO,MAAM,aAAa,UACjB,UAAU,kBACD,aAAa,CAAC,MAAM,CAAC,KACpC,aAAa,CAAC,MAAM,CAGtB,CAAA;AAED,eAAO,MAAM,mBAAmB,SACxB,uBAAuB,KAC5B,MAAM,CAAC,MAAM,CACd,iBAAiB,EACjB,eAAe,GAAG,kBAAkB,EACpC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAmBlD,CAAA;AAEJ,eAAO,MAAM,sBAAsB,WAC1B,aAAa,CAAC,uBAAuB,CAAC,mIACA,CAAA;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,aACtB,MAAM,UACT,aAAa,CAAC,uBAAuB,CAAC,KAC5C,MAAM,CAAC,MAAM,CACd,aAAa,CAAC,iBAAiB,CAAC,EAChC,oBAAoB,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,EACzF,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAmBlD,CAAA;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,WACzB,aAAa,CAAC,uBAAuB,CAAC,KAC5C,MAAM,CAAC,MAAM,CACd,aAAa,CAAC,iBAAiB,CAAC,EAChC,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,EAClE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAqBlD,CAAA;AAKJ;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,WACzB,aAAa,CAAC,uBAAuB,CAAC,KAC5C,MAAM,CAAC,MAAM,CACd,aAAa,CAAC,iBAAiB,CAAC,EAChC,uBAAuB,GAAG,UAAU,GAAG,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,EACzG,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,GAAG,UAAU,CAAC,UAAU,CAyC1E,CAAA"}
|
|
@@ -137,8 +137,8 @@ export const useProfileForAllTools = (selector, tools = ATLASSIAN_TOOLS) => Effe
|
|
|
137
137
|
const authTools = uniqueAuthTools(tools);
|
|
138
138
|
const stores = yield* Effect.forEach(authTools, (tool) => loadProfiles(authStoreName(tool)).pipe(Effect.map((store) => toolStorePair(tool, store))));
|
|
139
139
|
const selected = stores.map(([, store]) => findProfile(store.profiles, selector)).find((profile) => profile !== null);
|
|
140
|
-
if (
|
|
141
|
-
return yield*
|
|
140
|
+
if (selected === undefined)
|
|
141
|
+
return yield* new ProfileNotFoundError({ selector });
|
|
142
142
|
yield* Effect.forEach(stores, ([tool, store]) => {
|
|
143
143
|
const matching = findProfile(store.profiles, selector) ?? findProfile(store.profiles, selected.id);
|
|
144
144
|
if (!matching)
|
|
@@ -192,7 +192,7 @@ export const refreshActiveProfiles = (tools = ATLASSIAN_TOOLS) => Effect.gen(fun
|
|
|
192
192
|
return;
|
|
193
193
|
const config = yield* loadOAuthConfig(storeName);
|
|
194
194
|
if (!config) {
|
|
195
|
-
return yield*
|
|
195
|
+
return yield* new MissingOAuthConfigError({ authStoreName: storeName, profileId: active.id });
|
|
196
196
|
}
|
|
197
197
|
// Rotating refresh tokens: the grant consumes the stored token
|
|
198
198
|
// server-side and the response carries its replacement, so an interrupt
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProfileManager.js","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"ProfileManager.js","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@knpkv/atlassian-common",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.6.0",
|
|
4
4
|
"description": "Shared utilities for Atlassian tools (AST, serializers, auth, config)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "knpkv",
|
|
@@ -42,6 +42,10 @@
|
|
|
42
42
|
"import": "./dist/auth/index.js",
|
|
43
43
|
"types": "./dist/auth/index.d.ts"
|
|
44
44
|
},
|
|
45
|
+
"./cli-auth": {
|
|
46
|
+
"import": "./dist/cli-auth/index.js",
|
|
47
|
+
"types": "./dist/cli-auth/index.d.ts"
|
|
48
|
+
},
|
|
45
49
|
"./config": {
|
|
46
50
|
"import": "./dist/config/index.js",
|
|
47
51
|
"types": "./dist/config/index.d.ts"
|
|
@@ -59,22 +63,22 @@
|
|
|
59
63
|
"access": "public"
|
|
60
64
|
},
|
|
61
65
|
"peerDependencies": {
|
|
62
|
-
"effect": "4.0.0
|
|
66
|
+
"effect": "4.0.0"
|
|
63
67
|
},
|
|
64
68
|
"dependencies": {
|
|
65
|
-
"@effect/platform-node": "4.0.0
|
|
69
|
+
"@effect/platform-node": "4.0.0",
|
|
66
70
|
"remark-gfm": "^4.0.1",
|
|
67
71
|
"remark-parse": "^11.0.0",
|
|
68
72
|
"remark-stringify": "^11.0.0",
|
|
69
73
|
"unified": "^11.0.5"
|
|
70
74
|
},
|
|
71
75
|
"devDependencies": {
|
|
72
|
-
"@effect/platform-node": "4.0.0
|
|
73
|
-
"@effect/vitest": "4.0.0
|
|
76
|
+
"@effect/platform-node": "4.0.0",
|
|
77
|
+
"@effect/vitest": "4.0.0",
|
|
74
78
|
"@types/node": "latest",
|
|
75
|
-
"effect": "4.0.0
|
|
79
|
+
"effect": "4.0.0",
|
|
76
80
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
77
|
-
"vitest": "^
|
|
81
|
+
"vitest": "^5.0.3"
|
|
78
82
|
},
|
|
79
83
|
"keywords": [
|
|
80
84
|
"effect",
|
package/src/Brand.ts
CHANGED
|
@@ -42,15 +42,15 @@ import * as Schema from "effect/Schema"
|
|
|
42
42
|
*
|
|
43
43
|
* @category Brand
|
|
44
44
|
*/
|
|
45
|
-
export const makeBrandedString = <B extends string>(
|
|
46
|
-
name: B,
|
|
45
|
+
export const makeBrandedString = <const B extends string>(
|
|
46
|
+
name: Parameters<typeof Schema.brand<B>>[0],
|
|
47
47
|
pattern: RegExp
|
|
48
48
|
) => {
|
|
49
49
|
type BrandedType = string & Brand.Brand<B>
|
|
50
50
|
|
|
51
51
|
const brand = Brand.make<BrandedType>((s) => pattern.test(s) || `Invalid ${name}: ${s} does not match ${pattern}`)
|
|
52
52
|
|
|
53
|
-
const schema = Schema.String.check(Schema.isPattern(pattern)).pipe(Schema.brand(name))
|
|
53
|
+
const schema = Schema.String.check(Schema.isPattern(pattern)).pipe(Schema.brand<B>(name))
|
|
54
54
|
const Type: BrandedType = undefined!
|
|
55
55
|
|
|
56
56
|
return Object.assign(brand, {
|
|
@@ -75,12 +75,12 @@ export const makeBrandedString = <B extends string>(
|
|
|
75
75
|
*
|
|
76
76
|
* @category Brand
|
|
77
77
|
*/
|
|
78
|
-
export const makeBrandedNonEmptyString = <B extends string>(name: B) => {
|
|
78
|
+
export const makeBrandedNonEmptyString = <const B extends string>(name: Parameters<typeof Schema.brand<B>>[0]) => {
|
|
79
79
|
type BrandedType = string & Brand.Brand<B>
|
|
80
80
|
|
|
81
81
|
const brand = Brand.make<BrandedType>((s) => s.length > 0 || `${name} cannot be empty`)
|
|
82
82
|
|
|
83
|
-
const schema = Schema.NonEmptyString.pipe(Schema.brand(name))
|
|
83
|
+
const schema = Schema.NonEmptyString.pipe(Schema.brand<B>(name))
|
|
84
84
|
const Type: BrandedType = undefined!
|
|
85
85
|
|
|
86
86
|
return Object.assign(brand, {
|
package/src/Hash.ts
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import * as Crypto from "effect/Crypto"
|
|
19
19
|
import * as Effect from "effect/Effect"
|
|
20
|
-
import
|
|
20
|
+
import { Hex } from "effect/encoding"
|
|
21
21
|
import type * as PlatformError from "effect/PlatformError"
|
|
22
22
|
import { ContentHash } from "./Brand.js"
|
|
23
23
|
|
|
@@ -29,7 +29,7 @@ const digestSha256 = (
|
|
|
29
29
|
Effect.gen(function*() {
|
|
30
30
|
const cryptoService = yield* Crypto.Crypto
|
|
31
31
|
const digest = yield* cryptoService.digest("SHA-256", bytes)
|
|
32
|
-
return ContentHash(
|
|
32
|
+
return ContentHash(Hex.encode(digest))
|
|
33
33
|
})
|
|
34
34
|
|
|
35
35
|
/**
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import * as Crypto from "effect/Crypto"
|
|
16
16
|
import * as Effect from "effect/Effect"
|
|
17
|
-
import
|
|
17
|
+
import { Base64Url } from "effect/encoding"
|
|
18
18
|
import type * as PlatformError from "effect/PlatformError"
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -172,7 +172,7 @@ export const generateCodeVerifier = (): Effect.Effect<string, PlatformError.Plat
|
|
|
172
172
|
Effect.gen(function*() {
|
|
173
173
|
const cryptoService = yield* Crypto.Crypto
|
|
174
174
|
const bytes = yield* cryptoService.randomBytes(32)
|
|
175
|
-
return
|
|
175
|
+
return Base64Url.encode(bytes)
|
|
176
176
|
})
|
|
177
177
|
|
|
178
178
|
/**
|
|
@@ -187,5 +187,5 @@ export const computeCodeChallenge = (
|
|
|
187
187
|
Effect.gen(function*() {
|
|
188
188
|
const cryptoService = yield* Crypto.Crypto
|
|
189
189
|
const hash = yield* cryptoService.digest("SHA-256", new TextEncoder().encode(verifier))
|
|
190
|
-
return
|
|
190
|
+
return Base64Url.encode(hash)
|
|
191
191
|
})
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
*/
|
|
21
21
|
import * as Clock from "effect/Clock"
|
|
22
22
|
import * as Effect from "effect/Effect"
|
|
23
|
+
import { HttpClient, HttpClientRequest } from "effect/http"
|
|
23
24
|
import * as Schema from "effect/Schema"
|
|
24
|
-
import { HttpClient, HttpClientRequest } from "effect/unstable/http"
|
|
25
25
|
import { type OAuthConfig, type OAuthToken } from "../config/OAuthSchemas.js"
|
|
26
26
|
import { unsafeCurrentTimeMillis } from "../internal/legacyWallClock.js"
|
|
27
27
|
import { ME_URL, RESOURCES_URL, REVOKE_URL, TOKEN_URL } from "./OAuthEndpoints.js"
|
|
@@ -89,9 +89,7 @@ export const exchangeCodeForTokens = (
|
|
|
89
89
|
if (response.status >= 400) {
|
|
90
90
|
const text = yield* response.text
|
|
91
91
|
yield* Effect.logDebug(`Token exchange failed (${response.status}): ${text}`)
|
|
92
|
-
return yield*
|
|
93
|
-
new OAuthError({ step: "token", cause: `HTTP ${response.status}` })
|
|
94
|
-
)
|
|
92
|
+
return yield* new OAuthError({ step: "token", cause: `HTTP ${response.status}` })
|
|
95
93
|
}
|
|
96
94
|
|
|
97
95
|
const body = yield* response.json
|
|
@@ -123,9 +121,7 @@ export const getAccessibleResources = (
|
|
|
123
121
|
if (response.status >= 400) {
|
|
124
122
|
const text = yield* response.text
|
|
125
123
|
yield* Effect.logDebug(`Accessible resources failed (${response.status}): ${text}`)
|
|
126
|
-
return yield*
|
|
127
|
-
new OAuthError({ step: "resources", cause: `HTTP ${response.status}` })
|
|
128
|
-
)
|
|
124
|
+
return yield* new OAuthError({ step: "resources", cause: `HTTP ${response.status}` })
|
|
129
125
|
}
|
|
130
126
|
|
|
131
127
|
const body = yield* response.json
|
|
@@ -157,9 +153,7 @@ export const getUserInfo = (
|
|
|
157
153
|
if (response.status >= 400) {
|
|
158
154
|
const text = yield* response.text
|
|
159
155
|
yield* Effect.logDebug(`User info failed (${response.status}): ${text}`)
|
|
160
|
-
return yield*
|
|
161
|
-
new OAuthError({ step: "user-info", cause: `HTTP ${response.status}` })
|
|
162
|
-
)
|
|
156
|
+
return yield* new OAuthError({ step: "user-info", cause: `HTTP ${response.status}` })
|
|
163
157
|
}
|
|
164
158
|
|
|
165
159
|
const body = yield* response.json
|
|
@@ -210,14 +204,12 @@ export const refreshToken = (
|
|
|
210
204
|
Effect.map((decoded) => decoded.error),
|
|
211
205
|
Effect.catch(() => Effect.succeed(undefined))
|
|
212
206
|
)
|
|
213
|
-
return yield*
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
})
|
|
220
|
-
)
|
|
207
|
+
return yield* new OAuthError({
|
|
208
|
+
step: "refresh",
|
|
209
|
+
cause: `HTTP ${response.status}: ${text}`,
|
|
210
|
+
status: response.status,
|
|
211
|
+
...(!(errorCode === undefined) && { errorCode })
|
|
212
|
+
})
|
|
221
213
|
}
|
|
222
214
|
|
|
223
215
|
const body = yield* response.json.pipe(
|
|
@@ -266,12 +258,10 @@ export const revokeToken = (
|
|
|
266
258
|
)
|
|
267
259
|
|
|
268
260
|
if (response.status >= 400) {
|
|
269
|
-
return yield*
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
})
|
|
274
|
-
)
|
|
261
|
+
return yield* new OAuthError({
|
|
262
|
+
step: "revoke",
|
|
263
|
+
cause: `Token revocation failed with status ${response.status}`
|
|
264
|
+
})
|
|
275
265
|
}
|
|
276
266
|
})
|
|
277
267
|
|
package/src/bin.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { NodeHttpClient, NodeRuntime, NodeServices } from "@effect/platform-node"
|
|
3
|
+
import { Argument as Args, Command } from "effect/cli"
|
|
3
4
|
import * as Console from "effect/Console"
|
|
4
5
|
import * as Effect from "effect/Effect"
|
|
5
6
|
import * as Layer from "effect/Layer"
|
|
6
7
|
import * as Stdio from "effect/Stdio"
|
|
7
|
-
import { Argument as Args, Command } from "effect/unstable/cli"
|
|
8
8
|
import pkg from "../package.json" with { type: "json" }
|
|
9
9
|
import {
|
|
10
10
|
HomeDirectoryLive,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
useProfileForAllTools
|
|
16
16
|
} from "./config/index.js"
|
|
17
17
|
|
|
18
|
-
const profileArg = Args.
|
|
18
|
+
const profileArg = Args.String("profile").pipe(
|
|
19
19
|
Args.withDescription("Profile ID, name, site URL, cloud ID, or account ID")
|
|
20
20
|
)
|
|
21
21
|
|