"use strict"; const EmberApp = require("ember-cli/lib/broccoli/ember-app"); const resolve = require("path").resolve; const mergeTrees = require("broccoli-merge-trees"); const concat = require("broccoli-concat"); const prettyTextEngine = require("./lib/pretty-text-engine"); const { createI18nTree } = require("./lib/translation-plugin"); const discourseScss = require("./lib/discourse-scss"); const funnel = require("broccoli-funnel"); const AssetRev = require("broccoli-asset-rev"); module.exports = function (defaults) { let discourseRoot = resolve("../../../.."); let vendorJs = discourseRoot + "/vendor/assets/javascripts/"; const isProduction = EmberApp.env().includes("production"); let app = new EmberApp(defaults, { autoRun: false, "ember-qunit": { insertContentForTestBody: false, }, sourcemaps: { // There seems to be a bug with brocolli-concat when sourcemaps are disabled // that causes the `app.import` statements below to fail in production mode. // This forces the use of `fast-sourcemap-concat` which works in production. enabled: true, }, autoImport: { forbidEval: true, }, fingerprint: { // Disabled here, but handled manually below when in production mode. // This is so we can apply a single AssetRev operation over the application and our additional trees enabled: false, }, SRI: { // We don't use SRI in Rails. Disable here to match: enabled: false, }, "ember-cli-terser": { enabled: isProduction, exclude: [ "**/test-*.js", "**/core-tests*.js", "**/highlightjs/*", "**/javascripts/*", ], }, // We need to build tests in prod for theme tests tests: true, }); // Patching a private method is not great, but there's no other way for us to tell // Ember CLI that we want the tests alone in a package without helpers/fixtures, since // we re-use those in the theme tests. app._defaultPackager.packageApplicationTests = function (tree) { let appTestTrees = [] .concat( this.packageEmberCliInternalFiles(), this.packageTestApplicationConfig(), tree ) .filter(Boolean); appTestTrees = mergeTrees(appTestTrees, { overwrite: true, annotation: "TreeMerger (appTestTrees)", }); let tests = concat(appTestTrees, { inputFiles: ["**/tests/**/*-test.js"], headerFiles: ["vendor/ember-cli/tests-prefix.js"], footerFiles: ["vendor/ember-cli/app-config.js"], outputFile: "/assets/core-tests.js", annotation: "Concat: Core Tests", sourceMapConfig: false, }); let testHelpers = concat(appTestTrees, { inputFiles: [ "**/tests/test-boot-ember-cli.js", "**/tests/helpers/**/*.js", "**/tests/fixtures/**/*.js", "**/tests/setup-tests.js", ], outputFile: "/assets/test-helpers.js", annotation: "Concat: Test Helpers", sourceMapConfig: false, }); return mergeTrees([tests, testHelpers]); }; // WARNING: We should only import scripts here if they are not in NPM. // For example: our very specific version of bootstrap-modal. app.import(vendorJs + "bootbox.js"); app.import(vendorJs + "bootstrap-modal.js"); app.import(vendorJs + "caret_position.js"); app.import("node_modules/ember-source/dist/ember-template-compiler.js", { type: "test", }); app.import(discourseRoot + "/app/assets/javascripts/polyfills.js"); app.import( discourseRoot + "/app/assets/javascripts/discourse/public/assets/scripts/module-shims.js" ); const mergedTree = mergeTrees([ discourseScss(`${discourseRoot}/app/assets/stylesheets`, "testem.scss"), createI18nTree(discourseRoot, vendorJs), app.toTree(), funnel(`${discourseRoot}/public/javascripts`, { destDir: "javascripts" }), funnel(`${vendorJs}/highlightjs`, { files: ["highlight-test-bundle.min.js"], destDir: "assets/highlightjs", }), concat(mergeTrees([app.options.adminTree]), { outputFile: `assets/admin.js`, }), prettyTextEngine(vendorJs, "discourse-markdown"), concat("public/assets/scripts", { outputFile: `assets/start-discourse.js`, headerFiles: [`start-app.js`], inputFiles: [`discourse-boot.js`], }), ]); if (isProduction) { return new AssetRev(mergedTree, { exclude: [ "javascripts/**/*", "assets/test-i18n*", "assets/highlightjs", "assets/testem.css", ], }); } else { return mergedTree; } };