diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js index d66c28388..2e69db5bc 100644 --- a/ui/.eslintrc.js +++ b/ui/.eslintrc.js @@ -8,6 +8,7 @@ module.exports = { es6: true, }, extends: 'eslint:recommended', + parser: 'babel-eslint', parserOptions: { ecmaVersion: 2018, sourceType: 'module', diff --git a/ui/app/controllers/exec.js b/ui/app/controllers/exec.js index 4d0bbe082..a30144772 100644 --- a/ui/app/controllers/exec.js +++ b/ui/app/controllers/exec.js @@ -7,8 +7,6 @@ import ExecCommandEditorXtermAdapter from 'nomad-ui/utils/classes/exec-command-e import ExecSocketXtermAdapter from 'nomad-ui/utils/classes/exec-socket-xterm-adapter'; import localStorageProperty from 'nomad-ui/utils/properties/local-storage'; -import { Terminal } from 'xterm-vendor'; - const ANSI_UI_GRAY_400 = '\x1b[38;2;142;150;163m'; const ANSI_WHITE = '\x1b[0m'; @@ -34,9 +32,7 @@ export default Controller.extend({ taskGroupSorting: Object.freeze(['name']), sortedTaskGroups: sort('uniquePendingAndRunningTaskGroups', 'taskGroupSorting'), - init() { - this._super(...arguments); - + setUpTerminal(Terminal) { this.terminal = new Terminal({ fontFamily: 'monospace', fontWeight: '400' }); window.execTerminal = this.terminal; // Issue to improve: https://github.com/hashicorp/nomad/issues/7457 diff --git a/ui/app/routes/exec.js b/ui/app/routes/exec.js index 842889f15..883c0f44d 100644 --- a/ui/app/routes/exec.js +++ b/ui/app/routes/exec.js @@ -17,12 +17,22 @@ export default Route.extend(WithWatchers, { const namespace = transition.to.queryParams.namespace || this.get('system.activeNamespace.id'); const name = params.job_name; const fullId = JSON.stringify([name, namespace || 'default']); - return this.store + + const jobPromise = this.store .findRecord('job', fullId) .then(job => { return job.get('allocations').then(() => job); }) .catch(notifyError(this)); + + const xtermImport = import('xterm').then(module => module.Terminal); + + return Promise.all([jobPromise, xtermImport]); + }, + + setupController(controller, [job, Terminal]) { + this._super(controller, job); + controller.setUpTerminal(Terminal); }, startWatchers(controller, model) { diff --git a/ui/ember-cli-build.js b/ui/ember-cli-build.js index 9d675d831..595c41266 100644 --- a/ui/ember-cli-build.js +++ b/ui/ember-cli-build.js @@ -17,7 +17,10 @@ module.exports = function(defaults) { modes: ['javascript'], }, babel: { - plugins: ['@babel/plugin-proposal-object-rest-spread'], + plugins: [ + '@babel/plugin-proposal-object-rest-spread', + require.resolve('ember-auto-import/babel-plugin'), + ], }, 'ember-cli-babel': { includePolyfill: isProd, @@ -43,12 +46,6 @@ module.exports = function(defaults) { // along with the exports of each module as its value. app.import('node_modules/xterm/css/xterm.css'); - // Issue to move to typical package.json import when released: https://github.com/hashicorp/nomad/issues/7461 - app.import('vendor/xterm.js', { - using: [ - { transformation: 'amd', as: 'xterm-vendor' }, - ], - }); return app.toTree(); }; diff --git a/ui/package.json b/ui/package.json index ec46057f8..490850b89 100644 --- a/ui/package.json +++ b/ui/package.json @@ -37,6 +37,7 @@ "@hashicorp/structure-icons": "^1.3.0", "@storybook/ember-cli-storybook": "^0.2.0", "anser": "^1.4.8", + "babel-eslint": "^10.1.0", "base64-js": "^1.3.1", "broccoli-asset-rev": "^3.0.0", "bulma": "0.6.1", @@ -116,7 +117,7 @@ "testem": "^3.0.3", "testem-multi-reporter": "^1.2.0", "text-encoder-lite": "^2.0.0", - "xterm": "^4.2.0-vscode1", + "xterm": "^4.6.0", "xterm-addon-fit": "^0.3.0" }, "optionalDependencies": { diff --git a/ui/tests/acceptance/exec-test.js b/ui/tests/acceptance/exec-test.js index a1fc4d993..a367b276a 100644 --- a/ui/tests/acceptance/exec-test.js +++ b/ui/tests/acceptance/exec-test.js @@ -88,7 +88,7 @@ module('Acceptance | exec', function(hooks) { await Exec.visitJob({ job: this.job.id }); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(0) .translateToString() .trim(), @@ -243,7 +243,7 @@ module('Acceptance | exec', function(hooks) { assert.ok(Exec.taskGroups[0].tasks[0].isActive); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(2) .translateToString() .trim(), @@ -251,7 +251,7 @@ module('Acceptance | exec', function(hooks) { ); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(4) .translateToString() .trim(), @@ -259,7 +259,7 @@ module('Acceptance | exec', function(hooks) { ); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(6) .translateToString() .trim(), @@ -291,7 +291,7 @@ module('Acceptance | exec', function(hooks) { await settled(); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(4) .translateToString() .trim(), @@ -346,7 +346,7 @@ module('Acceptance | exec', function(hooks) { await settled(); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(5) .translateToString() .trim(), @@ -366,7 +366,7 @@ module('Acceptance | exec', function(hooks) { await settled(); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(6) .translateToString() .trim(), @@ -485,7 +485,7 @@ module('Acceptance | exec', function(hooks) { await settled(); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(6) .translateToString() .trim(), @@ -521,7 +521,7 @@ module('Acceptance | exec', function(hooks) { await settled(); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(4) .translateToString() .trim(), @@ -549,7 +549,7 @@ module('Acceptance | exec', function(hooks) { await settled(); assert.equal( - window.execTerminal.buffer + window.execTerminal.buffer.active .getLine(7) .translateToString() .trim(), diff --git a/ui/tests/integration/util/exec-command-editor-xterm-adapter-test.js b/ui/tests/integration/util/exec-command-editor-xterm-adapter-test.js index 13c579f34..d895cc41a 100644 --- a/ui/tests/integration/util/exec-command-editor-xterm-adapter-test.js +++ b/ui/tests/integration/util/exec-command-editor-xterm-adapter-test.js @@ -3,7 +3,7 @@ import { setupRenderingTest } from 'ember-qunit'; import { module, test } from 'qunit'; import { render, settled } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; -import { Terminal } from 'xterm-vendor'; +import { Terminal } from 'xterm'; import KEYS from 'nomad-ui/utils/keys'; module('Integration | Utility | exec-command-editor-xterm-adapter', function(hooks) { @@ -42,7 +42,7 @@ module('Integration | Utility | exec-command-editor-xterm-adapter', function(hoo await settled(); assert.equal( - terminal.buffer + terminal.buffer.active .getLine(0) .translateToString() .trim(), @@ -84,11 +84,11 @@ module('Integration | Utility | exec-command-editor-xterm-adapter', function(hoo await settled(); - assert.equal(terminal.buffer.cursorY, 0); - assert.equal(terminal.buffer.cursorX, 10); + assert.equal(terminal.buffer.active.cursorY, 0); + assert.equal(terminal.buffer.active.cursorX, 10); assert.equal( - terminal.buffer + terminal.buffer.active .getLine(0) .translateToString() .trim(), @@ -124,7 +124,7 @@ module('Integration | Utility | exec-command-editor-xterm-adapter', function(hoo await settled(); assert.equal( - terminal.buffer + terminal.buffer.active .getLine(0) .translateToString() .trim(), diff --git a/ui/tests/integration/util/exec-socket-xterm-adapter-test.js b/ui/tests/integration/util/exec-socket-xterm-adapter-test.js index c303d98ec..be7ed37bf 100644 --- a/ui/tests/integration/util/exec-socket-xterm-adapter-test.js +++ b/ui/tests/integration/util/exec-socket-xterm-adapter-test.js @@ -3,7 +3,7 @@ import { setupRenderingTest } from 'ember-qunit'; import { module, test } from 'qunit'; import { render, settled } from '@ember/test-helpers'; import hbs from 'htmlbars-inline-precompile'; -import { Terminal } from 'xterm-vendor'; +import { Terminal } from 'xterm'; module('Integration | Utility | exec-socket-xterm-adapter', function(hooks) { setupRenderingTest(hooks); @@ -149,7 +149,7 @@ module('Integration | Utility | exec-socket-xterm-adapter', function(hooks) { await settled(); assert.equal( - terminal.buffer + terminal.buffer.active .getLine(0) .translateToString() .trim(), diff --git a/ui/yarn.lock b/ui/yarn.lock index 56705ed72..3dd0a32e1 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -16,6 +16,13 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/code-frame@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" + integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== + dependencies: + "@babel/highlight" "^7.8.3" + "@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.3.3", "@babel/core@^7.3.4": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.0.tgz#248fd6874b7d755010bfe61f557461d4f446d9e9" @@ -97,6 +104,16 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" + integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== + dependencies: + "@babel/types" "^7.9.6" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -180,6 +197,15 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/template" "^7.8.3" + "@babel/types" "^7.9.5" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -187,6 +213,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-get-function-arity@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" + integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-hoist-variables@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" @@ -311,6 +344,18 @@ dependencies: "@babel/types" "^7.4.4" +"@babel/helper-split-export-declaration@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" + integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== + dependencies: + "@babel/types" "^7.8.3" + +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -348,6 +393,15 @@ esutils "^2.0.2" js-tokens "^4.0.0" +"@babel/highlight@^7.8.3": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" + integrity sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ== + dependencies: + "@babel/helper-validator-identifier" "^7.9.0" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.3.4", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b" @@ -358,6 +412,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.2.tgz#205e9c95e16ba3b8b96090677a67c9d6075b70a1" integrity sha512-mdFqWrSPCmikBoaBYMuBulzTIKuXVPtEISFbRRVNwMWpCms/hmE2kRq0bblUHaNRKrjRlmVbx1sDHmjmRgD2Xg== +"@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" + integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -1040,6 +1099,15 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.0" +"@babel/template@^7.8.3": + version "7.8.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" + integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.8.6" + "@babel/types" "^7.8.6" + "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.6": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.4.0.tgz#14006967dd1d2b3494cdd650c686db9daf0ddada" @@ -1085,6 +1153,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.7.0": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" + integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.2.0": version "7.4.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.4.0.tgz#670724f77d24cce6cc7d8cf64599d511d164894c" @@ -1121,6 +1204,15 @@ lodash "^4.17.11" to-fast-properties "^2.0.0" +"@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.5", "@babel/types@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" + integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@cnakazawa/watch@^1.0.3": version "1.0.3" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef" @@ -2965,6 +3057,18 @@ babel-core@^6.10.4, babel-core@^6.24.1, babel-core@^6.26.0, babel-core@^6.26.3: slash "^1.0.0" source-map "^0.5.7" +babel-eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232" + integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + eslint-visitor-keys "^1.0.0" + resolve "^1.12.0" + babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" @@ -13350,6 +13454,13 @@ resolve@^1.10.0, resolve@^1.3.3, resolve@^1.8.1: dependencies: path-parse "^1.0.6" +resolve@^1.12.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + responselike@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -15628,10 +15739,10 @@ xterm-addon-fit@^0.3.0: resolved "https://registry.yarnpkg.com/xterm-addon-fit/-/xterm-addon-fit-0.3.0.tgz#341710741027de9d648a9f84415a01ddfdbbe715" integrity sha512-kvkiqHVrnMXgyCH9Xn0BOBJ7XaWC/4BgpSWQy3SueqximgW630t/QOankgqkvk11iTOCwWdAY9DTyQBXUMN3lw== -xterm@^4.2.0-vscode1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.4.0.tgz#5915d3c4c8800fadbcf555a0a603c672ab9df589" - integrity sha512-JGIpigWM3EBWvnS3rtBuefkiToIILSK1HYMXy4BCsUpO+O4UeeV+/U1AdAXgCB6qJrnPNb7yLgBsVCQUNMteig== +xterm@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/xterm/-/xterm-4.6.0.tgz#1b49b32e546409c110fbe8ece0b4a388504a937d" + integrity sha512-98211RIDrAECqpsxs6gbilwMcxLtxSDIvtzZUIqP1xIByXtuccJ4pmMhHGJATZeEGe/reARPMqwPINK8T7jGZg== y18n@^4.0.0: version "4.0.0"