mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import { execShell } from '../../helpers/core-utils'
 | |
| import { logger } from '../../helpers/logger'
 | |
| import { isNpmPluginNameValid, isPluginVersionValid } from '../../helpers/custom-validators/plugins'
 | |
| import { CONFIG } from '../../initializers/config'
 | |
| import { outputJSON, pathExists } from 'fs-extra'
 | |
| import { join } from 'path'
 | |
| 
 | |
| async function installNpmPlugin (npmName: string, version?: string) {
 | |
|   // Security check
 | |
|   checkNpmPluginNameOrThrow(npmName)
 | |
|   if (version) checkPluginVersionOrThrow(version)
 | |
| 
 | |
|   let toInstall = npmName
 | |
|   if (version) toInstall += `@${version}`
 | |
| 
 | |
|   const { stdout } = await execYarn('add ' + toInstall)
 | |
| 
 | |
|   logger.debug('Added a yarn package.', { yarnStdout: stdout })
 | |
| }
 | |
| 
 | |
| async function installNpmPluginFromDisk (path: string) {
 | |
|   await execYarn('add file:' + path)
 | |
| }
 | |
| 
 | |
| async function removeNpmPlugin (name: string) {
 | |
|   checkNpmPluginNameOrThrow(name)
 | |
| 
 | |
|   await execYarn('remove ' + name)
 | |
| }
 | |
| 
 | |
| // ############################################################################
 | |
| 
 | |
| export {
 | |
|   installNpmPlugin,
 | |
|   installNpmPluginFromDisk,
 | |
|   removeNpmPlugin
 | |
| }
 | |
| 
 | |
| // ############################################################################
 | |
| 
 | |
| async function execYarn (command: string) {
 | |
|   try {
 | |
|     const pluginDirectory = CONFIG.STORAGE.PLUGINS_DIR
 | |
|     const pluginPackageJSON = join(pluginDirectory, 'package.json')
 | |
| 
 | |
|     // Create empty package.json file if needed
 | |
|     if (!await pathExists(pluginPackageJSON)) {
 | |
|       await outputJSON(pluginPackageJSON, {})
 | |
|     }
 | |
| 
 | |
|     return execShell(`yarn ${command}`, { cwd: pluginDirectory })
 | |
|   } catch (result) {
 | |
|     logger.error('Cannot exec yarn.', { command, err: result.err, stderr: result.stderr })
 | |
| 
 | |
|     throw result.err
 | |
|   }
 | |
| }
 | |
| 
 | |
| function checkNpmPluginNameOrThrow (name: string) {
 | |
|   if (!isNpmPluginNameValid(name)) throw new Error('Invalid NPM plugin name to install')
 | |
| }
 | |
| 
 | |
| function checkPluginVersionOrThrow (name: string) {
 | |
|   if (!isPluginVersionValid(name)) throw new Error('Invalid NPM plugin version to install')
 | |
| }
 |