Allow to auto-update extensions

Signed-off-by: Lauri Nevala <lauri.nevala@gmail.com>
This commit is contained in:
Lauri Nevala committed 2021-12-29 12:59:14 +02:00
1 parent d8dbe51e7a
commit e5d9de3206
6 files changed
+112 -5

No files matched your search

@@ -32,6 +32,7 @@ import type {
LensExtensionManifest,
} from "../../../../../extensions/lens-extension";
import type { InstallRequest } from "../install-request";
import { isCompatibleExtension } from "../../../../../extensions/extension-compatibility";
export interface InstallRequestValidated {
fileName: string;
@@ -60,6 +61,11 @@ export async function createTempFilesAndValidate({
await fse.writeFile(tempFile, data);
const manifest = await validatePackage(tempFile);
if (!isCompatibleExtension(manifest)){
throw new Error("Incompatible extension");
}
const id = path.join(
ExtensionDiscovery.getInstance().nodeModulesPath,
manifest.name,
@@ -112,6 +112,7 @@ class NonInjectedExtensions extends React.Component<Dependencies> {
enable={this.props.enableExtension}
disable={this.props.disableExtension}
uninstall={this.props.confirmUninstallExtension}
upgrade={this.props.installFromInput}
/>
</section>
</SettingLayout>
@@ -37,6 +37,7 @@ interface Props {
enable: (id: LensExtensionId) => void;
disable: (id: LensExtensionId) => void;
uninstall: (extension: InstalledExtension) => void;
upgrade: (input: string) => void;
}
function getStatus(extension: InstalledExtension) {
@@ -47,7 +48,7 @@ function getStatus(extension: InstalledExtension) {
return extension.isEnabled ? "Enabled" : "Disabled";
}
export const InstalledExtensions = observer(({ extensions, uninstall, enable, disable }: Props) => {
export const InstalledExtensions = observer(({ extensions, uninstall, enable, disable, upgrade }: Props) => {
const filters = [
(extension: InstalledExtension) => extension.manifest.name,
(extension: InstalledExtension) => getStatus(extension),
@@ -91,7 +92,7 @@ export const InstalledExtensions = observer(({ extensions, uninstall, enable, di
const data = useMemo(
() => {
return extensions.map(extension => {
const { id, isEnabled, isCompatible, manifest } = extension;
const { id, isEnabled, isCompatible, manifest, availableUpdate } = extension;
const { name, description, version } = manifest;
const isUninstalling = ExtensionInstallationStateStore.isExtensionUninstalling(id);
@@ -104,7 +105,15 @@ export const InstalledExtensions = observer(({ extensions, uninstall, enable, di
</div>
</div>
),
version,
version: (
<div>
{version}
{ availableUpdate ?(
<Icon small material="autorenew" title="Update available"/>
) : ""
}
</div>
),
status: (
<div className={cssNames({ [styles.enabled]: isEnabled, [styles.invalid]: !isCompatible })}>
{getStatus(extension)}
@@ -134,6 +143,16 @@ export const InstalledExtensions = observer(({ extensions, uninstall, enable, di
</>
)}
{ availableUpdate && (
<MenuItem
disabled={isUninstalling}
onClick={() => upgrade(availableUpdate.input)}
>
<Icon material="upgrade"/>
<span className="title" aria-disabled={isUninstalling}>Upgrade</span>
</MenuItem>
)}
<MenuItem
disabled={isUninstalling}
onClick={() => uninstall(extension)}