A Parcel transformer that processes TypeScript files to generate declaration files (.d.ts) with tree-shaking and module graph optimization
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Cross-version compatibility wrappers for TypeScript compiler API functions, ensuring consistent behavior across different TypeScript versions (3.0+).
Version-compatible wrappers for creating import-related AST nodes that work across different TypeScript compiler versions.
/**
* Creates an import clause with version compatibility
* @param factory - TypeScript node factory (or ts for older versions)
* @param isTypeOnly - Whether this is a type-only import
* @param name - Default import identifier (optional)
* @param namedBindings - Named import bindings (optional)
* @returns ImportClause AST node
*/
function createImportClause(
factory: any,
isTypeOnly: boolean,
name: any,
namedBindings: any
): any;
/**
* Creates an import declaration with version compatibility
* @param factory - TypeScript node factory (or ts for older versions)
* @param modifiers - Declaration modifiers (optional)
* @param importClause - Import clause (optional)
* @param moduleSpecifier - Module path expression
* @param assertClause - Import assertion clause (optional)
* @returns ImportDeclaration AST node
*/
function createImportDeclaration(
factory: any,
modifiers: any,
importClause: any,
moduleSpecifier: any,
assertClause: any
): any;
/**
* Creates an import specifier with version compatibility
* @param factory - TypeScript node factory (or ts for older versions)
* @param isTypeOnly - Whether this is a type-only import specifier
* @param propertyName - Original name in source module (optional)
* @param name - Local binding name
* @returns ImportSpecifier AST node
*/
function createImportSpecifier(
factory: any,
isTypeOnly: boolean,
propertyName: any,
name: any
): any;Version-compatible wrapper for updating export declarations across TypeScript versions.
/**
* Updates an export declaration with version compatibility
* @param factory - TypeScript node factory (or ts for older versions)
* @param node - Original export declaration to update
* @param modifiers - Declaration modifiers (optional)
* @param isTypeOnly - Whether this is a type-only export
* @param exportClause - Named export bindings (optional)
* @param moduleSpecifier - Re-export module path (optional)
* @param assertClause - Export assertion clause (optional)
* @returns Updated ExportDeclaration AST node
*/
function updateExportDeclaration(
factory: any,
node: any,
modifiers: any,
isTypeOnly: boolean,
exportClause: any,
moduleSpecifier: any,
assertClause: any
): any;The compatibility system detects TypeScript version at runtime:
const [majorVersion, minorVersion] = ts.versionMajorMinor
.split('.')
.map(num => parseInt(num, 10));Each wrapper function supports specific TypeScript version ranges:
factory.createImportClause(isTypeOnly, name, namedBindings)factory.createImportClause(name, namedBindings, isTypeOnly)factory.createImportClause(name, namedBindings) (no type-only support)factory.createImportDeclaration(modifiers, importClause, moduleSpecifier, assertClause)factory.createImportDeclaration(undefined, modifiers, importClause, moduleSpecifier, assertClause)factory.createImportDeclaration(undefined, modifiers, importClause, moduleSpecifier)factory.createImportSpecifier(isTypeOnly, propertyName, name)factory.createImportSpecifier(propertyName, name) (no type-only support)import {
createImportClause,
createImportDeclaration,
createImportSpecifier
} from '@parcel/transformer-typescript-types';
// Create named import: import { Button, Dialog } from 'components'
const importSpecifiers = [
createImportSpecifier(factory, false, undefined, factory.createIdentifier('Button')),
createImportSpecifier(factory, false, undefined, factory.createIdentifier('Dialog'))
];
const importClause = createImportClause(
factory,
false, // not type-only
undefined, // no default import
factory.createNamedImports(importSpecifiers)
);
const importDeclaration = createImportDeclaration(
factory,
undefined, // no modifiers
importClause,
factory.createStringLiteral('components'),
undefined // no assertions
);import { updateExportDeclaration } from '@parcel/transformer-typescript-types';
// Update export to remove unused exports
const updatedExport = updateExportDeclaration(
factory,
originalExportNode,
undefined, // modifiers
false, // not type-only
factory.createNamedExports(filteredExports), // only keep used exports
undefined, // no module specifier
undefined // no assertions
);The wrappers use a cascade approach to handle version differences:
The system handles both the modern factory-based API (TypeScript 4.0+) and the older global ts API:
// Modern factory API (preferred)
const node = factory.createImportClause(isTypeOnly, name, namedBindings);
// Legacy global API (fallback)
const node = ts.createImportClause(name, namedBindings);The handling of type-only imports evolved across TypeScript versions:
import type syntaxThis ensures the transformer can generate appropriate import statements regardless of the TypeScript version in use.
Install with Tessl CLI
npx tessl i tessl/npm-parcel--transformer-typescript-types