048572946c
* v3.20.2...v3.24.0 * Fix handle undefined outlet in route component * Don't use template helper for optional modal.open Using the optional-helper here will trigger a computation in the same runloop error. This is because we are setting the `modal`-property when the `<Ref>` component gets rendered which will update the `this.modal`-property which will then recompute the `optional`-helper leading to this error. Instead we will create an action that will call the `open`-method on the modal when it is defined. This gets rid of the double computation error as we will not access the modal property twice in the same runloop when `modal` is getting set. * Fix - fn needs to be passed function tab-nav We create functions in the component file instead so that fn-helper stops complaining about the need to pass a function. * Update ember-exam to 6.1 version "Makes it compatible" with ember-qunit v5 * scheduleOnce setMaxHeight paged-collection We need to schedule to get around double-computation error. * Fix - model.data is removed from ember-data This has been private API all along - we need to work around the removal. Reference: https://github.com/emberjs/data/pull/7338/files#diff-9a8746fc5c86fd57e6122f00fef3155f76f0f3003a24b53fb7c4621d95dcd9bfL1310 * Fix `propContains` instead of `deepEqual` policy Recent model.data works differently than iterating attributes. We use `propContains` instead of `deepEqual`. We are only interested in the properties we assert against and match the previous behavior with this change. * Fix `propContains` instead of `deepEqual` token * Better handling single-records repo test-helper `model.data` has been removed we need to handle proxies and model instances differently. * Fix remaining repository tests with propContains We don't want to match entire objects - we don't care about properties we haven't defined in the assertion. * Don't use template helper for optional modal.open Using a template helper will give us a recomputation error - we work around it by creating an explicit action on the component instead. * Await `I $verb the $pageObject object` step * Fix no more customization ember-can No need to customize, the helper handles destruction fine on its own. * Fix - don't pass `optional` functions to fn We will declare the functions on the component instead. This gives us the same behavior but no error from `fn`, which expects a function to be passed. * Fix - handle `undefined` state on validate modifier StateChart can yield out an undefined `state` we need to handle that in the validate modifier * Fix linting errors tests directory * Warn / turn off new ember linting issues We will tackle them one by one and don't want to autofix issues that could be dangerous to auto-fix. * Auto-fix linting issues * More linting configuration * Fix remaining linting issues * Fix linting issues new files after rebase * ui: Remove ember-cli-uglify config now we are using terser (#14574) Co-authored-by: John Cowen <johncowen@users.noreply.github.com>
256 lines
8.1 KiB
JavaScript
256 lines
8.1 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-peerings',
|
|
'consul-partitions',
|
|
'consul-nspaces',
|
|
'consul-hcp',
|
|
].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')
|
|
);
|
|
//
|
|
|
|
let 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',
|
|
],
|
|
},
|
|
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();
|
|
};
|