@opensumi/cli-engine 2.1.0

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.
Files changed (88) hide show
  1. package/README.md +7 -0
  2. package/lib/browser/1.browser.js +1 -0
  3. package/lib/browser/1.worker-host.js +1 -0
  4. package/lib/browser/2.browser.js +1 -0
  5. package/lib/browser/3.browser.js +1 -0
  6. package/lib/browser/assets.json +79 -0
  7. package/lib/browser/browser.js +2 -0
  8. package/lib/browser/browser.js.LICENSE.txt +98 -0
  9. package/lib/browser/fonts/boolean-dark.svg +3 -0
  10. package/lib/browser/fonts/boolean-light.svg +3 -0
  11. package/lib/browser/fonts/breakpoint-conditional-disabled.svg +4 -0
  12. package/lib/browser/fonts/breakpoint-conditional-unverified.svg +4 -0
  13. package/lib/browser/fonts/breakpoint-conditional.svg +4 -0
  14. package/lib/browser/fonts/breakpoint-disabled.svg +4 -0
  15. package/lib/browser/fonts/breakpoint-hint.svg +4 -0
  16. package/lib/browser/fonts/breakpoint-log-disabled.svg +4 -0
  17. package/lib/browser/fonts/breakpoint-log-unverified.svg +4 -0
  18. package/lib/browser/fonts/breakpoint-log.svg +4 -0
  19. package/lib/browser/fonts/breakpoint-unsupported.svg +4 -0
  20. package/lib/browser/fonts/breakpoint-unverified.svg +4 -0
  21. package/lib/browser/fonts/breakpoint.svg +4 -0
  22. package/lib/browser/fonts/class-dark.svg +3 -0
  23. package/lib/browser/fonts/class-light.svg +3 -0
  24. package/lib/browser/fonts/codicon.ttf +0 -0
  25. package/lib/browser/fonts/constant-dark.svg +4 -0
  26. package/lib/browser/fonts/constant-light.svg +4 -0
  27. package/lib/browser/fonts/current-and-breakpoint.svg +4 -0
  28. package/lib/browser/fonts/current-arrow.svg +4 -0
  29. package/lib/browser/fonts/enumerator-dark.svg +3 -0
  30. package/lib/browser/fonts/enumerator-item-dark.svg +3 -0
  31. package/lib/browser/fonts/enumerator-item-light.svg +3 -0
  32. package/lib/browser/fonts/enumerator-light.svg +3 -0
  33. package/lib/browser/fonts/event-dark.svg +3 -0
  34. package/lib/browser/fonts/event-light.svg +3 -0
  35. package/lib/browser/fonts/field-dark.svg +3 -0
  36. package/lib/browser/fonts/field-light.svg +3 -0
  37. package/lib/browser/fonts/file-dark.svg +3 -0
  38. package/lib/browser/fonts/file-light.svg +3 -0
  39. package/lib/browser/fonts/indexer-dark.svg +3 -0
  40. package/lib/browser/fonts/indexer-light.svg +3 -0
  41. package/lib/browser/fonts/interface-dark.svg +3 -0
  42. package/lib/browser/fonts/interface-light.svg +3 -0
  43. package/lib/browser/fonts/keyword-dark.svg +3 -0
  44. package/lib/browser/fonts/keyword-light.svg +3 -0
  45. package/lib/browser/fonts/loading-dark.svg +52 -0
  46. package/lib/browser/fonts/loading-hc.svg +52 -0
  47. package/lib/browser/fonts/loading.svg +52 -0
  48. package/lib/browser/fonts/method-dark.svg +3 -0
  49. package/lib/browser/fonts/method-light.svg +3 -0
  50. package/lib/browser/fonts/namespace-dark.svg +3 -0
  51. package/lib/browser/fonts/namespace-light.svg +3 -0
  52. package/lib/browser/fonts/numeric-dark.svg +3 -0
  53. package/lib/browser/fonts/numeric-light.svg +3 -0
  54. package/lib/browser/fonts/operator-dark.svg +3 -0
  55. package/lib/browser/fonts/operator-light.svg +3 -0
  56. package/lib/browser/fonts/property-dark.svg +3 -0
  57. package/lib/browser/fonts/property-light.svg +3 -0
  58. package/lib/browser/fonts/snippet-dark.svg +3 -0
  59. package/lib/browser/fonts/snippet-light.svg +3 -0
  60. package/lib/browser/fonts/stackframe-and-breakpoint.svg +4 -0
  61. package/lib/browser/fonts/stackframe-arrow.svg +4 -0
  62. package/lib/browser/fonts/string-dark.svg +3 -0
  63. package/lib/browser/fonts/string-light.svg +3 -0
  64. package/lib/browser/fonts/structure-dark.svg +3 -0
  65. package/lib/browser/fonts/structure-light.svg +3 -0
  66. package/lib/browser/fonts/template-dark.svg +3 -0
  67. package/lib/browser/fonts/template-light.svg +3 -0
  68. package/lib/browser/fonts/variable-dark.svg +3 -0
  69. package/lib/browser/fonts/variable-light.svg +3 -0
  70. package/lib/browser/index.html +42 -0
  71. package/lib/browser/loader.js +1747 -0
  72. package/lib/browser/main.css +1 -0
  73. package/lib/browser/worker-host.js +40 -0
  74. package/lib/hosted/1.ext.process.js +1 -0
  75. package/lib/hosted/ext.process.js +37 -0
  76. package/lib/node/env.d.ts +2 -0
  77. package/lib/node/env.js +35 -0
  78. package/lib/node/index.d.ts +1 -0
  79. package/lib/node/index.js +45 -0
  80. package/lib/node/modules.d.ts +2 -0
  81. package/lib/node/modules.js +6 -0
  82. package/lib/node/openBrowser.d.ts +5 -0
  83. package/lib/node/openBrowser.js +116 -0
  84. package/lib/node/server.d.ts +18 -0
  85. package/lib/node/server.js +171 -0
  86. package/lib/node/webview/index.html +12 -0
  87. package/lib/node/webview/webview.js +1 -0
  88. package/package.json +84 -0
