-
Notifications
You must be signed in to change notification settings - Fork 61
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat(backend-deploy): use packageManagerController #947
Conversation
🦋 Changeset detectedLatest commit: c3c517b The changes in this PR will be included in the next version bump. This PR includes changesets to release 6 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
@@ -8,6 +7,7 @@ import { | |||
DestroyResult, | |||
} from './cdk_deployer_singleton_factory.js'; | |||
import { CdkErrorMapper } from './cdk_error_mapper.js'; | |||
import { type PackageManagerControllerFactory } from '@aws-amplify/cli-core'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we should split this into types that come from plugin-types
and impl in cli-core
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
this.packageManager = | ||
this.packageManager === 'npm' ? 'npx' : this.packageManager; | ||
this.packageManagerController = | ||
this.packageManagerControllerFactory.getPackageManagerController(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seems like we should inject the packageManagerController directly rather than injecting the factory?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
BackendDeployerFactory.instance = new CDKDeployer( | ||
new CdkErrorMapper(), | ||
new BackendLocator(), | ||
packageManager | ||
new PackageManagerControllerFactory('./') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
does ./
default to process.cwd()
? If so, it might be better to just have that be the default with no required input (or no input at all if it's always the current directory)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done f6ed3a6
@@ -2,6 +2,7 @@ import { BackendIdentifier } from '@aws-amplify/plugin-types'; | |||
import { CDKDeployer } from './cdk_deployer.js'; | |||
import { CdkErrorMapper } from './cdk_error_mapper.js'; | |||
import { BackendLocator } from '@aws-amplify/platform-core'; | |||
import { PackageManagerControllerFactory } from '@aws-amplify/cli-core'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
My spidey senses are tingling with "backend-deployer" depending on "cli-core". I almost wonder if it would be better to have a completely separate package-manager-controller
package 😂 . Or we can go with this for now with a GH issue to revisit if cli-core needs to be split into more pieces.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In addition.
This will trigger this check
amplify-backend/scripts/check_dependencies.ts
Lines 10 to 15 in 40298a4
'@aws-amplify/cli-core': { | |
allowList: [ | |
'@aws-amplify/backend-cli', | |
'@aws-amplify/sandbox', | |
'create-amplify', | |
], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This would be solved by the discussion here: #947 (comment)
packages/cli-core/src/index.ts
Outdated
@@ -1,3 +1,4 @@ | |||
export * from './prompter/amplify_prompts.js'; | |||
export { COLOR } from './colors.js'; | |||
export * from './printer/printer.js'; | |||
export * from './package-manager-controller/index.js'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd prefer to export directly from the files where these things are defined. Doing this makes it one extra click to drill down to the definitions from this file.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
options?: { | ||
env?: Record<string, string>; | ||
stdin?: 'inherit' | 'pipe' | 'ignore'; | ||
stdout?: 'inherit' | 'pipe' | 'ignore'; | ||
stderr?: 'inherit' | 'pipe' | 'ignore'; | ||
extendEnv?: boolean; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
can we use a type from Execa for this?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done and reverted 30cd61e, since it failed the build.
I'm trying again
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
@@ -77,8 +78,7 @@ export class CDKDeployer implements BackendDeployer { | |||
* Wrapper for the child process executor. Helps in unit testing as node:test framework | |||
* doesn't have capabilities to mock exported functions like `execa` as of right now. | |||
*/ | |||
executeChildProcess = async ( | |||
command: string, | |||
executeChildProcessWithPackageManager = async ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
executeChildProcessWithPackageManager = async ( | |
executeCommand = async ( |
It's up to the implementation how that command gets executed
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done a2f0e5a
); | ||
} | ||
|
||
getPackageManagerCommandArgs = ( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this should go back to the cdk deployer. The only thing here that the package manager controller needs to expose is something like getCdkAppCommand
which returns '${this.binaryRunner} tsx ${backendLocator.locate()}'
. Then that can be plugged into the rest of the CDK args by the cdk deployer.
? LogLevel.DEBUG | ||
: LogLevel.INFO; | ||
|
||
export const printer = new Printer(minimumLogLevel); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should either
- Inject the printer from cli as needed into cli-core
- Depend on this printer instance in cli and create-amplify rather than creating instances in those packages
Otherwise we are going to have multiple instances of the printer which is supposed to be a singleton. Option 2 is probably easier but option 1 is the "most correct" in terms of dependency inversion. However, we are already using the pattern of importing the printer across the cli package rather than injecting it, so perhaps option 2 is the way to go.
@sobolk thoughts?
also see https://github.com/aws-amplify/amplify-backend/pull/903/files
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this #947 (comment) could be a solution for this too.
If package manager controller is type in platform types but it's factory is in cli-core then that factory may accept printer instance in some way (via type I guess, like we pass it to sandbox)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah that would work. That would basically be option 1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need to replace the printer instances here and here with this instance. This can go in a follow up PR if you want.
We should also consider making Printer a type in @aws-amplify/plugin-types
and only export an instance from @aws-amplify/cli-core
rather than the class. This would make testing more annoying so we could also consider a lint rule to forbid new instances of Printer. Probably better to cut a GH issue to track this than do it all in this PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch. issue cut #958
this.packageManagerController.projectRoot.replace( | ||
process.cwd(), | ||
'' | ||
) as string |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why aren't the types for these values being inferred correctly?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch! Done 44d99a7
@@ -18,6 +18,7 @@ | |||
}, | |||
"license": "Apache-2.0", | |||
"dependencies": { | |||
"@aws-amplify/cli-core": "^0.2.0", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
if backend deployer is using package manager controller then it seems that package manager controller should go to platform-core instead.
edit:
however please see my other comment later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There's one more follow up here. The @aws-amplify/cli-core
dependency should be removed from deployer.
It can now accept type PackageManagerController
which is defined in platform-types
and that's the abstraction boundary here.
The new PackageManagerControllerFactory(...).getInstance()
should be moved to CLI and create-amplify.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like you're using the factory in tests, which is okay (although mocks would probably be better). But if you don't want to switch to mocks, moving this dep to devDeps should be okay.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
moved @aws-amplify/cli-core to devDep 😬
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can tooling detect that we're using devDep
in proper way ? i.e. in tests or as typings?
if not - then while test usage + devDep is legal - we may accidentally abuse it and have import in live prod execution path. Then we're at mercy of tests (e2e tests?) to detect that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alright. I'll mock it and remove the devDep
enum InvokableCommand { | ||
DEPLOY = 'deploy', | ||
DESTROY = 'destroy', | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the CDK related stuff should remain in deployer package.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done 1467f8f
getPackageManagerCommandArgs = ( | ||
invokableCommand: InvokableCommand, | ||
backendLocator: BackendLocator | ||
) => [ | ||
'cdk', | ||
invokableCommand.toString(), | ||
// This is unfortunate. CDK writes everything to stderr without `--ci` flag and we need to differentiate between the two. | ||
// See https://github.com/aws/aws-cdk/issues/7717 for more details. | ||
'--ci', | ||
'--app', | ||
`'${this.binaryRunner} tsx ${backendLocator.locate()}'`, | ||
'--all', | ||
'--output', | ||
'.amplify/artifacts/cdk.out', | ||
]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
that should remain in deployer package too.
I.e. deployer should packageManagerController.runWithPackageManager(commandArgs)
but it should be deployer who composes the commandArgs
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
const userAgent = process.env.npm_config_user_agent; | ||
if (userAgent === undefined) { | ||
throw new Error('npm_config_user_agent is undefined'); | ||
} | ||
const packageManagerAndVersion = userAgent.split(' ')[0]; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since this piece is reading from process.env
AND it's tightly coupled to how our CLIs are integrating with package managers I think this shouldn't be called in deployer package.
After reading this PR I think we should do something like this:
- Create plain type
type PackageManagerController
inplatform-types
and extract interface. - Change existing
abstract class PackageManagerController
toabstract class PackageManagerControllerBase
and make it package private (take it out from API.md). - Have deployer factory accept instance of
type PackageManagerController
- Have package manager controller factory in cli-core
- Use package manager controller factory in cli and pass instance to deployer factory. (so they're decoupled via plain type).
@edwardfoyle what do you think?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- definitely yes. I left a similar comment
2-3. this seems like a mixin pattern which I think might be overly complicating this. I think the package manager controller factory could just return subclasses of PackageManagerController without the additional abstraction. agreed that the only export should be the factory and the PackageManagerController type (not class)
- yes
- yes
edit: unless you just meant rename PackageManagerController to PackageManagerControllerBase so it doesn't conflict with the newly created PackageManagerController type. In which case, yeah that sounds fine.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I mentioned 2 in case we want to keep shared base - there's some shared logic there afaik. It's definietly optional and since it becomes package private then it becomes lesser implementation detail.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
edit: unless you just meant rename PackageManagerController to PackageManagerControllerBase so it doesn't conflict with the newly created PackageManagerController type
yes that's what I meant.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
1 & 2 are done
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
3,4,5 are done. (I think)
packages/cli-core/API.md
Outdated
} | ||
|
||
// @public | ||
export abstract class PackageManagerController { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It'll be moved to platform-types
packages/cli-core/API.md
Outdated
// @public | ||
export class PackageManagerControllerFactory { | ||
constructor(projectRoot: string); | ||
getPackageManagerController(): NpmPackageManagerController | PnpmPackageManagerController | YarnClassicPackageManagerController | YarnModernPackageManagerController; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
getPackageManagerController(): NpmPackageManagerController | PnpmPackageManagerController | YarnClassicPackageManagerController | YarnModernPackageManagerController; | |
getPackageManagerController(): PackageManagerController; | |
The return type should be type PackageManagerController
.
This will allow to hide (i.e. not export) XPackageManagerController
and PackageManagerControllerBase
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done.
57f035f
to
a90c36b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Getting close! Left a few more comments and it looks like there are still some from previous reviews that need to be addressed
@@ -18,6 +18,7 @@ | |||
}, | |||
"license": "Apache-2.0", | |||
"dependencies": { | |||
"@aws-amplify/cli-core": "^0.2.0", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like you're using the factory in tests, which is okay (although mocks would probably be better). But if you don't want to switch to mocks, moving this dep to devDeps should be okay.
const invoker = new CDKDeployer( | ||
new CdkErrorMapper(), | ||
backendLocator, | ||
packageManagerControllerFactory.getPackageManagerController() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
could we just mock the PackageManagerController?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Moved cli-core to devDep instead 😜 6e1257f
@@ -201,7 +200,8 @@ export class CDKDeployer implements BackendDeployer { | |||
// See https://github.com/aws/aws-cdk/issues/7717 for more details. | |||
'--ci', | |||
'--app', | |||
`'${this.packageManager} tsx ${this.backendLocator.locate()}'`, | |||
// TODO: replace npx to dynamic package manager |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
seems like this TODO should be part of this PR?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done 4b6b0bb
* constructor - sets the packageManagerController | ||
*/ | ||
constructor( | ||
private readonly packageManagerController = packageManagerControllerFactory.getPackageManagerController() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No need for the default here. Just make it a required prop that is injected by the cli package
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done
/** | ||
* constructor | ||
*/ | ||
constructor( | ||
readonly projectRoot: string, | ||
readonly projectRoot: string = './', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
also, if ./
is referring to process.cwd()
, I would use that instead as it's more readable
options?: { | ||
env?: Record<string, string>; | ||
stdin?: 'inherit' | 'pipe' | 'ignore'; | ||
stdout?: 'inherit' | 'pipe' | 'ignore'; | ||
stderr?: 'inherit' | 'pipe' | 'ignore'; | ||
extendEnv?: boolean; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
how many of these options do callers of runWithPackageManager
actually use? Should we expose a more limited set of props here like pipeOutput: true
for example?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done 47b6150
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
looks great.
"devDependencies": { | ||
"@aws-amplify/cli-core": "^0.3.0" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think it's acceptable, but dangerous idea. (see my reply to #947 (comment) )
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'll remove it and mock the packageManagerControllerFactory
in this PR
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
you can just mock type PackageManagerController
after all refactorings right ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Left a couple more comments but they can be follow ups
@@ -92,17 +88,20 @@ export class CDKDeployer implements BackendDeployer { | |||
aggregatedStderr += chunk; | |||
done(); | |||
}; | |||
const childProcess = this.packageManagerController.runWithPackageManager( | |||
commandArgs, | |||
'./', |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this path be hardcoded here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch! done a300685
? LogLevel.DEBUG | ||
: LogLevel.INFO; | ||
|
||
export const printer = new Printer(minimumLogLevel); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We need to replace the printer instances here and here with this instance. This can go in a follow up PR if you want.
We should also consider making Printer a type in @aws-amplify/plugin-types
and only export an instance from @aws-amplify/cli-core
rather than the class. This would make testing more annoying so we could also consider a lint rule to forbid new instances of Printer. Probably better to cut a GH issue to track this than do it all in this PR.
* feat: create amplify skip prompts for `--yes` option (#507) * feat: add env ci support * test: update unit tests * feat: create amplify --yes option * chore: remove un-used code * feat: support Panage Manager env var * chore: add comments * chore: remove env.CI * chore: update changeset * chore: rename PACKAGE_MANAGER_EXECUTABLE * fix: tests * fix npm -> npx * feat: init e2e test workflow for Package Manager Support (#533) * test: init e2e flow test * fix GH hash * use dynamic pkg manager * setup nodejs with npm * setup more pkg managers * install pkg managers * fix yarn1 and change step name * fix yarn1 * fix yarn1 * split yarn1 into 2 steps * fix yarn1 * fix yarn1 win * exclude bun on windows * yarn1 windows * setup yarn3 * yarn3 * yarn3 yarnPath * yarn use 3rd party action * try yarn3 * set yarn 3.6.x * set yarn berry * set yarn stable and pass --yes * feat: add env ci support * test: update unit tests * feat: create amplify --yes option * chore: remove un-used code * feat: support Panage Manager env var * chore: add comments * chore: remove env.CI * chore: update changeset * chore: rename PACKAGE_MANAGER_EXECUTABLE * fix: tests * use Env Var PACKAGE_MANAGER_EXECUTABLE * fix npm -> npx, remove bun * fix npm -> npx * change -- --yes * chore: update package.lock * chore: remove @Alpha * fix: clean up yarn * fix: change yarn1 to yarn * chore: rename yarn step * chore: use env * fix: yarn-stable env var * add comments * chore: update sample app with new imports (#541) * feat: use "use client"; directive in generated react components (#540) * fix: flatten prop types auth (#534) * fix: flatten auth login with types * chore: update snapshots * chore: update api * chore: add changeset * chore: add TODO --------- Co-authored-by: Amplifiyer <[email protected]> Co-authored-by: Spencer Stolworthy <[email protected]> Co-authored-by: awsluja <[email protected]> * fix: pnpm init and env var (#563) * fix: npm_project_initializer to use env var * fix: pnpm init * chore: update package.lock * chore: update package.lock * test: use GH workflow for e2e test of create amplify (#636) * feat: setup GH workflow for create amplify * chore: changeset * fix: add pkg type for modern yarn * fix npm install * feat: test Node v20 and Node v19 * feat: test Node v20 and yarn-stable with Node 19 * feat: exclude yarn-stable * feat: include node 20 and exclude node 19 * feat: use node 20 for others, use node 19 for yarn-stable * chore: add TODO to use Node 20 * fix: e2e tests (#771) * chore: change branch to poc/pms-create-amplify * fix: gitIgnore test * fix: refactor e2e for pms * chore: update package.lock * chore: update package.lock * temp: refactor * temp: run 1 test * temp: fix npx * temp: install packages for yarn * temp: update initial_project_file_generator * temp: install ts for yarn * temp: ignore node_modules and yarn.lock * temp: create yarn.lock for yarn stable * temp: fix yarn-stable init * temp: fix --help * fix: assert for gitignore * chore: change yarn stable install * fix: not install yarn stable globally * add @yarnpkg/sdks base * yarn stable use node-modules * remove emoji * remove @yarnpkg/sdks * yarn stable use node 18.18 * yarn stable use node 20 * chore: re-enable all tests * Revert "chore: re-enable all tests" This reverts commit f7a167b. * chore: uncomment test * chore: enable all initialStatues * test: change concurrencyLevel for yarn and yarn stable * add yarn-stable to test fails fast * chore: update changeset * chore: change workflow trigger * chore: yarn not install typescript in root folder * chore: update package.lock * Revert "chore: yarn not install typescript in root folder" This reverts commit 0d83dd0. * chore: remove comment * chore: fix typo * chore: rename yarn-classic and yarn modern * fix(create_amplify.test): after merge main * fix the concurrency for yarn classic and modern, and fix expect * feat: package manager support create amplify (#793) * chore: update package.lock * init * feat: dynamically get package manager * chore: change workflow trigger * chore: change workflow trigger * chore: rename npm functions * chore: update output log * fix: pnpm cache clear command * chore: refactor packageManager * fix: remove pnpm store * chore: create package_manager file * chore: change workflow trigger * chore: refactor PackageManager Controller and Initializer * fix: update types * chore: refactor to use factory * chore: remove try catch from the controllers * chore: change type * chore: use abstract class * fix tests * fix: PackageManagerBase * chore: refactor PackageManagerControllerFactory * chore: refactor packageJsonExists * chore: cleanup code * fix: projectJsonExists * remove package_manager file * chore: refactor package_manager props into package manager controllers * chore: rename packageManagerControllerFactory * chore: make projectRoot, userAgent, getPackageManagerName private * chore: refactor ensureInitialized * chore: refactor PackageManagerController to extend PackageManagerControllerFactory * Revert "chore: refactor PackageManagerController to extend PackageManagerControllerFactory" This reverts commit 7ddc64f. * chore: refactor to inject PackageManagerControllerFactory to xPackageManagerController * chore: move initialProjectFileGenerator to packageManagerController * fix: initializeAMplifyFolder * fix: generateInitialProjectFiles * fix: template path * chore: refactor getPackageManagerController yarn-modern * chore: create getWelcomeMessage * Revert "chore: refactor getPackageManagerController yarn-modern" This reverts commit 28da8a9. * chore: refactor generateInitialProjectFiles for yarn-modern * chore: cleanup code * chore: remove PackageManagerControllerFactory index * chore: remove ensureInitialized * Revert "chore: remove ensureInitialized" This reverts commit 96483ce. * Revert "Revert "chore: remove ensureInitialized"" This reverts commit 7c59c80. * temp: add initializeProject to PackageManagerController * temp: revert InitialProjectFileGenerator * fix: InitialProjectFileGenerator * test: restore initial_project_file_generator * move installDependencies and getWelcomeMessage to PackageManagerController * add addLockFile * add JSDocs and resolve some review comments * fix: create_amplify.test * chore: add addTypescript * chore: refactor generateInitialProjectFiles * Update packages/create-amplify/src/package-manager-controller/package_manager_controller_factory.ts Co-authored-by: Edward Foyle <[email protected]> * chore: refactor generateInitialProjectFiles again * chore: refactor welcomeMessage * test: add package_manager_controller_factory * test: fix test types * chore: comments update * chore: handle process.env.npm_config_user_agent undefined * chore: move addLockFile and addTypescript into initializeTsConfig * test: refactor packageManagerControllerFactory * fix: yarn initializeTsConfig * fix: yarn modern initializeTsConfig * fix: amplify_project_creator test * chore: refactor contructor * chore: update package.lock * fix: pnpm init, remove --debug, etc * test: add test for NpmPackageManagerController * fix build error * chore: refactor NpmPackageManagerController * test: add test for xPackageManagerController * chore: convert fs to fsp * fix yarn modern --------- Co-authored-by: Edward Foyle <[email protected]> * chore: update package-lock * test: add deploy test (#901) * chore: add e2e_flow.test * add deploy test but don't work * comment out deploy test * fix: e2e test assert * chore: update package.lock * add deploy test * use before and after * change amplifyCli to execa * change test trigger * Revert "change amplifyCli to execa" This reverts commit 9f85439. * setupProfile * Revert "Revert "change amplifyCli to execa"" This reverts commit 4950b7d. * remove fail test and initialStates * install @aws-amplify/backend-deployer * chore: update changeset * chore: set nodeLinker in test project * fix execaOptions syntax error * fix: npx in cdk deployer * chore: update changeset * fix: yarn modern build * chore: update package-lock * chore: remove some asserts * chore: remove synth * install packages to fix yarn * remove create-amplify help * simplify before and after * remove one packageManagerSetup * refactor packageManagerSetup * fix yarn- * move yarn add to setupPackageManager * fix type error * Revert "fix type error" and "move yarn add to setupPackageManager" This reverts commit d88ef61. * try fix pnpm for windows by adding @AWS-SDK+credential-providers * remove the pnpm patch * add nodir to dictionary * move setupPackageManager to a new file * rename PACKAGE_MANAGER_EXECUTABLE to PACKAGE_MANAGER * refactor packageManagerSetup to use switch * refactor packageManagerSetup to initializeX * use beforeEach and afterEach * add TODO comment * temp * simplify yarn-modern treatments * misc changes * add TODO comments * exclude pnpm on windows * Revert "exclude pnpm on windows" This reverts commit dd7b423. * exclude pnpm on windows * resolve review comments * fix syntax error * address review comments * move this.packageManager logic to ctor * fix yarn-modern * add packageManagerCli and packageManagerExecutable * fix yarn * address review comments * rename package_manager_sanity_check * update workflow yml * chore: update package-lock * move npm proxy to before and after * change comments * feat(backend-deploy): use packageManagerController (#947) * fix logger * fix logLevel * change workflow trigger to include poc/pms-cli-core * move package_manager_controller to cli-core * chore: update changeset * move npm_config_user_agent to getPackageManagerName and add runWithPackageManager * fix build error * modify executeWithDebugLogger * add getPackageManagerCommandArgs * refactor cdk_deployer to use package manager * install cli-core * fix execaChildProcess type * use PackageManagerControllerFactory in cdkDeployer * fix amplify/amplify path * chore: update API.md * clean up package-manager-controller export * update API.md * add type PackageManagerController * use PackageManagerController type from plugin-types * rename PackageManagerControllerBase and use plugin-types * change workflow trigger to exclude poc/pms-cli-core * refactor BackendDeployerFactory to take PackageManagerController * clean up getPackageManagerCommandArgs * add projectRoot and rename packageManagerControllerBase file * set projectRoot default value * rename execute_with_debugger_logger * use execa Options * Revert "use execa Options" This reverts commit 30cd61e. * rename executeChildProcessWithPackageManager to executeCommand * make BackendDeployerFactory param mandatory * make BackendDeployerFactory param mandatory * remove DependencyType * remove @aws-amplify/platform-core from cli-core * remove some default projectRoot * remove all default projectRoot * inject printer to factory * update package-lock * fix cli-core version in backend-deployer * move @aws-amplify/cli-core to devDep * add getCommand * change execa option type * change projectRoot to private * rename projectRoot to cwd * change ./ to cwd * remove @aws-amplify/cli-core from backend-deployer * patch dependencies_validator for execa * fix getCommand, cdk_deployer.test, amplify_project_creator.test * fix initial_project_file_generator.test * fix executeWithDebugLogger test * fix YarnModernPackageManagerController test * fix packageManagerControllerFactory test * fix lint error * Update packages/cli-core/src/package-manager-controller/package_manager_controller_factory.ts Co-authored-by: Kamil Sobol <[email protected]> * remove never used packageManagerExecutable * update changeset * feat: add Package Manager test to health_checks (#968) * add package-manager-tests to health-checks * remove poc-e2e-flow-test * add run_package_manager_tests_tests condition * fix run_package_manager_tests_tests condition * remove amplify-backend_windows-latest_8-core * use re-usable action for run-e2e * Revert "remove amplify-backend_windows-latest_8-core" This reverts commit 547834a. * Revert "use re-usable action for run-e2e" This reverts commit 3159e01. * revert re-usable action * Update .changeset/new-timers-warn.md Co-authored-by: Kamil Sobol <[email protected]> * clean up commented code * use amplify-backend_windows-latest_8-core * Update .changeset/new-timers-warn.md Co-authored-by: Edward Foyle <[email protected]> * remove inaccurate JSdoc * remove integration-tests from changeset --------- Co-authored-by: Amplifiyer <[email protected]> Co-authored-by: Spencer Stolworthy <[email protected]> Co-authored-by: awsluja <[email protected]> Co-authored-by: Edward Foyle <[email protected]> Co-authored-by: Kamil Sobol <[email protected]>
Problem
In #901 , we used
process.env
to detect the packge manager. This PR refactor that toPackageManagerController
.Issue number, if available:
Changes
PackageManagerController
to cli-core packagerunWithPackageManager
togetPackageManagerCommandArgs
packgeManagerControllerPackageManagerController
to detect the Package ManagerCorresponding docs PR, if applicable:
Validation
Checklist
run-e2e
label set.By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.