format export interface PluginDetails { name : string ; specVersion : number ; version : string ; source : string ; main : string ; id : string ; gatekeeper ? : string ; title : string ; icon ? : string ; description ? : string ; category ? : string ; engines ? : { [ name ] : string ; } ; bugs ? : { email ? : string ; url ? : string ; } ; flipperSDKVersion ? : string ; pluginType ? : PluginType ; supportedDevices ? : SupportedDevice [ ] ; supportedApps ? : SupportedApp [ ] ; publishedDocs ? : { overview ? : boolean ; setup ? : boolean ; } ; } export interface SupportedDevice { readonly os ? : OS ; readonly type ? : DeviceType ; readonly archived ? : boolean ; readonly specs ? : DeviceSpec [ ] ; } export interface SupportedApp { readonly appID ? : string ; readonly os ? : OS ; readonly type ? : DeviceType ; } export type OS = 'iOS' | 'Android' | 'Metro' | 'Windows' | 'MacOS' | 'Browser' | 'Linux' ; export type DeviceType = 'emulator' | 'physical' | 'dummy' ; export type PluginType = 'client' | 'device' ; export type DeviceSpec = 'KaiOS' ; export interface ConcretePluginDetails extends PluginDetails { isBundled : boolean ; isActivatable : boolean ; } export interface BundledPluginDetails extends ConcretePluginDetails { isBundled : true ; isActivatable : true ; } export interface InstalledPluginDetails extends ConcretePluginDetails { isBundled : false ; isActivatable : true ; dir : string ; entry : string ; } export type ActivatablePluginDetails = BundledPluginDetails | InstalledPluginDetails ; export interface DownloadablePluginDetails extends ConcretePluginDetails { isActivatable : false ; isBundled : false ; downloadUrl : string ; lastUpdated : Date ; } export type UpdateResult = { kind : 'not-installed' ; version : string ; } | { kind : 'up-to-date' ; } | { kind : 'error' ; error : Error ; } | { kind : 'update-available' ; version : string ; } ; export type UpdatablePlugin = { updateStatus : UpdateResult ; } ; export type UpdatablePluginDetails = InstalledPluginDetails & UpdatablePlugin ; export function getPluginDetails ( packageJson ) { const specVersion = packageJson . $schema && packageJson . $schema === 'https://fbflipper.com/schemas/plugin-package/v2.json' ? 2 : 1 ; switch ( specVersion ) { case 1 : return getPluginDetailsV1 ( packageJson ) ; case 2 : return getPluginDetailsV2 ( packageJson ) ; default : throw new Error ( `Unknown plugin format version: ${ specVersion }` ) ; } } function getPluginDetailsV1 ( packageJson ) { return { specVersion : 1 , name : packageJson . name , version : packageJson . version , main : 'dist/bundle.js' , source : packageJson . main , id : packageJson . name , gatekeeper : packageJson . gatekeeper , icon : packageJson . icon , title : packageJson . title || packageJson . name , description : packageJson . description , category : packageJson . category , bugs : packageJson . bugs , flipperSDKVersion : packageJson ?. peerDependencies ?. [ 'flipper-plugin' ] , pluginType : packageJson ?. pluginType , supportedDevices : packageJson ?. supportedDevices , supportedApps : packageJson ?. supportedApps , engines : packageJson . engines , } ; } function getPluginDetailsV2 ( packageJson ) { return { specVersion : 2 , name : packageJson . name , version : packageJson . version , main : packageJson . main , source : packageJson . flipperBundlerEntry , id : packageJson . id || packageJson . name , gatekeeper : packageJson . gatekeeper , icon : packageJson . icon , title : packageJson . title || packageJson . id || getTitleFromName ( packageJson . name ) , description : packageJson . description , category : packageJson . category , bugs : packageJson . bugs , flipperSDKVersion : packageJson ?. peerDependencies ?. [ 'flipper-plugin' ] , pluginType : packageJson ?. pluginType , supportedDevices : packageJson ?. supportedDevices , supportedApps : packageJson ?. supportedApps , engines : packageJson . engines , publishedDocs : packageJson . publishedDocs , } ; } function getTitleFromName ( name ) { const prefix = 'flipper-plugin-' ; if ( name . startsWith ( prefix ) ) { return name . substr ( prefix . length ) ; } return name ; } export function isPluginJson ( packageJson ) { return packageJson ?. keywords ?. includes ( 'flipper-plugin' ) ; }