or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

configuration-management.mdcore-engine.mddocument-processing.mdindex.mdmessage-system.mdpipeline-system.md
tile.json

pipeline-system.mddocs/

Pipeline System

AutoRest Core's pipeline system provides an extensible plugin architecture with 40+ built-in plugins for document processing, validation, transformation, and code generation.

Capabilities

Pipeline Plugin Architecture

Core plugin system that enables extensible document processing through a chain of transformations.

/**
 * Function signature for AutoRest pipeline plugins
 * Each plugin receives configuration, input data, and output sink
 * @param config - AutoRest context with configuration and utilities
 * @param input - Input data source from previous pipeline stage
 * @param sink - Output data sink for transformed results
 * @returns Promise resolving to transformed data source
 */
type PipelinePlugin = (
  config: AutorestContext,
  input: DataSource,
  sink: DataSink
) => Promise<DataSource>;

/**
 * Definition of a pipeline plugin with metadata
 * Used for plugin registration and management
 */
interface PipelinePluginDefinition {
  /** Unique name identifying the plugin */
  readonly name: string;
  
  /** The plugin function implementation */
  readonly plugin: PipelinePlugin;
  
  /** Extension that provides this plugin (undefined for built-in) */
  readonly extension: AutoRestExtension | undefined;
  
  /** Whether this plugin is built into AutoRest Core */
  readonly builtIn: boolean;
}

Plugin Implementation Example:

import { PipelinePlugin, AutorestContext } from "@autorest/core";

// Custom validation plugin
const customValidationPlugin: PipelinePlugin = async (config, input, sink) => {
  console.log(`Running custom validation for ${config.pluginName}`);
  
  // Process each document in the input
  const documents = await input.ReadAll();
  
  for (const doc of documents) {
    const content = await doc.ReadAll();
    
    // Perform custom validation
    if (content.includes("deprecated")) {
      config.logger.warn("Document contains deprecated elements");
    }
    
    // Pass document through to output
    await sink.WriteData(doc.key, content, doc.identity, doc.artifactType);
  }
  
  return sink;
};

// Register the plugin
const pluginDefinition: PipelinePluginDefinition = {
  name: "custom-validator",
  plugin: customValidationPlugin,
  extension: undefined, // Built-in plugin
  builtIn: true
};

Pipeline Execution

Functions for executing the complete AutoRest processing pipeline.

/**
 * Execute the complete AutoRest processing pipeline
 * Orchestrates all configured plugins in the correct order
 * @param configView - AutoRest context with configuration
 * @param fileSystem - File system interface for I/O operations
 */
async function runPipeline(
  configView: AutorestContext, 
  fileSystem: IFileSystem
): Promise<void>;

/**
 * Load all available plugins (built-in and extensions)
 * Discovers and initializes plugins based on configuration
 * @param context - AutoRest context for plugin discovery
 * @returns Promise resolving to map of plugin name to definition
 */
async function loadPlugins(
  context: AutorestContext
): Promise<{ [pluginName: string]: PipelinePluginDefinition }>;

/**
 * Create a per-file processing plugin from a file processor
 * Utility for creating plugins that process individual files
 * @param processorBuilder - Function that builds file processor
 * @returns Pipeline plugin that processes each file individually
 */
function createPerFilePlugin(
  processorBuilder: (config: AutorestContext) => Promise<(input: DataHandle, sink: DataSink) => Promise<DataHandle>>
): PipelinePlugin;

Pipeline Execution Example:

import { runPipeline, loadPlugins, AutoRest } from "@autorest/core";
import { RealFileSystem } from "@azure-tools/datastore";

