diff --git a/src/services/file_manager.service.ts b/src/services/file_manager.service.ts index 1317ea9c1958e62d35e6a309165d53ba4a3b303f..925e0bc605f8113c7d90e37dd9e7fbf69b068cb0 100644 --- a/src/services/file_manager.service.ts +++ b/src/services/file_manager.service.ts @@ -49,12 +49,13 @@ export class FileManagerService { const zip = new StreamZip.async({ file: path }); const entries = await zip.entries(); for (const entry of Object.values(entries)) { - if (entry.name.startsWith(folderPath)) { - files.push(entry.name); + const lib = entry.name.split('/')[1]; + if (entry.name.startsWith(folderPath) && !files.includes(lib)) { + files.push(lib); } } zip.close(); - return files.map((file: string) => file.split('/')[1]); + return files; } catch (e) { return []; } diff --git a/src/services/plugins_manager.service.ts b/src/services/plugins_manager.service.ts index 8d45c7322d91fa7e46af030b7d60fda6023c65fa..96ff1a59e6e3c2585ac566cf43a4d5621ccdb2fa 100644 --- a/src/services/plugins_manager.service.ts +++ b/src/services/plugins_manager.service.ts @@ -59,6 +59,7 @@ export class PluginsManager { } return await Promise.all( this.plugins + .filter(plugin => this.isPluginAvailable(plugin.id, arch)) .map(async (plugin: Plugins) => { return { id: plugin.id, @@ -81,7 +82,6 @@ export class PluginsManager { author: plugin.author, }; }) - .filter(async plugin => this.isPluginAvailable((await plugin).id, arch)) ); } @@ -137,6 +137,10 @@ export class PluginsManager { ) { return undefined; } + const platform = this.getPlatform(arch); + if (platform === undefined) { + return undefined; + } return ( // eslint-disable-next-line __dirname + @@ -145,13 +149,19 @@ export class PluginsManager { '/' + id + '/' + - arch + + platform + '/' + id + '.jpl' ); } + getPlatform(arch: string): string | undefined { + return Array.from(this.archesResolution.entries()).find(([_, value]) => + value.includes(arch) + )?.[0]; + } + async getNewPlugin( path: string, platforms: string[] @@ -231,10 +241,12 @@ export class PluginsManager { plugin.arches.includes(arch as string) && arch !== undefined ); + const platform = this.getPlatform(arch as string); if ( plugin === undefined || process.env.DATA_DIRECTORY === undefined || - plugin.icon === undefined + plugin.icon === undefined || + platform === undefined ) { return ''; } @@ -247,7 +259,7 @@ export class PluginsManager { '/' + plugin.id + '/' + - arch + + platform + '/' + plugin.id + '.jpl', @@ -284,7 +296,7 @@ export class PluginsManager { } // eslint-disable-next-line dataDirectory = __dirname + '/../..' + dataDirectory; - const plugins = []; + const plugins: Plugins[] = []; const pluginsPath = await this.fileManager.listFiles(dataDirectory); if (pluginsPath === undefined || pluginsPath.length === 0) { return; @@ -308,7 +320,8 @@ export class PluginsManager { '.jpl', [platformPath] ); - if (plugin === undefined) { + // TODO: should refactor this because it's possible that two plugins in different platform have the same id + if ( plugin === undefined) { continue; } plugins.push(plugin); @@ -325,10 +338,12 @@ export class PluginsManager { (plugin: Plugins) => plugin.id === id && plugin.arches.includes(arch) && arch !== undefined ); + const platform = this.getPlatform(arch); if ( plugin === undefined || process.env.DATA_DIRECTORY === undefined || - plugin.background === undefined + plugin.background === undefined || + platform === undefined ) { return ''; } @@ -342,7 +357,7 @@ export class PluginsManager { '/' + plugin.id + '/' + - arch + + platform + '/' + plugin.id + '.jpl', @@ -361,7 +376,10 @@ export class PluginsManager { if (this.archesResolution.has(platform)) { const oldArches = this.archesResolution.get(platform); if (oldArches === undefined) { - this.archesResolution.set(platform, arches); + this.archesResolution.set( + platform, + JSON.parse(JSON.stringify(arches)) + ); continue; } for (const arch of arches) { @@ -369,9 +387,12 @@ export class PluginsManager { oldArches.push(arch); } } - this.archesResolution.set(platform, oldArches); + this.archesResolution.set( + platform, + JSON.parse(JSON.stringify(oldArches)) + ); } else { - this.archesResolution.set(platform, arches); + this.archesResolution.set(platform, JSON.parse(JSON.stringify(arches))); } } } diff --git a/tests/plugins.manager.test.ts b/tests/plugins.manager.test.ts index 5ca17dc17993949d759efa36d7a8c9a3ea9678be..7732666df9de1ffb7b6e1fd54ccd78ce0eae73ae 100644 --- a/tests/plugins.manager.test.ts +++ b/tests/plugins.manager.test.ts @@ -128,7 +128,7 @@ describe('Plugins manager service tests', function () { process.env.DATA_DIRECTORY = '/path/to/plugins'; stub(Object.getPrototypeOf(pluginsManagerService), 'isPluginAvailable').returns(true); - + stub(Object.getPrototypeOf(pluginsManagerService), 'getPlatform').returns(['test']); const actualPath = await pluginsManagerService.getPluginPath('test', 'test'); expect(actualPath).toContain(expectedPath); @@ -282,7 +282,7 @@ describe('Plugins manager service tests', function () { fileManager.readArchive.resolves(JSON.stringify(manifest)); fileManager.readArchive.resolves(expected); - + stub(Object.getPrototypeOf(pluginsManagerService), 'getPlatform').returns(['test']); const actual = await pluginsManagerService['getIcon']("test", "test"); expect(actual).toEqual(expected);