Skip to content

Commit eee5a79

Browse files
authored
Added tests and refactored code (Part 1) (#3)
* chore: Fixed typos * refactor: Asserted the existence of the package version. Renamed test files and simplified the test setup. * refactor: Added tests for analyzeAddon * refactor: Added tests for useRelativePaths * refactor: Removed unused code. Localized variables. * bugfix: Provided the default value of [] to prevent a runtime error Co-authored-by: ijlee2 <[email protected]>
1 parent 1c126ee commit eee5a79

21 files changed

+389
-49
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ _Codemod to convert Ember addons to v2 addon format_
1111
- Switches Ember's "magic" import paths to relative paths
1212
- Preserves your code whenever possible
1313
- Supports [`ember-cli-typescript`](https://docs.ember-cli-typescript.com/) and [`glint`](https://typed-ember.gitbook.io/glint/)
14-
- Focuses on maintainbility and extensibility
14+
- Focuses on maintainability and extensibility
1515

1616

1717
## Usage

src/migration/ember-addon/steps/augment-options.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,14 @@ function analyzePackageManager(options) {
6868

6969
function deriveAddonLocation(addonPackage) {
7070
if (!addonPackage.name) {
71-
throw new RangeError(
72-
`ERROR: In package.json, the package name \`${addonPackage.name}\` is not valid.`
71+
throw new SyntaxError(
72+
'ERROR: In package.json, the package name is missing.'
73+
);
74+
}
75+
76+
if (!addonPackage.version) {
77+
throw new SyntaxError(
78+
'ERROR: In package.json, the package version is missing.'
7379
);
7480
}
7581

src/migration/ember-addon/steps/update-addon-package-json.js

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ function updateDependencies(packageJson) {
1717
'ember-cli-htmlbars',
1818
];
1919

20-
const packagesToInstall = ['@embroider/addon-shim'];
21-
2220
packagesToDelete.forEach((packageName) => {
2321
dependencies.delete(packageName);
2422
});
2523

24+
const packagesToInstall = ['@embroider/addon-shim'];
25+
2626
packagesToInstall.forEach((packageName) => {
2727
const version = decideVersion(packageName, dependencies);
2828

@@ -37,12 +37,17 @@ function updateDevDependencies(packageJson, options) {
3737

3838
const devDependencies = convertToMap(packageJson['devDependencies']);
3939

40-
const packagesToDelete = [
41-
'@embroider/macros',
42-
'ember-auto-import',
43-
'ember-cli-babel',
44-
'ember-cli-htmlbars',
45-
];
40+
/*
41+
For the time being, we'll take the approach of starting over and
42+
adding back the development dependencies that are required. For
43+
a more conservative approach, we could delete only the following:
44+
45+
- @embroider/macros
46+
- ember-auto-import
47+
- ember-cli-babel
48+
- ember-cli-htmlbars
49+
*/
50+
devDependencies.clear();
4651

4752
const packagesToInstall = packages.addon.hasTypeScript
4853
? [
@@ -65,13 +70,6 @@ function updateDevDependencies(packageJson, options) {
6570
'rollup-plugin-copy',
6671
];
6772

68-
// May be easier to start over and add missing dependencies
69-
devDependencies.clear();
70-
71-
packagesToDelete.forEach((packageName) => {
72-
devDependencies.delete(packageName);
73-
});
74-
7573
packagesToInstall.forEach((packageName) => {
7674
const version = decideVersion(packageName, devDependencies);
7775

src/migration/ember-addon/steps/update-test-app-package-json.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ function moveDependenciesToDevDependencies(packageJson, options) {
3737
function updateDependencies(packageJson) {
3838
const dependencies = convertToMap(packageJson['dependencies']);
3939

40-
// May be easier to start over and add missing dependencies
40+
/*
41+
For the time being, we'll take the approach of starting over and
42+
adding back the dependencies that are required.
43+
*/
4144
dependencies.clear();
4245

4346
packageJson['dependencies'] = convertToObject(dependencies);
@@ -58,9 +61,9 @@ function updateOtherFields(packageJson, options) {
5861

5962
delete packageJson['ember-addon'];
6063

61-
packageJson['keywords'] = packageJson['keywords'].filter((keyword) => {
62-
return keyword !== 'ember-addon';
63-
});
64+
packageJson['keywords'] = (packageJson['keywords'] ?? []).filter(
65+
(keyword) => keyword !== 'ember-addon'
66+
);
6467

6568
packageJson['name'] = packages.testApp.name;
6669

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import { analyzeAddon } from '../../../../../src/migration/ember-addon/steps/analyze-addon.js';
2+
import { assert, loadFixture, test } from '../../../../test-helpers.js';
3+
4+
test('migration | ember-addon | steps | analyze-addon > base case', function () {
5+
const options = {
6+
addonLocation: undefined,
7+
projectRoot: 'tmp/ember-container-query-typescript',
8+
testAppLocation: undefined,
9+
testAppName: undefined,
10+
};
11+
12+
const inputProject = {
13+
addon: {
14+
components: {
15+
'container-query.hbs': '',
16+
'container-query.ts': '',
17+
},
18+
helpers: {
19+
'aspect-ratio.ts': '',
20+
'height.ts': '',
21+
'width.ts': '',
22+
},
23+
modifiers: {
24+
'container-query.ts': '',
25+
},
26+
styles: {
27+
'container-query.css': '',
28+
},
29+
'.gitkeep': '',
30+
'index.ts': '',
31+
'template-registry.ts': '',
32+
},
33+
app: {
34+
components: {
35+
'container-query.js': '',
36+
},
37+
helpers: {
38+
'aspect-ratio.js': '',
39+
'height.js': '',
40+
'width.js': '',
41+
},
42+
modifiers: {
43+
'container-query.js': '',
44+
},
45+
'.gitkeep': '',
46+
},
47+
};
48+
49+
const expectedValue = {
50+
appReexports: [
51+
'components/container-query.js',
52+
'helpers/aspect-ratio.js',
53+
'helpers/height.js',
54+
'helpers/width.js',
55+
'modifiers/container-query.js',
56+
],
57+
publicEntrypoints: [
58+
'components/container-query.js',
59+
'helpers/aspect-ratio.js',
60+
'helpers/height.js',
61+
'helpers/width.js',
62+
'index.js',
63+
'modifiers/container-query.js',
64+
'template-registry.js',
65+
],
66+
};
67+
68+
loadFixture(inputProject, options);
69+
70+
// Run the step
71+
const augmentedOptions = {
72+
projectRoot: 'tmp/ember-container-query-typescript',
73+
};
74+
75+
assert.deepEqual(analyzeAddon(augmentedOptions), expectedValue);
76+
77+
// Check idempotence
78+
assert.deepEqual(analyzeAddon(augmentedOptions), expectedValue);
79+
});
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { analyzeAddon } from '../../../../../src/migration/ember-addon/steps/analyze-addon.js';
2+
import { assert, loadFixture, test } from '../../../../test-helpers.js';
3+
4+
test('migration | ember-addon | steps | analyze-addon > edge case (folders are missing)', function () {
5+
const options = {
6+
addonLocation: undefined,
7+
projectRoot: 'tmp/new-v1-addon-javascript',
8+
testAppLocation: undefined,
9+
testAppName: undefined,
10+
};
11+
12+
const inputProject = {};
13+
14+
const expectedValue = {
15+
appReexports: [],
16+
publicEntrypoints: [],
17+
};
18+
19+
loadFixture(inputProject, options);
20+
21+
// Run the step
22+
const augmentedOptions = {
23+
projectRoot: 'tmp/new-v1-addon-javascript',
24+
};
25+
26+
assert.deepEqual(analyzeAddon(augmentedOptions), expectedValue);
27+
28+
// Check idempotence
29+
assert.deepEqual(analyzeAddon(augmentedOptions), expectedValue);
30+
});

tests/migration/ember-addon/steps/augment-options/custom-locations.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ test('migration | ember-addon | steps | augment-options > custom locations', fun
2626
null,
2727
2
2828
),
29-
'yarn.lock': 'some code for yarn.lock',
29+
'yarn.lock': '',
3030
};
3131

3232
loadFixture(inputProject, options);

tests/migration/ember-addon/steps/augment-options/error-handling-1.test.js renamed to tests/migration/ember-addon/steps/augment-options/error-handling-package-json-is-an-empty-file.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { augmentOptions } from '../../../../../src/migration/ember-addon/steps/augment-options.js';
22
import { assert, loadFixture, test } from '../../../../test-helpers.js';
33

4-
test('migration | ember-addon | steps | augment-options > error handling (empty file)', function () {
4+
test('migration | ember-addon | steps | augment-options > error handling (package.json is an empty file)', function () {
55
const options = {
66
addonLocation: undefined,
77
projectRoot: 'tmp/new-v1-addon-javascript',
@@ -11,7 +11,7 @@ test('migration | ember-addon | steps | augment-options > error handling (empty
1111

1212
const inputProject = {
1313
'package.json': '',
14-
'yarn.lock': 'some code for yarn.lock',
14+
'yarn.lock': '',
1515
};
1616

1717
loadFixture(inputProject, options);

tests/migration/ember-addon/steps/augment-options/error-handling-3.test.js renamed to tests/migration/ember-addon/steps/augment-options/error-handling-package-json-is-not-a-valid-json.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { augmentOptions } from '../../../../../src/migration/ember-addon/steps/augment-options.js';
22
import { assert, loadFixture, test } from '../../../../test-helpers.js';
33

4-
test('migration | ember-addon | steps | augment-options > error handling (corrupt package.json)', function () {
4+
test('migration | ember-addon | steps | augment-options > error handling (package.json is not a valid JSON)', function () {
55
const options = {
66
addonLocation: undefined,
77
projectRoot: 'tmp/new-v1-addon-javascript',
@@ -10,8 +10,8 @@ test('migration | ember-addon | steps | augment-options > error handling (corrup
1010
};
1111

1212
const inputProject = {
13-
'package.json': '{\n name:}',
14-
'yarn.lock': 'some code for yarn.lock',
13+
'package.json': '{\n "name": }',
14+
'yarn.lock': '',
1515
};
1616

1717
loadFixture(inputProject, options);
@@ -23,7 +23,7 @@ test('migration | ember-addon | steps | augment-options > error handling (corrup
2323
(error) => {
2424
assert.strictEqual(
2525
error.message,
26-
'ERROR: package.json is missing or is not a valid JSON. (Unexpected token n in JSON at position 4)\n'
26+
'ERROR: package.json is missing or is not a valid JSON. (Unexpected token } in JSON at position 12)\n'
2727
);
2828

2929
return true;

tests/migration/ember-addon/steps/augment-options/error-handling-2.test.js renamed to tests/migration/ember-addon/steps/augment-options/error-handling-package-name-is-missing.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { augmentOptions } from '../../../../../src/migration/ember-addon/steps/augment-options.js';
22
import { assert, loadFixture, test } from '../../../../test-helpers.js';
33

4-
test('migration | ember-addon | steps | augment-options > error handling (empty object)', function () {
4+
test('migration | ember-addon | steps | augment-options > error handling (package name is missing)', function () {
55
const options = {
66
addonLocation: undefined,
77
projectRoot: 'tmp/new-v1-addon-javascript',
@@ -11,7 +11,7 @@ test('migration | ember-addon | steps | augment-options > error handling (empty
1111

1212
const inputProject = {
1313
'package.json': '{}',
14-
'yarn.lock': 'some code for yarn.lock',
14+
'yarn.lock': '',
1515
};
1616

1717
loadFixture(inputProject, options);
@@ -23,7 +23,7 @@ test('migration | ember-addon | steps | augment-options > error handling (empty
2323
(error) => {
2424
assert.strictEqual(
2525
error.message,
26-
'ERROR: In package.json, the package name `undefined` is not valid.'
26+
'ERROR: In package.json, the package name is missing.'
2727
);
2828

2929
return true;

0 commit comments

Comments
 (0)