@hiver/connector-admin 4.21.2 → 4.22.0-appsActivation-beta.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/index.d.ts +18 -1
- package/index.d.ts.map +1 -1
- package/index.es.js +11181 -10788
- package/index.umd.js +821 -679
- package/package.json +1 -1
- package/v2/app/connectors/pages/app-detail/index.d.ts.map +1 -1
- package/v2/app/connectors/pages/app-detail/registry.d.ts.map +1 -1
- package/v2/app/connectors/pages/app-detail/style.d.ts +9 -0
- package/v2/app/connectors/pages/app-detail/style.d.ts.map +1 -1
- package/v2/constants/global-constants.d.ts +1 -0
- package/v2/constants/global-constants.d.ts.map +1 -1
- package/v2/features/auth/components/connector-auth-card/__tests__/auth-card.test.d.ts +2 -0
- package/v2/features/auth/components/connector-auth-card/__tests__/auth-card.test.d.ts.map +1 -0
- package/v2/features/auth/components/connector-auth-card/index.d.ts +3 -0
- package/v2/features/auth/components/connector-auth-card/index.d.ts.map +1 -0
- package/v2/features/auth/components/connector-auth-card/styles.d.ts +51 -0
- package/v2/features/auth/components/connector-auth-card/styles.d.ts.map +1 -0
- package/v2/features/auth/components/connector-auth-card/types.d.ts +111 -0
- package/v2/features/auth/components/connector-auth-card/types.d.ts.map +1 -0
- package/v2/features/clickup/__tests__/clickup-controller.test.d.ts +2 -0
- package/v2/features/clickup/__tests__/clickup-controller.test.d.ts.map +1 -0
- package/v2/features/clickup/controller.d.ts +28 -0
- package/v2/features/clickup/controller.d.ts.map +1 -0
- package/v2/testing/mocks/handlers/connector-template.d.ts.map +1 -1
- package/v2/testing/test-utils.d.ts +11 -1
- package/v2/testing/test-utils.d.ts.map +1 -1
- package/v2/types/exposedTypes.d.ts +11 -0
- package/v2/types/exposedTypes.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/app/connectors/pages/app-detail/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/app/connectors/pages/app-detail/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAA4D,MAAM,OAAO,CAAC;AA4BrF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAuC9C,UAAU,kBAAkB;IAC1B;;;;;;;;OAQG;IACH,IAAI,EAAE,aAAa,CAAC;CACrB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAgGhD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/app/connectors/pages/app-detail/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/app/connectors/pages/app-detail/registry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAGpE,CAAC;AAEF,eAAO,MAAM,oBAAoB,kBAAmB,MAAM,KAAG,iBAAiB,GAAG,IAClC,CAAC;AAEhD,eAAO,MAAM,oBAAoB,kBAAmB,MAAM,KAAG,OAAkD,CAAC"}
|
|
@@ -8,6 +8,15 @@ export declare const LogoCard: StyledComponent<BoxProps>;
|
|
|
8
8
|
export declare const LogoInner: StyledComponent<BoxProps>;
|
|
9
9
|
export declare const HeaderTextColumn: StyledComponent<BoxProps>;
|
|
10
10
|
export declare const PrimaryHeaderButton: StyledComponent<ButtonProps>;
|
|
11
|
+
/**
|
|
12
|
+
* The outlined sibling of `PrimaryHeaderButton`.
|
|
13
|
+
*
|
|
14
|
+
* Exists so `Setup with AI` can sit beside the existing CTA as the filled
|
|
15
|
+
* action without restyling it — the header slot used to hold exactly one
|
|
16
|
+
* control, and the flag-off path has to leave it looking untouched.
|
|
17
|
+
*/
|
|
18
|
+
export declare const SecondaryHeaderButton: StyledComponent<ButtonProps>;
|
|
19
|
+
export declare const HeaderActions: StyledComponent<BoxProps>;
|
|
11
20
|
export declare const OverviewGrid: StyledComponent<BoxProps>;
|
|
12
21
|
export declare const IllustrationShell: StyledComponent<BoxProps>;
|
|
13
22
|
export declare const FeatureSnapshotRow: StyledComponent<BoxProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/app/connectors/pages/app-detail/style.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,QAAQ,CAMhD,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAiB9C,CAAC;AAKF,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,QAAQ,CAM/C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,QAAQ,CAMhD,CAAC;AAKF,eAAO,MAAM,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAS9C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,QAAQ,CAW/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAMtD,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAAC,WAAW,CAiB5D,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,QAAQ,CAMlD,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,QAAQ,CAYvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC,QAAQ,CAIxD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAAC,QAAQ,CAezD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,QAAQ,CAKnD,CAAC;AAKF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC,QAAQ,CAMxD,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAItD,CAAC;AAQF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CA4DtD,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAKtD,CAAC"}
|
|
1
|
+
{"version":3,"file":"style.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/app/connectors/pages/app-detail/style.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,QAAQ,CAMhD,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAiB9C,CAAC;AAKF,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,QAAQ,CAM/C,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,QAAQ,CAMhD,CAAC;AAKF,eAAO,MAAM,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAS9C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,QAAQ,CAW/C,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAMtD,CAAC;AAGF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAAC,WAAW,CAiB5D,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,eAAe,CAAC,WAAW,CAgB9D,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,QAAQ,CAKnD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,QAAQ,CAMlD,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,QAAQ,CAYvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC,QAAQ,CAIxD,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAAC,QAAQ,CAezD,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,QAAQ,CAKnD,CAAC;AAKF,eAAO,MAAM,kBAAkB,EAAE,eAAe,CAAC,QAAQ,CAMxD,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAItD,CAAC;AAQF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CA4DtD,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,eAAe,CAAC,QAAQ,CAKtD,CAAC"}
|
|
@@ -12,6 +12,7 @@ export declare const FTR_INTEGRATION_SENSE = "ftr-integration-sense-ui";
|
|
|
12
12
|
export declare const FTR_QUICK_ACCESS = "ftr-connectors-quick-actions";
|
|
13
13
|
export declare const FTR_EMAIL_LOGGING = "ftr-ci-log-emails";
|
|
14
14
|
export declare const FTR_APP_CUSTOM_FIELDS = "ftr-app-custom-fields";
|
|
15
|
+
export declare const FTR_SETUP_WITH_AI = "ftr-connectors-setup-with-ai";
|
|
15
16
|
export declare const FTR_USER_AUTH = "ftr-ci-user-auth";
|
|
16
17
|
export declare const CUSTOM_CONNECTORS = "Apps";
|
|
17
18
|
export declare const HIGHER_PLAN = "On a higher plan";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-constants.d.ts","sourceRoot":"","sources":["../../../src/v2/constants/global-constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,wCAAwC,2CAA2C,CAAC;AACjG,eAAO,MAAM,0CAA0C,uCAAuC,CAAC;AAC/F,eAAO,MAAM,2BAA2B,qCAAqC,CAAC;AAC9E,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,iBAAiB,2CAA2C,CAAC;AAO1E,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AACtE,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"global-constants.d.ts","sourceRoot":"","sources":["../../../src/v2/constants/global-constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,uBAAuB,2BAA2B,CAAC;AAChE,eAAO,MAAM,wCAAwC,2CAA2C,CAAC;AACjG,eAAO,MAAM,0CAA0C,uCAAuC,CAAC;AAC/F,eAAO,MAAM,2BAA2B,qCAAqC,CAAC;AAC9E,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,iBAAiB,2CAA2C,CAAC;AAO1E,eAAO,MAAM,oBAAoB,oCAAoC,CAAC;AACtE,eAAO,MAAM,qBAAqB,6BAA6B,CAAC;AAChE,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAC/D,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,iBAAiB,iCAAiC,CAAC;AAIhE,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAEhD,eAAO,MAAM,iBAAiB,SAAS,CAAC;AACxC,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,eAAO,MAAM,wBAAwB,4GAA4G,CAAC;AAClJ,eAAO,MAAM,OAAO,YAAY,CAAC;AACjC,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,cAAc,wBAAwB,CAAC;AACpD,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,YAAY,yDAAyD,CAAC;AACnF,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,cAAc,SAAS,CAAC;AACrC,eAAO,MAAM,yBAAyB,0BAA0B,CAAC;AACjE,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,kBAAkB,0BAA0B,CAAC;AAE1D,eAAO,MAAM,sBAAsB,yDAAyD,CAAC;AAC7F,eAAO,MAAM,qBAAqB,mDAAmD,CAAC;AACtF,eAAO,MAAM,iBAAiB,qDAAqD,CAAC;AACpF,eAAO,MAAM,oBAAoB,+DAA+D,CAAC;AACjG,eAAO,MAAM,kBAAkB,yCAAyC,CAAC;AACzE,eAAO,MAAM,2BAA2B,+FACsD,CAAC;AAC/F,eAAO,MAAM,4BAA4B,8CAA8C,CAAC;AACxF,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AACvE,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,uBAAuB,+BAA+B,CAAC;AACpE;;;;;;;;;;GAUG;AACH,eAAO,MAAM,qBAAqB,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-card.test.d.ts","sourceRoot":"","sources":["../../../../../../../src/v2/features/auth/components/connector-auth-card/__tests__/auth-card.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { IConnectorAuthCardProps } from './types';
|
|
2
|
+
export declare const ConnectorAuthCard: ({ title, provider, description, connectionStatus, authorizeUrl, ctaLabel, manualAuth, state, error, onOutcome, onManualSubmit }: IConnectorAuthCardProps) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/features/auth/components/connector-auth-card/index.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,uBAAuB,EAExB,MAAM,SAAS,CAAC;AAwEjB,eAAO,MAAM,iBAAiB,oIAY3B,uBAAuB,4CA+OzB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { BoxProps, ButtonProps, StackProps, TypographyProps } from '@hiver/hiver-ui-kit';
|
|
2
|
+
import { StyledComponent } from '@emotion/styled';
|
|
3
|
+
import { LabelHTMLAttributes } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* The card surface, read off `30534` rather than approximated.
|
|
6
|
+
*
|
|
7
|
+
* Three corrections from the first pass: the radius is **14px** (was 8), it
|
|
8
|
+
* carries the sheet's `elevation/xs` drop shadow (had none), and it holds **no
|
|
9
|
+
* padding or gap of its own** — the three rows below own their insets, which is
|
|
10
|
+
* what makes their 51/73/64px heights land exactly.
|
|
11
|
+
*
|
|
12
|
+
* The typeface is **Inter**. It was `'Hanken Grotesk', system-ui, sans-serif`,
|
|
13
|
+
* a font no host loads, so the card fell through to a serif while every widget
|
|
14
|
+
* beside it in the assistant's turn stream was Inter. `font-family/sans` on the
|
|
15
|
+
* component sheet is Inter, and `AppDetailPage` already forces it for the same
|
|
16
|
+
* reason on its own agent-facing screen.
|
|
17
|
+
*/
|
|
18
|
+
export declare const CardShell: StyledComponent<BoxProps>;
|
|
19
|
+
/** `30534` — header 51px, app row 73px, footer 64px, each inset 16px. */
|
|
20
|
+
export declare const HeaderRow: StyledComponent<StackProps>;
|
|
21
|
+
export declare const CardTitle: StyledComponent<TypographyProps>;
|
|
22
|
+
export declare const AppRow: StyledComponent<StackProps>;
|
|
23
|
+
export declare const FooterRow: StyledComponent<StackProps>;
|
|
24
|
+
export declare const ProviderLogo: StyledComponent<BoxProps>;
|
|
25
|
+
export declare const ProviderName: StyledComponent<TypographyProps>;
|
|
26
|
+
export declare const Description: StyledComponent<TypographyProps>;
|
|
27
|
+
/**
|
|
28
|
+
* Status: a dot and a label, nothing more.
|
|
29
|
+
*
|
|
30
|
+
* `30534` draws a 75x18 frame holding a 6px ellipse and text at a 6px gap. The
|
|
31
|
+
* pill treatment this had — subtle background, 10px inset, 12px radius — is not
|
|
32
|
+
* in the design and made the status read as a chip rather than an annotation.
|
|
33
|
+
*/
|
|
34
|
+
export declare const StatusPill: StyledComponent<BoxProps>;
|
|
35
|
+
/**
|
|
36
|
+
* The status dot — **6px**, as `30534` draws it, not 8.
|
|
37
|
+
*
|
|
38
|
+
* Three colours for four states, deliberately: the colour says "is this
|
|
39
|
+
* finished", and the label says which unfinished state it is. Grey before any
|
|
40
|
+
* credentials, amber while connected but not live, green once enabled.
|
|
41
|
+
*/
|
|
42
|
+
export declare const StatusDot: StyledComponent<BoxProps & {
|
|
43
|
+
tone?: 'idle' | 'pending' | 'live';
|
|
44
|
+
}>;
|
|
45
|
+
export declare const ConnectButton: StyledComponent<ButtonProps>;
|
|
46
|
+
export declare const ManualSection: StyledComponent<StackProps>;
|
|
47
|
+
export declare const Instructions: StyledComponent<TypographyProps>;
|
|
48
|
+
export declare const FieldColumn: StyledComponent<StackProps>;
|
|
49
|
+
export declare const FieldLabel: StyledComponent<LabelHTMLAttributes<HTMLLabelElement>>;
|
|
50
|
+
export declare const ActionsRow: StyledComponent<StackProps>;
|
|
51
|
+
//# sourceMappingURL=styles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/features/auth/components/connector-auth-card/styles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC9F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAMjD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,QAAQ,CAY/C,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,UAAU,CAQjD,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,eAAe,CAKtD,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,eAAe,CAAC,UAAU,CAO9C,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,UAAU,CAOjD,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,QAAQ,CAclD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,eAAe,CAMzD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,CAAC,eAAe,CAIxD,CAAC;AAIF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,QAAQ,CAShD,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,eAAe,CAAC,QAAQ,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAAA;CAAE,CAcxF,CAAC;AAKF,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,WAAW,CAqBtD,CAAC;AAIF,eAAO,MAAM,aAAa,EAAE,eAAe,CAAC,UAAU,CAIrD,CAAC;AAIF,eAAO,MAAM,YAAY,EAAE,eAAe,CAAC,eAAe,CAKzD,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,eAAe,CAAC,UAAU,CAEnD,CAAC;AAIF,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAO7E,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,UAAU,CAIlD,CAAC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prop contract for <ConnectorAuthCard>.
|
|
3
|
+
*
|
|
4
|
+
* This file is PUBLISHED — `apps/admin/src/index.ts` re-exports these types
|
|
5
|
+
* from `@hiver/connector-admin`, and the `web` assistant is the consumer. Treat
|
|
6
|
+
* every shape here as a cross-repo contract: widening is additive and safe,
|
|
7
|
+
* renaming or narrowing is a breaking change that needs a major changeset.
|
|
8
|
+
*
|
|
9
|
+
* The card owns the OAuth popup end-to-end. `web` supplies a server-built
|
|
10
|
+
* `authorizeUrl` (it carries the OAuth `state`) and receives an outcome — it
|
|
11
|
+
* never sees `openOAuthPopup`, the AUTH_SUCCESS_MSG wire literal, or the
|
|
12
|
+
* auth-success bouncer page.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* The five terminal outcomes of the popup flow, mirroring `OAuthPopupOutcome`
|
|
16
|
+
* in `@/v2/features/auth/utils/oauthPopup`. Re-declared (rather than
|
|
17
|
+
* re-exported) so the published contract doesn't drag the popup helper's
|
|
18
|
+
* module onto the public surface.
|
|
19
|
+
*
|
|
20
|
+
* - `success` — the bouncer posted back an authenticated token
|
|
21
|
+
* - `failed` — the bouncer posted back a failure
|
|
22
|
+
* - `cancelled` — the admin closed the popup mid-flow
|
|
23
|
+
* - `timeout` — no resolution within the popup helper's 5-minute budget
|
|
24
|
+
* - `blocked` — `window.open` returned null (popup blocker)
|
|
25
|
+
*/
|
|
26
|
+
export type ConnectorAuthOutcome = 'success' | 'failed' | 'cancelled' | 'timeout' | 'blocked';
|
|
27
|
+
/**
|
|
28
|
+
* The connector's lifecycle state, as the admin sees it.
|
|
29
|
+
*
|
|
30
|
+
* Four states, not two. `30534` draws status as a dot and a label in this card's
|
|
31
|
+
* header and nowhere else — there is no app-level status surface anywhere in the
|
|
32
|
+
* flow — while QA asserts on four distinct values: TC-009 expects
|
|
33
|
+
* *"Authenticated but disabled"* for an interrupted setup, and TC-017 requires
|
|
34
|
+
* `Enabled` to be *"distinct from Authenticated but disabled"*. A binary
|
|
35
|
+
* connected/not-connected cannot express either.
|
|
36
|
+
*
|
|
37
|
+
* So the design's one status surface carries the model QA tests. Widening this
|
|
38
|
+
* is what lets both be true at once.
|
|
39
|
+
*/
|
|
40
|
+
export type ConnectorAuthConnectionStatus = 'not_connected' | 'authenticated' | 'authenticated_disabled' | 'enabled';
|
|
41
|
+
/**
|
|
42
|
+
* The card's host-driven lifecycle state.
|
|
43
|
+
* - `pending` — waiting on the admin (or on a submit the host is running)
|
|
44
|
+
* - `complete` — the host has accepted the credentials; the card goes inert
|
|
45
|
+
* - `error` — render `error` per D-16
|
|
46
|
+
*/
|
|
47
|
+
export type ConnectorAuthCardState = 'pending' | 'complete' | 'error';
|
|
48
|
+
/** Input type for one manual-auth field. `password` is masked (D-17). */
|
|
49
|
+
export type ConnectorAuthFieldType = 'text' | 'password' | 'url';
|
|
50
|
+
export interface IConnectorAuthProvider {
|
|
51
|
+
/** Connector type, e.g. `clickup`. Not rendered — used for keys/telemetry. */
|
|
52
|
+
key: string;
|
|
53
|
+
/** Display name, e.g. `ClickUp`. */
|
|
54
|
+
name: string;
|
|
55
|
+
logoUrl?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface IConnectorAuthField {
|
|
58
|
+
key: string;
|
|
59
|
+
label: string;
|
|
60
|
+
type: ConnectorAuthFieldType;
|
|
61
|
+
/** Blocks submit while empty, and renders the D-17 validation-error state. */
|
|
62
|
+
required?: boolean;
|
|
63
|
+
/** Rendered disabled — a value the admin copies out, not one they fill in. */
|
|
64
|
+
readonly?: boolean;
|
|
65
|
+
/** Adds the copy-to-clipboard adornment (e.g. a redirect URL). */
|
|
66
|
+
copyable?: boolean;
|
|
67
|
+
/** Prefill. `readonly` fields are expected to carry one. */
|
|
68
|
+
value?: string;
|
|
69
|
+
}
|
|
70
|
+
export interface IConnectorAuthManualConfig {
|
|
71
|
+
/**
|
|
72
|
+
* Setup instructions shown above the form. Rendered as PLAIN TEXT with
|
|
73
|
+
* whitespace preserved — this repo ships no markdown renderer and a
|
|
74
|
+
* published component is the wrong place to add one, so markup is NOT
|
|
75
|
+
* interpreted. See the note in `index.tsx`.
|
|
76
|
+
*/
|
|
77
|
+
instructionsMarkdown: string;
|
|
78
|
+
fields: IConnectorAuthField[];
|
|
79
|
+
}
|
|
80
|
+
export interface IConnectorAuthError {
|
|
81
|
+
code: string;
|
|
82
|
+
message: string;
|
|
83
|
+
/** When true the card offers a retry affordance (D-16 "retried"). */
|
|
84
|
+
retryable: boolean;
|
|
85
|
+
}
|
|
86
|
+
export interface IConnectorAuthCardProps {
|
|
87
|
+
/**
|
|
88
|
+
* The card's own heading — `30534` puts it on the header row, left of the
|
|
89
|
+
* status. Distinct from `provider.name`, which labels the app row beneath it.
|
|
90
|
+
*/
|
|
91
|
+
title?: string;
|
|
92
|
+
provider: IConnectorAuthProvider;
|
|
93
|
+
description: string;
|
|
94
|
+
connectionStatus: ConnectorAuthConnectionStatus;
|
|
95
|
+
/** Server-built authorization URL; carries the OAuth `state` parameter. */
|
|
96
|
+
authorizeUrl: string;
|
|
97
|
+
/** Overrides the connect button's label. Defaults to `Connect <name>`. */
|
|
98
|
+
ctaLabel?: string;
|
|
99
|
+
/**
|
|
100
|
+
* Manual-credential form. Omit (or pass null) when the connector has a
|
|
101
|
+
* registered OAuth app and the popup is the only path.
|
|
102
|
+
*/
|
|
103
|
+
manualAuth?: IConnectorAuthManualConfig | null;
|
|
104
|
+
state: ConnectorAuthCardState;
|
|
105
|
+
error?: IConnectorAuthError | null;
|
|
106
|
+
/** Called exactly once per popup flow, with the flow's terminal outcome. */
|
|
107
|
+
onOutcome: (outcome: ConnectorAuthOutcome) => void;
|
|
108
|
+
/** Called with the manual form's values once client-side validation passes. */
|
|
109
|
+
onManualSubmit?: (values: Record<string, string>) => void;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/v2/features/auth/components/connector-auth-card/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9F;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,6BAA6B,GACrC,eAAe,GACf,eAAe,GACf,wBAAwB,GACxB,SAAS,CAAC;AAEd;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAEtE,yEAAyE;AACzE,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;AAEjE,MAAM,WAAW,sBAAsB;IACrC,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,sBAAsB,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,mBAAmB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,sBAAsB,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,6BAA6B,CAAC;IAChD,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,0BAA0B,GAAG,IAAI,CAAC;IAC/C,KAAK,EAAE,sBAAsB,CAAC;IAC9B,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,4EAA4E;IAC5E,SAAS,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,IAAI,CAAC;IACnD,+EAA+E;IAC/E,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;CAC3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clickup-controller.test.d.ts","sourceRoot":"","sources":["../../../../../src/v2/features/clickup/__tests__/clickup-controller.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { AppController, AppControllerArgs } from '../../app/connectors/pages/app-detail/schema';
|
|
2
|
+
/**
|
|
3
|
+
* ClickUp's AppController.
|
|
4
|
+
*
|
|
5
|
+
* Structurally mirrors `useSlackController` (same hydrate → dirty-track →
|
|
6
|
+
* save → re-arm shape), but ClickUp is an ORDINARY custom connector, so the
|
|
7
|
+
* save target differs: it has no per-(ug, sm) admin configs collection of its
|
|
8
|
+
* own. Its Configuration tab edits connector-level visibility — the same
|
|
9
|
+
* inboxes + role pair the post-install `InitialSetup` screen writes — so the
|
|
10
|
+
* save goes through the generic `updateConnectorById` PATCH rather than any
|
|
11
|
+
* ClickUp-specific endpoint. There is no ClickUp equivalent of Slack's
|
|
12
|
+
* `default_message`, so `defaultMessage` is carried only to satisfy the
|
|
13
|
+
* `AppController` contract and is never read or persisted here.
|
|
14
|
+
*
|
|
15
|
+
* Mode-aware:
|
|
16
|
+
* - `connector` mode (URL = /connector/app/:connectorId, post-install):
|
|
17
|
+
* hydrate from the install's persisted visibility and PATCH it back.
|
|
18
|
+
* - `template` mode (URL = /template/app/:templateId, pre-install): the URL
|
|
19
|
+
* id is a TEMPLATE id, and `updateConnectorById` needs an install id — so
|
|
20
|
+
* there is nothing to save against yet. ClickUp's install row is created
|
|
21
|
+
* by the OAuth flow, not by this form, so the form stays read-only
|
|
22
|
+
* (`canSave: false`) and Cancel bails back to the marketplace, matching
|
|
23
|
+
* Slack's template-mode Cancel. See the note in the run's implementation
|
|
24
|
+
* artifact: what template mode should offer for an OAuth connector is
|
|
25
|
+
* still an open product question.
|
|
26
|
+
*/
|
|
27
|
+
export declare function useClickUpController({ mode, id }: AppControllerArgs): AppController;
|
|
28
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../../src/v2/features/clickup/controller.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAuBpG;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,iBAAiB,GAAG,aAAa,CA2HnF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connector-template.d.ts","sourceRoot":"","sources":["../../../../../src/v2/testing/mocks/handlers/connector-template.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connector-template.d.ts","sourceRoot":"","sources":["../../../../../src/v2/testing/mocks/handlers/connector-template.ts"],"names":[],"mappings":"AA8bA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAyB,CAAC;AAyErD,eAAO,MAAM,QAAQ,6BAYpB,CAAC"}
|
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import { render as rtlRender, RenderOptions } from '@testing-library/react';
|
|
2
2
|
import { default as userEvent } from '@testing-library/user-event';
|
|
3
3
|
import { AppStore, RootState } from '../store';
|
|
4
|
+
import { IAvailableFtr } from '../types/app';
|
|
5
|
+
import { ConnectorsAdminFunctions } from '../types/exposedTypes';
|
|
4
6
|
interface ExtendedRenderOptions extends Omit<RenderOptions, 'queries'> {
|
|
5
7
|
url?: string;
|
|
6
8
|
path?: string;
|
|
7
9
|
preloadedState?: Partial<RootState>;
|
|
8
10
|
store?: AppStore;
|
|
11
|
+
/** Feature flags for the subtree. Defaults to none, so gated UI stays hidden. */
|
|
12
|
+
availableFeatures?: IAvailableFtr;
|
|
13
|
+
/**
|
|
14
|
+
* Host callbacks, merged over the two the provider requires. Lets a test
|
|
15
|
+
* supply an optional one (`openCopilot`, `redirectToUpgradePage`) without
|
|
16
|
+
* restating the required pair.
|
|
17
|
+
*/
|
|
18
|
+
connectorFunctions?: Partial<ConnectorsAdminFunctions>;
|
|
9
19
|
}
|
|
10
20
|
export declare const waitForLoadingToFinish: () => Promise<void>;
|
|
11
|
-
export declare const renderApp: (ui: React.ReactElement, { url, path, preloadedState, store, ...renderOptions }?: ExtendedRenderOptions) => Promise<{
|
|
21
|
+
export declare const renderApp: (ui: React.ReactElement, { url, path, preloadedState, store, availableFeatures, connectorFunctions, ...renderOptions }?: ExtendedRenderOptions) => Promise<{
|
|
12
22
|
container: HTMLElement;
|
|
13
23
|
baseElement: HTMLElement;
|
|
14
24
|
debug: (baseElement?: import('react-dom/client').Container | (Element | Document) | Array<import('react-dom/client').Container | (Element | Document)> | undefined, maxLength?: number | undefined, options?: import('pretty-format').OptionsReceived | undefined) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/v2/testing/test-utils.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAChG,OAAO,SAAS,MAAM,6BAA6B,CAAC;AAKpD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/v2/testing/test-utils.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,SAAS,EAAqC,MAAM,wBAAwB,CAAC;AAChG,OAAO,SAAS,MAAM,6BAA6B,CAAC;AAKpD,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAExE,UAAU,qBAAsB,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC;IACpE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,aAAa,CAAC;IAClC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACxD;AAED,eAAO,MAAM,sBAAsB,qBAG/B,CAAC;AAEL,eAAO,MAAM,SAAS,OAChB,KAAK,CAAC,YAAY,kGASnB,qBAAqB;;;uBAtBf,CAAC,yJAEA,CAAC,6BAEP,CAAC;yBAGkB,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoDjC,CAAC;AAGF,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -20,5 +20,16 @@ export interface ConnectorsAdminFunctions {
|
|
|
20
20
|
roles: IRolesData[] | null;
|
|
21
21
|
}>;
|
|
22
22
|
redirectToUpgradePage?: () => void;
|
|
23
|
+
/**
|
|
24
|
+
* Opens the host's Apps Activation assistant for a connector.
|
|
25
|
+
*
|
|
26
|
+
* Optional for the same reason as `redirectToUpgradePage`: a host that has
|
|
27
|
+
* not shipped the assistant simply does not pass it, and the action that
|
|
28
|
+
* calls it stays hidden rather than rendering a dead control.
|
|
29
|
+
*/
|
|
30
|
+
openCopilot?: (params: {
|
|
31
|
+
app: string;
|
|
32
|
+
connectorId: string;
|
|
33
|
+
}) => void;
|
|
23
34
|
}
|
|
24
35
|
//# sourceMappingURL=exposedTypes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exposedTypes.d.ts","sourceRoot":"","sources":["../../../src/v2/types/exposedTypes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,OAAO,CAC5B;QAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QAAC,YAAY,EAAE,UAAU,EAAE,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,IAAI,CAAA;KAAE,CACtG,CAAC;IACF,QAAQ,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACxD,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"exposedTypes.d.ts","sourceRoot":"","sources":["../../../src/v2/types/exposedTypes.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,eAAe,EAAE,MAAM,OAAO,CAC5B;QAAE,WAAW,EAAE,UAAU,EAAE,CAAC;QAAC,YAAY,EAAE,UAAU,EAAE,CAAA;KAAE,GAAG;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,YAAY,EAAE,IAAI,CAAA;KAAE,CACtG,CAAC;IACF,QAAQ,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IACxD,qBAAqB,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;CACtE"}
|