@remotion/studio-server 4.0.91
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +13 -0
- package/.turbo/turbo-build.log +4 -0
- package/LICENSE.md +45 -0
- package/README.md +3 -0
- package/dist/ansi-diff.d.ts +41 -0
- package/dist/ansi-diff.js +220 -0
- package/dist/better-opn/index.d.ts +6 -0
- package/dist/better-opn/index.js +202 -0
- package/dist/codemods/update-default-props.d.ts +7 -0
- package/dist/codemods/update-default-props.js +137 -0
- package/dist/file-watcher.d.ts +9 -0
- package/dist/file-watcher.js +35 -0
- package/dist/get-latest-remotion-version.d.ts +1 -0
- package/dist/get-latest-remotion-version.js +31 -0
- package/dist/get-network-address.d.ts +1 -0
- package/dist/get-network-address.js +16 -0
- package/dist/helpers/get-file-source.d.ts +1 -0
- package/dist/helpers/get-file-source.js +22 -0
- package/dist/helpers/open-in-editor.d.ts +16 -0
- package/dist/helpers/open-in-editor.js +503 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.js +27 -0
- package/dist/max-timeline-tracks.d.ts +2 -0
- package/dist/max-timeline-tracks.js +25 -0
- package/dist/open-directory-in-finder.d.ts +1 -0
- package/dist/open-directory-in-finder.js +49 -0
- package/dist/preview-server/api-routes.d.ts +5 -0
- package/dist/preview-server/api-routes.js +25 -0
- package/dist/preview-server/api-types.d.ts +23 -0
- package/dist/preview-server/api-types.js +2 -0
- package/dist/preview-server/dev-middleware/compatible-api.d.ts +7 -0
- package/dist/preview-server/dev-middleware/compatible-api.js +20 -0
- package/dist/preview-server/dev-middleware/get-paths.d.ts +7 -0
- package/dist/preview-server/dev-middleware/get-paths.js +19 -0
- package/dist/preview-server/dev-middleware/index.d.ts +3 -0
- package/dist/preview-server/dev-middleware/index.js +27 -0
- package/dist/preview-server/dev-middleware/middleware.d.ts +9 -0
- package/dist/preview-server/dev-middleware/middleware.js +222 -0
- package/dist/preview-server/dev-middleware/range-parser.d.ts +15 -0
- package/dist/preview-server/dev-middleware/range-parser.js +96 -0
- package/dist/preview-server/dev-middleware/ready.d.ts +3 -0
- package/dist/preview-server/dev-middleware/ready.js +11 -0
- package/dist/preview-server/dev-middleware/setup-hooks.d.ts +2 -0
- package/dist/preview-server/dev-middleware/setup-hooks.js +52 -0
- package/dist/preview-server/dev-middleware/setup-output-filesystem.d.ts +2 -0
- package/dist/preview-server/dev-middleware/setup-output-filesystem.js +13 -0
- package/dist/preview-server/dev-middleware/types.d.ts +10 -0
- package/dist/preview-server/dev-middleware/types.js +2 -0
- package/dist/preview-server/env-supports-fs-recursive.d.ts +1 -0
- package/dist/preview-server/env-supports-fs-recursive.js +18 -0
- package/dist/preview-server/file-existence-watchers.d.ts +13 -0
- package/dist/preview-server/file-existence-watchers.js +62 -0
- package/dist/preview-server/get-absolute-public-dir.d.ts +4 -0
- package/dist/preview-server/get-absolute-public-dir.js +14 -0
- package/dist/preview-server/get-package-manager.d.ts +10 -0
- package/dist/preview-server/get-package-manager.js +62 -0
- package/dist/preview-server/handler.d.ts +12 -0
- package/dist/preview-server/handler.js +36 -0
- package/dist/preview-server/hot-middleware/index.d.ts +102 -0
- package/dist/preview-server/hot-middleware/index.js +149 -0
- package/dist/preview-server/hot-middleware/types.d.ts +2 -0
- package/dist/preview-server/hot-middleware/types.js +2 -0
- package/dist/preview-server/live-events.d.ts +10 -0
- package/dist/preview-server/live-events.js +76 -0
- package/dist/preview-server/parse-body.d.ts +2 -0
- package/dist/preview-server/parse-body.js +16 -0
- package/dist/preview-server/project-info.d.ts +2 -0
- package/dist/preview-server/project-info.js +32 -0
- package/dist/preview-server/public-folder.d.ts +12 -0
- package/dist/preview-server/public-folder.js +58 -0
- package/dist/preview-server/routes/add-render.d.ts +3 -0
- package/dist/preview-server/routes/add-render.js +122 -0
- package/dist/preview-server/routes/can-update-default-props.d.ts +4 -0
- package/dist/preview-server/routes/can-update-default-props.js +40 -0
- package/dist/preview-server/routes/cancel-render.d.ts +3 -0
- package/dist/preview-server/routes/cancel-render.js +8 -0
- package/dist/preview-server/routes/copy-still-to-clipboard-handler.d.ts +3 -0
- package/dist/preview-server/routes/copy-still-to-clipboard-handler.js +17 -0
- package/dist/preview-server/routes/open-in-file-explorer.d.ts +3 -0
- package/dist/preview-server/routes/open-in-file-explorer.js +8 -0
- package/dist/preview-server/routes/remove-render.d.ts +3 -0
- package/dist/preview-server/routes/remove-render.js +8 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/subscribe-to-file-existence.js +13 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.d.ts +3 -0
- package/dist/preview-server/routes/unsubscribe-from-file-existence.js +13 -0
- package/dist/preview-server/routes/update-available.d.ts +3 -0
- package/dist/preview-server/routes/update-available.js +9 -0
- package/dist/preview-server/routes/update-default-props.d.ts +3 -0
- package/dist/preview-server/routes/update-default-props.js +34 -0
- package/dist/preview-server/serve-static.d.ts +14 -0
- package/dist/preview-server/serve-static.js +75 -0
- package/dist/preview-server/start-server.d.ts +31 -0
- package/dist/preview-server/start-server.js +123 -0
- package/dist/preview-server/update-available.d.ts +3 -0
- package/dist/preview-server/update-available.js +47 -0
- package/dist/routes.d.ts +24 -0
- package/dist/routes.js +242 -0
- package/dist/server-ready.d.ts +2 -0
- package/dist/server-ready.js +13 -0
- package/dist/start-studio.d.ts +26 -0
- package/dist/start-studio.js +117 -0
- package/dist/watch-root-file.d.ts +1 -0
- package/dist/watch-root-file.js +22 -0
- package/package.json +54 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/web/beep.wav +0 -0
- package/web/favicon.png +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.installFileWatcher = void 0;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const installFileWatcher = ({ file, onChange, }) => {
|
|
9
|
+
const existedAtBeginning = node_fs_1.default.existsSync(file);
|
|
10
|
+
let existedBefore = existedAtBeginning;
|
|
11
|
+
const listener = () => {
|
|
12
|
+
const existsNow = node_fs_1.default.existsSync(file);
|
|
13
|
+
if (!existedBefore && existsNow) {
|
|
14
|
+
onChange('created');
|
|
15
|
+
existedBefore = true;
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (existedBefore && !existsNow) {
|
|
19
|
+
onChange('deleted');
|
|
20
|
+
existedBefore = false;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (existsNow) {
|
|
24
|
+
onChange('changed');
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
node_fs_1.default.watchFile(file, { interval: 100 }, listener);
|
|
28
|
+
return {
|
|
29
|
+
exists: existedAtBeginning,
|
|
30
|
+
unwatch: () => {
|
|
31
|
+
node_fs_1.default.unwatchFile(file, listener);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
exports.installFileWatcher = installFileWatcher;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getLatestRemotionVersion: () => Promise<any>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getLatestRemotionVersion = void 0;
|
|
7
|
+
const https_1 = __importDefault(require("https"));
|
|
8
|
+
const getPackageJsonForRemotion = () => {
|
|
9
|
+
return new Promise((resolve, reject) => {
|
|
10
|
+
const req = https_1.default.get('https://registry.npmjs.org/remotion', {
|
|
11
|
+
headers: {
|
|
12
|
+
accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*',
|
|
13
|
+
},
|
|
14
|
+
}, (res) => {
|
|
15
|
+
let data = '';
|
|
16
|
+
res.on('data', (d) => {
|
|
17
|
+
data += d;
|
|
18
|
+
});
|
|
19
|
+
res.on('end', () => resolve(data));
|
|
20
|
+
});
|
|
21
|
+
req.on('error', (error) => {
|
|
22
|
+
reject(error);
|
|
23
|
+
});
|
|
24
|
+
req.end();
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
const getLatestRemotionVersion = async () => {
|
|
28
|
+
const pkgJson = await getPackageJsonForRemotion();
|
|
29
|
+
return JSON.parse(pkgJson)['dist-tags'].latest;
|
|
30
|
+
};
|
|
31
|
+
exports.getLatestRemotionVersion = getLatestRemotionVersion;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getNetworkAddress: () => string | undefined;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getNetworkAddress = void 0;
|
|
4
|
+
const node_os_1 = require("node:os");
|
|
5
|
+
const getNetworkAddress = () => {
|
|
6
|
+
for (const interfaceDetails of Object.values((0, node_os_1.networkInterfaces)())) {
|
|
7
|
+
if (!interfaceDetails)
|
|
8
|
+
continue;
|
|
9
|
+
for (const details of interfaceDetails) {
|
|
10
|
+
const { address, family, internal } = details;
|
|
11
|
+
if (family === 'IPv4' && !internal)
|
|
12
|
+
return address;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
exports.getNetworkAddress = getNetworkAddress;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getFileSource: (remotionRoot: string, p: string) => Promise<string>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getFileSource = void 0;
|
|
7
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
8
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
9
|
+
const allowedFileExtensions = ['js', 'ts', 'tsx', 'jsx', 'map', 'mjs'];
|
|
10
|
+
// Must be async function for proper error handling
|
|
11
|
+
const getFileSource = (remotionRoot, p) => {
|
|
12
|
+
if (!allowedFileExtensions.find((extension) => p.endsWith(extension))) {
|
|
13
|
+
return Promise.reject(new Error(`Not allowed to open ${p}`));
|
|
14
|
+
}
|
|
15
|
+
const resolved = node_path_1.default.resolve(remotionRoot, p);
|
|
16
|
+
const relativeToProcessCwd = node_path_1.default.relative(remotionRoot, resolved);
|
|
17
|
+
if (relativeToProcessCwd.startsWith('..')) {
|
|
18
|
+
return Promise.reject(new Error(`Not allowed to open ${relativeToProcessCwd}`));
|
|
19
|
+
}
|
|
20
|
+
return node_fs_1.default.promises.readFile(p, 'utf-8');
|
|
21
|
+
};
|
|
22
|
+
exports.getFileSource = getFileSource;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
declare const editorNames: readonly ["atom", "/Applications/Atom Beta.app/Contents/MacOS/Atom Beta", "brackets", "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl", "/Applications/Sublime Text Dev.app/Contents/SharedSupport/bin/subl", "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl", "code", "code-insiders", "vscodium", "/Applications/AppCode.app/Contents/MacOS/appcode", "/Applications/CLion.app/Contents/MacOS/clion", "/Applications/IntelliJ IDEA.app/Contents/MacOS/idea", "/Applications/PhpStorm.app/Contents/MacOS/phpstorm", "/Applications/PyCharm.app/Contents/MacOS/pycharm", "/Applications/PyCharm CE.app/Contents/MacOS/pycharm", "/Applications/RubyMine.app/Contents/MacOS/rubymine", "/Applications/WebStorm.app/Contents/MacOS/webstorm", "/Applications/GoLand.app/Contents/MacOS/goland", "/Applications/Rider.app/Contents/MacOS/rider", "mvim", "emacs", "gvim", "idea", "phpstorm", "pycharm", "rubymine", "subl", "sublime_text", "vim", "webstorm", "goland", "rider", "Brackets.exe", "Code.exe", "Code - Insiders.exe", "VSCodium.exe", "atom.exe", "sublime_text.exe", "notepad++.exe", "clion.exe", "clion64.exe", "idea.exe", "idea64.exe", "phpstorm.exe", "phpstorm64.exe", "pycharm.exe", "pycharm64.exe", "rubymine.exe", "rubymine64.exe", "webstorm.exe", "webstorm64.exe", "goland.exe", "goland64.exe", "rider.exe", "rider64.exe", "nano"];
|
|
2
|
+
export declare const getDisplayNameForEditor: (editor: Editor | null) => string | null;
|
|
3
|
+
type Editor = (typeof editorNames)[number];
|
|
4
|
+
type ProcessAndCommand = {
|
|
5
|
+
process: string;
|
|
6
|
+
command: Editor;
|
|
7
|
+
};
|
|
8
|
+
export declare function guessEditor(): Promise<ProcessAndCommand[]>;
|
|
9
|
+
export declare function launchEditor({ colNumber, editor, fileName, lineNumber, vsCodeNewWindow, }: {
|
|
10
|
+
fileName: string;
|
|
11
|
+
lineNumber: number;
|
|
12
|
+
colNumber: number;
|
|
13
|
+
editor: ProcessAndCommand;
|
|
14
|
+
vsCodeNewWindow: boolean;
|
|
15
|
+
}): Promise<boolean>;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Duplicated in create-video/src/open-in-editor.ts
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
20
|
+
if (mod && mod.__esModule) return mod;
|
|
21
|
+
var result = {};
|
|
22
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
23
|
+
__setModuleDefault(result, mod);
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
27
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.launchEditor = exports.guessEditor = exports.getDisplayNameForEditor = void 0;
|
|
31
|
+
/*
|
|
32
|
+
Source code adapted from https://github.com/facebook/create-react-app/tree/main/packages/react-error-overlay and refactored in Typescript. This file is MIT-licensed.
|
|
33
|
+
*/
|
|
34
|
+
/**
|
|
35
|
+
* Copyright (c) 2015-present, Facebook, Inc.
|
|
36
|
+
*
|
|
37
|
+
* This source code is licensed under the MIT license found in the
|
|
38
|
+
* LICENSE file in the root directory of this source tree.
|
|
39
|
+
*/
|
|
40
|
+
const renderer_1 = require("@remotion/renderer");
|
|
41
|
+
const node_child_process_1 = __importStar(require("node:child_process"));
|
|
42
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
43
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
44
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
45
|
+
const node_util_1 = __importDefault(require("node:util"));
|
|
46
|
+
const { Log } = renderer_1.RenderInternals;
|
|
47
|
+
const execProm = node_util_1.default.promisify(node_child_process_1.exec);
|
|
48
|
+
const isVsCodeDerivative = (editor) => {
|
|
49
|
+
return (editor === 'code' ||
|
|
50
|
+
editor === 'code-insiders' ||
|
|
51
|
+
editor === 'Code.exe' ||
|
|
52
|
+
editor === 'vscodium' ||
|
|
53
|
+
editor === 'VSCodium.exe' ||
|
|
54
|
+
editor === 'Code - Insiders.exe');
|
|
55
|
+
};
|
|
56
|
+
function isTerminalEditor(editor) {
|
|
57
|
+
switch (editor) {
|
|
58
|
+
case 'vim':
|
|
59
|
+
case 'emacs':
|
|
60
|
+
case 'nano':
|
|
61
|
+
return true;
|
|
62
|
+
default:
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const editorNames = [
|
|
67
|
+
'atom',
|
|
68
|
+
'/Applications/Atom Beta.app/Contents/MacOS/Atom Beta',
|
|
69
|
+
'brackets',
|
|
70
|
+
'/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl',
|
|
71
|
+
'/Applications/Sublime Text Dev.app/Contents/SharedSupport/bin/subl',
|
|
72
|
+
'/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl',
|
|
73
|
+
'code',
|
|
74
|
+
'code-insiders',
|
|
75
|
+
'vscodium',
|
|
76
|
+
'/Applications/AppCode.app/Contents/MacOS/appcode',
|
|
77
|
+
'/Applications/CLion.app/Contents/MacOS/clion',
|
|
78
|
+
'/Applications/IntelliJ IDEA.app/Contents/MacOS/idea',
|
|
79
|
+
'/Applications/PhpStorm.app/Contents/MacOS/phpstorm',
|
|
80
|
+
'/Applications/PyCharm.app/Contents/MacOS/pycharm',
|
|
81
|
+
'/Applications/PyCharm CE.app/Contents/MacOS/pycharm',
|
|
82
|
+
'/Applications/RubyMine.app/Contents/MacOS/rubymine',
|
|
83
|
+
'/Applications/WebStorm.app/Contents/MacOS/webstorm',
|
|
84
|
+
'/Applications/GoLand.app/Contents/MacOS/goland',
|
|
85
|
+
'/Applications/Rider.app/Contents/MacOS/rider',
|
|
86
|
+
'mvim',
|
|
87
|
+
'emacs',
|
|
88
|
+
'gvim',
|
|
89
|
+
'idea',
|
|
90
|
+
'phpstorm',
|
|
91
|
+
'pycharm',
|
|
92
|
+
'rubymine',
|
|
93
|
+
'subl',
|
|
94
|
+
'sublime_text',
|
|
95
|
+
'vim',
|
|
96
|
+
'webstorm',
|
|
97
|
+
'goland',
|
|
98
|
+
'rider',
|
|
99
|
+
'Brackets.exe',
|
|
100
|
+
'Code.exe',
|
|
101
|
+
'Code - Insiders.exe',
|
|
102
|
+
'VSCodium.exe',
|
|
103
|
+
'atom.exe',
|
|
104
|
+
'sublime_text.exe',
|
|
105
|
+
'notepad++.exe',
|
|
106
|
+
'clion.exe',
|
|
107
|
+
'clion64.exe',
|
|
108
|
+
'idea.exe',
|
|
109
|
+
'idea64.exe',
|
|
110
|
+
'phpstorm.exe',
|
|
111
|
+
'phpstorm64.exe',
|
|
112
|
+
'pycharm.exe',
|
|
113
|
+
'pycharm64.exe',
|
|
114
|
+
'rubymine.exe',
|
|
115
|
+
'rubymine64.exe',
|
|
116
|
+
'webstorm.exe',
|
|
117
|
+
'webstorm64.exe',
|
|
118
|
+
'goland.exe',
|
|
119
|
+
'goland64.exe',
|
|
120
|
+
'rider.exe',
|
|
121
|
+
'rider64.exe',
|
|
122
|
+
'nano',
|
|
123
|
+
];
|
|
124
|
+
const displayNameForEditor = {
|
|
125
|
+
'/Applications/AppCode.app/Contents/MacOS/appcode': 'AppCode',
|
|
126
|
+
'/Applications/Atom Beta.app/Contents/MacOS/Atom Beta': 'Atom Beta',
|
|
127
|
+
'/Applications/CLion.app/Contents/MacOS/clion': 'CLion',
|
|
128
|
+
'/Applications/GoLand.app/Contents/MacOS/goland': 'GoLand',
|
|
129
|
+
'/Applications/IntelliJ IDEA.app/Contents/MacOS/idea': 'IDEA',
|
|
130
|
+
'/Applications/PhpStorm.app/Contents/MacOS/phpstorm': 'PHPStorm',
|
|
131
|
+
'/Applications/PyCharm CE.app/Contents/MacOS/pycharm': 'PyCharm',
|
|
132
|
+
'/Applications/PyCharm.app/Contents/MacOS/pycharm': 'PyCharm',
|
|
133
|
+
'/Applications/Rider.app/Contents/MacOS/rider': 'Rider',
|
|
134
|
+
'/Applications/RubyMine.app/Contents/MacOS/rubymine': 'RubyMine',
|
|
135
|
+
'/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl': 'Sublime Text 2',
|
|
136
|
+
'/Applications/Sublime Text Dev.app/Contents/SharedSupport/bin/subl': 'Sublime Text Dev',
|
|
137
|
+
'/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl': 'Sublime Text',
|
|
138
|
+
'/Applications/WebStorm.app/Contents/MacOS/webstorm': 'WebStorm',
|
|
139
|
+
'Brackets.exe': 'Brackets',
|
|
140
|
+
'Code - Insiders.exe': 'VS Code Insiders',
|
|
141
|
+
'Code.exe': 'VS Code',
|
|
142
|
+
'VSCodium.exe': 'VS Codium',
|
|
143
|
+
'atom.exe': 'Atom',
|
|
144
|
+
'clion.exe': 'CLion',
|
|
145
|
+
'clion64.exe': 'CLion',
|
|
146
|
+
'code-insiders': 'VS Code Insiders',
|
|
147
|
+
'goland.exe': 'GoLand',
|
|
148
|
+
'goland64.exe': 'GoLand',
|
|
149
|
+
'idea.exe': 'IDEA',
|
|
150
|
+
'idea64.exe': 'IDEA',
|
|
151
|
+
'notepad++.exe': 'Notepad++',
|
|
152
|
+
'phpstorm.exe': 'PHPStorm',
|
|
153
|
+
'phpstorm64.exe': 'PHPStorm',
|
|
154
|
+
'pycharm.exe': 'PyCharm',
|
|
155
|
+
'pycharm64.exe': 'PyCharm',
|
|
156
|
+
'rider.exe': 'Rider',
|
|
157
|
+
'rider64.exe': 'Rider',
|
|
158
|
+
'rubymine.exe': 'RubyMine',
|
|
159
|
+
'rubymine64.exe': 'RubyMine',
|
|
160
|
+
'sublime_text.exe': 'Sublime Text',
|
|
161
|
+
'webstorm.exe': 'WebStorm',
|
|
162
|
+
'webstorm64.exe': 'WebStorm',
|
|
163
|
+
atom: 'Atom',
|
|
164
|
+
brackets: 'Brackets',
|
|
165
|
+
code: 'VS Code',
|
|
166
|
+
emacs: 'emacs',
|
|
167
|
+
goland: 'GoLand',
|
|
168
|
+
gvim: 'GVim',
|
|
169
|
+
idea: 'IDEA',
|
|
170
|
+
mvim: 'mvim',
|
|
171
|
+
phpstorm: 'PHPStorm',
|
|
172
|
+
pycharm: 'PyCharm',
|
|
173
|
+
rider: 'Rider',
|
|
174
|
+
rubymine: 'RubyMine',
|
|
175
|
+
subl: 'Sublime Text',
|
|
176
|
+
sublime_text: 'Sublime Text',
|
|
177
|
+
vim: 'vim',
|
|
178
|
+
vscodium: 'VS Codium',
|
|
179
|
+
webstorm: 'WebStorm',
|
|
180
|
+
nano: 'nano',
|
|
181
|
+
};
|
|
182
|
+
const getDisplayNameForEditor = (editor) => {
|
|
183
|
+
var _a, _b;
|
|
184
|
+
if (!editor) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const endsIn = Object.keys(displayNameForEditor).find((displayNameKey) => {
|
|
188
|
+
return editor.endsWith(displayNameKey);
|
|
189
|
+
});
|
|
190
|
+
return ((_b = (_a = displayNameForEditor[editor]) !== null && _a !== void 0 ? _a : displayNameForEditor[endsIn]) !== null && _b !== void 0 ? _b : editor);
|
|
191
|
+
};
|
|
192
|
+
exports.getDisplayNameForEditor = getDisplayNameForEditor;
|
|
193
|
+
// Map from full process name to binary that starts the process
|
|
194
|
+
// We can't just re-use full process name, because it will spawn a new instance
|
|
195
|
+
// of the app every time
|
|
196
|
+
const COMMON_EDITORS_OSX = {
|
|
197
|
+
'/Applications/Atom.app/Contents/MacOS/Atom': 'atom',
|
|
198
|
+
'/Applications/Atom Beta.app/Contents/MacOS/Atom Beta': '/Applications/Atom Beta.app/Contents/MacOS/Atom Beta',
|
|
199
|
+
'/Applications/Brackets.app/Contents/MacOS/Brackets': 'brackets',
|
|
200
|
+
'/Applications/Sublime Text.app/Contents/MacOS/Sublime Text': '/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl',
|
|
201
|
+
'/Applications/Sublime Text Dev.app/Contents/MacOS/Sublime Text': '/Applications/Sublime Text Dev.app/Contents/SharedSupport/bin/subl',
|
|
202
|
+
'/Applications/Sublime Text 2.app/Contents/MacOS/Sublime Text 2': '/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl',
|
|
203
|
+
'/Applications/Visual Studio Code.app/Contents/MacOS/Electron': 'code',
|
|
204
|
+
'/Applications/Visual Studio Code - Insiders.app/Contents/MacOS/Electron': 'code-insiders',
|
|
205
|
+
'/Applications/VSCodium.app/Contents/MacOS/Electron': 'vscodium',
|
|
206
|
+
'/Applications/AppCode.app/Contents/MacOS/appcode': '/Applications/AppCode.app/Contents/MacOS/appcode',
|
|
207
|
+
'/Applications/CLion.app/Contents/MacOS/clion': '/Applications/CLion.app/Contents/MacOS/clion',
|
|
208
|
+
'/Applications/IntelliJ IDEA.app/Contents/MacOS/idea': '/Applications/IntelliJ IDEA.app/Contents/MacOS/idea',
|
|
209
|
+
'/Applications/PhpStorm.app/Contents/MacOS/phpstorm': '/Applications/PhpStorm.app/Contents/MacOS/phpstorm',
|
|
210
|
+
'/Applications/PyCharm.app/Contents/MacOS/pycharm': '/Applications/PyCharm.app/Contents/MacOS/pycharm',
|
|
211
|
+
'/Applications/PyCharm CE.app/Contents/MacOS/pycharm': '/Applications/PyCharm CE.app/Contents/MacOS/pycharm',
|
|
212
|
+
'/Applications/RubyMine.app/Contents/MacOS/rubymine': '/Applications/RubyMine.app/Contents/MacOS/rubymine',
|
|
213
|
+
'/Applications/WebStorm.app/Contents/MacOS/webstorm': '/Applications/WebStorm.app/Contents/MacOS/webstorm',
|
|
214
|
+
'/Applications/MacVim.app/Contents/MacOS/MacVim': 'mvim',
|
|
215
|
+
'/Applications/GoLand.app/Contents/MacOS/goland': '/Applications/GoLand.app/Contents/MacOS/goland',
|
|
216
|
+
'/Applications/Rider.app/Contents/MacOS/rider': '/Applications/Rider.app/Contents/MacOS/rider',
|
|
217
|
+
};
|
|
218
|
+
const COMMON_EDITORS_LINUX = {
|
|
219
|
+
atom: 'atom',
|
|
220
|
+
Brackets: 'brackets',
|
|
221
|
+
code: 'code',
|
|
222
|
+
'code-insiders': 'code-insiders',
|
|
223
|
+
vscodium: 'vscodium',
|
|
224
|
+
emacs: 'emacs',
|
|
225
|
+
gvim: 'gvim',
|
|
226
|
+
'idea.sh': 'idea',
|
|
227
|
+
'phpstorm.sh': 'phpstorm',
|
|
228
|
+
'pycharm.sh': 'pycharm',
|
|
229
|
+
'rubymine.sh': 'rubymine',
|
|
230
|
+
sublime_text: 'subl',
|
|
231
|
+
vim: 'vim',
|
|
232
|
+
'webstorm.sh': 'webstorm',
|
|
233
|
+
'goland.sh': 'goland',
|
|
234
|
+
'rider.sh': 'rider',
|
|
235
|
+
};
|
|
236
|
+
const COMMON_EDITORS_WIN = [
|
|
237
|
+
'Brackets.exe',
|
|
238
|
+
'Code.exe',
|
|
239
|
+
'Code - Insiders.exe',
|
|
240
|
+
'VSCodium.exe',
|
|
241
|
+
'atom.exe',
|
|
242
|
+
'sublime_text.exe',
|
|
243
|
+
'notepad++.exe',
|
|
244
|
+
'clion.exe',
|
|
245
|
+
'clion64.exe',
|
|
246
|
+
'idea.exe',
|
|
247
|
+
'idea64.exe',
|
|
248
|
+
'phpstorm.exe',
|
|
249
|
+
'phpstorm64.exe',
|
|
250
|
+
'pycharm.exe',
|
|
251
|
+
'pycharm64.exe',
|
|
252
|
+
'rubymine.exe',
|
|
253
|
+
'rubymine64.exe',
|
|
254
|
+
'webstorm.exe',
|
|
255
|
+
'webstorm64.exe',
|
|
256
|
+
'goland.exe',
|
|
257
|
+
'goland64.exe',
|
|
258
|
+
'rider.exe',
|
|
259
|
+
'rider64.exe',
|
|
260
|
+
];
|
|
261
|
+
// Transpiled version of: /^([A-Za-z]:[/\\])?[\p{L}0-9/.\-_\\]+$/u
|
|
262
|
+
// Non-transpiled version requires support for Unicode property regex. Allows
|
|
263
|
+
// alphanumeric characters, periods, dashes, slashes, and underscores.
|
|
264
|
+
const WINDOWS_FILE_NAME_WHITELIST = /^([A-Za-z]:[/\\])?(?:[\x2D-9A-Z\\_a-z\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0560-\u0588\u05D0-\u05EA\u05EF-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u0860-\u086A\u08A0-\u08B4\u08B6-\u08BD\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u09FC\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C80\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D54-\u0D56\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1878\u1880-\u1884\u1887-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1C80-\u1C88\u1C90-\u1CBA\u1CBD-\u1CBF\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312F\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FEF\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7B9\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA8FE\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF2D-\uDF40\uDF42-\uDF49\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF]|\uD801[\uDC00-\uDC9D\uDCB0-\uDCD3\uDCD8-\uDCFB\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE35\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2\uDD00-\uDD23\uDF00-\uDF1C\uDF27\uDF30-\uDF45]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD44\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC00-\uDC34\uDC47-\uDC4A\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF1A]|\uD806[\uDC00-\uDC2B\uDCA0-\uDCDF\uDCFF\uDE00\uDE0B-\uDE32\uDE3A\uDE50\uDE5C-\uDE83\uDE86-\uDE89\uDE9D\uDEC0-\uDEF8]|\uD807[\uDC00-\uDC08\uDC0A-\uDC2E\uDC40\uDC72-\uDC8F\uDD00-\uDD06\uDD08\uDD09\uDD0B-\uDD30\uDD46\uDD60-\uDD65\uDD67\uDD68\uDD6A-\uDD89\uDD98\uDEE0-\uDEF2]|\uD808[\uDC00-\uDF99]|\uD809[\uDC80-\uDD43]|[\uD80C\uD81C-\uD820\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDE40-\uDE7F\uDF00-\uDF44\uDF50\uDF93-\uDF9F\uDFE0\uDFE1]|\uD821[\uDC00-\uDFF1]|\uD822[\uDC00-\uDEF2]|\uD82C[\uDC00-\uDD1E\uDD70-\uDEFB]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4\uDD00-\uDD43]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0]|\uD87E[\uDC00-\uDE1D])+$/;
|
|
265
|
+
function getArgumentsForLineNumber(editor, fileName, lineNumber, colNumber) {
|
|
266
|
+
const editorBasename = node_path_1.default.basename(editor).replace(/\.(exe|cmd|bat)$/i, '');
|
|
267
|
+
const isFolder = node_fs_1.default.existsSync(fileName) && node_fs_1.default.lstatSync(fileName).isDirectory();
|
|
268
|
+
switch (editorBasename) {
|
|
269
|
+
case 'atom':
|
|
270
|
+
case 'Atom':
|
|
271
|
+
case 'Atom Beta':
|
|
272
|
+
case 'subl':
|
|
273
|
+
case 'sublime':
|
|
274
|
+
case 'sublime_text':
|
|
275
|
+
return isFolder
|
|
276
|
+
? [fileName]
|
|
277
|
+
: [fileName + ':' + lineNumber + ':' + colNumber];
|
|
278
|
+
case 'wstorm':
|
|
279
|
+
case 'charm':
|
|
280
|
+
return [fileName + ':' + lineNumber];
|
|
281
|
+
case 'notepad++':
|
|
282
|
+
return ['-n' + lineNumber, '-c' + colNumber, fileName];
|
|
283
|
+
case 'vim':
|
|
284
|
+
case 'mvim':
|
|
285
|
+
case 'joe':
|
|
286
|
+
case 'gvim':
|
|
287
|
+
return ['+' + lineNumber, fileName];
|
|
288
|
+
case 'emacs':
|
|
289
|
+
case 'emacsclient':
|
|
290
|
+
return ['+' + lineNumber + ':' + colNumber, fileName];
|
|
291
|
+
case 'rmate':
|
|
292
|
+
case 'mate':
|
|
293
|
+
case 'mine':
|
|
294
|
+
return ['--line', lineNumber, fileName];
|
|
295
|
+
case 'code':
|
|
296
|
+
case 'Code':
|
|
297
|
+
case 'code-insiders':
|
|
298
|
+
case 'Code - Insiders':
|
|
299
|
+
case 'vscodium':
|
|
300
|
+
case 'VSCodium':
|
|
301
|
+
return ['-g', fileName + ':' + lineNumber + ':' + colNumber];
|
|
302
|
+
case 'appcode':
|
|
303
|
+
case 'clion':
|
|
304
|
+
case 'clion64':
|
|
305
|
+
case 'idea':
|
|
306
|
+
case 'idea64':
|
|
307
|
+
case 'phpstorm':
|
|
308
|
+
case 'phpstorm64':
|
|
309
|
+
case 'pycharm':
|
|
310
|
+
case 'pycharm64':
|
|
311
|
+
case 'rubymine':
|
|
312
|
+
case 'rubymine64':
|
|
313
|
+
case 'webstorm':
|
|
314
|
+
case 'webstorm64':
|
|
315
|
+
case 'goland':
|
|
316
|
+
case 'goland64':
|
|
317
|
+
case 'rider':
|
|
318
|
+
case 'rider64':
|
|
319
|
+
return ['--line', lineNumber, fileName];
|
|
320
|
+
default:
|
|
321
|
+
// For all others, drop the lineNumber until we have
|
|
322
|
+
// a mapping above, since providing the lineNumber incorrectly
|
|
323
|
+
// can result in errors or confusing behavior.
|
|
324
|
+
return [fileName];
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
async function guessEditor() {
|
|
328
|
+
// We can find out which editor is currently running by:
|
|
329
|
+
// `ps x` on macOS and Linux
|
|
330
|
+
// `Get-Process` on Windows
|
|
331
|
+
const availableEditors = [];
|
|
332
|
+
try {
|
|
333
|
+
if (process.platform === 'darwin') {
|
|
334
|
+
const output = (await execProm('ps x')).stdout.toString();
|
|
335
|
+
const processNames = Object.keys(COMMON_EDITORS_OSX);
|
|
336
|
+
for (let i = 0; i < processNames.length; i++) {
|
|
337
|
+
const processName = processNames[i];
|
|
338
|
+
if (output.indexOf(processName) !== -1) {
|
|
339
|
+
availableEditors.push({
|
|
340
|
+
process: processName,
|
|
341
|
+
command: COMMON_EDITORS_OSX[processName],
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return availableEditors;
|
|
346
|
+
}
|
|
347
|
+
if (process.platform === 'win32') {
|
|
348
|
+
// Some processes need elevated rights to get its executable path.
|
|
349
|
+
// Just filter them out upfront. This also saves 10-20ms on the command.
|
|
350
|
+
const output = (await execProm('wmic process where "executablepath is not null" get executablepath')).stdout.toString();
|
|
351
|
+
const runningProcesses = output.split('\r\n');
|
|
352
|
+
for (let i = 0; i < runningProcesses.length; i++) {
|
|
353
|
+
const processPath = runningProcesses[i].trim();
|
|
354
|
+
const processName = node_path_1.default.basename(processPath);
|
|
355
|
+
if (COMMON_EDITORS_WIN.indexOf(processName) !== -1) {
|
|
356
|
+
availableEditors.push({
|
|
357
|
+
process: processPath,
|
|
358
|
+
command: processPath,
|
|
359
|
+
});
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
return availableEditors;
|
|
363
|
+
}
|
|
364
|
+
if (process.platform === 'linux') {
|
|
365
|
+
// --no-heading No header line
|
|
366
|
+
// x List all processes owned by you
|
|
367
|
+
// -o comm Need only names column
|
|
368
|
+
const output = (await execProm('ps x --no-heading -o comm --sort=comm')).stdout.toString();
|
|
369
|
+
const processNames = Object.keys(COMMON_EDITORS_LINUX);
|
|
370
|
+
for (let i = 0; i < processNames.length; i++) {
|
|
371
|
+
const processName = processNames[i];
|
|
372
|
+
if (output.indexOf(processName) !== -1) {
|
|
373
|
+
availableEditors.push({
|
|
374
|
+
process: processName,
|
|
375
|
+
command: COMMON_EDITORS_LINUX[processName],
|
|
376
|
+
});
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return availableEditors;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
// Ignore...
|
|
384
|
+
}
|
|
385
|
+
// Last resort, use old skool env vars
|
|
386
|
+
if (process.env.VISUAL) {
|
|
387
|
+
return [
|
|
388
|
+
{
|
|
389
|
+
process: process.env.VISUAL,
|
|
390
|
+
command: process.env.VISUAL,
|
|
391
|
+
},
|
|
392
|
+
];
|
|
393
|
+
}
|
|
394
|
+
if (process.env.EDITOR) {
|
|
395
|
+
return [
|
|
396
|
+
{
|
|
397
|
+
process: process.env.EDITOR,
|
|
398
|
+
command: process.env.EDITOR,
|
|
399
|
+
},
|
|
400
|
+
];
|
|
401
|
+
}
|
|
402
|
+
return [];
|
|
403
|
+
}
|
|
404
|
+
exports.guessEditor = guessEditor;
|
|
405
|
+
let _childProcess = null;
|
|
406
|
+
async function launchEditor({ colNumber, editor, fileName, lineNumber, vsCodeNewWindow, }) {
|
|
407
|
+
if (!node_fs_1.default.existsSync(fileName)) {
|
|
408
|
+
return false;
|
|
409
|
+
}
|
|
410
|
+
// Sanitize lineNumber to prevent malicious use on win32
|
|
411
|
+
// via: https://github.com/nodejs/node/blob/c3bb4b1aa5e907d489619fb43d233c3336bfc03d/lib/child_process.js#L333
|
|
412
|
+
// and it should be a positive integer
|
|
413
|
+
if (!(Number.isInteger(lineNumber) && lineNumber > 0)) {
|
|
414
|
+
return false;
|
|
415
|
+
}
|
|
416
|
+
// colNumber is optional, but should be a positive integer too
|
|
417
|
+
// default is 1
|
|
418
|
+
if (!(Number.isInteger(colNumber) && colNumber > 0)) {
|
|
419
|
+
colNumber = 1;
|
|
420
|
+
}
|
|
421
|
+
if (editor.command.toLowerCase() === 'none') {
|
|
422
|
+
return false;
|
|
423
|
+
}
|
|
424
|
+
if (process.platform === 'linux' &&
|
|
425
|
+
fileName.startsWith('/mnt/') &&
|
|
426
|
+
/Microsoft/i.test(node_os_1.default.release())) {
|
|
427
|
+
// Assume WSL / "Bash on Ubuntu on Windows" is being used, and
|
|
428
|
+
// that the file exists on the Windows file system.
|
|
429
|
+
// `os.release()` is "4.4.0-43-Microsoft" in the current release
|
|
430
|
+
// build of WSL, see: https://github.com/Microsoft/BashOnWindows/issues/423#issuecomment-221627364
|
|
431
|
+
// When a Windows editor is specified, interop functionality can
|
|
432
|
+
// handle the path translation, but only if a relative path is used.
|
|
433
|
+
fileName = node_path_1.default.relative('', fileName);
|
|
434
|
+
}
|
|
435
|
+
// cmd.exe on Windows is vulnerable to RCE attacks given a file name of the
|
|
436
|
+
// form "C:\Users\myusername\Downloads\& curl 172.21.93.52". Use a whitelist
|
|
437
|
+
// to validate user-provided file names. This doesn't cover the entire range
|
|
438
|
+
// of valid file names but should cover almost all of them in practice.
|
|
439
|
+
if (process.platform === 'win32' &&
|
|
440
|
+
!WINDOWS_FILE_NAME_WHITELIST.test(fileName.trim())) {
|
|
441
|
+
Log.error();
|
|
442
|
+
Log.error('Could not open ' + node_path_1.default.basename(fileName) + ' in the editor.');
|
|
443
|
+
Log.error();
|
|
444
|
+
Log.error('When running on Windows, file names are checked against a whitelist ' +
|
|
445
|
+
'to protect against remote code execution attacks. File names may ' +
|
|
446
|
+
'consist only of alphanumeric characters (all languages), periods, ' +
|
|
447
|
+
'dashes, slashes, and underscores.');
|
|
448
|
+
Log.error();
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
const shouldOpenVsCodeNewWindow = isVsCodeDerivative(editor.command) && vsCodeNewWindow;
|
|
452
|
+
const args = shouldOpenVsCodeNewWindow
|
|
453
|
+
? ['--new-window', fileName]
|
|
454
|
+
: lineNumber
|
|
455
|
+
? getArgumentsForLineNumber(editor.command, fileName, String(lineNumber), colNumber)
|
|
456
|
+
: [fileName];
|
|
457
|
+
if (_childProcess && isTerminalEditor(editor.command)) {
|
|
458
|
+
// There's an existing editor process already and it's attached
|
|
459
|
+
// to the terminal, so go kill it. Otherwise two separate editor
|
|
460
|
+
// instances attach to the stdin/stdout which gets confusing.
|
|
461
|
+
_childProcess.kill('SIGKILL');
|
|
462
|
+
}
|
|
463
|
+
const isWin = node_os_1.default.platform() === 'win32';
|
|
464
|
+
const where = isWin ? 'where' : 'which';
|
|
465
|
+
const binaryToUse = await new Promise((resolve) => {
|
|
466
|
+
if (editor.command === editor.process) {
|
|
467
|
+
resolve(editor.command);
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
node_child_process_1.default.exec(`${where} "${editor.command}"`, (err) => {
|
|
471
|
+
if (err) {
|
|
472
|
+
resolve(editor.process);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
resolve(editor.command);
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
});
|
|
479
|
+
return new Promise((resolve, reject) => {
|
|
480
|
+
if (process.platform === 'win32') {
|
|
481
|
+
// On Windows, launch the editor in a shell because spawn can only
|
|
482
|
+
// launch .exe files.
|
|
483
|
+
_childProcess = node_child_process_1.default.spawn('cmd.exe', ['/C', binaryToUse].concat(args), { stdio: 'inherit', detached: true });
|
|
484
|
+
}
|
|
485
|
+
else {
|
|
486
|
+
_childProcess = node_child_process_1.default.spawn(binaryToUse, args, {
|
|
487
|
+
stdio: 'inherit',
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
_childProcess.on('exit', (errorCode) => {
|
|
491
|
+
_childProcess = null;
|
|
492
|
+
if (errorCode) {
|
|
493
|
+
Log.error(`Process exited with code ${errorCode}`);
|
|
494
|
+
}
|
|
495
|
+
});
|
|
496
|
+
_childProcess.on('error', (error) => {
|
|
497
|
+
Log.error('Error opening file in editor', fileName, error.message);
|
|
498
|
+
reject(new Error('Error opening file in editor'));
|
|
499
|
+
});
|
|
500
|
+
resolve(true);
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
exports.launchEditor = launchEditor;
|