mirror of
https://github.com/danielsogl/awesome-cordova-plugins.git
synced 2025-01-19 08:32:52 +08:00
614ade447f
* init * cleanup packagelock * testing * chore(package): refresh package-lock.json * updates * chore(): fix builds * chore(): rework package-lock * chore(): lint Co-authored-by: Daniel Sogl <daniel@sogls.de>
109 lines
3.4 KiB
TypeScript
109 lines
3.4 KiB
TypeScript
import * as ts from 'typescript';
|
|
import * as fs from 'fs-extra';
|
|
import * as path from 'path';
|
|
import * as rimraf from 'rimraf';
|
|
import { generateDeclarations } from './transpile';
|
|
import { clone } from 'lodash';
|
|
import { EmitFlags, createCompilerHost, CompilerOptions, CompilerHost, createProgram } from '@angular/compiler-cli';
|
|
import { importsTransformer } from './transformers/imports';
|
|
import { pluginClassTransformer } from './transformers/plugin-class';
|
|
import { COMPILER_OPTIONS, PLUGIN_PATHS, ROOT } from './helpers';
|
|
|
|
export function getProgram(rootNames: string[] = createSourceFiles()) {
|
|
const options: CompilerOptions = clone(COMPILER_OPTIONS);
|
|
options.basePath = ROOT;
|
|
options.moduleResolution = ts.ModuleResolutionKind.NodeJs;
|
|
options.module = ts.ModuleKind.ES2015;
|
|
options.target = ts.ScriptTarget.ES5;
|
|
options.lib = ['dom', 'es2017'];
|
|
options.inlineSourceMap = true;
|
|
options.importHelpers = true;
|
|
options.inlineSources = true;
|
|
options.enableIvy = false;
|
|
|
|
delete options.baseUrl;
|
|
|
|
const host: CompilerHost = createCompilerHost({ options });
|
|
return createProgram({
|
|
rootNames,
|
|
options,
|
|
host
|
|
});
|
|
}
|
|
|
|
// hacky way to export metadata only for core package
|
|
export function transpileNgxCore() {
|
|
getProgram([path.resolve(ROOT, 'src/@ionic-native/core/index.ts')]).emit({
|
|
emitFlags: EmitFlags.Metadata,
|
|
emitCallback: ({ program, writeFile, customTransformers, cancellationToken, targetSourceFile }) => {
|
|
return program.emit(targetSourceFile, writeFile, cancellationToken, true, customTransformers);
|
|
}
|
|
});
|
|
}
|
|
|
|
export function transpileNgx() {
|
|
getProgram().emit({
|
|
emitFlags: EmitFlags.Metadata,
|
|
customTransformers: {
|
|
beforeTs: [
|
|
importsTransformer(true),
|
|
pluginClassTransformer(true)
|
|
]
|
|
}
|
|
});
|
|
}
|
|
|
|
export function generateDeclarationFiles() {
|
|
generateDeclarations(PLUGIN_PATHS.map(p => p.replace('index.ts', 'ngx/index.ts')));
|
|
}
|
|
|
|
// remove reference to @ionic-native/core decorators
|
|
export function modifyMetadata() {
|
|
debugger;
|
|
PLUGIN_PATHS.map(p => p.replace(path.join(ROOT, 'src'), path.join(ROOT, 'dist')).replace('index.ts', 'ngx/index.metadata.json'))
|
|
.forEach(p => {
|
|
const content = fs.readJSONSync(p);
|
|
let _prop: { members: { [x: string]: any[]; }; };
|
|
for (const prop in content[0].metadata) {
|
|
_prop = content[0].metadata[prop];
|
|
removeIonicNativeDecorators(_prop);
|
|
|
|
if (_prop.members) {
|
|
for (const memberProp in _prop.members) {
|
|
removeIonicNativeDecorators(_prop.members[memberProp][0]);
|
|
}
|
|
}
|
|
}
|
|
|
|
fs.writeJSONSync(p, content);
|
|
});
|
|
}
|
|
|
|
function removeIonicNativeDecorators(node: any) {
|
|
if (node.decorators && node.decorators.length) {
|
|
node.decorators = node.decorators.filter((d: { expression: { module: string; }; }) => d.expression.module !== '@ionic-native/core');
|
|
}
|
|
|
|
if (node.decorators && !node.decorators.length) delete node.decorators;
|
|
}
|
|
|
|
function createSourceFiles(): string[] {
|
|
return PLUGIN_PATHS.map((indexPath: string) => {
|
|
const ngxPath = path.resolve(indexPath.replace('index.ts', ''), 'ngx'),
|
|
newPath = path.resolve(ngxPath, 'index.ts');
|
|
|
|
// delete directory
|
|
rimraf.sync(ngxPath);
|
|
fs.mkdirpSync(ngxPath);
|
|
fs.copyFileSync(indexPath, newPath);
|
|
|
|
return newPath;
|
|
});
|
|
}
|
|
|
|
export function cleanupNgx() {
|
|
PLUGIN_PATHS.forEach((indexPath: string) =>
|
|
rimraf.sync(indexPath.replace('index.ts', 'ngx'))
|
|
);
|
|
}
|