@knpkv/atlassian-common 0.3.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 +12 -0
- package/README.md +25 -10
- 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 +6 -0
- package/dist/config/ConfigPaths.d.ts.map +1 -1
- package/dist/config/ConfigPaths.js +10 -0
- package/dist/config/ConfigPaths.js.map +1 -1
- 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/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/package.json +11 -3
- package/src/bin.ts +115 -0
- package/src/config/AuthProfiles.ts +384 -0
- package/src/config/ConfigPaths.ts +14 -0
- package/src/config/ProfileManager.ts +268 -0
- package/src/config/index.ts +42 -0
- package/test/AuthProfiles.test.ts +131 -0
- package/test/ProfileManager.test.ts +188 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-account/site auth profile storage for Atlassian CLIs.
|
|
3
|
+
*
|
|
4
|
+
* **Mental model**
|
|
5
|
+
*
|
|
6
|
+
* - `profiles.json` is the source of truth for multiple logged-in accounts/sites.
|
|
7
|
+
* - The active profile is mirrored to the legacy `auth.json` token file so older
|
|
8
|
+
* single-profile consumers keep working.
|
|
9
|
+
* - Existing single-token installs are treated as a one-profile store on read.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import * as Clock from "effect/Clock";
|
|
14
|
+
import * as Effect from "effect/Effect";
|
|
15
|
+
import * as FileSystem from "effect/FileSystem";
|
|
16
|
+
import * as Schema from "effect/Schema";
|
|
17
|
+
import { ensureConfigDir, getProfilesPath, writeSecureFile } from "./ConfigPaths.js";
|
|
18
|
+
import { OAuthTokenSchema } from "./OAuthSchemas.js";
|
|
19
|
+
import { deleteToken, FileSystemError, loadToken, saveToken } from "./TokenStorage.js";
|
|
20
|
+
/**
|
|
21
|
+
* A persisted Atlassian auth profile.
|
|
22
|
+
*
|
|
23
|
+
* @category Schema
|
|
24
|
+
*/
|
|
25
|
+
export const AuthProfileSchema = Schema.Struct({
|
|
26
|
+
/** Stable identifier derived from account and cloud IDs. */
|
|
27
|
+
id: Schema.String,
|
|
28
|
+
/** Human-readable profile label. */
|
|
29
|
+
name: Schema.String,
|
|
30
|
+
/** OAuth token and selected site metadata. */
|
|
31
|
+
token: OAuthTokenSchema,
|
|
32
|
+
/** ISO timestamp when the profile was first created. */
|
|
33
|
+
created_at: Schema.String,
|
|
34
|
+
/** ISO timestamp when the profile was last updated. */
|
|
35
|
+
updated_at: Schema.String
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Schema for the profile registry file.
|
|
39
|
+
*
|
|
40
|
+
* @category Schema
|
|
41
|
+
*/
|
|
42
|
+
export const AuthProfilesFileSchema = Schema.Struct({
|
|
43
|
+
/** Active profile ID. Omitted when no profile is active. */
|
|
44
|
+
activeProfileId: Schema.optional(Schema.String),
|
|
45
|
+
/** Known auth profiles for this CLI. */
|
|
46
|
+
profiles: Schema.Array(AuthProfileSchema)
|
|
47
|
+
});
|
|
48
|
+
const emptyProfiles = () => ({ profiles: [] });
|
|
49
|
+
const parseJsonOrNull = (content) => {
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(content);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const hostFromUrl = (url) => {
|
|
58
|
+
try {
|
|
59
|
+
return new URL(url).host;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return url;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const normalizeProfileIdPart = (value) => value.toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
|
|
66
|
+
/**
|
|
67
|
+
* Build a stable profile ID from token site and user identity.
|
|
68
|
+
*
|
|
69
|
+
* @category Utilities
|
|
70
|
+
*/
|
|
71
|
+
export const profileIdFromToken = (token) => {
|
|
72
|
+
const account = token.user?.account_id ? normalizeProfileIdPart(token.user.account_id) : "unknown-account";
|
|
73
|
+
const site = normalizeProfileIdPart(token.cloud_id || hostFromUrl(token.site_url));
|
|
74
|
+
return `${account}@${site}`;
|
|
75
|
+
};
|
|
76
|
+
/**
|
|
77
|
+
* Build a readable profile label from token site and user identity.
|
|
78
|
+
*
|
|
79
|
+
* @category Utilities
|
|
80
|
+
*/
|
|
81
|
+
export const profileNameFromToken = (token) => {
|
|
82
|
+
const site = hostFromUrl(token.site_url);
|
|
83
|
+
if (!token.user)
|
|
84
|
+
return site;
|
|
85
|
+
const email = token.user.email.length > 0 ? ` (${token.user.email})` : "";
|
|
86
|
+
return `${token.user.name}${email} @ ${site}`;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Create a profile record from an OAuth token.
|
|
90
|
+
*
|
|
91
|
+
* @category Utilities
|
|
92
|
+
*/
|
|
93
|
+
export const profileFromToken = (token, now) => {
|
|
94
|
+
const timestamp = now.toISOString();
|
|
95
|
+
return {
|
|
96
|
+
id: profileIdFromToken(token),
|
|
97
|
+
name: profileNameFromToken(token),
|
|
98
|
+
token,
|
|
99
|
+
created_at: timestamp,
|
|
100
|
+
updated_at: timestamp
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
const activeProfileFromStore = (store) => {
|
|
104
|
+
if (store.profiles.length === 0)
|
|
105
|
+
return null;
|
|
106
|
+
if (!store.activeProfileId)
|
|
107
|
+
return store.profiles[0] ?? null;
|
|
108
|
+
return store.profiles.find((profile) => profile.id === store.activeProfileId) ?? store.profiles[0] ?? null;
|
|
109
|
+
};
|
|
110
|
+
const storeFromLegacyToken = (token, now) => token === null
|
|
111
|
+
? emptyProfiles()
|
|
112
|
+
: {
|
|
113
|
+
activeProfileId: profileIdFromToken(token),
|
|
114
|
+
profiles: [profileFromToken(token, now)]
|
|
115
|
+
};
|
|
116
|
+
const readProfilesFile = (toolName) => Effect.gen(function* () {
|
|
117
|
+
const fs = yield* FileSystem.FileSystem;
|
|
118
|
+
const profilesPath = yield* getProfilesPath(toolName);
|
|
119
|
+
const exists = yield* fs.exists(profilesPath).pipe(Effect.catch(() => Effect.succeed(false)));
|
|
120
|
+
if (!exists)
|
|
121
|
+
return null;
|
|
122
|
+
const content = yield* fs.readFileString(profilesPath).pipe(Effect.mapError((cause) => new FileSystemError({ operation: "read", path: profilesPath, cause })));
|
|
123
|
+
const parsed = parseJsonOrNull(content);
|
|
124
|
+
if (parsed === null) {
|
|
125
|
+
yield* Effect.logWarning(`Corrupted profiles.json at ${profilesPath} - could not parse JSON`);
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
return yield* Schema.decodeUnknownEffect(AuthProfilesFileSchema)(parsed).pipe(Effect.catch((e) => Effect.logWarning(`Invalid profile schema in ${profilesPath}: ${e}`).pipe(Effect.map(() => null))));
|
|
129
|
+
});
|
|
130
|
+
/**
|
|
131
|
+
* Load all auth profiles for a tool.
|
|
132
|
+
*
|
|
133
|
+
* Falls back to the legacy single-token file when `profiles.json` does not exist.
|
|
134
|
+
*
|
|
135
|
+
* @category Profile Storage
|
|
136
|
+
*/
|
|
137
|
+
export const loadProfiles = (toolName) => Effect.gen(function* () {
|
|
138
|
+
const profiles = yield* readProfilesFile(toolName);
|
|
139
|
+
if (profiles !== null)
|
|
140
|
+
return profiles;
|
|
141
|
+
const legacyToken = yield* loadToken(toolName);
|
|
142
|
+
const nowMs = yield* Clock.currentTimeMillis;
|
|
143
|
+
return storeFromLegacyToken(legacyToken, new Date(nowMs));
|
|
144
|
+
});
|
|
145
|
+
/**
|
|
146
|
+
* Save auth profiles and mirror the active profile to `auth.json`.
|
|
147
|
+
*
|
|
148
|
+
* @category Profile Storage
|
|
149
|
+
*/
|
|
150
|
+
export const saveProfiles = (toolName, store) => Effect.gen(function* () {
|
|
151
|
+
const fs = yield* FileSystem.FileSystem;
|
|
152
|
+
yield* ensureConfigDir(toolName);
|
|
153
|
+
const profilesPath = yield* getProfilesPath(toolName);
|
|
154
|
+
const active = activeProfileFromStore(store);
|
|
155
|
+
const normalized = {
|
|
156
|
+
activeProfileId: active?.id,
|
|
157
|
+
profiles: store.profiles
|
|
158
|
+
};
|
|
159
|
+
yield* writeSecureFile(profilesPath, JSON.stringify(normalized, null, 2)).pipe(Effect.provideService(FileSystem.FileSystem, fs));
|
|
160
|
+
if (active) {
|
|
161
|
+
yield* saveToken(toolName, active.token);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
yield* deleteToken(toolName);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
/**
|
|
168
|
+
* Insert or update a profile from a token and make it active.
|
|
169
|
+
*
|
|
170
|
+
* @category Profile Storage
|
|
171
|
+
*/
|
|
172
|
+
export const saveProfileToken = (toolName, token) => Effect.gen(function* () {
|
|
173
|
+
const store = yield* loadProfiles(toolName);
|
|
174
|
+
const nowMs = yield* Clock.currentTimeMillis;
|
|
175
|
+
const next = profileFromToken(token, new Date(nowMs));
|
|
176
|
+
const existing = store.profiles.find((profile) => profile.id === next.id);
|
|
177
|
+
const profile = existing
|
|
178
|
+
? { ...next, created_at: existing.created_at }
|
|
179
|
+
: next;
|
|
180
|
+
const profiles = [
|
|
181
|
+
profile,
|
|
182
|
+
...store.profiles.filter((stored) => stored.id !== profile.id)
|
|
183
|
+
];
|
|
184
|
+
yield* saveProfiles(toolName, { activeProfileId: profile.id, profiles });
|
|
185
|
+
return profile;
|
|
186
|
+
});
|
|
187
|
+
/**
|
|
188
|
+
* Load the active auth profile.
|
|
189
|
+
*
|
|
190
|
+
* @category Profile Storage
|
|
191
|
+
*/
|
|
192
|
+
export const loadActiveProfile = (toolName) => loadProfiles(toolName).pipe(Effect.map(activeProfileFromStore));
|
|
193
|
+
/**
|
|
194
|
+
* Load the active OAuth token.
|
|
195
|
+
*
|
|
196
|
+
* @category Profile Storage
|
|
197
|
+
*/
|
|
198
|
+
export const loadActiveProfileToken = (toolName) => loadActiveProfile(toolName).pipe(Effect.map((profile) => profile?.token ?? null));
|
|
199
|
+
/**
|
|
200
|
+
* Set the active profile by ID.
|
|
201
|
+
*
|
|
202
|
+
* @category Profile Storage
|
|
203
|
+
*/
|
|
204
|
+
export const setActiveProfile = (toolName, profileId) => Effect.gen(function* () {
|
|
205
|
+
const store = yield* loadProfiles(toolName);
|
|
206
|
+
const profile = store.profiles.find((stored) => stored.id === profileId);
|
|
207
|
+
if (!profile)
|
|
208
|
+
return null;
|
|
209
|
+
yield* saveProfiles(toolName, { ...store, activeProfileId: profile.id });
|
|
210
|
+
return profile;
|
|
211
|
+
});
|
|
212
|
+
/**
|
|
213
|
+
* Resolve a profile by ID, name, site URL, cloud ID, or account ID.
|
|
214
|
+
*
|
|
215
|
+
* @category Utilities
|
|
216
|
+
*/
|
|
217
|
+
export const findProfile = (profiles, selector) => profiles.find((profile) => profile.id === selector ||
|
|
218
|
+
profile.name === selector ||
|
|
219
|
+
profile.token.site_url === selector ||
|
|
220
|
+
profile.token.cloud_id === selector ||
|
|
221
|
+
profile.token.user?.account_id === selector) ?? null;
|
|
222
|
+
/**
|
|
223
|
+
* Set the active profile using a flexible selector.
|
|
224
|
+
*
|
|
225
|
+
* @category Profile Storage
|
|
226
|
+
*/
|
|
227
|
+
export const setActiveProfileBySelector = (toolName, selector) => Effect.gen(function* () {
|
|
228
|
+
const store = yield* loadProfiles(toolName);
|
|
229
|
+
const profile = findProfile(store.profiles, selector);
|
|
230
|
+
if (!profile)
|
|
231
|
+
return null;
|
|
232
|
+
yield* saveProfiles(toolName, { ...store, activeProfileId: profile.id });
|
|
233
|
+
return profile;
|
|
234
|
+
});
|
|
235
|
+
/**
|
|
236
|
+
* Remove a profile by ID.
|
|
237
|
+
*
|
|
238
|
+
* @category Profile Storage
|
|
239
|
+
*/
|
|
240
|
+
export const deleteProfile = (toolName, profileId) => Effect.gen(function* () {
|
|
241
|
+
const store = yield* loadProfiles(toolName);
|
|
242
|
+
const profile = store.profiles.find((stored) => stored.id === profileId);
|
|
243
|
+
if (!profile)
|
|
244
|
+
return null;
|
|
245
|
+
const profiles = store.profiles.filter((stored) => stored.id !== profile.id);
|
|
246
|
+
const activeProfileId = store.activeProfileId === profile.id ? profiles[0]?.id : store.activeProfileId;
|
|
247
|
+
yield* saveProfiles(toolName, { activeProfileId, profiles });
|
|
248
|
+
return profile;
|
|
249
|
+
});
|
|
250
|
+
/**
|
|
251
|
+
* Remove a profile using a flexible selector.
|
|
252
|
+
*
|
|
253
|
+
* @category Profile Storage
|
|
254
|
+
*/
|
|
255
|
+
export const deleteProfileBySelector = (toolName, selector) => Effect.gen(function* () {
|
|
256
|
+
const store = yield* loadProfiles(toolName);
|
|
257
|
+
const profile = findProfile(store.profiles, selector);
|
|
258
|
+
if (!profile)
|
|
259
|
+
return null;
|
|
260
|
+
return yield* deleteProfile(toolName, profile.id);
|
|
261
|
+
});
|
|
262
|
+
/**
|
|
263
|
+
* Remove the active profile.
|
|
264
|
+
*
|
|
265
|
+
* @category Profile Storage
|
|
266
|
+
*/
|
|
267
|
+
export const deleteActiveProfile = (toolName) => Effect.gen(function* () {
|
|
268
|
+
const active = yield* loadActiveProfile(toolName);
|
|
269
|
+
if (!active) {
|
|
270
|
+
yield* deleteToken(toolName);
|
|
271
|
+
return null;
|
|
272
|
+
}
|
|
273
|
+
return yield* deleteProfile(toolName, active.id);
|
|
274
|
+
});
|
|
275
|
+
//# sourceMappingURL=AuthProfiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthProfiles.js","sourceRoot":"","sources":["../../src/config/AuthProfiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,12 @@ export declare const getAuthPath: (toolName: string) => Effect.Effect<string, Ho
|
|
|
59
59
|
* @category Utilities
|
|
60
60
|
*/
|
|
61
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>;
|
|
62
68
|
/**
|
|
63
69
|
* Ensure config directory exists with secure permissions.
|
|
64
70
|
*
|
|
@@ -1 +1 @@
|
|
|
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,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
|
+
{"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"}
|
|
@@ -95,6 +95,16 @@ export const getOAuthConfigPath = (toolName) => Effect.gen(function* () {
|
|
|
95
95
|
const configDir = yield* getConfigDir(toolName);
|
|
96
96
|
return path.join(configDir, "oauth.json");
|
|
97
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
|
+
});
|
|
98
108
|
/**
|
|
99
109
|
* Ensure config directory exists with secure permissions.
|
|
100
110
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConfigPaths.js","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ConfigPaths.js","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"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"}
|
|
@@ -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":"AAAA;;;;GAIG;AACH,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AAEnC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAoB,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAC/G,OAAO,EAAE,eAAe,EAA2B,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAmB,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAWpF,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,gBAAgB;IAChB,iBAAiB;IACjB,qBAAqB;IACrB,gBAAgB;IAChB,SAAS;IACT,gBAAgB;CACR,CAAA;AAEV,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,SAAS;IACT,gBAAgB;CACR,CAAA;AAEV,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B;QACE,QAAQ,EAAE,UAAU;QACpB,KAAK,EAAE,UAAU;QACjB,SAAS,EAAE,iBAAiB;QAC5B,cAAc,EAAE,oBAAoB;KACrC;IACD;QACE,QAAQ,EAAE,wBAAwB;QAClC,cAAc,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;QAC5C,KAAK,EAAE,wBAAwB;QAC/B,SAAS,EAAE,uBAAuB;QAClC,cAAc,EAAE,0BAA0B;KAC3C;IACD;QACE,QAAQ,EAAE,eAAe;QACzB,aAAa,EAAE,UAAU;QACzB,KAAK,EAAE,eAAe;QACtB,SAAS,EAAE,qBAAqB;QAChC,cAAc,EAAE,oBAAoB;KACrC;CACwD,CAAA;AAI3D,MAAM,OAAO,oBAAqB,SAAQ,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAE/E;IACA,IAAa,OAAO;QAClB,OAAO,sBAAsB,IAAI,CAAC,QAAQ,EAAE,CAAA;IAC9C,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,IAAI,CAAC,WAAW,CAAC,yBAAyB,CAGrF;IACA,IAAa,OAAO;QAClB,OAAO,kCAAkC,IAAI,CAAC,SAAS,8BAA8B,IAAI,CAAC,aAAa,EAAE,CAAA;IAC3G,CAAC;CACF;AAYD,MAAM,aAAa,GAAG,CAAC,IAA6B,EAAU,EAAE,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAA;AAEpG,MAAM,eAAe,GAAG,CAAC,KAA6C,EAA0C,EAAE,CAChH,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC3B,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,CAC3F,CAAA;AAEH,MAAM,eAAe,GAAG,CACtB,IAA6B,EAK7B,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,CAAC,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAA;IACrC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAA;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAA;IACxD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACzF,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CACrD,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAC9F,CAAA;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QAC/B,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY;QACzC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;KACxB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjD,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAChC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CACrE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CACzC,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAuB,EAAE,CACpE,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;AAE/E,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,KAAiB,EACjB,cAAqC,EACd,EAAE;IACzB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAA;IAClC,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;AAC9D,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,IAA6B,EAK7B,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACrC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAChG,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/G,IAAI,CAAA;IACN,OAAO;QACL,IAAI;QACJ,aAAa,EAAE,SAAS;QACxB,aAAa;QACb,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,WAAW,EAAE,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QAC9G,aAAa,EAAE,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC;QACpG,eAAe,EAAE,MAAM,KAAK,IAAI;KACjC,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,QAAgD,eAAe,EAC/D,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAA;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAgB,EAChB,QAAgD,eAAe,EAK/D,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CACvD,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC,CAAA;IACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CACxC,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,CACtC,CAAC,IAAI,CAAC,CAAC,OAAO,EAA0B,EAAE,CACzC,OAAO,KAAK,IAAI,CACjB,CAAA;IACD,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;IAEhF,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE;QAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAA;QAClG,IAAI,CAAC,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAA;QACjC,OAAO,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAgD,eAAe,EAK/D,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC,UAAU,CAAA;IACvC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QACtD,MAAM,eAAe,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACtG,IAAI,eAAe;YAAE,OAAM;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YACrC,OAAM;QACR,CAAC;QACD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAChD,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,KAAK,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;QACjD,CAAC;IACH,CAAC,CAAC,CAAC,CAAA;IACL,OAAO,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA;AAEJ;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAAgD,eAAe,EAK/D,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CACrD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YACxG,IAAI,CAAA;QACN,IAAI,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAAE,OAAM;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;QAChD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC5G,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QAC3D,KAAK,CAAC,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAC,CAAA;IACL,OAAO,KAAK,CAAC,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAA;AAC7C,CAAC,CAAC,CAAA"}
|