@gluestack/glue-plugin-sdk
Version:
Gluestack Plugin SDK Manager
96 lines (79 loc) • 2.67 kB
text/typescript
// @ts-ignore
import packageJSON from "../package.json";
import { PluginInstance } from "./PluginInstance";
import IApp from "@gluestack/framework/types/app/interface/IApp";
import IPlugin from "@gluestack/framework/types/plugin/interface/IPlugin";
import IInstance from "@gluestack/framework/types/plugin/interface/IInstance";
import ILifeCycle from "@gluestack/framework/types/plugin/interface/ILifeCycle";
import IManagesInstances from "@gluestack/framework/types/plugin/interface/IManagesInstances";
import IGlueStorePlugin from "@gluestack/framework/types/store/interface/IGluePluginStore";
import { Workspaces } from "@gluestack/helpers";
import { reWriteFile } from "./helpers/rewrite-file";
export { SDK, ISDKPlugin } from "./core/SDK";
// Do not edit the name of this class
export class GlueStackPlugin implements IPlugin, IManagesInstances, ILifeCycle {
app: IApp;
instances: IInstance[];
type: 'stateless' | 'stateful' | 'devonly' = 'devonly';
gluePluginStore: IGlueStorePlugin;
constructor(app: IApp, gluePluginStore: IGlueStorePlugin) {
this.app = app;
this.instances = [];
this.gluePluginStore = gluePluginStore;
}
init() {
//
}
destroy() {
//
}
getName(): string {
return packageJSON.name;
}
getVersion(): string {
return packageJSON.version;
}
getType(): 'stateless' | 'stateful' | 'devonly' {
return this.type;
}
getTemplateFolderPath(): string {
return `${process.cwd()}/node_modules/${this.getName()}/template`;
}
getInstallationPath(target: string): string {
return `./shared/${target}`;
}
async runPostInstall(instanceName: string, target: string) {
const instance: PluginInstance = await this.app.createPluginInstance(
this,
instanceName,
this.getTemplateFolderPath(),
target,
);
if (instance) {
// update package.json'S name index with the new instance name
const pluginPackage = `${instance.getInstallationPath()}/package.json`;
await reWriteFile(pluginPackage, instanceName, 'INSTANCENAME');
// update root package.json's workspaces with the new instance name
const rootPackage = `${process.cwd()}/package.json`;
await Workspaces.append(rootPackage, instance.getInstallationPath());
}
}
createInstance(
key: string,
gluePluginStore: IGlueStorePlugin,
installationPath: string,
): IInstance {
const instance = new PluginInstance(
this.app,
this,
key,
gluePluginStore,
installationPath,
);
this.instances.push(instance);
return instance;
}
getInstances(): IInstance[] {
return this.instances;
}
}