|
|
@ -1,7 +1,7 @@ |
|
|
|
import { IframePlugin, IframeProfile, ViewPlugin } from '@remixproject/engine-web' |
|
|
|
import { IframePlugin, IframeProfile, ViewPlugin } from '@remixproject/engine-web' |
|
|
|
import * as packageJson from '../../../../../package.json' |
|
|
|
import * as packageJson from '../../../../../package.json' |
|
|
|
import React from 'react' // eslint-disable-line
|
|
|
|
import React from 'react' // eslint-disable-line
|
|
|
|
import { customScriptRunnerConfig, Dependency, ProjectConfiguration, ScriptRunnerUI } from '@remix-scriptrunner' // eslint-disable-line
|
|
|
|
import { customScriptRunnerConfig, Dependency, ProjectConfiguration, ScriptRunnerConfig, ScriptRunnerUI } from '@remix-scriptrunner' // eslint-disable-line
|
|
|
|
import { Profile } from '@remixproject/plugin-utils' |
|
|
|
import { Profile } from '@remixproject/plugin-utils' |
|
|
|
import { Engine, Plugin } from '@remixproject/engine' |
|
|
|
import { Engine, Plugin } from '@remixproject/engine' |
|
|
|
import axios from 'axios' |
|
|
|
import axios from 'axios' |
|
|
@ -25,50 +25,62 @@ const profile = { |
|
|
|
|
|
|
|
|
|
|
|
const configFileName = 'script.config.json' |
|
|
|
const configFileName = 'script.config.json' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let baseUrl = 'http://localhost:3000' |
|
|
|
|
|
|
|
let customBuildUrl = 'http://localhost:4000/build' |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
interface IScriptRunnerState { |
|
|
|
|
|
|
|
customConfig: customScriptRunnerConfig |
|
|
|
|
|
|
|
configurations: ProjectConfiguration[] |
|
|
|
|
|
|
|
activeConfig: ProjectConfiguration |
|
|
|
|
|
|
|
enableCustomScriptRunner: boolean |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
export class ScriptRunnerUIPlugin extends ViewPlugin { |
|
|
|
export class ScriptRunnerUIPlugin extends ViewPlugin { |
|
|
|
engine: Engine |
|
|
|
engine: Engine |
|
|
|
current: string |
|
|
|
|
|
|
|
currentTemplate: string |
|
|
|
|
|
|
|
dispatch: React.Dispatch<any> = () => { } |
|
|
|
dispatch: React.Dispatch<any> = () => { } |
|
|
|
workspaceScriptRunnerDefaults: Record<string, string> |
|
|
|
workspaceScriptRunnerDefaults: Record<string, string> |
|
|
|
customConfig: customScriptRunnerConfig |
|
|
|
customConfig: ScriptRunnerConfig |
|
|
|
configurations: ProjectConfiguration[] |
|
|
|
configurations: ProjectConfiguration[] |
|
|
|
|
|
|
|
activeConfig: ProjectConfiguration |
|
|
|
|
|
|
|
enableCustomScriptRunner: boolean |
|
|
|
plugin: Plugin<any, CustomRemixApi> |
|
|
|
plugin: Plugin<any, CustomRemixApi> |
|
|
|
|
|
|
|
scriptRunnerProfileName: string |
|
|
|
constructor(engine: Engine) { |
|
|
|
constructor(engine: Engine) { |
|
|
|
super(profile) |
|
|
|
super(profile) |
|
|
|
console.log('ScriptRunnerUIPlugin', this) |
|
|
|
console.log('ScriptRunnerUIPlugin', this) |
|
|
|
this.engine = engine |
|
|
|
this.engine = engine |
|
|
|
this.workspaceScriptRunnerDefaults = {} |
|
|
|
this.workspaceScriptRunnerDefaults = {} |
|
|
|
this.plugin = this |
|
|
|
this.plugin = this |
|
|
|
|
|
|
|
this.enableCustomScriptRunner = false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async onActivation() { |
|
|
|
async onActivation() { |
|
|
|
console.log('onActivation', this) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log('onActivation', this.customConfig) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.on('filePanel', 'setWorkspace', async (workspace: string) => { |
|
|
|
this.on('filePanel', 'setWorkspace', async (workspace: string) => { |
|
|
|
console.log('setWorkspace', workspace, this) |
|
|
|
console.log('setWorkspace', workspace) |
|
|
|
this.customConfig = { |
|
|
|
this.activeConfig = null |
|
|
|
|
|
|
|
this.customConfig = |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
defaultConfig: 'default', |
|
|
|
|
|
|
|
customConfig: { |
|
|
|
baseConfiguration: 'default', |
|
|
|
baseConfiguration: 'default', |
|
|
|
dependencies: [] |
|
|
|
dependencies: [] |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
await this.loadCustomConfig() |
|
|
|
await this.loadCustomConfig() |
|
|
|
this.loadConfigurations() |
|
|
|
await this.loadConfigurations() |
|
|
|
this.renderComponent() |
|
|
|
this.renderComponent() |
|
|
|
console.log('setWorkspace', this.customConfig) |
|
|
|
|
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
this.plugin.on('fileManager','fileSaved', async (file: string) =>{ |
|
|
|
this.plugin.on('fileManager', 'fileSaved', async (file: string) => { |
|
|
|
console.log(file) |
|
|
|
|
|
|
|
if(file === configFileName) { |
|
|
|
if (file === configFileName && this.enableCustomScriptRunner) { |
|
|
|
await this.loadCustomConfig() |
|
|
|
await this.loadCustomConfig() |
|
|
|
this.renderComponent() |
|
|
|
this.renderComponent() |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
await this.loadCustomConfig() |
|
|
|
await this.loadCustomConfig() |
|
|
|
this.loadConfigurations() |
|
|
|
await this.loadConfigurations() |
|
|
|
this.renderComponent() |
|
|
|
this.renderComponent() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -89,69 +101,137 @@ export class ScriptRunnerUIPlugin extends ViewPlugin { |
|
|
|
this.dispatch({ |
|
|
|
this.dispatch({ |
|
|
|
customConfig: this.customConfig, |
|
|
|
customConfig: this.customConfig, |
|
|
|
configurations: this.configurations, |
|
|
|
configurations: this.configurations, |
|
|
|
|
|
|
|
activeConfig: this.activeConfig, |
|
|
|
|
|
|
|
enableCustomScriptRunner: this.enableCustomScriptRunner |
|
|
|
}) |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
updateComponent(state: any) { |
|
|
|
updateComponent(state: IScriptRunnerState) { |
|
|
|
console.log('updateComponent', state) |
|
|
|
|
|
|
|
return ( |
|
|
|
return ( |
|
|
|
<ScriptRunnerUI |
|
|
|
<ScriptRunnerUI |
|
|
|
customConfig={state.customConfig} |
|
|
|
customConfig={state.customConfig} |
|
|
|
configurations={state.configurations} |
|
|
|
configurations={state.configurations} |
|
|
|
|
|
|
|
activeConfig={state.activeConfig} |
|
|
|
|
|
|
|
enableCustomScriptRunner={state.enableCustomScriptRunner} |
|
|
|
activateCustomScriptRunner={this.activateCustomScriptRunner.bind(this)} |
|
|
|
activateCustomScriptRunner={this.activateCustomScriptRunner.bind(this)} |
|
|
|
saveCustomConfig={this.saveCustomConfig.bind(this)} |
|
|
|
saveCustomConfig={this.saveCustomConfig.bind(this)} |
|
|
|
openCustomConfig={this.openCustomConfig.bind(this)} |
|
|
|
openCustomConfig={this.openCustomConfig.bind(this)} |
|
|
|
buildScriptRunner={this.buildScriptRunner.bind(this)} |
|
|
|
buildScriptRunner={this.buildScriptRunner.bind(this)} |
|
|
|
loadScriptRunner={this.loadScriptRunner.bind(this)} /> |
|
|
|
loadScriptRunner={this.selectScriptRunner.bind(this)} /> |
|
|
|
) |
|
|
|
) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async loadScriptRunner(name: string) { |
|
|
|
async selectScriptRunner(config: ProjectConfiguration) { |
|
|
|
console.log('loadScriptRunner', name) |
|
|
|
console.log('selectScriptRunner', config) |
|
|
|
|
|
|
|
await this.loadScriptRunner(config) |
|
|
|
|
|
|
|
await this.saveCustomConfig(this.customConfig) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async loadScriptRunner(config: ProjectConfiguration): Promise<boolean> { |
|
|
|
|
|
|
|
console.log('loadScriptRunner', config) |
|
|
|
const profile: Profile = await this.plugin.call('manager', 'getProfile', 'scriptRunner') |
|
|
|
const profile: Profile = await this.plugin.call('manager', 'getProfile', 'scriptRunner') |
|
|
|
|
|
|
|
this.scriptRunnerProfileName = profile.name |
|
|
|
const testPluginName = localStorage.getItem('test-plugin-name') |
|
|
|
const testPluginName = localStorage.getItem('test-plugin-name') |
|
|
|
const testPluginUrl = localStorage.getItem('test-plugin-url') |
|
|
|
const testPluginUrl = localStorage.getItem('test-plugin-url') |
|
|
|
let baseUrl = 'http://localhost:3000' |
|
|
|
|
|
|
|
let url = `${baseUrl}?template=${name}×tamp=${Date.now()}` |
|
|
|
let url = `${baseUrl}?template=${config.name}×tamp=${Date.now()}` |
|
|
|
if (testPluginName === 'scriptRunner') { |
|
|
|
if (testPluginName === 'scriptRunner') { |
|
|
|
// if testpluginurl has template specified only use that
|
|
|
|
// if testpluginurl has template specified only use that
|
|
|
|
if (testPluginUrl.indexOf('template') > -1) { |
|
|
|
if (testPluginUrl.indexOf('template') > -1) { |
|
|
|
url = testPluginUrl |
|
|
|
url = testPluginUrl |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
baseUrl = `//${new URL(testPluginUrl).host}` |
|
|
|
baseUrl = `//${new URL(testPluginUrl).host}` |
|
|
|
url = `${baseUrl}?template=${name}×tamp=${Date.now()}` |
|
|
|
url = `${baseUrl}?template=${config.name}×tamp=${Date.now()}` |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
console.log('loadScriptRunner', profile) |
|
|
|
const newProfile: IframeProfile = { |
|
|
|
const newProfile: IframeProfile = { |
|
|
|
...profile, |
|
|
|
...profile, |
|
|
|
name: profile.name + name, |
|
|
|
name: profile.name + config.name, |
|
|
|
location: 'hidden', |
|
|
|
location: 'hiddenPanel', |
|
|
|
url: url |
|
|
|
url: url |
|
|
|
} |
|
|
|
} |
|
|
|
console.log('loadScriptRunner', newProfile) |
|
|
|
console.log('loadScriptRunner', newProfile) |
|
|
|
|
|
|
|
let result = null |
|
|
|
try { |
|
|
|
try { |
|
|
|
|
|
|
|
this.setIsLoading(config.name, true) |
|
|
|
const plugin: IframePlugin = new IframePlugin(newProfile) |
|
|
|
const plugin: IframePlugin = new IframePlugin(newProfile) |
|
|
|
|
|
|
|
if (!this.engine.isRegistered(newProfile.name)) { |
|
|
|
|
|
|
|
console.log('registering plugin', plugin) |
|
|
|
await this.engine.register(plugin) |
|
|
|
await this.engine.register(plugin) |
|
|
|
|
|
|
|
} |
|
|
|
await this.plugin.call('manager', 'activatePlugin', newProfile.name) |
|
|
|
await this.plugin.call('manager', 'activatePlugin', newProfile.name) |
|
|
|
this.current = newProfile.name |
|
|
|
|
|
|
|
this.currentTemplate = name |
|
|
|
this.activeConfig = config |
|
|
|
this.on(newProfile.name, 'log', this.log.bind(this)) |
|
|
|
this.on(newProfile.name, 'log', this.log.bind(this)) |
|
|
|
this.on(newProfile.name, 'info', this.info.bind(this)) |
|
|
|
this.on(newProfile.name, 'info', this.info.bind(this)) |
|
|
|
this.on(newProfile.name, 'warn', this.warn.bind(this)) |
|
|
|
this.on(newProfile.name, 'warn', this.warn.bind(this)) |
|
|
|
this.on(newProfile.name, 'error', this.error.bind(this)) |
|
|
|
this.on(newProfile.name, 'error', this.error.bind(this)) |
|
|
|
this.on(newProfile.name, 'dependencyError', this.dependencyError.bind(this)) |
|
|
|
this.on(newProfile.name, 'dependencyError', this.dependencyError.bind(this)) |
|
|
|
|
|
|
|
this.customConfig.defaultConfig = config.name |
|
|
|
|
|
|
|
this.setErrorStatus(config.name, false, '') |
|
|
|
|
|
|
|
result = true |
|
|
|
} catch (e) { |
|
|
|
} catch (e) { |
|
|
|
this.current = newProfile.name |
|
|
|
|
|
|
|
this.currentTemplate = name |
|
|
|
this.engine.remove(newProfile.name) |
|
|
|
console.log('Already loaded') |
|
|
|
console.log('is registered', newProfile.name, this.engine.isRegistered(newProfile.name)) |
|
|
|
|
|
|
|
console.log('Error loading script runner: ', newProfile.name, e) |
|
|
|
|
|
|
|
this.setErrorStatus(config.name, true, e) |
|
|
|
|
|
|
|
result = false |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
this.setIsLoading(config.name, false) |
|
|
|
|
|
|
|
this.renderComponent() |
|
|
|
|
|
|
|
return result |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async execute(script: string, filePath: string) { |
|
|
|
async execute(script: string, filePath: string) { |
|
|
|
if (!this.current) await this.loadScriptRunner('default') |
|
|
|
console.log('is registered', `${this.scriptRunnerProfileName}${this.activeConfig.name}`, this.engine.isRegistered(`${this.scriptRunnerProfileName}${this.activeConfig.name}`)) |
|
|
|
console.log('execute', this.current) |
|
|
|
if (!this.scriptRunnerProfileName || !this.engine.isRegistered(`${this.scriptRunnerProfileName}${this.activeConfig.name}`)) { |
|
|
|
await this.call(this.current, 'execute', script, filePath) |
|
|
|
if (!await this.loadScriptRunner(this.activeConfig)) { |
|
|
|
|
|
|
|
console.error('Error loading script runner') |
|
|
|
|
|
|
|
return |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
console.log('execute', this.activeConfig) |
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
await this.call(`${this.scriptRunnerProfileName}${this.activeConfig.name}`, 'execute', script, filePath) |
|
|
|
|
|
|
|
} catch (e) { |
|
|
|
|
|
|
|
console.error('Error executing script', e) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async setErrorStatus(name: string, status: boolean, error: string) { |
|
|
|
|
|
|
|
console.log('setLoadingStatus', name, status, error) |
|
|
|
|
|
|
|
this.configurations.forEach((config) => { |
|
|
|
|
|
|
|
if (config.name === name) { |
|
|
|
|
|
|
|
config.errorStatus = status |
|
|
|
|
|
|
|
config.error = error |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
this.renderComponent() |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async setIsLoading(name: string, status: boolean) { |
|
|
|
|
|
|
|
console.log('setLoadingStatus', name, status) |
|
|
|
|
|
|
|
if (status) { |
|
|
|
|
|
|
|
this.emit('statusChanged', { |
|
|
|
|
|
|
|
key: 'loading', |
|
|
|
|
|
|
|
type: 'info', |
|
|
|
|
|
|
|
title: 'loading...' |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
this.emit('statusChanged', { |
|
|
|
|
|
|
|
key: 'none' |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
this.configurations.forEach((config) => { |
|
|
|
|
|
|
|
if (config.name === name) { |
|
|
|
|
|
|
|
config.isLoading = status |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
|
|
|
|
this.renderComponent() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async dependencyError(data: any) { |
|
|
|
async dependencyError(data: any) { |
|
|
@ -202,40 +282,58 @@ export class ScriptRunnerUIPlugin extends ViewPlugin { |
|
|
|
console.log('buildScriptRunner', dependencies) |
|
|
|
console.log('buildScriptRunner', dependencies) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async loadCustomConfig(): Promise<customScriptRunnerConfig> { |
|
|
|
async loadCustomConfig(): Promise<ScriptRunnerConfig> { |
|
|
|
console.log('loadCustomConfig') |
|
|
|
console.log('loadCustomConfig') |
|
|
|
//await this.plugin.call('fileManager', 'open', 'script.config.json')
|
|
|
|
//await this.plugin.call('fileManager', 'open', 'script.config.json')
|
|
|
|
try { |
|
|
|
try { |
|
|
|
const content = await this.plugin.call('fileManager', 'readFile', configFileName) |
|
|
|
const content = await this.plugin.call('fileManager', 'readFile', configFileName) |
|
|
|
|
|
|
|
console.log('loadCustomConfig', content) |
|
|
|
const parsed = JSON.parse(content) |
|
|
|
const parsed = JSON.parse(content) |
|
|
|
this.customConfig = parsed |
|
|
|
this.customConfig = parsed |
|
|
|
|
|
|
|
console.log('loadCustomConfig', this.customConfig) |
|
|
|
} catch (e) { |
|
|
|
} catch (e) { |
|
|
|
return { |
|
|
|
return { |
|
|
|
|
|
|
|
defaultConfig: 'default', |
|
|
|
|
|
|
|
customConfig: { |
|
|
|
baseConfiguration: 'default', |
|
|
|
baseConfiguration: 'default', |
|
|
|
dependencies: [] |
|
|
|
dependencies: [] |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async openCustomConfig() { |
|
|
|
async openCustomConfig() { |
|
|
|
try { |
|
|
|
try { |
|
|
|
await this.plugin.call('fileManager', 'open', 'script.config.json') |
|
|
|
await this.plugin.call('fileManager', 'open', 'script.config.json') |
|
|
|
}catch(e){ |
|
|
|
} catch (e) { |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async loadConfigurations() { |
|
|
|
async loadConfigurations() { |
|
|
|
try { |
|
|
|
try { |
|
|
|
const response = await axios.get('http://localhost:3000/projects.json?timestamp=' + Date.now()); |
|
|
|
const response = await axios.get(`${baseUrl}/projects.json?timestamp=${Date.now()}`); |
|
|
|
this.configurations = response.data; |
|
|
|
this.configurations = response.data; |
|
|
|
|
|
|
|
// find the default otherwise pick the first one as the active
|
|
|
|
|
|
|
|
this.configurations.forEach((config) => { |
|
|
|
|
|
|
|
console.log('loadConfigurations', config.name, this.customConfig.defaultConfig) |
|
|
|
|
|
|
|
if (config.name === (this.customConfig.defaultConfig)) { |
|
|
|
|
|
|
|
this.activeConfig = config; |
|
|
|
|
|
|
|
console.log('loadConfigurations found', this.activeConfig) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}); |
|
|
|
|
|
|
|
if (!this.activeConfig) { |
|
|
|
|
|
|
|
this.activeConfig = this.configurations[0]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
console.log('active config', this.configurations, this.activeConfig) |
|
|
|
} catch (error) { |
|
|
|
} catch (error) { |
|
|
|
console.error("Error fetching the projects data:", error); |
|
|
|
console.error("Error fetching the projects data:", error); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
async saveCustomConfig(content: customScriptRunnerConfig) { |
|
|
|
async saveCustomConfig(content: ScriptRunnerConfig) { |
|
|
|
console.log('saveCustomConfig', content) |
|
|
|
console.log('saveCustomConfig', content) |
|
|
|
await this.plugin.call('fileManager', 'writeFile', 'script.config.json', JSON.stringify(content, null, 2)) |
|
|
|
await this.plugin.call('fileManager', 'writeFile', 'script.config.json', JSON.stringify(content, null, 2)) |
|
|
|
} |
|
|
|
} |
|
|
@ -244,9 +342,23 @@ export class ScriptRunnerUIPlugin extends ViewPlugin { |
|
|
|
console.log('activateCustomScriptRunner', config) |
|
|
|
console.log('activateCustomScriptRunner', config) |
|
|
|
// post config to localhost:4000 using axios
|
|
|
|
// post config to localhost:4000 using axios
|
|
|
|
try { |
|
|
|
try { |
|
|
|
const result = await axios.post('http://localhost:4000/build', config) |
|
|
|
const result = await axios.post(customBuildUrl, config) |
|
|
|
console.log(result) |
|
|
|
console.log(result) |
|
|
|
if (result.data.hash) { |
|
|
|
if (result.data.hash) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const newConfig: ProjectConfiguration = { |
|
|
|
|
|
|
|
name: result.data.hash, |
|
|
|
|
|
|
|
title: 'Custom configuration', |
|
|
|
|
|
|
|
publish: true, |
|
|
|
|
|
|
|
description: `Extension of ${config.baseConfiguration}`, |
|
|
|
|
|
|
|
dependencies: config.dependencies, |
|
|
|
|
|
|
|
replacements: {}, |
|
|
|
|
|
|
|
errorStatus: false, |
|
|
|
|
|
|
|
error: '', |
|
|
|
|
|
|
|
isLoading: false |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
this.configurations.push(newConfig) |
|
|
|
|
|
|
|
this.renderComponent() |
|
|
|
await this.loadScriptRunner(result.data.hash) |
|
|
|
await this.loadScriptRunner(result.data.hash) |
|
|
|
} |
|
|
|
} |
|
|
|
return result.data.hash |
|
|
|
return result.data.hash |
|
|
|