/* eslint-disable @nx/enforce-module-boundaries */ // nx-ignore-next-line import type { TargetConfiguration } from '@nx/devkit'; import { JsonCodeBlock } from '@nx/graph/ui-code-block'; import { useCallback, useContext, useEffect, useState } from 'react'; import { SourceInfo } from '../source-info/source-info'; import { FadingCollapsible } from './fading-collapsible'; import { TargetConfigurationProperty } from './target-configuration-property'; import { selectSourceInfo } from './target-configuration-details.util'; import { CopyToClipboard } from '../copy-to-clipboard/copy-to-clipboard'; import { PropertyInfoTooltip, Tooltip } from '@nx/graph/ui-tooltips'; import { TooltipTriggerText } from './tooltip-trigger-text'; import { Pill } from '../pill'; import { TargetConfigurationDetailsHeader } from '../target-configuration-details-header/target-configuration-details-header'; import { ExpandedTargetsContext } from '@nx/graph/shared'; import { getDisplayHeaderFromTargetConfiguration } from '../utils/get-display-header-from-target-configuration'; import { TargetExecutor } from '../target-executor/target-executor'; import { TargetExecutorTitle } from '../target-executor/target-executor-title'; interface TargetConfigurationDetailsProps { projectName: string; targetName: string; targetConfiguration: TargetConfiguration; sourceMap: Record; variant?: 'default' | 'compact'; onCollapse?: (targetName: string) => void; onExpand?: (targetName: string) => void; onRunTarget?: (data: { projectName: string; targetName: string }) => void; onViewInTaskGraph?: (data: { projectName: string; targetName: string; }) => void; collapsable: boolean; } export default function TargetConfigurationDetails({ variant, projectName, targetName, targetConfiguration, sourceMap, onViewInTaskGraph, onRunTarget, collapsable, }: TargetConfigurationDetailsProps) { const isCompact = variant === 'compact'; const [collapsed, setCollapsed] = useState(true); const { expandedTargets, toggleTarget } = useContext(ExpandedTargetsContext); const handleCopyClick = async (copyText: string) => { await window.navigator.clipboard.writeText(copyText); }; const handleCollapseToggle = useCallback(() => { if (toggleTarget) { toggleTarget(targetName); } }, [toggleTarget, targetName]); useEffect(() => { if (!collapsable) { setCollapsed(false); return; } if (expandedTargets?.includes(targetName)) { setCollapsed(false); } else { setCollapsed(true); } }, [expandedTargets, targetName, collapsable]); const { link, options, script, ...displayHeader } = getDisplayHeaderFromTargetConfiguration(targetConfiguration); const configurations = targetConfiguration.configurations; const shouldRenderOptions = options && (typeof options === 'object' ? Object.keys(options).length : true); const shouldRenderConfigurations = configurations && (typeof configurations === 'object' ? Object.keys(configurations).length : true); return (
{/* body */} {!collapsed && (

{script && (

)} {targetConfiguration.inputs && (

) as any} > Inputs handleCopyClick( `"inputs": ${JSON.stringify( targetConfiguration.inputs )}` ) } />

    {targetConfiguration.inputs.map((input, idx) => { const sourceInfo = selectSourceInfo( sourceMap, `targets.${targetName}.inputs` ); return (
  • {sourceInfo && ( )}
  • ); })}
)} {targetConfiguration.outputs && (

) as any} > Outputs handleCopyClick( `"outputs": ${JSON.stringify( targetConfiguration.outputs )}` ) } />

    {targetConfiguration.outputs?.map((output, idx) => { const sourceInfo = selectSourceInfo( sourceMap, `targets.${targetName}.outputs` ); return (
  • {sourceInfo && ( )}
  • ); }) ?? no outputs}
)} {targetConfiguration.dependsOn && (

) as any} > Depends On handleCopyClick( `"dependsOn": ${JSON.stringify( targetConfiguration.dependsOn )}` ) } />

    {targetConfiguration.dependsOn.map((dep, idx) => { const sourceInfo = selectSourceInfo( sourceMap, `targets.${targetName}.dependsOn` ); return (
  • {sourceInfo && ( )}
  • ); })}
)} {shouldRenderOptions ? ( <>

) as any} > Options

{ const sourceInfo = selectSourceInfo( sourceMap, `targets.${targetName}.options.${propertyName}` ); return sourceInfo ? ( ) : null; }} />
) : ( '' )} {shouldRenderConfigurations ? ( <>

) as any } > Configurations {' '} {targetConfiguration.defaultConfiguration && ( )}

{ const sourceInfo = selectSourceInfo( sourceMap, `targets.${targetName}.configurations.${propertyName}` ); return sourceInfo ? ( {' '} ) : null; }} /> ) : ( '' )}
)}
); }