Flip the lazy loading switch for all engines and remove browserify

loading overlay would stick on login sometimes

first update for auto importer

add required unsafe eval

remove project level xterm loading

ansi up

lazy-load dot-object

lazy load marked

Move logger models out of logging engine, it prevents lazy loading

add auto-importer config to logging

semver & json2yaml

lazy load pretty cron

lazy load shell quote

bug - typo in function name

remove debugger

lint and bugs

add shellquote constant to deal with undef error

Remove async from global and load module properly

add ignore file for silver-searcher

auto-import d3 lib

auto-import Identicon

auto-import jquery growl

update jsondiffpatch and auto-import

Remove unneeded voids

ember-auto-load jszip

pipeline bug

Refactor verify-auth route for lazy engines

auto-import to all engines/addons

auto-import momentjs

auto-import yaml

auto-import file-saver

update globals

bugs

review changes

yarn lock

move bable option back into the right place

bug fixes

decouple dependencies for nodes engine

decouple dependencies for global-admin

decouple dependencies for login engine

decouple dependencies for alerts engine

decouple dependencies for logging engine

decouple dependencies for pipeline engine

Lint sync and fix

review bugs

updates for rebase
This commit is contained in:
Westly Wright 2018-08-29 13:26:09 -07:00
parent 5aede14acd
commit 4ace4f0411
No known key found for this signature in database
GPG Key ID: 4FAB3D8673DC54A3
94 changed files with 2405 additions and 2168 deletions

View File

