From 812b84efadef8ffa74ee15a44e5b46f59586b159 Mon Sep 17 00:00:00 2001 From: Isaac Lee <16869656+ijlee2@users.noreply.github.com> Date: Thu, 29 Aug 2024 13:09:58 +0200 Subject: [PATCH] Allowed specifying the component structure (#32) * feature: Normalized the entity name for components with nested structure * feature: Allowed specifying the component structure * chore: Updated README * chore: Added changeset --------- Co-authored-by: ijlee2 --- .changeset/stupid-pans-cough.md | 5 ++++ .../README.md | 14 ++++++++++- .../bin/analyze-ember-project-dependencies.ts | 6 +++++ .../src/steps/analyze-project.ts | 5 +--- .../steps/analyze-project/analyze-entities.ts | 25 +++++++++++++------ .../src/steps/create-options.ts | 3 ++- .../src/types/index.ts | 2 ++ .../tests/index/my-project.test.ts | 1 + 8 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 .changeset/stupid-pans-cough.md diff --git a/.changeset/stupid-pans-cough.md b/.changeset/stupid-pans-cough.md new file mode 100644 index 0000000..a6c55ef --- /dev/null +++ b/.changeset/stupid-pans-cough.md @@ -0,0 +1,5 @@ +--- +"analyze-ember-project-dependencies": minor +--- + +Allowed specifying the component structure diff --git a/packages/analyze-ember-project-dependencies/README.md b/packages/analyze-ember-project-dependencies/README.md index 8203156..b702269 100644 --- a/packages/analyze-ember-project-dependencies/README.md +++ b/packages/analyze-ember-project-dependencies/README.md @@ -34,12 +34,24 @@ Step 2. Check the output for true positives.
+Optional: Specify the component structure + +By default, apps and addons follow the flat component structure for components. Pass `--component-structure` to indicate otherwise. + +```sh +npx analyze-ember-project-dependencies --component-structure nested +``` + +
+ +
+ Optional: Specify the project root Pass `--root` to run the codemod somewhere else (i.e. not in the current directory). ```sh -npx ember-codemod-remove-inject-as-service --root +npx analyze-ember-project-dependencies --root ```
diff --git a/packages/analyze-ember-project-dependencies/bin/analyze-ember-project-dependencies.ts b/packages/analyze-ember-project-dependencies/bin/analyze-ember-project-dependencies.ts index f4b6a87..6fd7164 100755 --- a/packages/analyze-ember-project-dependencies/bin/analyze-ember-project-dependencies.ts +++ b/packages/analyze-ember-project-dependencies/bin/analyze-ember-project-dependencies.ts @@ -12,6 +12,11 @@ process.title = 'analyze-ember-project-dependencies'; // Set codemod options const argv = yargs(hideBin(process.argv)) + .option('component-structure', { + choices: ['flat', 'nested'] as const, + describe: 'Component structure (how your components are colocated)', + type: 'string', + }) .option('root', { describe: 'Where to run the codemod', type: 'string', @@ -19,6 +24,7 @@ const argv = yargs(hideBin(process.argv)) .parseSync(); const codemodOptions: CodemodOptions = { + componentStructure: argv['component-structure'] ?? 'flat', projectRoot: argv['root'] ?? process.cwd(), }; diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts index fa1208e..a99c53e 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts @@ -22,10 +22,7 @@ export function analyzeProject(options: Options) { const { dependencies, devDependencies, packageType } = analyzePackageJson(packageJson); - const entities = analyzeEntities({ - packageRoot, - packageType, - }); + const entities = analyzeEntities(packageRoot, packageType, options); projectData.set(packageJson['name'], { dependencies, diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-entities.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-entities.ts index cfc2868..91900c2 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-entities.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-entities.ts @@ -1,7 +1,11 @@ import { doubleColonize } from '@codemod-utils/ember'; import { findFiles } from '@codemod-utils/files'; -import type { PackageType, ProjectDataEntities } from '../../types/index.js'; +import type { + Options, + PackageType, + ProjectDataEntities, +} from '../../types/index.js'; const SOURCE = { app: 'app', @@ -17,12 +21,11 @@ const ENTITY_TYPES = [ 'services', ] as const; -export function analyzeEntities(options: { - packageRoot: string; - packageType: PackageType; -}): ProjectDataEntities { - const { packageRoot, packageType } = options; - +export function analyzeEntities( + packageRoot: string, + packageType: PackageType, + options: Options, +): ProjectDataEntities { const source = SOURCE[packageType]; const entities: ProjectDataEntities = { @@ -37,6 +40,8 @@ export function analyzeEntities(options: { return entities; } + const { componentStructure } = options; + ENTITY_TYPES.forEach((entityType) => { const filePaths = findFiles( `${source}/${entityType}/**/*.{gjs,gts,hbs,js,ts}`, @@ -55,6 +60,12 @@ export function analyzeEntities(options: { if (entityType === 'components') { entityNames = Array.from(new Set(entityNames)); + if (componentStructure === 'nested') { + entityNames = entityNames.map((entityName) => { + return entityName.replace(/\/index$/, ''); + }); + } + entities['components'] = entityNames; entities['componentsDoubleColonized'] = entityNames.map(doubleColonize); diff --git a/packages/analyze-ember-project-dependencies/src/steps/create-options.ts b/packages/analyze-ember-project-dependencies/src/steps/create-options.ts index 8c156fb..dea3d69 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/create-options.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/create-options.ts @@ -1,9 +1,10 @@ import type { CodemodOptions, Options } from '../types/index.js'; export function createOptions(codemodOptions: CodemodOptions): Options { - const { projectRoot } = codemodOptions; + const { componentStructure, projectRoot } = codemodOptions; return { + componentStructure, projectRoot, }; } diff --git a/packages/analyze-ember-project-dependencies/src/types/index.ts b/packages/analyze-ember-project-dependencies/src/types/index.ts index a96c279..1c549c8 100644 --- a/packages/analyze-ember-project-dependencies/src/types/index.ts +++ b/packages/analyze-ember-project-dependencies/src/types/index.ts @@ -1,8 +1,10 @@ type CodemodOptions = { + componentStructure: 'flat' | 'nested'; projectRoot: string; }; type Options = { + componentStructure: 'flat' | 'nested'; projectRoot: string; }; diff --git a/packages/analyze-ember-project-dependencies/tests/index/my-project.test.ts b/packages/analyze-ember-project-dependencies/tests/index/my-project.test.ts index 85ec04b..6f1dc75 100644 --- a/packages/analyze-ember-project-dependencies/tests/index/my-project.test.ts +++ b/packages/analyze-ember-project-dependencies/tests/index/my-project.test.ts @@ -4,6 +4,7 @@ import { analyzeEmberProjectDependencies } from '../../src/index.js'; import { inputProject, outputProject } from '../fixtures/my-project/index.js'; const codemodOptions = { + componentStructure: 'flat' as const, projectRoot: 'tmp/my-project', };