fix: add strict types to build scripts and remove all any usage

Replace all implicit and explicit any types in build scripts with
proper TypeScript Compiler API types (Decorator, ClassDeclaration,
MethodDeclaration, Identifier, SourceFile, etc.). Add PackageJson
and InjectableClassEntry interfaces. Fix return types, null checks,
and type assertions throughout all transformer scripts.
This commit is contained in:
Daniel Sogl
2026-03-21 16:11:27 -07:00
parent 6453f2ab78
commit 62956e429c
9 changed files with 160 additions and 108 deletions
+21 -17
View File
@@ -1,20 +1,24 @@
import { factory, SourceFile, SyntaxKind, TransformationContext } from 'typescript';
import { factory, Identifier, ImportSpecifier, SourceFile, SyntaxKind, TransformationContext } from 'typescript';
import { getMethodsForDecorator } from '../helpers';
function transformImports(file: SourceFile, ctx: TransformationContext, ngcBuild?: boolean) {
function transformImports(file: SourceFile, _ctx: TransformationContext, ngcBuild?: boolean) {
// remove angular imports
if (!ngcBuild) {
// @ts-expect-error
file.statements = (file.statements as any).filter(
(s: any) => !(s.kind === SyntaxKind.ImportDeclaration && s.moduleSpecifier.text === '@angular/core')
);
// @ts-expect-error — mutating readonly statements for transformer pipeline
file.statements = (
file.statements as unknown as Array<{ kind: number; moduleSpecifier?: { text: string } }>
).filter((s) => !(s.kind === SyntaxKind.ImportDeclaration && s.moduleSpecifier?.text === '@angular/core'));
}
// find the @awesome-cordova-plugins/core import statement
const importStatement = (file.statements as any).find((s: any) => {
return s.kind === SyntaxKind.ImportDeclaration && s.moduleSpecifier.text === '@awesome-cordova-plugins/core';
});
const importStatement = (file.statements as unknown as Array<Record<string, unknown>>).find((s) => {
return (
(s as { kind: number }).kind === SyntaxKind.ImportDeclaration &&
(s as { moduleSpecifier: { text: string } }).moduleSpecifier.text === '@awesome-cordova-plugins/core'
);
// eslint-disable-next-line @typescript-eslint/no-explicit-any
}) as Record<string, any> | undefined;
// we're only interested in files containing @awesome-cordova-plugins/core import statement
if (!importStatement) return file;
@@ -27,7 +31,7 @@ function transformImports(file: SourceFile, ctx: TransformationContext, ngcBuild
const keep: string[] = ['getPromise', 'checkAvailability'];
let m;
let m: RegExpExecArray | null;
while ((m = decoratorRegex.exec(file.text)) !== null) {
if (m.index === decoratorRegex.lastIndex) {
@@ -37,27 +41,27 @@ function transformImports(file: SourceFile, ctx: TransformationContext, ngcBuild
}
if (decorators.length) {
let methods = [];
let methods: string[] = [];
decorators.forEach((d) => (methods = getMethodsForDecorator(d).concat(methods)));
const methodElements = methods.map((m) => factory.createIdentifier(m));
const methodNames = methodElements.map((el) => el.escapedText);
const methodElements = methods.map((name: string) => factory.createIdentifier(name));
const methodNames = methodElements.map((el: Identifier) => el.escapedText);
importStatement.importClause.namedBindings.elements = [
factory.createIdentifier('AwesomeCordovaNativePlugin'),
...methodElements,
...importStatement.importClause.namedBindings.elements.filter(
(el) => keep.indexOf(el.name.text) !== -1 && methodNames.indexOf(el.name.text) === -1
(el: ImportSpecifier) => keep.indexOf(el.name.text) !== -1 && methodNames.indexOf(el.name.text) === -1
),
];
if (ngcBuild) {
importStatement.importClause.namedBindings.elements = importStatement.importClause.namedBindings.elements.map(
(binding) => {
(binding: Identifier & { name?: { text: string } }) => {
if (binding.escapedText) {
binding.name = {
text: binding.escapedText,
text: binding.escapedText as string,
};
}
return binding;
@@ -71,7 +75,7 @@ function transformImports(file: SourceFile, ctx: TransformationContext, ngcBuild
export function importsTransformer(ngcBuild?: boolean) {
return (ctx: TransformationContext) => {
return (tsSourceFile) => {
return (tsSourceFile: SourceFile) => {
return transformImports(tsSourceFile, ctx, ngcBuild);
};
};