npm
This commit is contained in:
+104
-32
@@ -83,30 +83,30 @@ export type FSStatus = SharedStatus & {
|
||||
export abstract class FSExtension<Status extends FSStatus> extends Extension<Status>{
|
||||
constructor(
|
||||
name: string,
|
||||
protected readonly prefix: string){
|
||||
protected readonly path: string){
|
||||
super(name)
|
||||
}
|
||||
|
||||
public async status(): Promise<Status>{
|
||||
const shdStatus = await super.status()
|
||||
const empty = await this.isEmpty()
|
||||
return <Status>{...shdStatus, prefix: this.prefix, empty: empty}
|
||||
return {...shdStatus, prefix: this.path, empty: empty}
|
||||
}
|
||||
|
||||
public async install():Promise<boolean>{
|
||||
const installed = await this.isInstalled()
|
||||
if (!installed) {
|
||||
logger.info('Installing extension to', path.resolve(this.prefix, this.name))
|
||||
await fs.mkdir(path.resolve(this.prefix, this.name), {recursive: true})
|
||||
logger.info('Installing extension to', path.resolve(this.path, this.name))
|
||||
await fs.mkdir(path.resolve(this.path, this.name), {recursive: true})
|
||||
return true
|
||||
}
|
||||
logger.warn('Extension already installed at', path.resolve(this.prefix, this.name))
|
||||
logger.error('Extension already installed at', path.resolve(this.path, this.name))
|
||||
return false
|
||||
}
|
||||
|
||||
public async uninstall(): Promise<void>{
|
||||
logger.info('Uninstalling extension from', path.resolve(this.prefix, this.name))
|
||||
return await trash(path.resolve(this.prefix, this.name))
|
||||
logger.info('Uninstalling extension from', path.resolve(this.path, this.name))
|
||||
return await trash(path.resolve(this.path, this.name))
|
||||
}
|
||||
|
||||
public async update(force?: boolean): Promise<boolean | undefined>{
|
||||
@@ -117,17 +117,17 @@ export abstract class FSExtension<Status extends FSStatus> extends Extension<Sta
|
||||
public async isEmpty(): Promise<boolean | undefined>{
|
||||
if (!this.isInstalled()) return true
|
||||
try {
|
||||
const files = await fs.readdir(path.resolve(this.prefix, this.name))
|
||||
const files = await fs.readdir(path.resolve(this.path, this.name))
|
||||
return files.length === 0
|
||||
} catch (error) {
|
||||
logger.warn('TODO')
|
||||
logger.error("fs read error", error)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
public async isInstalled(): Promise<boolean>{
|
||||
try {
|
||||
await fs.access(path.resolve(this.prefix, this.name))
|
||||
await fs.access(path.resolve(this.path, this.name))
|
||||
return true
|
||||
} catch (error) {
|
||||
return false
|
||||
@@ -139,39 +139,48 @@ type NPMStatus = FSStatus & {
|
||||
latest?: string,
|
||||
current?: string,
|
||||
author?: string
|
||||
license?: string,
|
||||
description?: string
|
||||
}
|
||||
|
||||
export class NPMExtension extends FSExtension<NPMStatus>{
|
||||
|
||||
constructor(
|
||||
pkgName: string,
|
||||
prefix: string){
|
||||
super(pkgName, prefix)
|
||||
private version: string,
|
||||
private prefix: string
|
||||
){
|
||||
super(pkgName, path.resolve(prefix, "node_modules"))
|
||||
}
|
||||
|
||||
public async status(): Promise<NPMStatus> {
|
||||
|
||||
const fsStatus = await super.status()
|
||||
const latest = await this.getLatestVersion()
|
||||
const author = await this.getAuthor()
|
||||
const current = await this.getCurrentVersion()
|
||||
const fsStatus = await super.status()
|
||||
const latest = await this.getLatestVersion()
|
||||
const author = await this.getAuthor()
|
||||
const current = await this.getCurrentVersion()
|
||||
const license = await this.getLicense()
|
||||
const description = await this.getDescription()
|
||||
|
||||
return {
|
||||
...fsStatus,
|
||||
latest: latest,
|
||||
author: author,
|
||||
current: current
|
||||
current: current,
|
||||
license: license,
|
||||
description: description
|
||||
}
|
||||
}
|
||||
|
||||
public async install(): Promise<boolean> {
|
||||
super.install()
|
||||
logger.info("npm install", this.name, 'to', path.resolve(this.prefix, this.name))
|
||||
const { error, stdout, stderr } = await exec('npm install --prefix '+ this.prefix + ' ' + this.name)
|
||||
if (error !== null) {
|
||||
logger.warn('npm install', this.name, 'from prefix', this.prefix, 'stderr:', stderr)
|
||||
const { error, stdout, stderr } = await exec('npm install --prefix '+ this.prefix + ' ' + this.name+"@"+this.version)
|
||||
if (error) {
|
||||
logger.error('npm install', this.name, "@", this.version, ' from prefix', this.prefix, 'stderr:', stderr)
|
||||
return false
|
||||
} else {
|
||||
logger.info('npm install', this.name, 'from prefix', this.prefix, 'stdout:', stdout)
|
||||
logger.info('npm install', this.name, "@", this.version, 'from prefix', this.prefix, 'stdout:', stdout)
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -181,7 +190,7 @@ export class NPMExtension extends FSExtension<NPMStatus>{
|
||||
logger.info("npm uninstall", this.name, 'from', path.resolve(this.prefix, this.name))
|
||||
const { error, stdout, stderr } = await exec('npm uninstall --prefix '+ this.prefix + ' ' + this.name)
|
||||
if (error) {
|
||||
logger.warn('npm uninstall', this.name, 'from prefix', this.prefix, 'stderr:', stderr)
|
||||
logger.error('npm uninstall', this.name, 'from prefix', this.prefix, 'stderr:', stderr)
|
||||
} else {
|
||||
logger.info('npm uninstall', this.name, 'from prefix', this.prefix, 'stdout:', stdout)
|
||||
}
|
||||
@@ -192,7 +201,7 @@ export class NPMExtension extends FSExtension<NPMStatus>{
|
||||
logger.info("npm update", path.resolve(this.prefix, this.name))
|
||||
const { error, stdout, stderr } = await exec('npm update --prefix '+ this.prefix + ' ' + this.name)
|
||||
if (error) {
|
||||
logger.warn('npm update', this.name, 'from prefix', this.prefix, 'stderr:', stderr)
|
||||
logger.error('npm update', this.name, 'from prefix', this.prefix, 'stderr:', stderr)
|
||||
return false
|
||||
} else {
|
||||
logger.info('npm update', this.name, 'from prefix', this.prefix, 'stdout:', stdout)
|
||||
@@ -210,7 +219,7 @@ export class NPMExtension extends FSExtension<NPMStatus>{
|
||||
if (Object.keys(JSON.parse(stdout)).length > 0) return true
|
||||
else return false
|
||||
} catch (error) {
|
||||
logger.warn('npm outdated', this.name, 'from prefix', this.prefix, 'stderr:', error)
|
||||
logger.error('npm outdated', this.name, 'from prefix', this.prefix, 'stderr:', error)
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -222,7 +231,7 @@ export class NPMExtension extends FSExtension<NPMStatus>{
|
||||
stderr } = await exec('npm author ls --prefix ' + this.prefix + ' ' + this.name)
|
||||
|
||||
if(error){
|
||||
logger.warn(stderr)
|
||||
logger.error(stderr)
|
||||
return
|
||||
} else {
|
||||
logger.info(stdout)
|
||||
@@ -231,22 +240,84 @@ export class NPMExtension extends FSExtension<NPMStatus>{
|
||||
}
|
||||
|
||||
private async getLatestVersion(): Promise<string | undefined>{
|
||||
const {
|
||||
try{
|
||||
const {
|
||||
error,
|
||||
stdout,
|
||||
stderr } = await exec('npm view --prefix ' + this.prefix + ' ' + this.name + " version")
|
||||
|
||||
if(error){
|
||||
logger.warn(stderr)
|
||||
if(error){
|
||||
logger.error(stderr)
|
||||
return
|
||||
} else {
|
||||
logger.info(stdout)
|
||||
return stdout
|
||||
}
|
||||
}catch(error){
|
||||
logger.error(error)
|
||||
return
|
||||
} else {
|
||||
logger.info(stdout)
|
||||
return stdout
|
||||
}
|
||||
}
|
||||
|
||||
private async getCurrentVersion(): Promise<string | undefined>{
|
||||
return //TODO
|
||||
try{
|
||||
const {
|
||||
error,
|
||||
stdout,
|
||||
stderr } = await exec('npm list --json --prefix ' + this.prefix + ' ' + this.name)
|
||||
|
||||
if(error){
|
||||
logger.error(stderr)
|
||||
return
|
||||
} else {
|
||||
logger.info(stdout)
|
||||
return JSON.parse(stdout)['dependencies'][this.name]['version']
|
||||
}
|
||||
}catch(error){
|
||||
logger.error(error)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
private async getDescription(): Promise<string | undefined>{
|
||||
try{
|
||||
const {
|
||||
error,
|
||||
stdout,
|
||||
stderr } = await exec('npm show --prefix ' + this.prefix + ' ' + this.name+" description")
|
||||
|
||||
if(error){
|
||||
logger.error(stderr)
|
||||
return
|
||||
} else {
|
||||
logger.info(stdout)
|
||||
return stdout
|
||||
}
|
||||
}catch(error){
|
||||
logger.error(error)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
private async getLicense(): Promise<string | undefined>{
|
||||
try{
|
||||
|
||||
const {
|
||||
error,
|
||||
stdout,
|
||||
stderr } = await exec('npm show --prefix ' + this.prefix + ' ' + this.name+" license")
|
||||
|
||||
if(error){
|
||||
logger.error(stderr)
|
||||
return
|
||||
} else {
|
||||
logger.info(stdout)
|
||||
return stdout
|
||||
}
|
||||
}catch(error){
|
||||
logger.error(error)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -288,6 +359,7 @@ export class GitExtension<Status extends GitStatus> extends FSExtension<Status>{
|
||||
} else {
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user