ember-codemod-v1-to-v2
Version:
Codemod to convert Ember addons to v2 addon format
65 lines (64 loc) • 2.25 kB
JavaScript
import { findFiles } from '@codemod-utils/files';
import { getPackageType, readPackageJson, validatePackageJson, } from '@codemod-utils/package-json';
function analyzePackageJson(codemodOptions) {
const { projectRoot } = codemodOptions;
const packageJson = readPackageJson({ projectRoot });
validatePackageJson(packageJson);
const { dependencies, devDependencies, name, version } = packageJson;
const projectDependencies = new Map([
...Object.entries(dependencies ?? {}),
...Object.entries(devDependencies ?? {}),
]);
return {
dependencies: projectDependencies,
hasGlint: projectDependencies.has('@glint/core'),
hasTypeScript: projectDependencies.has('typescript'),
isV1Addon: getPackageType(packageJson) === 'v1-addon',
name,
version,
};
}
function analyzePackageManager(codemodOptions) {
const { projectRoot } = codemodOptions;
const mapping = {
'package-lock.json': 'npm',
'pnpm-lock.yaml': 'pnpm',
'yarn.lock': 'yarn',
};
const lockFiles = Object.keys(mapping);
const filePaths = findFiles(lockFiles, {
projectRoot,
});
if (filePaths.length !== 1) {
console.warn('WARNING: Package manager is unknown. pnpm will be assumed.');
return 'pnpm';
}
const lockfile = filePaths[0];
return mapping[lockfile];
}
function deriveAddonLocation(addonPackage) {
const hasScope = addonPackage.name.includes('/');
if (!hasScope) {
return addonPackage.name;
}
const packageName = addonPackage.name.split('/')[1];
return packageName;
}
export function createOptions(codemodOptions) {
const addonPackage = analyzePackageJson(codemodOptions);
const packageManager = analyzePackageManager(codemodOptions);
return {
locations: {
addon: codemodOptions.addonLocation ?? deriveAddonLocation(addonPackage),
testApp: codemodOptions.testAppLocation ?? 'test-app',
},
packageManager,
packages: {
addon: addonPackage,
testApp: {
name: codemodOptions.testAppName ?? 'test-app',
},
},
projectRoot: codemodOptions.projectRoot,
};
}