Files
ms/packages/plugin/src/scanner/js-scanner.ts

62 lines
1.9 KiB
TypeScript

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)
}
}
}