import { plugin } from "@ccms/api" import * as fs from '@ccms/common/dist/fs' import { provideSingletonNamed } from "@ccms/container" const SCANNER_TYPE_NAME = 'js' @provideSingletonNamed(plugin.PluginScanner, SCANNER_TYPE_NAME) export class JSFileScanner implements plugin.PluginScanner { type: string = SCANNER_TYPE_NAME scan(target: any): plugin.PluginLoadMetadata[] { return this.scanFolder(fs.concat(root, target)).map((file) => this.read(file)) } read(file: any): plugin.PluginLoadMetadata { return { file, path: file.canonicalPath || file.toString(), type: this.type, scanner: this, loaded: false } } load(loadMetadata: plugin.PluginLoadMetadata): plugin.PluginLoadMetadata { if (loadMetadata.type !== this.type) { return } this.updatePlugin(loadMetadata.file) delete require.cache[loadMetadata.path] loadMetadata.instance = require(loadMetadata.path) return loadMetadata } private scanFolder(folder: any): string[] { var files = [] this.checkUpdateFolder(folder) // must check file is exist maybe is a illegal symbolic link file fs.list(folder).forEach((path: any) => { let file = path.toFile() if (file.exists() && file.getName().endsWith(".js")) { files.push(file) } }) return files } private checkUpdateFolder(path: any) { var update = fs.file(path, "update") if (!update.exists()) { update.mkdirs() } } private updatePlugin(file: any) { var update = fs.file(fs.concat(file.parentFile, 'update', file.name)) if (update.exists()) { console.i18n("ms.plugin.manager.build.update", { name: file.name }) fs.move(update, file, true) } } }