Skip to content

Commit 6611024

Browse files
authored
Refactored code (#52)
* refactor: Updated regular expressions to be explicit about intent * chore: Fixed linting errors (create-options) * refactor: Simplified data structure (move-project-root-files) * refactor: Extracted functions (update-addon-package-json) * refactor: Removed unnecessary sorting (sorting is handled by convertToObject) * refactor: Extracted functions (update-other-fields) * refactor: Extracted functions (update-test-app-package-json) --------- Co-authored-by: ijlee2 <[email protected]>
1 parent 1f84bfe commit 6611024

17 files changed

+383
-309
lines changed

.eslintrc.cjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ module.exports = {
3737
],
3838
rules: {
3939
'@typescript-eslint/array-type': 'error',
40+
'@typescript-eslint/no-non-null-assertion': 'off',
4041
},
4142
},
4243
// TypeScript and JavaScript files

src/migration/ember-addon/steps/analyze-addon.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ function getPublicEntrypoints(options: Options): string[] {
6666
});
6767
})
6868
.map((filePath) => {
69-
return filePath.replace(/ts$/, 'js');
69+
return filePath.replace(/(?<!\.d)\.ts$/, '.js');
7070
})
7171
.sort();
7272
}

src/migration/ember-addon/steps/create-options.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,19 @@ function analyzePackageJson(codemodOptions: CodemodOptions): AddonPackage {
2121
version,
2222
} = packageJson;
2323

24-
const projectDependencies = new Map([
25-
...Object.entries(dependencies ?? {}),
26-
...Object.entries(devDependencies ?? {}),
24+
const projectDependencies = new Map<string, string>([
25+
...(Object.entries(dependencies ?? {}) as [string, string][]),
26+
...(Object.entries(devDependencies ?? {}) as [string, string][]),
2727
]);
2828

2929
return {
3030
dependencies: projectDependencies,
3131
hasGlint: projectDependencies.has('@glint/core'),
3232
hasTypeScript: projectDependencies.has('typescript'),
3333
isV1Addon: Boolean(emberAddon),
34-
name,
35-
version,
36-
} as unknown as AddonPackage;
34+
name: name!,
35+
version: version!,
36+
};
3737
}
3838

3939
function analyzePackageManager(codemodOptions: CodemodOptions): PackageManager {
@@ -77,10 +77,9 @@ function deriveAddonLocation(addonPackage: AddonPackage): string {
7777
return addonPackage.name;
7878
}
7979

80-
// eslint-disable-next-line no-unused-vars
81-
const [_scope, packageName] = addonPackage.name.split('/');
80+
const packageName = addonPackage.name.split('/')[1]!;
8281

83-
return packageName!;
82+
return packageName;
8483
}
8584