@@ -0,0 +1,2 @@
1
+ export declare const CLI_DEVELOPMENT_PATH: string;
2
+ export declare const CLIENT_IP: any;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.CLIENT_IP = exports.CLI_DEVELOPMENT_PATH = void 0;
30
+ const os_1 = __importDefault(require("os"));
31
+ const path_1 = __importDefault(require("path"));
32
+ const ip = __importStar(require("ip"));
33
+ const ide_core_common_1 = require("@opensumi/ide-core-common");
34
+ exports.CLI_DEVELOPMENT_PATH = path_1.default.join(os_1.default.homedir(), `${ide_core_common_1.StoragePaths.DEFAULT_STORAGE_DIR_NAME}-dev`);
35
+ exports.CLIENT_IP = ip.address();
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,45 @@
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
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const mri_1 = __importDefault(require("mri"));
9
+ const modules_1 = require("./modules");
10
+ const server_1 = require("./server");
11
+ const argv = (0, mri_1.default)(process.argv.slice(2));
12
+ const { serverPort, workspaceDir, extensionCandidate, isDev, extHostPath, watchServerPort } = argv;
13
+ let serverAppOpts = {
14
+ modules: modules_1.modules,
15
+ };
16
+ let clientAppOpts = {};
17
+ /**
18
+ * sumi-dev.config.js 用于在插件开发时自定义一些 opensumi client 及 server 端的默认配置
19
+ * 当传入多个 extensionDir 时,优先取第一个插件目录下的 sumi-dev.config.js
20
+ */
21
+ const extensions = strToArray(extensionCandidate);
22
+ const opensumiDevConfigPath = path_1.default.resolve(extensions[0], 'sumi-dev.config.js');
23
+ // read `sumi-dev.config.js`
24
+ if (fs_1.default.existsSync(opensumiDevConfigPath)) {
25
+ const opensumiDevConfig = require(opensumiDevConfigPath);
26
+ serverAppOpts = {
27
+ ...serverAppOpts,
28
+ ...opensumiDevConfig.serverAppOpts,
29
+ };
30
+ clientAppOpts = { ...opensumiDevConfig.clientAppOpts };
31
+ }
32
+ (0, server_1.startServer)({
33
+ port: Number(serverPort),
34
+ isDev: !!isDev,
35
+ workspaceDir: workspaceDir,
36
+ extensionCandidate: extensionCandidate ? strToArray(extensionCandidate) : undefined,
37
+ extHostPath: extHostPath,
38
+ watchServerPort,
39
+ }, {
40
+ serverAppOpts,
41
+ clientAppOpts,
42
+ });
43
+ function strToArray(item) {
44
+ return Array.isArray(item) ? item : [item];
45
+ }
@@ -0,0 +1,2 @@
1
+ import { NodeModule, ConstructorOf } from '@opensumi/ide-core-node';
2
+ export declare const modules: ConstructorOf<NodeModule>[];
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.modules = void 0;
4
+ const node_1 = require("@opensumi/ide-express-file-server/lib/node");
5
+ const common_modules_1 = require("@opensumi/ide-startup/lib/node/common-modules");
6
+ exports.modules = [...common_modules_1.CommonNodeModules, node_1.ExpressFileServerModule];
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Reads the BROWSER environment variable and decides what to do with it. Returns
3
+ * true if it opened a browser or ran a node.js script, otherwise false.
4
+ */
5
+ export declare function openBrowser(url: any): boolean;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openBrowser = void 0;
4
+ /* eslint-disable no-console */
5
+ const chalk = require('chalk');
6
+ // eslint-disable-next-line import/order
7
+ const execSync = require('child_process').execSync;
8
+ const spawn = require('cross-spawn');
9
+ const open = require('open');
10
+ // https://github.com/sindresorhus/open#app
11
+ const OSX_CHROME = 'google chrome';
12
+ const Actions = Object.freeze({
13
+ NONE: 0,
14
+ BROWSER: 1,
15
+ SCRIPT: 2,
16
+ });
17
+ function getBrowserEnv() {
18
+ // Attempt to honor this environment variable.
19
+ // It is specific to the operating system.
20
+ // See https://github.com/sindresorhus/open#app for documentation.
21
+ const value = process.env.BROWSER;
22
+ const args = process.env.BROWSER_ARGS ? process.env.BROWSER_ARGS.split(' ') : [];
23
+ let action;
24
+ if (!value) {
25
+ // Default.
26
+ action = Actions.BROWSER;
27
+ }
28
+ else if (value.toLowerCase().endsWith('.js')) {
29
+ action = Actions.SCRIPT;
30
+ }
31
+ else if (value.toLowerCase() === 'none') {
32
+ action = Actions.NONE;
33
+ }
34
+ else {
35
+ action = Actions.BROWSER;
36
+ }
37
+ return { action, value, args };
38
+ }
39
+ function executeNodeScript(scriptPath, url) {
40
+ const extraArgs = process.argv.slice(2);
41
+ const child = spawn('node', [scriptPath, ...extraArgs, url], {
42
+ stdio: 'inherit',
43
+ });
44
+ child.on('close', (code) => {
45
+ if (code !== 0) {
46
+ console.log();
47
+ console.log(chalk.red('The script specified as BROWSER environment variable failed.'));
48
+ console.log(chalk.cyan(scriptPath) + ' exited with code ' + code + '.');
49
+ console.log();
50
+ return;
51
+ }
52
+ });
53
+ return true;
54
+ }
55
+ function startBrowserProcess(browser, url, args) {
56
+ // If we're on OS X, the user hasn't specifically
57
+ // requested a different browser, we can try opening
58
+ // Chrome with AppleScript. This lets us reuse an
59
+ // existing tab when possible instead of creating a new one.
60
+ const shouldTryOpenChromeWithAppleScript = process.platform === 'darwin' && (typeof browser !== 'string' || browser === OSX_CHROME);
61
+ if (shouldTryOpenChromeWithAppleScript) {
62
+ try {
63
+ // Try our best to reuse existing tab
64
+ // on OS X Google Chrome with AppleScript
65
+ execSync('ps cax | grep "Google Chrome"');
66
+ execSync(`osascript openChrome.applescript "${encodeURI(url)}"`, {
67
+ cwd: __dirname,
68
+ stdio: 'ignore',
69
+ });
70
+ return true;
71
+ }
72
+ catch (err) {
73
+ // Ignore errors.
74
+ }
75
+ }
76
+ // Another special case: on OS X, check if BROWSER has been set to "open".
77
+ // In this case, instead of passing `open` to `opn` (which won't work),
78
+ // just ignore it (thus ensuring the intended behavior, i.e. opening the system browser):
79
+ // https://github.com/facebook/create-react-app/pull/1690#issuecomment-283518768
80
+ if (process.platform === 'darwin' && browser === 'open') {
81
+ browser = undefined;
82
+ }
83
+ // If there are arguments, they must be passed as array with the browser
84
+ if (typeof browser === 'string' && args.length > 0) {
85
+ browser = [browser].concat(args);
86
+ }
87
+ // Fallback to open
88
+ // (It will always open new tab)
89
+ try {
90
+ const options = { app: browser, wait: false };
91
+ open(url, options).catch(() => { }); // Prevent `unhandledRejection` error.
92
+ return true;
93
+ }
94
+ catch (err) {
95
+ return false;
96
+ }
97
+ }
98
+ /**
99
+ * Reads the BROWSER environment variable and decides what to do with it. Returns
100
+ * true if it opened a browser or ran a node.js script, otherwise false.
101
+ */
102
+ function openBrowser(url) {
103
+ const { action, value, args } = getBrowserEnv();
104
+ switch (action) {
105
+ case Actions.NONE:
106
+ // Special case: BROWSER="none" will prevent opening completely.
107
+ return false;
108
+ case Actions.SCRIPT:
109
+ return executeNodeScript(value, url);
110
+ case Actions.BROWSER:
111
+ return startBrowserProcess(value, url, args);
112
+ default:
113
+ throw new Error('Not implemented.');
114
+ }
115
+ }
116
+ exports.openBrowser = openBrowser;
@@ -0,0 +1,18 @@
1
+ /// <reference types="node" />
2
+ import http from 'http';
3
+ import { IClientAppOpts } from '@opensumi/ide-core-browser';
4
+ import { IServerAppOpts } from '@opensumi/ide-core-node';
5
+ interface IDEServerParams {
6
+ serverAppOpts?: Partial<IServerAppOpts>;
7
+ clientAppOpts?: Partial<IClientAppOpts>;
8
+ }
9
+ interface ServerParams {
10
+ port: number;
11
+ isDev: boolean;
12
+ workspaceDir?: string;
13
+ extensionCandidate?: string[];
14
+ extHostPath?: string;
15
+ watchServerPort?: string;
16
+ }
17
+ export declare function startServer(serverParams: ServerParams, ideAppOpts: IDEServerParams): Promise<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>>;
18
+ export {};
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __importDefault = (this && this.__importDefault) || function (mod) {
26
+ return (mod && mod.__esModule) ? mod : { "default": mod };
27
+ };
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.startServer = void 0;
30
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
31
+ /* eslint-disable no-console */
32
+ const fs_1 = __importDefault(require("fs"));
33
+ const http_1 = __importDefault(require("http"));
34
+ const path_1 = __importDefault(require("path"));
35
+ const util_1 = require("util");
36
+ const cors_1 = __importDefault(require("@koa/cors"));
37
+ const ejs_1 = __importDefault(require("ejs"));
38
+ const koa_1 = __importDefault(require("koa"));
39
+ const koa_mount_1 = __importDefault(require("koa-mount"));
40
+ const ide_core_common_1 = require("@opensumi/ide-core-common");
41
+ const const_1 = require("@opensumi/ide-core-common/lib/const");
42
+ const ide_core_node_1 = require("@opensumi/ide-core-node");
43
+ const env = __importStar(require("./env"));
44
+ const openBrowser_1 = require("./openBrowser");
45
+ const ALLOW_MIME = {
46
+ gif: 'image/gif',
47
+ jpg: 'image/jpeg',
48
+ png: 'image/png',
49
+ svg: 'image/svg+xml',
50
+ ttf: 'font/ttf',
51
+ eot: 'font/eot',
52
+ otf: 'font/otf',
53
+ woff: 'font/woff',
54
+ woff2: 'font/woff2',
55
+ js: 'application/javascript',
56
+ css: 'text/css',
57
+ };
58
+ const CLI_DEVELOPMENT_PATH = env.CLI_DEVELOPMENT_PATH;
59
+ const deviceIp = env.CLIENT_IP;
60
+ const extensionDir = path_1.default.join(CLI_DEVELOPMENT_PATH, 'extensions');
61
+ async function readPkgUp() {
62
+ const pkgJsonStr = await (0, util_1.promisify)(fs_1.default.readFile)(path_1.default.resolve(__dirname, '../../package.json'), 'utf8');
63
+ try {
64
+ return JSON.parse(pkgJsonStr);
65
+ }
66
+ catch (err) {
67
+ console.warn('json parse failed with:', pkgJsonStr);
68
+ console.warn(err);
69
+ }
70
+ return {};
71
+ }
72
+ async function startServer(serverParams, ideAppOpts) {
73
+ const { port = 50999, workspaceDir = __dirname, extensionCandidate = [__dirname], isDev, extHostPath, watchServerPort, } = serverParams;
74
+ if (isDev) {
75
+ process.env.IS_DEV = '1';
76
+ }
77
+ process.env.EXT_MODE = 'js';
78
+ process.env.KTLOG_SHOW_DEBUG = '1';
79
+ const app = new koa_1.default();
80
+ const deferred = new ide_core_common_1.Deferred();
81
+ // @ts-ignore
82
+ app.use((0, cors_1.default)());
83
+ let opts = {
84
+ webSocketHandler: [],
85
+ use: app.use.bind(app),
86
+ marketplace: {
87
+ endpoint: const_1.DEFAULT_TRS_REGISTRY.ENDPOINT,
88
+ showBuiltinExtensions: true,
89
+ accountId: const_1.DEFAULT_TRS_REGISTRY.ACCOUNT_ID,
90
+ masterKey: const_1.DEFAULT_TRS_REGISTRY.MASTER_KEY,
91
+ extensionDir: path_1.default.join(CLI_DEVELOPMENT_PATH, 'extensions'),
92
+ },
93
+ extHost: extHostPath || path_1.default.join(__dirname, '../hosted/ext.process.js'),
94
+ logDir: path_1.default.join(CLI_DEVELOPMENT_PATH, 'logs'),
95
+ logLevel: ide_core_common_1.LogLevel.Verbose,
96
+ staticAllowPath: [extensionDir, ...extensionCandidate],
97
+ };
98
+ if (ideAppOpts.serverAppOpts) {
99
+ opts = {
100
+ ...opts,
101
+ ...ideAppOpts.serverAppOpts,
102
+ };
103
+ }
104
+ const serverApp = new ide_core_node_1.ServerApp(opts);
105
+ const server = http_1.default.createServer(app.callback());
106
+ await serverApp.start(server);
107
+ app.use((0, koa_mount_1.default)('/', async (ctx) => {
108
+ console.log('REQUEST URL:', ctx.url);
109
+ let staticPath;
110
+ let _path = ctx.url;
111
+ if (_path.startsWith('/webview')) {
112
+ staticPath = path_1.default.join(__dirname, `./${_path.split('?')[0]}`);
113
+ }
114
+ else if (_path === '/' || _path.endsWith('.html')) {
115
+ _path = '/index.html';
116
+ staticPath = path_1.default.join(__dirname, '../browser/index.html');
117
+ }
118
+ else {
119
+ staticPath = path_1.default.join(__dirname, `../browser${_path}`);
120
+ }
121
+ const contentType = ALLOW_MIME[path_1.default.extname(_path).slice(1)];
122
+ if (!fs_1.default.existsSync(staticPath)) {
123
+ console.warn(`Load ${staticPath} failed.`);
124
+ ctx.status = 404;
125
+ ctx.body = 'Not Found.';
126
+ return;
127
+ }
128
+ let content = fs_1.default.readFileSync(staticPath).toString();
129
+ if (_path === '/index.html') {
130
+ const assets = fs_1.default.readFileSync(path_1.default.join(__dirname, '../browser/assets.json')).toString();
131
+ const config = {
132
+ ideWorkspaceDir: workspaceDir,
133
+ extensionDir,
134
+ extensionCandidate,
135
+ port,
136
+ wsPath: `ws://${deviceIp}:${port}`,
137
+ staticServicePath: `http://${deviceIp}:${port}`,
138
+ webviewEndpoint: `http://${deviceIp}:${port}/webview`,
139
+ watchServerPath: `ws://${deviceIp}:${watchServerPort}`,
140
+ };
141
+ const pkg = await readPkgUp();
142
+ const meta = {
143
+ ideVersion: pkg.dependencies['@opensumi/ide-core-common'],
144
+ engineVersion: pkg.version,
145
+ };
146
+ content = ejs_1.default.compile(content, {})({
147
+ config,
148
+ meta,
149
+ assets: JSON.parse(assets),
150
+ clientAppOpts: ideAppOpts.clientAppOpts || {},
151
+ });
152
+ }
153
+ ctx.set('Content-Type', contentType);
154
+ ctx.body = content;
155
+ }));
156
+ server.on('error', (err) => {
157
+ deferred.reject(err);
158
+ console.error('server error: ' + err.message);
159
+ setTimeout(process.exit, 0, 1);
160
+ });
161
+ server.listen(port, () => {
162
+ console.log(`Server listen on port ${port}`);
163
+ (0, openBrowser_1.openBrowser)(`http://${deviceIp}:${port}`);
164
+ console.log(`
165
+ The service started successfully, please click http://${deviceIp}:${port} to access the OpenSumi IDE.
166
+ `);
167
+ deferred.resolve(server);
168
+ });
169
+ return deferred.promise;
170
+ }
171
+ exports.startServer = startServer;
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en" style="width: 100%; height: 100%">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+
6
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+ <meta http-equiv="X-UA-Compatible" content="ie=edge" />
8
+ <title>Webview Panel Container</title>
9
+ </head>
10
+
11
+ <body style="margin: 0; overflow: hidden; width: 100%; height: 100%"><script type="text/javascript" src="webview.js"></script></body>
12
+ </html>
@@ -0,0 +1 @@
1
+ !function(e){var t={};function n(o){if(t[o])return t[o].exports;var i=t[o]={i:o,l:!1,exports:{}};return e[o].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,o){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:o})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var o=Object.create(null);if(n.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(o,i,function(t){return e[t]}.bind(null,i));return o},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){"use strict";n.r(t);var o=function(e,t,n,o){return new(n||(n=Promise))((function(i,s){function a(e){try{c(o.next(e))}catch(e){s(e)}}function r(e){try{c(o.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((o=o.apply(e,t||[])).next())}))};var i=function(e,t,n,o){return new(n||(n=Promise))((function(i,s){function a(e){try{c(o.next(e))}catch(e){s(e)}}function r(e){try{c(o.throw(e))}catch(e){s(e)}}function c(e){var t;e.done?i(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,r)}c((o=o.apply(e,t||[])).next())}))};new class{constructor(e){this.channel=e,this.activeTheme="default",this.isHandlingScroll=!1,this.updateId=0,this.firstLoad=!0,this.pendingMessages=[],document.addEventListener("DOMContentLoaded",this.init.bind(this))}init(){const e=document.location.search.match(/\bid=([\w-]+)/);this.ID=e?e[1]:void 0,document.body&&(this.channel.onMessage("styles",(e,t)=>{this.styles=t.styles,this.activeTheme=t.activeTheme;const n=this.getActiveFrame();n&&n.contentDocument&&this.applyStyles(n.contentDocument,n.contentDocument.body)}),this.channel.onMessage("focus",()=>{const e=this.getActiveFrame();e&&e.contentWindow&&e.contentWindow.focus()}),this.channel.onMessage("content",(e,t)=>o(this,void 0,void 0,(function*(){return this.setContent(t)}))),this.channel.onMessage("message",(e,t)=>{if(!this.getPendingFrame()){const e=this.getActiveFrame();if(e)return void e.contentWindow.postMessage(t,"*")}this.pendingMessages.push(t)}),this.trackFocus({onFocus:()=>this.channel.postMessage("did-focus"),onBlur:()=>this.channel.postMessage("did-blur")}),this.channel.postMessage("webview-ready",{}))}setContent(e){return o(this,void 0,void 0,(function*(){const t=++this.updateId;if(yield this.channel.ready,t!==this.updateId)return;const n=e.options,o=this.toContentHtml(e),i=this.getActiveFrame(),s=this.firstLoad;let a;if(this.firstLoad)this.firstLoad=!1,a=(e,t)=>{isNaN(this.initialScrollProgress)||0===t.scrollY&&t.scroll(0,e.clientHeight*this.initialScrollProgress)};else{const e=i&&i.contentDocument&&i.contentDocument.body?i.contentWindow.scrollY:0;a=(t,n)=>{0===n.scrollY&&n.scroll(0,e)}}const r=this.getPendingFrame();r&&(r.setAttribute("id",""),document.body.removeChild(r)),s||(this.pendingMessages=[]);const c=document.createElement("iframe");c.setAttribute("id","pending-frame"),c.setAttribute("frameborder","0"),c.setAttribute("sandbox",n.allowScripts?"allow-scripts allow-forms allow-same-origin":"allow-scripts allow-same-origin"),this.channel.fakeLoad&&(c.src="./fake.html?id="+this.ID),c.style.cssText="display: block; margin: 0; overflow: hidden; position: absolute; width: 100%; height: 100%; visibility: hidden",document.body.appendChild(c),this.channel.fakeLoad||c.contentDocument.open(),c.contentWindow.addEventListener("keydown",this.handleInnerKeydown.bind(this)),c.contentWindow.addEventListener("DOMContentLoaded",e=>{this.channel.fakeLoad&&(c.contentDocument.open(),c.contentDocument.write(o),c.contentDocument.close(),l(c));const t=e.target?e.target:void 0;t&&this.applyStyles(t,t.body)});const d=(e,t)=>{e&&e.body&&a(e.body,t);const n=this.getPendingFrame();if(n&&n.contentDocument&&n.contentDocument===e){const e=this.getActiveFrame();e&&document.body.removeChild(e),this.applyStyles(n.contentDocument,n.contentDocument.body),n.setAttribute("id","active-frame"),n.style.visibility="visible",this.channel.focusIframeOnCreate&&n.contentWindow.focus(),t.addEventListener("scroll",this.handleInnerScroll.bind(this)),this.pendingMessages.forEach(e=>{t.postMessage(e,"*")}),this.pendingMessages=[]}},l=e=>{clearTimeout(this.loadTimeout),this.loadTimeout=void 0,this.loadTimeout=setTimeout(()=>{clearTimeout(this.loadTimeout),this.loadTimeout=void 0,d(e.contentDocument,e.contentWindow)},200);const t=this;e.contentWindow.addEventListener("load",(function(e){t.loadTimeout&&(clearTimeout(t.loadTimeout),t.loadTimeout=void 0,d(e.target,this))})),e.contentWindow.addEventListener("click",this.handleInnerClick.bind(this)),this.channel.onIframeLoaded&&this.channel.onIframeLoaded(e)};this.channel.fakeLoad||l(c),this.channel.fakeLoad||(c.contentDocument.write(o),c.contentDocument.close()),this.channel.postMessage("did-set-content",void 0)}))}trackFocus({onFocus:e,onBlur:t}){let n=document.hasFocus();setInterval(()=>{const o=document.hasFocus();o!==n&&(n=o,o?e():t())},50)}getActiveFrame(){return document.getElementById("active-frame")}getPendingFrame(){return document.getElementById("pending-frame")}get defaultCssRules(){return"body {\n background-color: var(--vscode-editor-background);\n color: var(--vscode-editor-foreground);\n font-family: var(--vscode-font-family);\n font-weight: var(--vscode-font-weight);\n font-size: var(--vscode-font-size);\n margin: 0;\n padding: 0 20px;\n}\n\nimg {\n max-width: 100%;\n max-height: 100%;\n}\n\na {\n color: var(--vscode-textLink-foreground);\n}\n\na:hover {\n color: var(--vscode-textLink-activeForeground);\n}\n\na:focus,\ninput:focus,\nselect:focus,\ntextarea:focus {\n outline: 1px solid -webkit-focus-ring-color;\n outline-offset: -1px;\n}\n\ncode {\n color: var(--vscode-textPreformat-foreground);\n}\n\nblockquote {\n background: var(--vscode-textBlockQuote-background);\n border-color: var(--vscode-textBlockQuote-border);\n}\n\n::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n}\n\n::-webkit-scrollbar-thumb {\n background-color: var(--vscode-scrollbarSlider-background);\n}\n::-webkit-scrollbar-thumb:hover {\n background-color: var(--vscode-scrollbarSlider-hoverBackground);\n}\n::-webkit-scrollbar-thumb:active {\n background-color: var(--vscode-scrollbarSlider-activeBackground);\n}"}applyStyles(e,t){if(e&&(t&&(t.classList.remove("vscode-light","vscode-dark","vscode-high-contrast"),t.classList.add(this.activeTheme)),this.styles))for(const t of Object.keys(this.styles))e.documentElement.style.setProperty("--"+t,this.styles[t])}handleInnerClick(e){if(!e||!e.view||!e.view.document)return;const t=e.view.document.getElementsByTagName("base")[0];let n=e.target;for(;n;){if(n.tagName&&"a"===n.tagName.toLowerCase()&&n.href){if("#"===n.getAttribute("href"))e.view.scrollTo(0,0);else if(n.hash&&(n.getAttribute("href")===n.hash||t&&n.href.indexOf(t.href)>=0)){const t=e.view.document.getElementById(n.hash.substr(1,n.hash.length-1));t&&t.scrollIntoView()}else this.channel.postMessage("did-click-link",n.href.baseVal||n.href);e.preventDefault();break}n=n.parentNode}}handleInnerKeydown(e){this.channel.postMessage("did-keydown",{key:e.key,keyCode:e.keyCode,code:e.code,shiftKey:e.shiftKey,altKey:e.altKey,ctrlKey:e.ctrlKey,metaKey:e.metaKey,repeat:e.repeat})}handleInnerScroll(e){if(!e.target||!e.target.body)return;if(this.isHandlingScroll)return;const t=e.currentTarget.scrollY/e.target.body.clientHeight;isNaN(t)||(this.isHandlingScroll=!0,window.requestAnimationFrame(()=>{try{this.channel.postMessage("did-scroll",t)}catch(e){}this.isHandlingScroll=!1}))}toContentHtml(e){const t=e.options,n=e.contents,o=(new DOMParser).parseFromString(n,"text/html");if(o.querySelectorAll("a").forEach(e=>{e.title||(e.title=e.getAttribute("href"))}),t.allowScripts){const t=o.createElement("script");t.textContent=`\n const acquireVsCodeApi = (function() {\n const originalPostMessage = window.parent.postMessage.bind(window.parent);\n const targetOrigin = '*';\n let acquired = false;\n\n let state = ${(i=e.state)?`JSON.parse("${s=JSON.stringify(i),(s+"").replace(/[\\"']/g,"\\$&").replace(/\u0000/g,"\\0")}")`:void 0};\n\n return () => {\n if (acquired) {\n throw new Error('An instance of the VS Code API has already been acquired');\n }\n acquired = true;\n return Object.freeze({\n postMessage: function(msg) {\n return originalPostMessage({ command: 'onmessage', data: msg }, targetOrigin);\n },\n setState: function(newState) {\n state = newState;\n originalPostMessage({ command: 'do-update-state', data: JSON.parse(JSON.stringify(newState)) }, targetOrigin);\n return newState;\n },\n getState: function() {\n return state;\n }\n });\n };\n })();\n delete window.parent;\n delete window.top;\n delete window.frameElement;\n window.acquireVsCodeApi = acquireVsCodeApi;\n `,o.head.prepend(t)}var i,s;const a=o.createElement("style");return a.id="_defaultStyles",a.innerHTML=this.defaultCssRules,o.head.prepend(a),this.applyStyles(o,o.body),"<!DOCTYPE html>\n"+o.documentElement.outerHTML}}(new class{constructor(){var e,t,n;this.handlers=new Map,this.fakeLoad=!1,this.id=null===(n=null===(t=null===(e=null===document||void 0===document?void 0:document.location)||void 0===e?void 0:e.search)||void 0===t?void 0:t.match(/\bid=([\w-]+)/))||void 0===n?void 0:n[1],window.addEventListener("message",e=>{if(e.data&&("onmessage"===e.data.command||"do-update-state"===e.data.command))return void this.postMessage(e.data.command,e.data.data);const t=e.data.channel,n=this.handlers.get(t);n?n(e,e.data.data):console.log("no handler for ",e)}),this.ready=new Promise(e=>i(this,void 0,void 0,(function*(){e()}))),this.onMessage("devtools-opened",()=>{})}postMessage(e,t){window.parent!==window&&window.parent.postMessage({target:this.id,channel:e,data:t},"*")}onMessage(e,t){this.handlers.set(e,t)}})}]);
package/package.json ADDED
@@ -0,0 +1,84 @@
1
+ {
2
+ "name": "@opensumi/cli-engine",
3
+ "version": "2.1.0",
4
+ "description": "Integration engine runtime for opensumi-cli and opensumi extension",
5
+ "license": "MIT",
6
+ "files": [
7
+ "lib"
8
+ ],
9
+ "scripts": {
10
+ "build": "cross-env NODE_ENV=production run-p build:node build:browser build:exthost build:webview build:ext-worker-host",
11
+ "build:browser": "webpack --config ./configs/webpack.config.browser.js --progress",
12
+ "build:ext-worker-host": "webpack --config ./configs/webpack.config.ext-worker.js --progress",
13
+ "build:ext-worker-host:watch": "yarn run build:ext-worker-host -- --watch",
14
+ "build:exthost": "webpack --config ./configs/webpack.config.ext.js --progress",
15
+ "build:webview": "webpack --config ./configs/webpack.config.webview.js --progress",
16
+ "build:node": "tsc -p configs/tsconfig.node.json || echo 0",
17
+ "lint": "eslint --cache --ext .js ./",
18
+ "lint:fix": "yarn run lint -- --fix",
19
+ "prepublishOnly": "yarn run build",
20
+ "watch": "cross-env NODE_ENV=development run-p watch:node watch:browser watch:exthost watch:webview watch:ext-worker-host",
21
+ "watch:browser": "yarn run build:browser -- --watch",
22
+ "watch:exthost": "yarn run build:exthost -- --watch",
23
+ "watch:node": "tsc -w -p configs/tsconfig.node.json || echo 0",
24
+ "watch:webview": "yarn run build:webview -- --watch"
25
+ },
26
+ "dependencies": {
27
+ "@koa/cors": "^3.0.0",
28
+ "@opensumi/di": "^1.8.0",
29
+ "@opensumi/ide-core-browser": "2.22.1",
30
+ "@opensumi/ide-core-common": "2.22.1",
31
+ "@opensumi/ide-core-node": "2.22.1",
32
+ "@opensumi/ide-express-file-server": "2.22.1",
33
+ "@opensumi/ide-extension": "2.22.1",
34
+ "@opensumi/ide-i18n": "2.22.1",
35
+ "@opensumi/ide-main-layout": "2.22.1",
36
+ "@opensumi/ide-startup": "2.22.1",
37
+ "chalk": "^4.0.0",
38
+ "ejs": "^2.7.4",
39
+ "ip": "^1.1.8",
40
+ "koa": "^2.7.0",
41
+ "koa-mount": "^4.0.0",
42
+ "mri": "^1.2.0",
43
+ "open": "^7.0.3",
44
+ "react": "^16.12.0",
45
+ "react-dom": "^16.12.0",
46
+ "tslib": "^2.5.0"
47
+ },
48
+ "devDependencies": {
49
+ "@types/ejs": "^3.0.2",
50
+ "@types/koa-mount": "^4.0.0",
51
+ "@types/node": "^18.11.18",
52
+ "@types/react": "^16.9.17",
53
+ "@types/react-dom": "^16.9.4",
54
+ "@types/read-pkg-up": "^6.0.0",
55
+ "assets-webpack-plugin": "^3.9.12",
56
+ "cache-loader": "^4.1.0",
57
+ "copy-webpack-plugin": "^5.1.1",
58
+ "cross-env": "^7.0.3",
59
+ "css-loader": "^2.1.1",
60
+ "eslint": "^6.5.1",
61
+ "file-loader": "^3.0.1",
62
+ "friendly-errors-webpack-plugin": "^1.7.0",
63
+ "html-webpack-plugin": "^3.2.0",
64
+ "less": "^3.9.0",
65
+ "less-loader": "^6.0.0",
66
+ "loader-utils": "^1.2.3",
67
+ "mini-css-extract-plugin": "^0.6.0",
68
+ "node-notifier": "^5.4.0",
69
+ "npm-run-all": "^4.1.5",
70
+ "optimize-css-assets-webpack-plugin": "^5.0.3",
71
+ "shell-path": "^2.1.0",
72
+ "style-loader": "^0.23.1",
73
+ "terser-webpack-plugin": "^2.3.1",
74
+ "thread-loader": "^2.1.3",
75
+ "ts-loader": "8.2.0",
76
+ "ts-node": "10.9.1",
77
+ "tsconfig-paths": "^3.8.0",
78
+ "tsconfig-paths-webpack-plugin": "^3.2.0",
79
+ "typescript": "4.9.3",
80
+ "url-loader": "^2.1.0",
81
+ "webpack": "^4.30.0",
82
+ "webpack-cli": "^3.3.1"
83
+ }
84
+ }