Skip to content

Commit a52c923

Browse files
committed
WIP
1 parent b22bfa4 commit a52c923

10 files changed

+137
-80
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"scripts": {
2929
"lint": "eslint . --ext js,json && prettier --check .",
3030
"lint:fix": "eslint . --ext js,json --fix && prettier --write .",
31-
"start": "node bin/ember-cli-update",
31+
"start": "echo \"DO NOT USE EMBER CLI UPDATE\"",
32+
"start_": "node bin/ember-cli-update",
3233
"test": "mocha",
3334
"test:bin": "mocha --config .mocharc.bin.js",
3435
"test:fast": "mocha --config .mocharc.fast.js",

src/check-for-blueprint-updates.js

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,44 @@ const getTagVersion = require('boilerplate-update/src/get-tag-version');
66
const { defaultTo } = require('./constants');
77
const utils = require('./utils');
88

9+
/**
10+
*
11+
* @param {Object} options
12+
* @param {string} options.cwd
13+
* @param {string} options.blueprintName
14+
* @returns {Promise<string>}
15+
*/
16+
async function getLatestVersion({ cwd, blueprint }) {
17+
if (blueprint.location) {
18+
let parsedPackage = await parseBlueprintPackage({
19+
cwd,
20+
packageName: blueprint.location || blueprint.packageName
21+
});
22+
23+
let downloadedPackage = await downloadPackage(
24+
blueprint.packageName,
25+
parsedPackage.url,
26+
defaultTo
27+
);
28+
29+
return downloadedPackage.version;
30+
}
31+
32+
let versions = await utils.getVersions(blueprint.packageName);
33+
let latestVersion = await getTagVersion({
34+
range: defaultTo,
35+
versions,
36+
packageName: blueprint.packageName
37+
});
38+
39+
return latestVersion;
40+
}
41+
942
async function checkForBlueprintUpdates({ cwd, blueprints }) {
1043
return await Promise.all(
1144
blueprints.map(async blueprint => {
1245
let currentVersion = blueprint.version;
13-
let latestVersion;
14-
15-
if (!blueprint.location) {
16-
let versions = await utils.getVersions(blueprint.packageName);
17-
18-
latestVersion = await getTagVersion({
19-
range: defaultTo,
20-
versions,
21-
packageName: blueprint.packageName
22-
});
23-
} else {
24-
let parsedPackage = await parseBlueprintPackage({
25-
cwd,
26-
packageName: blueprint.location || blueprint.packageName
27-
});
28-
29-
let downloadedPackage = await downloadPackage(
30-
blueprint.packageName,
31-
parsedPackage.url,
32-
defaultTo
33-
);
34-
35-
latestVersion = downloadedPackage.version;
36-
}
46+
let latestVersion = await getLatestVersion({ cwd, blueprint });
3747

3848
return {
3949
blueprint,

src/choose-blueprint-updates.js

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const checkForBlueprintUpdates = require('./check-for-blueprint-updates');
44
const inquirer = require('inquirer');
55
const loadSafeBlueprint = require('./load-safe-blueprint');
66
const { defaultTo } = require('./constants');
7+
const semver = require('semver');
78

89
/**
910
* Format the string that is displayed when user is prompted for a blueprint
@@ -34,10 +35,10 @@ async function chooseBlueprint({ choicesByName, message }) {
3435
*
3536
* @param {string} cwd - Used in `checkForBlueprintUpdates` in order to generate url or path to it if on local disk
3637
* @param {object} emberCliUpdateJson - Use the `blueprints` property from this
37-
* @param {boolean} reset - Optional
38-
* @param {boolean} compare - Optional
39-
* @param {boolean} codemods - Optional
40-
* @param {string} to - Optional (could be undefined).
38+
* @param {boolean} [reset]
39+
* @param {boolean} [compare]
40+
* @param {boolean} [codemods]
41+
* @param {string} [to] - Optional (could be undefined).
4142
* @returns {Promise<{blueprint: (*|{}), areAllUpToDate, to: string}>}
4243
*/
4344
async function chooseBlueprintUpdates({
@@ -50,28 +51,28 @@ async function chooseBlueprintUpdates({
5051
}) {
5152
let existingBlueprint;
5253
let areAllUpToDate;
53-
5454
let { blueprints } = emberCliUpdateJson;
5555

5656
if (reset || compare || codemods) {
5757
let choicesByName = blueprints.reduce((choices, blueprint) => {
5858
let name = blueprint.packageName;
59+
5960
choices[name] = {
6061
blueprint,
6162
choice: {
6263
name
6364
}
6465
};
66+
6567
return choices;
6668
}, {});
6769

68-
let message;
70+
let message = 'Which blueprint would you like to run codemods for?';
71+
6972
if (reset) {
7073
message = 'Which blueprint would you like to reset?';
7174
} else if (compare) {
7275
message = 'Which blueprint would you like to compare?';
73-
} else {
74-
message = 'Which blueprint would you like to run codemods for?';
7576
}
7677

7778
existingBlueprint = (
@@ -83,30 +84,37 @@ async function chooseBlueprintUpdates({
8384
} else {
8485
let blueprintUpdates = await checkForBlueprintUpdates({
8586
cwd,
86-
blueprints
87+
blueprints,
8788
});
8889

8990
areAllUpToDate = blueprintUpdates.every(
9091
blueprintUpdate => blueprintUpdate.isUpToDate
9192
);
9293

93-
if (areAllUpToDate) {
94+
if (!to && areAllUpToDate) {
9495
// eslint-disable-next-line no-console
95-
console.log(`${blueprintUpdates.map(formatBlueprintLine).join(`
96-
`)}
97-
98-
All blueprints are up-to-date!`);
96+
console.log(`${blueprintUpdates.map(formatBlueprintLine).join('\n')}\n\nAll blueprints are up-to-date!`);
9997
} else {
98+
areAllUpToDate = false;
99+
100+
for (let update of blueprintUpdates) {
101+
if (update.blueprint.isBaseBlueprint && !!to && semver.gt(to, update.latestVersion)) {
102+
update.isUpToDate = false;
103+
update.latestVersion = to;
104+
}
105+
}
106+
100107
let choicesByName = blueprintUpdates.reduce(
101108
(choices, blueprintUpdate) => {
102109
let name = formatBlueprintLine(blueprintUpdate);
110+
103111
choices[name] = {
104112
blueprintUpdate,
105113
choice: {
106114
name,
107-
disabled: blueprintUpdate.isUpToDate
108115
}
109116
};
117+
110118
return choices;
111119
},
112120
{}

src/constants.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,7 @@ module.exports.defaultAddonBlueprintName = 'addon';
66

77
module.exports.glimmerPackageName = '@glimmer/blueprint';
88

9+
module.exports.defaultAppPackageName = '@ember-tooling/classic-build-app-blueprint';
10+
module.exports.defaultAddonPackageName = '@ember-tooling/classic-build-addon-blueprint';
11+
912
module.exports.defaultTo = '*';

src/get-base-blueprint.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,29 @@ const isDefaultBlueprint = require('./is-default-blueprint');
1717
*/
1818
async function getBaseBlueprint({ cwd, blueprints, blueprint }) {
1919
let baseBlueprint;
20-
2120
let isCustomBlueprint = !isDefaultBlueprint(blueprint);
2221

2322
if (isCustomBlueprint && !blueprint.isBaseBlueprint) {
2423
baseBlueprint = blueprints.find(b => b.isBaseBlueprint);
24+
2525
if (baseBlueprint) {
2626
baseBlueprint = loadSafeBlueprint(baseBlueprint);
27+
2728
let isCustomBlueprint = !isDefaultBlueprint(baseBlueprint);
29+
2830
if (isCustomBlueprint) {
2931
if (baseBlueprint.location) {
3032
let parsedPackage = await parseBlueprintPackage({
3133
cwd,
3234
packageName: baseBlueprint.location
3335
});
36+
3437
let downloadedPackage = await downloadPackage(
3538
baseBlueprint.packageName,
3639
parsedPackage.url,
3740
baseBlueprint.version
3841
);
42+
3943
baseBlueprint.path = downloadedPackage.path;
4044
}
4145
}

src/get-project-options.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,8 @@ module.exports = async function getProjectOptions(
5757
}
5858

5959
let projectType = getProjectType(checkForDep, keywords);
60-
6160
let options = [projectType];
62-
6361
let cwd = process.cwd();
64-
6562
let isYarn = await hasYarn(cwd);
6663

6764
if (isYarn) {

src/get-start-and-end-commands.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const overwriteBlueprintFiles = require('./overwrite-blueprint-files');
1111
const debug = require('./debug');
1212
const npm = require('boilerplate-update/src/npm');
1313
const mutatePackageJson = require('boilerplate-update/src/mutate-package-json');
14-
const { glimmerPackageName } = require('./constants');
14+
const { glimmerPackageName, defaultAddonPackageName, defaultAppPackageName } = require('./constants');
1515
const hasYarn = require('./has-yarn');
1616

1717
const nodeModulesIgnore = `
@@ -97,22 +97,29 @@ module.exports = function getStartAndEndCommands({
9797
async function isDefaultAddonBlueprint(blueprint) {
9898
let isCustomBlueprint = !isDefaultBlueprint(blueprint);
9999

100-
let isDefaultAddonBlueprint;
100+
if (blueprint.packageName === defaultAppPackageName) {
101+
return false;
102+
}
103+
104+
if (blueprint.packageName === defaultAddonPackageName) {
105+
return true;
106+
}
101107

102108
if (isCustomBlueprint) {
103-
let keywords;
109+
let keywords = [];
110+
104111
if (blueprint.path) {
105112
keywords = utils.require(path.join(blueprint.path, 'package')).keywords;
106113
} else {
107-
keywords = await npm.json('v', blueprint.packageName, 'keywords');
114+
let packageInfo = await npm.json('v', blueprint.packageName);
115+
116+
keywords = packageInfo.keywords ?? [];
108117
}
109118

110-
isDefaultAddonBlueprint = !(
111-
keywords && keywords.includes('ember-blueprint')
112-
);
119+
return !keywords.includes('ember-blueprint');
113120
}
114121

115-
return isDefaultAddonBlueprint;
122+
return false;
116123
}
117124

118125
function getArgs({ projectName, directoryName, blueprint }) {

0 commit comments

Comments
 (0)