A Prettier plugin that automatically sorts import declarations in JavaScript and TypeScript files according to configurable Regular Expression patterns.
—
Core preprocessing functionality that analyzes and sorts import statements according to configured patterns using Babel AST processing.
Core preprocessing logic that sorts imports according to configuration options.
function preprocessor(code: string, options: PrettierOptions): stringParameters:
code: Source code string to processoptions: Prettier options including plugin configurationReturns: Processed code string with sorted imports
The core preprocessing function that:
import { preprocessor } from '@trivago/prettier-plugin-sort-imports';
const sortedCode = preprocessor(sourceCode, {
importOrder: ["^@core/(.*)$", "^[./]"],
importOrderSeparation: true,
importOrderSortSpecifiers: true,
// ... other Prettier options
});Default preprocessor that handles most file types while skipping Vue and Svelte files.
function defaultPreprocessor(code: string, options: PrettierOptions): stringParameters:
code: Source code string to processoptions: Prettier options including filepath informationReturns: Processed code string or original code for Vue/Svelte files
Conditional preprocessor that:
.svelte and .vue filespreprocessor function for all other file typesThis allows framework-specific preprocessors to handle their respective file types.
The preprocessor uses Babel to parse source code and extract relevant nodes:
interface ASTExtractionResult {
importNodes: ImportDeclaration[];
directives: Directive[];
}
function extractASTNodes(ast: Program): ASTExtractionResultExtracts import declarations and directives (like "use strict") from the parsed AST while preserving their original positions and comments.
Core sorting logic that groups and orders imports according to configuration:
type GetSortedNodes = (
nodes: ImportDeclaration[],
options: Pick<
PrettierOptions,
| 'importOrder'
| 'importOrderCaseInsensitive'
| 'importOrderSeparation'
| 'importOrderGroupNamespaceSpecifiers'
| 'importOrderSortSpecifiers'
| 'importOrderSideEffects'
>
) => ImportOrLine[]
function getSortedNodes(
importNodes: ImportDeclaration[],
options: SortingOptions
): ImportOrLine[]Processing Steps:
importOrder patternsFinal step that generates formatted code from sorted AST nodes:
function getCodeFromAst(
nodes: Statement[],
directives: Directive[],
originalCode: string,
interpreter?: InterpreterDirective | null,
options?: Pick<PrettierOptions, 'importOrderImportAttributesKeyword'>
): stringParameters:
nodes: AST statement nodes including imports and newline separatorsdirectives: Preserved directives from original codeoriginalCode: Original source code for fallbackinterpreter: Shebang or interpreter directiveoptions: Code generation optionsReturns: Final formatted code string
function getExperimentalParserPlugins(
importOrderParserPlugins?: ImportOrderParserPlugin[]
): ParserPlugin[]Processes plugin configuration and returns Babel parser plugins, handling both simple plugin names and plugins with options.
function isSortImportsIgnored(importNodes: ImportDeclaration[]): booleanChecks if import sorting should be skipped based on the presence of // sort-imports-ignore comments.
function adjustCommentsOnSortedNodes(
sortedNodes: ImportOrLine[],
originalNodes: ImportDeclaration[],
sourceCode: string
): ImportOrLine[]Preserves and repositions comments associated with import statements after sorting to maintain code documentation.
function getSortedImportSpecifiers(
importDeclaration: ImportDeclaration,
options: Pick<PrettierOptions, 'importOrderSortSpecifiers'>
): ImportDeclarationSorts named imports within individual import statements when importOrderSortSpecifiers is enabled.
function getImportNodes(code: string, options?: ParserOptions): ImportDeclaration[]Parameters:
code: Source code string to parseoptions: Optional Babel parser configuration optionsReturns: Array of import declaration AST nodes
Parses source code and extracts all import declarations, excluding imports inside TypeScript module declarations. Useful for custom import processing outside the main plugin workflow.
import { getImportNodes } from '@trivago/prettier-plugin-sort-imports';
const importNodes = getImportNodes(sourceCode, {
plugins: ['typescript', 'jsx']
});function removeNodesFromOriginalCode(
code: string,
nodes: (Statement | CommentBlock | Directive | CommentLine | ImportDeclaration | InterpreterDirective)[]
): stringParameters:
code: Original source code stringnodes: Array of AST nodes to remove from the codeReturns: Modified code string with specified nodes removed
Removes specified AST nodes from the original source code by matching their text content. Used internally for clean code generation but can be useful for custom preprocessing.
export { naturalSort };Re-exported natural sorting function from the javascript-natural-sort library, used internally for import sorting but available for custom sorting needs.
const THIRD_PARTY_MODULES_SPECIAL_WORD = '<THIRD_PARTY_MODULES>';
const THIRD_PARTY_TYPES_SPECIAL_WORD = '<THIRD_PARTY_TS_TYPES>';
const TYPES_SPECIAL_WORD = '<TS_TYPES>';Special placeholder strings used in importOrder configuration to control positioning of automatically detected import groups.
const flow: ParserPlugin = 'flow';
const typescript: ParserPlugin = 'typescript';
const jsx: ParserPlugin = 'jsx';Predefined parser plugin constants for common Babel plugins used in import processing.
const chunkSideEffectNode = 'side-effect-node';
const chunkSideOtherNode = 'other-node';Constants used internally to categorize different types of import nodes during processing.
const newLineCharacters = '\n\n';
const sortImportsIgnoredComment = 'sort-imports-ignore';
const newLineNode: ExpressionStatement;Constants for consistent formatting and special comment detection. The newLineNode is an AST node representing blank line separators between import groups.
The preprocessor includes comprehensive error handling and safety mechanisms:
Svelte Parser Loading:
function createSvelteParsers(): { parsers?: any } | {}Gracefully handles missing Svelte dependencies:
try {
var { parsers } = require('prettier-plugin-svelte');
} catch {
return {}; // Returns empty object if plugin unavailable
}JSON Parsing Safety:
function getExperimentalParserPlugins(
importOrderParserPlugins: string[]
): ParserPlugin[]Validates plugin configuration with detailed error messages:
try {
plugin = JSON.parse(pluginNameOrJson) as ParserPluginWithOptions;
} catch (e) {
throw Error('Invalid JSON in importOrderParserPlugins: ' + pluginNameOrJson);
}// sort-imports-ignore comment is present@vue/compiler-sfc unavailableprettier-plugin-svelte unavailableimportOrder patternsThe preprocessor integrates seamlessly with Prettier's pipeline:
Install with Tessl CLI
npx tessl i tessl/npm-trivago--prettier-plugin-sort-imports