UNPKG

3.02 kBJavaScriptView Raw
1'use strict';
2
3const path = require('path');
4const fs = require('fs');
5const findByName = require('./find-by-name');
6const debug = require('debug')('ember-try:utils:config');
7
8function getConfigPath(project) {
9 let possibleConfigPath;
10 if (project.pkg && project.pkg['ember-addon'] && project.pkg['ember-addon']['configPath']) {
11 let configDir = project.pkg['ember-addon']['configPath'];
12
13 possibleConfigPath = path.join(configDir, 'ember-try.js');
14 }
15
16 if (fs.existsSync(possibleConfigPath)) {
17 debug(`using config from package.json ember-addon.configPath: ${possibleConfigPath}`);
18
19 return possibleConfigPath;
20 }
21
22 debug('using config from config/ember-try.js');
23
24 return path.join('config', 'ember-try.js');
25}
26
27async function getBaseConfig(options) {
28 let relativeConfigPath = options.configPath || getConfigPath(options.project);
29 let configPath = path.join(options.project.root, relativeConfigPath);
30 let data;
31
32 if (fs.existsSync(configPath)) {
33 let configData = await require(configPath);
34
35 data = typeof configData === 'function' ? await configData(options.project) : configData;
36 } else {
37 debug('Config file does not exist %s', configPath);
38 }
39
40 if (data && data.scenarios && !data.useVersionCompatibility && !options.versionCompatibility) {
41 return data;
42 }
43
44 let versionCompatibility =
45 options.versionCompatibility || versionCompatibilityFromPackageJSON(options.project.root);
46 if (versionCompatibility) {
47 // Required lazily to improve startup speed.
48 let autoScenarioConfigForEmber = require('ember-try-config');
49
50 let autoConfig = await autoScenarioConfigForEmber({
51 versionCompatibility,
52 project: options.project,
53 });
54 return await mergeAutoConfigAndConfigFileData(autoConfig, data);
55 } else {
56 throw new Error(
57 'No ember-try configuration found. Please see the README for configuration options'
58 );
59 }
60}
61
62async function config(options) {
63 const configData = await getBaseConfig(options);
64
65 return configData;
66}
67
68module.exports = config;
69
70function mergeAutoConfigAndConfigFileData(autoConfig, configData) {
71 configData = configData || {};
72 configData.scenarios = configData.scenarios || [];
73
74 let conf = Object.assign({}, autoConfig, configData);
75
76 let overriddenScenarios = autoConfig.scenarios.map((scenario) => {
77 let overriddenScenario = findByName(configData.scenarios, scenario.name);
78 return Object.assign({}, scenario, overriddenScenario);
79 });
80
81 let additionalScenarios = configData.scenarios.filter((scenario) => {
82 return !findByName(autoConfig.scenarios, scenario.name);
83 });
84
85 conf.scenarios = [...overriddenScenarios, ...additionalScenarios];
86
87 return conf;
88}
89
90function versionCompatibilityFromPackageJSON(root) {
91 let packageJSONFile = path.join(root, 'package.json');
92 if (fs.existsSync(packageJSONFile)) {
93 let packageJSON = JSON.parse(fs.readFileSync(packageJSONFile));
94
95 return packageJSON['ember-addon'] ? packageJSON['ember-addon'].versionCompatibility : null;
96 }
97}