@knpkv/atlassian-common 0.2.0 → 0.4.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 +31 -0
- package/README.md +25 -10
- package/dist/Brand.d.ts +15 -15
- package/dist/Brand.d.ts.map +1 -1
- package/dist/Brand.js +5 -5
- package/dist/Brand.js.map +1 -1
- package/dist/Hash.d.ts +12 -14
- package/dist/Hash.d.ts.map +1 -1
- package/dist/Hash.js +18 -24
- package/dist/Hash.js.map +1 -1
- package/dist/ast/BlockNode.d.ts +120 -177
- package/dist/ast/BlockNode.d.ts.map +1 -1
- package/dist/ast/BlockNode.js +28 -8
- package/dist/ast/BlockNode.js.map +1 -1
- package/dist/ast/Document.d.ts +114 -156
- package/dist/ast/Document.d.ts.map +1 -1
- package/dist/ast/Document.js +1 -1
- package/dist/ast/Document.js.map +1 -1
- package/dist/ast/InlineNode.d.ts +59 -247
- package/dist/ast/InlineNode.d.ts.map +1 -1
- package/dist/ast/InlineNode.js +28 -3
- package/dist/ast/InlineNode.js.map +1 -1
- package/dist/ast/MacroNode.d.ts +62 -102
- package/dist/ast/MacroNode.d.ts.map +1 -1
- package/dist/ast/MacroNode.js +12 -5
- package/dist/ast/MacroNode.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 +5 -6
- package/dist/auth/OAuthOperations.js.map +1 -1
- package/dist/auth/OAuthResponseSchemas.d.ts +13 -13
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +58 -0
- package/dist/bin.js.map +1 -0
- package/dist/config/AuthProfiles.d.ts +342 -0
- package/dist/config/AuthProfiles.d.ts.map +1 -0
- package/dist/config/AuthProfiles.js +275 -0
- package/dist/config/AuthProfiles.js.map +1 -0
- package/dist/config/ConfigPaths.d.ts +12 -26
- package/dist/config/ConfigPaths.d.ts.map +1 -1
- package/dist/config/ConfigPaths.js +33 -3
- package/dist/config/ConfigPaths.js.map +1 -1
- package/dist/config/OAuthSchemas.d.ts +24 -24
- package/dist/config/ProfileManager.d.ts +92 -0
- package/dist/config/ProfileManager.d.ts.map +1 -0
- package/dist/config/ProfileManager.js +175 -0
- package/dist/config/ProfileManager.js.map +1 -0
- package/dist/config/TokenStorage.d.ts +5 -24
- package/dist/config/TokenStorage.d.ts.map +1 -1
- package/dist/config/TokenStorage.js +35 -22
- package/dist/config/TokenStorage.js.map +1 -1
- package/dist/config/index.d.ts +3 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -1
- package/dist/config/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +17 -11
- package/src/Brand.ts +5 -17
- package/src/Hash.ts +27 -27
- package/src/ast/BlockNode.ts +13 -13
- package/src/ast/Document.ts +1 -1
- package/src/ast/InlineNode.ts +5 -5
- package/src/ast/MacroNode.ts +7 -6
- package/src/auth/OAuthOperations.ts +5 -6
- package/src/bin.ts +115 -0
- package/src/config/AuthProfiles.ts +384 -0
- package/src/config/ConfigPaths.ts +21 -7
- package/src/config/ProfileManager.ts +268 -0
- package/src/config/TokenStorage.ts +23 -27
- package/src/config/index.ts +42 -0
- package/src/index.ts +1 -1
- package/test/AuthProfiles.test.ts +131 -0
- package/test/Hash.test.ts +52 -0
- package/test/OAuthOperations.test.ts +2 -3
- package/test/ProfileManager.test.ts +188 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,29 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* XDG-compliant config path resolution and secure file I/O for Atlassian tools.
|
|
3
|
-
*
|
|
4
|
-
* **Mental model**
|
|
5
|
-
*
|
|
6
|
-
* - **Injectable home directory**: {@link HomeDirectoryTag} is an Effect service so tests
|
|
7
|
-
* can substitute a temp dir without touching env vars. {@link HomeDirectoryLive} reads
|
|
8
|
-
* `HOME` / `USERPROFILE` via Effect `Config`.
|
|
9
|
-
* - **XDG hierarchy**: `~/.config/atlassian/<toolName>/` — respects `XDG_CONFIG_HOME` override.
|
|
10
|
-
* - **Secure by default**: {@link ensureConfigDir} creates dirs at `0o700`;
|
|
11
|
-
* {@link writeSecureFile} writes at `0o600`.
|
|
12
|
-
*
|
|
13
|
-
* **Common tasks**
|
|
14
|
-
*
|
|
15
|
-
* - Resolve config dir: {@link getConfigDir}
|
|
16
|
-
* - Get auth file path: {@link getAuthPath}
|
|
17
|
-
* - Write credential files: {@link writeSecureFile}
|
|
18
|
-
*
|
|
19
|
-
* @module
|
|
20
|
-
*/
|
|
21
|
-
import type * as Error from "@effect/platform/Error";
|
|
22
|
-
import * as FileSystem from "@effect/platform/FileSystem";
|
|
23
|
-
import * as Path from "@effect/platform/Path";
|
|
24
1
|
import * as Context from "effect/Context";
|
|
25
2
|
import * as Effect from "effect/Effect";
|
|
3
|
+
import * as FileSystem from "effect/FileSystem";
|
|
26
4
|
import * as Layer from "effect/Layer";
|
|
5
|
+
import * as Path from "effect/Path";
|
|
6
|
+
import type * as PlatformError from "effect/PlatformError";
|
|
27
7
|
declare const HomeDirectoryError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
28
8
|
readonly _tag: "HomeDirectoryError";
|
|
29
9
|
} & Readonly<A>;
|
|
@@ -46,7 +26,7 @@ export declare class HomeDirectoryError extends HomeDirectoryError_base<{
|
|
|
46
26
|
export interface HomeDirectory {
|
|
47
27
|
readonly get: () => Effect.Effect<string, HomeDirectoryError>;
|
|
48
28
|
}
|
|
49
|
-
declare const HomeDirectoryTag_base: Context.
|
|
29
|
+
declare const HomeDirectoryTag_base: Context.ServiceClass<HomeDirectoryTag, "@knpkv/atlassian-common/HomeDirectory", HomeDirectory>;
|
|
50
30
|
/**
|
|
51
31
|
* Tag for the HomeDirectory service.
|
|
52
32
|
*
|
|
@@ -79,17 +59,23 @@ export declare const getAuthPath: (toolName: string) => Effect.Effect<string, Ho
|
|
|
79
59
|
* @category Utilities
|
|
80
60
|
*/
|
|
81
61
|
export declare const getOAuthConfigPath: (toolName: string) => Effect.Effect<string, HomeDirectoryError, HomeDirectoryTag | Path.Path>;
|
|
62
|
+
/**
|
|
63
|
+
* Get auth profiles file path for a specific tool.
|
|
64
|
+
*
|
|
65
|
+
* @category Utilities
|
|
66
|
+
*/
|
|
67
|
+
export declare const getProfilesPath: (toolName: string) => Effect.Effect<string, HomeDirectoryError, HomeDirectoryTag | Path.Path>;
|
|
82
68
|
/**
|
|
83
69
|
* Ensure config directory exists with secure permissions.
|
|
84
70
|
*
|
|
85
71
|
* @category Utilities
|
|
86
72
|
*/
|
|
87
|
-
export declare const ensureConfigDir: (toolName: string) => Effect.Effect<string, HomeDirectoryError |
|
|
73
|
+
export declare const ensureConfigDir: (toolName: string) => Effect.Effect<string, HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
|
|
88
74
|
/**
|
|
89
75
|
* Write file with secure permissions (600).
|
|
90
76
|
*
|
|
91
77
|
* @category Utilities
|
|
92
78
|
*/
|
|
93
|
-
export declare const writeSecureFile: (filePath: string, content: string) => Effect.Effect<void,
|
|
79
|
+
export declare const writeSecureFile: (filePath: string, content: string) => Effect.Effect<void, PlatformError.PlatformError, FileSystem.FileSystem>;
|
|
94
80
|
export {};
|
|
95
81
|
//# sourceMappingURL=ConfigPaths.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigPaths.d.ts","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfigPaths.d.ts","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;;;;AAE1D;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAC9D;;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,qBAGM;CAAG;AAM/C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAY3D,CAAA;AAID;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,WAAW,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAYrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,MAAM,EACN,kBAAkB,GAAG,aAAa,CAAC,aAAa,EAChD,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAYlD,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,UAAU,CAQrE,CAAA"}
|
|
@@ -1,11 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
/**
|
|
2
|
+
* XDG-compliant config path resolution and secure file I/O for Atlassian tools.
|
|
3
|
+
*
|
|
4
|
+
* **Mental model**
|
|
5
|
+
*
|
|
6
|
+
* - **Injectable home directory**: {@link HomeDirectoryTag} is an Effect service so tests
|
|
7
|
+
* can substitute a temp dir without touching env vars. {@link HomeDirectoryLive} reads
|
|
8
|
+
* `HOME` / `USERPROFILE` via Effect `Config`.
|
|
9
|
+
* - **XDG hierarchy**: `~/.config/atlassian/<toolName>/` — respects `XDG_CONFIG_HOME` override.
|
|
10
|
+
* - **Secure by default**: {@link ensureConfigDir} creates dirs at `0o700`;
|
|
11
|
+
* {@link writeSecureFile} writes at `0o600`.
|
|
12
|
+
*
|
|
13
|
+
* **Common tasks**
|
|
14
|
+
*
|
|
15
|
+
* - Resolve config dir: {@link getConfigDir}
|
|
16
|
+
* - Get auth file path: {@link getAuthPath}
|
|
17
|
+
* - Write credential files: {@link writeSecureFile}
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
3
21
|
import * as Config from "effect/Config";
|
|
4
22
|
import * as Context from "effect/Context";
|
|
5
23
|
import * as Data from "effect/Data";
|
|
6
24
|
import * as Effect from "effect/Effect";
|
|
25
|
+
import * as FileSystem from "effect/FileSystem";
|
|
7
26
|
import * as Layer from "effect/Layer";
|
|
8
27
|
import * as Option from "effect/Option";
|
|
28
|
+
import * as Path from "effect/Path";
|
|
9
29
|
/**
|
|
10
30
|
* Error when home directory cannot be determined.
|
|
11
31
|
*
|
|
@@ -21,7 +41,7 @@ export class HomeDirectoryError extends Data.TaggedError("HomeDirectoryError") {
|
|
|
21
41
|
*
|
|
22
42
|
* @category Services
|
|
23
43
|
*/
|
|
24
|
-
export class HomeDirectoryTag extends Context.
|
|
44
|
+
export class HomeDirectoryTag extends Context.Service()("@knpkv/atlassian-common/HomeDirectory") {
|
|
25
45
|
}
|
|
26
46
|
const HomeConfig = Config.option(Config.string("HOME")).pipe(Config.orElse(() => Config.option(Config.string("USERPROFILE"))));
|
|
27
47
|
/**
|
|
@@ -75,6 +95,16 @@ export const getOAuthConfigPath = (toolName) => Effect.gen(function* () {
|
|
|
75
95
|
const configDir = yield* getConfigDir(toolName);
|
|
76
96
|
return path.join(configDir, "oauth.json");
|
|
77
97
|
});
|
|
98
|
+
/**
|
|
99
|
+
* Get auth profiles file path for a specific tool.
|
|
100
|
+
*
|
|
101
|
+
* @category Utilities
|
|
102
|
+
*/
|
|
103
|
+
export const getProfilesPath = (toolName) => Effect.gen(function* () {
|
|
104
|
+
const path = yield* Path.Path;
|
|
105
|
+
const configDir = yield* getConfigDir(toolName);
|
|
106
|
+
return path.join(configDir, "profiles.json");
|
|
107
|
+
});
|
|
78
108
|
/**
|
|
79
109
|
* Ensure config directory exists with secure permissions.
|
|
80
110
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigPaths.js","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ConfigPaths.js","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,11 +19,11 @@ import * as Schema from "effect/Schema";
|
|
|
19
19
|
*/
|
|
20
20
|
export declare const OAuthUserSchema: Schema.Struct<{
|
|
21
21
|
/** Atlassian account ID */
|
|
22
|
-
account_id:
|
|
22
|
+
readonly account_id: Schema.String;
|
|
23
23
|
/** Display name */
|
|
24
|
-
name:
|
|
24
|
+
readonly name: Schema.String;
|
|
25
25
|
/** Email address */
|
|
26
|
-
email:
|
|
26
|
+
readonly email: Schema.String;
|
|
27
27
|
}>;
|
|
28
28
|
/**
|
|
29
29
|
* Type for OAuth user info.
|
|
@@ -53,25 +53,25 @@ export type OAuthUser = Schema.Schema.Type<typeof OAuthUserSchema>;
|
|
|
53
53
|
*/
|
|
54
54
|
export declare const OAuthTokenSchema: Schema.Struct<{
|
|
55
55
|
/** OAuth access token */
|
|
56
|
-
access_token:
|
|
56
|
+
readonly access_token: Schema.String;
|
|
57
57
|
/** OAuth refresh token */
|
|
58
|
-
refresh_token:
|
|
58
|
+
readonly refresh_token: Schema.String;
|
|
59
59
|
/** Token expiration timestamp (Unix ms) */
|
|
60
|
-
expires_at:
|
|
60
|
+
readonly expires_at: Schema.Number;
|
|
61
61
|
/** Granted scopes */
|
|
62
|
-
scope:
|
|
62
|
+
readonly scope: Schema.String;
|
|
63
63
|
/** Atlassian Cloud site ID */
|
|
64
|
-
cloud_id:
|
|
64
|
+
readonly cloud_id: Schema.String;
|
|
65
65
|
/** Site URL */
|
|
66
|
-
site_url:
|
|
66
|
+
readonly site_url: Schema.String;
|
|
67
67
|
/** Cached user info */
|
|
68
|
-
user: Schema.optional<Schema.Struct<{
|
|
68
|
+
readonly user: Schema.optional<Schema.Struct<{
|
|
69
69
|
/** Atlassian account ID */
|
|
70
|
-
account_id:
|
|
70
|
+
readonly account_id: Schema.String;
|
|
71
71
|
/** Display name */
|
|
72
|
-
name:
|
|
72
|
+
readonly name: Schema.String;
|
|
73
73
|
/** Email address */
|
|
74
|
-
email:
|
|
74
|
+
readonly email: Schema.String;
|
|
75
75
|
}>>;
|
|
76
76
|
}>;
|
|
77
77
|
/**
|
|
@@ -87,9 +87,9 @@ export type OAuthToken = Schema.Schema.Type<typeof OAuthTokenSchema>;
|
|
|
87
87
|
*/
|
|
88
88
|
export declare const OAuthConfigSchema: Schema.Struct<{
|
|
89
89
|
/** OAuth client ID from Atlassian Developer Console */
|
|
90
|
-
clientId:
|
|
90
|
+
readonly clientId: Schema.String;
|
|
91
91
|
/** OAuth client secret */
|
|
92
|
-
clientSecret:
|
|
92
|
+
readonly clientSecret: Schema.String;
|
|
93
93
|
}>;
|
|
94
94
|
/**
|
|
95
95
|
* Type for OAuth client configuration.
|
|
@@ -104,15 +104,15 @@ export type OAuthConfig = Schema.Schema.Type<typeof OAuthConfigSchema>;
|
|
|
104
104
|
*/
|
|
105
105
|
export declare const AtlassianSiteSchema: Schema.Struct<{
|
|
106
106
|
/** Cloud ID */
|
|
107
|
-
id:
|
|
107
|
+
readonly id: Schema.String;
|
|
108
108
|
/** Site name */
|
|
109
|
-
name:
|
|
109
|
+
readonly name: Schema.String;
|
|
110
110
|
/** Site URL */
|
|
111
|
-
url:
|
|
111
|
+
readonly url: Schema.String;
|
|
112
112
|
/** Available scopes */
|
|
113
|
-
scopes: Schema
|
|
113
|
+
readonly scopes: Schema.$Array<Schema.String>;
|
|
114
114
|
/** Avatar URL */
|
|
115
|
-
avatarUrl: Schema.optional<
|
|
115
|
+
readonly avatarUrl: Schema.optional<Schema.String>;
|
|
116
116
|
}>;
|
|
117
117
|
/**
|
|
118
118
|
* Type for Atlassian Cloud site.
|
|
@@ -127,13 +127,13 @@ export type AtlassianSite = Schema.Schema.Type<typeof AtlassianSiteSchema>;
|
|
|
127
127
|
*/
|
|
128
128
|
export declare const AtlassianUserSchema: Schema.Struct<{
|
|
129
129
|
/** Atlassian account ID */
|
|
130
|
-
accountId:
|
|
130
|
+
readonly accountId: Schema.String;
|
|
131
131
|
/** Display name */
|
|
132
|
-
displayName:
|
|
132
|
+
readonly displayName: Schema.String;
|
|
133
133
|
/** Email address (may be empty for privacy) */
|
|
134
|
-
email: Schema.optional<
|
|
134
|
+
readonly email: Schema.optional<Schema.String>;
|
|
135
135
|
/** Public name */
|
|
136
|
-
publicName: Schema.optional<
|
|
136
|
+
readonly publicName: Schema.optional<Schema.String>;
|
|
137
137
|
}>;
|
|
138
138
|
/**
|
|
139
139
|
* Type for Atlassian user profile.
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as FileSystem from "effect/FileSystem";
|
|
3
|
+
import * as Path from "effect/Path";
|
|
4
|
+
import type * as PlatformError from "effect/PlatformError";
|
|
5
|
+
import type { HttpClient } from "effect/unstable/http";
|
|
6
|
+
import type { OAuthError } from "../auth/OAuthErrors.js";
|
|
7
|
+
import { type AuthProfile } from "./AuthProfiles.js";
|
|
8
|
+
import { type HomeDirectoryError, HomeDirectoryTag } from "./ConfigPaths.js";
|
|
9
|
+
import { type OAuthToken } from "./OAuthSchemas.js";
|
|
10
|
+
import { FileSystemError } from "./TokenStorage.js";
|
|
11
|
+
export interface AtlassianToolDefinition {
|
|
12
|
+
readonly toolName: string;
|
|
13
|
+
readonly authStoreName?: string;
|
|
14
|
+
readonly legacyAuthPath?: ReadonlyArray<string>;
|
|
15
|
+
readonly label: string;
|
|
16
|
+
readonly loginHint: string;
|
|
17
|
+
readonly requiredScopes: ReadonlyArray<string>;
|
|
18
|
+
}
|
|
19
|
+
export declare const JIRA_REQUIRED_SCOPES: readonly ["read:jira-work", "write:jira-work", "manage:jira-project", "read:jira-user", "read:me", "offline_access"];
|
|
20
|
+
export declare const CONFLUENCE_REQUIRED_SCOPES: readonly ["read:page:confluence", "write:page:confluence", "delete:page:confluence", "read:me", "offline_access"];
|
|
21
|
+
export declare const ATLASSIAN_TOOLS: readonly [{
|
|
22
|
+
readonly toolName: "jira-cli";
|
|
23
|
+
readonly label: "Jira CLI";
|
|
24
|
+
readonly loginHint: "jira auth login";
|
|
25
|
+
readonly requiredScopes: readonly ["read:jira-work", "write:jira-work", "manage:jira-project", "read:jira-user", "read:me", "offline_access"];
|
|
26
|
+
}, {
|
|
27
|
+
readonly toolName: "confluence-to-markdown";
|
|
28
|
+
readonly legacyAuthPath: readonly [".confluence", "auth.json"];
|
|
29
|
+
readonly label: "Confluence to Markdown";
|
|
30
|
+
readonly loginHint: "confluence auth login";
|
|
31
|
+
readonly requiredScopes: readonly ["read:page:confluence", "write:page:confluence", "delete:page:confluence", "read:me", "offline_access"];
|
|
32
|
+
}, {
|
|
33
|
+
readonly toolName: "jira-clockify";
|
|
34
|
+
readonly authStoreName: "jira-cli";
|
|
35
|
+
readonly label: "Jira Clockify";
|
|
36
|
+
readonly loginHint: "jcf auth jira login";
|
|
37
|
+
readonly requiredScopes: readonly ["read:jira-work", "write:jira-work", "manage:jira-project", "read:jira-user", "read:me", "offline_access"];
|
|
38
|
+
}];
|
|
39
|
+
export type ProfileTokenStatus = "valid" | "expired";
|
|
40
|
+
declare const ProfileNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
41
|
+
readonly _tag: "ProfileNotFoundError";
|
|
42
|
+
} & Readonly<A>;
|
|
43
|
+
export declare class ProfileNotFoundError extends ProfileNotFoundError_base<{
|
|
44
|
+
readonly selector: string;
|
|
45
|
+
}> {
|
|
46
|
+
get message(): string;
|
|
47
|
+
}
|
|
48
|
+
declare const MissingOAuthConfigError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
49
|
+
readonly _tag: "MissingOAuthConfigError";
|
|
50
|
+
} & Readonly<A>;
|
|
51
|
+
export declare class MissingOAuthConfigError extends MissingOAuthConfigError_base<{
|
|
52
|
+
readonly authStoreName: string;
|
|
53
|
+
readonly profileId: string;
|
|
54
|
+
}> {
|
|
55
|
+
get message(): string;
|
|
56
|
+
}
|
|
57
|
+
export interface ToolProfileStatus {
|
|
58
|
+
readonly tool: AtlassianToolDefinition;
|
|
59
|
+
readonly authStoreName: string;
|
|
60
|
+
readonly activeProfile: AuthProfile | null;
|
|
61
|
+
readonly profiles: ReadonlyArray<AuthProfile>;
|
|
62
|
+
readonly tokenStatus: ProfileTokenStatus | "missing";
|
|
63
|
+
readonly missingScopes: ReadonlyArray<string>;
|
|
64
|
+
readonly oauthConfigured: boolean;
|
|
65
|
+
}
|
|
66
|
+
export declare const tokenScopes: (token: OAuthToken) => ReadonlySet<string>;
|
|
67
|
+
export declare const missingScopes: (token: OAuthToken, requiredScopes: ReadonlyArray<string>) => ReadonlyArray<string>;
|
|
68
|
+
export declare const inspectToolProfiles: (tool: AtlassianToolDefinition) => Effect.Effect<ToolProfileStatus, FileSystemError | HomeDirectoryError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
|
|
69
|
+
export declare const inspectAllToolProfiles: (tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ToolProfileStatus[], HomeDirectoryError | FileSystemError, HomeDirectoryTag | Path.Path | FileSystem.FileSystem>;
|
|
70
|
+
/**
|
|
71
|
+
* Switch matching existing profiles across auth stores.
|
|
72
|
+
*
|
|
73
|
+
* Fails when the selector is not present in any store so callers do not
|
|
74
|
+
* mistake an unchanged profile list for a successful switch.
|
|
75
|
+
*/
|
|
76
|
+
export declare const useProfileForAllTools: (selector: string, tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ReadonlyArray<ToolProfileStatus>, ProfileNotFoundError | FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
|
|
77
|
+
/**
|
|
78
|
+
* Persist legacy single-token auth files into shared profile stores.
|
|
79
|
+
*
|
|
80
|
+
* Supports both XDG Atlassian auth files and tool-specific legacy paths such
|
|
81
|
+
* as Confluence's historical `~/.confluence/auth.json`.
|
|
82
|
+
*/
|
|
83
|
+
export declare const migrateLegacyProfiles: (tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ReadonlyArray<ToolProfileStatus>, FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
|
|
84
|
+
/**
|
|
85
|
+
* Refresh expired active profiles.
|
|
86
|
+
*
|
|
87
|
+
* Fails when an expired profile lacks OAuth client configuration so refresh
|
|
88
|
+
* callers cannot report success while leaving a token expired.
|
|
89
|
+
*/
|
|
90
|
+
export declare const refreshActiveProfiles: (tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ReadonlyArray<ToolProfileStatus>, MissingOAuthConfigError | OAuthError | FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag | HttpClient.HttpClient>;
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=ProfileManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileManager.d.ts","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified Atlassian profile management helpers shared by Atlassian CLIs.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
import * as Data from "effect/Data";
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import * as FileSystem from "effect/FileSystem";
|
|
9
|
+
import * as Path from "effect/Path";
|
|
10
|
+
import * as Schema from "effect/Schema";
|
|
11
|
+
import { refreshToken } from "../auth/OAuthOperations.js";
|
|
12
|
+
import { findProfile, loadProfiles, saveProfiles, saveProfileToken } from "./AuthProfiles.js";
|
|
13
|
+
import { getProfilesPath, HomeDirectoryTag } from "./ConfigPaths.js";
|
|
14
|
+
import { OAuthTokenSchema } from "./OAuthSchemas.js";
|
|
15
|
+
import { FileSystemError, isTokenExpired, loadOAuthConfig } from "./TokenStorage.js";
|
|
16
|
+
export const JIRA_REQUIRED_SCOPES = [
|
|
17
|
+
"read:jira-work",
|
|
18
|
+
"write:jira-work",
|
|
19
|
+
"manage:jira-project",
|
|
20
|
+
"read:jira-user",
|
|
21
|
+
"read:me",
|
|
22
|
+
"offline_access"
|
|
23
|
+
];
|
|
24
|
+
export const CONFLUENCE_REQUIRED_SCOPES = [
|
|
25
|
+
"read:page:confluence",
|
|
26
|
+
"write:page:confluence",
|
|
27
|
+
"delete:page:confluence",
|
|
28
|
+
"read:me",
|
|
29
|
+
"offline_access"
|
|
30
|
+
];
|
|
31
|
+
export const ATLASSIAN_TOOLS = [
|
|
32
|
+
{
|
|
33
|
+
toolName: "jira-cli",
|
|
34
|
+
label: "Jira CLI",
|
|
35
|
+
loginHint: "jira auth login",
|
|
36
|
+
requiredScopes: JIRA_REQUIRED_SCOPES
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
toolName: "confluence-to-markdown",
|
|
40
|
+
legacyAuthPath: [".confluence", "auth.json"],
|
|
41
|
+
label: "Confluence to Markdown",
|
|
42
|
+
loginHint: "confluence auth login",
|
|
43
|
+
requiredScopes: CONFLUENCE_REQUIRED_SCOPES
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
toolName: "jira-clockify",
|
|
47
|
+
authStoreName: "jira-cli",
|
|
48
|
+
label: "Jira Clockify",
|
|
49
|
+
loginHint: "jcf auth jira login",
|
|
50
|
+
requiredScopes: JIRA_REQUIRED_SCOPES
|
|
51
|
+
}
|
|
52
|
+
];
|
|
53
|
+
export class ProfileNotFoundError extends Data.TaggedError("ProfileNotFoundError") {
|
|
54
|
+
get message() {
|
|
55
|
+
return `Profile not found: ${this.selector}`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export class MissingOAuthConfigError extends Data.TaggedError("MissingOAuthConfigError") {
|
|
59
|
+
get message() {
|
|
60
|
+
return `Cannot refresh expired profile ${this.profileId}: missing OAuth config for ${this.authStoreName}`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const authStoreName = (tool) => tool.authStoreName ?? tool.toolName;
|
|
64
|
+
const uniqueAuthTools = (tools) => tools.filter((tool, index) => tools.findIndex((candidate) => authStoreName(candidate) === authStoreName(tool)) === index);
|
|
65
|
+
const loadLegacyToken = (tool) => Effect.gen(function* () {
|
|
66
|
+
if (!tool.legacyAuthPath)
|
|
67
|
+
return null;
|
|
68
|
+
const fs = yield* FileSystem.FileSystem;
|
|
69
|
+
const path = yield* Path.Path;
|
|
70
|
+
const homeDirectory = yield* HomeDirectoryTag;
|
|
71
|
+
const home = yield* homeDirectory.get();
|
|
72
|
+
const authPath = path.join(home, ...tool.legacyAuthPath);
|
|
73
|
+
const exists = yield* fs.exists(authPath).pipe(Effect.catch(() => Effect.succeed(false)));
|
|
74
|
+
if (!exists)
|
|
75
|
+
return null;
|
|
76
|
+
const content = yield* fs.readFileString(authPath).pipe(Effect.mapError((cause) => new FileSystemError({ operation: "read", path: authPath, cause })));
|
|
77
|
+
const parsed = yield* Effect.try({
|
|
78
|
+
try: () => JSON.parse(content),
|
|
79
|
+
catch: (cause) => cause
|
|
80
|
+
}).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
81
|
+
if (parsed === null)
|
|
82
|
+
return null;
|
|
83
|
+
return yield* Schema.decodeUnknownEffect(OAuthTokenSchema)(parsed).pipe(Effect.catch(() => Effect.succeed(null)));
|
|
84
|
+
});
|
|
85
|
+
export const tokenScopes = (token) => new Set(token.scope.split(/\s+/).filter((scope) => scope.length > 0));
|
|
86
|
+
export const missingScopes = (token, requiredScopes) => {
|
|
87
|
+
const granted = tokenScopes(token);
|
|
88
|
+
return requiredScopes.filter((scope) => !granted.has(scope));
|
|
89
|
+
};
|
|
90
|
+
export const inspectToolProfiles = (tool) => Effect.gen(function* () {
|
|
91
|
+
const storeName = authStoreName(tool);
|
|
92
|
+
const [store, config] = yield* Effect.all([loadProfiles(storeName), loadOAuthConfig(storeName)]);
|
|
93
|
+
const activeProfile = store.profiles.find((profile) => profile.id === store.activeProfileId) ?? store.profiles[0] ??
|
|
94
|
+
null;
|
|
95
|
+
return {
|
|
96
|
+
tool,
|
|
97
|
+
authStoreName: storeName,
|
|
98
|
+
activeProfile,
|
|
99
|
+
profiles: store.profiles,
|
|
100
|
+
tokenStatus: activeProfile === null ? "missing" : isTokenExpired(activeProfile.token, 0) ? "expired" : "valid",
|
|
101
|
+
missingScopes: activeProfile === null ? [] : missingScopes(activeProfile.token, tool.requiredScopes),
|
|
102
|
+
oauthConfigured: config !== null
|
|
103
|
+
};
|
|
104
|
+
});
|
|
105
|
+
export const inspectAllToolProfiles = (tools = ATLASSIAN_TOOLS) => Effect.forEach(tools, inspectToolProfiles);
|
|
106
|
+
/**
|
|
107
|
+
* Switch matching existing profiles across auth stores.
|
|
108
|
+
*
|
|
109
|
+
* Fails when the selector is not present in any store so callers do not
|
|
110
|
+
* mistake an unchanged profile list for a successful switch.
|
|
111
|
+
*/
|
|
112
|
+
export const useProfileForAllTools = (selector, tools = ATLASSIAN_TOOLS) => Effect.gen(function* () {
|
|
113
|
+
const authTools = uniqueAuthTools(tools);
|
|
114
|
+
const stores = yield* Effect.forEach(authTools, (tool) => loadProfiles(authStoreName(tool)).pipe(Effect.map((store) => [tool, store])));
|
|
115
|
+
const selected = stores.map(([, store]) => findProfile(store.profiles, selector)).find((profile) => profile !== null);
|
|
116
|
+
if (!selected)
|
|
117
|
+
return yield* Effect.fail(new ProfileNotFoundError({ selector }));
|
|
118
|
+
yield* Effect.forEach(stores, ([tool, store]) => {
|
|
119
|
+
const matching = findProfile(store.profiles, selector) ?? findProfile(store.profiles, selected.id);
|
|
120
|
+
if (!matching)
|
|
121
|
+
return Effect.void;
|
|
122
|
+
return saveProfiles(authStoreName(tool), { ...store, activeProfileId: matching.id });
|
|
123
|
+
});
|
|
124
|
+
return yield* inspectAllToolProfiles(tools);
|
|
125
|
+
});
|
|
126
|
+
/**
|
|
127
|
+
* Persist legacy single-token auth files into shared profile stores.
|
|
128
|
+
*
|
|
129
|
+
* Supports both XDG Atlassian auth files and tool-specific legacy paths such
|
|
130
|
+
* as Confluence's historical `~/.confluence/auth.json`.
|
|
131
|
+
*/
|
|
132
|
+
export const migrateLegacyProfiles = (tools = ATLASSIAN_TOOLS) => Effect.gen(function* () {
|
|
133
|
+
const fs = yield* FileSystem.FileSystem;
|
|
134
|
+
yield* Effect.forEach(uniqueAuthTools(tools), (tool) => Effect.gen(function* () {
|
|
135
|
+
const storeName = authStoreName(tool);
|
|
136
|
+
const profilesPath = yield* getProfilesPath(storeName);
|
|
137
|
+
const hasProfilesFile = yield* fs.exists(profilesPath).pipe(Effect.catch(() => Effect.succeed(false)));
|
|
138
|
+
if (hasProfilesFile)
|
|
139
|
+
return;
|
|
140
|
+
const store = yield* loadProfiles(storeName);
|
|
141
|
+
if (store.profiles.length > 0) {
|
|
142
|
+
yield* saveProfiles(storeName, store);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
const legacyToken = yield* loadLegacyToken(tool);
|
|
146
|
+
if (legacyToken !== null) {
|
|
147
|
+
yield* saveProfileToken(storeName, legacyToken);
|
|
148
|
+
}
|
|
149
|
+
}));
|
|
150
|
+
return yield* inspectAllToolProfiles(tools);
|
|
151
|
+
});
|
|
152
|
+
/**
|
|
153
|
+
* Refresh expired active profiles.
|
|
154
|
+
*
|
|
155
|
+
* Fails when an expired profile lacks OAuth client configuration so refresh
|
|
156
|
+
* callers cannot report success while leaving a token expired.
|
|
157
|
+
*/
|
|
158
|
+
export const refreshActiveProfiles = (tools = ATLASSIAN_TOOLS) => Effect.gen(function* () {
|
|
159
|
+
yield* Effect.forEach(uniqueAuthTools(tools), (tool) => Effect.gen(function* () {
|
|
160
|
+
const storeName = authStoreName(tool);
|
|
161
|
+
const store = yield* loadProfiles(storeName);
|
|
162
|
+
const active = store.profiles.find((profile) => profile.id === store.activeProfileId) ?? store.profiles[0] ??
|
|
163
|
+
null;
|
|
164
|
+
if (!active || !isTokenExpired(active.token, 0))
|
|
165
|
+
return;
|
|
166
|
+
const config = yield* loadOAuthConfig(storeName);
|
|
167
|
+
if (!config) {
|
|
168
|
+
return yield* Effect.fail(new MissingOAuthConfigError({ authStoreName: storeName, profileId: active.id }));
|
|
169
|
+
}
|
|
170
|
+
const refreshed = yield* refreshToken(active.token, config);
|
|
171
|
+
yield* saveProfileToken(storeName, refreshed);
|
|
172
|
+
}));
|
|
173
|
+
return yield* inspectAllToolProfiles(tools);
|
|
174
|
+
});
|
|
175
|
+
//# sourceMappingURL=ProfileManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProfileManager.js","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Persistent token and OAuth config storage with schema validation and secure file I/O.
|
|
3
|
-
*
|
|
4
|
-
* **Mental model**
|
|
5
|
-
*
|
|
6
|
-
* - **Load returns null, not error**: {@link loadToken} and {@link loadOAuthConfig} return
|
|
7
|
-
* `null` for missing/corrupt files — callers decide whether absence is an error.
|
|
8
|
-
* - **Save is atomic**: Writes go through {@link writeSecureFile} with `0o600` permissions.
|
|
9
|
-
* - **Schema-gated reads**: JSON is parsed then validated via `Schema.decodeUnknown` —
|
|
10
|
-
* corrupt data is treated as absent rather than crashing.
|
|
11
|
-
*
|
|
12
|
-
* **Common tasks**
|
|
13
|
-
*
|
|
14
|
-
* - Load stored token: {@link loadToken}
|
|
15
|
-
* - Persist after refresh: {@link saveToken}
|
|
16
|
-
* - Check expiration: {@link isTokenExpired}
|
|
17
|
-
*
|
|
18
|
-
* @module
|
|
19
|
-
*/
|
|
20
|
-
import type * as Error from "@effect/platform/Error";
|
|
21
|
-
import * as FileSystem from "@effect/platform/FileSystem";
|
|
22
|
-
import type * as Path from "@effect/platform/Path";
|
|
23
1
|
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as FileSystem from "effect/FileSystem";
|
|
3
|
+
import type * as Path from "effect/Path";
|
|
4
|
+
import type * as PlatformError from "effect/PlatformError";
|
|
24
5
|
import { type HomeDirectoryError, type HomeDirectoryTag } from "./ConfigPaths.js";
|
|
25
6
|
import { type OAuthConfig, type OAuthToken } from "./OAuthSchemas.js";
|
|
26
7
|
declare const FileSystemError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
|
|
@@ -55,7 +36,7 @@ export declare const loadToken: (toolName: string) => Effect.Effect<OAuthToken |
|
|
|
55
36
|
*
|
|
56
37
|
* @category Token Storage
|
|
57
38
|
*/
|
|
58
|
-
export declare const saveToken: (toolName: string, token: OAuthToken) => Effect.Effect<void, FileSystemError | HomeDirectoryError |
|
|
39
|
+
export declare const saveToken: (toolName: string, token: OAuthToken) => Effect.Effect<void, FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
|
|
59
40
|
/**
|
|
60
41
|
* Delete stored OAuth token.
|
|
61
42
|
*
|
|
@@ -81,7 +62,7 @@ export declare const loadOAuthConfig: (toolName: string) => Effect.Effect<OAuthC
|
|
|
81
62
|
*
|
|
82
63
|
* @category OAuth Config
|
|
83
64
|
*/
|
|
84
|
-
export declare const saveOAuthConfig: (toolName: string, config: OAuthConfig) => Effect.Effect<void, FileSystemError | HomeDirectoryError |
|
|
65
|
+
export declare const saveOAuthConfig: (toolName: string, config: OAuthConfig) => Effect.Effect<void, FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
|
|
85
66
|
/**
|
|
86
67
|
* Check if token is expired or about to expire.
|
|
87
68
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../../src/config/TokenStorage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../../src/config/TokenStorage.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEjF,OAAO,EAAE,KAAK,WAAW,EAAqB,KAAK,UAAU,EAAoB,MAAM,mBAAmB,CAAA;;;;AAU1G;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,UAAU,GAAG,IAAI,EACjB,eAAe,GAAG,kBAAkB,EACpC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CA8BlD,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,EAChB,OAAO,UAAU,KAChB,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,EAClE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAUlD,CAAA;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,kBAAkB,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAQ7G,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,WAAW,GAAG,IAAI,EAClB,eAAe,GAAG,kBAAkB,EACpC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CA8BlD,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,QAAQ,WAAW,KAClB,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,EAClE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAUlD,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,UAAU,EAAE,WAAU,MAAsB,KAAG,OAC1C,CAAA"}
|