@ -6,3 +6,4 @@ server/*
tmp/*
vendor/*
bower.js
ember-cli-build.js

View File

@ -27,9 +27,11 @@ const propertyOrder = [
module.exports = {
root: true,
parser: 'babel-eslint',
parserOptions: {
ecmaVersion: 2017,
sourceType: "module"
sourceType: "module",
allowImportExportEverywhere: true
},
extends: [
"eslint:recommended",
@ -37,30 +39,15 @@ module.exports = {
],
globals: {
"$": true,
"-Promise": true,
"ALY": true,
"AWS": true,
"AnsiUp": true,
"Identicon": true,
"Prism": true,
"ShellQuote": true,
"Stripe": true,
"Terminal": true,
"Ui": true,
"WebSocket": true,
"YAML": true,
"_": true,
"async": true,
"commonmark": true,
"d3": true,
"document": true,
"jQuery": true,
"jsondiffpatch": true,
"md5": true,
"moment": true,
"navigator": true,
"window": true,
"ipaddr": true,
},
env: {
browser: true,

44
.ignore Normal file
View File

@ -0,0 +1,44 @@
# compiled output
/dist
/tmp
# dependencies
/node_modules
/bower_components
# misc
/.sass-cache
/connect.lock
/coverage/*
/libpeerconnection.log
npm-debug.log
testem.log
.DS_Store
.tern-port
.tern-project
.vscode
.vscodeignore
.jsbeautifyrc
jsconfig.json
/typings
.env
.floo
.flooignore
GPATH
GRTAGS
GTAGS
*.code-workspace
.dir-locals.el
*.swp
*~
\#.*
.python-version
\#*
.\#*
*.org
yarn-error.log
yarn.lock
/vendor/*.js

View File

@ -2,10 +2,6 @@ import Application from '@ember/application';
import Resolver from './resolver';
import loadInitializers from 'ember-load-initializers';
import config from './config/environment';
import jsyaml from 'npm:js-yaml';
// init jsyaml for codemirror, can't directly import npm module from addon `shared`
window.jsyaml || (window.jsyaml = jsyaml);
const App = Application.extend({
modulePrefix: config.modulePrefix,

View File

@ -1,4 +1,4 @@
import { cancel, next, scheduleOnce, schedule } from '@ember/runloop';
import { cancel, next, schedule } from '@ember/runloop';
import { inject as service } from '@ember/service';
import Route from '@ember/routing/route';
import C from 'ui/utils/constants';
@ -78,9 +78,9 @@ export default Route.extend({
duration: 100,
queue: false,
easing: 'linear',
complete: function() { // eslint-disable-line
complete: schedule('afterRender', function() { // eslint-disable-line
$('#loading-overlay').stop().show().fadeIn({duration: 200, queue: false, easing: 'linear'}); // eslint-disable-line
}
})
});
});
}
@ -98,9 +98,9 @@ export default Route.extend({
duration: 200,
queue: false,
easing: 'linear',
complete: function() { // eslint-disable-line
complete: schedule('afterRender', function() { // eslint-disable-line
$('#loading-underlay').stop().fadeOut({duration: 100, queue: false, easing: 'linear'}); // eslint-disable-line
}
})
});
});
}
@ -111,10 +111,7 @@ export default Route.extend({
set(this, 'hideTimer', next(hide));
} else {
// console.log('Loading finished', id, get(this, 'loadingId'));
// needed to set this to run after render as there was wierdness wiht new register page
scheduleOnce('afterRender', () => {
hide();
});
hide();
}
}
});

View File

@ -1,13 +1,13 @@
<div class="shell-popup">
{{container-shell
instance=model
command=command
windows=windows
containerName=containerName
showProtip=false
cols=80
rows=24
dismiss=(action "cancel")
disconncted=(action "cancel")
instance=model
command=command
windows=windows
containerName=containerName
showProtip=false
cols=80
rows=24
dismiss=(action "cancel")
disconncted=(action "cancel")
}}
</div>

View File

@ -1,15 +1,16 @@
import { next } from '@ember/runloop';
import { set, get, observer } from '@ember/object';
import { set, setProperties, get, observer } from '@ember/object';
import { inject as service } from '@ember/service';
import Component from '@ember/component';
import Util from 'ui/utils/util';
import { alternateLabel } from 'ui/utils/platform';
import layout from './template';
import AnsiUp from 'npm:ansi_up';
import C from 'ui/utils/constants';
const LINES = 500;
var AnsiUp = null;
export default Component.extend({
scope: service(),
prefs: service(),
@ -30,19 +31,15 @@ export default Component.extend({
init() {
this._super(...arguments);
const containerName = get(this, 'containerName') || get(this, 'instance.containers.firstObject.name');
const wrapLines = !!get(this, `prefs.${ C.PREFS.WRAP_LINES }`);
if (AnsiUp) {
this._bootstrap();
} else {
import('ansi_up').then( (module) => {
AnsiUp = module.default;
set(this, 'wrapLines', wrapLines);
set(this, 'containerName', containerName);
const followTimer = setInterval(() => {
if ( get(this, 'isFollow') ) {
this.send('scrollToBottom');
}
}, 1000);
set(this, 'followTimer', followTimer);
this._bootstrap();
});
}
},
didInsertElement() {
@ -114,6 +111,25 @@ export default Component.extend({
set(this, `prefs.${ C.PREFS.WRAP_LINES }`, get(this, 'wrapLines'));
}),
_bootstrap() {
setProperties(this, {
wrapLines: !!get(this, `prefs.${ C.PREFS.WRAP_LINES }`),
containerName: get(this, 'containerName') || get(this, 'instance.containers.firstObject.name'),
})
this._initTimer();
},
_initTimer() {
const followTimer = setInterval(() => {
if ( get(this, 'isFollow') ) {
this.send('scrollToBottom');
}
}, 1000);
set(this, 'followTimer', followTimer);
},
exec() {
var instance = get(this, 'instance');
const clusterId = get(this, 'scope.currentCluster.id');
@ -143,7 +159,7 @@ export default Component.extend({
};
socket.onmessage = (message) => {
let ansiup = new AnsiUp.default;
let ansiup = new AnsiUp;
set(this, 'status', 'connected');
const data = AWS.util.base64.decode(message.data).toString();

View File

@ -6,6 +6,7 @@ import { isSafari } from 'ui/utils/platform';
import { evaluate } from 'shared/utils/evaluate';
import { inject as service } from '@ember/service';
import layout from './template';
import YAML from 'yamljs';
const HIDDEN = 'Hidden';

View File

@ -1,8 +1,9 @@
import { isArray } from '@ember/array';
import TextField from '@ember/component/text-field';
import ShellQuote from 'npm:shell-quote'
import layout from './template';
const ShellQuote = window.ShellQuote;
export const OPS = ['||', '&&', ';;', '|&', '&', ';', '(', ')', '|', '<', '>'];
export function reop(xs) {
return xs.map((s) => {

View File

@ -3,9 +3,11 @@ import { computed, get, set } from '@ember/object';
import { isSafari } from 'ui/utils/platform';
import { next } from '@ember/runloop';
import { inject as service } from '@ember/service';
import json2yaml from 'npm:json2yaml';
import dotObject from 'npm:dot-object';
import json2yaml from 'json2yaml';
import layout from './template';
import YAML from 'yamljs';
var dotObject = null;
function convertKey(key) {
let out = '';
@ -32,6 +34,17 @@ export default Component.extend({
accept: '.yml, .yaml',
app: null,
init() {
this._super(...arguments);
if (!dotObject) {
import('dot-object').then( (module) => {
dotObject = module.default;
});
}
},
actions: {
upload() {
this.$('INPUT[type=file]')[0].click();

View File

@ -7,6 +7,7 @@ import layout from './template';
import {
get, set, computed, observer, setProperties
} from '@ember/object';
import moment from 'moment';
export default Component.extend(ModalBase, NewOrEdit, {
endpointService: service('endpoint'),

View File

@ -2,7 +2,7 @@ import Component from '@ember/component';
import { get, set, observer } from '@ember/object';
import { inject as service } from '@ember/service';
import CodeMirror from 'codemirror';
import jsyaml from 'npm:js-yaml';
import jsyaml from 'js-yaml';
import ModalBase from 'shared/mixins/modal-base';
import layout from './template';
import ChildHook from 'shared/mixins/child-hook';

View File

@ -2,6 +2,8 @@ import { get, set, computed } from '@ember/object';
import Component from '@ember/component';
import ModalBase from 'shared/mixins/modal-base';
import layout from './template';
import jsondiffpatch from 'jsondiffpatch';
import moment from 'moment';
const HIDDEN_FIELDS = ['digest'];

View File

@ -4,6 +4,9 @@ import Component from '@ember/component';
import ModalBase from 'shared/mixins/modal-base';
import layout from './template';
import C from 'shared/utils/constants';
import moment from 'moment';
import jsondiffpatch from 'jsondiffpatch';
const HIDDEN_FIELDS = ['created', 'creatorId', 'name', 'ownerReferences', 'removed', 'scale', 'state', 'uuid', 'workloadLabels', 'workloadAnnotations'];

View File

@ -11,7 +11,7 @@ import C from 'ui/utils/constants';
import Util from 'ui/utils/util';
import { compare as compareVersion } from 'ui/utils/parse-version';
import { task } from 'ember-concurrency';
import YAML from 'npm:yamljs';
import YAML from 'yamljs';
import layout from './template';
import { stringifyAnswer } from 'shared/utils/evaluate';
import { isEmpty } from '@ember/utils';

View File

@ -4,6 +4,12 @@ import Component from '@ember/component';
import { GRADIENT_COLORS } from 'shared/components/svg-gradients/component';
import { formatPercent, formatMib, formatKbps }
from 'ui/utils/util';
import {
select,
scale,
min as d3Min,
max as d3Max,
} from 'd3';
import layout from './template';
const FORMATTERS = {
@ -20,31 +26,31 @@ export default Component.extend({
classNames: ['spark-line'],
attributeBindings: ['cssSize:style'],
data: null,
width: null,
height: 20,
margin: 2,
data: null,
width: null,
height: 20,
margin: 2,
min: 0,
min: 0,
minMax: null, // lower bound on how small automatic max can be
max: null, // set an explicit max
maxDoubleInital: false, // if true, set max to double the initial non-zero data point
scaleDown: false, // if true, max is allowed to go back down. If false it can only go up.
gradient: null,
colorIdx: 0,
interpolation: 'basis', // 'step-after',
formatter: 'value',
gradient: null,
colorIdx: 0,
interpolation: 'basis', // 'step-after',
formatter: 'value',
svg: null,
line: null,
dot: null,
text: null,
textBg: null,
x: null,
y: null,
observedMax: null, // The largest max seen so far
svg: null,
line: null,
dot: null,
text: null,
textBg: null,
x: null,
y: null,
observedMax: null, // The largest max seen so far
hasData: function() {
if (this.get('data.length') > 0 && !this.get('svg')) {
@ -93,8 +99,8 @@ export default Component.extend({
x.domain([0, data.get('length') - 1]);
x.range([0, width - margin]);
var min = this.get('min') === null ? d3.min(data) : this.get('min');
var max = this.adjustMax(d3.max(data));
var min = this.get('min') === null ? d3Min(data) : this.get('min');
var max = this.adjustMax(d3Max(data));
y.domain([min, max]);
y.range([height - margin, margin]);
@ -125,14 +131,14 @@ export default Component.extend({
}.observes('data', 'data.[]'),
create() {
let margin = this.get('margin');
var svg = d3.select(this.$()[0])
var svg = select(this.$()[0])
.attr('transform', `translate(${ margin },${ margin })`);
this.set('svg', svg);
this.set('x', d3.scale.linear());
this.set('y', d3.scale.linear());
this.set('x', scale.linear());
this.set('y', scale.linear());
var line = d3.svg.line()
var line = svg.line()
.defined((d) => (typeof d === 'number'))
.x((d, i) => this.get('x')(i))
.y((d) => this.get('y')(d));

View File

@ -1,4 +1,5 @@
import Component from '@ember/component';
import { select } from 'd3';
import layout from './template';
export const GRADIENT_COLORS = {
@ -12,7 +13,7 @@ export default Component.extend({
layout,
tagName: '',
didInsertElement() {
var svg = d3.select('body').append('svg:svg')
var svg = select('body').append('svg:svg')
.attr('id', 'svg-gradients')
.attr('height', '0')
.attr('height', '0')

View File

@ -2,6 +2,17 @@ import { get } from '@ember/object';
import Route from '@ember/routing/route';
export default Route.extend({
beforeModel() {
if (window.ShellQuote) {
return;
} else {
return import('shell-quote').then( (module) => {
window.ShellQuote = module.default;
return module.default;
})
}
},
model(params) {
const pod = get(this, 'store').find('pod', params.container_id);

View File

@ -11,6 +11,18 @@ export default Route.extend({
clusterStore: service(),
globalStore: service(),
beforeModel() {
if (window.Prettycron) {
return;
} else {
return import('prettycron').then( (module) => {
window.Prettycron = module;
return module;
});
}
},
model(params/* , transition*/) {
var store = get(this, 'store');

View File

@ -54,17 +54,17 @@
</div>
{{else}}
{{container/new-edit
loggingEnabled=model.loggingEnabled
scaleMode=dataMap.scaleMode
isUpgrade=dataMap.isUpgrade
service=dataMap.workload
launchConfig=dataMap.container
launchConfigIndex=launchConfigIndex
done=(action 'done')
cancel=(action 'cancel')
editing=false
primaryResource=dataMap.workload
primaryService=dataMap.workload
allHosts=dataMap.allHosts
loggingEnabled=model.loggingEnabled
scaleMode=dataMap.scaleMode
isUpgrade=dataMap.isUpgrade
service=dataMap.workload
launchConfig=dataMap.container
launchConfigIndex=launchConfigIndex
done=(action 'done')
cancel=(action 'cancel')
editing=false
primaryResource=dataMap.workload
primaryService=dataMap.workload
allHosts=dataMap.allHosts
}}
{{/if}}

View File

@ -1,4 +1,4 @@
import Resource from 'ember-api-store/models/resource';
import modelMixin from 'logging/mixins/logging-model';
import modelMixin from 'ui/mixins/logging-model';
export default Resource.extend(modelMixin, { type: 'clusterlogging', });

View File

@ -3,6 +3,7 @@ import { inject as service } from '@ember/service';
import { get, computed } from '@ember/object';
import { hash } from 'rsvp';
import C from 'ui/utils/constants';
import moment from 'moment';
export default Resource.extend({
growl: service(),

View File

@ -3,6 +3,7 @@ import { inject as service } from '@ember/service';
import Resource from 'ember-api-store/models/resource';
import C from 'ui/utils/constants';
import { get, computed } from '@ember/object'
import Identicon from 'identicon.js';
var Principal = Resource.extend({
intl: service(),

View File

@ -1,5 +1,5 @@
import Resource from 'ember-api-store/models/resource';
import modelMixin from 'logging/mixins/logging-model';
import modelMixin from 'ui/mixins/logging-model';
const ProjectLogging = Resource.extend(modelMixin, { type: 'projectlogging', });

View File

@ -3,6 +3,7 @@ import { get, set, computed } from '@ember/object';
import { hasMany } from 'ember-api-store/utils/denormalize';
import { next } from '@ember/runloop'
import Resource from 'ember-api-store/models/resource';
import Identicon from 'identicon.js';
export default Resource.extend({
router: service(),

View File

@ -12,18 +12,17 @@ export default Route.extend(VerifyAuth, {
model(params/* , transition */) {
if (window.opener && !get(params, 'login')) {
let occName = get(params, 'config') ? `security.authentication.${ get(params, 'config') }` : `security.authentication.github`;
let openerController = window.opener.lc(occName);
let openerStore = get(openerController, 'globalStore');
let qp = get(params, 'config') || get(params, 'authProvider');
let type = `${ qp }Config`;
let config = openerStore.getById(type, qp);
let gh = get(this, 'github');
let stateMsg = 'Authorization state did not match, please try again.';
let openersGithub = window.opener.ls('github');
let openerStore = window.opener.ls('globalStore');
let qp = get(params, 'config') || get(params, 'authProvider');
let type = `${ qp }Config`;
let config = openerStore.getById(type, qp);
let gh = get(this, 'github');
let stateMsg = 'Authorization state did not match, please try again.';
if (get(params, 'config') === 'github') {
return gh.testConfig(config).then((resp) => {
gh.authorize(resp, openerController.get('github.state'));
gh.authorize(resp, openersGithub.get('state'));
})
.catch((err) => {
this.send('gotError', err);
@ -37,8 +36,7 @@ export default Route.extend(VerifyAuth, {
}
if (get(params, 'code')) {
// TODO see if session.githubState works here
if (openerController.get('github').stateMatches(get(params, 'state'))) {
if (openersGithub.stateMatches(get(params, 'state'))) {
reply(params.error_description, params.code);
} else {
reply(stateMsg);

View File

@ -3,6 +3,18 @@ import { hash } from 'rsvp';
import Route from '@ember/routing/route';
export default Route.extend({
beforeModel() {
if (window.ShellQuote) {
return;
} else {
return import('shell-quote').then( (module) => {
window.ShellQuote = module.default;
return module.default;
})
}
},
model(params) {
return hash({ workload: this.get('store').find('workload', params.workload_id), }).then((hash) => EmberObject.create(hash));
},

View File

@ -62,11 +62,11 @@ module.exports = function(environment) {
minifyCSS: {
enabled: false
enabled: false
},
minifyJS: {
enabled: false
enabled: false
},
contentSecurityPolicy: {
@ -79,7 +79,8 @@ module.exports = function(environment) {
'frame-src': "'self' releases.rancher.com",
// Allow connect to anywhere, for console and event stream socket
'connect-src': '*'
'connect-src': '*',
'unsafe-eval': "'self' releases.rancher.com"
},
APP: {

View File

@ -1,6 +1,7 @@
/* eslint-env node */
const EmberApp = require('ember-cli/lib/broccoli/ember-app');
const env = EmberApp.env();
const webpack = require('webpack');
module.exports = function(defaults) {
// Pull in a few useful environment settings for index.html to use
@ -16,6 +17,9 @@ module.exports = function(defaults) {
});
var app = new EmberApp(defaults, {
babel: {
plugins: [ require('ember-auto-import/babel-plugin') ]
},
'ember-cli-babel': { includePolyfill: true, },
storeConfigInMeta: false,
inlineContent: inline,
@ -32,7 +36,34 @@ module.exports = function(defaults) {
}
}
},
nodeAssets: { 'xterm': { import: ['dist/xterm.css'] } },
autoImport: {
alias: {
'xterm-fit': 'node_modules/xterm/dist/addons/fit/fit.js'
},
webpack: {
externals: { jquery: 'jQuery' },
node: {
fs: 'empty'
},
plugins: [
new webpack.EnvironmentPlugin({
LATER_COV: false
}),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
],
}
},
assetLoader: {
generateURI(filePath) {
// we need to slice the trailing slash off baseAssets because filePath has a leading slash
const url = appConfig.baseAssets.slice(0, -1);
// console.log('file path: ', `${ url }${ filePath }`);
return `${ url }${ filePath }`;
}
},
SRI: { enabled: false, },
@ -70,44 +101,24 @@ module.exports = function(defaults) {
// modules that you would like to import into your application
// please specify an object with the list of modules as keys
// along with the exports of each module as its value.
app.import('node_modules/async/dist/async.js');
app.import('node_modules/d3/d3.js');
app.import('node_modules/identicon.js/pnglib.js');
app.import('node_modules/identicon.js/identicon.js');
app.import('node_modules/jgrowl/jquery.jgrowl.css');
app.import('node_modules/jgrowl/jquery.jgrowl.js');
app.import('node_modules/jsondiffpatch/public/build/jsondiffpatch.js');
app.import('node_modules/jsondiffpatch/public/build/jsondiffpatch-formatters.js');
app.import('node_modules/jszip/dist/jszip.js')
app.import('node_modules/moment/moment.js');
app.import('node_modules/prismjs/prism.js');
app.import('node_modules/prismjs/components/prism-bash.js');
app.import('node_modules/prismjs/components/prism-yaml.js');
app.import('node_modules/prismjs/components/prism-json.js');
app.import('node_modules/ember-source/dist/ember-template-compiler.js');
app.import('node_modules/ipaddr.js/lib/ipaddr.js');
app.import('node_modules/xterm/dist/xterm.js');
app.import('node_modules/xterm/dist/addons/fit/fit.js', {
using: [{
transformation: 'amd',
as: 'xterm-fit'
}]
});
app.import('node_modules/jsondiffpatch/dist/formatters-styles/html.css');
app.import('node_modules/xterm/dist/xterm.css');
app.import('vendor/icons/style.css');
// app.import('vendor/aws-sdk-ec2.js');
app.import('node_modules/ember-source/dist/ember-template-compiler.js');
app.import('vendor/aws-sdk-ec2-iam-2.279.1.min.js');
app.import('vendor/ember-shortcuts.js');
app.import('vendor/file-saver/fileSaver.mini.js');
app.import('vendor/aliyun-sdk.js');
app.import('vendor/icons/fonts/rancher-icons.svg', { destDir: 'assets/fonts/' });
app.import('vendor/icons/fonts/rancher-icons.ttf', { destDir: 'assets/fonts/' });
app.import('vendor/icons/fonts/rancher-icons.woff', { destDir: 'assets/fonts/' });
app.import('vendor/icons/style.css');
app.import('vendor/json-sanitizer/json-sanitizer.js');
app.import('vendor/prompt/prompt-v1-latin-300.woff', { destDir: 'assets/fonts/' });
app.import('vendor/prompt/prompt-v1-latin-300.woff2', { destDir: 'assets/fonts/' });
app.import('vendor/prompt/prompt-v1-latin-600.woff', { destDir: 'assets/fonts/' });
app.import('vendor/prompt/prompt-v1-latin-600.woff2', { destDir: 'assets/fonts/' });
app.import('vendor/aliyun-sdk.js');
return app.toTree();
};

View File

@ -1,5 +1,6 @@
import { get, set, observer, setProperties } from '@ember/object';
import Component from '@ember/component'
import moment from 'moment';
export default Component.extend({

View File

@ -1,4 +1,6 @@
/* eslint-env node */
/* eslint-disable */
const webpack = require('webpack');
'use strict';
const EngineAddon = require('ember-engines/lib/engine-addon');
@ -6,9 +8,12 @@ const EngineAddon = require('ember-engines/lib/engine-addon');
module.exports = EngineAddon.extend({
name: 'alert',
lazyLoading: { enabled: false },
lazyLoading: { enabled: true },
isDevelopingAddon() {
return true;
},
options: {
babel: { plugins: [require('ember-auto-import/babel-plugin')] }
}
});

View File

@ -5,13 +5,11 @@
"ember-engine"
],
"dependencies": {
"ember-basic-dropdown": "*",
"ember-math-helpers": "*",
"ember-auto-import": "*",
"ember-truth-helpers": "*",
"ember-intl": "*",
"ember-cli-htmlbars": "*",
"ember-cli-babel": "*",
"ember-cli-clipboard": "*",
"ember-href-to": "*"
},
"ember-addon": {

View File

@ -1,4 +1,6 @@
/* eslint-env node */
/* eslint-disable */
const webpack = require('webpack');
'use strict';
const EngineAddon = require('ember-engines/lib/engine-addon');
@ -6,9 +8,12 @@ const EngineAddon = require('ember-engines/lib/engine-addon');
module.exports = EngineAddon.extend({
name: 'global-admin',
lazyLoading: { enabled: false },
lazyLoading: { enabled: true },
isDevelopingAddon() {
return true;
},
options: {
babel: { plugins: [require('ember-auto-import/babel-plugin')] }
}
});

View File

@ -5,20 +5,10 @@
"ember-engine"
],
"dependencies": {
"async": "*",
"jgrowl": "*",
"momentjs": "*",
"card": "*",
"d3": "*",
"ember-basic-dropdown": "*",
"ember-math-helpers": "*",
"ember-truth-helpers": "*",
"ember-auto-import": "*",
"ember-cli-htmlbars": "*",
"ember-cli-babel": "*",
"ember-cli-clipboard": "*",
"ember-href-to": "*",
"ember-concurrency": "*",
"marked": "*"
"ember-cli-babel": "*"
},
"ember-addon": {
"paths": [

View File

@ -1,6 +1,7 @@
import Component from '@ember/component'
import { alias } from '@ember/object/computed'
import { get, set, computed, setProperties } from '@ember/object'
import moment from 'moment';
const SEVERITIES = [
{

View File

@ -2,6 +2,7 @@ import Mixin from '@ember/object/mixin';
import { inject as service } from '@ember/service';
import { alias } from '@ember/object/computed';
import { get, set } from '@ember/object'
import moment from 'moment';
export default Mixin.create({
scope: service(),

View File

@ -1 +0,0 @@
export { default } from 'logging/models/clusterlogging';

View File

@ -1 +0,0 @@
export { default } from 'logging/models/projectlogging';

View File

@ -1,4 +1,6 @@
/* eslint-env node */
/* eslint-disable */
const webpack = require('webpack');
'use strict';
const EngineAddon = require('ember-engines/lib/engine-addon');
@ -6,9 +8,12 @@ const EngineAddon = require('ember-engines/lib/engine-addon');
module.exports = EngineAddon.extend({
name: 'logging',
lazyLoading: { enabled: false },
lazyLoading: { enabled: true },
isDevelopingAddon() {
return true;
},
options: {
babel: { plugins: [require('ember-auto-import/babel-plugin')] }
}
});

View File

@ -5,13 +5,12 @@
"ember-engine"
],
"dependencies": {
"ember-auto-import": "*",
"ember-basic-dropdown": "*",
"ember-math-helpers": "*",
"ember-truth-helpers": "*",
"ember-intl": "*",
"ember-cli-htmlbars": "*",
"ember-cli-babel": "*",
"ember-cli-clipboard": "*",
"ember-href-to": "*"
},
"ember-addon": {

View File

@ -1,4 +1,6 @@
/* eslint-env node */
/* eslint-disable */
const webpack = require('webpack');
'use strict';
const EngineAddon = require('ember-engines/lib/engine-addon');
@ -6,9 +8,12 @@ const EngineAddon = require('ember-engines/lib/engine-addon');
module.exports = EngineAddon.extend({
name: 'login',
lazyLoading: { enabled: false },
lazyLoading: { enabled: true },
isDevelopingAddon() {
return true;
},
options: {
babel: { plugins: [require('ember-auto-import/babel-plugin')] }
}
});

View File

@ -5,11 +5,9 @@
"ember-engine"
],
"dependencies": {
"ember-basic-dropdown": "*",
"ember-truth-helpers": "*",
"ember-auto-import": "*",
"ember-cli-htmlbars": "*",
"ember-cli-babel": "*",
"ember-cli-clipboard": "*"
"ember-cli-babel": "*"
},
"ember-addon": {
"paths": [

View File

@ -4,6 +4,7 @@ import { get, set } from '@ember/object';
import { ajaxPromise } from 'ember-api-store/utils/ajax-promise';
import Component from '@ember/component';
import layout from './template';
import { eachSeries } from 'async';
let RANCHER_GROUP = 'rancher-machine';
let DEFAULT_TEMPLATE = 'Linux Ubuntu 16.04 LTS 64-bit';
@ -251,7 +252,7 @@ export default Component.extend(Driver, {
protocol: 'TCP'
});
return async.eachSeries(
return eachSeries(
RANCHER_INGRESS_RULES,
(item, cb) => {
item.securitygroupid =
@ -464,4 +465,4 @@ export default Component.extend(Driver, {
true
);
}
});
});

View File

@ -1,4 +1,6 @@
/* eslint-env node */
/* eslint-disable */
const webpack = require('webpack');
'use strict';
const EngineAddon = require('ember-engines/lib/engine-addon');
@ -6,9 +8,12 @@ const EngineAddon = require('ember-engines/lib/engine-addon');
module.exports = EngineAddon.extend({
name: 'nodes',
lazyLoading: { enabled: false },
lazyLoading: { enabled: true },
isDevelopingAddon() {
return true;
},
options: {
babel: { plugins: [require('ember-auto-import/babel-plugin')] }
}
});

View File

@ -5,20 +5,9 @@
"ember-engine"
],
"dependencies": {
"async": "*",
"jgrowl": "*",
"momentjs": "*",
"card": "*",
"d3": "*",
"ember-basic-dropdown": "*",
"ember-math-helpers": "*",
"ember-truth-helpers": "*",
"ember-auto-import": "*",
"ember-cli-htmlbars": "*",
"ember-cli-babel": "*",
"ember-cli-clipboard": "*",
"ember-href-to": "*",
"ember-concurrency": "*",
"marked": "*"
"ember-cli-babel": "*"
},
"ember-addon": {
"paths": [

View File

@ -21,11 +21,12 @@
</div>
<div class="row mb-10">
{{input-yaml
showUpload=false
showDownload=false
canChangeName=false
value=config
autoResize=true
showUpload=false
showDownload=false
canChangeName=false
value=config
autoResize=true
loading=loading
}}
</div>
{{copy-to-clipboard tooltipText="" buttonText="copyToClipboard.tooltip" clipboardText=config class="with-clip"}}

View File

@ -111,6 +111,9 @@ export default Component.extend({
promptDisable() {
set(this, 'confirmDisable', true);
later(this, function() {
if ( this.isDestroyed || this.isDestroying ) {
return;
}
set(this, 'confirmDisable', false);
}, 10000);
},

View File

@ -1,4 +1,6 @@
import Helper from '@ember/component/helper';
import moment from 'moment';
export function dateDuration(params) {
let time = moment.duration(params[0]);

View File

@ -1,4 +1,6 @@
/* eslint-env node */
/* eslint-disable */
const webpack = require('webpack');
'use strict';
const EngineAddon = require('ember-engines/lib/engine-addon');
@ -6,9 +8,13 @@ const EngineAddon = require('ember-engines/lib/engine-addon');
module.exports = EngineAddon.extend({
name: 'pipeline',
lazyLoading: { enabled: false },
lazyLoading: { enabled: true },
isDevelopingAddon() {
return true;
},
options: {
babel: { plugins: [require('ember-auto-import/babel-plugin')] }
}
});

View File

@ -5,22 +5,15 @@
"ember-engine"
],
"dependencies": {
"ember-basic-dropdown": "*",
"ember-math-helpers": "*",
"ember-truth-helpers": "*",
"ember-auto-import": "*",
"ember-intl": "*",
"ember-cli": "*",
"ember-cli-htmlbars": "*",
"ember-cli-babel": "*",
"ember-cli-clipboard": "*",
"ember-href-to": "*",
"ember-browserify": "*",
"ember-cli-babel": "*",
"ember-cli-htmlbars": "*",
"ember-drag-drop": "*",
"ember-intl": "*",
"ember-truth-helpers": "*",
"prettycron": "*"
"ember-drag-drop": "*"
},
"ember-addon": {
"paths": [

View File

@ -7,6 +7,7 @@ import layout from './template';
import { inject as service } from '@ember/service';
import { hash } from 'rsvp';
import { on } from '@ember/object/evented';
import ipaddr from 'ipaddr.js';
import {
sizes,

View File

@ -10,8 +10,8 @@ import { underlineToCamel, removeEmpty, keysToCamel, validateEndpoint } from 'sh
import { validateHostname } from 'ember-api-store/utils/validate';
import C from 'shared/utils/constants';
import YAML from 'npm:yamljs';
import json2yaml from 'npm:json2yaml';
import YAML from 'yamljs';
import json2yaml from 'json2yaml';
import layout from './template';
import { resolve } from 'rsvp';
import { isEmpty } from '@ember/utils';

View File

@ -1,6 +1,10 @@
import Component from '@ember/component';
import layout from './template';
import { observer } from '@ember/object'
import prismjs from 'prismjs';
import 'prismjs/components/prism-bash';
import 'prismjs/components/prism-yaml';
import 'prismjs/components/prism-json';
export default Component.extend({
layout,
@ -14,6 +18,7 @@ export default Component.extend({
classNameBindings: ['languageClass', 'hide:hide', 'constrained:constrained'],
highlighted: null,
didReceiveAttrs() {
this.highlightedChanged();
},
@ -21,8 +26,9 @@ export default Component.extend({
highlightedChanged: observer('language', 'code', function() {
var lang = this.get('language');
this.set('highlighted', Prism.highlight(this.get('code') || '', Prism.languages[lang], lang));
this.set('highlighted', prismjs.highlight(this.get('code') || '', prismjs.languages[lang], lang));
}),
languageClass: function() {
var lang = this.get('language');

View File

@ -5,6 +5,7 @@ import Component from '@ember/component';
import { alternateLabel } from 'ui/utils/platform';
import ModalBase from 'ui/mixins/modal-base';
import layout from './template';
import { eachLimit } from 'async';
export default Component.extend(ModalBase, {
@ -26,7 +27,7 @@ export default Component.extend(ModalBase, {
confirm() {
const resources = get(this, 'resources').slice().reverse();
async.eachLimit(resources, 5, (resource, cb) => {
eachLimit(resources, 5, (resource, cb) => {
if ( !resource ) {
return cb();
}

View File

@ -6,9 +6,12 @@ import * as fit from 'xterm-fit'
import { next } from '@ember/runloop';
import layout from './template';
import Component from '@ember/component';
import Terminal from 'xterm';
const DEFAULT_COMMAND = ['/bin/sh', '-c', 'TERM=xterm-256color; export TERM; [ -x /bin/bash ] && ([ -x /usr/bin/script ] && /usr/bin/script -q -c "/bin/bash" /dev/null || exec /bin/bash) || exec /bin/sh'];
// var Terminal = null;
export default Component.extend(ThrottledResize, {
scope: service(),
@ -31,9 +34,7 @@ export default Component.extend(ThrottledResize, {
init() {
this._super(...arguments);
const containerName = get(this, 'containerName') || get(this, 'instance.containers.firstObject.name');
set(this, 'containerName', containerName);
this._bootstrap();
},
didInsertElement() {
@ -64,6 +65,10 @@ export default Component.extend(ThrottledResize, {
return (get(this, 'instance.containers') || []).filterBy('state', 'running');
}),
_bootstrap() {
set(this, 'containerName', get(this, 'containerName') || get(this, 'instance.containers.firstObject.name'));
},
fit() {
var term = get(this, 'term');
var socket = get(this, 'socket');

View File

@ -3,6 +3,7 @@ import layout from './template';
import { inject as service } from '@ember/service';
import { get, set, computed } from '@ember/object';
import { next } from '@ember/runloop';
import Identicon from 'identicon.js';
let missingPrincipals = [];

View File

@ -8,7 +8,7 @@ import { Promise as EmberPromise, all } from 'rsvp';
import ThrottledResize from 'shared/mixins/throttled-resize';
import { downloadFile } from 'shared/utils/download-files';
import CodeMirror from 'codemirror';
import jsyaml from 'npm:js-yaml';
import jsyaml from 'js-yaml';
export default Component.extend(ThrottledResize, {
settings: service(),
@ -39,6 +39,13 @@ export default Component.extend(ThrottledResize, {
shouldChangeName: true,
init() {
this._super(...arguments);
// needed for code mirror???
window.jsyaml || (window.jsyaml = jsyaml);
},
actions: {
click() {
this.$('INPUT[type=file]')[0].click();

View File

@ -1,15 +1,32 @@
// https://github.com/ef4/ember-browserify#the-workaround
import Marked from 'npm:marked'; // eslint-disable-line no-unused-vars
import Component from '@ember/component';
import layout from './template';
import { htmlSafe } from '@ember/string';
import { get, computed } from '@ember/object';
var Marked = null;
export default Component.extend({
layout,
markdown: null,
init() {
this._super(...arguments);
if (!Marked) {
import('marked').then( (module) => {
Marked = module.default;
get(this, 'parsedMarkdown');
});
}
},
parsedMarkdown: computed('markdown', function() {
return htmlSafe(Marked(get(this, 'markdown')));
})
let out = '';
if (Marked) {
out = htmlSafe(Marked(get(this, 'markdown')));
}
return out;
}),
});

View File

@ -4,7 +4,7 @@ import { get, set, computed, observer } from '@ember/object';
import NewOrEdit from 'ui/mixins/new-or-edit';
import { inject as service } from '@ember/service';
import CodeMirror from 'codemirror';
import jsyaml from 'npm:js-yaml';
import jsyaml from 'js-yaml';
import ModalBase from 'shared/mixins/modal-base';
import fetchYaml from 'shared/utils/fetch-yaml';
import layout from './template';

View File

@ -8,6 +8,7 @@ import { inject as service } from '@ember/service';
import { alias } from '@ember/object/computed';
import { next } from '@ember/runloop';
import C from 'ui/utils/constants';
import Identicon from 'identicon.js';
const BASIC_ROLES = [
{

View File

@ -1,6 +1,6 @@
import Service, { inject as service } from '@ember/service';
// @@TODO@@ - 10-27-17 - move errors to addon
import Errors from 'ui/utils/errors';
import 'jgrowl';
export default Service.extend({
app: service(),

View File

@ -1,4 +1,5 @@
import Helper from '@ember/component/helper';
import moment from 'moment';
export function dateCalendar(params, options) {
let out = moment(params[0]).calendar();

View File

@ -1,5 +1,6 @@
import { helper } from '@ember/component/helper';
import { htmlSafe } from '@ember/string';
import moment from 'moment';
export function dateFromNow(params) {
let d = moment(params[0]);

View File

@ -1,4 +1,5 @@
import { helper } from '@ember/component/helper';
import moment from 'moment';
export function dateCalendar(params) {
let date = moment(params[0]);

View File

@ -1,4 +1,5 @@
import { helper } from '@ember/component/helper';
import moment from 'moment';
export function dateStr(params, options) {
var format = 'MMM DD, YYYY hh:mm:ss A';

View File

@ -1,7 +1,7 @@
import { helper } from '@ember/component/helper';
import { htmlSafe } from '@ember/string';
import Ember from 'ember';
import urlRegex from 'npm:url-regex';
import urlRegex from 'url-regex';
const MAX_LENGTH = 1000;

View File

@ -1,5 +1,6 @@
import Helper from '@ember/component/helper';
import Prettycron from 'npm:prettycron';
const Prettycron = window.Prettycron;
function prettyCronHelper(param) {
if (!param[0]) {

View File

@ -1,4 +1,5 @@
import { helper } from '@ember/component/helper';
import moment from 'moment';
export function runTime(params) {
var s = moment(params[0]);

View File

@ -5,7 +5,7 @@ import {
import Mixin from '@ember/object/mixin';
import C from 'ui/utils/constants';
import { inject as service } from '@ember/service';
import Semver from 'npm:semver';
import Semver from 'semver';
const NONE = 'none',
LOADING = 'loading',

View File

@ -7,6 +7,7 @@ import C from 'shared/utils/constants';
import { minorVersion } from 'shared/utils/parse-version';
import { get, set, computed, observer } from '@ember/object';
import { isEmpty } from '@ember/utils';
import { eachLimit } from 'async';
export function normalizeName(str) {
return str; // .replace(/\./g, C.SETTING.DOT_CHAR).toLowerCase();
@ -106,7 +107,7 @@ export default Service.extend(Evented, {
var globalStore = get(this, 'globalStore');
var promise = new EmberPromise((resolve, reject) => {
async.eachLimit(names, 3, (name, cb) => {
eachLimit(names, 3, (name, cb) => {
globalStore
.find('setting', denormalizeName(name))
.then(() => {

View File

@ -1,8 +1,10 @@
import { select } from 'd3';
export default function initGraph(options) {
const {
el, r, width, height, margin, fontSize
} = getConfig(options);
const svg = d3.select(el).append('svg').attr('width', width).attr('height', height);
const svg = select(el).append('svg').attr('width', width).attr('height', height);
const healthyStatus = options.healthy ? 'healthy' : 'unhealthy';

View File

@ -1,16 +1,18 @@
import fetchYaml from 'shared/utils/fetch-yaml';
import { all } from 'rsvp';
import { addQueryParam } from 'shared/utils/util';
import JSZip from 'jszip';
import { saveAs } from 'file-saver';
export function downloadFile(fileName, content, contentType = 'text/plain;charset=utf-8') {
const blob = new Blob([content], { type: contentType });
window.saveAs(blob, fileName);
saveAs(blob, fileName);
}
// [{name: 'file1', file: 'data'}, {name: 'file2', file: 'data2'}]
export function generateZip(files) {
const zip = new window.JSZip();
const zip = new JSZip();
for ( let i = 0 ; i < files.length ; i++ ) {
let file = files[i];

View File

@ -5,6 +5,14 @@ import {
formatKbps
} from 'shared/utils/util';
import initTooltip from 'shared/utils/graph-tooltip';
import {
min as d3Min,
max as d3Max,
select as d3Select,
scale as d3Scale,
svg as d3Svg
} from 'd3';
const FORMATTERS = {
value: (value) => value,
@ -30,26 +38,26 @@ export default function initGraph(options) {
maxPoints, formatter, fields, gradient, interpolate, min, query, interval
} = getConfig(options);
const graph = d3.select(el).append('svg')
const graph = d3Select(el).append('svg')
.attr('width', width + margin.left + margin.right)
.attr('height', height + margin.top + margin.bottom);
const svg = graph.append('g').attr('transform', `translate(${ margin.left },${ margin.top })`);
const x = d3.scale.linear().domain([0, maxPoints - 1]).range([0, width]);
const y = d3.scale.linear().domain([0, 1]).range([height, 0]);
const x = d3Scale.linear().domain([0, maxPoints - 1]).range([0, width]);
const y = d3Scale.linear().domain([0, 1]).range([height, 0]);
const line = d3.svg.line().interpolate(interpolate)
const line = d3Svg.line().interpolate(interpolate)
.defined((d) => typeof d === 'number')
.x((d, i) => x(i))
.y((d) => y(d));
const area = d3.svg.area().interpolate(interpolate)
const area = d3Svg.area().interpolate(interpolate)
.defined((d) => typeof d === 'number')
.x((d, i) => x(i))
.y0(height)
.y1((d) => y(d));
const yAxis = d3.svg.axis().scale(y).orient('left')
const yAxis = d3Svg.axis().scale(y).orient('left')
.ticks(yTicks)
.tickFormat(FORMATTERS[formatter]);
const yAxisG = svg.append('g').attr('class', 'y axis').call(yAxis);
@ -202,8 +210,8 @@ function updateAxis(all, params) {
if (all.length === 0) {
return;
}
const min = params.min === null ? d3.min(all) : params.min;
const max = adjustMax(d3.max(all), params.options);
const min = params.min === null ? d3Min(all) : params.min;
const max = adjustMax(d3Max(all), params.options);
const update = params.y.domain()[0] !== min || params.y.domain()[1] !== max
params.y.domain([min, max]);

View File

@ -1,3 +1,5 @@
import { select } from 'd3';
export default function initTooltip(options) {
const hoverLineGroup = options.svg.append('g')
.attr('class', 'hover-line');
@ -10,7 +12,7 @@ export default function initTooltip(options) {
hoverLine.classed('hide', true);
const tooltip = d3.select(options.el).append('div')
const tooltip = select(options.el).append('div')
.attr('class', 'hover-label')
.style('opacity', 0);

View File

@ -1,5 +1,5 @@
import Util from 'shared/utils/util';
import Semver from 'npm:semver';
import Semver from 'semver';
export function satisfies(version, range) {
// Semver doesn't take padding zeros like 17.03.1

View File

@ -1,9 +1,11 @@
import { select, event, svg } from 'd3';
export default function initGraph(options) {
const {
el, width, height, margin, thickness, fontSize
} = getConfig(options);
const svg = d3.select(el).append('svg')
const svg = select(el).append('svg')
.attr('width', width).attr('height', height);
let value = options.value;
@ -73,10 +75,10 @@ function repaintArc(width, margin, value, thickness, valuePath, maxPath) {
}
function addTooltip() {
let tooltip = d3.select('#percent-gauge-tooltip');
let tooltip = select('#percent-gauge-tooltip');
if (tooltip.empty()) {
tooltip = d3.select('body').append('div')
tooltip = select('body').append('div')
.attr('class', 'hover-label')
.attr('class', 'percent-gauge-tooltip')
.attr('id', 'percent-gauge-tooltip')
@ -176,8 +178,8 @@ function addTicks(svg, tooltip, width, height, margin, ticks, currentValue, thic
${ tr }
</tbody>
</table>`)
.style('left', `${ (d3.event.pageX) - 30 }px`)
.style('top', `${ (d3.event.pageY) - 30 * (tick.labels.length + 1) }px`);
.style('left', `${ (event.pageX) - 30 }px`)
.style('top', `${ (event.pageY) - 30 * (tick.labels.length + 1) }px`);
}).on('mouseout', () => {
tooltip.transition()
.duration(500)
@ -232,7 +234,7 @@ function createArc(sa, ea, r, thickness, start = 0) {
ea = 2.7 * parseInt(ea, 10) - 135;
sa = 2.7 * parseInt(start, 10) - 135;
return d3.svg.arc()
return svg.arc()
.outerRadius(r)
.innerRadius(r - thickness)
.startAngle(d2r(sa))

View File

@ -2,7 +2,7 @@
import { formatSi } from './parse-unit';
import { isEmpty } from '@ember/utils';
import { isArray } from '@ember/array';
// import ipaddr from 'ipaddr.js';
import ipaddr from 'ipaddr.js';
export function arrayDiff(a, b) {
return a.filter((i) => {

View File

@ -1,2 +1 @@
import json2yaml from 'npm:json2yaml'; // eslint-disable-line no-unused-vars
export { default } from 'shared/components/cluster-options-rke/component';
export { default } from 'shared/components/cluster-options-rke/component';

View File

@ -1,3 +1 @@
// https://github.com/ef4/ember-browserify#the-workaround
import Terminal from 'npm:xterm'; // eslint-disable-line no-unused-vars
export { default } from 'shared/components/container-shell/component';

View File

@ -1,3 +1 @@
// https://github.com/ef4/ember-browserify#the-workaround
import Marked from 'npm:marked'; // eslint-disable-line no-unused-vars
export { default } from 'shared/components/marked-down/component';

View File

@ -1,3 +1,3 @@
// https://github.com/ef4/ember-browserify#the-workaround
import urlRegex from 'npm:url-regex'; // eslint-disable-line no-unused-vars
import urlRegex from 'url-regex'; // eslint-disable-line no-unused-vars
export { default } from 'shared/helpers/linkify';

View File

@ -1,3 +1 @@
// https://github.com/ef4/ember-browserify#the-workaround
import Prettycron from 'npm:prettycron'; // eslint-disable-line no-unused-vars
export { default } from 'shared/helpers/pretty-cron';

View File

@ -1,5 +1,3 @@
// https://github.com/ef4/ember-browserify#the-workaround
import Semver from 'npm:semver'; // eslint-disable-line no-unused-vars
export {
satisfies, parse, comparePart, compare, minorVersion
} from 'shared/utils/parse-version';

View File

@ -1,4 +1,6 @@
/* eslint-env node */
/* eslint-disable */
const webpack = require('webpack');
'use strict';
module.exports = {
@ -6,5 +8,25 @@ module.exports = {
isDevelopingAddon() {
return true;
},
options: {
babel: { plugins: [require('ember-auto-import/babel-plugin')] },
autoImport: {
alias: {
'xterm-fit': 'node_modules/xterm/dist/addons/fit/fit.js'
},
webpack: {
externals: { jquery: 'jQuery' },
node: {
fs: 'empty'
},
plugins: [
new webpack.EnvironmentPlugin({
LATER_COV: false
}),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
],
}
},
}
};

View File

@ -4,24 +4,34 @@
"ember-addon"
],
"dependencies": {
"ansi_up": "*",
"async": "*",
"ember-api-store": "*",
"ember-auto-import": "*",
"ember-basic-dropdown": "*",
"ember-math-helpers": "*",
"ember-truth-helpers": "*",
"ember-cli-babel": "*",
"ember-cli-clipboard": "*",
"ember-cli-htmlbars": "*",
"ember-cli-pagination": "*",
"ember-cli-babel": "*",
"ember-math-helpers": "*",
"ember-truth-helpers": "*",
"ember-wormhole": "*",
"file-saver": "*",
"identicon.js": "*",
"ipaddr.js": "*",
"ivy-codemirror": "*",
"jgrowl": "*",
"json2yaml": "*",
"jsyaml": "*",
"jszip": "*",
"liquid-fire": "*",
"marked": "*",
"prettycron": "*",
"prismjs": "*",
"semver": "*",
"shell-quote": "*",
"url-regex": "*",
"yamljs": "*",
"xterm": "*",
"ivy-codemirror": "*",
"jsyaml": "*",
"dot-object": "*",
"json2yaml": "*"
"xterm-fit": "*",
"yamljs": "*"
}
}

View File

@ -25,6 +25,7 @@
"devDependencies": {
"ansi_up": "^2.0.2",
"async": "2.1.2",
"babel-eslint": "^9.0.0",
"broccoli-asset-rev": "^2.7.0",
"card": "2.4.0",
"d3": "3.5.17",
@ -32,8 +33,8 @@
"dotenv": "^6.0.0",
"ember-api-store": "2.7.2",
"ember-assign-helper": "^0.1.2",
"ember-auto-import": "^1.2.13",
"ember-basic-dropdown": "^1.0.0",
"ember-browserify": "^1.2.0",
"ember-cli": "~3.3.0",
"ember-cli-app-version": "^3.0.0",
"ember-cli-babel": "^6.12.0",
@ -44,7 +45,6 @@
"ember-cli-htmlbars-inline-precompile": "^1.0.2",
"ember-cli-inject-live-reload": "^1.8.2",
"ember-cli-inline-content": "^0.4.0",
"ember-cli-node-assets": "^0.2.2",
"ember-cli-pagination": "^3.1.1",
"ember-cli-qunit": "^4.3.2",
"ember-cli-release": "^0.2.9",
@ -57,7 +57,8 @@
"ember-concurrency": "^0.8.16",
"ember-copy": "^1.0.0",
"ember-credit-card": "^2.4.0",
"ember-engines": "^0.5.20",
"ember-drag-drop": "^0.4.7",
"ember-engines": "^0.5.22",
"ember-export-application-global": "^2.0.0",
"ember-href-to": "^1.13.0",
"ember-intl": "^2.31.1",
@ -70,33 +71,34 @@
"ember-wormhole": "0.5.2",
"eslint-plugin-ember": "^5.2.0",
"express": "^4.8.5",
"file-saver": "^1.3.8",
"forever-agent": "^0.6.1",
"glob": "^7.1.2",
"http-proxy": "^1.16.2",
"identicon.js": "^2.3.2",
"ipaddr.js": "^1.8.1",
"ivy-codemirror": "^2.1.0",
"jgrowl": "~1.4.2",
"js-yaml": "^3.12.0",
"json2yaml": "^1.1.0",
"jsondiffpatch": "^0.2.4",
"jsondiffpatch": "^0.3.11",
"jszip": "^3.1.5",
"liquid-fire": "^0.29.2",
"loader.js": "^4.7.0",
"marked": "^0.3.15",
"moment": "~2.22.1",
"prismjs": "^1.14.0",
"prettycron": "^0.10.0",
"prismjs": "^1.15.0",
"qunit-dom": "^0.6.2",
"semver": "^5.4.1",
"shell-quote": "^1.6.1",
"url-regex": "^4.1.1",
"xterm": "^3.7.0",
"webpack": "^4.12.0",
"yamljs": "^0.3.0"
},
"dependencies": {
"body-parser": "^1.18.2",
"ember-drag-drop": "^0.4.7",
"ivy-codemirror": "^2.1.0",
"mysql": "^2.15.0",
"prettycron": "^0.10.0",
"request": "^2.83.0",
"sendgrid": "^4.7.1",
"stripe": "^4.15.0"

View File

@ -1,10 +1,39 @@
const propertyOrder = [
'service',
'controller',
'query-params',
'attribute',
'relationship',
'property',
'single-line-function',
'init',
'beforeModel',
'model',
'afterModel',
'redirect',
'setupController',
'resetController',
['lifecycle-hook','activate','deactivate','didDestroyElement',
'didInsertElement','didReceiveAttrs','didRender','didUpdate',
'didUpdateAttrs','renderTemplate','serialize','setupController',
'willClearRender','willDestroyElement','willInsertElement','willRender','willUpdate'
],
'actions',
'observer',
'multi-line-function'
];
module.exports = {
env: {
embertest: true
},
parser: 'babel-eslint',
parserOptions: {
ecmaVersion: 2017,
sourceType: "module"
sourceType: "module",
allowImportExportEverywhere: true
},
extends: [
"eslint:recommended",
@ -12,27 +41,13 @@ module.exports = {
],
globals: {
"$": true,
"-Promise": true,
"ALY": true,
"AWS": true,
"AnsiUp": true,
"Identicon": true,
"Prism": true,
"ShellQuote": true,
"Stripe": true,
"Terminal": true,
"Ui": true,
"WebSocket": true,
"YAML": true,
"_": true,
"async": true,
"commonmark": true,
"d3": true,
"document": true,
"jQuery": true,
"jsondiffpatch": true,
"md5": true,
"moment": true,
"navigator": true,
"window": true,
},
@ -50,12 +65,14 @@ module.exports = {
"ember/no-observers": "off",
"ember/no-on-calls-in-components": "off",
"ember/no-side-effects": "off",
"ember/order-in-components": "off",
"ember/order-in-controllers": "off",
"ember/order-in-models": "off",
"ember/order-in-routes": "off",
"ember/no-old-shims": "error",
"ember/order-in-components": ["error", { order: propertyOrder }],
"ember/order-in-controllers": ["error", { order: propertyOrder }],
"ember/order-in-models": ["error", { order: propertyOrder }],
"ember/order-in-routes": ["error", { order: propertyOrder }],
"ember/use-brace-expansion": "off",
"ember/use-ember-get-and-set": "off",
"ember/new-module-imports": "error",
"eqeqeq": "error",
"generator-star-spacing": "off",
"guard-for-in": "off",
@ -63,7 +80,7 @@ module.exports = {
"new-cap": "off",
"no-caller": "error",
"no-cond-assign": [ "error", "except-parens" ],
"no-console": "warn",
"no-console": "off",
"no-debugger": "warn",
"no-empty": "off",
"no-eq-null": "error",
@ -79,6 +96,7 @@ module.exports = {
//stylistic
"array-bracket-spacing": "error",
"padded-blocks": [ "error", "never" ],
"block-spacing": [ "error", "always" ],
"brace-style": [ "error", "1tbs" ],
"comma-spacing": "error",
@ -99,22 +117,40 @@ module.exports = {
} ],
"keyword-spacing": "error",
"lines-between-class-members": "error",
"newline-per-chained-call": "error",
"newline-per-chained-call": ["error", { "ignoreChainWithDepth": 4 }],
"no-whitespace-before-property": "error",
"object-curly-newline": [ "error", {
"ObjectExpression": { "multiline": true, "minProperties": 3 },
"ObjectPattern": { "multiline": true, "minProperties": 3 },
"ImportDeclaration": { "multiline": true, "minProperties": 3 },
"ImportDeclaration": { "multiline": true, "minProperties": 5 },
"ExportDeclaration": { "multiline": true, "minProperties": 3 }
} ],
"object-curly-spacing": [ "error", "always" ],
"object-property-newline": "error",
"padded-blocks": "error",
"padding-line-between-statements": [
"error",
{
"blankLine": "always",
"prev": "*",
"next": "return",
},
// This configuration would require blank lines after every sequence of variable declarations
{
blankLine: "always",
prev: ["const", "let", "var"],
next: "*"
},
{
blankLine: "any",
prev: ["const", "let", "var"],
next: ["const", "let", "var"]
}
],
quotes: [
"error",
"single",
{
"avoidEscape": true,
"avoidEscape": true,
"allowTemplateLiterals": true
},
],
@ -128,7 +164,6 @@ module.exports = {
"switch-colon-spacing": "error",
// ECMAScript 6
"arrow-body-style": [ "error", "as-needed" ],
"arrow-parens": "error",
"arrow-spacing": [ "error", { "before": true, "after": true } ],
"no-trailing-spaces": "error",
@ -136,7 +171,6 @@ module.exports = {
"prefer-arrow-callback": "error",
"prefer-template": "error",
"rest-spread-spacing": "error",
// "sort-imports": "error",
"template-curly-spacing": [ "error", "always" ],
"yield-star-spacing": [ "error", "both" ],
}

View File

@ -1,7 +1,5 @@
import { run } from '@ember/runloop';
export default function destroyApp(application) {
run(application, 'destroy');
}

View File

@ -4,26 +4,19 @@ import startApp from '../helpers/start-app';
import destroyApp from '../helpers/destroy-app';
export default function(name, options = {}) {
module(name, {
beforeEach() {
this.application = startApp();
if (options.beforeEach) {
return options.beforeEach.apply(this, arguments);
}
},
afterEach() {
let afterEach = options.afterEach && options.afterEach.apply(this, arguments);
return resolve(afterEach).then(() => destroyApp(this.application));
return resolve(afterEach).then(() => destroyApp(this.application));
}
});
}

View File

@ -4,17 +4,16 @@ import { merge } from '@ember/polyfills';
import { run } from '@ember/runloop';
export default function startApp(attrs) {
let attributes = merge({}, config.APP);
attributes = merge(attributes, attrs); // use defaults, but you can override;
return run(() => {
let application = Application.create(attributes);
application.setupForTesting();
application.injectTestHelpers();
return application;
});
}

View File

@ -1 +0,0 @@
var saveAs=saveAs||function(view){"use strict";if(typeof view==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var doc=view.document,get_URL=function(){return view.URL||view.webkitURL||view},save_link=doc.createElementNS("http://www.w3.org/1999/xhtml","a"),can_use_save_link="download"in save_link,click=function(node){var event=new MouseEvent("click");node.dispatchEvent(event)},is_safari=/constructor/i.test(view.HTMLElement)||view.safari,is_chrome_ios=/CriOS\/[\d]+/.test(navigator.userAgent),setImmediate=view.setImmediate||view.setTimeout,throw_outside=function(ex){setImmediate(function(){throw ex},0)},force_saveable_type="application/octet-stream",arbitrary_revoke_timeout=1e3*40,revoke=function(file){var revoker=function(){if(typeof file==="string"){get_URL().revokeObjectURL(file)}else{file.remove()}};setTimeout(revoker,arbitrary_revoke_timeout)},dispatch=function(filesaver,event_types,event){event_types=[].concat(event_types);var i=event_types.length;while(i--){var listener=filesaver["on"+event_types[i]];if(typeof listener==="function"){try{listener.call(filesaver,event||filesaver)}catch(ex){throw_outside(ex)}}}},auto_bom=function(blob){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)){return new Blob([String.fromCharCode(65279),blob],{type:blob.type})}return blob},FileSaver=function(blob,name,no_auto_bom){if(!no_auto_bom){blob=auto_bom(blob)}var filesaver=this,type=blob.type,force=type===force_saveable_type,object_url,dispatch_all=function(){dispatch(filesaver,"writestart progress write writeend".split(" "))},fs_error=function(){if((is_chrome_ios||force&&is_safari)&&view.FileReader){var reader=new FileReader;reader.onloadend=function(){var url=is_chrome_ios?reader.result:reader.result.replace(/^data:[^;]*;/,"data:attachment/file;");var popup=view.open(url,"_blank");if(!popup)view.location.href=url;url=undefined;filesaver.readyState=filesaver.DONE;dispatch_all()};reader.readAsDataURL(blob);filesaver.readyState=filesaver.INIT;return}if(!object_url){object_url=get_URL().createObjectURL(blob)}if(force){view.location.href=object_url}else{var opened=view.open(object_url,"_blank");if(!opened){view.location.href=object_url}}filesaver.readyState=filesaver.DONE;dispatch_all();revoke(object_url)};filesaver.readyState=filesaver.INIT;if(can_use_save_link){object_url=get_URL().createObjectURL(blob);setImmediate(function(){save_link.href=object_url;save_link.download=name;click(save_link);dispatch_all();revoke(object_url);filesaver.readyState=filesaver.DONE},0);return}fs_error()},FS_proto=FileSaver.prototype,saveAs=function(blob,name,no_auto_bom){return new FileSaver(blob,name||blob.name||"download",no_auto_bom)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(blob,name,no_auto_bom){name=name||blob.name||"download";if(!no_auto_bom){blob=auto_bom(blob)}return navigator.msSaveOrOpenBlob(blob,name)}}FS_proto.abort=function(){};FS_proto.readyState=FS_proto.INIT=0;FS_proto.WRITING=1;FS_proto.DONE=2;FS_proto.error=FS_proto.onwritestart=FS_proto.onprogress=FS_proto.onwrite=FS_proto.onabort=FS_proto.onerror=FS_proto.onwriteend=null;return saveAs}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this);

3718
yarn.lock

File diff suppressed because it is too large Load Diff