@knpkv/atlassian-common 1.4.1 → 1.5.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 +6 -0
- package/README.md +1 -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/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 +7 -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/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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @knpkv/atlassian-common
|
|
2
2
|
|
|
3
|
+
## 1.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#452](https://github.com/knpkv/npm/pull/452) [`755eafa`](https://github.com/knpkv/npm/commit/755eafab8c0bc3e82b00e2dd27c68d669a1de87e) Thanks [@konopkov](https://github.com/konopkov)! - Upgrade to Effect 4.0.0 stable. `effect` and every `@effect/*` dependency or peer dependency now require `4.0.0`; imports move from the removed `effect/unstable/*` paths to `effect/*`.
|
|
8
|
+
|
|
3
9
|
## 1.4.1
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -20,7 +20,7 @@ pnpm add @knpkv/atlassian-common
|
|
|
20
20
|
|
|
21
21
|
## OAuth2 + PKCE
|
|
22
22
|
|
|
23
|
-
Uses Effect's platform `Crypto` service. PKCE code verifier/challenge use `effect/
|
|
23
|
+
Uses Effect's platform `Crypto` service. PKCE code verifier/challenge use `effect/encoding/Base64Url` for base64url.
|
|
24
24
|
|
|
25
25
|
```typescript
|
|
26
26
|
import * as NodeCrypto from "@effect/platform-node/NodeCrypto"
|
package/dist/Brand.d.ts
CHANGED
|
@@ -41,7 +41,7 @@ import * as Schema from "effect/Schema";
|
|
|
41
41
|
*
|
|
42
42
|
* @category Brand
|
|
43
43
|
*/
|
|
44
|
-
export declare const makeBrandedString: <B extends string>(name: B, pattern: RegExp) => Brand.Constructor<string & Brand.Brand<B>> & {
|
|
44
|
+
export declare const makeBrandedString: <const B extends string>(name: Parameters<typeof Schema.brand<B>>[0], pattern: RegExp) => Brand.Constructor<string & Brand.Brand<B>> & {
|
|
45
45
|
schema: Schema.brand<Schema.String, B>;
|
|
46
46
|
Type: string & Brand.Brand<B>;
|
|
47
47
|
};
|
|
@@ -61,7 +61,7 @@ export declare const makeBrandedString: <B extends string>(name: B, pattern: Reg
|
|
|
61
61
|
*
|
|
62
62
|
* @category Brand
|
|
63
63
|
*/
|
|
64
|
-
export declare const makeBrandedNonEmptyString: <B extends string>(name: B) => Brand.Constructor<string & Brand.Brand<B>> & {
|
|
64
|
+
export declare const makeBrandedNonEmptyString: <const B extends string>(name: Parameters<typeof Schema.brand<B>>[0]) => Brand.Constructor<string & Brand.Brand<B>> & {
|
|
65
65
|
schema: Schema.brand<Schema.NonEmptyString, B>;
|
|
66
66
|
Type: string & Brand.Brand<B>;
|
|
67
67
|
};
|
package/dist/Brand.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAAI,CAAC,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"Brand.d.ts","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK,CAAC,CAAC,SAAS,MAAM,QAChD,UAAU,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAClC,MAAM;;;CAahB,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,yBAAyB,GAAI,KAAK,CAAC,CAAC,SAAS,MAAM,QAAQ,UAAU,CAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;;CAY5G,CAAA;AAID;;;;GAIG;AACH,eAAO,MAAM,MAAM;;;CAAsC,CAAA;AACzD,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,IAAI,CAAA;AAEvC;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;CAAoD,CAAA;AACzE,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,QAAQ;;;CAAwD,CAAA;AAC7E,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC,IAAI,CAAA;AAE3C;;;;GAIG;AACH,eAAO,MAAM,UAAU;;;CAAsD,CAAA;AAC7E,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,IAAI,CAAA;AAE/C;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;CAAqD,CAAA;AAC7E,MAAM,MAAM,WAAW,GAAG,OAAO,WAAW,CAAC,IAAI,CAAA"}
|
package/dist/Brand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Brand.js","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,
|
|
1
|
+
{"version":3,"file":"Brand.js","sourceRoot":"","sources":["../src/Brand.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAA2C,EAC3C,OAAe,EACf,EAAE;IAGF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAA;IAElH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAI,IAAI,CAAC,CAAC,CAAA;IACzF,MAAM,IAAI,GAAgB,SAAU,CAAA;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,MAAM;QACN,IAAI;KACL,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAyB,IAA2C,EAAE,EAAE;IAG/G,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAc,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,IAAI,kBAAkB,CAAC,CAAA;IAEvF,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAI,IAAI,CAAC,CAAC,CAAA;IAChE,MAAM,IAAI,GAAgB,SAAU,CAAA;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;QAC1B,MAAM;QACN,IAAI;KACL,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,8CAA8C;AAE9C;;;;GAIG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,yBAAyB,CAAC,QAAQ,CAAC,CAAA;AAGzD;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAA;AAGzE;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAA;AAG7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAA;AAG7E;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,iBAAiB,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAA"}
|
package/dist/Hash.js
CHANGED
|
@@ -17,13 +17,13 @@
|
|
|
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 { ContentHash } from "./Brand.js";
|
|
22
22
|
const textEncoder = new TextEncoder();
|
|
23
23
|
const digestSha256 = (bytes) => Effect.gen(function* () {
|
|
24
24
|
const cryptoService = yield* Crypto.Crypto;
|
|
25
25
|
const digest = yield* cryptoService.digest("SHA-256", bytes);
|
|
26
|
-
return ContentHash(
|
|
26
|
+
return ContentHash(Hex.encode(digest));
|
|
27
27
|
});
|
|
28
28
|
/**
|
|
29
29
|
* Compute SHA256 hash of a string.
|
package/dist/Hash.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Hash.js","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"Hash.js","sourceRoot":"","sources":["../src/Hash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAExC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAA;AAErC,MAAM,YAAY,GAAG,CACnB,KAAiB,EACuD,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAA;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;IAC5D,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;AACxC,CAAC,CAAC,CAAA;AAEJ;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAe,EAA0E,EAAE,CACrH,YAAY,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAA;AAE3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAAkB,EACsD,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;AAEjG;;;;GAIG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAc,EAAE,CAAc,EAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA"}
|
|
@@ -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
|
/**
|
|
19
19
|
* OAuth2 authorization endpoint.
|
|
20
20
|
*
|
|
@@ -139,7 +139,7 @@ export const buildAuthUrl = (options) => {
|
|
|
139
139
|
export const generateCodeVerifier = () => Effect.gen(function* () {
|
|
140
140
|
const cryptoService = yield* Crypto.Crypto;
|
|
141
141
|
const bytes = yield* cryptoService.randomBytes(32);
|
|
142
|
-
return
|
|
142
|
+
return Base64Url.encode(bytes);
|
|
143
143
|
});
|
|
144
144
|
/**
|
|
145
145
|
* Compute S256 code challenge from a code verifier (RFC 7636).
|
|
@@ -150,6 +150,6 @@ export const generateCodeVerifier = () => Effect.gen(function* () {
|
|
|
150
150
|
export const computeCodeChallenge = (verifier) => Effect.gen(function* () {
|
|
151
151
|
const cryptoService = yield* Crypto.Crypto;
|
|
152
152
|
const hash = yield* cryptoService.digest("SHA-256", new TextEncoder().encode(verifier));
|
|
153
|
-
return
|
|
153
|
+
return Base64Url.encode(hash);
|
|
154
154
|
});
|
|
155
155
|
//# sourceMappingURL=OAuthEndpoints.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuthEndpoints.js","sourceRoot":"","sources":["../../src/auth/OAuthEndpoints.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"OAuthEndpoints.js","sourceRoot":"","sources":["../../src/auth/OAuthEndpoints.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
-
import { HttpClient } from "effect/
|
|
2
|
+
import { HttpClient } from "effect/http";
|
|
3
3
|
import { type OAuthConfig, type OAuthToken } from "../config/OAuthSchemas.js";
|
|
4
4
|
import { OAuthError } from "./OAuthErrors.js";
|
|
5
5
|
import { type AccessibleResource, type TokenResponse, type UserInfo } from "./OAuthResponseSchemas.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuthOperations.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthOperations.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"OAuthOperations.d.ts","sourceRoot":"","sources":["../../src/auth/OAuthOperations.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,UAAU,EAAqB,MAAM,aAAa,CAAA;AAE3D,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAG7E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EACL,KAAK,kBAAkB,EAGvB,KAAK,aAAa,EAElB,KAAK,QAAQ,EAEd,MAAM,2BAA2B,CAAA;AAElC;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4DAA4D;IAC5D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC3C;AAWD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAC1B,MAAM,UACJ,WAAW,WACV,mBAAmB;;;;;;qCA8B3B,CAAA;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,gBACpB,MAAM,KAClB,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAqBlF,CAAA;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,gBACT,MAAM,KAClB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAqBzD,CAAA;AAEH;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,UAChB,UAAU,UACT,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAqD1D,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,UACf,UAAU,UACT,WAAW,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,UAAU,CAuBpD,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,kBACb,aAAa,QACtB,kBAAkB,QAClB,QAAQ,SACP,MAAM,KACZ,UAYD,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,kBACX,aAAa,QACtB,kBAAkB,QAClB,QAAQ,KACb,UAAqF,CAAA"}
|
|
@@ -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 {} 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";
|
|
@@ -48,7 +48,7 @@ export const exchangeCodeForTokens = (code, config, options) => Effect.gen(funct
|
|
|
48
48
|
if (response.status >= 400) {
|
|
49
49
|
const text = yield* response.text;
|
|
50
50
|
yield* Effect.logDebug(`Token exchange failed (${response.status}): ${text}`);
|
|
51
|
-
return yield*
|
|
51
|
+
return yield* new OAuthError({ step: "token", cause: `HTTP ${response.status}` });
|
|
52
52
|
}
|
|
53
53
|
const body = yield* response.json;
|
|
54
54
|
return yield* Schema.decodeUnknownEffect(TokenResponseSchema)(body);
|
|
@@ -67,7 +67,7 @@ export const getAccessibleResources = (accessToken) => Effect.gen(function* () {
|
|
|
67
67
|
if (response.status >= 400) {
|
|
68
68
|
const text = yield* response.text;
|
|
69
69
|
yield* Effect.logDebug(`Accessible resources failed (${response.status}): ${text}`);
|
|
70
|
-
return yield*
|
|
70
|
+
return yield* new OAuthError({ step: "resources", cause: `HTTP ${response.status}` });
|
|
71
71
|
}
|
|
72
72
|
const body = yield* response.json;
|
|
73
73
|
return yield* Schema.decodeUnknownEffect(Schema.Array(AccessibleResourceSchema))(body);
|
|
@@ -86,7 +86,7 @@ export const getUserInfo = (accessToken) => Effect.gen(function* () {
|
|
|
86
86
|
if (response.status >= 400) {
|
|
87
87
|
const text = yield* response.text;
|
|
88
88
|
yield* Effect.logDebug(`User info failed (${response.status}): ${text}`);
|
|
89
|
-
return yield*
|
|
89
|
+
return yield* new OAuthError({ step: "user-info", cause: `HTTP ${response.status}` });
|
|
90
90
|
}
|
|
91
91
|
const body = yield* response.json;
|
|
92
92
|
return yield* Schema.decodeUnknownEffect(UserInfoSchema)(body);
|
|
@@ -115,12 +115,12 @@ export const refreshToken = (token, config) => Effect.gen(function* () {
|
|
|
115
115
|
// it. A body that is not JSON, or not shaped like an OAuth error, simply
|
|
116
116
|
// leaves it absent — which callers read as "no verdict", not "rejected".
|
|
117
117
|
const errorCode = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(TokenErrorSchema))(text).pipe(Effect.map((decoded) => decoded.error), Effect.catch(() => Effect.succeed(undefined)));
|
|
118
|
-
return yield*
|
|
118
|
+
return yield* new OAuthError({
|
|
119
119
|
step: "refresh",
|
|
120
120
|
cause: `HTTP ${response.status}: ${text}`,
|
|
121
121
|
status: response.status,
|
|
122
122
|
...(!(errorCode === undefined) && { errorCode })
|
|
123
|
-
})
|
|
123
|
+
});
|
|
124
124
|
}
|
|
125
125
|
const body = yield* response.json.pipe(Effect.mapError((cause) => new OAuthError({ step: "refresh", cause })));
|
|
126
126
|
const tokenResponse = yield* Schema.decodeUnknownEffect(TokenResponseSchema)(body).pipe(Effect.mapError((cause) => new OAuthError({ step: "refresh", cause })));
|
|
@@ -150,10 +150,10 @@ export const revokeToken = (token, config) => Effect.gen(function* () {
|
|
|
150
150
|
}), Effect.mapError((cause) => new OAuthError({ step: "revoke", cause })));
|
|
151
151
|
const response = yield* httpClient.execute(request).pipe(Effect.mapError((cause) => new OAuthError({ step: "revoke", cause })));
|
|
152
152
|
if (response.status >= 400) {
|
|
153
|
-
return yield*
|
|
153
|
+
return yield* new OAuthError({
|
|
154
154
|
step: "revoke",
|
|
155
155
|
cause: `Token revocation failed with status ${response.status}`
|
|
156
|
-
})
|
|
156
|
+
});
|
|
157
157
|
}
|
|
158
158
|
});
|
|
159
159
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OAuthOperations.js","sourceRoot":"","sources":["../../src/auth/OAuthOperations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,
|
|
1
|
+
{"version":3,"file":"OAuthOperations.js","sourceRoot":"","sources":["../../src/auth/OAuthOperations.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
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 { HomeDirectoryLive, inspectAllToolProfiles, migrateLegacyProfiles, refreshActiveProfiles, useProfileForAllTools } from "./config/index.js";
|
|
10
|
-
const profileArg = Args.
|
|
10
|
+
const profileArg = Args.String("profile").pipe(Args.withDescription("Profile ID, name, site URL, cloud ID, or account ID"));
|
|
11
11
|
const printStatuses = (statuses) => Effect.gen(function* () {
|
|
12
12
|
for (const status of statuses) {
|
|
13
13
|
const active = status.activeProfile;
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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.5.0",
|
|
4
4
|
"description": "Shared utilities for Atlassian tools (AST, serializers, auth, config)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "knpkv",
|
|
@@ -59,22 +59,22 @@
|
|
|
59
59
|
"access": "public"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
|
-
"effect": "4.0.0
|
|
62
|
+
"effect": "4.0.0"
|
|
63
63
|
},
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@effect/platform-node": "4.0.0
|
|
65
|
+
"@effect/platform-node": "4.0.0",
|
|
66
66
|
"remark-gfm": "^4.0.1",
|
|
67
67
|
"remark-parse": "^11.0.0",
|
|
68
68
|
"remark-stringify": "^11.0.0",
|
|
69
69
|
"unified": "^11.0.5"
|
|
70
70
|
},
|
|
71
71
|
"devDependencies": {
|
|
72
|
-
"@effect/platform-node": "4.0.0
|
|
73
|
-
"@effect/vitest": "4.0.0
|
|
72
|
+
"@effect/platform-node": "4.0.0",
|
|
73
|
+
"@effect/vitest": "4.0.0",
|
|
74
74
|
"@types/node": "latest",
|
|
75
|
-
"effect": "4.0.0
|
|
75
|
+
"effect": "4.0.0",
|
|
76
76
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
77
|
-
"vitest": "^
|
|
77
|
+
"vitest": "^5.0.3"
|
|
78
78
|
},
|
|
79
79
|
"keywords": [
|
|
80
80
|
"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
|
|
|
@@ -61,8 +61,8 @@ export class HomeDirectoryTag extends Context.Service<
|
|
|
61
61
|
HomeDirectory
|
|
62
62
|
>()("@knpkv/atlassian-common/HomeDirectory") {}
|
|
63
63
|
|
|
64
|
-
const HomeConfig = Config.option(Config.
|
|
65
|
-
Config.orElse(() => Config.option(Config.
|
|
64
|
+
const HomeConfig = Config.option(Config.String("HOME")).pipe(
|
|
65
|
+
Config.orElse(() => Config.option(Config.String("USERPROFILE")))
|
|
66
66
|
)
|
|
67
67
|
|
|
68
68
|
/**
|
|
@@ -84,7 +84,7 @@ export const HomeDirectoryLive: Layer.Layer<HomeDirectoryTag> = Layer.succeed(
|
|
|
84
84
|
}
|
|
85
85
|
)
|
|
86
86
|
|
|
87
|
-
const XdgConfigHome = Config.option(Config.
|
|
87
|
+
const XdgConfigHome = Config.option(Config.String("XDG_CONFIG_HOME"))
|
|
88
88
|
|
|
89
89
|
/**
|
|
90
90
|
* XDG config directory for Atlassian tools.
|
|
@@ -7,10 +7,10 @@ import * as Clock from "effect/Clock"
|
|
|
7
7
|
import * as Data from "effect/Data"
|
|
8
8
|
import * as Effect from "effect/Effect"
|
|
9
9
|
import * as FileSystem from "effect/FileSystem"
|
|
10
|
+
import type { HttpClient } from "effect/http"
|
|
10
11
|
import * as Path from "effect/Path"
|
|
11
12
|
import type * as PlatformError from "effect/PlatformError"
|
|
12
13
|
import * as Schema from "effect/Schema"
|
|
13
|
-
import type { HttpClient } from "effect/unstable/http"
|
|
14
14
|
import { OAuthError } from "../auth/OAuthErrors.js"
|
|
15
15
|
import { refreshToken } from "../auth/OAuthOperations.js"
|
|
16
16
|
import {
|
|
@@ -227,7 +227,7 @@ export const useProfileForAllTools = (
|
|
|
227
227
|
).find((profile): profile is AuthProfile =>
|
|
228
228
|
profile !== null
|
|
229
229
|
)
|
|
230
|
-
if (
|
|
230
|
+
if (selected === undefined) return yield* new ProfileNotFoundError({ selector })
|
|
231
231
|
|
|
232
232
|
yield* Effect.forEach(stores, ([tool, store]) => {
|
|
233
233
|
const matching = findProfile(store.profiles, selector) ?? findProfile(store.profiles, selected.id)
|
|
@@ -298,7 +298,7 @@ export const refreshActiveProfiles = (
|
|
|
298
298
|
if (!active || !isTokenExpiredAt(active.token, nowMs, 0)) return
|
|
299
299
|
const config = yield* loadOAuthConfig(storeName)
|
|
300
300
|
if (!config) {
|
|
301
|
-
return yield*
|
|
301
|
+
return yield* new MissingOAuthConfigError({ authStoreName: storeName, profileId: active.id })
|
|
302
302
|
}
|
|
303
303
|
// Rotating refresh tokens: the grant consumes the stored token
|
|
304
304
|
// server-side and the response carries its replacement, so an interrupt
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import * as NodeServices from "@effect/platform-node/NodeServices"
|
|
2
|
-
import {
|
|
2
|
+
import { expect, layer } from "@effect/vitest"
|
|
3
|
+
import * as Array from "effect/Array"
|
|
3
4
|
import * as Effect from "effect/Effect"
|
|
4
5
|
import * as FileSystem from "effect/FileSystem"
|
|
5
6
|
import * as Path from "effect/Path"
|
|
6
7
|
import * as Predicate from "effect/Predicate"
|
|
7
|
-
import
|
|
8
|
+
import * as Schema from "effect/Schema"
|
|
8
9
|
import { parse } from "yaml"
|
|
9
10
|
|
|
10
11
|
const isRecord = <UnparsedInput>(value: UnparsedInput): value is UnparsedInput & Record<string, Schema.Json> =>
|
|
@@ -36,15 +37,290 @@ const dependencyClosureDiagnostics = (
|
|
|
36
37
|
})
|
|
37
38
|
}
|
|
38
39
|
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
const PackageManifest = Schema.Struct({
|
|
41
|
+
name: Schema.String,
|
|
42
|
+
private: Schema.optional(Schema.Boolean),
|
|
43
|
+
exports: Schema.optional(Schema.Json)
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
// Public generated subpaths or generated export targets declare the contract;
|
|
47
|
+
// package names and consumer dependencies do not.
|
|
48
|
+
const exposesGeneratedContract = (exports: Schema.Json): boolean => {
|
|
49
|
+
if (Predicate.isString(exports)) return /(?:^|\/)generated(?:\/|$)/u.test(exports)
|
|
50
|
+
if (Array.isArray(exports)) return exports.some(exposesGeneratedContract)
|
|
51
|
+
if (!isRecord(exports)) return false
|
|
52
|
+
return Object.entries(exports).some(([name, target]) =>
|
|
53
|
+
/^\.\/generated(?:\/|$)/u.test(name) || exposesGeneratedContract(target)
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const patchGuidanceDiagnostics = (
|
|
58
|
+
source: string,
|
|
59
|
+
generatedClientNames: ReadonlySet<string>
|
|
60
|
+
): ReadonlyArray<string> => {
|
|
61
|
+
const workflow: unknown = parse(source)
|
|
62
|
+
if (!isRecord(workflow) || !isRecord(workflow.jobs)) return []
|
|
63
|
+
|
|
64
|
+
return Object.values(workflow.jobs).flatMap((job) => {
|
|
65
|
+
if (!isRecord(job) || !Array.isArray(job.steps)) return []
|
|
66
|
+
const steps = job.steps.filter(isRecord)
|
|
67
|
+
const bodies = steps.flatMap((step) =>
|
|
68
|
+
isRecord(step.with) && Predicate.isString(step.with.body) ? [step.with.body.replace(/\s+/gu, " ")] : []
|
|
69
|
+
)
|
|
70
|
+
const hasUnchangedContractGuidance = bodies.some((body) => /\bpublic contract is unchanged\b/iu.test(body))
|
|
71
|
+
const guidanceDiagnostics = bodies.flatMap((body) =>
|
|
72
|
+
body.split(/[.!?]/u).flatMap((sentence) =>
|
|
73
|
+
/\bpatch (?:is appropriate|(?:only )?when)\b/iu.test(sentence)
|
|
74
|
+
&& !/\bpublic contract is unchanged\b/iu.test(sentence)
|
|
75
|
+
? ["Patch release guidance must require an unchanged public contract"]
|
|
76
|
+
: []
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
const defaultDiagnostics = steps.flatMap((step) => {
|
|
80
|
+
if (!Predicate.isString(step.run) || !/cat\s+>\s+\.changeset\//u.test(step.run)) return []
|
|
81
|
+
const heredocs = [...step.run.matchAll(
|
|
82
|
+
/cat\s+>\s+\.changeset\/[^\s]+\.md\s+<<['"]?(\w+)['"]?\s*\n([\s\S]*?)\n\1(?:\n|$)/gu
|
|
83
|
+
)]
|
|
84
|
+
if (heredocs.length === 0) return ["Generated changeset heredoc could not be inspected"]
|
|
85
|
+
return heredocs.flatMap((heredoc) => {
|
|
86
|
+
const frontmatter = heredoc[2]?.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/u)?.[1]
|
|
87
|
+
if (frontmatter === undefined) return ["Generated changeset must contain release frontmatter"]
|
|
88
|
+
const releases: unknown = parse(frontmatter)
|
|
89
|
+
if (!isRecord(releases)) return ["Generated changeset must contain release frontmatter"]
|
|
90
|
+
return Object.entries(releases).flatMap(([name, release]) =>
|
|
91
|
+
generatedClientNames.has(name) && release === "patch" && !hasUnchangedContractGuidance
|
|
92
|
+
? [`Generated client ${name} defaults to patch without unchanged-contract guidance`]
|
|
93
|
+
: []
|
|
94
|
+
)
|
|
95
|
+
})
|
|
96
|
+
})
|
|
97
|
+
return [...guidanceDiagnostics, ...defaultDiagnostics]
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Generated changesets must not reuse a fixed path: the workflow regenerates the PR branch
|
|
102
|
+
// from the base, so a fixed name overwrites a still-pending changeset from an earlier update.
|
|
103
|
+
const changesetPathDiagnostics = (source: string): ReadonlyArray<string> =>
|
|
104
|
+
[...source.matchAll(/cat\s+>\s+(\.changeset\/[^\s]+\.md)/gu)].flatMap(([, changesetPath]) =>
|
|
105
|
+
changesetPath !== undefined && changesetPath.includes("${GITHUB_RUN_ID}")
|
|
106
|
+
? []
|
|
107
|
+
: [`Generated changeset ${changesetPath ?? ""} must be unique per workflow run`]
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
const releaseWorkflow = (name: string, release: string, guidance = "Review the generated API.") => `
|
|
111
|
+
jobs:
|
|
112
|
+
update:
|
|
113
|
+
steps:
|
|
114
|
+
- name: Create changeset
|
|
115
|
+
run: |
|
|
116
|
+
cat > .changeset/api-update.md <<'CHANGESET'
|
|
117
|
+
---
|
|
118
|
+
"${name}": ${release}
|
|
119
|
+
---
|
|
120
|
+
Update generated API schemas.
|
|
121
|
+
CHANGESET
|
|
122
|
+
- name: Create pull request
|
|
123
|
+
with:
|
|
124
|
+
body: ${guidance}
|
|
125
|
+
`
|
|
126
|
+
|
|
127
|
+
const inspectApiUpdateWorkflows = Effect.fn("ApiUpdateWorkflows.inspectApiUpdateWorkflows")(function*(root: string) {
|
|
128
|
+
const fileSystem = yield* FileSystem.FileSystem
|
|
129
|
+
const path = yield* Path.Path
|
|
130
|
+
const packagesRoot = path.join(root, "packages")
|
|
131
|
+
const generatedClientNames = new Set<string>()
|
|
132
|
+
for (const directory of yield* fileSystem.readDirectory(packagesRoot)) {
|
|
133
|
+
if (["vendor", "generated", "node_modules"].includes(directory)) continue
|
|
134
|
+
const packageRoot = path.join(packagesRoot, directory)
|
|
135
|
+
if ((yield* fileSystem.stat(packageRoot)).type !== "Directory") continue
|
|
136
|
+
const manifestPath = path.join(packageRoot, "package.json")
|
|
137
|
+
if (!(yield* fileSystem.exists(manifestPath))) continue
|
|
138
|
+
const manifest = yield* Schema.decodeUnknownEffect(Schema.fromJsonString(PackageManifest))(
|
|
139
|
+
yield* fileSystem.readFileString(manifestPath)
|
|
140
|
+
)
|
|
141
|
+
if (manifest.private !== true && manifest.exports !== undefined && exposesGeneratedContract(manifest.exports)) {
|
|
142
|
+
generatedClientNames.add(manifest.name)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const workflowRoot = path.join(root, ".github/workflows")
|
|
146
|
+
const diagnostics: Array<string> = []
|
|
147
|
+
for (const name of (yield* fileSystem.readDirectory(workflowRoot)).toSorted()) {
|
|
148
|
+
if (!/-api-update\.ya?ml$/u.test(name)) continue
|
|
149
|
+
const source = yield* fileSystem.readFileString(path.join(workflowRoot, name))
|
|
150
|
+
for (const diagnostic of patchGuidanceDiagnostics(source, generatedClientNames)) {
|
|
151
|
+
diagnostics.push(`${name}: ${diagnostic}`)
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return diagnostics
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
const loadWorkflow = Effect.fn("ApiUpdateWorkflows.loadWorkflow")(function*(name: string) {
|
|
158
|
+
const fileSystem = yield* FileSystem.FileSystem
|
|
159
|
+
const path = yield* Path.Path
|
|
160
|
+
const workflowPath = yield* path.fromFileUrl(new URL(`../../../.github/workflows/${name}`, import.meta.url))
|
|
161
|
+
return yield* fileSystem.readFileString(workflowPath)
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
layer(NodeServices.layer)("API update workflow build closure", (it) => {
|
|
165
|
+
const fixtureClients = new Set(["@knpkv/jira-api-client"])
|
|
166
|
+
|
|
167
|
+
it.effect("discovers a fourth API workflow and its exported generated contract", () =>
|
|
168
|
+
Effect.gen(function*() {
|
|
169
|
+
const fileSystem = yield* FileSystem.FileSystem
|
|
170
|
+
const path = yield* Path.Path
|
|
171
|
+
const root = yield* fileSystem.makeTempDirectoryScoped({ prefix: "api-update-discovery-" })
|
|
172
|
+
const workflowRoot = path.join(root, ".github/workflows")
|
|
173
|
+
yield* fileSystem.makeDirectory(workflowRoot, { recursive: true })
|
|
174
|
+
for (const name of ["clockify", "jira", "confluence", "tempo"]) {
|
|
175
|
+
const packageRoot = path.join(root, "packages", name)
|
|
176
|
+
yield* fileSystem.makeDirectory(packageRoot, { recursive: true })
|
|
177
|
+
yield* fileSystem.writeFileString(
|
|
178
|
+
path.join(packageRoot, "package.json"),
|
|
179
|
+
JSON.stringify({
|
|
180
|
+
name: `@fixture/${name}`,
|
|
181
|
+
exports: { "./api": { types: "./dist/generated/Api.d.ts", import: "./dist/generated/Api.js" } }
|
|
182
|
+
})
|
|
183
|
+
)
|
|
184
|
+
yield* fileSystem.writeFileString(
|
|
185
|
+
path.join(workflowRoot, `${name}-api-update.yml`),
|
|
186
|
+
releaseWorkflow(`@fixture/${name}`, name === "tempo" ? "patch" : "minor")
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
for (
|
|
190
|
+
const [directory, manifest] of [
|
|
191
|
+
["private-client", {
|
|
192
|
+
name: "@fixture/private-client",
|
|
193
|
+
private: true,
|
|
194
|
+
exports: { "./generated": "./dist/Api.js" }
|
|
195
|
+
}],
|
|
196
|
+
["vendor", { name: "@fixture/vendor-client", exports: { "./generated": "./dist/Api.js" } }],
|
|
197
|
+
["generated", { name: "@fixture/generated-package", exports: { "./generated": "./dist/Api.js" } }],
|
|
198
|
+
["consumer", {
|
|
199
|
+
name: "@fixture/consumer",
|
|
200
|
+
exports: { ".": "./dist/index.js" },
|
|
201
|
+
dependencies: { "@fixture/tempo": "workspace:*" }
|
|
202
|
+
}]
|
|
203
|
+
] satisfies ReadonlyArray<readonly [string, Schema.Json]>
|
|
204
|
+
) {
|
|
205
|
+
const packageRoot = path.join(root, "packages", directory)
|
|
206
|
+
yield* fileSystem.makeDirectory(packageRoot, { recursive: true })
|
|
207
|
+
yield* fileSystem.writeFileString(path.join(packageRoot, "package.json"), JSON.stringify(manifest))
|
|
208
|
+
const decoded = yield* Schema.decodeUnknownEffect(PackageManifest)(manifest)
|
|
209
|
+
yield* fileSystem.writeFileString(
|
|
210
|
+
path.join(workflowRoot, `${directory}-api-update.yml`),
|
|
211
|
+
releaseWorkflow(decoded.name, "patch")
|
|
212
|
+
)
|
|
213
|
+
}
|
|
214
|
+
expect(yield* inspectApiUpdateWorkflows(root)).toEqual([
|
|
215
|
+
"tempo-api-update.yml: Generated client @fixture/tempo defaults to patch without unchanged-contract guidance"
|
|
216
|
+
])
|
|
217
|
+
yield* fileSystem.writeFileString(
|
|
218
|
+
path.join(workflowRoot, "tempo-api-update.yml"),
|
|
219
|
+
releaseWorkflow("@fixture/tempo", "minor")
|
|
220
|
+
)
|
|
221
|
+
expect(yield* inspectApiUpdateWorkflows(root)).toEqual([])
|
|
222
|
+
}))
|
|
223
|
+
|
|
224
|
+
it("recognizes generated export subpaths and conditional targets without guessing package names", () => {
|
|
225
|
+
expect(exposesGeneratedContract({ "./generated/v1": "./dist/Api.js" })).toBe(true)
|
|
226
|
+
expect(exposesGeneratedContract({ ".": { import: [null, "./dist/generated/Api.js"] } })).toBe(true)
|
|
227
|
+
expect(exposesGeneratedContract({ ".": "./dist/generated-client.js" })).toBe(false)
|
|
228
|
+
expect(exposesGeneratedContract({ ".": "./dist/index.js" })).toBe(false)
|
|
229
|
+
})
|
|
230
|
+
|
|
231
|
+
it("rejects compatible-only patch guidance and accepts unchanged-contract guidance", () => {
|
|
232
|
+
const workflow = (guidance: string) => `
|
|
233
|
+
jobs:
|
|
234
|
+
update:
|
|
235
|
+
steps:
|
|
236
|
+
- name: Create pull request
|
|
237
|
+
with:
|
|
238
|
+
body: ${guidance}
|
|
239
|
+
`
|
|
240
|
+
expect(patchGuidanceDiagnostics(
|
|
241
|
+
workflow(
|
|
242
|
+
"Patch is appropriate only after confirming every public contract remains compatible."
|
|
243
|
+
),
|
|
244
|
+
fixtureClients
|
|
245
|
+
)).toEqual(["Patch release guidance must require an unchanged public contract"])
|
|
246
|
+
expect(patchGuidanceDiagnostics(
|
|
247
|
+
workflow(
|
|
248
|
+
"Patch is appropriate only when the generated public contract is unchanged."
|
|
249
|
+
),
|
|
250
|
+
fixtureClients
|
|
251
|
+
)).toEqual([])
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
it("rejects an unqualified generated-client patch default", () => {
|
|
255
|
+
expect(
|
|
256
|
+
patchGuidanceDiagnostics(
|
|
257
|
+
releaseWorkflow("@knpkv/jira-api-client", "patch", "Review the generated API."),
|
|
258
|
+
fixtureClients
|
|
259
|
+
)
|
|
260
|
+
)
|
|
261
|
+
.toEqual(["Generated client @knpkv/jira-api-client defaults to patch without unchanged-contract guidance"])
|
|
262
|
+
expect(
|
|
263
|
+
patchGuidanceDiagnostics(
|
|
264
|
+
releaseWorkflow("@knpkv/jira-api-client", "minor", "Review the generated API."),
|
|
265
|
+
fixtureClients
|
|
266
|
+
)
|
|
267
|
+
)
|
|
268
|
+
.toEqual([])
|
|
269
|
+
expect(patchGuidanceDiagnostics(
|
|
270
|
+
releaseWorkflow(
|
|
271
|
+
"@knpkv/jira-api-client",
|
|
272
|
+
"patch",
|
|
273
|
+
"Patch is appropriate only when the generated public contract is unchanged."
|
|
274
|
+
),
|
|
275
|
+
fixtureClients
|
|
276
|
+
)).toEqual([])
|
|
277
|
+
expect(
|
|
278
|
+
patchGuidanceDiagnostics(
|
|
279
|
+
releaseWorkflow("@fixture/private-client", "patch", "Apply the JSON patch."),
|
|
280
|
+
fixtureClients
|
|
281
|
+
)
|
|
282
|
+
)
|
|
283
|
+
.toEqual([])
|
|
284
|
+
expect(
|
|
285
|
+
patchGuidanceDiagnostics(
|
|
286
|
+
releaseWorkflow("@knpkv/jira-clockify", "patch", "Consumer dependency update."),
|
|
287
|
+
fixtureClients
|
|
288
|
+
)
|
|
289
|
+
)
|
|
290
|
+
.toEqual([])
|
|
291
|
+
})
|
|
292
|
+
|
|
293
|
+
it.effect("checks every discovered API-update workflow in the repository", () =>
|
|
294
|
+
Effect.gen(function*() {
|
|
295
|
+
const fileSystem = yield* FileSystem.FileSystem
|
|
296
|
+
const path = yield* Path.Path
|
|
297
|
+
const root = yield* path.fromFileUrl(new URL("../../../", import.meta.url))
|
|
298
|
+
expect(yield* fileSystem.readDirectory(path.join(root, ".github/workflows"))).toEqual(expect.arrayContaining([
|
|
299
|
+
"clockify-api-update.yml",
|
|
300
|
+
"jira-api-update.yml",
|
|
301
|
+
"confluence-api-update.yml"
|
|
302
|
+
]))
|
|
303
|
+
expect(yield* inspectApiUpdateWorkflows(root)).toEqual([])
|
|
304
|
+
}))
|
|
305
|
+
|
|
306
|
+
it("rejects a fixed generated changeset path and accepts a per-run path", () => {
|
|
307
|
+
expect(changesetPathDiagnostics("run: cat > .changeset/clockify-api-spec-update.md <<'CHANGESET'")).toEqual([
|
|
308
|
+
"Generated changeset .changeset/clockify-api-spec-update.md must be unique per workflow run"
|
|
309
|
+
])
|
|
310
|
+
expect(
|
|
311
|
+
changesetPathDiagnostics("run: cat > .changeset/clockify-api-spec-update-${GITHUB_RUN_ID}.md <<'CHANGESET'")
|
|
312
|
+
).toEqual([])
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
it.effect("writes every generated changeset to a per-run path", () =>
|
|
316
|
+
Effect.gen(function*() {
|
|
317
|
+
for (const name of ["clockify-api-update.yml", "jira-api-update.yml", "confluence-api-update.yml"]) {
|
|
318
|
+
const source = yield* loadWorkflow(name)
|
|
319
|
+
expect(source).toMatch(/cat\s+>\s+\.changeset\//u)
|
|
320
|
+
expect(changesetPathDiagnostics(source)).toEqual([])
|
|
321
|
+
}
|
|
322
|
+
}))
|
|
46
323
|
|
|
47
|
-
describe("API update workflow build closure", () => {
|
|
48
324
|
it("rejects a bare consumer build and accepts a dependency-closed build", () => {
|
|
49
325
|
const invalid = `
|
|
50
326
|
jobs:
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { describe, it } from "@effect/vitest"
|
|
2
2
|
import * as Effect from "effect/Effect"
|
|
3
|
+
import type { HttpClientRequest } from "effect/http"
|
|
4
|
+
import { HttpClient, HttpClientResponse } from "effect/http"
|
|
3
5
|
import * as Layer from "effect/Layer"
|
|
4
6
|
import { TestClock } from "effect/testing"
|
|
5
|
-
import type { HttpClientRequest } from "effect/unstable/http"
|
|
6
|
-
import { HttpClient, HttpClientResponse } from "effect/unstable/http"
|
|
7
7
|
import { expect } from "vitest"
|
|
8
8
|
import { OAuthError } from "../src/auth/OAuthErrors.js"
|
|
9
9
|
import {
|
|
@@ -4,9 +4,9 @@ import * as Clock from "effect/Clock"
|
|
|
4
4
|
import * as Deferred from "effect/Deferred"
|
|
5
5
|
import * as Fiber from "effect/Fiber"
|
|
6
6
|
import * as FileSystem from "effect/FileSystem"
|
|
7
|
+
import { HttpClient, HttpClientResponse } from "effect/http"
|
|
7
8
|
import * as Path from "effect/Path"
|
|
8
9
|
import { SystemError } from "effect/PlatformError"
|
|
9
|
-
import { HttpClient, HttpClientResponse } from "effect/unstable/http"
|
|
10
10
|
import {
|
|
11
11
|
type AtlassianToolDefinition,
|
|
12
12
|
HomeDirectoryLive,
|