ember-source
Version:
A JavaScript framework for creating ambitious web applications
337 lines (310 loc) • 15.4 kB
JavaScript
'use strict';
const MergeTrees = require('broccoli-merge-trees');
const createFile = require('broccoli-file-creator');
const Funnel = require('broccoli-funnel');
const path = require('path');
const Overrides = require('./overrides');
const SupportedBrowsers = require('./browsers');
const fs = require('fs');
const useEmberModules = (() => {
// this doesn't go through the documented API of the @ember/optional-features
// package because that is available way too late for this.
let pkg = require(path.join(process.cwd(), 'package.json'));
let configDir = pkg['ember-addon']?.['configPath'] ?? 'config';
let optionalFeaturesPath = `./${configDir}/optional-features.json`;
if (fs.existsSync(optionalFeaturesPath)) {
return require(path.join(process.cwd(), optionalFeaturesPath))?.['use-ember-modules'] ?? false;
} else {
return false;
}
})();
const paths = {};
const absolutePaths = {};
function add(paths, name, path) {
Object.defineProperty(paths, name, {
configurable: false,
get: function () {
return path;
},
});
}
add(paths, 'prod', 'vendor/ember/ember.js');
add(paths, 'debug', 'vendor/ember/ember.js');
add(paths, 'testing', 'vendor/ember/ember-testing.js');
add(
absolutePaths,
'templateCompiler',
useEmberModules
? path.join(__dirname, '..', 'dist', 'packages', 'ember-template-compiler', 'index.js')
: path.join(__dirname, '..', 'dist', 'ember-template-compiler.js')
);
const { addonV1Shim } = require('/addon-shim');
const shim = addonV1Shim(path.join(__dirname, '..'), {
autoImportCompat: {
customizeMeta(meta) {
/* This whole hook is an ember-auto-import feature that only effects classic builds, not embroider builds. */
if (useEmberModules) {
// this is our forward-compatible mode where all of ember-source is
// handled by ember-auto-import, like a normal v2 addon.
//
// In this case, we need to inject an implicit-modules config to force
// all the traditionally-included modules to be included whether or not
// we see an import for them, because ember-auto-import does not have
// global visiblity of all imports in all v1 addons.
//
// This means ember-source is not tree-shakable on classic builds, but
// that's the normal status quo for classic builds. It's all
// tree-shakable on the current default build (@embroider/vite).
return {
...meta,
'implicit-modules': [
'./dist/packages//-internals/browser-environment/index.js',
'./dist/packages//-internals/container/index.js',
'./dist/packages//-internals/deprecations/index.js',
'./dist/packages//-internals/environment/index.js',
'./dist/packages//-internals/error-handling/index.js',
'./dist/packages//-internals/glimmer/index.js',
'./dist/packages//-internals/meta/index.js',
'./dist/packages//-internals/meta/lib/meta.js',
'./dist/packages//-internals/metal/index.js',
'./dist/packages//-internals/owner/index.js',
'./dist/packages//-internals/routing/index.js',
'./dist/packages//-internals/runtime/index.js',
'./dist/packages//-internals/runtime/lib/ext/rsvp.js',
'./dist/packages//-internals/runtime/lib/mixins/-proxy.js',
'./dist/packages//-internals/runtime/lib/mixins/comparable.js',
'./dist/packages//-internals/string/index.js',
'./dist/packages//-internals/utility-types/index.js',
'./dist/packages//-internals/utils/index.js',
'./dist/packages//-internals/views/index.js',
'./dist/packages//-internals/views/lib/compat/attrs.js',
'./dist/packages//-internals/views/lib/component_lookup.js',
'./dist/packages//-internals/views/lib/mixins/action_support.js',
'./dist/packages//-internals/views/lib/system/utils.js',
'./dist/packages//-internals/views/lib/views/core_view.js',
'./dist/packages//-internals/views/lib/views/states.js',
'./dist/packages//application/index.js',
'./dist/packages//application/instance.js',
'./dist/packages//application/lib/lazy_load.js',
'./dist/packages//application/namespace.js',
'./dist/packages//array/-internals.js',
'./dist/packages//array/index.js',
'./dist/packages//array/lib/make-array.js',
'./dist/packages//array/mutable.js',
'./dist/packages//array/proxy.js',
'./dist/packages//canary-features/index.js',
'./dist/packages//component/helper.js',
'./dist/packages//component/index.js',
'./dist/packages//component/template-only.js',
'./dist/packages//controller/index.js',
'./dist/packages//debug/index.js',
'./dist/packages//debug/lib/capture-render-tree.js',
'./dist/packages//debug/lib/deprecate.js',
'./dist/packages//debug/lib/handlers.js',
'./dist/packages//debug/lib/inspect.js',
'./dist/packages//debug/lib/testing.js',
'./dist/packages//debug/lib/warn.js',
'./dist/packages//debug/container-debug-adapter.js',
'./dist/packages//debug/data-adapter.js',
'./dist/packages//deprecated-features/index.js',
'./dist/packages//destroyable/index.js',
'./dist/packages//engine/index.js',
'./dist/packages//engine/instance.js',
'./dist/packages//engine/lib/engine-parent.js',
'./dist/packages//enumerable/index.js',
'./dist/packages//enumerable/mutable.js',
'./dist/packages//helper/index.js',
'./dist/packages//instrumentation/index.js',
'./dist/packages//modifier/index.js',
'./dist/packages//object/-internals.js',
'./dist/packages//object/compat.js',
'./dist/packages//object/computed.js',
'./dist/packages//object/core.js',
'./dist/packages//object/evented.js',
'./dist/packages//object/events.js',
'./dist/packages//object/index.js',
'./dist/packages//object/internals.js',
'./dist/packages//object/lib/computed/computed_macros.js',
'./dist/packages//object/lib/computed/reduce_computed_macros.js',
'./dist/packages//object/mixin.js',
'./dist/packages//object/observable.js',
'./dist/packages//object/observers.js',
'./dist/packages//object/promise-proxy-mixin.js',
'./dist/packages//object/proxy.js',
'./dist/packages//owner/index.js',
'./dist/packages//renderer/index.js',
'./dist/packages//routing/-internals.js',
'./dist/packages//routing/hash-location.js',
'./dist/packages//routing/history-location.js',
'./dist/packages//routing/index.js',
'./dist/packages//routing/lib/cache.js',
'./dist/packages//routing/lib/controller_for.js',
'./dist/packages//routing/lib/dsl.js',
'./dist/packages//routing/lib/generate_controller.js',
'./dist/packages//routing/lib/location-utils.js',
'./dist/packages//routing/lib/query_params.js',
'./dist/packages//routing/lib/router_state.js',
'./dist/packages//routing/lib/routing-service.js',
'./dist/packages//routing/lib/utils.js',
'./dist/packages//routing/none-location.js',
'./dist/packages//routing/route.js',
'./dist/packages//routing/router-service.js',
'./dist/packages//routing/router.js',
'./dist/packages//runloop/index.js',
'./dist/packages//service/index.js',
'./dist/packages//template-compilation/index.js',
'./dist/packages//template-factory/index.js',
'./dist/packages//template/index.js',
'./dist/packages//test/adapter.js',
'./dist/packages//test/index.js',
'./dist/packages//utils/index.js',
'./dist/packages//utils/lib/compare.js',
'./dist/packages//utils/lib/is-equal.js',
'./dist/packages//utils/lib/is_blank.js',
'./dist/packages//utils/lib/is_empty.js',
'./dist/packages//utils/lib/is_none.js',
'./dist/packages//utils/lib/is_present.js',
'./dist/packages//utils/lib/type-of.js',
'./dist/packages//version/index.js',
'./dist/packages//destroyable.js',
'./dist/packages//encoder.js',
'./dist/packages//env.js',
'./dist/packages//global-context.js',
'./dist/packages//manager.js',
'./dist/packages//node.js',
'./dist/packages//opcode-compiler.js',
'./dist/packages//owner.js',
'./dist/packages//program.js',
'./dist/packages//reference.js',
'./dist/packages//runtime.js',
'./dist/packages//tracking/index.js',
'./dist/packages//tracking/primitives/cache.js',
'./dist/packages//util.js',
'./dist/packages//validator.js',
'./dist/packages//vm.js',
'./dist/packages//wire-format.js',
'./dist/packages/-dom/document.js',
'./dist/packages/backburner.js/index.js',
'./dist/packages/dag-map.js',
'./dist/packages/ember/index.js',
'./dist/packages/ember/version.js',
'./dist/packages/route-recognizer.js',
'./dist/packages/router_js.js',
'./dist/packages/rsvp.js',
],
'implicit-test-modules': [
'./dist/packages/ember-testing/index.js',
'./dist/packages/ember-testing/lib/adapters/adapter.js',
'./dist/packages/ember-testing/lib/adapters/qunit.js',
'./dist/packages/ember-testing/lib/ext/application.js',
'./dist/packages/ember-testing/lib/ext/rsvp.js',
'./dist/packages/ember-testing/lib/helpers.js',
'./dist/packages/ember-testing/lib/helpers/and_then.js',
'./dist/packages/ember-testing/lib/helpers/current_path.js',
'./dist/packages/ember-testing/lib/helpers/current_route_name.js',
'./dist/packages/ember-testing/lib/helpers/current_url.js',
'./dist/packages/ember-testing/lib/helpers/pause_test.js',
'./dist/packages/ember-testing/lib/helpers/visit.js',
'./dist/packages/ember-testing/lib/helpers/wait.js',
'./dist/packages/ember-testing/lib/initializers.js',
'./dist/packages/ember-testing/lib/public-api.js',
'./dist/packages/ember-testing/lib/setup_for_testing.js',
'./dist/packages/ember-testing/lib/test.js',
'./dist/packages/ember-testing/lib/test/adapter.js',
'./dist/packages/ember-testing/lib/test/helpers.js',
'./dist/packages/ember-testing/lib/test/on_inject_helpers.js',
'./dist/packages/ember-testing/lib/test/pending_requests.js',
'./dist/packages/ember-testing/lib/test/promise.js',
'./dist/packages/ember-testing/lib/test/run.js',
'./dist/packages/ember-testing/lib/test/waiters.js',
],
};
} else {
// this is our backward-compatible mode that actually keeps most of ember-source in vendor.js.
return { ...meta, 'renamed-modules': {} };
}
},
},
});
module.exports = {
...shim,
paths,
absolutePaths,
init() {
if (shim.init) {
shim.init.apply(this, arguments);
} else {
this._super.init && this._super.init.apply(this, arguments);
}
// resets `this.root` to the correct location by default ember-cli
// considers `__dirname` here to be the root, but since our main entry
// point is within a subfolder we need to correct that
this.root = path.join(__dirname, '..');
// Updates the vendor tree to point to dist, so we get the correct tree in
// treeForVendor
this.treePaths.vendor = 'dist';
},
_overrideTree: undefined,
// Expose supported list of browsers for reference by other packages
supportedBrowsers: SupportedBrowsers,
included() {
if (shim.included) {
// this is what actually uses our autoImportCompat closure
shim.included.apply(this, arguments);
} else {
this._super.included.apply(this, arguments);
}
let overrides = Overrides.for(this.project);
if (overrides.hasOverrides) {
this._overrideTree = overrides.toTree();
}
if (overrides.hasBuildTimeWarning) {
this.ui.writeWarnLine('[DEPRECATION] ' + overrides.buildTimeWarning);
}
},
treeForVendor(tree) {
if (shim.treeForVendor) {
tree = shim.treeForVendor.call(this, tree);
}
const isProduction = process.env.EMBER_ENV === 'production';
let templateCompiler = new Funnel(tree, {
destDir: 'ember',
include: ['ember-template-compiler.js', 'ember-template-compiler.js.map'],
});
let emberAMDBundles;
if (useEmberModules) {
// ember-cli always tries to append these to vendor.js, so even when we
// don't want to put anything in them they need to exist as empty files.
emberAMDBundles = new MergeTrees([
createFile('ember/ember.js', ''),
createFile('ember/ember.js.map', ''),
createFile('ember/ember-testing.js', ''),
createFile('ember/ember-testing.js.map', ''),
]);
} else {
let which = isProduction ? 'prod' : 'debug';
emberAMDBundles = new Funnel(tree, {
destDir: 'ember',
include: [
`ember.${which}.js`,
`ember.${which}.js.map`,
'ember-testing.js',
'ember-testing.js.map',
],
getDestinationPath(path) {
return path.replace(`ember.${which}.`, 'ember.');
},
});
}
let emberCliBabel = this.addons.find((a) => a.name === 'ember-cli-babel');
// this is primarily so we get preset-env with the app's targets. All our
// special stuff was already accounted for in the building of the bundles.
return emberCliBabel.transpileTree(new MergeTrees([emberAMDBundles, templateCompiler]), {
'ember-cli-babel': {
compileModules: false,
disableDebugTooling: true,
disableEmberModulesAPIPolyfill: true,
},
});
},
};