@principal-ade/dynamic-file-tree 0.1.59 → 0.1.61

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/index.d.ts CHANGED
@@ -20,6 +20,8 @@ export { MultiFileTree, MultiFileTreeCore } from './src/components/MultiFileTree
20
20
  export type { MultiFileTreeProps, MultiFileTreeCoreProps } from './src/components/MultiFileTree';
21
21
  export { StoryboardWorkflowsTreeCore } from './src/components/StoryboardWorkflowsTree/StoryboardWorkflowsTreeCore';
22
22
  export type { StoryboardWorkflowsTreeProps, StoryboardWorkflowNodeData, StoryboardWorkflowNodeType, DiscoveredStoryboard, DiscoveredWorkflow, } from './src/components/StoryboardWorkflowsTree/types';
23
+ export { WorkflowScenarioTreeCore } from './src/components/WorkflowScenarioTree';
24
+ export type { WorkflowScenarioTreeProps, WorkflowScenarioNodeData, WorkflowScenarioNodeType, WorkflowWithScenarios, WorkflowFilterMode, } from './src/components/WorkflowScenarioTree';
23
25
  export { CanvasListTreeCore } from './src/components/CanvasListTree/CanvasListTreeCore';
24
26
  export type { CanvasListTreeProps, CanvasListNodeData, CanvasListNodeType, DiscoveredCanvas, } from './src/components/CanvasListTree/types';
25
27
  export { TelemetryCoverageFileTree, calculateTelemetryCoverageStats, } from './src/components/TelemetryCoverageFileTree';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGxG,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,SAAS,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACnH,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,YAAY,EAAE,uCAAuC,EAAE,MAAM,qDAAqD,CAAC;AAGnH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAGxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,YAAY,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAGxG,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAG7E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAGhG,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,YAAY,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAGnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,YAAY,EACV,sBAAsB,EACtB,aAAa,EACb,SAAS,EACV,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AACzF,YAAY,EAAE,+BAA+B,EAAE,MAAM,6CAA6C,CAAC;AAGnG,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAClF,YAAY,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGjG,OAAO,EAAE,2BAA2B,EAAE,MAAM,sEAAsE,CAAC;AACnH,YAAY,EACV,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gDAAgD,CAAC;AAGxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,oDAAoD,CAAC;AACxF,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAG/C,OAAO,EACL,yBAAyB,EACzB,+BAA+B,GAChC,MAAM,4CAA4C,CAAC;AACpD,YAAY,EACV,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,YAAY,EAAE,uCAAuC,EAAE,MAAM,qDAAqD,CAAC;AAGnH,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.mjs CHANGED
@@ -2178,10 +2178,239 @@ var StoryboardWorkflowsTreeCore = ({
2178
2178
  ...dndProps
2179
2179
  }, NodeRenderer));
2180
2180
  };
