From 8ef937b6d062997c95a0a33cf9e7620aaca4f74f Mon Sep 17 00:00:00 2001 From: ijlee2 Date: Mon, 19 Aug 2024 19:12:53 +0200 Subject: [PATCH 1/6] chore: Scaffolded package --- .../.eslintignore | 13 ++++ .../.eslintrc.cjs | 15 +++++ .../.npmignore | 22 +++++++ .../.prettierrc.cjs | 3 + .../CHANGELOG.md | 1 + .../LICENSE.md | 9 +++ .../README.md | 15 +++++ .../bin/analyze-ember-project-dependencies.ts | 25 ++++++++ .../build.sh | 40 +++++++++++++ .../package.json | 59 +++++++++++++++++++ .../src/index.ts | 10 ++++ .../src/steps/create-options.ts | 9 +++ .../src/steps/index.ts | 1 + .../src/types/index.ts | 9 +++ .../tests/fixtures/my-project/index.ts | 6 ++ .../tests/fixtures/my-project/input/.gitkeep | 0 .../tests/fixtures/my-project/output/.gitkeep | 0 .../tests/index/my-project.test.ts | 16 +++++ .../tsconfig.build.json | 9 +++ .../tsconfig.json | 9 +++ .../update-test-fixtures.sh | 23 ++++++++ pnpm-workspace.yaml | 1 + 22 files changed, 295 insertions(+) create mode 100644 packages/analyze-ember-project-dependencies/.eslintignore create mode 100644 packages/analyze-ember-project-dependencies/.eslintrc.cjs create mode 100644 packages/analyze-ember-project-dependencies/.npmignore create mode 100644 packages/analyze-ember-project-dependencies/.prettierrc.cjs create mode 100644 packages/analyze-ember-project-dependencies/CHANGELOG.md create mode 100644 packages/analyze-ember-project-dependencies/LICENSE.md create mode 100644 packages/analyze-ember-project-dependencies/README.md create mode 100755 packages/analyze-ember-project-dependencies/bin/analyze-ember-project-dependencies.ts create mode 100755 packages/analyze-ember-project-dependencies/build.sh create mode 100644 packages/analyze-ember-project-dependencies/package.json create mode 100644 packages/analyze-ember-project-dependencies/src/index.ts create mode 100644 packages/analyze-ember-project-dependencies/src/steps/create-options.ts create mode 100644 packages/analyze-ember-project-dependencies/src/steps/index.ts create mode 100644 packages/analyze-ember-project-dependencies/src/types/index.ts create mode 100644 packages/analyze-ember-project-dependencies/tests/fixtures/my-project/index.ts create mode 100644 packages/analyze-ember-project-dependencies/tests/fixtures/my-project/input/.gitkeep create mode 100644 packages/analyze-ember-project-dependencies/tests/fixtures/my-project/output/.gitkeep create mode 100644 packages/analyze-ember-project-dependencies/tests/index/my-project.test.ts create mode 100644 packages/analyze-ember-project-dependencies/tsconfig.build.json create mode 100644 packages/analyze-ember-project-dependencies/tsconfig.json create mode 100755 packages/analyze-ember-project-dependencies/update-test-fixtures.sh diff --git a/packages/analyze-ember-project-dependencies/.eslintignore b/packages/analyze-ember-project-dependencies/.eslintignore new file mode 100644 index 00000000..771057c8 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/.eslintignore @@ -0,0 +1,13 @@ +# compiled output +/dist/ +/dist-for-testing/ +/tmp/ + +# dependencies +/node_modules/ + +# misc +!.* +.*/ +/src/blueprints/ +/tests/fixtures/ diff --git a/packages/analyze-ember-project-dependencies/.eslintrc.cjs b/packages/analyze-ember-project-dependencies/.eslintrc.cjs new file mode 100644 index 00000000..c4e77940 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/.eslintrc.cjs @@ -0,0 +1,15 @@ +'use strict'; + +require('@shared-configs/eslint-config-node/patch'); + +module.exports = { + extends: ['@shared-configs/eslint-config-node/typescript'], + overrides: [ + { + files: ['bin/**/*.{js,ts}'], + rules: { + 'n/hashbang': 'off', + }, + }, + ], +}; diff --git a/packages/analyze-ember-project-dependencies/.npmignore b/packages/analyze-ember-project-dependencies/.npmignore new file mode 100644 index 00000000..cbfe73f8 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/.npmignore @@ -0,0 +1,22 @@ +# compiled output +/dist-for-testing/ +/tmp/ + +# dependencies +/node_modules/ + +# misc +/.DS_Store +/.env* +/.eslintcache +/.eslintignore +/.eslintrc.cjs +/.git/ +/.github/ +/.gitignore +/.pnpm-debug.log +/.prettierignore +/.prettierrc.cjs +/build.sh +/tests/ +/update-test-fixtures.sh diff --git a/packages/analyze-ember-project-dependencies/.prettierrc.cjs b/packages/analyze-ember-project-dependencies/.prettierrc.cjs new file mode 100644 index 00000000..038d697a --- /dev/null +++ b/packages/analyze-ember-project-dependencies/.prettierrc.cjs @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = require('@shared-configs/prettier'); diff --git a/packages/analyze-ember-project-dependencies/CHANGELOG.md b/packages/analyze-ember-project-dependencies/CHANGELOG.md new file mode 100644 index 00000000..34fdb7fa --- /dev/null +++ b/packages/analyze-ember-project-dependencies/CHANGELOG.md @@ -0,0 +1 @@ +# analyze-ember-project-dependencies diff --git a/packages/analyze-ember-project-dependencies/LICENSE.md b/packages/analyze-ember-project-dependencies/LICENSE.md new file mode 100644 index 00000000..cba618fa --- /dev/null +++ b/packages/analyze-ember-project-dependencies/LICENSE.md @@ -0,0 +1,9 @@ +The MIT License (MIT) + +Copyright (c) 2024 Isaac J. Lee + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/analyze-ember-project-dependencies/README.md b/packages/analyze-ember-project-dependencies/README.md new file mode 100644 index 00000000..17f216a3 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/README.md @@ -0,0 +1,15 @@ +# analyze-ember-project-dependencies + +## Compatibility + +- Node.js v18 or above + + +## Contributing + +See the [Contributing](../../CONTRIBUTING.md) guide for details. + + +## License + +This project is licensed under the [MIT License](LICENSE.md). 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 new file mode 100755 index 00000000..f4b6a873 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/bin/analyze-ember-project-dependencies.ts @@ -0,0 +1,25 @@ +#!/usr/bin/env node +'use strict'; + +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; + +import { analyzeEmberProjectDependencies } from '../src/index.js'; +import type { CodemodOptions } from '../src/types/index.js'; + +// Provide a title to the process in `ps` +process.title = 'analyze-ember-project-dependencies'; + +// Set codemod options +const argv = yargs(hideBin(process.argv)) + .option('root', { + describe: 'Where to run the codemod', + type: 'string', + }) + .parseSync(); + +const codemodOptions: CodemodOptions = { + projectRoot: argv['root'] ?? process.cwd(), +}; + +analyzeEmberProjectDependencies(codemodOptions); diff --git a/packages/analyze-ember-project-dependencies/build.sh b/packages/analyze-ember-project-dependencies/build.sh new file mode 100755 index 00000000..7a6ca420 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/build.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env sh + +COMMAND="analyze-ember-project-dependencies" +ENVIRONMENT=$1 + +if [ $ENVIRONMENT = "--production" ] +then + # Clean slate + rm -rf "dist" + + # Compile TypeScript + tsc --project "tsconfig.build.json" + + # Configure files + chmod +x "dist/bin/$COMMAND.js" + + if [ -d "src/blueprints" ] + then + cp -r "src/blueprints" "dist/src/blueprints" + fi + + echo "SUCCESS: Built dist.\n" + +elif [ $ENVIRONMENT = "--test" ] +then + # Clean slate + rm -rf "dist-for-testing" + + # Compile TypeScript + tsc --project "tsconfig.json" + + # Configure files + if [ -d "src/blueprints" ] + then + cp -r "src/blueprints" "dist-for-testing/src/blueprints" + fi + + echo "SUCCESS: Built dist-for-testing.\n" + +fi diff --git a/packages/analyze-ember-project-dependencies/package.json b/packages/analyze-ember-project-dependencies/package.json new file mode 100644 index 00000000..107741e9 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/package.json @@ -0,0 +1,59 @@ +{ + "name": "analyze-ember-project-dependencies", + "version": "0.0.0", + "private": true, + "description": "Analyze dependencies of an Ember project", + "keywords": [ + "codemod", + "ember-codemod", + "emberjs" + ], + "repository": { + "type": "git", + "url": "https://github.com/ijlee2/embroider-toolbox.git" + }, + "license": "MIT", + "author": "Isaac J. Lee", + "type": "module", + "main": "dist/src/index.js", + "bin": "dist/bin/analyze-ember-project-dependencies.js", + "directories": { + "test": "tests" + }, + "files": [ + "dist" + ], + "scripts": { + "build": "./build.sh --production", + "lint": "concurrently 'pnpm:lint:*(!fix)' --names 'lint:'", + "lint:fix": "concurrently 'pnpm:lint:*:fix' --names 'fix:'", + "lint:js": "eslint . --cache", + "lint:js:fix": "eslint . --fix", + "lint:types": "tsc --noEmit", + "test": "./build.sh --test && mt dist-for-testing --quiet" + }, + "dependencies": { + "@codemod-utils/ast-javascript": "^1.2.8", + "@codemod-utils/ast-template": "^1.1.4", + "@codemod-utils/ember-cli-string": "^1.1.4", + "@codemod-utils/files": "^2.0.4", + "@codemod-utils/json": "^1.1.9", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@codemod-utils/tests": "^1.1.7", + "@shared-configs/eslint-config-node": "workspace:*", + "@shared-configs/prettier": "workspace:*", + "@shared-configs/typescript": "workspace:*", + "@sondr3/minitest": "^0.1.2", + "@types/node": "^18.19.39", + "@types/yargs": "^17.0.32", + "concurrently": "^8.2.2", + "eslint": "^8.57.0", + "prettier": "^3.3.3", + "typescript": "^5.5.4" + }, + "engines": { + "node": "18.* || >= 20" + } +} diff --git a/packages/analyze-ember-project-dependencies/src/index.ts b/packages/analyze-ember-project-dependencies/src/index.ts new file mode 100644 index 00000000..033f1f3e --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/index.ts @@ -0,0 +1,10 @@ +import { createOptions } from './steps/index.js'; +import type { CodemodOptions } from './types/index.js'; + +export function analyzeEmberProjectDependencies( + codemodOptions: CodemodOptions, +): void { + const options = createOptions(codemodOptions); + + console.log(options); +} diff --git a/packages/analyze-ember-project-dependencies/src/steps/create-options.ts b/packages/analyze-ember-project-dependencies/src/steps/create-options.ts new file mode 100644 index 00000000..8c156fb8 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/steps/create-options.ts @@ -0,0 +1,9 @@ +import type { CodemodOptions, Options } from '../types/index.js'; + +export function createOptions(codemodOptions: CodemodOptions): Options { + const { projectRoot } = codemodOptions; + + return { + projectRoot, + }; +} diff --git a/packages/analyze-ember-project-dependencies/src/steps/index.ts b/packages/analyze-ember-project-dependencies/src/steps/index.ts new file mode 100644 index 00000000..a1c61f76 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/steps/index.ts @@ -0,0 +1 @@ +export * from './create-options.js'; diff --git a/packages/analyze-ember-project-dependencies/src/types/index.ts b/packages/analyze-ember-project-dependencies/src/types/index.ts new file mode 100644 index 00000000..e9bbbebc --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/types/index.ts @@ -0,0 +1,9 @@ +type CodemodOptions = { + projectRoot: string; +}; + +type Options = { + projectRoot: string; +}; + +export type { CodemodOptions, Options }; diff --git a/packages/analyze-ember-project-dependencies/tests/fixtures/my-project/index.ts b/packages/analyze-ember-project-dependencies/tests/fixtures/my-project/index.ts new file mode 100644 index 00000000..2b673695 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/tests/fixtures/my-project/index.ts @@ -0,0 +1,6 @@ +import { convertFixtureToJson } from '@codemod-utils/tests'; + +const inputProject = convertFixtureToJson('my-project/input'); +const outputProject = convertFixtureToJson('my-project/output'); + +export { inputProject, outputProject }; diff --git a/packages/analyze-ember-project-dependencies/tests/fixtures/my-project/input/.gitkeep b/packages/analyze-ember-project-dependencies/tests/fixtures/my-project/input/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/packages/analyze-ember-project-dependencies/tests/fixtures/my-project/output/.gitkeep b/packages/analyze-ember-project-dependencies/tests/fixtures/my-project/output/.gitkeep new file mode 100644 index 00000000..e69de29b 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 new file mode 100644 index 00000000..85ec04bd --- /dev/null +++ b/packages/analyze-ember-project-dependencies/tests/index/my-project.test.ts @@ -0,0 +1,16 @@ +import { assertFixture, loadFixture, test } from '@codemod-utils/tests'; + +import { analyzeEmberProjectDependencies } from '../../src/index.js'; +import { inputProject, outputProject } from '../fixtures/my-project/index.js'; + +const codemodOptions = { + projectRoot: 'tmp/my-project', +}; + +test('index > my-project', function () { + loadFixture(inputProject, codemodOptions); + + analyzeEmberProjectDependencies(codemodOptions); + + assertFixture(outputProject, codemodOptions); +}); diff --git a/packages/analyze-ember-project-dependencies/tsconfig.build.json b/packages/analyze-ember-project-dependencies/tsconfig.build.json new file mode 100644 index 00000000..d65c6690 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/tsconfig.build.json @@ -0,0 +1,9 @@ +{ + "extends": "@shared-configs/typescript/node18", + "compilerOptions": { + "declaration": false, + "outDir": "dist" + }, + "include": ["bin", "src"], + "exclude": ["src/blueprints"] +} diff --git a/packages/analyze-ember-project-dependencies/tsconfig.json b/packages/analyze-ember-project-dependencies/tsconfig.json new file mode 100644 index 00000000..498b9903 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@shared-configs/typescript/node18", + "compilerOptions": { + "declaration": false, + "outDir": "dist-for-testing" + }, + "include": ["bin", "src", "tests"], + "exclude": ["src/blueprints", "tests/fixtures"] +} diff --git a/packages/analyze-ember-project-dependencies/update-test-fixtures.sh b/packages/analyze-ember-project-dependencies/update-test-fixtures.sh new file mode 100755 index 00000000..c4a31c09 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/update-test-fixtures.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env sh + +#---------- +# +# A. Purpose +# +# Fix all test fixtures after updating the source code. +# +# B. Usage +# +# ./update-test-fixtures.sh +# +#--------- + +# Compile TypeScript +pnpm build + +# Update fixtures +rm -r "tests/fixtures/my-project/output" +cp -r "tests/fixtures/my-project/input" "tests/fixtures/my-project/output" + +./dist/bin/analyze-ember-project-dependencies.js \ + --root "tests/fixtures/my-project/output" diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index f109de0b..73711d52 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,4 +1,5 @@ packages: - configs/** + - packages/analyze-ember-project-dependencies - packages/blueprints-addon - packages/create-v2-addon-repo From db45387040d95136096837049e4d9d3b7f5acc54 Mon Sep 17 00:00:00 2001 From: ijlee2 Date: Mon, 19 Aug 2024 19:21:48 +0200 Subject: [PATCH 2/6] chore: Added lockfile --- pnpm-lock.yaml | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fae3e9fc..27274dbf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -209,6 +209,61 @@ importers: specifier: ^3.3.3 version: 3.3.3 + packages/analyze-ember-project-dependencies: + dependencies: + '@codemod-utils/ast-javascript': + specifier: ^1.2.8 + version: 1.2.8 + '@codemod-utils/ast-template': + specifier: ^1.1.4 + version: 1.1.4 + '@codemod-utils/ember-cli-string': + specifier: ^1.1.4 + version: 1.1.4 + '@codemod-utils/files': + specifier: ^2.0.4 + version: 2.0.4 + '@codemod-utils/json': + specifier: ^1.1.9 + version: 1.1.9 + yargs: + specifier: ^17.7.2 + version: 17.7.2 + devDependencies: + '@codemod-utils/tests': + specifier: ^1.1.7 + version: 1.1.7(@sondr3/minitest@0.1.2) + '@shared-configs/eslint-config-node': + specifier: workspace:* + version: link:../../configs/eslint/node + '@shared-configs/prettier': + specifier: workspace:* + version: link:../../configs/prettier + '@shared-configs/typescript': + specifier: workspace:* + version: link:../../configs/typescript + '@sondr3/minitest': + specifier: ^0.1.2 + version: 0.1.2 + '@types/node': + specifier: ^18.19.39 + version: 18.19.44 + '@types/yargs': + specifier: ^17.0.32 + version: 17.0.33 + concurrently: + specifier: ^8.2.2 + version: 8.2.2 + eslint: + specifier: ^8.57.0 + version: 8.57.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + typescript: + specifier: ^5.5.4 + version: 5.5.4 + packages/blueprints-addon: dependencies: '@codemod-utils/ast-javascript': @@ -467,6 +522,10 @@ packages: resolution: {integrity: sha512-bp9q1rtRv4NhD1xLEz5S/tdva5aJ5dizMrnQVfOdPI2JSLpC4rAAnw7Zc9eD6ssDPXKHEhh2mRFK7QP4ldZQmQ==} engines: {node: 18.* || >= 20} + '@codemod-utils/ast-template@1.1.4': + resolution: {integrity: sha512-4p7jNmkUTg9RaCVb7V8+XyYtE4HT3o4HIsQRmiPfFHLqzUsYJF8OZzB/Ijh0LN+V641wyfB5FM54gB7+28pFgw==} + engines: {node: 18.* || >= 20} + '@codemod-utils/blueprints@1.1.5': resolution: {integrity: sha512-xNEGw1xp4VjyhwcLiHAnuUhIp3430m0BHl+nfCRXCkWlbCLjIKWsnkywPavK5pUYyp4TnAwVSrNrzHtELQOp7A==} engines: {node: 18.* || >= 20} @@ -3188,6 +3247,12 @@ snapshots: '@babel/parser': 7.25.3 recast: 0.23.9 + '@codemod-utils/ast-template@1.1.4': + dependencies: + ember-template-recast: 6.1.5 + transitivePeerDependencies: + - supports-color + '@codemod-utils/blueprints@1.1.5': dependencies: lodash: 4.17.21 From dc661d747a054cc4b5f3d058265163cd2f56a65d Mon Sep 17 00:00:00 2001 From: ijlee2 Date: Mon, 19 Aug 2024 19:38:07 +0200 Subject: [PATCH 3/6] feature: Found packages --- .../src/index.ts | 6 +++-- .../src/steps/analyze-project.ts | 8 ++++++ .../analyze-project/get-package-roots.ts | 25 +++++++++++++++++++ .../src/steps/analyze-project/index.ts | 1 + .../src/steps/index.ts | 1 + 5 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts create mode 100644 packages/analyze-ember-project-dependencies/src/steps/analyze-project/get-package-roots.ts create mode 100644 packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts diff --git a/packages/analyze-ember-project-dependencies/src/index.ts b/packages/analyze-ember-project-dependencies/src/index.ts index 033f1f3e..6fbef425 100644 --- a/packages/analyze-ember-project-dependencies/src/index.ts +++ b/packages/analyze-ember-project-dependencies/src/index.ts @@ -1,4 +1,4 @@ -import { createOptions } from './steps/index.js'; +import { analyzeProject, createOptions } from './steps/index.js'; import type { CodemodOptions } from './types/index.js'; export function analyzeEmberProjectDependencies( @@ -6,5 +6,7 @@ export function analyzeEmberProjectDependencies( ): void { const options = createOptions(codemodOptions); - console.log(options); + const projectData = analyzeProject(options); + + // console.log(`✅ ${projectData.size} packages found\n`); } diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts new file mode 100644 index 00000000..7953e0c7 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts @@ -0,0 +1,8 @@ +import type { Options } from '../types/index.js'; +import { getPackageRoots } from './analyze-project/index.js'; + +export function analyzeProject(options: Options) { + const packageRoots = getPackageRoots(options); + + console.log(new Set(packageRoots)); +} 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 new file mode 100644 index 00000000..e8beee26 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/get-package-roots.ts @@ -0,0 +1,25 @@ +import { join } from 'node:path'; + +import { findFiles } from '@codemod-utils/files'; + +import type { Options } from '../../types/index.js'; + +export function getPackageRoots(options: Options): string[] { + const { projectRoot } = options; + + const packageRoots = findFiles('**/package.json', { + ignoreList: ['**/dist/**/*', '**/node_modules/**/*'], + projectRoot, + }).map((filePath) => { + return join(projectRoot, filePath.replace(/package\.json$/, '')); + }); + + const isMonorepo = packageRoots.length > 1; + + if (isMonorepo) { + // Remove the workspace root + return packageRoots.filter((packageRoot) => packageRoot !== projectRoot); + } + + return packageRoots; +} diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts new file mode 100644 index 00000000..6a4b691c --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts @@ -0,0 +1 @@ +export * from './get-package-roots.js'; diff --git a/packages/analyze-ember-project-dependencies/src/steps/index.ts b/packages/analyze-ember-project-dependencies/src/steps/index.ts index a1c61f76..8a636858 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/index.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/index.ts @@ -1 +1,2 @@ +export * from './analyze-project.js'; export * from './create-options.js'; From 3ab0e9305cadf38c024e970fcf41f63c23a592bb Mon Sep 17 00:00:00 2001 From: ijlee2 Date: Mon, 19 Aug 2024 20:02:52 +0200 Subject: [PATCH 4/6] feature: Analyzed package.json --- .../src/index.ts | 4 +- .../src/steps/analyze-project.ts | 31 +++++++++-- .../analyze-project/analyze-package-json.ts | 51 +++++++++++++++++++ .../src/steps/analyze-project/index.ts | 1 + .../src/types/index.ts | 22 +++++++- 5 files changed, 104 insertions(+), 5 deletions(-) create mode 100644 packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-package-json.ts diff --git a/packages/analyze-ember-project-dependencies/src/index.ts b/packages/analyze-ember-project-dependencies/src/index.ts index 6fbef425..1efeb701 100644 --- a/packages/analyze-ember-project-dependencies/src/index.ts +++ b/packages/analyze-ember-project-dependencies/src/index.ts @@ -8,5 +8,7 @@ export function analyzeEmberProjectDependencies( const projectData = analyzeProject(options); - // console.log(`✅ ${projectData.size} packages found\n`); + console.log(`✅ ${projectData.size} packages found\n`); + + console.log(projectData); } 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 7953e0c7..2725d332 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts @@ -1,8 +1,33 @@ -import type { Options } from '../types/index.js'; -import { getPackageRoots } from './analyze-project/index.js'; +import { readPackageJson } from '@codemod-utils/json'; + +import type { Options, ProjectData } from '../types/index.js'; +import { + analyzePackageJson, + getPackageRoots, +} from './analyze-project/index.js'; export function analyzeProject(options: Options) { const packageRoots = getPackageRoots(options); - console.log(new Set(packageRoots)); + const projectData: ProjectData = new Map(); + + packageRoots.forEach((packageRoot) => { + const packageJson = readPackageJson({ projectRoot: packageRoot }); + + if (!packageJson['name']) { + return; + } + + const { dependencies, devDependencies, packageType } = + analyzePackageJson(packageJson); + + projectData.set(packageJson['name'], { + dependencies, + devDependencies, + packageRoot, + packageType, + }); + }); + + return new Map([...projectData].sort()); } diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-package-json.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-package-json.ts new file mode 100644 index 00000000..a336c3dc --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-package-json.ts @@ -0,0 +1,51 @@ +import type { PackageJson } from '@codemod-utils/json'; + +import type { PackageName, PackageType } from '../../types/index.js'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type EmberAddon = Record; + +function getPackageType({ + dependencies, + devDependencies, + emberAddon, +}: { + dependencies: Set; + devDependencies: Set; + emberAddon?: EmberAddon; +}): PackageType { + if (emberAddon) { + return emberAddon['version'] === 2 ? 'v2-addon' : 'v1-addon'; + } + + if (devDependencies.has('ember-source') || dependencies.has('ember-source')) { + return 'app'; + } + + return 'node'; +} + +export function analyzePackageJson(packageJson: PackageJson) { + const dependencies = new Set( + [ + ...Object.keys(packageJson['dependencies'] ?? {}), + ...Object.keys(packageJson['peerDependencies'] ?? {}), + ].sort(), + ); + + const devDependencies = new Set( + [...Object.keys(packageJson['devDependencies'] ?? {})].sort(), + ); + + const packageType = getPackageType({ + dependencies, + devDependencies, + emberAddon: packageJson['ember-addon'] as EmberAddon, + }); + + return { + dependencies, + devDependencies, + packageType, + }; +} diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts index 6a4b691c..f887802c 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts @@ -1 +1,2 @@ +export * from './analyze-package-json.js'; export * from './get-package-roots.js'; diff --git a/packages/analyze-ember-project-dependencies/src/types/index.ts b/packages/analyze-ember-project-dependencies/src/types/index.ts index e9bbbebc..629b9b8c 100644 --- a/packages/analyze-ember-project-dependencies/src/types/index.ts +++ b/packages/analyze-ember-project-dependencies/src/types/index.ts @@ -6,4 +6,24 @@ type Options = { projectRoot: string; }; -export type { CodemodOptions, Options }; +type PackageName = string; + +type PackageData = { + dependencies: Set; + devDependencies: Set; + packageRoot: string; + packageType: PackageType; +}; + +type PackageType = 'app' | 'node' | 'v1-addon' | 'v2-addon'; + +type ProjectData = Map; + +export type { + CodemodOptions, + Options, + PackageData, + PackageName, + PackageType, + ProjectData, +}; From f0b0ba7a7df9b79f8965b5ae1a1a3815ff4412a2 Mon Sep 17 00:00:00 2001 From: ijlee2 Date: Mon, 19 Aug 2024 20:18:27 +0200 Subject: [PATCH 5/6] feature: Analyzed entities --- .../src/steps/analyze-project.ts | 7 ++ .../steps/analyze-project/analyze-entities.ts | 68 +++++++++++++++++++ .../src/steps/analyze-project/index.ts | 1 + .../src/types/index.ts | 15 ++++ 4 files changed, 91 insertions(+) create mode 100644 packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-entities.ts 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 2725d332..fa1208eb 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project.ts @@ -2,6 +2,7 @@ import { readPackageJson } from '@codemod-utils/json'; import type { Options, ProjectData } from '../types/index.js'; import { + analyzeEntities, analyzePackageJson, getPackageRoots, } from './analyze-project/index.js'; @@ -21,9 +22,15 @@ export function analyzeProject(options: Options) { const { dependencies, devDependencies, packageType } = analyzePackageJson(packageJson); + const entities = analyzeEntities({ + packageRoot, + packageType, + }); + projectData.set(packageJson['name'], { dependencies, devDependencies, + entities, packageRoot, packageType, }); 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 new file mode 100644 index 00000000..e21dc895 --- /dev/null +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/analyze-entities.ts @@ -0,0 +1,68 @@ +import { doubleColonize } from '@codemod-utils/ember-cli-string'; +import { findFiles } from '@codemod-utils/files'; + +import type { PackageType, ProjectDataEntities } from '../../types/index.js'; + +const SOURCE = { + app: 'app', + node: undefined, + 'v1-addon': 'addon', + 'v2-addon': 'src', +} as const; + +const ENTITY_TYPES = [ + 'components', + 'helpers', + 'modifiers', + 'services', +] as const; + +export function analyzeEntities(options: { + packageRoot: string; + packageType: PackageType; +}): ProjectDataEntities { + const { packageRoot, packageType } = options; + + const source = SOURCE[packageType]; + + const entities: ProjectDataEntities = { + components: [], + componentsDoubleColonized: [], + helpers: [], + modifiers: [], + services: [], + }; + + if (source === undefined) { + return entities; + } + + ENTITY_TYPES.forEach((entityType) => { + const filePaths = findFiles( + `${source}/${entityType}/**/*.{gjs,gts,hbs,js,ts}`, + { + ignoreList: ['**/*.d.ts', '**/dist/**/*', '**/node_modules/**/*'], + projectRoot: packageRoot, + }, + ); + + let entityNames = filePaths.map((filePath) => { + return filePath + .replace(new RegExp(`^${source}/${entityType}/`), '') + .replace(/\.(gjs|gts|hbs|js|ts)$/, ''); + }); + + if (entityType === 'components') { + entityNames = Array.from(new Set(entityNames)); + + entities['components'] = entityNames; + entities['componentsDoubleColonized'] = entityNames.map(doubleColonize); + + return; + } + + entities[entityType] = entityNames; + }); + + return entities; +} diff --git a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts index f887802c..b50b8194 100644 --- a/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts +++ b/packages/analyze-ember-project-dependencies/src/steps/analyze-project/index.ts @@ -1,2 +1,3 @@ +export * from './analyze-entities.js'; export * from './analyze-package-json.js'; export * from './get-package-roots.js'; diff --git a/packages/analyze-ember-project-dependencies/src/types/index.ts b/packages/analyze-ember-project-dependencies/src/types/index.ts index 629b9b8c..fbdcc93a 100644 --- a/packages/analyze-ember-project-dependencies/src/types/index.ts +++ b/packages/analyze-ember-project-dependencies/src/types/index.ts @@ -11,19 +11,34 @@ type PackageName = string; type PackageData = { dependencies: Set; devDependencies: Set; + entities: ProjectDataEntities; packageRoot: string; packageType: PackageType; }; type PackageType = 'app' | 'node' | 'v1-addon' | 'v2-addon'; +type EntityName = string; + +type EntityType = + | 'components' + | 'componentsDoubleColonized' + | 'helpers' + | 'modifiers' + | 'services'; + +type ProjectDataEntities = Record; + type ProjectData = Map; export type { CodemodOptions, + EntityName, + EntityType, Options, PackageData, PackageName, PackageType, ProjectData, + ProjectDataEntities, }; From 2bc7bf77233d15cb6cb5f7b79f512712dc1500c8 Mon Sep 17 00:00:00 2001 From: ijlee2 Date: Mon, 19 Aug 2024 20:20:16 +0200 Subject: [PATCH 6/6] chore: Added changeset --- .changeset/old-spies-tease.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/old-spies-tease.md diff --git a/.changeset/old-spies-tease.md b/.changeset/old-spies-tease.md new file mode 100644 index 00000000..0afc24a9 --- /dev/null +++ b/.changeset/old-spies-tease.md @@ -0,0 +1,5 @@ +--- +"analyze-ember-project-dependencies": minor +--- + +Scaffolded analyze-ember-project-dependencies