mirror of
https://github.com/estruyf/vscode-front-matter.git
synced 2026-03-28 17:42:40 +01:00
#862 - evaluate the node command
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { Settings } from './SettingsHelper';
|
||||
import { CommandType } from './../models/PanelSettings';
|
||||
import { CustomScript as ICustomScript, ScriptType } from '../models/PanelSettings';
|
||||
import { window, env as vscodeEnv, ProgressLocation, Uri, commands, workspace } from 'vscode';
|
||||
import { window, env as vscodeEnv, ProgressLocation, Uri, commands } from 'vscode';
|
||||
import { ArticleHelper, Logger, MediaHelpers } from '.';
|
||||
import { Folders, WORKSPACE_PLACEHOLDER } from '../commands/Folders';
|
||||
import { exec, execSync } from 'child_process';
|
||||
@@ -13,10 +13,8 @@ import { Dashboard } from '../commands/Dashboard';
|
||||
import { DashboardCommand } from '../dashboardWebView/DashboardCommand';
|
||||
import { ParsedFrontMatter } from '../parsers';
|
||||
import { SETTING_CUSTOM_SCRIPTS } from '../constants';
|
||||
import { existsAsync, getPlatform } from '../utils';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../localization';
|
||||
import { ShellSetting } from '../models';
|
||||
import { evaluateCommand, existsAsync, getPlatform } from '../utils';
|
||||
import { LocalizationKey, localize } from '../localization';
|
||||
|
||||
export class CustomScript {
|
||||
/**
|
||||
@@ -102,7 +100,7 @@ export class CustomScript {
|
||||
);
|
||||
} else {
|
||||
Notifications.warning(
|
||||
l10n.t(LocalizationKey.helpersCustomScriptSingleRunArticleWarning, script.title)
|
||||
localize(LocalizationKey.helpersCustomScriptSingleRunArticleWarning, script.title)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -118,7 +116,7 @@ export class CustomScript {
|
||||
|
||||
if (!folders || folders.length === 0) {
|
||||
Notifications.warning(
|
||||
l10n.t(LocalizationKey.helpersCustomScriptBulkRunNoFilesWarning, script.title)
|
||||
localize(LocalizationKey.helpersCustomScriptBulkRunNoFilesWarning, script.title)
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -128,7 +126,7 @@ export class CustomScript {
|
||||
window.withProgress(
|
||||
{
|
||||
location: ProgressLocation.Notification,
|
||||
title: l10n.t(LocalizationKey.helpersCustomScriptExecuting, script.title),
|
||||
title: localize(LocalizationKey.helpersCustomScriptExecuting, script.title),
|
||||
cancellable: false
|
||||
},
|
||||
async (_, __) => {
|
||||
@@ -174,7 +172,7 @@ export class CustomScript {
|
||||
): Promise<void> {
|
||||
if (!path) {
|
||||
Notifications.error(
|
||||
l10n.t(LocalizationKey.helpersCustomScriptRunMediaScriptNoFolderWarning, script.title)
|
||||
localize(LocalizationKey.helpersCustomScriptRunMediaScriptNoFolderWarning, script.title)
|
||||
);
|
||||
return;
|
||||
}
|
||||
@@ -183,7 +181,7 @@ export class CustomScript {
|
||||
window.withProgress(
|
||||
{
|
||||
location: ProgressLocation.Notification,
|
||||
title: l10n.t(LocalizationKey.helpersCustomScriptExecuting, script.title),
|
||||
title: localize(LocalizationKey.helpersCustomScriptExecuting, script.title),
|
||||
cancellable: false
|
||||
},
|
||||
async () => {
|
||||
@@ -310,7 +308,10 @@ export class CustomScript {
|
||||
throw new Error(`Couldn't update article.`);
|
||||
}
|
||||
Notifications.info(
|
||||
l10n.t(LocalizationKey.helpersCustomScriptShowOutputFrontMatterSuccess, script.title)
|
||||
localize(
|
||||
LocalizationKey.helpersCustomScriptShowOutputFrontMatterSuccess,
|
||||
script.title
|
||||
)
|
||||
);
|
||||
}
|
||||
} else if (data.fmAction) {
|
||||
@@ -346,10 +347,12 @@ export class CustomScript {
|
||||
window
|
||||
.showInformationMessage(
|
||||
`${script.title}: ${output}`,
|
||||
l10n.t(LocalizationKey.helpersCustomScriptShowOutputCopyOutputAction)
|
||||
localize(LocalizationKey.helpersCustomScriptShowOutputCopyOutputAction)
|
||||
)
|
||||
.then((value) => {
|
||||
if (value === l10n.t(LocalizationKey.helpersCustomScriptShowOutputCopyOutputAction)) {
|
||||
if (
|
||||
value === localize(LocalizationKey.helpersCustomScriptShowOutputCopyOutputAction)
|
||||
) {
|
||||
vscodeEnv.clipboard.writeText(output);
|
||||
}
|
||||
});
|
||||
@@ -357,7 +360,7 @@ export class CustomScript {
|
||||
}
|
||||
} else {
|
||||
Notifications.info(
|
||||
l10n.t(LocalizationKey.helpersCustomScriptShowOutputSuccess, script.title)
|
||||
localize(LocalizationKey.helpersCustomScriptShowOutputSuccess, script.title)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -383,7 +386,7 @@ export class CustomScript {
|
||||
}
|
||||
|
||||
if (script.command === CommandType.Node && platform !== 'windows') {
|
||||
command = await CustomScript.evaluateCommand(CommandType.Node);
|
||||
command = await evaluateCommand(CommandType.Node);
|
||||
}
|
||||
|
||||
let scriptPath = join(wsPath, script.script);
|
||||
@@ -399,7 +402,7 @@ export class CustomScript {
|
||||
command = environment.command;
|
||||
|
||||
if (command === CommandType.Node && platform !== 'windows') {
|
||||
command = await CustomScript.evaluateCommand(CommandType.Node);
|
||||
command = await evaluateCommand(CommandType.Node);
|
||||
}
|
||||
|
||||
scriptPath = join(wsPath, environment.script);
|
||||
@@ -420,7 +423,7 @@ export class CustomScript {
|
||||
}
|
||||
|
||||
const fullScript = `${command} "${scriptPath}" ${args}`;
|
||||
Logger.info(l10n.t(LocalizationKey.helpersCustomScriptExecuting, fullScript));
|
||||
Logger.info(localize(LocalizationKey.helpersCustomScriptExecuting, fullScript));
|
||||
|
||||
const output: string = await CustomScript.executeScriptAsync(fullScript, wsPath);
|
||||
|
||||
@@ -503,68 +506,8 @@ export class CustomScript {
|
||||
|
||||
return true;
|
||||
} catch (e) {
|
||||
Logger.error(l10n.t(LocalizationKey.helpersCustomScriptValidateCommandError, command));
|
||||
Logger.error(localize(LocalizationKey.helpersCustomScriptValidateCommandError, command));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluate the command dynamically using `which` command
|
||||
* @param command
|
||||
* @returns
|
||||
*/
|
||||
private static async evaluateCommand(command: string): Promise<string> {
|
||||
const shell = CustomScript.getShellPath();
|
||||
let shellPath: string | undefined = undefined;
|
||||
if (typeof shell !== 'string' && !!shell) {
|
||||
shellPath = shell.path;
|
||||
} else {
|
||||
shellPath = shell || undefined;
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
exec(`which ${command}`, { shell: shellPath }, (error, stdout) => {
|
||||
if (error) {
|
||||
Logger.error(`Error evaluating command: ${command}`);
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(stdout.trim());
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves the shell path configuration based on the current platform and terminal settings.
|
||||
*
|
||||
* This method checks for the following configurations in order:
|
||||
* 1. `integrated.automationProfile.<platform>`: Returns the automation profile if it exists.
|
||||
* 2. `integrated.defaultProfile.<platform>` and `integrated.profiles.<platform>`: Returns the shell setting from the default profile if it exists.
|
||||
* 3. `integrated.shell.<platform>`: Returns the shell setting if the above configurations are not found.
|
||||
*
|
||||
* @returns {string | ShellSetting | undefined} The shell path configuration or undefined if not found.
|
||||
*/
|
||||
private static getShellPath(): string | ShellSetting | undefined {
|
||||
const platform = getPlatform();
|
||||
const terminalSettings = workspace.getConfiguration('terminal');
|
||||
|
||||
const automationProfile = terminalSettings.get<string | ShellSetting>(
|
||||
`integrated.automationProfile.${platform}`
|
||||
);
|
||||
if (!!automationProfile) {
|
||||
return automationProfile;
|
||||
}
|
||||
|
||||
const defaultProfile = terminalSettings.get<string>(`integrated.defaultProfile.${platform}`);
|
||||
const profiles = terminalSettings.get<{ [prop: string]: ShellSetting }>(
|
||||
`integrated.profiles.${platform}`
|
||||
);
|
||||
|
||||
if (defaultProfile && profiles && profiles[defaultProfile]) {
|
||||
return profiles[defaultProfile];
|
||||
}
|
||||
|
||||
return terminalSettings.get(`integrated.shell.${platform}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
} from '../../constants';
|
||||
import { SettingsListener } from './SettingsListener';
|
||||
import { Terminal } from '../../services';
|
||||
import { existsAsync, readFileAsync } from '../../utils';
|
||||
import { evaluateCommand, existsAsync, getPlatform, readFileAsync } from '../../utils';
|
||||
import { join } from 'path';
|
||||
|
||||
export class SsgListener extends BaseListener {
|
||||
@@ -170,7 +170,12 @@ export class SsgListener extends BaseListener {
|
||||
workspace.fs.copy(scriptPath, tempScriptPath, { overwrite: true });
|
||||
}
|
||||
|
||||
const fullScript = `node "${tempScriptPath.fsPath}" "${contentConfigFile.fsPath}"`;
|
||||
let nodeExecPath = 'node';
|
||||
const platform = getPlatform();
|
||||
if (platform !== 'windows') {
|
||||
nodeExecPath = await evaluateCommand('node');
|
||||
}
|
||||
const fullScript = `${nodeExecPath} "${tempScriptPath.fsPath}" "${contentConfigFile.fsPath}"`;
|
||||
|
||||
try {
|
||||
const result: string = await SsgListener.executeScript(fullScript, wsFolder?.fsPath || '');
|
||||
|
||||
@@ -1,12 +1,7 @@
|
||||
import { workspace, window, ThemeIcon, TerminalOptions } from 'vscode';
|
||||
import { Folders } from '../commands';
|
||||
import * as l10n from '@vscode/l10n';
|
||||
import { LocalizationKey } from '../localization';
|
||||
import { getPlatform } from '../utils';
|
||||
|
||||
interface ShellSetting {
|
||||
path: string;
|
||||
}
|
||||
import { LocalizationKey, localize } from '../localization';
|
||||
import { getShellPath } from '../utils';
|
||||
|
||||
export class Terminal {
|
||||
public static readonly terminalName: string = 'Local server';
|
||||
@@ -15,7 +10,7 @@ export class Terminal {
|
||||
* Return the shell path for the current platform
|
||||
*/
|
||||
public static get shell() {
|
||||
const shell: string | { path: string } | undefined = Terminal.getShellPath();
|
||||
const shell: string | { path: string } | undefined = getShellPath();
|
||||
let shellPath: string | undefined = undefined;
|
||||
|
||||
if (typeof shell !== 'string' && !!shell) {
|
||||
@@ -47,7 +42,7 @@ export class Terminal {
|
||||
const terminalOptions: TerminalOptions = {
|
||||
name: Terminal.terminalName,
|
||||
iconPath: new ThemeIcon('server-environment'),
|
||||
message: l10n.t(
|
||||
message: localize(
|
||||
LocalizationKey.servicesTerminalOpenLocalServerTerminalTerminalOptionMessage
|
||||
)
|
||||
};
|
||||
@@ -90,31 +85,4 @@ export class Terminal {
|
||||
return localServerTerminal;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the automation profile for the current platform
|
||||
* @returns
|
||||
*/
|
||||
private static getShellPath(): string | ShellSetting | undefined {
|
||||
const platform = getPlatform();
|
||||
const terminalSettings = workspace.getConfiguration('terminal');
|
||||
|
||||
const automationProfile = terminalSettings.get<string | ShellSetting>(
|
||||
`integrated.automationProfile.${platform}`
|
||||
);
|
||||
if (!!automationProfile) {
|
||||
return automationProfile;
|
||||
}
|
||||
|
||||
const defaultProfile = terminalSettings.get<string>(`integrated.defaultProfile.${platform}`);
|
||||
const profiles = terminalSettings.get<{ [prop: string]: ShellSetting }>(
|
||||
`integrated.profiles.${platform}`
|
||||
);
|
||||
|
||||
if (defaultProfile && profiles && profiles[defaultProfile]) {
|
||||
return profiles[defaultProfile];
|
||||
}
|
||||
|
||||
return terminalSettings.get(`integrated.shell.${platform}`);
|
||||
}
|
||||
}
|
||||
|
||||
30
src/utils/evaluateCommand.ts
Normal file
30
src/utils/evaluateCommand.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { exec } from 'child_process';
|
||||
import { getShellPath } from '../utils';
|
||||
import { Logger } from '../helpers';
|
||||
|
||||
/**
|
||||
* Evaluate the command dynamically using `which` command
|
||||
* @param command
|
||||
* @returns
|
||||
*/
|
||||
export const evaluateCommand = (command: string): Promise<string> => {
|
||||
const shell = getShellPath();
|
||||
let shellPath: string | undefined = undefined;
|
||||
if (typeof shell !== 'string' && !!shell) {
|
||||
shellPath = shell.path;
|
||||
} else {
|
||||
shellPath = shell || undefined;
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
exec(`which ${command}`, { shell: shellPath }, (error, stdout) => {
|
||||
if (error) {
|
||||
Logger.error(`Error evaluating command: ${command}`);
|
||||
reject(error);
|
||||
return;
|
||||
}
|
||||
|
||||
resolve(stdout.trim());
|
||||
});
|
||||
});
|
||||
};
|
||||
36
src/utils/getShellPath.ts
Normal file
36
src/utils/getShellPath.ts
Normal file
@@ -0,0 +1,36 @@
|
||||
import { workspace } from 'vscode';
|
||||
import { ShellSetting } from '../models';
|
||||
import { getPlatform } from './getPlatform';
|
||||
|
||||
/**
|
||||
* Retrieves the shell path configuration based on the current platform and terminal settings.
|
||||
*
|
||||
* This method checks for the following configurations in order:
|
||||
* 1. `integrated.automationProfile.<platform>`: Returns the automation profile if it exists.
|
||||
* 2. `integrated.defaultProfile.<platform>` and `integrated.profiles.<platform>`: Returns the shell setting from the default profile if it exists.
|
||||
* 3. `integrated.shell.<platform>`: Returns the shell setting if the above configurations are not found.
|
||||
*
|
||||
* @returns {string | ShellSetting | undefined} The shell path configuration or undefined if not found.
|
||||
*/
|
||||
export const getShellPath = (): string | ShellSetting | undefined => {
|
||||
const platform = getPlatform();
|
||||
const terminalSettings = workspace.getConfiguration('terminal');
|
||||
|
||||
const automationProfile = terminalSettings.get<string | ShellSetting>(
|
||||
`integrated.automationProfile.${platform}`
|
||||
);
|
||||
if (!!automationProfile) {
|
||||
return automationProfile;
|
||||
}
|
||||
|
||||
const defaultProfile = terminalSettings.get<string>(`integrated.defaultProfile.${platform}`);
|
||||
const profiles = terminalSettings.get<{ [prop: string]: ShellSetting }>(
|
||||
`integrated.profiles.${platform}`
|
||||
);
|
||||
|
||||
if (defaultProfile && profiles && profiles[defaultProfile]) {
|
||||
return profiles[defaultProfile];
|
||||
}
|
||||
|
||||
return terminalSettings.get(`integrated.shell.${platform}`);
|
||||
};
|
||||
@@ -1,6 +1,7 @@
|
||||
export * from './cn';
|
||||
export * from './copyFileAsync';
|
||||
export * from './encodeEmoji';
|
||||
export * from './evaluateCommand';
|
||||
export * from './existsAsync';
|
||||
export * from './fetchWithTimeout';
|
||||
export * from './fieldWhenClause';
|
||||
@@ -9,6 +10,7 @@ export * from './getDescriptionField';
|
||||
export * from './getExtensibilityScripts';
|
||||
export * from './getLocalizationFile';
|
||||
export * from './getPlatform';
|
||||
export * from './getShellPath';
|
||||
export * from './getTitleField';
|
||||
export * from './getWebviewJsFiles';
|
||||
export * from './ignoreMsgCommand';
|
||||
|
||||
Reference in New Issue
Block a user