2181
- // src/components/CanvasListTree/CanvasListTreeCore.tsx
2182
- import { Package as Package2, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
2183
- import React12, { useMemo as useMemo10, useRef as useRef6 } from "react";
2181
+ // src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx
2182
+ import { Package as Package2, Workflow as Workflow2, GitCommit as GitCommit2, ListChecks, List } from "lucide-react";
2183
+ import React12, { useMemo as useMemo10 } from "react";
2184
2184
  import { Tree as Tree4 } from "react-arborist";
2185
+ var buildTreeDataFromWorkflows = (workflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
2186
+ const packagesMap = new Map;
2187
+ const rootWorkflows = [];
2188
+ for (const workflow of workflows) {
2189
+ if (workflow.scope === "package" && workflow.packageName) {
2190
+ const existing = packagesMap.get(workflow.packageName) || [];
2191
+ existing.push(workflow);
2192
+ packagesMap.set(workflow.packageName, existing);
2193
+ } else {
2194
+ rootWorkflows.push(workflow);
2195
+ }
2196
+ }
2197
+ const buildWorkflowNode = (workflow) => {
2198
+ const workflowTraceCount = workflowTraceCounts?.[workflow.id] ?? 0;
2199
+ const hasTraces = workflowTraceCount > 0;
2200
+ if (filterMode === "with-traces" && !hasTraces) {
2201
+ return null;
2202
+ }
2203
+ if (filterMode === "without-traces" && hasTraces) {
2204
+ return null;
2205
+ }
2206
+ if (filterMode === "minimum-traces" && workflowTraceCount < (minTraceCount ?? 1)) {
2207
+ return null;
2208
+ }
2209
+ const scenarioNodes = workflow.scenarios.map((scenario) => {
2210
+ const scenarioKey = `${workflow.id}/${scenario.id}`;
2211
+ const scenarioTraceCount = scenarioTraceCounts?.[scenarioKey] ?? 0;
2212
+ return {
2213
+ id: `scenario:${workflow.id}:${scenario.id}`,
2214
+ name: scenario.description,
2215
+ type: "scenario",
2216
+ scenario,
2217
+ workflow,
2218
+ traceCount: scenarioTraceCount,
2219
+ hasTraces: scenarioTraceCount > 0
2220
+ };
2221
+ }).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2222
+ const displayName = `${workflow.storyboard.name}: ${workflow.name}`;
2223
+ return {
2224
+ id: `workflow:${workflow.id}`,
2225
+ name: displayName,
2226
+ type: "workflow",
2227
+ workflow,
2228
+ storyboard: workflow.storyboard,
2229
+ traceCount: workflowTraceCount,
2230
+ hasTraces,
2231
+ children: scenarioNodes.length > 0 ? scenarioNodes : undefined
2232
+ };
2233
+ };
2234
+ const hasMultiplePackages = packagesMap.size > 1;
2235
+ const hasRootAndPackages = packagesMap.size > 0 && rootWorkflows.length > 0;
2236
+ const shouldShowPackageLevel = hasMultiplePackages || hasRootAndPackages;
2237
+ if (shouldShowPackageLevel) {
2238
+ const result = [];
2239
+ for (const [packageName, packageWorkflows] of packagesMap) {
2240
+ const workflowNodes = packageWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2241
+ if (workflowNodes.length > 0) {
2242
+ result.push({
2243
+ id: `package:${packageName}`,
2244
+ name: packageName,
2245
+ type: "package",
2246
+ packageName,
2247
+ scope: "package",
2248
+ children: workflowNodes
2249
+ });
2250
+ }
2251
+ }
2252
+ if (rootWorkflows.length > 0) {
2253
+ const rootWorkflowNodes = rootWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2254
+ if (rootWorkflowNodes.length > 0) {
2255
+ result.push({
2256
+ id: "package:root",
2257
+ name: "Root",
2258
+ type: "package",
2259
+ packageName: "root",
2260
+ scope: "root",
2261
+ children: rootWorkflowNodes
2262
+ });
2263
+ }
2264
+ }
2265
+ return result.sort((a, b) => {
2266
+ if (a.packageName === "root")
2267
+ return 1;
2268
+ if (b.packageName === "root")
2269
+ return -1;
2270
+ return a.name.localeCompare(b.name);
2271
+ });
2272
+ } else {
2273
+ const allWorkflows = [...rootWorkflows];
2274
+ for (const packageWorkflows of packagesMap.values()) {
2275
+ allWorkflows.push(...packageWorkflows);
2276
+ }
2277
+ return allWorkflows.map(buildWorkflowNode).filter((node) => node !== null).sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2278
+ }
2279
+ };
2280
+ var buildTreeDataFromVersions2 = (versionSnapshots, workflowsByVersion, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount) => {
2281
+ const result = [];
2282
+ for (const snapshot of versionSnapshots) {
2283
+ const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
2284
+ const versionWorkflows = workflowsByVersion.get(versionKey) || [];
2285
+ const workflowChildren = buildTreeDataFromWorkflows(versionWorkflows, workflowTraceCounts, scenarioTraceCounts, filterMode, minTraceCount);
2286
+ if (workflowChildren.length === 0) {
2287
+ continue;
2288
+ }
2289
+ const versionTraceCount = versionWorkflows.reduce((sum, workflow) => {
2290
+ return sum + (workflowTraceCounts?.[workflow.id] ?? 0);
2291
+ }, 0);
2292
+ const repoName = snapshot.repositoryUrl.replace("https://github.com/", "");
2293
+ const shortSha = snapshot.commitSha.substring(0, 8);
2294
+ result.push({
2295
+ id: `version:${versionKey}`,
2296
+ name: `${repoName}@${shortSha}`,
2297
+ type: "version",
2298
+ versionSnapshot: snapshot,
2299
+ repositoryUrl: snapshot.repositoryUrl,
2300
+ commitSha: snapshot.commitSha,
2301
+ traceCount: versionTraceCount,
2302
+ hasTraces: versionTraceCount > 0,
2303
+ children: workflowChildren
2304
+ });
2305
+ }
2306
+ return result.sort((a, b) => (b.traceCount ?? 0) - (a.traceCount ?? 0));
2307
+ };
2308
+ var WorkflowScenarioTreeCore = ({
2309
+ workflows,
2310
+ theme,
2311
+ onClick,
2312
+ selectedNodeId,
2313
+ defaultOpen = false,
2314
+ initialOpenState,
2315
+ horizontalNodePadding = "16px",
2316
+ verticalNodePadding = "6px",
2317
+ verticalPadding = "20px",
2318
+ versionSnapshots,
2319
+ workflowTraceCounts,
2320
+ scenarioTraceCounts,
2321
+ workflowFilterMode = "all",
2322
+ minTraceCount = 1
2323
+ }) => {
2324
+ const rowHeight = useMemo10(() => {
2325
+ const paddingValue = parseFloat(verticalNodePadding);
2326
+ const contentLineHeight = 20;
2327
+ const borderHeight = 2;
2328
+ return contentLineHeight + paddingValue * 2 + borderHeight;
2329
+ }, [verticalNodePadding]);
2330
+ const treeData = useMemo10(() => {
2331
+ if (versionSnapshots && versionSnapshots.length > 0) {
2332
+ const workflowsByVersion = new Map;
2333
+ for (const snapshot of versionSnapshots) {
2334
+ const versionKey = `${snapshot.repositoryUrl}@${snapshot.commitSha}`;
2335
+ const versionWorkflows = workflows.filter((workflow) => {
2336
+ return snapshot.storyboards.some((sb) => sb.id === workflow.storyboardId);
2337
+ });
2338
+ workflowsByVersion.set(versionKey, versionWorkflows);
2339
+ }
2340
+ return buildTreeDataFromVersions2(versionSnapshots, workflowsByVersion, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount);
2341
+ } else {
2342
+ return buildTreeDataFromWorkflows(workflows, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount);
2343
+ }
2344
+ }, [workflows, versionSnapshots, workflowTraceCounts, scenarioTraceCounts, workflowFilterMode, minTraceCount]);
2345
+ const NodeRenderer = (props) => {
2346
+ const { node } = props;
2347
+ const data = node.data;
2348
+ const icon = data.type === "version" ? /* @__PURE__ */ React12.createElement(GitCommit2, {
2349
+ size: 16
2350
+ }) : data.type === "package" ? /* @__PURE__ */ React12.createElement(Package2, {
2351
+ size: 16
2352
+ }) : data.type === "workflow" ? /* @__PURE__ */ React12.createElement(Workflow2, {
2353
+ size: 16
2354
+ }) : data.type === "scenario" ? data.hasTraces ? /* @__PURE__ */ React12.createElement(ListChecks, {
2355
+ size: 16
2356
+ }) : /* @__PURE__ */ React12.createElement(List, {
2357
+ size: 16
2358
+ }) : null;
2359
+ const nameColor = data.type === "version" ? data.hasTraces ? "#a855f7" : theme.colors.textMuted : data.type === "package" ? theme.colors.primary : data.type === "workflow" ? data.hasTraces ? theme.colors.success : theme.colors.textSecondary : data.hasTraces ? theme.colors.secondary : theme.colors.textMuted;
2360
+ const nodeHorizontalPadding = data.type === "workflow" || data.type === "scenario" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2361
+ const rightContent = data.traceCount !== undefined ? /* @__PURE__ */ React12.createElement("span", {
2362
+ style: {
2363
+ marginLeft: "8px",
2364
+ fontSize: "12px",
2365
+ color: data.hasTraces ? data.type === "scenario" ? theme.colors.secondary : theme.colors.success : theme.colors.textMuted,
2366
+ fontWeight: 500
2367
+ }
2368
+ }, data.traceCount) : undefined;
2369
+ return /* @__PURE__ */ React12.createElement(TreeNode, {
2370
+ ...props,
2371
+ theme,
2372
+ nameColor,
2373
+ leftIcon: icon,
2374
+ rightContent,
2375
+ horizontalNodePadding: nodeHorizontalPadding,
2376
+ verticalNodePadding
2377
+ });
2378
+ };
2379
+ const handleSelect = (selectedNodes) => {
2380
+ if (selectedNodes.length === 0)
2381
+ return;
2382
+ const node = selectedNodes[0];
2383
+ const nodeData = node.data;
2384
+ if (nodeData.type === "workflow" || nodeData.type === "scenario") {
2385
+ onClick(nodeData);
2386
+ }
2387
+ };
2388
+ const initialHeight = 600;
2389
+ const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2390
+ return /* @__PURE__ */ React12.createElement("div", {
2391
+ ref: containerRef,
2392
+ style: {
2393
+ backgroundColor: theme.colors.background,
2394
+ color: theme.colors.text,
2395
+ fontFamily: theme.fonts.body,
2396
+ height: "100%",
2397
+ ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2398
+ }
2399
+ }, /* @__PURE__ */ React12.createElement(Tree4, {
2400
+ data: treeData,
2401
+ onSelect: handleSelect,
2402
+ openByDefault: defaultOpen,
2403
+ ...initialOpenState !== undefined && { initialOpenState },
2404
+ ...selectedNodeId !== undefined && { selection: selectedNodeId },
2405
+ width: "100%",
2406
+ height: containerHeight,
2407
+ rowHeight
2408
+ }, NodeRenderer));
2409
+ };
2410
+ // src/components/CanvasListTree/CanvasListTreeCore.tsx
2411
+ import { Package as Package3, Folder, LayoutDashboard as LayoutDashboard2, FileText } from "lucide-react";
2412
+ import React13, { useMemo as useMemo11, useRef as useRef6 } from "react";
2413
+ import { Tree as Tree5 } from "react-arborist";
2185
2414
  var buildTreeData = (canvases) => {
2186
2415
  const packagesMap = new Map;
2187
2416
  const rootCanvases = [];
@@ -2274,28 +2503,28 @@ var CanvasListTreeCore = ({
2274
2503
  enableDragAndDrop = false
2275
2504
  }) => {
2276
2505
  const dndProps = getDndProps(enableDragAndDrop);
2277
- const rowHeight = useMemo10(() => {
2506
+ const rowHeight = useMemo11(() => {
2278
2507
  const paddingValue = parseFloat(verticalNodePadding);
2279
2508
  const contentLineHeight = 20;
2280
2509
  const borderHeight = 2;
2281
2510
  return contentLineHeight + paddingValue * 2 + borderHeight;
2282
2511
  }, [verticalNodePadding]);
2283
- const treeData = useMemo10(() => buildTreeData(canvases), [canvases]);
2512
+ const treeData = useMemo11(() => buildTreeData(canvases), [canvases]);
2284
2513
  const NodeRenderer = (props) => {
2285
2514
  const { node } = props;
2286
2515
  const data = node.data;
2287
- const icon = data.type === "package" ? /* @__PURE__ */ React12.createElement(Package2, {
2516
+ const icon = data.type === "package" ? /* @__PURE__ */ React13.createElement(Package3, {
2288
2517
  size: 16
2289
- }) : data.type === "canvas-folder" ? /* @__PURE__ */ React12.createElement(Folder, {
2518
+ }) : data.type === "canvas-folder" ? /* @__PURE__ */ React13.createElement(Folder, {
2290
2519
  size: 16
2291
- }) : data.type === "overview" ? /* @__PURE__ */ React12.createElement(FileText, {
2520
+ }) : data.type === "overview" ? /* @__PURE__ */ React13.createElement(FileText, {
2292
2521
  size: 16
2293
- }) : /* @__PURE__ */ React12.createElement(LayoutDashboard2, {
2522
+ }) : /* @__PURE__ */ React13.createElement(LayoutDashboard2, {
2294
2523
  size: 16
2295
2524
  });
2296
2525
  const nameColor = data.type === "package" ? theme.colors.primary : data.type === "canvas-folder" ? theme.colors.textSecondary : data.type === "overview" ? theme.colors.info || "#3b82f6" : theme.colors.warning || "#f59e0b";
2297
2526
  const nodeHorizontalPadding = data.type === "overview" || data.type === "canvas" ? `calc(${horizontalNodePadding} + 12px)` : horizontalNodePadding;
2298
- return /* @__PURE__ */ React12.createElement(TreeNode, {
2527
+ return /* @__PURE__ */ React13.createElement(TreeNode, {
2299
2528
  ...props,
2300
2529
  theme,
2301
2530
  nameColor,
@@ -2322,7 +2551,7 @@ var CanvasListTreeCore = ({
2322
2551
  };
2323
2552
  const initialHeight = 600;
2324
2553
  const [containerRef, containerHeight] = useContainerHeight(initialHeight);
2325
- return /* @__PURE__ */ React12.createElement("div", {
2554
+ return /* @__PURE__ */ React13.createElement("div", {
2326
2555
  ref: containerRef,
2327
2556
  style: {
2328
2557
  backgroundColor: theme.colors.background,
@@ -2331,7 +2560,7 @@ var CanvasListTreeCore = ({
2331
2560
  height: "100%",
2332
2561
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2333
2562
  }
2334
- }, /* @__PURE__ */ React12.createElement(Tree4, {
2563
+ }, /* @__PURE__ */ React13.createElement(Tree5, {
2335
2564
  initialData: treeData,
2336
2565
  onSelect: handleSelect,
2337
2566
  openByDefault: defaultOpen,
@@ -2350,9 +2579,9 @@ import {
2350
2579
  Circle as Circle2,
2351
2580
  TestTube
2352
2581
  } from "lucide-react";
2353
- import React13, { useMemo as useMemo11, useRef as useRef7 } from "react";
2354
- import { Tree as Tree5 } from "react-arborist";
2355
- var TelemetryCoverageContext = React13.createContext(null);
2582
+ import React14, { useMemo as useMemo12, useRef as useRef7 } from "react";
2583
+ import { Tree as Tree6 } from "react-arborist";
2584
+ var TelemetryCoverageContext = React14.createContext(null);
2356
2585
  var DEFAULT_TEST_PATTERNS = [
2357
2586
  /\.test\.[jt]sx?$/,
2358
2587
  /\.spec\.[jt]sx?$/,
@@ -2369,7 +2598,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2369
2598
  switch (status) {
2370
2599
  case "covered":
2371
2600
  return {
2372
- icon: /* @__PURE__ */ React13.createElement(Activity, {
2601
+ icon: /* @__PURE__ */ React14.createElement(Activity, {
2373
2602
  size: 14
2374
2603
  }),
2375
2604
  color: "#22c55e",
@@ -2378,7 +2607,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2378
2607
  };
2379
2608
  case "partial":
2380
2609
  return {
2381
- icon: /* @__PURE__ */ React13.createElement(CircleDot2, {
2610
+ icon: /* @__PURE__ */ React14.createElement(CircleDot2, {
2382
2611
  size: 14
2383
2612
  }),
2384
2613
  color: "#eab308",
@@ -2387,7 +2616,7 @@ var getCoverageStatusDisplay = (coverage, _theme) => {
2387
2616
  };
2388
2617
  case "none":
2389
2618
  return {
2390
- icon: /* @__PURE__ */ React13.createElement(Circle2, {
2619
+ icon: /* @__PURE__ */ React14.createElement(Circle2, {
2391
2620
  size: 14
2392
2621
  }),
2393
2622
  color: "#6b7280",
@@ -2489,7 +2718,7 @@ var TelemetryCoverageFileTree = ({
2489
2718
  enableDragAndDrop = false
2490
2719
  }) => {
2491
2720
  const dndProps = getDndProps(enableDragAndDrop);
2492
- const coverageMap = useMemo11(() => {
2721
+ const coverageMap = useMemo12(() => {
2493
2722
  const map = new Map;
2494
2723
  coverageData.forEach((item) => {
2495
2724
  map.set(item.filePath, item);
@@ -2498,7 +2727,7 @@ var TelemetryCoverageFileTree = ({
2498
2727
  }, [coverageData]);
2499
2728
  const NodeRenderer = (props) => {
2500
2729
  const { node } = props;
2501
- const ctx = React13.useContext(TelemetryCoverageContext);
2730
+ const ctx = React14.useContext(TelemetryCoverageContext);
2502
2731
  const coverage = ctx?.coverageMap.get(node.data.id);
2503
2732
  const hasTracedChildren = ctx?.hasTracedChildrenMap.get(node.data.id);
2504
2733
  const coverageDisplay = coverage ? getCoverageStatusDisplay(coverage, theme) : null;
@@ -2510,11 +2739,11 @@ var TelemetryCoverageFileTree = ({
2510
2739
  } else if (node.data.isTestFile) {
2511
2740
  nameColor = "#6b728080";
2512
2741
  }
2513
- const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React13.createElement(TestTube, {
2742
+ const leftIcon = node.data.isTestFile && !coverage ? /* @__PURE__ */ React14.createElement(TestTube, {
2514
2743
  size: 14,
2515
2744
  style: { marginRight: 4, color: "#6b7280" }
2516
2745
  }) : null;
2517
- const rightContent = coverageDisplay ? /* @__PURE__ */ React13.createElement("div", {
2746
+ const rightContent = coverageDisplay ? /* @__PURE__ */ React14.createElement("div", {
2518
2747
  style: {
2519
2748
  display: "flex",
2520
2749
  alignItems: "center",
@@ -2522,14 +2751,14 @@ var TelemetryCoverageFileTree = ({
2522
2751
  marginRight: "8px"
2523
2752
  },
2524
2753
  title: coverageDisplay.label
2525
- }, coverageDisplay.icon, /* @__PURE__ */ React13.createElement("span", {
2754
+ }, coverageDisplay.icon, /* @__PURE__ */ React14.createElement("span", {
2526
2755
  style: {
2527
2756
  marginLeft: "4px",
2528
2757
  fontSize: theme.fontSizes[0],
2529
2758
  fontWeight: "bold",
2530
2759
  fontFamily: "monospace"
2531
2760
  }
2532
- }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React13.createElement("div", {
2761
+ }, coverageDisplay.badge)) : node.data.isTestFile ? /* @__PURE__ */ React14.createElement("div", {
2533
2762
  style: {
2534
2763
  display: "flex",
2535
2764
  alignItems: "center",
@@ -2538,10 +2767,10 @@ var TelemetryCoverageFileTree = ({
2538
2767
  opacity: 0.5
2539
2768
  },
2540
2769
  title: "No telemetry instrumentation"
2541
- }, /* @__PURE__ */ React13.createElement(Circle2, {
2770
+ }, /* @__PURE__ */ React14.createElement(Circle2, {
2542
2771
  size: 14
2543
2772
  })) : null;
2544
- return /* @__PURE__ */ React13.createElement(TreeNode, {
2773
+ return /* @__PURE__ */ React14.createElement(TreeNode, {
2545
2774
  ...props,
2546
2775
  theme,
2547
2776
  rightContent,
@@ -2556,16 +2785,16 @@ var TelemetryCoverageFileTree = ({
2556
2785
  }
2557
2786
  });
2558
2787
  };
2559
- const treeStructure = useMemo11(() => {
2788
+ const treeStructure = useMemo12(() => {
2560
2789
  return transformTreeStructure2(fileTree, showOnlyTestFiles, testFilePatterns);
2561
2790
  }, [fileTree, showOnlyTestFiles, testFilePatterns]);
2562
- const treeData = useMemo11(() => {
2791
+ const treeData = useMemo12(() => {
2563
2792
  if (showUncoveredFiles) {
2564
2793
  return treeStructure;
2565
2794
  }
2566
2795
  return filterCoveredNodes(treeStructure, coverageMap);
2567
2796
  }, [treeStructure, showUncoveredFiles, coverageMap]);
2568
- const hasTracedChildrenMap = useMemo11(() => {
2797
+ const hasTracedChildrenMap = useMemo12(() => {
2569
2798
  const map = new Map;
2570
2799
  const markTracedParents = (nodes) => {
2571
2800
  let hasTraced = false;
@@ -2606,7 +2835,7 @@ var TelemetryCoverageFileTree = ({
2606
2835
  onDirectorySelect(selectedDirs);
2607
2836
  }
2608
2837
  };
2609
- const calculatedHeight = useMemo11(() => {
2838
+ const calculatedHeight = useMemo12(() => {
2610
2839
  if (autoHeight) {
2611
2840
  const visibleNodeCount = countVisibleNodes3(treeData, openByDefault);
2612
2841
  return visibleNodeCount * 28;
@@ -2614,7 +2843,7 @@ var TelemetryCoverageFileTree = ({
2614
2843
  return initialHeight;
2615
2844
  }, [autoHeight, treeData, openByDefault, initialHeight]);
2616
2845
  const [containerRef, containerHeight] = useContainerHeight(calculatedHeight);
2617
- return /* @__PURE__ */ React13.createElement("div", {
2846
+ return /* @__PURE__ */ React14.createElement("div", {
2618
2847
  ref: containerRef,
2619
2848
  style: {
2620
2849
  backgroundColor: transparentBackground ? "transparent" : theme.colors.background,
@@ -2623,9 +2852,9 @@ var TelemetryCoverageFileTree = ({
2623
2852
  ...autoHeight ? {} : { height: "100%" },
2624
2853
  ...verticalPadding ? { paddingTop: verticalPadding, paddingBottom: verticalPadding } : {}
2625
2854
  }
2626
- }, /* @__PURE__ */ React13.createElement(TelemetryCoverageContext.Provider, {
2855
+ }, /* @__PURE__ */ React14.createElement(TelemetryCoverageContext.Provider, {
2627
2856
  value: { coverageMap, hasTracedChildrenMap }
2628
- }, /* @__PURE__ */ React13.createElement(Tree5, {
2857
+ }, /* @__PURE__ */ React14.createElement(Tree6, {
2629
2858
  data: treeData,
2630
2859
  onSelect: handleSelect,
2631
2860
  ...selectedFile !== undefined && { selection: selectedFile },
@@ -2654,7 +2883,7 @@ var calculateTelemetryCoverageStats = (coverageData) => {
2654
2883
  };
2655
2884
  // src/components/TelemetryCoverageFileTreeContainer.tsx
2656
2885
  import { RefreshCw as RefreshCw2, Eye as Eye2, EyeOff as EyeOff2, AlertCircle as AlertCircle4, Activity as Activity2 } from "lucide-react";
2657
- import React14, { useState as useState7, useMemo as useMemo12 } from "react";
2886
+ import React15, { useState as useState7, useMemo as useMemo13 } from "react";
2658
2887
  var TelemetryCoverageFileTreeContainer = ({
2659
2888
  fileTree,
2660
2889
  theme,
@@ -2676,10 +2905,10 @@ var TelemetryCoverageFileTreeContainer = ({
2676
2905
  }) => {
2677
2906
  const [filters, setFilters] = useState7([]);
2678
2907
  const [showUncoveredFiles, setShowUncoveredFiles] = useState7(true);
2679
- const selectedDirectories = useMemo12(() => {
2908
+ const selectedDirectories = useMemo13(() => {
2680
2909
  return filters.filter((f) => f.mode === "include").map((f) => f.path);
2681
2910
  }, [filters]);
2682
- const stats = useMemo12(() => calculateTelemetryCoverageStats(coverageData), [coverageData]);
2911
+ const stats = useMemo13(() => calculateTelemetryCoverageStats(coverageData), [coverageData]);
2683
2912
  const handleRefresh = () => {
2684
2913
  onRefresh?.();
2685
2914
  };
@@ -2687,34 +2916,34 @@ var TelemetryCoverageFileTreeContainer = ({
2687
2916
  setShowUncoveredFiles(!showUncoveredFiles);
2688
2917
  };
2689
2918
  const percentageColor = stats.percentage >= 80 ? "#22c55e" : stats.percentage >= 50 ? "#eab308" : stats.percentage > 0 ? "#f97316" : "#6b7280";
2690
- return /* @__PURE__ */ React14.createElement("div", {
2919
+ return /* @__PURE__ */ React15.createElement("div", {
2691
2920
  style: { display: "flex", flexDirection: "column", height: "100%" }
2692
- }, showControls && /* @__PURE__ */ React14.createElement("div", {
2921
+ }, showControls && /* @__PURE__ */ React15.createElement("div", {
2693
2922
  style: {
2694
2923
  padding: "12px",
2695
2924
  borderBottom: `1px solid ${theme.colors.border || "#e0e0e0"}`,
2696
2925
  backgroundColor: theme.colors.backgroundSecondary || theme.colors.background
2697
2926
  }
2698
- }, /* @__PURE__ */ React14.createElement("div", {
2927
+ }, /* @__PURE__ */ React15.createElement("div", {
2699
2928
  style: {
2700
2929
  display: "flex",
2701
2930
  alignItems: "center",
2702
2931
  justifyContent: "space-between",
2703
2932
  marginBottom: "8px"
2704
2933
  }
2705
- }, /* @__PURE__ */ React14.createElement("div", {
2934
+ }, /* @__PURE__ */ React15.createElement("div", {
2706
2935
  style: { display: "flex", alignItems: "center", gap: "8px" }
2707
- }, /* @__PURE__ */ React14.createElement(Activity2, {
2936
+ }, /* @__PURE__ */ React15.createElement(Activity2, {
2708
2937
  size: 16,
2709
2938
  color: theme.colors.primary
2710
- }), /* @__PURE__ */ React14.createElement("h3", {
2939
+ }), /* @__PURE__ */ React15.createElement("h3", {
2711
2940
  style: {
2712
2941
  margin: 0,
2713
2942
  fontSize: theme.fontSizes[1],
2714
2943
  fontWeight: "bold",
2715
2944
  color: theme.colors.text
2716
2945
  }
2717
- }, title), stats.testFiles > 0 && /* @__PURE__ */ React14.createElement("span", {
2946
+ }, title), stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("span", {
2718
2947
  style: {
2719
2948
  backgroundColor: percentageColor,
2720
2949
  color: "#ffffff",
@@ -2724,14 +2953,14 @@ var TelemetryCoverageFileTreeContainer = ({
2724
2953
  fontWeight: "bold",
2725
2954
  fontFamily: "monospace"
2726
2955
  }
2727
- }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React14.createElement(RefreshCw2, {
2956
+ }, stats.percentage, "%"), isLoading && /* @__PURE__ */ React15.createElement(RefreshCw2, {
2728
2957
  size: 16,
2729
2958
  color: theme.colors.text,
2730
2959
  className: "telemetry-coverage-spinner",
2731
2960
  style: { animation: "spin 1s linear infinite" }
2732
- })), /* @__PURE__ */ React14.createElement("div", {
2961
+ })), /* @__PURE__ */ React15.createElement("div", {
2733
2962
  style: { display: "flex", gap: "8px" }
2734
- }, /* @__PURE__ */ React14.createElement("button", {
2963
+ }, /* @__PURE__ */ React15.createElement("button", {
2735
2964
  onClick: toggleShowUncoveredFiles,
2736
2965
  style: {
2737
2966
  background: "none",
@@ -2746,11 +2975,11 @@ var TelemetryCoverageFileTreeContainer = ({
2746
2975
  color: theme.colors.text
2747
2976
  },
2748
2977
  title: showUncoveredFiles ? "Show only covered files" : "Show all test files"
2749
- }, showUncoveredFiles ? /* @__PURE__ */ React14.createElement(EyeOff2, {
2978
+ }, showUncoveredFiles ? /* @__PURE__ */ React15.createElement(EyeOff2, {
2750
2979
  size: 14
2751
- }) : /* @__PURE__ */ React14.createElement(Eye2, {
2980
+ }) : /* @__PURE__ */ React15.createElement(Eye2, {
2752
2981
  size: 14
2753
- }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React14.createElement("button", {
2982
+ }), showUncoveredFiles ? "Hide uncovered" : "Show all"), onRefresh && /* @__PURE__ */ React15.createElement("button", {
2754
2983
  onClick: handleRefresh,
2755
2984
  disabled: isLoading,
2756
2985
  style: {
@@ -2767,9 +2996,9 @@ var TelemetryCoverageFileTreeContainer = ({
2767
2996
  opacity: isLoading ? 0.6 : 1
2768
2997
  },
2769
2998
  title: "Refresh coverage data"
2770
- }, /* @__PURE__ */ React14.createElement(RefreshCw2, {
2999
+ }, /* @__PURE__ */ React15.createElement(RefreshCw2, {
2771
3000
  size: 14
2772
- }), "Refresh"))), error && /* @__PURE__ */ React14.createElement("div", {
3001
+ }), "Refresh"))), error && /* @__PURE__ */ React15.createElement("div", {
2773
3002
  style: {
2774
3003
  display: "flex",
2775
3004
  alignItems: "center",
@@ -2782,36 +3011,36 @@ var TelemetryCoverageFileTreeContainer = ({
2782
3011
  color: "#856404",
2783
3012
  marginBottom: "8px"
2784
3013
  }
2785
- }, /* @__PURE__ */ React14.createElement(AlertCircle4, {
3014
+ }, /* @__PURE__ */ React15.createElement(AlertCircle4, {
2786
3015
  size: 14
2787
- }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React14.createElement("div", {
3016
+ }), error), !error && stats.testFiles > 0 && /* @__PURE__ */ React15.createElement("div", {
2788
3017
  style: {
2789
3018
  display: "flex",
2790
3019
  gap: "16px",
2791
3020
  fontSize: theme.fontSizes[0],
2792
3021
  color: theme.colors.textSecondary || "#666"
2793
3022
  }
2794
- }, /* @__PURE__ */ React14.createElement("span", null, /* @__PURE__ */ React14.createElement("strong", {
3023
+ }, /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
2795
3024
  style: { color: "#22c55e" }
2796
- }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React14.createElement("span", null, /* @__PURE__ */ React14.createElement("strong", {
3025
+ }, stats.coveredFiles), " covered"), stats.partialFiles > 0 && /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
2797
3026
  style: { color: "#eab308" }
2798
- }, stats.partialFiles), " partial"), /* @__PURE__ */ React14.createElement("span", null, /* @__PURE__ */ React14.createElement("strong", {
3027
+ }, stats.partialFiles), " partial"), /* @__PURE__ */ React15.createElement("span", null, /* @__PURE__ */ React15.createElement("strong", {
2799
3028
  style: { color: "#6b7280" }
2800
- }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React14.createElement("span", {
3029
+ }, stats.uncoveredFiles), " uncovered"), /* @__PURE__ */ React15.createElement("span", {
2801
3030
  style: { marginLeft: "auto" }
2802
- }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React14.createElement("div", {
3031
+ }, stats.totalTraced, "/", stats.totalTests, " tests traced")), !error && stats.testFiles === 0 && /* @__PURE__ */ React15.createElement("div", {
2803
3032
  style: {
2804
3033
  fontSize: theme.fontSizes[0],
2805
3034
  color: theme.colors.textSecondary || "#666"
2806
3035
  }
2807
- }, "No test files with coverage data found")), /* @__PURE__ */ React14.createElement(DirectoryFilterInput, {
3036
+ }, "No test files with coverage data found")), /* @__PURE__ */ React15.createElement(DirectoryFilterInput, {
2808
3037
  fileTree,
2809
3038
  theme,
2810
3039
  filters,
2811
3040
  onFiltersChange: setFilters
2812
- }), /* @__PURE__ */ React14.createElement("div", {
3041
+ }), /* @__PURE__ */ React15.createElement("div", {
2813
3042
  style: { flex: 1, marginTop: "1rem", overflow: "hidden" }
2814
- }, /* @__PURE__ */ React14.createElement(TelemetryCoverageFileTree, {
3043
+ }, /* @__PURE__ */ React15.createElement(TelemetryCoverageFileTree, {
2815
3044
  fileTree,
2816
3045
  theme,
2817
3046
  coverageData,
@@ -2837,6 +3066,7 @@ export {
2837
3066
  extractNameFromPath,
2838
3067
  combineRepositoryTrees,
2839
3068
  calculateTelemetryCoverageStats,
3069
+ WorkflowScenarioTreeCore,
2840
3070
  TreeNode,
2841
3071
  TelemetryCoverageFileTreeContainer,
2842
3072
  TelemetryCoverageFileTree,
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { WorkflowScenarioTreeCore } from './WorkflowScenarioTreeCore';
3
+ declare const meta: Meta<typeof WorkflowScenarioTreeCore>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof WorkflowScenarioTreeCore>;
6
+ export declare const Default: Story;
7
+ export declare const WithFilterMode: Story;
8
+ export declare const WithVersions: Story;
9
+ //# sourceMappingURL=WorkflowScenarioTree.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowScenarioTree.stories.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/WorkflowScenarioTree.stories.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AA8MtE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,wBAAwB,CAI/C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,wBAAwB,CAAC,CAAC;AAEvD,eAAO,MAAM,OAAO,EAAE,KASrB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAuG5B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAwC1B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { WorkflowScenarioTreeProps } from './types';
3
+ export declare const WorkflowScenarioTreeCore: React.FC<WorkflowScenarioTreeProps>;
4
+ //# sourceMappingURL=WorkflowScenarioTreeCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkflowScenarioTreeCore.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/WorkflowScenarioTreeCore.tsx"],"names":[],"mappings":"AACA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAEV,yBAAyB,EAI1B,MAAM,SAAS,CAAC;AAwMjB,eAAO,MAAM,wBAAwB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAgKxE,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { WorkflowScenarioTreeCore } from './WorkflowScenarioTreeCore';
2
+ export type { WorkflowScenarioTreeProps, WorkflowScenarioNodeData, WorkflowScenarioNodeType, WorkflowWithScenarios, WorkflowFilterMode, } from './types';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EACV,yBAAyB,EACzB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,76 @@
1
+ import type { Theme } from '@principal-ade/industry-theme';
2
+ import type { DiscoveredStoryboard, DiscoveredWorkflow, WorkflowScenario, VersionSnapshot } from '@principal-ai/principal-view-core';
3
+ import type { TreeNodeData } from '../TreeNode';
4
+ export type { DiscoveredStoryboard, DiscoveredWorkflow, WorkflowScenario, VersionSnapshot };
5
+ /**
6
+ * Workflow filter mode
7
+ * - 'all': Show all workflows
8
+ * - 'with-traces': Show only workflows that have traces
9
+ * - 'without-traces': Show only workflows that don't have traces
10
+ * - 'minimum-traces': Show workflows with at least N traces (use minTraceCount)
11
+ */
12
+ export type WorkflowFilterMode = 'all' | 'with-traces' | 'without-traces' | 'minimum-traces';
13
+ /**
14
+ * Node types in the workflow-scenario tree
15
+ */
16
+ export type WorkflowScenarioNodeType = 'version' | 'package' | 'workflow' | 'scenario';
17
+ /**
18
+ * Extended workflow with scenarios and parent storyboard info
19
+ */
20
+ export interface WorkflowWithScenarios extends DiscoveredWorkflow {
21
+ /** Parent storyboard for context */
22
+ storyboard: DiscoveredStoryboard;
23
+ /** Workflow scenarios (from WorkflowTemplate.scenarios) */
24
+ scenarios: WorkflowScenario[];
25
+ }
26
+ /**
27
+ * Node data for workflow-scenario tree
28
+ */
29
+ export interface WorkflowScenarioNodeData extends TreeNodeData {
30
+ type: WorkflowScenarioNodeType;
31
+ children?: WorkflowScenarioNodeData[];
32
+ versionSnapshot?: VersionSnapshot;
33
+ repositoryUrl?: string;
34
+ commitSha?: string;
35
+ packageName?: string;
36
+ scope?: 'package' | 'root';
37
+ workflow?: WorkflowWithScenarios;
38
+ scenario?: WorkflowScenario;
39
+ storyboard?: DiscoveredStoryboard;
40
+ traceCount?: number;
41
+ hasTraces?: boolean;
42
+ }
43
+ /**
44
+ * Props for WorkflowScenarioTree component
45
+ */
46
+ export interface WorkflowScenarioTreeProps {
47
+ /** Workflows with scenarios and storyboard context */
48
+ workflows: WorkflowWithScenarios[];
49
+ /** Theme for styling */
50
+ theme: Theme;
51
+ /** Click handler */
52
+ onClick: (node: WorkflowScenarioNodeData) => void;
53
+ /** Selected node ID */
54
+ selectedNodeId?: string;
55
+ /** Default open state */
56
+ defaultOpen?: boolean;
57
+ /** Initial open state for specific nodes */
58
+ initialOpenState?: Record<string, boolean>;
59
+ /** Horizontal padding for nodes */
60
+ horizontalNodePadding?: string;
61
+ /** Vertical padding for nodes */
62
+ verticalNodePadding?: string;
63
+ /** Vertical padding for container */
64
+ verticalPadding?: string;
65
+ /** Optional version snapshots for grouping workflows by version */
66
+ versionSnapshots?: VersionSnapshot[];
67
+ /** Map of workflow ID to trace count */
68
+ workflowTraceCounts?: Record<string, number>;
69
+ /** Map of scenario ID to trace count (format: "workflowId/scenarioId") */
70
+ scenarioTraceCounts?: Record<string, number>;
71
+ /** Filter mode for workflows/scenarios */
72
+ workflowFilterMode?: WorkflowFilterMode;
73
+ /** Minimum trace count (when workflowFilterMode is 'minimum-traces') */
74
+ minTraceCount?: number;
75
+ }
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/components/WorkflowScenarioTree/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAErI,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD,YAAY,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAC;AAE5F;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG,KAAK,GAAG,aAAa,GAAG,gBAAgB,GAAG,gBAAgB,CAAC;AAE7F;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAEvF;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB;IAC/D,oCAAoC;IACpC,UAAU,EAAE,oBAAoB,CAAC;IACjC,2DAA2D;IAC3D,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,wBAAyB,SAAQ,YAAY;IAC5D,IAAI,EAAE,wBAAwB,CAAC;IAC/B,QAAQ,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAGtC,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAGlC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,sDAAsD;IACtD,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,wBAAwB;IACxB,KAAK,EAAE,KAAK,CAAC;IACb,oBAAoB;IACpB,OAAO,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAClD,uBAAuB;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,mCAAmC;IACnC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,iCAAiC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;IAGzB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IAGrC,wCAAwC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,0EAA0E;IAC1E,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAG7C,0CAA0C;IAC1C,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@principal-ade/dynamic-file-tree",
3
- "version": "0.1.59",
3
+ "version": "0.1.61",
4
4
  "description": "React component for selective directory filtering and file tree visualization",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",