async function executeFullPipeline() {
  const autorest = new AutoRest(console.log);
  
  // Configure for C# generation
  autorest.AddConfiguration({
    "input-file": "swagger.json",
    "output-folder": "./generated",
    "csharp": {
      "namespace": "MyClient"
    }
  });
  
  const context = await autorest.view;
  const fileSystem = new RealFileSystem();
  
  // Load all available plugins
  const plugins = await loadPlugins(context);
  console.log(`Loaded ${Object.keys(plugins).length} plugins`);
  
  // Execute the complete pipeline
  await runPipeline(context, fileSystem);
  console.log("Pipeline execution completed");
}

Built-in Plugins

Comprehensive set of built-in plugins for common AutoRest operations.

/**
 * Map of all built-in core plugins
 * Contains 40+ plugins for various processing stages
 */
const CORE_PLUGIN_MAP: { [pluginName: string]: PipelinePluginDefinition };

Key Built-in Plugins:

Document Loading:

  • loader-swagger - Loads Swagger 2.0 documents
  • loader-openapi - Loads OpenAPI 3.0+ documents
  • full-ref-resolver - Resolves $ref references across documents

Validation:

  • schema-validator-openapi - Validates OpenAPI 3.0+ schemas
  • schema-validator-swagger - Validates Swagger 2.0 schemas
  • semantic-validator - Performs semantic validation

Transformation:

  • openapi-document-converter - Converts Swagger 2.0 to OpenAPI 3.0+
  • transform - Generic document transformation
  • text-transform - Text-based transformations
  • new-transform - Graph-based transformations

Processing:

  • tree-shaker - Removes unused schema components
  • enum-deduplicator - Removes duplicate enum definitions
  • model-deduplicator - Removes duplicate model definitions
  • components-cleaner - Cleans up unused components

Output:

  • emitter - Emits final artifacts
  • configuration-emitter - Emits configuration files

Example Plugin Usage:

import { loadPlugins } from "@autorest/core";

async function inspectPlugins(context: AutorestContext) {
  const plugins = await loadPlugins(context);
  
  // List validation plugins
  const validationPlugins = Object.entries(plugins)
    .filter(([name]) => name.includes('validator'))
    .map(([name, def]) => ({
      name,
      builtIn: def.builtIn,
      extension: def.extension?.name
    }));
    
  console.log("Validation plugins:", validationPlugins);
  
  // List transformation plugins
  const transformPlugins = Object.entries(plugins)
    .filter(([name]) => name.includes('transform'))
    .map(([name, def]) => ({ name, builtIn: def.builtIn }));
    
  console.log("Transform plugins:", transformPlugins);
}

Plugin Configuration

Plugins can be configured and customized through the AutoRest configuration system.

// Enable specific plugins
autorest.AddConfiguration({
  "input-file": "swagger.json",
  "use-extension": ["@autorest/csharp"],
  "pipeline": {
    // Customize plugin execution order
    "swagger-document/transform": [
      "schema-validator-swagger", 
      "semantic-validator",
      "openapi-document-converter"
    ]
  }
});

// Configure plugin-specific settings  
autorest.AddConfiguration({
  "schema-validator": {
    "strict-mode": true
  },
  "tree-shaker": {
    "preserve-unused": false
  }
});

Custom Plugin Integration

Example of integrating custom plugins into the pipeline:

import { AutoRest, PipelinePluginDefinition } from "@autorest/core";

// Define custom plugin
const myCustomPlugin: PipelinePluginDefinition = {
  name: "my-custom-processor",
  plugin: async (config, input, sink) => {
    // Custom processing logic
    const docs = await input.ReadAll();
    
    for (const doc of docs) {
      let content = await doc.ReadAll();
      
      // Apply custom transformations
      content = content.replace(/oldPattern/g, 'newPattern');
      
      await sink.WriteData(doc.key, content, doc.identity);
    }
    
    return sink;
  },
  extension: undefined,
  builtIn: false
};

// Register and use custom plugin
autorest.AddConfiguration({
  "input-file": "swagger.json",
  "pipeline": {
    "swagger-document/transform": [
      "loader-swagger",
      "my-custom-processor", // Custom plugin in pipeline
      "schema-validator-swagger"
    ]
  }
});