@gravitee/graphene-policy-studio 1.0.0-alpha.1 → 1.0.0-alpha.10
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/USAGE_GUIDE.md +242 -0
- package/dist/components/DeleteFlowDialog.d.ts +8 -0
- package/dist/components/DeleteFlowDialog.d.ts.map +1 -0
- package/dist/components/ElCheatSheetTrigger/ElCheatSheetTrigger.d.ts +2 -0
- package/dist/components/ElCheatSheetTrigger/ElCheatSheetTrigger.d.ts.map +1 -0
- package/dist/components/ElCheatSheetTrigger/index.d.ts +2 -0
- package/dist/components/ElCheatSheetTrigger/index.d.ts.map +1 -0
- package/dist/components/FlowForm/AddFlowSheet.d.ts +10 -0
- package/dist/components/FlowForm/AddFlowSheet.d.ts.map +1 -0
- package/dist/components/FlowForm/EditFlowSheet.d.ts +10 -0
- package/dist/components/FlowForm/EditFlowSheet.d.ts.map +1 -0
- package/dist/components/FlowForm/FlowForm.d.ts +20 -0
- package/dist/components/FlowForm/FlowForm.d.ts.map +1 -0
- package/dist/components/FlowForm/fields/ConditionField.d.ts +5 -0
- package/dist/components/FlowForm/fields/ConditionField.d.ts.map +1 -0
- package/dist/components/FlowForm/fields/HttpFields.d.ts +8 -0
- package/dist/components/FlowForm/fields/HttpFields.d.ts.map +1 -0
- package/dist/components/FlowForm/fields/McpFields.d.ts +6 -0
- package/dist/components/FlowForm/fields/McpFields.d.ts.map +1 -0
- package/dist/components/FlowForm/fields/MessageFields.d.ts +9 -0
- package/dist/components/FlowForm/fields/MessageFields.d.ts.map +1 -0
- package/dist/components/FlowForm/fields/NameField.d.ts +7 -0
- package/dist/components/FlowForm/fields/NameField.d.ts.map +1 -0
- package/dist/components/FlowForm/flow-form-schema.d.ts +37 -0
- package/dist/components/FlowForm/flow-form-schema.d.ts.map +1 -0
- package/dist/components/FlowForm/index.d.ts +7 -0
- package/dist/components/FlowForm/index.d.ts.map +1 -0
- package/dist/components/FlowInfoBar/FlowInfoBar.d.ts +15 -0
- package/dist/components/FlowInfoBar/FlowInfoBar.d.ts.map +1 -0
- package/dist/components/FlowInfoBar/index.d.ts +3 -0
- package/dist/components/FlowInfoBar/index.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/FlowGroupSection.d.ts +14 -0
- package/dist/components/FlowsSidebar/FlowGroupSection.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/FlowItem.d.ts +24 -0
- package/dist/components/FlowsSidebar/FlowItem.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/FlowList.d.ts +19 -0
- package/dist/components/FlowsSidebar/FlowList.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/FlowsSidebar.d.ts +21 -0
- package/dist/components/FlowsSidebar/FlowsSidebar.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/McpFlowsSidebar.d.ts +3 -0
- package/dist/components/FlowsSidebar/McpFlowsSidebar.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/SidebarShell.d.ts +15 -0
- package/dist/components/FlowsSidebar/SidebarShell.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/StandardFlowsSidebar.d.ts +7 -0
- package/dist/components/FlowsSidebar/StandardFlowsSidebar.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/UmbrellaSection.d.ts +13 -0
- package/dist/components/FlowsSidebar/UmbrellaSection.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/flows-dnd-context.d.ts +6 -0
- package/dist/components/FlowsSidebar/flows-dnd-context.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/flows-sidebar.types.d.ts +17 -0
- package/dist/components/FlowsSidebar/flows-sidebar.types.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/index.d.ts +3 -0
- package/dist/components/FlowsSidebar/index.d.ts.map +1 -0
- package/dist/components/FlowsSidebar/use-debounced-search.d.ts +6 -0
- package/dist/components/FlowsSidebar/use-debounced-search.d.ts.map +1 -0
- package/dist/components/PhaseCanvas/PhaseCanvas.d.ts +20 -0
- package/dist/components/PhaseCanvas/PhaseCanvas.d.ts.map +1 -0
- package/dist/components/PhaseCanvas/PhaseLayout.d.ts +17 -0
- package/dist/components/PhaseCanvas/PhaseLayout.d.ts.map +1 -0
- package/dist/components/PhaseCanvas/index.d.ts +5 -0
- package/dist/components/PhaseCanvas/index.d.ts.map +1 -0
- package/dist/components/PolicyCatalog/PolicyCatalogCategoryFilter.d.ts +11 -0
- package/dist/components/PolicyCatalog/PolicyCatalogCategoryFilter.d.ts.map +1 -0
- package/dist/components/PolicyCatalog/PolicyCatalogDetailPane.d.ts +7 -0
- package/dist/components/PolicyCatalog/PolicyCatalogDetailPane.d.ts.map +1 -0
- package/dist/components/PolicyCatalog/PolicyCatalogPanel.d.ts +13 -0
- package/dist/components/PolicyCatalog/PolicyCatalogPanel.d.ts.map +1 -0
- package/dist/components/PolicyCatalog/PolicyQuickInsert.d.ts +11 -0
- package/dist/components/PolicyCatalog/PolicyQuickInsert.d.ts.map +1 -0
- package/dist/components/PolicyCatalog/index.d.ts +5 -0
- package/dist/components/PolicyCatalog/index.d.ts.map +1 -0
- package/dist/components/PolicyStudio/PolicyStudio.d.ts +21 -0
- package/dist/components/PolicyStudio/PolicyStudio.d.ts.map +1 -0
- package/dist/components/PolicyStudio/index.d.ts +3 -0
- package/dist/components/PolicyStudio/index.d.ts.map +1 -0
- package/dist/components/PolicyStudioLayout/PolicyStudioLayout.d.ts +9 -0
- package/dist/components/PolicyStudioLayout/PolicyStudioLayout.d.ts.map +1 -0
- package/dist/components/PolicyStudioLayout/index.d.ts +3 -0
- package/dist/components/PolicyStudioLayout/index.d.ts.map +1 -0
- package/dist/context/PolicyStudioProvider.d.ts +52 -0
- package/dist/context/PolicyStudioProvider.d.ts.map +1 -0
- package/dist/context/index.d.ts +3 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/use-flow-state.d.ts +11 -0
- package/dist/hooks/use-flow-state.d.ts.map +1 -0
- package/dist/hooks/use-policy-docs.d.ts +19 -0
- package/dist/hooks/use-policy-docs.d.ts.map +1 -0
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6987 -25
- package/dist/lib/connector-filter.d.ts +23 -0
- package/dist/lib/connector-filter.d.ts.map +1 -0
- package/dist/lib/flow-form.d.ts +48 -0
- package/dist/lib/flow-form.d.ts.map +1 -0
- package/dist/lib/flow-groups-reducer.d.ts +36 -0
- package/dist/lib/flow-groups-reducer.d.ts.map +1 -0
- package/dist/lib/flow-info-bar.d.ts +48 -0
- package/dist/lib/flow-info-bar.d.ts.map +1 -0
- package/dist/lib/flow-menu.d.ts +105 -0
- package/dist/lib/flow-menu.d.ts.map +1 -0
- package/dist/lib/flow-phases.d.ts +29 -0
- package/dist/lib/flow-phases.d.ts.map +1 -0
- package/dist/lib/index.d.ts +12 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/policy-documentation.d.ts +16 -0
- package/dist/lib/policy-documentation.d.ts.map +1 -0
- package/dist/lib/policy-fetch-cache.d.ts +15 -0
- package/dist/lib/policy-fetch-cache.d.ts.map +1 -0
- package/dist/lib/policy-filter.d.ts +45 -0
- package/dist/lib/policy-filter.d.ts.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -3
- package/snippets/policy-studio-provider-host.tsx +50 -0
package/USAGE_GUIDE.md
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
# Using Policy Studio
|
|
2
|
+
|
|
3
|
+
> **Scope:** These rules only apply when working with `@gravitee/graphene-policy-studio`. Do not apply them to unrelated parts of the codebase.
|
|
4
|
+
|
|
5
|
+
Policy Studio is the Graphene module for editing API flows, plans, and policy steps. The host application owns API data and persistence; the library provides the complete studio UI via a single `<PolicyStudio />` component.
|
|
6
|
+
|
|
7
|
+
Browse the live component catalog in this package's Storybook (local: `yarn workspace @gravitee/graphene-policy-studio storybook`).
|
|
8
|
+
|
|
9
|
+
## Quick start
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { PolicyStudio } from '@gravitee/graphene-policy-studio';
|
|
13
|
+
|
|
14
|
+
function ApiPolicyStudioPage() {
|
|
15
|
+
return (
|
|
16
|
+
<PolicyStudio
|
|
17
|
+
apiType="PROXY"
|
|
18
|
+
policies={policies}
|
|
19
|
+
plans={plans}
|
|
20
|
+
commonFlows={commonFlows}
|
|
21
|
+
sharedPolicyGroups={sharedPolicyGroups}
|
|
22
|
+
entrypointsInfo={entrypointsInfo}
|
|
23
|
+
endpointsInfo={endpointsInfo}
|
|
24
|
+
flowExecution={{ mode: 'DEFAULT' }}
|
|
25
|
+
onSave={handleSave}
|
|
26
|
+
onFetchPolicySchema={fetchSchema}
|
|
27
|
+
onFetchPolicyDocumentation={fetchDocs}
|
|
28
|
+
/>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
That's it. `PolicyStudio` renders the full UI (sidebar, info bar, flow canvas) and manages all internal state. The host supplies data and three callbacks.
|
|
34
|
+
|
|
35
|
+
```mermaid
|
|
36
|
+
flowchart TB
|
|
37
|
+
Host[Host app]
|
|
38
|
+
PS["PolicyStudio"]
|
|
39
|
+
Layout[Layout + sidebar + canvas]
|
|
40
|
+
Host -->|"data + onSave + fetchers"| PS
|
|
41
|
+
PS --> Layout
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Package exports
|
|
45
|
+
|
|
46
|
+
| Export | What it is |
|
|
47
|
+
| ------ | ---------- |
|
|
48
|
+
| `@gravitee/graphene-policy-studio` | Single entry: `PolicyStudio`, provider, context hook, domain types, phase mappings. |
|
|
49
|
+
|
|
50
|
+
**Named exports (main integration surface):**
|
|
51
|
+
|
|
52
|
+
| Symbol | Role |
|
|
53
|
+
| ------ | ---- |
|
|
54
|
+
| `PolicyStudio` | Full studio UI — primary consumer integration point |
|
|
55
|
+
| `PolicyStudioProps` | TypeScript props for `PolicyStudio` |
|
|
56
|
+
| `PolicyStudioProvider` | Context-only wrapper — for advanced use or sub-component stories |
|
|
57
|
+
| `usePolicyStudioContext` | Read studio data and cached fetchers from child components |
|
|
58
|
+
| `PolicyStudioLayout` | Layout shell (sidebar + info bar + canvas slots) |
|
|
59
|
+
| `FlowsSidebar`, `FlowsSidebarProps` | Sidebar component — used internally by `PolicyStudio` |
|
|
60
|
+
| `getFlowPhases`, `getProtocolType` | Map `ApiType` to flow phases and protocol |
|
|
61
|
+
| `API_TYPE_TO_PROTOCOL`, `FLOW_PHASES_BY_API_TYPE` | Static lookup tables |
|
|
62
|
+
| Domain types | `ApiType`, `Policy`, `Plan`, `Flow`, `SaveOutput`, `PolicyDocumentation`, etc. |
|
|
63
|
+
|
|
64
|
+
There are no subpath exports (e.g. no `@gravitee/graphene-policy-studio/context`). Import everything from the package root.
|
|
65
|
+
|
|
66
|
+
## Dependencies (what the host needs)
|
|
67
|
+
|
|
68
|
+
| Dependency | Required | Notes |
|
|
69
|
+
| ---------- | -------- | ----- |
|
|
70
|
+
| `react`, `react-dom` | Yes (^19) | Provider and UI components |
|
|
71
|
+
| `@gravitee/graphene-core` | Yes (^2) | Shared primitives used by studio UI (`cn`, `ScrollArea`, ...) |
|
|
72
|
+
| `tailwindcss` | Optional (^4) | Recommended so Graphene utility classes work |
|
|
73
|
+
|
|
74
|
+
Install:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
yarn add @gravitee/graphene-policy-studio @gravitee/graphene-core react react-dom
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The host should also follow [Graphene integration](../core/USAGE_GUIDE.md) (fonts, styles, and optionally Tailwind theme) so studio UI matches the design system.
|
|
81
|
+
|
|
82
|
+
## `PolicyStudio` props
|
|
83
|
+
|
|
84
|
+
### Required props
|
|
85
|
+
|
|
86
|
+
| Prop | Type | Role |
|
|
87
|
+
| ---- | ---- | ---- |
|
|
88
|
+
| `apiType` | `ApiType` | Drives flow phases and protocol (`PROXY`, `MESSAGE`, `MCP_PROXY`, ...) |
|
|
89
|
+
| `policies` | `readonly Policy[]` | Policy catalog for the API |
|
|
90
|
+
| `sharedPolicyGroups` | `readonly SharedPolicyGroupPolicy[]` | Shared policy groups available to the API |
|
|
91
|
+
| `plans` | `readonly Plan[]` | Plans and their flows |
|
|
92
|
+
| `commonFlows` | `readonly Flow[]` | API-level flows |
|
|
93
|
+
| `entrypointsInfo` | `readonly ConnectorInfo[]` | Entrypoint connectors (used for connector filtering) |
|
|
94
|
+
| `endpointsInfo` | `readonly ConnectorInfo[]` | Endpoint connectors |
|
|
95
|
+
| `flowExecution` | `FlowExecution` | Flow matching mode and `matchRequired` |
|
|
96
|
+
| `onSave` | `(output: SaveOutput) => void` | Persist studio changes (delta only) |
|
|
97
|
+
| `onFetchPolicySchema` | `(policy: Policy) => Promise<unknown>` | Host API: JSON schema for policy config |
|
|
98
|
+
| `onFetchPolicyDocumentation` | `(policy: Policy) => Promise<string \| PolicyDocumentation>` | Host API: policy docs |
|
|
99
|
+
|
|
100
|
+
### Optional props
|
|
101
|
+
|
|
102
|
+
| Prop | Default | Role |
|
|
103
|
+
| ---- | ------- | ---- |
|
|
104
|
+
| `readOnly` | `false` | Disable editing in the studio |
|
|
105
|
+
| `loading` | `false` | Show loading state |
|
|
106
|
+
| `className` | — | CSS class on the root layout element |
|
|
107
|
+
|
|
108
|
+
### Performance
|
|
109
|
+
|
|
110
|
+
- **Memoize** array props (`policies`, `plans`, `commonFlows`, ...) and `onSave` with `useMemo` / `useCallback`. They feed into the internal context `useMemo` dependency array; new references every render force all consumers to re-render.
|
|
111
|
+
- **Fetcher callbacks** (`onFetchPolicySchema`, `onFetchPolicyDocumentation`) are captured on **first mount** inside the provider. Keep them referentially stable for the lifetime of the component, or ensure they close over values that do not change.
|
|
112
|
+
|
|
113
|
+
### To implement
|
|
114
|
+
|
|
115
|
+
Copy the snippet from `snippets/policy-studio-provider-host.tsx` and replace the placeholder comments with your API data and handlers. See Storybook **Policy Studio/PolicyStudio** for live demos with different API types.
|
|
116
|
+
|
|
117
|
+
## Advanced: `PolicyStudioProvider` + custom UI
|
|
118
|
+
|
|
119
|
+
For consumers who need full control over the UI layout, use `PolicyStudioProvider` directly with `children`:
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
import {
|
|
123
|
+
PolicyStudioProvider,
|
|
124
|
+
PolicyStudioLayout,
|
|
125
|
+
FlowsSidebar,
|
|
126
|
+
usePolicyStudioContext,
|
|
127
|
+
} from '@gravitee/graphene-policy-studio';
|
|
128
|
+
|
|
129
|
+
<PolicyStudioProvider {...providerProps}>
|
|
130
|
+
<PolicyStudioLayout
|
|
131
|
+
sidebar={<FlowsSidebar />}
|
|
132
|
+
infoBar={<CustomInfoBar />}
|
|
133
|
+
>
|
|
134
|
+
<CustomCanvas />
|
|
135
|
+
</PolicyStudioLayout>
|
|
136
|
+
</PolicyStudioProvider>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
This is not required for most consumers. Use `PolicyStudio` instead.
|
|
140
|
+
|
|
141
|
+
## Context API (`usePolicyStudioContext`)
|
|
142
|
+
|
|
143
|
+
Call from any descendant of `PolicyStudioProvider` (or `PolicyStudio`):
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
function PolicyConfigPanel() {
|
|
147
|
+
const { fetchPolicySchema, policies, readOnly, onSave } = usePolicyStudioContext();
|
|
148
|
+
// ...
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Exposed on context:**
|
|
153
|
+
|
|
154
|
+
- All data props from the provider (`apiType`, `policies`, `plans`, `commonFlows`, ...)
|
|
155
|
+
- `readOnly`, `loading`
|
|
156
|
+
- `onSave` — same callback the host passed in
|
|
157
|
+
- `fetchPolicySchema` — cached wrapper (not the raw host callback)
|
|
158
|
+
- `fetchPolicyDocumentation` — cached, normalized wrapper
|
|
159
|
+
|
|
160
|
+
Throws if used outside `PolicyStudioProvider`.
|
|
161
|
+
|
|
162
|
+
## Fetcher contract
|
|
163
|
+
|
|
164
|
+
### Policy schema (`onFetchPolicySchema` -> `fetchPolicySchema`)
|
|
165
|
+
|
|
166
|
+
- Host returns `Promise<unknown>` (typically a JSON Schema object).
|
|
167
|
+
- Cached **per `policy.id`** for the lifetime of the provider mount.
|
|
168
|
+
- **Concurrent** calls for the same id share one in-flight promise.
|
|
169
|
+
- **Rejected** promises are **evicted** from the cache; the next call retries the host fetcher (transient network errors are not permanently cached).
|
|
170
|
+
|
|
171
|
+
Use `fetchPolicySchema` from context in UI — do not call the host callback directly from children.
|
|
172
|
+
|
|
173
|
+
### Policy documentation (`onFetchPolicyDocumentation` -> `fetchPolicyDocumentation`)
|
|
174
|
+
|
|
175
|
+
- Host may return a raw `string` (treated as ASCIIDOC: `{ content, language: 'ASCIIDOC' }`) or a `PolicyDocumentation` object.
|
|
176
|
+
- Empty content and fetch **errors** resolve to a standard placeholder: `{ content: 'No documentation available.', language: 'MARKDOWN' }`.
|
|
177
|
+
- Cached per `policy.id` like schema; concurrent deduplication applies.
|
|
178
|
+
|
|
179
|
+
Use `fetchPolicyDocumentation` from context — it always returns `Promise<PolicyDocumentation>`.
|
|
180
|
+
|
|
181
|
+
## Save contract
|
|
182
|
+
|
|
183
|
+
`onSave` receives a **`SaveOutput` delta**, not the full API entity:
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
type SaveOutput = {
|
|
187
|
+
readonly commonFlows?: readonly Flow[];
|
|
188
|
+
readonly flowExecution?: FlowExecution;
|
|
189
|
+
readonly plansToUpdate?: readonly Plan[];
|
|
190
|
+
};
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
The host merges this delta into its API model and persists. Saving does not clear schema or documentation caches.
|
|
194
|
+
|
|
195
|
+
## Domain helpers
|
|
196
|
+
|
|
197
|
+
Align host payloads with studio rules:
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
import { getFlowPhases, getProtocolType, API_TYPE_TO_PROTOCOL } from '@gravitee/graphene-policy-studio';
|
|
201
|
+
|
|
202
|
+
const phases = getFlowPhases('PROXY'); // ['REQUEST', 'RESPONSE']
|
|
203
|
+
const protocol = getProtocolType('MESSAGE'); // 'HTTP_MESSAGE'
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
| Helper | Use |
|
|
207
|
+
| ------ | --- |
|
|
208
|
+
| `getFlowPhases(apiType)` | Which phases to show in the canvas for this API type |
|
|
209
|
+
| `getProtocolType(apiType)` | Protocol key used for policy compatibility |
|
|
210
|
+
| `FLOW_PHASES_BY_API_TYPE` | Static phase list per API type |
|
|
211
|
+
| `API_TYPE_TO_PROTOCOL` | Static protocol mapping |
|
|
212
|
+
|
|
213
|
+
## Key types
|
|
214
|
+
|
|
215
|
+
| Type | Purpose |
|
|
216
|
+
| ---- | ------- |
|
|
217
|
+
| `ApiType` | `PROXY`, `MESSAGE`, `MCP_PROXY`, `LLM_PROXY`, `NATIVE`, `A2A_PROXY` |
|
|
218
|
+
| `Policy` | Catalog entry (`id`, `name`, optional `category`, `icon`, ...) |
|
|
219
|
+
| `Flow` | Selectors + phase steps (`request`, `response`, `connect`, ...) |
|
|
220
|
+
| `Plan` | `id`, `name`, `flows` |
|
|
221
|
+
| `Step` | Policy step on a flow (`policy`, `configuration`, `enabled`, ...) |
|
|
222
|
+
| `SaveOutput` | Delta passed to `onSave` |
|
|
223
|
+
| `PolicyDocumentation` | `{ content: string; language: 'MARKDOWN' \| 'ASCIIDOC' }` |
|
|
224
|
+
|
|
225
|
+
Import the named types from `@gravitee/graphene-policy-studio` for full TypeScript shapes in your host app.
|
|
226
|
+
|
|
227
|
+
## Common mistakes to avoid
|
|
228
|
+
|
|
229
|
+
- Passing **inline arrays** (`policies={[...]}`) or **inline callbacks** without `useMemo` / `useCallback` — causes unnecessary context updates.
|
|
230
|
+
- Recreating **fetcher functions** on every render while expecting updated closures — fetchers are frozen at first mount.
|
|
231
|
+
- Calling **`onFetchPolicySchema`** from children instead of **`fetchPolicySchema`** from context — bypasses cache and deduplication.
|
|
232
|
+
- Treating documentation fetch results as always `string` — use context's normalized `PolicyDocumentation`.
|
|
233
|
+
- Expecting **`onSave`** to receive the full API definition — only `SaveOutput` fields the user changed.
|
|
234
|
+
- Using Policy Studio **without** `@gravitee/graphene-core` styling when rendering exported layout/components — UI will look unstyled.
|
|
235
|
+
|
|
236
|
+
## Snippets
|
|
237
|
+
|
|
238
|
+
| File | When to use |
|
|
239
|
+
| ---- | ----------- |
|
|
240
|
+
| `snippets/policy-studio-provider-host.tsx` | First integration: single `PolicyStudio` component with memoized host callbacks |
|
|
241
|
+
|
|
242
|
+
Snippets ship in the npm package under `node_modules/@gravitee/graphene-policy-studio/snippets/`. They are copy-paste templates, not importable modules.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface DeleteFlowDialogProps {
|
|
2
|
+
readonly open: boolean;
|
|
3
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
4
|
+
readonly flowName: string | undefined;
|
|
5
|
+
readonly onConfirm: () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function DeleteFlowDialog({ open, onOpenChange, flowName, onConfirm }: DeleteFlowDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=DeleteFlowDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeleteFlowDialog.d.ts","sourceRoot":"","sources":["../../src/components/DeleteFlowDialog.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,qBAAqB,2CA4BlG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ElCheatSheetTrigger.d.ts","sourceRoot":"","sources":["../../../src/components/ElCheatSheetTrigger/ElCheatSheetTrigger.tsx"],"names":[],"mappings":"AAeA,wBAAgB,mBAAmB,4CAmDlC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ElCheatSheetTrigger/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FlowGroupVM, FlowVM } from '../../types';
|
|
2
|
+
export interface AddFlowSheetProps {
|
|
3
|
+
readonly open: boolean;
|
|
4
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
5
|
+
readonly onAdd: (flow: FlowVM, groupId: string) => void;
|
|
6
|
+
readonly group: FlowGroupVM;
|
|
7
|
+
readonly planGroups?: readonly FlowGroupVM[];
|
|
8
|
+
}
|
|
9
|
+
export declare function AddFlowSheet({ open, onOpenChange, onAdd, group, planGroups }: AddFlowSheetProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=AddFlowSheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AddFlowSheet.d.ts","sourceRoot":"","sources":["../../../src/components/FlowForm/AddFlowSheet.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAC9C;AAED,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,iBAAiB,2CA6C/F"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { FlowGroupVM, FlowVM } from '../../types';
|
|
2
|
+
export interface EditFlowSheetProps {
|
|
3
|
+
readonly flow: FlowVM | null;
|
|
4
|
+
readonly open: boolean;
|
|
5
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
6
|
+
readonly onSave: (updated: FlowVM, targetGroupId?: string) => void;
|
|
7
|
+
readonly planGroups?: readonly FlowGroupVM[];
|
|
8
|
+
}
|
|
9
|
+
export declare function EditFlowSheet({ flow, open, onOpenChange, onSave, planGroups }: EditFlowSheetProps): import("react/jsx-runtime").JSX.Element | null;
|
|
10
|
+
//# sourceMappingURL=EditFlowSheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditFlowSheet.d.ts","sourceRoot":"","sources":["../../../src/components/FlowForm/EditFlowSheet.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKvD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CAC9C;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,kBAAkB,kDA4HjG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { FlowFormValues } from '../../lib/flow-form';
|
|
2
|
+
import { ApiType, ConnectorInfo } from '../../types';
|
|
3
|
+
import { FormValues } from './flow-form-schema';
|
|
4
|
+
export interface PlanGroupOption {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly displayName: string;
|
|
7
|
+
}
|
|
8
|
+
export interface FlowFormProps {
|
|
9
|
+
readonly apiType: ApiType;
|
|
10
|
+
readonly mode: 'create' | 'edit';
|
|
11
|
+
readonly defaultValues?: Partial<FlowFormValues>;
|
|
12
|
+
readonly onSubmit: (values: FormValues) => void | Promise<void>;
|
|
13
|
+
readonly onCancel: () => void;
|
|
14
|
+
readonly onDirtyChange?: (isDirty: boolean) => void;
|
|
15
|
+
readonly externalError?: string;
|
|
16
|
+
readonly entrypointsInfo?: readonly ConnectorInfo[];
|
|
17
|
+
readonly planGroups?: readonly PlanGroupOption[];
|
|
18
|
+
}
|
|
19
|
+
export declare function FlowForm({ apiType, mode, defaultValues, onSubmit, onCancel, onDirtyChange, externalError, entrypointsInfo, planGroups, }: FlowFormProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
//# sourceMappingURL=FlowForm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowForm.d.ts","sourceRoot":"","sources":["../../../src/components/FlowForm/FlowForm.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAO1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAIrD,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjD,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;IAC9B,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACpD,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CAClD;AAQD,wBAAgB,QAAQ,CAAC,EACvB,OAAO,EACP,IAAI,EACJ,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,aAAa,EACb,eAAoB,EACpB,UAAU,GACX,EAAE,aAAa,2CA4Ff"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { UseFormRegisterReturn } from 'react-hook-form';
|
|
2
|
+
export declare function ConditionField({ registration }: {
|
|
3
|
+
readonly registration: UseFormRegisterReturn<'condition'>;
|
|
4
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
//# sourceMappingURL=ConditionField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConditionField.d.ts","sourceRoot":"","sources":["../../../../src/components/FlowForm/fields/ConditionField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG7D,wBAAgB,cAAc,CAAC,EAAE,YAAY,EAAE,EAAE;IAAE,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC,WAAW,CAAC,CAAA;CAAE,2CAiB7G"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Control, FieldErrors, UseFormRegisterReturn } from 'react-hook-form';
|
|
2
|
+
import { FormValues } from '../flow-form-schema';
|
|
3
|
+
export declare function HttpFields({ control, errors, pathRegistration, }: {
|
|
4
|
+
readonly control: Control<FormValues>;
|
|
5
|
+
readonly errors: FieldErrors<FormValues>;
|
|
6
|
+
readonly pathRegistration: UseFormRegisterReturn<'path'>;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=HttpFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpFields.d.ts","sourceRoot":"","sources":["../../../../src/components/FlowForm/fields/HttpFields.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAGnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,MAAM,EACN,gBAAgB,GACjB,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACzC,QAAQ,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;CAC1D,2CAoFA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Control } from 'react-hook-form';
|
|
2
|
+
import { FormValues } from '../flow-form-schema';
|
|
3
|
+
export declare function McpFields({ control }: {
|
|
4
|
+
readonly control: Control<FormValues>;
|
|
5
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
//# sourceMappingURL=McpFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpFields.d.ts","sourceRoot":"","sources":["../../../../src/components/FlowForm/fields/McpFields.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAOtD,wBAAgB,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAA;CAAE,2CAkD/E"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Control, FieldErrors, UseFormRegisterReturn } from 'react-hook-form';
|
|
2
|
+
import { FormValues } from '../flow-form-schema';
|
|
3
|
+
export declare function MessageFields({ control, errors, channelRegistration, availableEntrypoints, }: {
|
|
4
|
+
readonly control: Control<FormValues>;
|
|
5
|
+
readonly errors: FieldErrors<FormValues>;
|
|
6
|
+
readonly channelRegistration: UseFormRegisterReturn<'channel'>;
|
|
7
|
+
readonly availableEntrypoints: readonly string[];
|
|
8
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=MessageFields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageFields.d.ts","sourceRoot":"","sources":["../../../../src/components/FlowForm/fields/MessageFields.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAEnF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAItD,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,MAAM,EACN,mBAAmB,EACnB,oBAAoB,GACrB,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,CAAC;IACzC,QAAQ,CAAC,mBAAmB,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAC/D,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;CAClD,2CAsIA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { UseFormRegisterReturn } from 'react-hook-form';
|
|
2
|
+
import { ApiType } from '../../../types';
|
|
3
|
+
export declare function NameField({ apiType, registration, }: {
|
|
4
|
+
readonly apiType: ApiType;
|
|
5
|
+
readonly registration: UseFormRegisterReturn<'name'>;
|
|
6
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=NameField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NameField.d.ts","sourceRoot":"","sources":["../../../../src/components/FlowForm/fields/NameField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAc9C,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,YAAY,GACb,EAAE;IACD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;CACtD,2CAiBA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Zod schema for the flow form. Used with react-hook-form's zodResolver.
|
|
4
|
+
*
|
|
5
|
+
* This schema is intentionally loose — it serves as the RHF type bridge,
|
|
6
|
+
* not as a business validator. Domain-level normalization and constraints
|
|
7
|
+
* (e.g. path defaults to "/", empty methods ⇒ ALL) live in
|
|
8
|
+
* `buildSelectors` / `extractFormValues` in `lib/flow-form.ts`.
|
|
9
|
+
*
|
|
10
|
+
* react-hook-form requires mutable arrays, so this schema produces a
|
|
11
|
+
* mutable type internally. The public API still uses the readonly
|
|
12
|
+
* `FlowFormValues` from lib/flow-form.
|
|
13
|
+
*/
|
|
14
|
+
export declare const flowFormSchema: z.ZodObject<{
|
|
15
|
+
name: z.ZodString;
|
|
16
|
+
planGroupId: z.ZodOptional<z.ZodString>;
|
|
17
|
+
pathOperator: z.ZodEnum<{
|
|
18
|
+
EQUALS: "EQUALS";
|
|
19
|
+
STARTS_WITH: "STARTS_WITH";
|
|
20
|
+
}>;
|
|
21
|
+
path: z.ZodString;
|
|
22
|
+
httpMethods: z.ZodArray<z.ZodString>;
|
|
23
|
+
channelOperator: z.ZodEnum<{
|
|
24
|
+
EQUALS: "EQUALS";
|
|
25
|
+
STARTS_WITH: "STARTS_WITH";
|
|
26
|
+
}>;
|
|
27
|
+
channel: z.ZodString;
|
|
28
|
+
entrypoints: z.ZodArray<z.ZodString>;
|
|
29
|
+
operations: z.ZodArray<z.ZodEnum<{
|
|
30
|
+
PUBLISH: "PUBLISH";
|
|
31
|
+
SUBSCRIBE: "SUBSCRIBE";
|
|
32
|
+
}>>;
|
|
33
|
+
mcpMethods: z.ZodArray<z.ZodString>;
|
|
34
|
+
condition: z.ZodString;
|
|
35
|
+
}, z.core.$strip>;
|
|
36
|
+
export type FormValues = z.infer<typeof flowFormSchema>;
|
|
37
|
+
//# sourceMappingURL=flow-form-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-form-schema.d.ts","sourceRoot":"","sources":["../../../src/components/FlowForm/flow-form-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;iBAYzB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { AddFlowSheet } from './AddFlowSheet';
|
|
2
|
+
export type { AddFlowSheetProps } from './AddFlowSheet';
|
|
3
|
+
export { EditFlowSheet } from './EditFlowSheet';
|
|
4
|
+
export type { EditFlowSheetProps } from './EditFlowSheet';
|
|
5
|
+
export { FlowForm } from './FlowForm';
|
|
6
|
+
export type { FlowFormProps, PlanGroupOption } from './FlowForm';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FlowForm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ApiType, ConnectorInfo, Flow } from '../../types';
|
|
2
|
+
export interface FlowInfoBarProps {
|
|
3
|
+
readonly flow: Flow | undefined;
|
|
4
|
+
readonly apiType: ApiType;
|
|
5
|
+
readonly entrypointsInfo: readonly ConnectorInfo[];
|
|
6
|
+
readonly endpointsInfo: readonly ConnectorInfo[];
|
|
7
|
+
readonly readOnly?: boolean;
|
|
8
|
+
readonly onEditFlow?: () => void;
|
|
9
|
+
readonly onToggleFlowEnabled?: (enabled: boolean) => void;
|
|
10
|
+
readonly onDeleteFlow?: () => void;
|
|
11
|
+
readonly className?: string;
|
|
12
|
+
}
|
|
13
|
+
declare function FlowInfoBar({ flow, apiType, entrypointsInfo, endpointsInfo, readOnly, onEditFlow, onToggleFlowEnabled, onDeleteFlow, className, }: FlowInfoBarProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export { FlowInfoBar };
|
|
15
|
+
//# sourceMappingURL=FlowInfoBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowInfoBar.d.ts","sourceRoot":"","sources":["../../../src/components/FlowInfoBar/FlowInfoBar.tsx"],"names":[],"mappings":"AAgCA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAKhE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,SAAS,aAAa,EAAE,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,SAAS,aAAa,EAAE,CAAC;IACjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAkGD,iBAAS,WAAW,CAAC,EACnB,IAAI,EACJ,OAAO,EACP,eAAe,EACf,aAAa,EACb,QAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,SAAS,GACV,EAAE,gBAAgB,2CAiGlB;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/FlowInfoBar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FlowGroupVM } from '../../types';
|
|
2
|
+
import { SharedFlowListProps } from './flows-sidebar.types';
|
|
3
|
+
export interface FlowGroupSectionProps {
|
|
4
|
+
readonly value: string;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
readonly group: FlowGroupVM;
|
|
7
|
+
readonly flowListProps: SharedFlowListProps;
|
|
8
|
+
readonly showSettings: boolean;
|
|
9
|
+
readonly emptyText: string;
|
|
10
|
+
readonly sortable?: boolean;
|
|
11
|
+
readonly onAdd?: () => void;
|
|
12
|
+
}
|
|
13
|
+
export declare function FlowGroupSection({ value, label, group, flowListProps, showSettings, emptyText, sortable, onAdd, }: FlowGroupSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=FlowGroupSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowGroupSection.d.ts","sourceRoot":"","sources":["../../../src/components/FlowsSidebar/FlowGroupSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,mBAAmB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,KAAK,EACL,KAAK,EACL,aAAa,EACb,YAAY,EACZ,SAAS,EACT,QAAgB,EAChB,KAAK,GACN,EAAE,qBAAqB,2CAUvB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { FlowBadge, FlowIconKey, MenuRules } from '../../lib/flow-menu';
|
|
2
|
+
import { FlowVM } from '../../types';
|
|
3
|
+
export interface FlowItemProps {
|
|
4
|
+
readonly flow: FlowVM;
|
|
5
|
+
readonly isActive: boolean;
|
|
6
|
+
readonly badges: readonly FlowBadge[];
|
|
7
|
+
readonly pathLabel: string;
|
|
8
|
+
readonly iconKey: FlowIconKey;
|
|
9
|
+
readonly rules: MenuRules;
|
|
10
|
+
readonly readOnly: boolean;
|
|
11
|
+
readonly sortable?: boolean;
|
|
12
|
+
readonly onSelect?: () => void;
|
|
13
|
+
readonly onEdit?: () => void;
|
|
14
|
+
readonly onToggleEnabled?: (enabled: boolean) => void;
|
|
15
|
+
readonly onDelete?: () => void;
|
|
16
|
+
readonly onDuplicate?: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function FlowItem({ flow, isActive, badges, pathLabel, iconKey, rules, readOnly, sortable, onSelect, onEdit, onToggleEnabled, onDelete, onDuplicate, }: FlowItemProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
/** Minimal drag overlay content — rendered inside DragOverlay, no useSortable. */
|
|
20
|
+
export declare function FlowItemDragOverlay({ flow, iconKey }: {
|
|
21
|
+
readonly flow: FlowVM;
|
|
22
|
+
readonly iconKey: FlowIconKey;
|
|
23
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=FlowItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowItem.d.ts","sourceRoot":"","sources":["../../../src/components/FlowsSidebar/FlowItem.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAuC1C,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,SAAS,SAAS,EAAE,CAAC;IACtC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;CACnC;AAED,wBAAgB,QAAQ,CAAC,EACvB,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,SAAS,EACT,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,QAAQ,EACR,MAAM,EACN,eAAe,EACf,QAAQ,EACR,WAAW,GACZ,EAAE,aAAa,2CAwGf;AAED,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,2CAO9G"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MenuRules } from '../../lib/flow-menu';
|
|
2
|
+
import { ApiType, FlowGroupVM, FlowVM } from '../../types';
|
|
3
|
+
export interface FlowListProps {
|
|
4
|
+
readonly flows: readonly FlowVM[];
|
|
5
|
+
readonly group: FlowGroupVM;
|
|
6
|
+
readonly apiType: ApiType;
|
|
7
|
+
readonly rules: MenuRules;
|
|
8
|
+
readonly readOnly: boolean;
|
|
9
|
+
readonly sortable?: boolean;
|
|
10
|
+
readonly emptyText?: string;
|
|
11
|
+
readonly selectedFlowId?: string;
|
|
12
|
+
readonly onFlowSelect?: (flowId: string) => void;
|
|
13
|
+
readonly onEditFlow?: (flow: FlowVM) => void;
|
|
14
|
+
readonly onToggleFlowEnabled?: (flow: FlowVM, enabled: boolean) => void;
|
|
15
|
+
readonly onDeleteFlow?: (flow: FlowVM) => void;
|
|
16
|
+
readonly onDuplicateFlow?: (original: FlowVM, duplicate: FlowVM) => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function FlowList({ flows, group, apiType, rules, readOnly, sortable, emptyText, selectedFlowId, onFlowSelect, onEditFlow, onToggleFlowEnabled, onDeleteFlow, onDuplicateFlow, }: FlowListProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=FlowList.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowList.d.ts","sourceRoot":"","sources":["../../../src/components/FlowsSidebar/FlowList.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAKhE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1E;AAED,wBAAgB,QAAQ,CAAC,EACvB,KAAK,EACL,KAAK,EACL,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,SAAS,EACT,cAAc,EACd,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,eAAe,GAChB,EAAE,aAAa,2CA2Ef"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { FlowGroupVM, FlowVM } from '../../types';
|
|
2
|
+
export interface FlowReorderEvent {
|
|
3
|
+
readonly flowId: string;
|
|
4
|
+
readonly sourceGroupId: string;
|
|
5
|
+
readonly targetGroupId: string;
|
|
6
|
+
readonly newIndex: number;
|
|
7
|
+
}
|
|
8
|
+
export interface FlowsSidebarProps {
|
|
9
|
+
readonly groups?: readonly FlowGroupVM[];
|
|
10
|
+
readonly selectedFlowId?: string;
|
|
11
|
+
readonly onFlowSelect?: (flowId: string) => void;
|
|
12
|
+
readonly onEditFlow?: (flow: FlowVM) => void;
|
|
13
|
+
readonly onToggleFlowEnabled?: (flow: FlowVM, enabled: boolean) => void;
|
|
14
|
+
readonly onDeleteFlow?: (flow: FlowVM) => void;
|
|
15
|
+
readonly onDuplicateFlow?: (original: FlowVM, duplicate: FlowVM) => void;
|
|
16
|
+
readonly onAddFlow?: (group: FlowGroupVM) => void;
|
|
17
|
+
readonly onReorderFlow?: (event: FlowReorderEvent) => void;
|
|
18
|
+
readonly className?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function FlowsSidebar({ groups: groupsProp, selectedFlowId, onFlowSelect, onEditFlow, onToggleFlowEnabled, onDeleteFlow, onDuplicateFlow, onAddFlow, onReorderFlow, className, }: FlowsSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=FlowsSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FlowsSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/FlowsSidebar/FlowsSidebar.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAMvD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAClD,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EAAE,UAAU,EAClB,cAAc,EACd,YAAY,EACZ,UAAU,EACV,mBAAmB,EACnB,YAAY,EACZ,eAAe,EACf,SAAS,EACT,aAAa,EACb,SAAS,GACV,EAAE,iBAAiB,2CA6DnB"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { FlowsSidebarBodyProps } from './flows-sidebar.types';
|
|
2
|
+
export declare function McpFlowsSidebar({ filteredGroups, flowListProps, canAddToGroup, onAddFlow, onReorderFlow, dndRule, query, handleChange, className, }: FlowsSidebarBodyProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=McpFlowsSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"McpFlowsSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/FlowsSidebar/McpFlowsSidebar.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAenE,wBAAgB,eAAe,CAAC,EAC9B,cAAc,EACd,aAAa,EACb,aAAa,EACb,SAAS,EACT,aAAa,EACb,OAAO,EACP,KAAK,EACL,YAAY,EACZ,SAAS,GACV,EAAE,qBAAqB,2CAuCvB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { MenuRules } from '../../lib/flow-menu';
|
|
3
|
+
import { FlowGroupVM } from '../../types';
|
|
4
|
+
import { FlowReorderEvent } from './FlowsSidebar';
|
|
5
|
+
export interface SidebarShellProps {
|
|
6
|
+
readonly query: string;
|
|
7
|
+
readonly onQueryChange: (value: string) => void;
|
|
8
|
+
readonly groups: readonly FlowGroupVM[];
|
|
9
|
+
readonly dndRule: MenuRules['dndRule'];
|
|
10
|
+
readonly onReorderFlow?: (event: FlowReorderEvent) => void;
|
|
11
|
+
readonly className?: string;
|
|
12
|
+
readonly children: ReactNode;
|
|
13
|
+
}
|
|
14
|
+
export declare function SidebarShell({ query, onQueryChange, groups, dndRule, onReorderFlow, className, children, }: SidebarShellProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=SidebarShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SidebarShell.d.ts","sourceRoot":"","sources":["../../../src/components/FlowsSidebar/SidebarShell.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAe,SAAS,EAAE,MAAM,OAAO,CAAC;AAGpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,aAAa,EACb,MAAM,EACN,OAAO,EACP,aAAa,EACb,SAAS,EACT,QAAQ,GACT,EAAE,iBAAiB,2CA6GnB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { MenuRules } from '../../lib/flow-menu';
|
|
2
|
+
import { FlowsSidebarBodyProps } from './flows-sidebar.types';
|
|
3
|
+
export interface StandardFlowsSidebarProps extends FlowsSidebarBodyProps {
|
|
4
|
+
readonly rules: MenuRules;
|
|
5
|
+
}
|
|
6
|
+
export declare function StandardFlowsSidebar({ filteredGroups, flowListProps, canAddToGroup, onAddFlow, onReorderFlow, dndRule, rules, query, handleChange, className, }: StandardFlowsSidebarProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=StandardFlowsSidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StandardFlowsSidebar.d.ts","sourceRoot":"","sources":["../../../src/components/FlowsSidebar/StandardFlowsSidebar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,MAAM,WAAW,yBAA0B,SAAQ,qBAAqB;IACtE,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,EACnC,cAAc,EACd,aAAa,EACb,aAAa,EACb,SAAS,EACT,aAAa,EACb,OAAO,EACP,KAAK,EACL,KAAK,EACL,YAAY,EACZ,SAAS,GACV,EAAE,yBAAyB,2CA6E3B"}
|