1 | 'use strict';
|
2 |
|
3 | const path = require('path');
|
4 | const fs = require('fs');
|
5 | const findByName = require('./find-by-name');
|
6 | const debug = require('debug')('ember-try:utils:config');
|
7 |
|
8 | function 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 |
|
27 | async 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 |
|
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 |
|
62 | async function config(options) {
|
63 | const configData = await getBaseConfig(options);
|
64 |
|
65 | return configData;
|
66 | }
|
67 |
|
68 | module.exports = config;
|
69 |
|
70 | function 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 |
|
90 | function 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 | }
|