class_docstr: Virtual pipeline end node.
  
  While the pipeline end node does not exist nor accessible in DSL, having a
  PipelineEnd class helps generalizing the compilation.
  
  Supported features:
    - Node ID (which is "{pipeline_id}_end")
    - Node type name
    - Node inputs, which comes from the inner pipeline (i.e. the raw value
        used from Pipeline(outputs=raw_outputs))
    - Node outputs, which is the wrapped OutputChannel of the pipeline node
        that is visible from the outer pipeline
  
  Not yet supported:
    - upstream/downstream nodes relationship
class_docstr_tok: ["Virtual","pipeline","end","node",".","While","the","pipeline","end","node","does","not","exist","nor","accessible","in","DSL",",","having","a","PipelineEnd","class","helps","generalizing","the","compilation",".","Supported","features",":","-","Node","ID","(","which","is","``","{","pipeline_id","}","_end","''",")","-","Node","type","name","-","Node","inputs",",","which","comes","from","the","inner","pipeline","(","i.e",".","the","raw","value","used","from","Pipeline","(","outputs=raw_outputs",")",")","-","Node","outputs",",","which","is","the","wrapped","OutputChannel","of","the","pipeline","node","that","is","visible","from","the","outer","pipeline","Not","yet","supported",":","-","upstream\/downstream","nodes","relationship"]
code: def type(self) -> str:
      return pipeline_end_node_type_name(self._pipeline)
  
imports: from typing import cast, List, Optional, Sequence, Tuple, Type, Union, Dict, Any, Set
  from tfx import types
  from tfx.dsl.compiler import constants
  from tfx.dsl.components.base import base_node
  from tfx.dsl.components.common import importer
  from tfx.dsl.components.common import resolver
  from tfx.dsl.context_managers import dsl_context_registry
  from tfx.dsl.placeholder import placeholder
  from tfx.orchestration import data_types_utils
  from tfx.orchestration import pipeline
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.types import channel
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 2 for calling the _PipelineEnd obj's underlying member method code with example usage: obj.type() and returns: pipeline_end_node_type_name