export async function openMetadataEditor()

in src/commands/common/openMetadataEditor.ts [23:77]


export async function openMetadataEditor(
    viewType: string,
    tabTitle: string,
    context: vscode.ExtensionContext,
    parameters: Record<string, any>,
    annotations: Record<string, any>,
    limits: Limits | undefined,
    update: (parameter: object, annotation: object, limits: Limits | undefined) => Promise<void>
): Promise<void> {
    const panel = vscode.window.createWebviewPanel(viewType, tabTitle, vscode.ViewColumn.One, {
        enableScripts: true,
        retainContextWhenHidden: true,
    });
    const nodeModulesDiskPath = vscode.Uri.file(path.join(context.extensionPath, 'node_modules'));
    const nodeModulePath = panel.webview.asWebviewUri(nodeModulesDiskPath);

    const webviewTemplateDiskPath = vscode.Uri.file(WEBVIEW_TEMPLATE_PATH);
    const webviewTemplatePath = panel.webview.asWebviewUri(webviewTemplateDiskPath);

    // render webview html
    const html = await fs.promises.readFile(
        path.resolve(WEBVIEW_TEMPLATE_PATH, 'metadataEditor.html'),
        'utf-8'
    );

    // set container className
    let className = '';
    if (limits) {
        className += 'has-limits';
    }

    panel.webview.html = html
        .replace(/{{nodeModulePath}}/gi, nodeModulePath.toString())
        .replace(/{{webviewTemplatePath}}/gi, webviewTemplatePath.toString())
        .replace(/{{className}}/gi, className)
        .replace(/{{title}}/gi, tabTitle);

    // add message litener
    panel.webview.onDidReceiveMessage(async (message) => {
        if (message.command === 'initialized') {
            panel.webview.postMessage({
                command: 'setEditor',
                parameters: JSON.stringify(parameters),
                annotations: JSON.stringify(annotations),
                limits: limits,
            });
        } else if (message.command === 'update') {
            await update(
                JSON.parse(message.parameters),
                JSON.parse(message.annotations),
                message.limits
            );
        }
    });
}