diff --git a/.changeset/quick-eyes-swim.md b/.changeset/quick-eyes-swim.md new file mode 100644 index 0000000..4310abb --- /dev/null +++ b/.changeset/quick-eyes-swim.md @@ -0,0 +1,5 @@ +--- +"analyze-ember-project-dependencies": minor +--- + +Analyzed .gjs and .gts files diff --git a/packages/analyze-ember-project-dependencies/package.json b/packages/analyze-ember-project-dependencies/package.json index d026f94..56b73ae 100644 --- a/packages/analyze-ember-project-dependencies/package.json +++ b/packages/analyze-ember-project-dependencies/package.json @@ -38,6 +38,7 @@ "@codemod-utils/ember-cli-string": "^1.1.4", "@codemod-utils/files": "^2.0.4", "@codemod-utils/json": "^1.1.9", + "content-tag": "^2.0.1", "yargs": "^17.7.2" }, "devDependencies": { diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/get-package-roots.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/get-package-roots.ts index e8beee2..543a33f 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/get-package-roots.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/get-package-roots.ts @@ -8,7 +8,7 @@ export function getPackageRoots(options: Options): string[] { const { projectRoot } = options; const packageRoots = findFiles('**/package.json', { - ignoreList: ['**/dist/**/*', '**/node_modules/**/*'], + ignoreList: ['**/{dist,node_modules}/**/*'], projectRoot, }).map((filePath) => { return join(projectRoot, filePath.replace(/package\.json$/, '')); diff --git a/packages/analyze-ember-project-dependencies/src/steps/find-dependencies.ts b/packages/analyze-ember-project-dependencies/src/steps/find-dependencies.ts index b8cf32b..fcddc82 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/find-dependencies.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/find-dependencies.ts @@ -8,20 +8,7 @@ import type { ProjectData, ProjectDependencies, } from '../types/index.js'; -import { findDependenciesInClass } from '../utils/find-dependencies/in-class.js'; -import { findDependenciesInTemplate } from '../utils/find-dependencies/in-template.js'; - -const patterns = { - app: ['app/**/*.{hbs,js,ts}', 'tests/**/*.{js,ts}', '*.{js,ts}'], - node: ['**/*.{js,ts}', '*.{js,ts}'], - 'v1-addon': [ - 'addon/**/*.{hbs,js,ts}', - 'addon-test-support/**/*.{js,ts}', - 'tests/**/*.{js,ts}', - '*.{js,ts}', - ], - 'v2-addon': ['src/**/*.{hbs,js,ts}', '*.{cjs,js,mjs,ts}'], -}; +import { analyzeFile, patterns } from '../utils/find-dependencies/index.js'; export function findDependencies( projectData: ProjectData, @@ -36,11 +23,7 @@ export function findDependencies( const _unknowns = new Set(); const filePaths = findFiles(patterns[packageType], { - ignoreList: [ - '**/declarations/**/*', - '**/dist/**/*', - '**/node_modules/**/*', - ], + ignoreList: ['**/{declarations,dist,node_modules}/**/*'], projectRoot: packageRoot, }); @@ -49,24 +32,9 @@ export function findDependencies( const path = join(packageRoot, filePath); const file = readFileSync(path, 'utf8'); - if (filePath.endsWith('.hbs')) { - const { dependencies, unknowns } = findDependenciesInTemplate(file, { - entities, - filePath, - }); - - dependencies.forEach((dependency) => _dependencies.add(dependency)); - unknowns.forEach((unknown) => _unknowns.add(unknown)); - - return; - } - - const isTypeScript = filePath.endsWith('.ts'); - - const { dependencies, unknowns } = findDependenciesInClass(file, { + const { dependencies, unknowns } = analyzeFile(file, { entities, filePath, - isTypeScript, packageName, }); diff --git a/packages/analyze-ember-project-dependencies/src/utils/ast/template-tag.ts b/packages/analyze-ember-project-dependencies/src/utils/ast/template-tag.ts new file mode 100644 index 0000000..022603b --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/utils/ast/template-tag.ts @@ -0,0 +1,7 @@ +import { Preprocessor } from 'content-tag'; + +export function extractClass(file: string): string { + const preprocessor = new Preprocessor(); + + return preprocessor.process(file); +} diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class.ts similarity index 50% rename from packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class.ts rename to packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class.ts index 830e858..8e5ae13 100644 --- a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class.ts +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class.ts @@ -1,17 +1,8 @@ -import type { Entities, PackageAnalysis } from '../../types/index.js'; -import { findModules, findServices } from './in-class/index.js'; +import type { PackageAnalysis } from '../../types/index.js'; +import { findModules, findServices } from './analyze-class/index.js'; +import type { Data } from './index.js'; -export type Data = { - entities: Entities; - filePath: string; - isTypeScript: boolean; - packageName: string; -}; - -export function findDependenciesInClass( - file: string, - data: Data, -): PackageAnalysis { +export function analyzeClass(file: string, data: Data): PackageAnalysis { const resultsForModules = findModules(file, data); const resultsForServices = findServices(file, data); diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/find-modules.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/find-modules.ts similarity index 94% rename from packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/find-modules.ts rename to packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/find-modules.ts index 7e6c68f..a2400e9 100644 --- a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/find-modules.ts +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/find-modules.ts @@ -1,7 +1,7 @@ import { AST } from '@codemod-utils/ast-javascript'; import type { PackageAnalysis } from '../../../types/index.js'; -import type { Data } from '../in-class.js'; +import type { Data } from '../index.js'; const MODULE_PREFIXES_TO_IGNORE: string[] = [ '.', @@ -39,7 +39,8 @@ export function findModules(file: string, data: Data): PackageAnalysis { const dependencies = new Set(); const unknowns = new Set(); - const traverse = AST.traverse(data.isTypeScript); + const isTypeScript = data.filePath.endsWith('.ts'); + const traverse = AST.traverse(isTypeScript); traverse(file, { visitCallExpression(node) { diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/find-services.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/find-services.ts similarity index 91% rename from packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/find-services.ts rename to packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/find-services.ts index 20dab88..9ea69e0 100644 --- a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/find-services.ts +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/find-services.ts @@ -1,7 +1,7 @@ import { AST } from '@codemod-utils/ast-javascript'; import type { PackageAnalysis } from '../../../types/index.js'; -import type { Data } from '../in-class.js'; +import type { Data } from '../index.js'; function dasherize(value: string): string { return value.replace(/([a-z\d])([A-Z])/g, '$1-$2').toLowerCase(); @@ -13,7 +13,8 @@ export function findServices(file: string, data: Data): PackageAnalysis { const dependencies = new Set(); const unknowns = new Set(); - const traverse = AST.traverse(data.isTypeScript); + const isTypeScript = data.filePath.endsWith('.ts'); + const traverse = AST.traverse(isTypeScript); traverse(file, { visitClassProperty(node) { diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/index.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/index.ts similarity index 100% rename from packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-class/index.ts rename to packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-class/index.ts diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template-tag.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template-tag.ts new file mode 100644 index 0000000..42a0f45 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template-tag.ts @@ -0,0 +1,15 @@ +import type { PackageAnalysis } from '../../types/index.js'; +import { extractClass } from '../ast/template-tag.js'; +import { analyzeClass } from './analyze-class.js'; +import type { Data } from './index.js'; + +export function analyzeTemplateTag(file: string, data: Data): PackageAnalysis { + const newFile = extractClass(file); + + const newData = { + ...data, + filePath: data.filePath.replace(/\.gjs$/, '.js').replace(/\.gts$/, '.ts'), + }; + + return analyzeClass(newFile, newData); +} diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template.ts new file mode 100644 index 0000000..ceaf81f --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template.ts @@ -0,0 +1,9 @@ +import type { PackageAnalysis } from '../../types/index.js'; +import { findComponentsHelpersModifiers } from './analyze-template/index.js'; +import type { Data } from './index.js'; + +export function analyzeTemplate(file: string, data: Data): PackageAnalysis { + const results = findComponentsHelpersModifiers(file, data); + + return results; +} diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template/find-components.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template/find-components-helpers-modifiers.ts similarity index 98% rename from packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template/find-components.ts rename to packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template/find-components-helpers-modifiers.ts index 873428c..ea86401 100644 --- a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template/find-components.ts +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template/find-components-helpers-modifiers.ts @@ -1,7 +1,7 @@ import { AST } from '@codemod-utils/ast-template'; import type { PackageAnalysis } from '../../../types/index.js'; -import type { Data } from '../in-template.js'; +import type { Data } from '../index.js'; function findBlockParams(file: string): Set { const blockParams = new Set(); diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template/index.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template/index.ts new file mode 100644 index 0000000..ab3527f --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/analyze-template/index.ts @@ -0,0 +1 @@ +export * from './find-components-helpers-modifiers.js'; diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template.ts deleted file mode 100644 index 1a8306f..0000000 --- a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { Entities, PackageAnalysis } from '../../types/index.js'; -import { findComponentsHelpersModifiers } from './in-template/index.js'; - -export type Data = { - entities: Entities; - filePath: string; -}; - -export function findDependenciesInTemplate( - file: string, - data: Data, -): PackageAnalysis { - const results = findComponentsHelpersModifiers(file, data); - - return results; -} diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template/index.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template/index.ts deleted file mode 100644 index 62a802f..0000000 --- a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/in-template/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './find-components.js'; diff --git a/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/index.ts b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/index.ts new file mode 100644 index 0000000..86b9658 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/utils/find-dependencies/index.ts @@ -0,0 +1,40 @@ +import type { Entities, PackageAnalysis } from '../../types/index.js'; +import { analyzeClass } from './analyze-class.js'; +import { analyzeTemplate } from './analyze-template.js'; +import { analyzeTemplateTag } from './analyze-template-tag.js'; + +export const patterns = { + app: [ + 'app/**/*.{gjs,gts,hbs,js,ts}', + 'tests/**/*.{gjs,gts,js,ts}', + '*.{js,ts}', + ], + node: ['**/*.{js,ts}', '*.{js,ts}'], + 'v1-addon': [ + 'addon/**/*.{gjs,gts,hbs,js,ts}', + 'addon-test-support/**/*.{js,ts}', + 'tests/**/*.{gjs,gts,js,ts}', + '*.{js,ts}', + ], + 'v2-addon': ['src/**/*.{gjs,gts,hbs,js,ts}', '*.{cjs,js,mjs,ts}'], +}; + +export type Data = { + entities: Entities; + filePath: string; + packageName: string; +}; + +export function analyzeFile(file: string, data: Data): PackageAnalysis { + const { filePath } = data; + + if (filePath.endsWith('.gjs') || filePath.endsWith('.gts')) { + return analyzeTemplateTag(file, data); + } + + if (filePath.endsWith('.hbs')) { + return analyzeTemplate(file, data); + } + + return analyzeClass(file, data); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b5254d3..c988054 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -226,6 +226,9 @@ importers: '@codemod-utils/json': specifier: ^1.1.9 version: 1.1.9 + content-tag: + specifier: ^2.0.1 + version: 2.0.1 yargs: specifier: ^17.7.2 version: 17.7.2 @@ -1137,6 +1140,9 @@ packages: content-tag@1.2.2: resolution: {integrity: sha512-9guqKIx2H+78N17otBpl8yLZbQGL5q1vBO/jDb3gF2JjixtcVpC62jDUNxjVMNoaZ09oxRX84ZOD6VX02qkVvg==} + content-tag@2.0.1: + resolution: {integrity: sha512-jxsETSDs5NbNwyiDuIp672fUMhUyu8Qxc5MOBOJOcgW/fQESI6o5K1LBDrnEE7Bh810a685lWEZHTF4jQYGEEw==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -4017,6 +4023,8 @@ snapshots: content-tag@1.2.2: {} + content-tag@2.0.1: {} + convert-source-map@2.0.0: {} cosmiconfig@9.0.0(typescript@5.5.4):