( sourcePath: string, id: string, version: string, )
| 67 | }; |
| 68 | |
| 69 | const loadPluginData = async ( |
| 70 | sourcePath: string, |
| 71 | id: string, |
| 72 | version: string, |
| 73 | ): Promise<LoadedPluginData> => { |
| 74 | const loader = new PluginLoader(sourcePath); |
| 75 | const metadata = await loader.loadMetadata(); |
| 76 | |
| 77 | const permissions = metadata.permissions || []; |
| 78 | const unknownPermissions = permissions.filter( |
| 79 | (p) => !allowedPermissions.includes(p), |
| 80 | ); |
| 81 | const warnings: string[] = unknownPermissions.length |
| 82 | ? [`Unknown permissions: ${unknownPermissions.join(', ')}`] |
| 83 | : []; |
| 84 | |
| 85 | if (warnings.length > 0) { |
| 86 | Logger.plugins.warn( |
| 87 | `Plugin ${id} loaded with warnings: ${warnings.join(', ')}`, |
| 88 | ); |
| 89 | } |
| 90 | |
| 91 | const managedPath = await installPluginToManagedDir(id, version, sourcePath); |
| 92 | const managedPluginLoader = new PluginLoader(managedPath); |
| 93 | const { instance } = await managedPluginLoader.load(); |
| 94 | |
| 95 | return { metadata, managedPath, instance, warnings }; |
| 96 | }; |
| 97 | |
| 98 | export const usePluginStore = create<PluginStore>((set, get) => ({ |
| 99 | plugins: {}, |
no test coverage detected