* refactor: move Electron app to main directory and enforce ts strict mode * chore: add pre-install plugins * remove duplicated initModel function Signed-off-by: James <james@jan.ai> * chore: correct module path * fix: dynamic import does not work with ts * chore: web should be able to run on target host browser * fix: history panel, should display conversations rather just blank state * chore: init default model * chore: pluggin in ts * fix: pre-pack model management * fix: compiled core should not include plugins * chore: refactor - invoke plugin function * refactor download/delete file Signed-off-by: James <james@jan.ai> * update prebuild lib Signed-off-by: James <james@jan.ai> * chore: yarn workspace * chore: update yarn workspace * chore: yarn workspace with nohoist * fix: llama-cpp-import * chore: fix data-plugin wrong module path * chore: correct build step * chore: - separate inference service (#212) - remove base-plugin Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> * chore: update core plugins * chore: hide installation prompt and fix model load - management plugin * chore: remove legacy files; update readme * fix: refresh page lost the download state Signed-off-by: James <james@jan.ai> * fix: ai prompt not passed to plugin Signed-off-by: James <james@jan.ai> * chore: module import fix for production * chore: auto updater * chore: package is public * chore: fix yarn workspace config * update: model management uses Q4_K_M * chore: fix yarn scripts for publishing * chore: app updater - progress update message * chore: user confirms update action * adding some state for changing page store downloaded model to database Signed-off-by: James <james@jan.ai> * chore: refactor plugins into yarn workspace - a single command to publish all base plugins * chore update readme (#218) Co-authored-by: Hien To <tominhhien97@gmail.com> * change app name and app icon Signed-off-by: James <james@jan.ai> * remove: go-to-nowhere actions * chore: bundle core plugins from root and scan default plugins * fix: app crashes on different field name lookup * chore: css fix * chore: bind download progress to app ui * chore: bind active model * chore: simplify app splash-screen only centered jan icon * feature: system monitoring plugin (#196) * feat: Add function for system monitoring * chore: register plugin functions * chore: move to corresponding directory * chore: bind system monitoring data to UI --------- Co-authored-by: Louis <louis@jan.ai> * chore: add build:plugins step to README * chore: model searching and fix model name * fix: plugin file selected appearance * fix: create new conversation does not work * fix: delete conversation not update state - messages still exist * chore: fix asset path prefix * Add CICD for macos (#221) Co-authored-by: Hien To <tominhhien97@gmail.com> * chore: fix production plugin path * chore: add shell open url in external browser --------- Signed-off-by: James <james@jan.ai> Co-authored-by: James <james@jan.ai> Co-authored-by: NamH <NamNh0122@gmail.com> Co-authored-by: 0xSage <n@pragmatic.vc> Co-authored-by: hiento09 <136591877+hiento09@users.noreply.github.com> Co-authored-by: Hien To <tominhhien97@gmail.com> Co-authored-by: namvuong <22463238+vuonghoainam@users.noreply.github.com>
108 lines
3.3 KiB
JavaScript
108 lines
3.3 KiB
JavaScript
import { getActivePlugins, getAllPlugins, getPlugin, installPlugins } from './store'
|
|
import { init } from "."
|
|
import { join } from 'path'
|
|
import Plugin from "./Plugin"
|
|
import { mkdirSync, writeFileSync, rmSync } from "fs"
|
|
|
|
// Temporary directory to install plugins to
|
|
const pluginsDir = './testPlugins'
|
|
|
|
// Temporary directory containing the active plugin to install
|
|
const activePluginDir = './activePluginSrc'
|
|
const activePluginName = 'active-plugin'
|
|
const activeManifest = join(activePluginDir, 'package.json')
|
|
|
|
// Temporary directory containing the inactive plugin to install
|
|
const inactivePluginDir = './inactivePluginSrc'
|
|
const inactivePluginName = 'inactive-plugin'
|
|
const inactiveManifest = join(inactivePluginDir, 'package.json')
|
|
|
|
// Mock name for the entry file in the plugins
|
|
const main = 'index'
|
|
|
|
/** @type Array.<Plugin> */
|
|
let activePlugins
|
|
/** @type Array.<Plugin> */
|
|
let inactivePlugins
|
|
|
|
beforeAll(async () => {
|
|
// Initialize pluggable Electron
|
|
init({
|
|
confirmInstall: () => true,
|
|
pluginsPath: pluginsDir,
|
|
})
|
|
|
|
// Create active plugin
|
|
mkdirSync(activePluginDir)
|
|
writeFileSync(activeManifest, JSON.stringify({
|
|
name: activePluginName,
|
|
activationPoints: [],
|
|
main,
|
|
}), 'utf8')
|
|
|
|
// Create active plugin
|
|
mkdirSync(inactivePluginDir)
|
|
writeFileSync(inactiveManifest, JSON.stringify({
|
|
name: inactivePluginName,
|
|
activationPoints: [],
|
|
main,
|
|
}), 'utf8')
|
|
|
|
// Install plugins
|
|
activePlugins = await installPlugins([activePluginDir], true)
|
|
activePlugins[0].setActive(true)
|
|
inactivePlugins = await installPlugins([{
|
|
specifier: inactivePluginDir,
|
|
activate: false
|
|
}], true)
|
|
})
|
|
|
|
afterAll(() => {
|
|
// Remove all test files and folders
|
|
rmSync(pluginsDir, { recursive: true })
|
|
rmSync(activePluginDir, { recursive: true })
|
|
rmSync(inactivePluginDir, { recursive: true })
|
|
})
|
|
|
|
describe('installPlugins', () => {
|
|
it('should create a new plugin found at the given location and return it if store is false', async () => {
|
|
const res = await installPlugins([activePluginDir], false)
|
|
|
|
expect(res[0]).toBeInstanceOf(Plugin)
|
|
})
|
|
|
|
it('should create a new plugin found at the given location and register it if store is true', () => {
|
|
expect(activePlugins[0]).toBeInstanceOf(Plugin)
|
|
expect(getPlugin(activePluginName)).toBe(activePlugins[0])
|
|
})
|
|
|
|
it('should activate the installed plugin by default', () => {
|
|
expect(getPlugin(activePluginName).active).toBe(true)
|
|
})
|
|
|
|
it('should set plugin to inactive if activate is set to false in the install options', async () => {
|
|
expect(inactivePlugins[0].active).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('getPlugin', () => {
|
|
it('should return the plugin with the given name if it is registered', () => {
|
|
expect(getPlugin(activePluginName)).toBeInstanceOf(Plugin)
|
|
})
|
|
|
|
it('should return an error if the plugin with the given name is not registered', () => {
|
|
expect(() => getPlugin('wrongName')).toThrowError('Plugin wrongName does not exist')
|
|
})
|
|
})
|
|
|
|
describe('getAllPlugins', () => {
|
|
it('should return a list of all registered plugins', () => {
|
|
expect(getAllPlugins()).toEqual([activePlugins[0], inactivePlugins[0]])
|
|
})
|
|
})
|
|
|
|
describe('getActivePlugins', () => {
|
|
it('should return a list of all and only the registered plugins that are active', () => {
|
|
expect(getActivePlugins()).toEqual(activePlugins)
|
|
})
|
|
}) |