1e26c1fe11
This commit moves our in-app LockSessions code into an external 'app', which can theoretically be side-loaded but for now it just makes for good isolation/code hygiene. Functionally, there is kind of one change here, and that is we only show the 'Lock Session' tab if you have permissions to see them. Currently as our UI authorization endpoint needs to be changed slightly to suit our usecase, you will always have permissions to see Lock Sessions as we hardcode the session:read to true (obvs this is a frontend thing, not a backend thing), so it doesn't really change anything from a user perspective. Also added very bare docs while I was here. Small note here, ideally we need to add the each individual tab depending on whether an 'app' is enabled or not instead of just permissions, ideally it would be done totally from The Outside rather than a can based conditional on the inside, just something else to be thinking about for the future.
263 lines
8.2 KiB
JavaScript
263 lines
8.2 KiB
JavaScript
/*eslint ember/no-jquery: "off", ember/no-global-jquery: "off"*/
|
|
'use strict';
|
|
const path = require('path');
|
|
const exists = require('fs').existsSync;
|
|
|
|
const Funnel = require('broccoli-funnel');
|
|
const mergeTrees = require('broccoli-merge-trees');
|
|
const EmberApp = require('ember-cli/lib/broccoli/ember-app');
|
|
const utils = require('./config/utils');
|
|
|
|
// const BroccoliDebug = require('broccoli-debug');
|
|
// const debug = BroccoliDebug.buildDebugCallback(`app:consul-ui`)
|
|
|
|
module.exports = function(defaults, $ = process.env) {
|
|
// available environments
|
|
// ['production', 'development', 'staging', 'test'];
|
|
|
|
$ = utils.env($);
|
|
const env = EmberApp.env();
|
|
const prodlike = ['production', 'staging'];
|
|
const devlike = ['development', 'staging'];
|
|
const sourcemaps = !['production'].includes(env) && !$('BABEL_DISABLE_SOURCEMAPS', false);
|
|
|
|
const trees = {};
|
|
const addons = {};
|
|
const outputPaths = {};
|
|
let excludeFiles = [];
|
|
|
|
const apps = [
|
|
'consul-ui',
|
|
'consul-acls',
|
|
'consul-lock-sessions',
|
|
'consul-partitions',
|
|
'consul-nspaces'
|
|
].map(item => {
|
|
return {
|
|
name: item,
|
|
path: path.dirname(require.resolve(`${item}/package.json`))
|
|
};
|
|
});
|
|
|
|
const babel = {
|
|
plugins: [
|
|
'@babel/plugin-proposal-object-rest-spread',
|
|
],
|
|
sourceMaps: sourcemaps ? 'inline' : false,
|
|
}
|
|
|
|
// setup up different build configuration depending on environment
|
|
if(!['test'].includes(env)) {
|
|
// exclude any component/pageobject.js files from anything but test
|
|
excludeFiles = excludeFiles.concat([
|
|
'components/**/pageobject.js',
|
|
'components/**/test-support.js',
|
|
'components/**/*.test-support.js',
|
|
'components/**/*.test.js',
|
|
])
|
|
}
|
|
|
|
|
|
if(['test', 'production'].includes(env)) {
|
|
// exclude our debug initializer, route and template
|
|
excludeFiles = excludeFiles.concat([
|
|
'instance-initializers/debug.js',
|
|
'routing/**/*-debug.js',
|
|
'helpers/**/*-debug.js',
|
|
'modifiers/**/*-debug.js',
|
|
'services/**/*-debug.js',
|
|
'templates/debug.hbs',
|
|
'components/debug/**/*.*'
|
|
])
|
|
// inspect *-debug configuration files for files to exclude
|
|
excludeFiles = apps.reduce(
|
|
(prev, item) => {
|
|
return ['services', 'routes'].reduce(
|
|
(prev, type) => {
|
|
const path = `${item.path}/vendor/${item.name}/${type}-debug.js`;
|
|
if(exists(path)) {
|
|
return Object.entries(JSON.parse(require(path)[type])).reduce(
|
|
(prev, [key, definition]) => {
|
|
if(typeof definition.class !== 'undefined') {
|
|
return prev.concat(`${definition.class.replace(`${item.name}/`, '')}.js`);
|
|
}
|
|
return prev;
|
|
},
|
|
prev
|
|
);
|
|
}
|
|
return prev;
|
|
},
|
|
prev
|
|
)
|
|
},
|
|
excludeFiles
|
|
);
|
|
// exclude any debug like addons from production or test environments
|
|
addons.blacklist = [
|
|
// exclude docfy
|
|
'@docfy/ember'
|
|
];
|
|
}
|
|
|
|
if(['production'].includes(env)) {
|
|
// everything apart from production is 'debug', including test
|
|
// which means this and everything it affects is never tested
|
|
babel.plugins.push(
|
|
['strip-function-call', {'strip': ['Ember.runInDebug']}]
|
|
)
|
|
}
|
|
|
|
//
|
|
(
|
|
function(apps) {
|
|
trees.app = mergeTrees([
|
|
new Funnel('app', { exclude: excludeFiles })
|
|
].concat(
|
|
apps.filter(item => exists(`${item.path}/app`)).map(item => new Funnel(`${item.path}/app`, {exclude: excludeFiles}))
|
|
), {
|
|
overwrite: true
|
|
});
|
|
trees.vendor = mergeTrees([
|
|
new Funnel('vendor'),
|
|
].concat(
|
|
apps.map(item => new Funnel(`${item.path}/vendor`))
|
|
));
|
|
}
|
|
// consul-ui will eventually be a separate app just like the others
|
|
// at which point we can remove this filter/extra scope
|
|
)(apps.filter(item => item.name !== 'consul-ui'));
|
|
//
|
|
|
|
const app = new EmberApp(
|
|
Object.assign({}, defaults, {
|
|
productionEnvironments: prodlike,
|
|
}),
|
|
{
|
|
trees: trees,
|
|
addons: addons,
|
|
outputPaths: outputPaths,
|
|
'ember-cli-babel': {
|
|
includePolyfill: true,
|
|
},
|
|
'ember-cli-string-helpers': {
|
|
only: ['capitalize', 'lowercase', 'truncate', 'uppercase', 'humanize', 'titleize', 'classify'],
|
|
},
|
|
'ember-cli-math-helpers': {
|
|
only: ['div'],
|
|
},
|
|
babel: babel,
|
|
autoImport: {
|
|
// allows use of a CSP without 'unsafe-eval' directive
|
|
forbidEval: true,
|
|
},
|
|
codemirror: {
|
|
keyMaps: ['sublime'],
|
|
addonFiles: [
|
|
'lint/lint.css',
|
|
'lint/lint.js',
|
|
'lint/json-lint.js',
|
|
'lint/yaml-lint.js',
|
|
'mode/loadmode.js',
|
|
],
|
|
},
|
|
'ember-cli-uglify': {
|
|
uglify: {
|
|
compress: {
|
|
keep_fargs: false,
|
|
},
|
|
},
|
|
},
|
|
sassOptions: {
|
|
implementation: require('sass'),
|
|
sourceMapEmbed: sourcemaps,
|
|
},
|
|
}
|
|
);
|
|
const build = function(path, options) {
|
|
const {root, ...rest} = options;
|
|
if(exists(`${root}/${path}`)) {
|
|
app.import(path, rest);
|
|
}
|
|
};
|
|
apps.forEach(item => {
|
|
build(`vendor/${item.name}/routes.js`, {
|
|
root: item.path,
|
|
outputFile: `assets/${item.name}/routes.js`,
|
|
});
|
|
build(`vendor/${item.name}/services.js`, {
|
|
root: item.path,
|
|
outputFile: `assets/${item.name}/services.js`,
|
|
});
|
|
if(devlike) {
|
|
build(`vendor/${item.name}/routes-debug.js`, {
|
|
root: item.path,
|
|
outputFile: `assets/${item.name}/routes-debug.js`,
|
|
});
|
|
build(`vendor/${item.name}/services-debug.js`, {
|
|
root: item.path,
|
|
outputFile: `assets/${item.name}/services-debug.js`,
|
|
});
|
|
}
|
|
});
|
|
// Use `app.import` to add additional libraries to the generated
|
|
// output files.
|
|
//
|
|
// If you need to use different assets in different
|
|
// environments, specify an object as the first parameter. That
|
|
// object's keys should be the environment name and the values
|
|
// should be the asset to use in that environment.
|
|
//
|
|
// If the library that you are including contains AMD or ES6
|
|
// 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.
|
|
|
|
// TextEncoder/Decoder polyfill. See assets/index.html
|
|
app.import('node_modules/text-encoding/lib/encoding.js', {
|
|
outputFile: 'assets/encoding.js',
|
|
});
|
|
app.import('node_modules/text-encoding/lib/encoding-indexes.js', {
|
|
outputFile: 'assets/encoding-indexes.js',
|
|
});
|
|
|
|
// CSS.escape polyfill
|
|
app.import('node_modules/css.escape/css.escape.js', { outputFile: 'assets/css.escape.js' });
|
|
|
|
// JSON linting support. Possibly dynamically loaded via CodeMirror linting. See components/code-editor.js
|
|
app.import('node_modules/jsonlint/lib/jsonlint.js', {
|
|
outputFile: 'assets/codemirror/mode/javascript/javascript.js',
|
|
});
|
|
app.import('node_modules/codemirror/mode/javascript/javascript.js', {
|
|
outputFile: 'assets/codemirror/mode/javascript/javascript.js',
|
|
});
|
|
|
|
// HCL/Ruby linting support. Possibly dynamically loaded via CodeMirror linting. See components/code-editor.js
|
|
app.import('node_modules/codemirror/mode/ruby/ruby.js', {
|
|
outputFile: 'assets/codemirror/mode/ruby/ruby.js',
|
|
});
|
|
|
|
// YAML linting support. Possibly dynamically loaded via CodeMirror linting. See components/code-editor.js
|
|
app.import('node_modules/js-yaml/dist/js-yaml.js', {
|
|
outputFile: 'assets/codemirror/mode/yaml/yaml.js',
|
|
});
|
|
app.import('node_modules/codemirror/mode/yaml/yaml.js', {
|
|
outputFile: 'assets/codemirror/mode/yaml/yaml.js',
|
|
});
|
|
// XML linting support. Possibly dynamically loaded via CodeMirror linting. See services/code-mirror/linter.js
|
|
app.import('node_modules/codemirror/mode/xml/xml.js', {
|
|
outputFile: 'assets/codemirror/mode/xml/xml.js',
|
|
});
|
|
// metrics-providers
|
|
app.import('vendor/metrics-providers/consul.js', {
|
|
outputFile: 'assets/metrics-providers/consul.js',
|
|
});
|
|
app.import('vendor/metrics-providers/prometheus.js', {
|
|
outputFile: 'assets/metrics-providers/prometheus.js',
|
|
});
|
|
app.import('vendor/init.js', {
|
|
outputFile: 'assets/init.js',
|
|
});
|
|
return app.toTree();
|
|
};
|