import * as ts from 'typescript'; import { Logger } from '../../logger'; import { convertValueToLiteral, getDecorator, getDecoratorArgs, getDecoratorName } from '../helpers'; import { transformMembers } from './members'; function transformClass(cls: any, ngcBuild?: boolean) { Logger.profile((ngcBuild ? '[ngc]' : '[esm]') + 'transformClass: ' + cls.name.text); const pluginStatics = []; const dec: any = getDecorator(cls); if (dec) { const pluginDecoratorArgs = getDecoratorArgs(dec); // add plugin decorator args as static properties of the plugin's class for (let prop in pluginDecoratorArgs) { pluginStatics.push(ts.createProperty( undefined, [ts.createToken(ts.SyntaxKind.StaticKeyword)], ts.createIdentifier(prop), undefined, undefined, convertValueToLiteral(pluginDecoratorArgs[prop]) )); } } cls = ts.createClassDeclaration( ngcBuild && cls.decorators && cls.decorators.length? cls.decorators.filter(d => getDecoratorName(d) === 'Injectable') : undefined, // remove Plugin and Injectable decorators [ts.createToken(ts.SyntaxKind.ExportKeyword)], cls.name, cls.typeParameters, cls.heritageClauses, [ ...transformMembers(cls), ...pluginStatics ] ); Logger.profile((ngcBuild ? '[ngc]' : '[esm]') + 'transformClass' + cls.name.text); return cls; } function transformClasses(file: ts.SourceFile, ctx: ts.TransformationContext, ngcBuild?: boolean) { // console.log('Transforming file: ' + file.fileName); return ts.visitEachChild(file, node => { if (node.kind !== ts.SyntaxKind.ClassDeclaration) { return node; } return transformClass(node, ngcBuild); }, ctx); } export function pluginClassTransformer(ngcBuild?: boolean): ts.TransformerFactory { return (ctx: ts.TransformationContext) => { return tsSourceFile => { if (tsSourceFile.fileName.indexOf('src/@ionic-native/plugins') > -1) return transformClasses(tsSourceFile, ctx, ngcBuild); return tsSourceFile; } }; }