Summary: Currently, when user installs a new plugin which was not installed before that, Flipper always takes the latest available version of it. This is not correct, because the latest version might be incompatible with the currently running version of Flipper. To avoid that, instead of always using just the latest version we will be using the most recent version which is compatible with the current Flipper version. Reviewed By: passy Differential Revision: D28306505 fbshipit-source-id: 4258a456d6a5d92cbf48af55c0efb17ecf560b57
295 lines
9.5 KiB
TypeScript
295 lines
9.5 KiB
TypeScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
*/
|
|
|
|
import fs from 'fs-extra';
|
|
import path from 'path';
|
|
import {getInstalledPluginDetails} from '../getPluginDetails';
|
|
import {pluginInstallationDir} from '../pluginPaths';
|
|
import {normalizePath} from 'flipper-test-utils';
|
|
|
|
jest.mock('../pluginPaths', () => ({
|
|
pluginInstallationDir: '/Users/mock/.flipper/thirdparty',
|
|
pluginCacheDir: '/Users/mock/.flipper/plugins',
|
|
}));
|
|
|
|
const pluginPath = path.join(pluginInstallationDir, 'flipper-plugin-test');
|
|
|
|
test('getPluginDetailsV1', async () => {
|
|
const pluginV1 = {
|
|
name: 'flipper-plugin-test',
|
|
version: '2.0.0',
|
|
title: 'Test Plugin',
|
|
main: 'src/index.tsx',
|
|
description: 'Description of Test Plugin',
|
|
gatekeeper: 'GK_flipper_plugin_test',
|
|
};
|
|
jest.mock('fs-extra', () => jest.fn());
|
|
fs.readJson = jest.fn().mockImplementation(() => pluginV1);
|
|
const details = await getInstalledPluginDetails(pluginPath);
|
|
details.dir = normalizePath(details.dir);
|
|
details.entry = normalizePath(details.entry);
|
|
expect(details).toMatchInlineSnapshot(`
|
|
Object {
|
|
"bugs": undefined,
|
|
"category": undefined,
|
|
"description": "Description of Test Plugin",
|
|
"dir": "/Users/mock/.flipper/thirdparty/flipper-plugin-test",
|
|
"engines": undefined,
|
|
"entry": "/Users/mock/.flipper/plugins/flipper-plugin-test@2.0.0.js",
|
|
"flipperSDKVersion": undefined,
|
|
"gatekeeper": "GK_flipper_plugin_test",
|
|
"icon": undefined,
|
|
"id": "flipper-plugin-test",
|
|
"isActivatable": true,
|
|
"isBundled": false,
|
|
"main": "dist/bundle.js",
|
|
"name": "flipper-plugin-test",
|
|
"pluginType": undefined,
|
|
"source": "src/index.tsx",
|
|
"specVersion": 1,
|
|
"supportedDevices": undefined,
|
|
"title": "Test Plugin",
|
|
"version": "2.0.0",
|
|
}
|
|
`);
|
|
});
|
|
|
|
test('getPluginDetailsV2', async () => {
|
|
const pluginV2 = {
|
|
$schema: 'https://fbflipper.com/schemas/plugin-package/v2.json',
|
|
name: 'flipper-plugin-test',
|
|
title: 'Test',
|
|
version: '3.0.1',
|
|
main: 'dist/bundle.js',
|
|
flipperBundlerEntry: 'src/index.tsx',
|
|
description: 'Description of Test Plugin',
|
|
gatekeeper: 'GK_flipper_plugin_test',
|
|
};
|
|
jest.mock('fs-extra', () => jest.fn());
|
|
fs.readJson = jest.fn().mockImplementation(() => pluginV2);
|
|
const details = await getInstalledPluginDetails(pluginPath);
|
|
details.dir = normalizePath(details.dir);
|
|
details.entry = normalizePath(details.entry);
|
|
expect(details).toMatchInlineSnapshot(`
|
|
Object {
|
|
"bugs": undefined,
|
|
"category": undefined,
|
|
"description": "Description of Test Plugin",
|
|
"dir": "/Users/mock/.flipper/thirdparty/flipper-plugin-test",
|
|
"engines": undefined,
|
|
"entry": "/Users/mock/.flipper/thirdparty/flipper-plugin-test/dist/bundle.js",
|
|
"flipperSDKVersion": undefined,
|
|
"gatekeeper": "GK_flipper_plugin_test",
|
|
"icon": undefined,
|
|
"id": "flipper-plugin-test",
|
|
"isActivatable": true,
|
|
"isBundled": false,
|
|
"main": "dist/bundle.js",
|
|
"name": "flipper-plugin-test",
|
|
"pluginType": undefined,
|
|
"source": "src/index.tsx",
|
|
"specVersion": 2,
|
|
"supportedDevices": undefined,
|
|
"title": "Test",
|
|
"version": "3.0.1",
|
|
}
|
|
`);
|
|
});
|
|
|
|
test('id used as title if the latter omited', async () => {
|
|
const pluginV2 = {
|
|
$schema: 'https://fbflipper.com/schemas/plugin-package/v2.json',
|
|
name: 'flipper-plugin-test',
|
|
id: 'test',
|
|
version: '3.0.1',
|
|
main: 'dist/bundle.js',
|
|
flipperBundlerEntry: 'src/index.tsx',
|
|
description: 'Description of Test Plugin',
|
|
gatekeeper: 'GK_flipper_plugin_test',
|
|
};
|
|
jest.mock('fs-extra', () => jest.fn());
|
|
fs.readJson = jest.fn().mockImplementation(() => pluginV2);
|
|
const details = await getInstalledPluginDetails(pluginPath);
|
|
details.dir = normalizePath(details.dir);
|
|
details.entry = normalizePath(details.entry);
|
|
expect(details).toMatchInlineSnapshot(`
|
|
Object {
|
|
"bugs": undefined,
|
|
"category": undefined,
|
|
"description": "Description of Test Plugin",
|
|
"dir": "/Users/mock/.flipper/thirdparty/flipper-plugin-test",
|
|
"engines": undefined,
|
|
"entry": "/Users/mock/.flipper/thirdparty/flipper-plugin-test/dist/bundle.js",
|
|
"flipperSDKVersion": undefined,
|
|
"gatekeeper": "GK_flipper_plugin_test",
|
|
"icon": undefined,
|
|
"id": "test",
|
|
"isActivatable": true,
|
|
"isBundled": false,
|
|
"main": "dist/bundle.js",
|
|
"name": "flipper-plugin-test",
|
|
"pluginType": undefined,
|
|
"source": "src/index.tsx",
|
|
"specVersion": 2,
|
|
"supportedDevices": undefined,
|
|
"title": "test",
|
|
"version": "3.0.1",
|
|
}
|
|
`);
|
|
});
|
|
|
|
test('name without "flipper-plugin-" prefix is used as title if the latter omited', async () => {
|
|
const pluginV2 = {
|
|
$schema: 'https://fbflipper.com/schemas/plugin-package/v2.json',
|
|
name: 'flipper-plugin-test',
|
|
version: '3.0.1',
|
|
main: 'dist/bundle.js',
|
|
flipperBundlerEntry: 'src/index.tsx',
|
|
description: 'Description of Test Plugin',
|
|
gatekeeper: 'GK_flipper_plugin_test',
|
|
};
|
|
jest.mock('fs-extra', () => jest.fn());
|
|
fs.readJson = jest.fn().mockImplementation(() => pluginV2);
|
|
const details = await getInstalledPluginDetails(pluginPath);
|
|
details.dir = normalizePath(details.dir);
|
|
details.entry = normalizePath(details.entry);
|
|
expect(details).toMatchInlineSnapshot(`
|
|
Object {
|
|
"bugs": undefined,
|
|
"category": undefined,
|
|
"description": "Description of Test Plugin",
|
|
"dir": "/Users/mock/.flipper/thirdparty/flipper-plugin-test",
|
|
"engines": undefined,
|
|
"entry": "/Users/mock/.flipper/thirdparty/flipper-plugin-test/dist/bundle.js",
|
|
"flipperSDKVersion": undefined,
|
|
"gatekeeper": "GK_flipper_plugin_test",
|
|
"icon": undefined,
|
|
"id": "flipper-plugin-test",
|
|
"isActivatable": true,
|
|
"isBundled": false,
|
|
"main": "dist/bundle.js",
|
|
"name": "flipper-plugin-test",
|
|
"pluginType": undefined,
|
|
"source": "src/index.tsx",
|
|
"specVersion": 2,
|
|
"supportedDevices": undefined,
|
|
"title": "test",
|
|
"version": "3.0.1",
|
|
}
|
|
`);
|
|
});
|
|
|
|
test('flipper-plugin-version is parsed', async () => {
|
|
const pluginV2 = {
|
|
$schema: 'https://fbflipper.com/schemas/plugin-package/v2.json',
|
|
name: 'flipper-plugin-test',
|
|
version: '3.0.1',
|
|
main: 'dist/bundle.js',
|
|
flipperBundlerEntry: 'src/index.tsx',
|
|
description: 'Description of Test Plugin',
|
|
gatekeeper: 'GK_flipper_plugin_test',
|
|
peerDependencies: {
|
|
'flipper-plugin': '^0.45',
|
|
},
|
|
};
|
|
jest.mock('fs-extra', () => jest.fn());
|
|
fs.readJson = jest.fn().mockImplementation(() => pluginV2);
|
|
const details = await getInstalledPluginDetails(pluginPath);
|
|
details.dir = normalizePath(details.dir);
|
|
details.entry = normalizePath(details.entry);
|
|
expect(details).toMatchInlineSnapshot(`
|
|
Object {
|
|
"bugs": undefined,
|
|
"category": undefined,
|
|
"description": "Description of Test Plugin",
|
|
"dir": "/Users/mock/.flipper/thirdparty/flipper-plugin-test",
|
|
"engines": undefined,
|
|
"entry": "/Users/mock/.flipper/thirdparty/flipper-plugin-test/dist/bundle.js",
|
|
"flipperSDKVersion": "^0.45",
|
|
"gatekeeper": "GK_flipper_plugin_test",
|
|
"icon": undefined,
|
|
"id": "flipper-plugin-test",
|
|
"isActivatable": true,
|
|
"isBundled": false,
|
|
"main": "dist/bundle.js",
|
|
"name": "flipper-plugin-test",
|
|
"pluginType": undefined,
|
|
"source": "src/index.tsx",
|
|
"specVersion": 2,
|
|
"supportedDevices": undefined,
|
|
"title": "test",
|
|
"version": "3.0.1",
|
|
}
|
|
`);
|
|
});
|
|
|
|
test('plugin type and supported devices parsed', async () => {
|
|
const pluginV2 = {
|
|
$schema: 'https://fbflipper.com/schemas/plugin-package/v2.json',
|
|
name: 'flipper-plugin-test',
|
|
title: 'Test',
|
|
version: '3.0.1',
|
|
pluginType: 'device',
|
|
supportedDevices: [
|
|
{os: 'Android', archived: false},
|
|
{os: 'Android', type: 'physical', specs: ['KaiOS']},
|
|
{os: 'iOS', type: 'emulator'},
|
|
],
|
|
main: 'dist/bundle.js',
|
|
flipperBundlerEntry: 'src/index.tsx',
|
|
description: 'Description of Test Plugin',
|
|
gatekeeper: 'GK_flipper_plugin_test',
|
|
};
|
|
jest.mock('fs-extra', () => jest.fn());
|
|
fs.readJson = jest.fn().mockImplementation(() => pluginV2);
|
|
const details = await getInstalledPluginDetails(pluginPath);
|
|
details.dir = normalizePath(details.dir);
|
|
details.entry = normalizePath(details.entry);
|
|
expect(details).toMatchInlineSnapshot(`
|
|
Object {
|
|
"bugs": undefined,
|
|
"category": undefined,
|
|
"description": "Description of Test Plugin",
|
|
"dir": "/Users/mock/.flipper/thirdparty/flipper-plugin-test",
|
|
"engines": undefined,
|
|
"entry": "/Users/mock/.flipper/thirdparty/flipper-plugin-test/dist/bundle.js",
|
|
"flipperSDKVersion": undefined,
|
|
"gatekeeper": "GK_flipper_plugin_test",
|
|
"icon": undefined,
|
|
"id": "flipper-plugin-test",
|
|
"isActivatable": true,
|
|
"isBundled": false,
|
|
"main": "dist/bundle.js",
|
|
"name": "flipper-plugin-test",
|
|
"pluginType": "device",
|
|
"source": "src/index.tsx",
|
|
"specVersion": 2,
|
|
"supportedDevices": Array [
|
|
Object {
|
|
"archived": false,
|
|
"os": "Android",
|
|
},
|
|
Object {
|
|
"os": "Android",
|
|
"specs": Array [
|
|
"KaiOS",
|
|
],
|
|
"type": "physical",
|
|
},
|
|
Object {
|
|
"os": "iOS",
|
|
"type": "emulator",
|
|
},
|
|
],
|
|
"title": "Test",
|
|
"version": "3.0.1",
|
|
}
|
|
`);
|
|
});
|