@pantheon-systems/css-client 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/dist/auth.d.ts +54 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +72 -0
- package/dist/auth.js.map +1 -0
- package/dist/broker.d.ts +41 -0
- package/dist/broker.d.ts.map +1 -0
- package/dist/broker.js +187 -0
- package/dist/broker.js.map +1 -0
- package/dist/client.d.ts +138 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +130 -0
- package/dist/client.js.map +1 -0
- package/dist/content.d.ts +45 -0
- package/dist/content.d.ts.map +1 -0
- package/dist/content.js +65 -0
- package/dist/content.js.map +1 -0
- package/dist/endpoints/agent-edit.d.ts +79 -0
- package/dist/endpoints/agent-edit.d.ts.map +1 -0
- package/dist/endpoints/agent-edit.js +125 -0
- package/dist/endpoints/agent-edit.js.map +1 -0
- package/dist/endpoints/agent-registry.d.ts +59 -0
- package/dist/endpoints/agent-registry.d.ts.map +1 -0
- package/dist/endpoints/agent-registry.js +96 -0
- package/dist/endpoints/agent-registry.js.map +1 -0
- package/dist/endpoints/base.d.ts +49 -0
- package/dist/endpoints/base.d.ts.map +1 -0
- package/dist/endpoints/base.js +150 -0
- package/dist/endpoints/base.js.map +1 -0
- package/dist/endpoints/branches.d.ts +32 -0
- package/dist/endpoints/branches.d.ts.map +1 -0
- package/dist/endpoints/branches.js +69 -0
- package/dist/endpoints/branches.js.map +1 -0
- package/dist/endpoints/checkpoints.d.ts +36 -0
- package/dist/endpoints/checkpoints.d.ts.map +1 -0
- package/dist/endpoints/checkpoints.js +76 -0
- package/dist/endpoints/checkpoints.js.map +1 -0
- package/dist/endpoints/documents.d.ts +46 -0
- package/dist/endpoints/documents.d.ts.map +1 -0
- package/dist/endpoints/documents.js +101 -0
- package/dist/endpoints/documents.js.map +1 -0
- package/dist/endpoints/index.d.ts +15 -0
- package/dist/endpoints/index.d.ts.map +1 -0
- package/dist/endpoints/index.js +16 -0
- package/dist/endpoints/index.js.map +1 -0
- package/dist/endpoints/merge.d.ts +51 -0
- package/dist/endpoints/merge.d.ts.map +1 -0
- package/dist/endpoints/merge.js +104 -0
- package/dist/endpoints/merge.js.map +1 -0
- package/dist/endpoints/presence.d.ts +55 -0
- package/dist/endpoints/presence.d.ts.map +1 -0
- package/dist/endpoints/presence.js +72 -0
- package/dist/endpoints/presence.js.map +1 -0
- package/dist/endpoints/sites.d.ts +20 -0
- package/dist/endpoints/sites.d.ts.map +1 -0
- package/dist/endpoints/sites.js +38 -0
- package/dist/endpoints/sites.js.map +1 -0
- package/dist/endpoints/versions.d.ts +37 -0
- package/dist/endpoints/versions.d.ts.map +1 -0
- package/dist/endpoints/versions.js +64 -0
- package/dist/endpoints/versions.js.map +1 -0
- package/dist/errors.d.ts +61 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +87 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/jwt-utils.d.ts +13 -0
- package/dist/jwt-utils.d.ts.map +1 -0
- package/dist/jwt-utils.js +45 -0
- package/dist/jwt-utils.js.map +1 -0
- package/dist/oauth.d.ts +64 -0
- package/dist/oauth.d.ts.map +1 -0
- package/dist/oauth.js +62 -0
- package/dist/oauth.js.map +1 -0
- package/dist/realtime.d.ts +314 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +615 -0
- package/dist/realtime.js.map +1 -0
- package/dist/types.d.ts +703 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +17 -0
- package/dist/utils.js.map +1 -0
- package/package.json +56 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P1 Client Authentication Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for creating authentication providers.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Authentication provider function type.
|
|
8
|
+
* Returns the authorization header value.
|
|
9
|
+
*/
|
|
10
|
+
export type AuthProvider = () => Promise<string>;
|
|
11
|
+
/**
|
|
12
|
+
* Creates an API key authentication provider.
|
|
13
|
+
* Uses X-API-Key header format for agent API keys.
|
|
14
|
+
*
|
|
15
|
+
* @param apiKey - The API key to use
|
|
16
|
+
* @returns Auth provider function
|
|
17
|
+
*/
|
|
18
|
+
export declare function createApiKeyAuth(apiKey: string): AuthProvider;
|
|
19
|
+
/**
|
|
20
|
+
* Token storage interface for user authentication.
|
|
21
|
+
*/
|
|
22
|
+
export interface TokenStorage {
|
|
23
|
+
getToken(): Promise<string | null>;
|
|
24
|
+
setToken(token: string): Promise<void>;
|
|
25
|
+
clearToken(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates a token-based authentication provider.
|
|
29
|
+
*
|
|
30
|
+
* @param tokenStorage - Storage for the auth token
|
|
31
|
+
* @returns Auth provider function
|
|
32
|
+
*/
|
|
33
|
+
export declare function createTokenAuth(tokenStorage: TokenStorage): AuthProvider;
|
|
34
|
+
/**
|
|
35
|
+
* In-memory token storage implementation.
|
|
36
|
+
* Useful for testing or single-session apps.
|
|
37
|
+
*/
|
|
38
|
+
export declare class InMemoryTokenStorage implements TokenStorage {
|
|
39
|
+
private token;
|
|
40
|
+
getToken(): Promise<string | null>;
|
|
41
|
+
setToken(token: string): Promise<void>;
|
|
42
|
+
clearToken(): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Browser localStorage token storage implementation.
|
|
46
|
+
*/
|
|
47
|
+
export declare class LocalStorageTokenStorage implements TokenStorage {
|
|
48
|
+
private readonly key;
|
|
49
|
+
constructor(key?: string);
|
|
50
|
+
getToken(): Promise<string | null>;
|
|
51
|
+
setToken(token: string): Promise<void>;
|
|
52
|
+
clearToken(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAEjD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAE7D;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,YAAY,GAAG,YAAY,CAQxE;AAED;;;GAGG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,KAAK,CAAuB;IAE9B,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIlC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC;AAED;;GAEG;AACH,qBAAa,wBAAyB,YAAW,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,GAAE,MAAwB;IAEpD,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOlC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMtC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* P1 Client Authentication Utilities
|
|
3
|
+
*
|
|
4
|
+
* Functions for creating authentication providers.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Creates an API key authentication provider.
|
|
8
|
+
* Uses X-API-Key header format for agent API keys.
|
|
9
|
+
*
|
|
10
|
+
* @param apiKey - The API key to use
|
|
11
|
+
* @returns Auth provider function
|
|
12
|
+
*/
|
|
13
|
+
export function createApiKeyAuth(apiKey) {
|
|
14
|
+
return async () => `ApiKey ${apiKey}`;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Creates a token-based authentication provider.
|
|
18
|
+
*
|
|
19
|
+
* @param tokenStorage - Storage for the auth token
|
|
20
|
+
* @returns Auth provider function
|
|
21
|
+
*/
|
|
22
|
+
export function createTokenAuth(tokenStorage) {
|
|
23
|
+
return async () => {
|
|
24
|
+
const token = await tokenStorage.getToken();
|
|
25
|
+
if (!token) {
|
|
26
|
+
throw new Error('No authentication token available');
|
|
27
|
+
}
|
|
28
|
+
return `Bearer ${token}`;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* In-memory token storage implementation.
|
|
33
|
+
* Useful for testing or single-session apps.
|
|
34
|
+
*/
|
|
35
|
+
export class InMemoryTokenStorage {
|
|
36
|
+
token = null;
|
|
37
|
+
async getToken() {
|
|
38
|
+
return this.token;
|
|
39
|
+
}
|
|
40
|
+
async setToken(token) {
|
|
41
|
+
this.token = token;
|
|
42
|
+
}
|
|
43
|
+
async clearToken() {
|
|
44
|
+
this.token = null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Browser localStorage token storage implementation.
|
|
49
|
+
*/
|
|
50
|
+
export class LocalStorageTokenStorage {
|
|
51
|
+
key;
|
|
52
|
+
constructor(key = 'p1_auth_token') {
|
|
53
|
+
this.key = key;
|
|
54
|
+
}
|
|
55
|
+
async getToken() {
|
|
56
|
+
if (typeof localStorage === 'undefined') {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return localStorage.getItem(this.key);
|
|
60
|
+
}
|
|
61
|
+
async setToken(token) {
|
|
62
|
+
if (typeof localStorage !== 'undefined') {
|
|
63
|
+
localStorage.setItem(this.key, token);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async clearToken() {
|
|
67
|
+
if (typeof localStorage !== 'undefined') {
|
|
68
|
+
localStorage.removeItem(this.key);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=auth.js.map
|
package/dist/auth.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,KAAK,IAAI,EAAE,CAAC,UAAU,MAAM,EAAE,CAAC;AACxC,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,YAA0B;IACxD,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,QAAQ,EAAE,CAAC;QAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC;QACD,OAAO,UAAU,KAAK,EAAE,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,oBAAoB;IACvB,KAAK,GAAkB,IAAI,CAAC;IAEpC,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACN;IAA7B,YAA6B,MAAc,eAAe;QAA7B,QAAG,GAAH,GAAG,CAA0B;IAAG,CAAC;IAE9D,KAAK,CAAC,QAAQ;QACZ,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE,CAAC;YACxC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF"}
|
package/dist/broker.d.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broker Authentication
|
|
3
|
+
*
|
|
4
|
+
* Implements the brokered auth flow. Supports two modes:
|
|
5
|
+
*
|
|
6
|
+
* **Proxy mode** (default): calls go to /p1/auth/login and /p1/auth/redeem
|
|
7
|
+
* on the app's own server, which proxies to the CSS backend with the API key.
|
|
8
|
+
*
|
|
9
|
+
* **Direct mode**: when siteApiToken is provided, calls go straight to the
|
|
10
|
+
* CSS backend with a Bearer token. Used for standalone (non-Next.js) apps.
|
|
11
|
+
*
|
|
12
|
+
* Flow:
|
|
13
|
+
* 1. POST login endpoint → { transactionId, loginUrl }
|
|
14
|
+
* 2. Open loginUrl for the user (via onLoginUrl callback)
|
|
15
|
+
* 3. Poll POST redeem endpoint with transactionId until approved
|
|
16
|
+
* 4. Store the broker JWT and populate user info
|
|
17
|
+
*/
|
|
18
|
+
import type { OAuthSession, OAuthUserInfo } from './oauth.js';
|
|
19
|
+
export interface BrokerAuthConfig {
|
|
20
|
+
cssBaseUrl: string;
|
|
21
|
+
siteApiToken?: string;
|
|
22
|
+
onLoginUrl: (url: string) => void;
|
|
23
|
+
storageKey?: string;
|
|
24
|
+
pollIntervalMs?: number;
|
|
25
|
+
maxPollAttempts?: number;
|
|
26
|
+
signal?: AbortSignal;
|
|
27
|
+
loginMode?: 'popup' | 'redirect';
|
|
28
|
+
}
|
|
29
|
+
export interface BrokerRedeemResult {
|
|
30
|
+
token: string;
|
|
31
|
+
userInfo: OAuthUserInfo | null;
|
|
32
|
+
}
|
|
33
|
+
export interface BrokerRedeemConfig {
|
|
34
|
+
cssBaseUrl: string;
|
|
35
|
+
siteApiToken?: string;
|
|
36
|
+
storageKey?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function createBrokerAuth(config: BrokerAuthConfig): OAuthSession;
|
|
39
|
+
export declare function hasPendingBrokerLogin(): boolean;
|
|
40
|
+
export declare function redeemPendingBrokerLogin(config: BrokerRedeemConfig): Promise<BrokerRedeemResult | null>;
|
|
41
|
+
//# sourceMappingURL=broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../src/broker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9D,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;CAClC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAoBD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,YAAY,CAsHvE;AAED,wBAAgB,qBAAqB,IAAI,OAAO,CAG/C;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAqDpC"}
|
package/dist/broker.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broker Authentication
|
|
3
|
+
*
|
|
4
|
+
* Implements the brokered auth flow. Supports two modes:
|
|
5
|
+
*
|
|
6
|
+
* **Proxy mode** (default): calls go to /p1/auth/login and /p1/auth/redeem
|
|
7
|
+
* on the app's own server, which proxies to the CSS backend with the API key.
|
|
8
|
+
*
|
|
9
|
+
* **Direct mode**: when siteApiToken is provided, calls go straight to the
|
|
10
|
+
* CSS backend with a Bearer token. Used for standalone (non-Next.js) apps.
|
|
11
|
+
*
|
|
12
|
+
* Flow:
|
|
13
|
+
* 1. POST login endpoint → { transactionId, loginUrl }
|
|
14
|
+
* 2. Open loginUrl for the user (via onLoginUrl callback)
|
|
15
|
+
* 3. Poll POST redeem endpoint with transactionId until approved
|
|
16
|
+
* 4. Store the broker JWT and populate user info
|
|
17
|
+
*/
|
|
18
|
+
import { isTokenExpiredOrExpiring, extractUserInfo } from './jwt-utils.js';
|
|
19
|
+
import { sleep, trimTrailingSlash } from './utils.js';
|
|
20
|
+
const PENDING_TX_KEY = 'css_broker_pending_tx';
|
|
21
|
+
const PROXY_PATH = '/p1/auth';
|
|
22
|
+
function brokerEndpoint(config, action) {
|
|
23
|
+
if (config.siteApiToken) {
|
|
24
|
+
return `${trimTrailingSlash(config.cssBaseUrl)}/broker/${action}`;
|
|
25
|
+
}
|
|
26
|
+
return `${PROXY_PATH}/${action}`;
|
|
27
|
+
}
|
|
28
|
+
function brokerHeaders(config) {
|
|
29
|
+
if (config.siteApiToken) {
|
|
30
|
+
return { 'Authorization': `Bearer ${config.siteApiToken}` };
|
|
31
|
+
}
|
|
32
|
+
return {};
|
|
33
|
+
}
|
|
34
|
+
export function createBrokerAuth(config) {
|
|
35
|
+
const storageKey = config.storageKey ?? 'css_broker_token';
|
|
36
|
+
const pollIntervalMs = config.pollIntervalMs ?? 2000;
|
|
37
|
+
const maxPollAttempts = config.maxPollAttempts ?? 150;
|
|
38
|
+
const loginMode = config.loginMode ?? 'popup';
|
|
39
|
+
let userInfo = null;
|
|
40
|
+
const existingToken = typeof window !== 'undefined' ? window.localStorage.getItem(storageKey) : null;
|
|
41
|
+
if (existingToken) {
|
|
42
|
+
userInfo = extractUserInfo(existingToken);
|
|
43
|
+
}
|
|
44
|
+
const session = {
|
|
45
|
+
provider: 'broker',
|
|
46
|
+
async login() {
|
|
47
|
+
const loginResponse = await fetch(brokerEndpoint(config, 'login'), {
|
|
48
|
+
method: 'POST',
|
|
49
|
+
headers: brokerHeaders(config),
|
|
50
|
+
});
|
|
51
|
+
if (!loginResponse.ok) {
|
|
52
|
+
let detail = '';
|
|
53
|
+
try {
|
|
54
|
+
const body = await loginResponse.json();
|
|
55
|
+
if (body.error)
|
|
56
|
+
detail = `: ${body.error}`;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// non-JSON body — status code alone is still useful
|
|
60
|
+
}
|
|
61
|
+
throw new Error(`Broker login failed (${loginResponse.status})${detail}`);
|
|
62
|
+
}
|
|
63
|
+
const { transactionId, loginUrl } = (await loginResponse.json());
|
|
64
|
+
if (loginMode === 'redirect') {
|
|
65
|
+
if (typeof window !== 'undefined') {
|
|
66
|
+
window.sessionStorage.setItem(PENDING_TX_KEY, JSON.stringify({ transactionId }));
|
|
67
|
+
}
|
|
68
|
+
config.onLoginUrl(loginUrl);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
config.onLoginUrl(loginUrl);
|
|
72
|
+
for (let attempt = 0; attempt < maxPollAttempts; attempt++) {
|
|
73
|
+
if (config.signal?.aborted) {
|
|
74
|
+
throw new Error('Broker login aborted');
|
|
75
|
+
}
|
|
76
|
+
const redeemResponse = await fetch(brokerEndpoint(config, 'redeem'), {
|
|
77
|
+
method: 'POST',
|
|
78
|
+
headers: {
|
|
79
|
+
'Content-Type': 'application/json',
|
|
80
|
+
...brokerHeaders(config),
|
|
81
|
+
},
|
|
82
|
+
body: JSON.stringify({ transactionId }),
|
|
83
|
+
});
|
|
84
|
+
if (redeemResponse.ok) {
|
|
85
|
+
const { token } = (await redeemResponse.json());
|
|
86
|
+
if (typeof window !== 'undefined') {
|
|
87
|
+
window.localStorage.setItem(storageKey, token);
|
|
88
|
+
}
|
|
89
|
+
userInfo = extractUserInfo(token);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (redeemResponse.status === 410) {
|
|
93
|
+
throw new Error('Broker login failed: transaction expired');
|
|
94
|
+
}
|
|
95
|
+
if (redeemResponse.status === 400) {
|
|
96
|
+
throw new Error('Broker login failed: transaction rejected');
|
|
97
|
+
}
|
|
98
|
+
if (attempt < maxPollAttempts - 1) {
|
|
99
|
+
await sleep(pollIntervalMs, config.signal);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw new Error('Broker login timed out waiting for user approval');
|
|
103
|
+
},
|
|
104
|
+
async logout() {
|
|
105
|
+
if (typeof window !== 'undefined') {
|
|
106
|
+
window.localStorage.removeItem(storageKey);
|
|
107
|
+
}
|
|
108
|
+
userInfo = null;
|
|
109
|
+
},
|
|
110
|
+
isAuthenticated() {
|
|
111
|
+
if (typeof window === 'undefined')
|
|
112
|
+
return false;
|
|
113
|
+
const token = window.localStorage.getItem(storageKey);
|
|
114
|
+
if (!token)
|
|
115
|
+
return false;
|
|
116
|
+
return !isTokenExpiredOrExpiring(token);
|
|
117
|
+
},
|
|
118
|
+
getUserInfo() {
|
|
119
|
+
return userInfo;
|
|
120
|
+
},
|
|
121
|
+
async getToken() {
|
|
122
|
+
if (typeof window === 'undefined')
|
|
123
|
+
return null;
|
|
124
|
+
const token = window.localStorage.getItem(storageKey);
|
|
125
|
+
if (!token)
|
|
126
|
+
return null;
|
|
127
|
+
if (isTokenExpiredOrExpiring(token))
|
|
128
|
+
return null;
|
|
129
|
+
return token;
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
return session;
|
|
133
|
+
}
|
|
134
|
+
export function hasPendingBrokerLogin() {
|
|
135
|
+
if (typeof window === 'undefined')
|
|
136
|
+
return false;
|
|
137
|
+
return window.sessionStorage.getItem(PENDING_TX_KEY) !== null;
|
|
138
|
+
}
|
|
139
|
+
export async function redeemPendingBrokerLogin(config) {
|
|
140
|
+
if (typeof window === 'undefined')
|
|
141
|
+
return null;
|
|
142
|
+
const raw = window.sessionStorage.getItem(PENDING_TX_KEY);
|
|
143
|
+
if (!raw)
|
|
144
|
+
return null;
|
|
145
|
+
let transactionId;
|
|
146
|
+
try {
|
|
147
|
+
({ transactionId } = JSON.parse(raw));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
window.sessionStorage.removeItem(PENDING_TX_KEY);
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const storageKey = config.storageKey ?? 'css_broker_token';
|
|
154
|
+
const endpoint = config.siteApiToken
|
|
155
|
+
? `${trimTrailingSlash(config.cssBaseUrl)}/broker/redeem`
|
|
156
|
+
: `${PROXY_PATH}/redeem`;
|
|
157
|
+
const headers = {
|
|
158
|
+
'Content-Type': 'application/json',
|
|
159
|
+
};
|
|
160
|
+
if (config.siteApiToken) {
|
|
161
|
+
headers['Authorization'] = `Bearer ${config.siteApiToken}`;
|
|
162
|
+
}
|
|
163
|
+
const response = await fetch(endpoint, {
|
|
164
|
+
method: 'POST',
|
|
165
|
+
headers,
|
|
166
|
+
body: JSON.stringify({ transactionId }),
|
|
167
|
+
});
|
|
168
|
+
if (response.status === 410) {
|
|
169
|
+
window.sessionStorage.removeItem(PENDING_TX_KEY);
|
|
170
|
+
throw new Error('Broker login failed: transaction expired');
|
|
171
|
+
}
|
|
172
|
+
if (response.status === 400) {
|
|
173
|
+
window.sessionStorage.removeItem(PENDING_TX_KEY);
|
|
174
|
+
throw new Error('Broker login failed: transaction rejected');
|
|
175
|
+
}
|
|
176
|
+
if (!response.ok) {
|
|
177
|
+
throw new Error(`Broker redeem failed (${response.status})`);
|
|
178
|
+
}
|
|
179
|
+
window.sessionStorage.removeItem(PENDING_TX_KEY);
|
|
180
|
+
const { token } = (await response.json());
|
|
181
|
+
window.localStorage.setItem(storageKey, token);
|
|
182
|
+
return {
|
|
183
|
+
token,
|
|
184
|
+
userInfo: extractUserInfo(token),
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=broker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"broker.js","sourceRoot":"","sources":["../src/broker.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS Client
|
|
3
|
+
*
|
|
4
|
+
* Main client class for interacting with the Collaborative State System API.
|
|
5
|
+
*/
|
|
6
|
+
import type { AuthProvider } from './auth.js';
|
|
7
|
+
import type { Principal } from './types.js';
|
|
8
|
+
import { BaseEndpoint, SitesEndpoint, BranchesEndpoint, DocumentsEndpoint, VersionsEndpoint, CheckpointsEndpoint, PresenceEndpoint, AgentRegistryEndpoint, AgentEditEndpoint, MergeEndpoint } from './endpoints/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Configuration options for P1Client.
|
|
11
|
+
*/
|
|
12
|
+
export interface P1ClientConfig {
|
|
13
|
+
/**
|
|
14
|
+
* Base URL of the P1 API.
|
|
15
|
+
* Example: "https://api.example.com" or "http://localhost:8787"
|
|
16
|
+
*/
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
/**
|
|
19
|
+
* Optional API key for authentication.
|
|
20
|
+
* If provided, will be used as Bearer token.
|
|
21
|
+
*/
|
|
22
|
+
apiKey?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Optional custom authentication provider.
|
|
25
|
+
* Takes precedence over apiKey if both are provided.
|
|
26
|
+
*/
|
|
27
|
+
authProvider?: AuthProvider;
|
|
28
|
+
/**
|
|
29
|
+
* Optional default principal for API requests.
|
|
30
|
+
* Can be overridden per-request using withPrincipal().
|
|
31
|
+
*/
|
|
32
|
+
principal?: Principal;
|
|
33
|
+
/**
|
|
34
|
+
* Optional token refresher for dynamic token management.
|
|
35
|
+
* Called when a 401 Unauthorized response is received.
|
|
36
|
+
* Should return a fresh token or null if the session cannot be refreshed.
|
|
37
|
+
* If null is returned, or if the retry with the fresh token also returns 401,
|
|
38
|
+
* a SessionExpiredError is thrown.
|
|
39
|
+
*/
|
|
40
|
+
tokenRefresher?: () => Promise<string | null>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Internal configuration passed to private constructor.
|
|
44
|
+
*/
|
|
45
|
+
interface InternalConfig {
|
|
46
|
+
baseEndpoint: BaseEndpoint;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Client for the Collaborative State System API.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const client = new P1Client({
|
|
54
|
+
* baseUrl: 'http://localhost:8787',
|
|
55
|
+
* apiKey: 'your-api-key',
|
|
56
|
+
* principal: { id: 'user-123', type: 'user' },
|
|
57
|
+
* });
|
|
58
|
+
*
|
|
59
|
+
* // List sites
|
|
60
|
+
* const sites = await client.sites.list();
|
|
61
|
+
*
|
|
62
|
+
* // Get branches for a site
|
|
63
|
+
* const branches = await client.branches.list(siteId);
|
|
64
|
+
*
|
|
65
|
+
* // Create a document version
|
|
66
|
+
* const version = await client.versions.create(siteId, {
|
|
67
|
+
* documentId: 'doc-123',
|
|
68
|
+
* branchId: 'branch-456',
|
|
69
|
+
* snapshot: { content: [], root: {} },
|
|
70
|
+
* });
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare class P1Client {
|
|
74
|
+
private readonly baseEndpoint;
|
|
75
|
+
/**
|
|
76
|
+
* Site operations.
|
|
77
|
+
*/
|
|
78
|
+
readonly sites: SitesEndpoint;
|
|
79
|
+
/**
|
|
80
|
+
* Branch operations.
|
|
81
|
+
*/
|
|
82
|
+
readonly branches: BranchesEndpoint;
|
|
83
|
+
/**
|
|
84
|
+
* Document operations.
|
|
85
|
+
*/
|
|
86
|
+
readonly documents: DocumentsEndpoint;
|
|
87
|
+
/**
|
|
88
|
+
* Document version operations.
|
|
89
|
+
*/
|
|
90
|
+
readonly versions: VersionsEndpoint;
|
|
91
|
+
/**
|
|
92
|
+
* Checkpoint operations.
|
|
93
|
+
*/
|
|
94
|
+
readonly checkpoints: CheckpointsEndpoint;
|
|
95
|
+
/**
|
|
96
|
+
* Presence queries for sites, branches, and agents.
|
|
97
|
+
*/
|
|
98
|
+
readonly presence: PresenceEndpoint;
|
|
99
|
+
/**
|
|
100
|
+
* Agent registry operations.
|
|
101
|
+
*/
|
|
102
|
+
readonly agentRegistry: AgentRegistryEndpoint;
|
|
103
|
+
/**
|
|
104
|
+
* Agent edit workflow operations.
|
|
105
|
+
*/
|
|
106
|
+
readonly agentEdit: AgentEditEndpoint;
|
|
107
|
+
/**
|
|
108
|
+
* Merge operations (checks, previews, execution, merge requests).
|
|
109
|
+
*/
|
|
110
|
+
readonly merge: MergeEndpoint;
|
|
111
|
+
constructor(config: P1ClientConfig | InternalConfig);
|
|
112
|
+
/**
|
|
113
|
+
* Create a new client instance with a different principal.
|
|
114
|
+
* Useful for making requests on behalf of different users.
|
|
115
|
+
*
|
|
116
|
+
* @param principal - The principal to use for requests
|
|
117
|
+
* @returns A new P1Client instance with the updated principal
|
|
118
|
+
*/
|
|
119
|
+
withPrincipal(principal: Principal): P1Client;
|
|
120
|
+
/**
|
|
121
|
+
* Create a new client instance with session ID for agent authorization.
|
|
122
|
+
* The session ID is obtained from startEdit() and enables server-side
|
|
123
|
+
* enforcement of the Agent Politeness Protocol.
|
|
124
|
+
*
|
|
125
|
+
* @param sessionId - The session ID from startEdit()
|
|
126
|
+
* @returns A new P1Client instance with the session ID set
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* ```typescript
|
|
130
|
+
* const session = await client.agentEdit.startEdit(siteId, branchId, docPath, context);
|
|
131
|
+
* const authorizedClient = client.withSessionId(session.sessionId);
|
|
132
|
+
* await authorizedClient.versions.create(siteId, params);
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
withSessionId(sessionId: string): P1Client;
|
|
136
|
+
}
|
|
137
|
+
export {};
|
|
138
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,EACd,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAEtB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,UAAU,cAAc;IACtB,YAAY,EAAE,YAAY,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAE5C;;OAEG;IACH,SAAgB,KAAK,EAAE,aAAa,CAAC;IAErC;;OAEG;IACH,SAAgB,QAAQ,EAAE,gBAAgB,CAAC;IAE3C;;OAEG;IACH,SAAgB,SAAS,EAAE,iBAAiB,CAAC;IAE7C;;OAEG;IACH,SAAgB,QAAQ,EAAE,gBAAgB,CAAC;IAE3C;;OAEG;IACH,SAAgB,WAAW,EAAE,mBAAmB,CAAC;IAEjD;;OAEG;IACH,SAAgB,QAAQ,EAAE,gBAAgB,CAAC;IAE3C;;OAEG;IACH,SAAgB,aAAa,EAAE,qBAAqB,CAAC;IAErD;;OAEG;IACH,SAAgB,SAAS,EAAE,iBAAiB,CAAC;IAE7C;;OAEG;IACH,SAAgB,KAAK,EAAE,aAAa,CAAC;gBAEzB,MAAM,EAAE,cAAc,GAAG,cAAc;IAkCnD;;;;;;OAMG;IACH,aAAa,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ;IAK7C;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ;CAI3C"}
|
package/dist/client.js
ADDED
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CSS Client
|
|
3
|
+
*
|
|
4
|
+
* Main client class for interacting with the Collaborative State System API.
|
|
5
|
+
*/
|
|
6
|
+
import { BaseEndpoint, SitesEndpoint, BranchesEndpoint, DocumentsEndpoint, VersionsEndpoint, CheckpointsEndpoint, PresenceEndpoint, AgentRegistryEndpoint, AgentEditEndpoint, MergeEndpoint, } from './endpoints/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Client for the Collaborative State System API.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const client = new P1Client({
|
|
13
|
+
* baseUrl: 'http://localhost:8787',
|
|
14
|
+
* apiKey: 'your-api-key',
|
|
15
|
+
* principal: { id: 'user-123', type: 'user' },
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // List sites
|
|
19
|
+
* const sites = await client.sites.list();
|
|
20
|
+
*
|
|
21
|
+
* // Get branches for a site
|
|
22
|
+
* const branches = await client.branches.list(siteId);
|
|
23
|
+
*
|
|
24
|
+
* // Create a document version
|
|
25
|
+
* const version = await client.versions.create(siteId, {
|
|
26
|
+
* documentId: 'doc-123',
|
|
27
|
+
* branchId: 'branch-456',
|
|
28
|
+
* snapshot: { content: [], root: {} },
|
|
29
|
+
* });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class P1Client {
|
|
33
|
+
baseEndpoint;
|
|
34
|
+
/**
|
|
35
|
+
* Site operations.
|
|
36
|
+
*/
|
|
37
|
+
sites;
|
|
38
|
+
/**
|
|
39
|
+
* Branch operations.
|
|
40
|
+
*/
|
|
41
|
+
branches;
|
|
42
|
+
/**
|
|
43
|
+
* Document operations.
|
|
44
|
+
*/
|
|
45
|
+
documents;
|
|
46
|
+
/**
|
|
47
|
+
* Document version operations.
|
|
48
|
+
*/
|
|
49
|
+
versions;
|
|
50
|
+
/**
|
|
51
|
+
* Checkpoint operations.
|
|
52
|
+
*/
|
|
53
|
+
checkpoints;
|
|
54
|
+
/**
|
|
55
|
+
* Presence queries for sites, branches, and agents.
|
|
56
|
+
*/
|
|
57
|
+
presence;
|
|
58
|
+
/**
|
|
59
|
+
* Agent registry operations.
|
|
60
|
+
*/
|
|
61
|
+
agentRegistry;
|
|
62
|
+
/**
|
|
63
|
+
* Agent edit workflow operations.
|
|
64
|
+
*/
|
|
65
|
+
agentEdit;
|
|
66
|
+
/**
|
|
67
|
+
* Merge operations (checks, previews, execution, merge requests).
|
|
68
|
+
*/
|
|
69
|
+
merge;
|
|
70
|
+
constructor(config) {
|
|
71
|
+
// Check if this is an internal config (has baseEndpoint)
|
|
72
|
+
if ('baseEndpoint' in config) {
|
|
73
|
+
this.baseEndpoint = config.baseEndpoint;
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Create auth provider from API key if provided
|
|
77
|
+
// Use "ApiKey " prefix to signal X-API-Key header should be used
|
|
78
|
+
const authProvider = config.authProvider ?? (config.apiKey ? async () => `ApiKey ${config.apiKey}` : undefined);
|
|
79
|
+
this.baseEndpoint = new BaseEndpoint({
|
|
80
|
+
baseUrl: config.baseUrl,
|
|
81
|
+
authProvider,
|
|
82
|
+
principal: config.principal,
|
|
83
|
+
tokenRefresher: config.tokenRefresher,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
// Initialize endpoint instances
|
|
87
|
+
this.sites = new SitesEndpoint(this.baseEndpoint);
|
|
88
|
+
this.branches = new BranchesEndpoint(this.baseEndpoint);
|
|
89
|
+
this.documents = new DocumentsEndpoint(this.baseEndpoint);
|
|
90
|
+
this.versions = new VersionsEndpoint(this.baseEndpoint);
|
|
91
|
+
this.checkpoints = new CheckpointsEndpoint(this.baseEndpoint);
|
|
92
|
+
// Agent Politeness endpoints
|
|
93
|
+
this.presence = new PresenceEndpoint(this.baseEndpoint);
|
|
94
|
+
this.agentRegistry = new AgentRegistryEndpoint(this.baseEndpoint);
|
|
95
|
+
this.agentEdit = new AgentEditEndpoint(this.baseEndpoint);
|
|
96
|
+
// Merge endpoints
|
|
97
|
+
this.merge = new MergeEndpoint(this.baseEndpoint);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create a new client instance with a different principal.
|
|
101
|
+
* Useful for making requests on behalf of different users.
|
|
102
|
+
*
|
|
103
|
+
* @param principal - The principal to use for requests
|
|
104
|
+
* @returns A new P1Client instance with the updated principal
|
|
105
|
+
*/
|
|
106
|
+
withPrincipal(principal) {
|
|
107
|
+
const newBaseEndpoint = this.baseEndpoint.withPrincipal(principal);
|
|
108
|
+
return new P1Client({ baseEndpoint: newBaseEndpoint });
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a new client instance with session ID for agent authorization.
|
|
112
|
+
* The session ID is obtained from startEdit() and enables server-side
|
|
113
|
+
* enforcement of the Agent Politeness Protocol.
|
|
114
|
+
*
|
|
115
|
+
* @param sessionId - The session ID from startEdit()
|
|
116
|
+
* @returns A new P1Client instance with the session ID set
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* const session = await client.agentEdit.startEdit(siteId, branchId, docPath, context);
|
|
121
|
+
* const authorizedClient = client.withSessionId(session.sessionId);
|
|
122
|
+
* await authorizedClient.versions.create(siteId, params);
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
withSessionId(sessionId) {
|
|
126
|
+
const newBaseEndpoint = this.baseEndpoint.withSessionId(sessionId);
|
|
127
|
+
return new P1Client({ baseEndpoint: newBaseEndpoint });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,aAAa,GACd,MAAM,sBAAsB,CAAC;AA+C9B;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,OAAO,QAAQ;IACF,YAAY,CAAe;IAE5C;;OAEG;IACa,KAAK,CAAgB;IAErC;;OAEG;IACa,QAAQ,CAAmB;IAE3C;;OAEG;IACa,SAAS,CAAoB;IAE7C;;OAEG;IACa,QAAQ,CAAmB;IAE3C;;OAEG;IACa,WAAW,CAAsB;IAEjD;;OAEG;IACa,QAAQ,CAAmB;IAE3C;;OAEG;IACa,aAAa,CAAwB;IAErD;;OAEG;IACa,SAAS,CAAoB;IAE7C;;OAEG;IACa,KAAK,CAAgB;IAErC,YAAY,MAAuC;QACjD,yDAAyD;QACzD,IAAI,cAAc,IAAI,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,gDAAgD;YAChD,iEAAiE;YACjE,MAAM,YAAY,GAChB,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAE7F,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,YAAY;gBACZ,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,cAAc,EAAE,MAAM,CAAC,cAAc;aACtC,CAAC,CAAC;QACL,CAAC;QAED,gCAAgC;QAChC,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE9D,6BAA6B;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,IAAI,CAAC,aAAa,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAClE,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAE1D,kBAAkB;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,aAAa,CAAC,SAAoB;QAChC,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACnE,OAAO,IAAI,QAAQ,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC;IACzD,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,aAAa,CAAC,SAAiB;QAC7B,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QACnE,OAAO,IAAI,QAAQ,CAAC,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC,CAAC;IACzD,CAAC;CACF"}
|