8685
export function createOptions(codemodOptions: CodemodOptions): Options {

src/migration/ember-addon/steps/move-project-root-files.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ function copyToAddon(options: Options): void {
2727
}
2828

2929
function moveToAddonAndTestApp(options: Options): void {
30-
const { locations, packages, projectRoot } = options;
30+
const { locations, projectRoot } = options;
3131

32-
const files = new Set([
32+
const files = [
3333
'.eslintignore',
3434
'.eslintrc.cjs',
3535
'.eslintrc.js',
@@ -43,13 +43,10 @@ function moveToAddonAndTestApp(options: Options): void {
4343
'.template-lintrc.cjs',
4444
'.template-lintrc.js',
4545
'package.json',
46-
]);
47-
48-
if (packages.addon.hasTypeScript) {
49-
files.add('tsconfig.json');
50-
}
46+
'tsconfig.json',
47+
];
5148

52-
const filePaths = findFiles(unionize(Array.from(files)), {
49+
const filePaths = findFiles(unionize(files), {
5350
projectRoot,
5451
});
5552

src/migration/ember-addon/steps/move-test-app-files.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,7 @@ function renameDummy(options: Options): void {
7676
const oldPath = join(projectRoot, filePath);
7777
const oldFile = readFileSync(oldPath, 'utf8');
7878

79-
const newFile = oldFile.replace(
80-
new RegExp('dummy', 'g'),
81-
packages.testApp.name,
82-
);
79+
const newFile = oldFile.replace(/dummy/g, packages.testApp.name);
8380

8481
writeFileSync(oldPath, newFile, 'utf8');
8582
});

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

Lines changed: 8 additions & 207 deletions
Original file line numberDiff line numberDiff line change
@@ -1,214 +1,15 @@
11
import { writeFileSync } from 'node:fs';
22
import { join } from 'node:path';
33

4-
import {
5-
convertToMap,
6-
convertToObject,
7-
readPackageJson,
8-
} from '@codemod-utils/json';
9-
10-
import type { Context, Options, PackageJson } from '../../../types/index.js';
11-
import { getVersion } from '../../../utils/blueprints.js';
12-
13-
function updateDependencies(packageJson: PackageJson, options: Options): void {
14-
const dependencies = convertToMap(packageJson['dependencies']);
15-
16-
const packagesToDelete = [
17-
'@embroider/macros',
18-
'ember-auto-import',
19-
'ember-cli-babel',
20-
'ember-cli-htmlbars',
21-
];
22-
23-
packagesToDelete.forEach((packageName) => {
24-
dependencies.delete(packageName);
25-
});
26-
27-
const packagesToInstall = ['@embroider/addon-shim'];
28-
29-
packagesToInstall.sort().forEach((packageName) => {
30-
const version = getVersion(packageName, options);
31-
32-
dependencies.set(packageName, version);
33-
});
34-
35-
packageJson['dependencies'] = convertToObject(dependencies);
36-
}
37-
38-
function updateDevDependencies(
39-
packageJson: PackageJson,
40-
options: Options,
41-
): void {
42-
const { packages } = options;
43-
44-
const devDependencies = convertToMap(packageJson['devDependencies']);
45-
46-
/*
47-
For the time being, we'll take the approach of starting over and
48-
adding back the development dependencies that are required. For
49-
a more conservative approach, we could delete only the following:
50-
51-
- @embroider/macros
52-
- ember-auto-import
53-
- ember-cli-babel
54-
- ember-cli-htmlbars
55-
*/
56-
devDependencies.clear();
57-
58-
const packagesToInstall = new Set([
59-
'@babel/core',
60-
'@babel/plugin-proposal-class-properties',
61-
'@babel/plugin-proposal-decorators',
62-
'@babel/runtime',
63-
'@embroider/addon-dev',
64-
'@rollup/plugin-babel',
65-
'@rollup/plugin-node-resolve',
66-
'concurrently',
67-
'rollup',
68-
'rollup-plugin-copy',
69-
]);
70-
71-
if (packages.addon.hasTypeScript) {
72-
packagesToInstall.add('@babel/preset-typescript');
73-
}
74-
75-
Array.from(packagesToInstall)
76-
.sort()
77-
.forEach((packageName) => {
78-
const version = getVersion(packageName, options);
79-
80-
devDependencies.set(packageName, version);
81-
});
82-
83-
packageJson['devDependencies'] = convertToObject(devDependencies);
84-
}
4+
import { readPackageJson } from '@codemod-utils/json';
855

86-
function updateOtherFields(
87-
packageJson: PackageJson,
88-
context: Context,
89-
options: Options,
90-
): void {
91-
const { packages } = options;
92-
const hasPublicAssets = context.addon.publicAssets.length > 0;
93-
94-
if (hasPublicAssets) {
95-
const publicAssetMapping = context.addon.publicAssets.reduce(
96-
(accumulator, filePath) => {
97-
const from = `./public/${filePath}`;
98-
const to = `/${packages.addon.name}/${filePath}`;
99-
100-
accumulator[from] = to;
101-
102-
return accumulator;
103-
},
104-
{} as Record<string, string>,
105-
);
106-
107-
packageJson['ember-addon'] = {
108-
'app-js': {},
109-
main: 'addon-main.cjs',
110-
'public-assets': publicAssetMapping,
111-
type: 'addon',
112-
version: 2,
113-
};
114-
} else {
115-
packageJson['ember-addon'] = {
116-
'app-js': {},
117-
main: 'addon-main.cjs',
118-
type: 'addon',
119-
version: 2,
120-
};
121-
}
122-
123-
if (packages.addon.hasTypeScript) {
124-
packageJson['exports'] = {
125-
'.': {
126-
types: './declarations/index.d.ts',
127-
default: './dist/index.js',
128-
},
129-
'./*': {
130-
/*
131-
This object has an order dependency. The `default` key must appear last.
132-
*/
133-
types: './declarations/*.d.ts',
134-
default: './dist/*.js',
135-
},
136-
'./addon-main.js': './addon-main.cjs',
137-
};
138-
} else {
139-
packageJson['exports'] = {
140-
'.': './dist/index.js',
141-
'./*': './dist/*.js',
142-
'./addon-main.js': './addon-main.cjs',
143-
};
144-
}
145-
146-
const files = new Set(['addon-main.cjs', 'dist']);
147-
148-
if (hasPublicAssets) {
149-
files.add('public');
150-
}
151-
152-
if (packages.addon.hasTypeScript) {
153-
files.add('declarations');
154-
}
155-
156-
packageJson['files'] = Array.from(files).sort();
157-
158-
if (packages.addon.hasTypeScript) {
159-
packageJson['typesVersions'] = {
160-
'*': {
161-
'*': ['declarations/*'],
162-
},
163-
};
164-
}
165-
}
166-
167-
function updateScripts(packageJson: PackageJson, options: Options): void {
168-
const { packages } = options;
169-
170-
const scripts = convertToMap(packageJson['scripts']);
171-
172-
if (packages.addon.hasTypeScript) {
173-
scripts.set('build', 'concurrently "npm:build:*" --names "build:"');
174-
scripts.set('build:js', 'rollup --config');
175-
scripts.set(
176-
'build:types',
177-
packages.addon.hasGlint ? 'glint --declaration' : 'tsc',
178-
);
179-
180-
scripts.set(
181-
'lint:types',
182-
packages.addon.hasGlint
183-
? 'glint'
184-
: 'tsc --emitDeclarationOnly false --noEmit',
185-
);
186-
187-
scripts.set('prepack', 'rollup --config');
188-
189-
scripts.set('start', 'concurrently "npm:start:*" --names "start:"');
190-
scripts.set('start:js', 'rollup --config --watch --no-watch.clearScreen');
191-
scripts.set(
192-
'start:types',
193-
packages.addon.hasGlint ? 'glint --declaration --watch' : 'tsc --watch',
194-
);
195-
196-
scripts.set(
197-
'test',
198-
"echo 'A v2 addon does not have tests, run tests in test-app'",
199-
);
200-
} else {
201-
scripts.set('build', 'rollup --config');
202-
scripts.set('prepack', 'rollup --config');
203-
scripts.set('start', 'rollup --config --watch');
204-
scripts.set(
205-
'test',
206-
"echo 'A v2 addon does not have tests, run tests in test-app'",
207-
);
208-
}
209-
210-
packageJson['scripts'] = convertToObject(scripts);
211-
}
6+
import type { Context, Options } from '../../../types/index.js';
7+
import {
8+
updateDependencies,
9+
updateDevDependencies,
10+
updateOtherFields,
11+
updateScripts,
12+
} from './update-addon-package-json/index.js';
21213

21314
export function updateAddonPackageJson(
21415
context: Context,
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export * from './update-dependencies.js';
2+
export * from './update-dev-dependencies.js';
3+
export * from './update-other-fields.js';
4+
export * from './update-scripts.js';
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { convertToMap, convertToObject } from '@codemod-utils/json';
2+
3+
import type { Options, PackageJson } from '../../../../types/index.js';
4+
import { getVersion } from '../../../../utils/blueprints.js';
5+
6+
export function updateDependencies(
7+
packageJson: PackageJson,
8+
options: Options,
9+
): void {
10+
const dependencies = convertToMap(packageJson['dependencies']);
11+
12+
const packagesToDelete = [
13+
'@embroider/macros',
14+
'ember-auto-import',
15+
'ember-cli-babel',
16+
'ember-cli-htmlbars',
17+
];
18+
19+
packagesToDelete.forEach((packageName) => {
20+
dependencies.delete(packageName);
21+
});
22+
23+
const packagesToInstall = ['@embroider/addon-shim'];
24+
25+
packagesToInstall.forEach((packageName) => {
26+
const version = getVersion(packageName, options);
27+
28+
dependencies.set(packageName, version);
29+
});
30+
31+
packageJson['dependencies'] = convertToObject(dependencies);
32+
}

0 commit comments

Comments
 (0)