diff --git a/docs/generated/devkit/nrwl_devkit.md b/docs/generated/devkit/nrwl_devkit.md index eab5a0242e15aa..5d157e5a7bfdde 100644 --- a/docs/generated/devkit/nrwl_devkit.md +++ b/docs/generated/devkit/nrwl_devkit.md @@ -134,7 +134,7 @@ It only uses language primitives and immutable objects - [output](../../devkit/documents/nrwl_devkit#output) - [workspaceRoot](../../devkit/documents/nrwl_devkit#workspaceroot) -### Functions +### Other Functions - [addDependenciesToPackageJson](../../devkit/documents/nrwl_devkit#adddependenciestopackagejson) - [addProjectConfiguration](../../devkit/documents/nrwl_devkit#addprojectconfiguration) @@ -149,7 +149,6 @@ It only uses language primitives and immutable objects - [defaultTasksRunner](../../devkit/documents/nrwl_devkit#defaulttasksrunner) - [detectPackageManager](../../devkit/documents/nrwl_devkit#detectpackagemanager) - [detectWorkspaceScope](../../devkit/documents/nrwl_devkit#detectworkspacescope) -- [ensurePackage](../../devkit/documents/nrwl_devkit#ensurepackage) - [extractLayoutDirectory](../../devkit/documents/nrwl_devkit#extractlayoutdirectory) - [formatFiles](../../devkit/documents/nrwl_devkit#formatfiles) - [generateFiles](../../devkit/documents/nrwl_devkit#generatefiles) @@ -203,6 +202,10 @@ It only uses language primitives and immutable objects - [writeJson](../../devkit/documents/nrwl_devkit#writejson) - [writeJsonFile](../../devkit/documents/nrwl_devkit#writejsonfile) +### Utils Functions + +- [ensurePackage](../../devkit/documents/nrwl_devkit#ensurepackage) + ## Project Graph Enumerations ### DependencyType @@ -829,7 +832,7 @@ Implementation of a target of a project that handles multiple projects to be bat • **workspaceRoot**: `string` -## Functions +## Other Functions ### addDependenciesToPackageJson @@ -1188,39 +1191,6 @@ Detect workspace scope from the package.json name --- -### ensurePackage - -▸ **ensurePackage**(`tree`, `pkg`, `requiredVersion`, `options?`): `void` - -Ensure that dependencies and devDependencies from package.json are installed at the required versions. - -For example: - -```typescript -ensurePackage(tree, '@nrwl/jest', nxVersion); -``` - -This will check that @nrwl/jest@ exists in devDependencies. -If it exists then function returns, otherwise it will install the package before continuing. -When running with --dryRun, the function will throw when dependencies are missing. - -#### Parameters - -| Name | Type | Description | -| :------------------------ | :------------------------------------------------ | :----------------------------------------------------------------- | -| `tree` | [`Tree`](../../devkit/documents/nrwl_devkit#tree) | the file system tree | -| `pkg` | `string` | the package to check (e.g. @nrwl/jest) | -| `requiredVersion` | `string` | the version or semver range to check (e.g. ~1.0.0, >=1.0.0 <2.0.0) | -| `options` | `Object` | | -| `options.dev?` | `boolean` | - | -| `options.throwOnMissing?` | `boolean` | - | - -#### Returns - -`void` - ---- - ### extractLayoutDirectory ▸ **extractLayoutDirectory**(`directory`): `Object` @@ -2437,3 +2407,66 @@ Serializes the given data to JSON and writes it to a file. #### Returns `void` + +--- + +## Utils Functions + +### ensurePackage + +▸ **ensurePackage**(`tree`, `pkg`, `requiredVersion`, `options?`): `void` + +**`deprecated`** Use the other function signature without a Tree + +Use a package that has not been installed as a dependency. + +For example: + +```typescript +ensurePackage(tree, '@nrwl/jest', nxVersion); +``` + +This install the @nrwl/jest@ and return the module +When running with --dryRun, the function will throw when dependencies are missing. + +#### Parameters + +| Name | Type | Description | +| :------------------------ | :------------------------------------------------ | :----------------------------------------------------------------- | +| `tree` | [`Tree`](../../devkit/documents/nrwl_devkit#tree) | the file system tree | +| `pkg` | `string` | the package to check (e.g. @nrwl/jest) | +| `requiredVersion` | `string` | the version or semver range to check (e.g. ~1.0.0, >=1.0.0 <2.0.0) | +| `options?` | `Object` | - | +| `options.dev?` | `boolean` | - | +| `options.throwOnMissing?` | `boolean` | - | + +#### Returns + +`void` + +▸ **ensurePackage**<`T`\>(`pkg`, `version`): `T` + +Ensure that dependencies and devDependencies from package.json are installed at the required versions. + +For example: + +```typescript +ensurePackage(tree, '@nrwl/jest', nxVersion); +``` + +#### Type parameters + +| Name | Type | +| :--- | :------------------------ | +| `T` | extends `unknown` = `any` | + +#### Parameters + +| Name | Type | Description | +| :-------- | :------- | :---------------------------------------------------------- | +| `pkg` | `string` | the package to install and require | +| `version` | `string` | the version to install if the package doesn't exist already | + +#### Returns + +`T` diff --git a/docs/generated/packages/devkit/documents/nrwl_devkit.md b/docs/generated/packages/devkit/documents/nrwl_devkit.md index eab5a0242e15aa..5d157e5a7bfdde 100644 --- a/docs/generated/packages/devkit/documents/nrwl_devkit.md +++ b/docs/generated/packages/devkit/documents/nrwl_devkit.md @@ -134,7 +134,7 @@ It only uses language primitives and immutable objects - [output](../../devkit/documents/nrwl_devkit#output) - [workspaceRoot](../../devkit/documents/nrwl_devkit#workspaceroot) -### Functions +### Other Functions - [addDependenciesToPackageJson](../../devkit/documents/nrwl_devkit#adddependenciestopackagejson) - [addProjectConfiguration](../../devkit/documents/nrwl_devkit#addprojectconfiguration) @@ -149,7 +149,6 @@ It only uses language primitives and immutable objects - [defaultTasksRunner](../../devkit/documents/nrwl_devkit#defaulttasksrunner) - [detectPackageManager](../../devkit/documents/nrwl_devkit#detectpackagemanager) - [detectWorkspaceScope](../../devkit/documents/nrwl_devkit#detectworkspacescope) -- [ensurePackage](../../devkit/documents/nrwl_devkit#ensurepackage) - [extractLayoutDirectory](../../devkit/documents/nrwl_devkit#extractlayoutdirectory) - [formatFiles](../../devkit/documents/nrwl_devkit#formatfiles) - [generateFiles](../../devkit/documents/nrwl_devkit#generatefiles) @@ -203,6 +202,10 @@ It only uses language primitives and immutable objects - [writeJson](../../devkit/documents/nrwl_devkit#writejson) - [writeJsonFile](../../devkit/documents/nrwl_devkit#writejsonfile) +### Utils Functions + +- [ensurePackage](../../devkit/documents/nrwl_devkit#ensurepackage) + ## Project Graph Enumerations ### DependencyType @@ -829,7 +832,7 @@ Implementation of a target of a project that handles multiple projects to be bat • **workspaceRoot**: `string` -## Functions +## Other Functions ### addDependenciesToPackageJson @@ -1188,39 +1191,6 @@ Detect workspace scope from the package.json name --- -### ensurePackage - -▸ **ensurePackage**(`tree`, `pkg`, `requiredVersion`, `options?`): `void` - -Ensure that dependencies and devDependencies from package.json are installed at the required versions. - -For example: - -```typescript -ensurePackage(tree, '@nrwl/jest', nxVersion); -``` - -This will check that @nrwl/jest@ exists in devDependencies. -If it exists then function returns, otherwise it will install the package before continuing. -When running with --dryRun, the function will throw when dependencies are missing. - -#### Parameters - -| Name | Type | Description | -| :------------------------ | :------------------------------------------------ | :----------------------------------------------------------------- | -| `tree` | [`Tree`](../../devkit/documents/nrwl_devkit#tree) | the file system tree | -| `pkg` | `string` | the package to check (e.g. @nrwl/jest) | -| `requiredVersion` | `string` | the version or semver range to check (e.g. ~1.0.0, >=1.0.0 <2.0.0) | -| `options` | `Object` | | -| `options.dev?` | `boolean` | - | -| `options.throwOnMissing?` | `boolean` | - | - -#### Returns - -`void` - ---- - ### extractLayoutDirectory ▸ **extractLayoutDirectory**(`directory`): `Object` @@ -2437,3 +2407,66 @@ Serializes the given data to JSON and writes it to a file. #### Returns `void` + +--- + +## Utils Functions + +### ensurePackage + +▸ **ensurePackage**(`tree`, `pkg`, `requiredVersion`, `options?`): `void` + +**`deprecated`** Use the other function signature without a Tree + +Use a package that has not been installed as a dependency. + +For example: + +```typescript +ensurePackage(tree, '@nrwl/jest', nxVersion); +``` + +This install the @nrwl/jest@ and return the module +When running with --dryRun, the function will throw when dependencies are missing. + +#### Parameters + +| Name | Type | Description | +| :------------------------ | :------------------------------------------------ | :----------------------------------------------------------------- | +| `tree` | [`Tree`](../../devkit/documents/nrwl_devkit#tree) | the file system tree | +| `pkg` | `string` | the package to check (e.g. @nrwl/jest) | +| `requiredVersion` | `string` | the version or semver range to check (e.g. ~1.0.0, >=1.0.0 <2.0.0) | +| `options?` | `Object` | - | +| `options.dev?` | `boolean` | - | +| `options.throwOnMissing?` | `boolean` | - | + +#### Returns + +`void` + +▸ **ensurePackage**<`T`\>(`pkg`, `version`): `T` + +Ensure that dependencies and devDependencies from package.json are installed at the required versions. + +For example: + +```typescript +ensurePackage(tree, '@nrwl/jest', nxVersion); +``` + +#### Type parameters + +| Name | Type | +| :--- | :------------------------ | +| `T` | extends `unknown` = `any` | + +#### Parameters + +| Name | Type | Description | +| :-------- | :------- | :---------------------------------------------------------- | +| `pkg` | `string` | the package to install and require | +| `version` | `string` | the version to install if the package doesn't exist already | + +#### Returns + +`T` diff --git a/docs/generated/packages/js/generators/init.json b/docs/generated/packages/js/generators/init.json index 940d6fdb5bc32f..c6ee45b6be1069 100644 --- a/docs/generated/packages/js/generators/init.json +++ b/docs/generated/packages/js/generators/init.json @@ -17,7 +17,11 @@ "type": "boolean", "aliases": ["skip-format"], "description": "Skip formatting files.", - "default": true, + "x-priority": "internal" + }, + "skipPackageJson": { + "type": "boolean", + "description": "Skip adding package.json dependencies", "x-priority": "internal" }, "tsConfigName": { diff --git a/packages/angular/src/generators/application/angular-v14/lib/convert-to-standalone-app.ts b/packages/angular/src/generators/application/angular-v14/lib/convert-to-standalone-app.ts index f033258af74b45..286428808910ba 100644 --- a/packages/angular/src/generators/application/angular-v14/lib/convert-to-standalone-app.ts +++ b/packages/angular/src/generators/application/angular-v14/lib/convert-to-standalone-app.ts @@ -1,6 +1,7 @@ import type { Tree } from '@nrwl/devkit'; import { joinPathFragments } from '@nrwl/devkit'; import type { NormalizedSchema } from './normalized-schema'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function convertToStandaloneApp(tree: Tree, options: NormalizedSchema) { const pathToAppModule = joinPathFragments( @@ -23,6 +24,7 @@ function updateMainEntrypoint( ) { let routerModuleSetup: string; if (options.routing) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const appModuleContents = tree.read(pathToAppModule, 'utf-8'); const ast = tsquery.ast(appModuleContents); @@ -73,6 +75,7 @@ function updateAppComponent(tree: Tree, options: NormalizedSchema) { ); const appComponentContents = tree.read(pathToAppComponent, 'utf-8'); + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const ast = tsquery.ast(appComponentContents); const COMPONENT_DECORATOR_SELECTOR = diff --git a/packages/angular/src/generators/application/lib/convert-to-standalone-app.ts b/packages/angular/src/generators/application/lib/convert-to-standalone-app.ts index 992c4414bd8a1f..c0bbc5b9ddb684 100644 --- a/packages/angular/src/generators/application/lib/convert-to-standalone-app.ts +++ b/packages/angular/src/generators/application/lib/convert-to-standalone-app.ts @@ -1,6 +1,7 @@ import type { Tree } from '@nrwl/devkit'; import { joinPathFragments } from '@nrwl/devkit'; import type { NormalizedSchema } from './normalized-schema'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function convertToStandaloneApp(tree: Tree, options: NormalizedSchema) { const pathToAppModule = joinPathFragments( @@ -21,6 +22,7 @@ function updateMainEntrypoint( tree: Tree, pathToAppModule: string ) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); let routerModuleSetup: string; if (options.routing) { @@ -63,6 +65,7 @@ bootstrapApplication(AppComponent${ }).catch((err) => console.error(err));`; function updateAppComponent(tree: Tree, options: NormalizedSchema) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const pathToAppComponent = joinPathFragments( options.appProjectRoot, diff --git a/packages/angular/src/generators/change-storybook-targets/change-storybook-targets.ts b/packages/angular/src/generators/change-storybook-targets/change-storybook-targets.ts index e842e895419253..77fef85f1babbe 100644 --- a/packages/angular/src/generators/change-storybook-targets/change-storybook-targets.ts +++ b/packages/angular/src/generators/change-storybook-targets/change-storybook-targets.ts @@ -18,14 +18,17 @@ export async function angularChangeStorybookTargestGenerator( ); await changeStorybookTargetsGenerator(tree); - if (!schema.skipFormat) { - await formatFiles(tree); - } - return addDependenciesToPackageJson( + const installTask = addDependenciesToPackageJson( tree, {}, { '@nrwl/storybook': nxVersion } ); + + if (!schema.skipFormat) { + await formatFiles(tree); + } + + return installTask; } export default angularChangeStorybookTargestGenerator; diff --git a/packages/angular/src/generators/component/lib/entry-point.ts b/packages/angular/src/generators/component/lib/entry-point.ts index f37587a1b4e5c8..0914922c2008fb 100644 --- a/packages/angular/src/generators/component/lib/entry-point.ts +++ b/packages/angular/src/generators/component/lib/entry-point.ts @@ -1,6 +1,7 @@ import type { Tree } from '@nrwl/devkit'; import type { StringLiteral } from 'typescript'; import { getRelativeImportToFile } from '../../utils/path'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function shouldExportInEntryPoint( tree: Tree, @@ -11,6 +12,7 @@ export function shouldExportInEntryPoint( return false; } + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const moduleImportPath = getRelativeImportToFile(entryPoint, modulePath); const entryPointContent = tree.read(entryPoint, 'utf-8'); diff --git a/packages/angular/src/generators/convert-to-with-mf/lib/check-name-matches.ts b/packages/angular/src/generators/convert-to-with-mf/lib/check-name-matches.ts index fc2bb2a12e716d..4d048109cd168c 100644 --- a/packages/angular/src/generators/convert-to-with-mf/lib/check-name-matches.ts +++ b/packages/angular/src/generators/convert-to-with-mf/lib/check-name-matches.ts @@ -1,9 +1,11 @@ import type { SourceFile } from 'typescript'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function checkOutputNameMatchesProjectName( ast: SourceFile, projectName: string ) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const OUTPUT_SELECTOR = 'PropertyAssignment:has(Identifier[name=output]) > ObjectLiteralExpression:has(PropertyAssignment:has(Identifier[name=uniqueName]))'; diff --git a/packages/angular/src/generators/convert-to-with-mf/lib/check-shared-npm-packages.ts b/packages/angular/src/generators/convert-to-with-mf/lib/check-shared-npm-packages.ts index 27a061033b6890..865f7067d2adba 100644 --- a/packages/angular/src/generators/convert-to-with-mf/lib/check-shared-npm-packages.ts +++ b/packages/angular/src/generators/convert-to-with-mf/lib/check-shared-npm-packages.ts @@ -1,6 +1,8 @@ import type { SourceFile, Node } from 'typescript'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function checkSharedNpmPackagesMatchExpected(ast: SourceFile) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const SHARE_HELPER_SELECTOR = 'PropertyAssignment:has(Identifier[name=shared]) > CallExpression:has(Identifier[name=share])'; diff --git a/packages/angular/src/generators/convert-to-with-mf/lib/is-host-remote-config.ts b/packages/angular/src/generators/convert-to-with-mf/lib/is-host-remote-config.ts index 3cb42170dd203c..109db6d85168ab 100644 --- a/packages/angular/src/generators/convert-to-with-mf/lib/is-host-remote-config.ts +++ b/packages/angular/src/generators/convert-to-with-mf/lib/is-host-remote-config.ts @@ -1,4 +1,5 @@ import type { SourceFile } from 'typescript'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export type IsHostRemoteConfigResult = 'host' | 'remote' | 'both' | false; @@ -11,6 +12,7 @@ const PROPERTY_SELECTOR = 'ObjectLiteralExpression > PropertyAssignment'; export function isHostRemoteConfig(ast: SourceFile): IsHostRemoteConfigResult { let isHost = false; let isRemote = false; + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const remotesNodes = tsquery(ast, REMOTES_EXPRESSION_SELECTOR, { @@ -33,6 +35,7 @@ export function isHostRemoteConfig(ast: SourceFile): IsHostRemoteConfigResult { } export function getRemotesFromHost(ast: SourceFile) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const remotesObjectNodes = tsquery(ast, REMOTES_EXPRESSION_SELECTOR, { visitAllChildren: true, @@ -63,6 +66,7 @@ export function getRemotesFromHost(ast: SourceFile) { } export function getExposedModulesFromRemote(ast: SourceFile) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const exposesObjectNodes = tsquery(ast, EXPOSES_EXPRESSION_SELECTOR, { visitAllChildren: true, diff --git a/packages/angular/src/generators/convert-to-with-mf/lib/parse-ast-webpack-config.ts b/packages/angular/src/generators/convert-to-with-mf/lib/parse-ast-webpack-config.ts index 72c1e76ac7a90d..300fc444e6ab72 100644 --- a/packages/angular/src/generators/convert-to-with-mf/lib/parse-ast-webpack-config.ts +++ b/packages/angular/src/generators/convert-to-with-mf/lib/parse-ast-webpack-config.ts @@ -1,4 +1,5 @@ import type { Tree } from '@nrwl/devkit'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function parseASTOfWebpackConfig( tree: Tree, @@ -9,6 +10,7 @@ export function parseASTOfWebpackConfig( `Cannot migrate webpack config at \`${pathToWebpackConfig}\` as it does not exist. Please ensure this file exists and that the path to the file is correct.` ); } + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const source = tree.read(pathToWebpackConfig, 'utf-8'); diff --git a/packages/angular/src/generators/init/angular-v14/init.ts b/packages/angular/src/generators/init/angular-v14/init.ts index a0d119561d6e12..204efae67e2e6b 100755 --- a/packages/angular/src/generators/init/angular-v14/init.ts +++ b/packages/angular/src/generators/init/angular-v14/init.ts @@ -47,12 +47,12 @@ export async function angularInitGenerator( try { ensurePackage(pkg, devkitVersion); } catch { - // @schematics/angular cannot be required so this fails but that's we will still be ble to wrap the schematic later on + // @schematics/angular cannot be required so this fails but this will still allow wrapping the schematic later on } if (!options.skipPackageJson) { tasks.push( - addDependenciesToPackageJson(host, {}, { pkg: devkitVersion }) + addDependenciesToPackageJson(host, {}, { [pkg]: devkitVersion }) ); } } @@ -72,7 +72,7 @@ export async function angularInitGenerator( const unitTestTask = await addUnitTestRunner(host, options); tasks.push(unitTestTask); - const e2eTask = addE2ETestRunner(host, options); + const e2eTask = await addE2ETestRunner(host, options); tasks.push(e2eTask); addGitIgnoreEntry(host, '.angular'); @@ -182,7 +182,10 @@ async function addUnitTestRunner( } } -function addE2ETestRunner(tree: Tree, options: Schema): GeneratorCallback { +async function addE2ETestRunner( + tree: Tree, + options: Schema +): Promise { switch (options.e2eTestRunner) { case E2eTestRunner.Protractor: return !options.skipPackageJson @@ -206,7 +209,7 @@ function addE2ETestRunner(tree: Tree, options: Schema): GeneratorCallback { ) : () => {}; case E2eTestRunner.Cypress: - return cypressInitGenerator(tree, { + return await cypressInitGenerator(tree, { skipPackageJson: options.skipPackageJson, }); default: diff --git a/packages/angular/src/generators/init/init.ts b/packages/angular/src/generators/init/init.ts index 38be57f8e735bb..01b2b0e9844ef0 100755 --- a/packages/angular/src/generators/init/init.ts +++ b/packages/angular/src/generators/init/init.ts @@ -71,12 +71,12 @@ export async function angularInitGenerator( try { ensurePackage(pkg, devkitVersion); } catch { - // @schematics/angular cannot be required so this fails but that's we will still be ble to wrap the schematic later on + // @schematics/angular cannot be required so this fails but this will still allow wrapping the schematic later on } if (!options.skipPackageJson) { tasks.push( - addDependenciesToPackageJson(tree, {}, { pkg: devkitVersion }) + addDependenciesToPackageJson(tree, {}, { [pkg]: devkitVersion }) ); } } @@ -96,7 +96,7 @@ export async function angularInitGenerator( } const unitTestTask = await addUnitTestRunner(tree, options); tasks.push(unitTestTask); - const e2eTask = addE2ETestRunner(tree, options); + const e2eTask = await addE2ETestRunner(tree, options); tasks.push(e2eTask); addGitIgnoreEntry(tree, '.angular'); @@ -204,7 +204,10 @@ async function addUnitTestRunner( } } -function addE2ETestRunner(tree: Tree, options: Schema): GeneratorCallback { +async function addE2ETestRunner( + tree: Tree, + options: Schema +): Promise { switch (options.e2eTestRunner) { case E2eTestRunner.Protractor: return !options.skipPackageJson diff --git a/packages/angular/src/generators/karma-project/lib/generate-karma-project-files.ts b/packages/angular/src/generators/karma-project/lib/generate-karma-project-files.ts index 594c91dfe5c402..69235b8d2f72cf 100644 --- a/packages/angular/src/generators/karma-project/lib/generate-karma-project-files.ts +++ b/packages/angular/src/generators/karma-project/lib/generate-karma-project-files.ts @@ -8,6 +8,7 @@ import { } from '@nrwl/devkit'; import { getInstalledAngularVersionInfo } from '../../utils/version-utils'; import { v14TestFile } from './v14-test-file'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function generateKarmaProjectFiles(tree: Tree, project: string): void { const projectConfig = readProjectConfiguration(tree, project); @@ -75,6 +76,7 @@ function isUsingConfigSetInBaseKarmaConfig(tree: Tree) { if (!tree.exists('karma.conf.js')) { return false; } + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const CONFIG_SET_SELECTOR = diff --git a/packages/angular/src/generators/library/library.spec.ts b/packages/angular/src/generators/library/library.spec.ts index 7e5162e1fb57a1..e2aeebb7853a0b 100644 --- a/packages/angular/src/generators/library/library.spec.ts +++ b/packages/angular/src/generators/library/library.spec.ts @@ -29,21 +29,7 @@ jest.mock('@nrwl/devkit', () => { createProjectGraphAsync: jest.fn().mockImplementation(() => projectGraph), // need to mock so it doesn't resolve what the workspace has installed // and be able to test with different versions - ensurePackage: jest - .fn() - .mockImplementation((tree, pkg, version, options) => { - updateJson(tree, 'package.json', (json) => ({ - ...json, - dependencies: { - ...json.dependencies, - ...(options?.dev === false ? { [pkg]: version } : {}), - }, - devDependencies: { - ...json.devDependencies, - ...(options?.dev ?? true ? { [pkg]: version } : {}), - }, - })); - }), + ensurePackage: jest.fn().mockImplementation((pkg) => require(pkg)), }; }); diff --git a/packages/angular/src/generators/ng-add/migrators/projects/e2e.migrator.ts b/packages/angular/src/generators/ng-add/migrators/projects/e2e.migrator.ts index 65d449ddbe4dfb..a28dfd73a64e82 100644 --- a/packages/angular/src/generators/ng-add/migrators/projects/e2e.migrator.ts +++ b/packages/angular/src/generators/ng-add/migrators/projects/e2e.migrator.ts @@ -45,6 +45,7 @@ import type { } from '../../utilities'; import { FileChangeRecorder } from '../../utilities'; import { ProjectMigrator } from './project.migrator'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; type SupportedTargets = 'e2e'; const supportedTargets: Record = { @@ -577,6 +578,7 @@ export class E2eMigrator extends ProjectMigrator { } private updateCypress10ConfigFile(configFilePath: string): void { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); this.cypressPreset = nxE2EPreset(configFilePath); @@ -657,6 +659,7 @@ export class E2eMigrator extends ProjectMigrator { recorder: FileChangeRecorder, { ...globalConfig }: CypressCommonConfig ): void { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const e2eConfig = {}; const presetSpreadAssignment = `...nxE2EPreset(__dirname),`; diff --git a/packages/angular/src/generators/setup-ssr/lib/update-app-module.ts b/packages/angular/src/generators/setup-ssr/lib/update-app-module.ts index 32b214ef5f862d..a2530e80b034dd 100644 --- a/packages/angular/src/generators/setup-ssr/lib/update-app-module.ts +++ b/packages/angular/src/generators/setup-ssr/lib/update-app-module.ts @@ -1,8 +1,10 @@ import type { Tree } from '@nrwl/devkit'; import { joinPathFragments, readProjectConfiguration } from '@nrwl/devkit'; import type { Schema } from '../schema'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function updateAppModule(tree: Tree, schema: Schema) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); // read the content of app module const projectConfig = readProjectConfiguration(tree, schema.project); diff --git a/packages/angular/src/generators/utils/storybook-ast/module-info.ts b/packages/angular/src/generators/utils/storybook-ast/module-info.ts index 62ee531cec398d..e951f6b8bd039c 100644 --- a/packages/angular/src/generators/utils/storybook-ast/module-info.ts +++ b/packages/angular/src/generators/utils/storybook-ast/module-info.ts @@ -16,6 +16,7 @@ import type { import { SyntaxKind } from 'typescript'; import { getDecoratorMetadata } from '../../../utils/nx-devkit/ast-utils'; import type { EntryPoint } from './entry-point'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export function getModuleDeclaredComponents( file: SourceFile, @@ -78,6 +79,7 @@ export function getModuleFilePaths( } function hasNgModule(tree: Tree, filePath: string): boolean { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const fileContent = tree.read(filePath, 'utf-8'); const ast = tsquery.ast(fileContent); diff --git a/packages/angular/src/utils/nx-devkit/ast-utils.ts b/packages/angular/src/utils/nx-devkit/ast-utils.ts index e36af5eadaa0d0..71219ba8ca2acb 100644 --- a/packages/angular/src/utils/nx-devkit/ast-utils.ts +++ b/packages/angular/src/utils/nx-devkit/ast-utils.ts @@ -648,6 +648,7 @@ export function addProviderToBootstrapApplication( filePath: string, providerToAdd: string ) { + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); const PROVIDERS_ARRAY_SELECTOR = 'CallExpression:has(Identifier[name=bootstrapApplication]) ObjectLiteralExpression > PropertyAssignment:has(Identifier[name=providers]) > ArrayLiteralExpression'; diff --git a/packages/angular/src/utils/nx-devkit/route-utils.ts b/packages/angular/src/utils/nx-devkit/route-utils.ts index 5f02234b959e0c..44422e33bc4c5e 100644 --- a/packages/angular/src/utils/nx-devkit/route-utils.ts +++ b/packages/angular/src/utils/nx-devkit/route-utils.ts @@ -1,6 +1,7 @@ import { Tree } from '@nrwl/devkit'; import { insertImport } from '@nrwl/workspace/src/utilities/ast-utils'; import { addRouteToNgModule } from './ast-utils'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; let tsModule: typeof import('typescript'); @@ -20,6 +21,7 @@ export function addRoute( if (!tsModule) { tsModule = require('typescript'); } + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); let routesFileContents = tree.read(routesFile, 'utf-8'); @@ -95,6 +97,7 @@ export function addProviderToRoute( ); } + ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); let routesFileContents = tree.read(routesFile, 'utf-8'); diff --git a/packages/cypress/src/generators/cypress-project/cypress-project.ts b/packages/cypress/src/generators/cypress-project/cypress-project.ts index 39ccb515f25c0a..ef8324f88c230c 100644 --- a/packages/cypress/src/generators/cypress-project/cypress-project.ts +++ b/packages/cypress/src/generators/cypress-project/cypress-project.ts @@ -265,16 +265,12 @@ export async function addLinter(host: Tree, options: CypressProjectSchema) { export async function cypressProjectGenerator(host: Tree, schema: Schema) { const options = normalizeOptions(host, schema); - await jsInitGenerator(host, { - js: schema.js, - skipFormat: true, - }); const tasks: GeneratorCallback[] = []; const cypressVersion = installedCypressVersion(); // if there is an installed cypress version, then we don't call // init since we want to keep the existing version that is installed if (!cypressVersion) { - tasks.push(cypressInitGenerator(host, options)); + tasks.push(await cypressInitGenerator(host, options)); } if (schema.bundler === 'vite') { diff --git a/packages/cypress/src/generators/init/init.spec.ts b/packages/cypress/src/generators/init/init.spec.ts index 8aa06b61c69884..420a8ffe9661b2 100644 --- a/packages/cypress/src/generators/init/init.spec.ts +++ b/packages/cypress/src/generators/init/init.spec.ts @@ -21,7 +21,7 @@ describe('init', () => { json.devDependencies[existing] = existingVersion; return json; }); - cypressInitGenerator(tree, {}); + await cypressInitGenerator(tree, {}); const packageJson = readJson(tree, 'package.json'); expect(packageJson.devDependencies.cypress).toBeDefined(); @@ -39,7 +39,7 @@ describe('init', () => { return json; }); - cypressInitGenerator(tree, {}); + await cypressInitGenerator(tree, {}); expect( readJson(tree, 'nx.json').targetDefaults.e2e diff --git a/packages/cypress/src/generators/init/init.ts b/packages/cypress/src/generators/init/init.ts index 86a250bf46fe84..cd668d3cdd9d63 100644 --- a/packages/cypress/src/generators/init/init.ts +++ b/packages/cypress/src/generators/init/init.ts @@ -1,6 +1,7 @@ import { addDependenciesToPackageJson, convertNxGenerator, + GeneratorCallback, readNxJson, removeDependenciesFromPackageJson, Tree, @@ -12,6 +13,8 @@ import { typesNodeVersion, } from '../../utils/versions'; import { Schema } from './schema'; +import { initGenerator } from '@nrwl/js'; +import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; function setupE2ETargetDefaults(tree: Tree) { const nxJson = readNxJson(tree); @@ -47,9 +50,23 @@ function updateDependencies(tree: Tree) { ); } -export function cypressInitGenerator(tree: Tree, options: Schema) { +export async function cypressInitGenerator(tree: Tree, options: Schema) { setupE2ETargetDefaults(tree); - return !options.skipPackageJson ? updateDependencies(tree) : () => {}; + + const tasks: GeneratorCallback[] = []; + + tasks.push( + await initGenerator(tree, { + ...options, + skipFormat: true, + }) + ); + + if (!options.skipPackageJson) { + tasks.push(updateDependencies(tree)); + } + + return runTasksInSerial(...tasks); } export default cypressInitGenerator; diff --git a/packages/cypress/src/generators/init/schema.d.ts b/packages/cypress/src/generators/init/schema.d.ts index c629d7fae1e13d..44c34f897f10a4 100644 --- a/packages/cypress/src/generators/init/schema.d.ts +++ b/packages/cypress/src/generators/init/schema.d.ts @@ -1,3 +1,5 @@ export interface Schema { skipPackageJson?: boolean; + + skipFormat?: boolean; } diff --git a/packages/cypress/src/generators/migrate-to-cypress-11/conversion.util.ts b/packages/cypress/src/generators/migrate-to-cypress-11/conversion.util.ts index e01296464b16ad..d483d47f3e1db3 100644 --- a/packages/cypress/src/generators/migrate-to-cypress-11/conversion.util.ts +++ b/packages/cypress/src/generators/migrate-to-cypress-11/conversion.util.ts @@ -274,6 +274,7 @@ export function updateImports( tsModule = ensureTypescript(); } if (!tsquery) { + ensureTypescript(); tsquery = require('@phenomnomnominal/tsquery').tsquery; } const { isCallExpression, isExportDeclaration, isImportDeclaration } = diff --git a/packages/devkit/package.json b/packages/devkit/package.json index 92ffd314e71b2b..2059ea2bffaa07 100644 --- a/packages/devkit/package.json +++ b/packages/devkit/package.json @@ -30,6 +30,7 @@ "dependencies": { "ejs": "^3.1.7", "ignore": "^5.0.4", + "tmp": "~0.2.1", "tslib": "^2.3.0", "@phenomnomnominal/tsquery": "4.1.1", "semver": "7.3.4" diff --git a/packages/devkit/src/generators/to-js.ts b/packages/devkit/src/generators/to-js.ts index 311b4fcf19c2d7..709adc79ef586c 100644 --- a/packages/devkit/src/generators/to-js.ts +++ b/packages/devkit/src/generators/to-js.ts @@ -1,11 +1,10 @@ import type { Tree } from 'nx/src/generators/tree'; -import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; /** * Rename and transpile any new typescript files created to javascript files */ export function toJS(tree: Tree): void { - const { JsxEmit, ScriptTarget, transpile } = ensureTypescript(); + const { JsxEmit, ScriptTarget, transpile } = require('typescript'); for (const c of tree.listChanges()) { if ( diff --git a/packages/devkit/src/utils/module-federation/typescript.ts b/packages/devkit/src/utils/module-federation/typescript.ts index 23b91ec8ff9401..4b5c8ad816709f 100644 --- a/packages/devkit/src/utils/module-federation/typescript.ts +++ b/packages/devkit/src/utils/module-federation/typescript.ts @@ -3,7 +3,6 @@ import { ParsedCommandLine } from 'typescript'; // eslint-disable-next-line @typescript-eslint/no-restricted-imports import { getRootTsConfigPath } from 'nx/src/utils/typescript'; import { dirname } from 'path'; -import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; let tsConfig: ParsedCommandLine; let tsPathMappings: ParsedCommandLine['options']['paths']; @@ -37,7 +36,7 @@ function readTsConfiguration(tsConfigPath: string): ParsedCommandLine { let tsModule: typeof import('typescript'); export function readTsConfig(tsConfigPath: string): ParsedCommandLine { if (!tsModule) { - tsModule = ensureTypescript(); + tsModule = require('typescript'); } const readResult = tsModule.readConfigFile( tsConfigPath, diff --git a/packages/devkit/src/utils/package-json.ts b/packages/devkit/src/utils/package-json.ts index 9006679d0a6a36..8314c6f9ea156f 100644 --- a/packages/devkit/src/utils/package-json.ts +++ b/packages/devkit/src/utils/package-json.ts @@ -3,15 +3,14 @@ import { execSync } from 'child_process'; import type { Tree } from 'nx/src/generators/tree'; import type { GeneratorCallback } from 'nx/src/config/misc-interfaces'; -import { clean, coerce, gt, satisfies } from 'semver'; +import { clean, coerce, gt } from 'semver'; import { installPackagesTask } from '../tasks/install-packages-task'; import { requireNx } from '../../nx'; import { dirSync } from 'tmp'; import { join } from 'path'; -const { readJson, updateJson, getPackageManagerCommand, workspaceRoot } = - requireNx(); +const { readJson, updateJson, getPackageManagerCommand } = requireNx(); const UNIDENTIFIED_VERSION = 'UNIDENTIFIED_VERSION'; const NON_SEMVER_TAGS = { @@ -445,12 +444,10 @@ export function ensurePackage( } const tempDir = dirSync().name; - console.log('Installing', pkg); execSync(`${getPackageManagerCommand().addDev} ${pkg}@${requiredVersion}`, { cwd: tempDir, stdio: [0, 1, 2], }); - console.log('after install'); addToNodePath(join(tempDir, 'node_modules')); diff --git a/packages/expo/src/generators/init/init.ts b/packages/expo/src/generators/init/init.ts index 38d13e9ea71408..3207c76ddfeaed 100644 --- a/packages/expo/src/generators/init/init.ts +++ b/packages/expo/src/generators/init/init.ts @@ -43,13 +43,16 @@ import { initRootBabelConfig } from './lib/init-root-babel-config'; export async function expoInitGenerator(host: Tree, schema: Schema) { addGitIgnoreEntry(host); initRootBabelConfig(host); - await jsInitGenerator(host, { - js: schema.js, - skipFormat: true, - }); const tasks: GeneratorCallback[] = []; + tasks.push( + await jsInitGenerator(host, { + ...schema, + skipFormat: true, + }) + ); + if (!schema.skipPackageJson) { tasks.push(moveDependency(host)); tasks.push(updateDependencies(host)); diff --git a/packages/jest/src/generators/init/init.ts b/packages/jest/src/generators/init/init.ts index 9cf32e6f38964a..f11be8529310e2 100644 --- a/packages/jest/src/generators/init/init.ts +++ b/packages/jest/src/generators/init/init.ts @@ -191,12 +191,15 @@ export async function jestInitGenerator( schema: JestInitSchema ): Promise { const options = normalizeOptions(schema); - await jsInitGenerator(tree, { - js: schema.js, - skipFormat: true, - }); const tasks: GeneratorCallback[] = []; + tasks.push( + await jsInitGenerator(tree, { + ...schema, + skipFormat: true, + }) + ); + createJestConfig(tree, options); if (!options.skipPackageJson) { diff --git a/packages/js/src/generators/init/init.ts b/packages/js/src/generators/init/init.ts index 5a44196e05ddc5..f0a3572daf44fa 100644 --- a/packages/js/src/generators/init/init.ts +++ b/packages/js/src/generators/init/init.ts @@ -15,28 +15,29 @@ export async function initGenerator( tree: Tree, schema: InitSchema ): Promise { - const devDependencies = {}; - if (!schema.skipPackageJson) { - devDependencies['@nrwl/js'] = nxVersion; - if (!schema.js) { - devDependencies['typescript'] = typescriptVersion; - } - } - // add tsconfig.base.json if (!getRootTsConfigFileName(tree)) { generateFiles(tree, joinPathFragments(__dirname, './files'), '.', { fileName: schema.tsConfigName ?? 'tsconfig.base.json', }); } + const devDependencies = { + '@nrwl/js': nxVersion, + }; - if (!schema.skipFormat) { - await formatFiles(tree); + if (!schema.js) { + devDependencies['typescript'] = typescriptVersion; } - return !schema.skipPackageJson + const installTask = !schema.skipPackageJson ? addDependenciesToPackageJson(tree, {}, devDependencies) : () => {}; + + if (!schema.skipFormat) { + await formatFiles(tree); + } + + return installTask; } export default initGenerator; diff --git a/packages/js/src/generators/library/library.ts b/packages/js/src/generators/library/library.ts index 6848953dfe8a9b..51dfd122f70a4a 100644 --- a/packages/js/src/generators/library/library.ts +++ b/packages/js/src/generators/library/library.ts @@ -54,11 +54,13 @@ export async function projectGenerator( destinationDir: string, filesDir: string ) { - await jsInitGenerator(tree, { - js: schema.js, - skipFormat: true, - }); const tasks: GeneratorCallback[] = []; + tasks.push( + await jsInitGenerator(tree, { + ...schema, + skipFormat: true, + }) + ); const options = normalizeOptions(tree, schema, destinationDir); createFiles(tree, options, `${filesDir}/lib`); diff --git a/packages/js/src/utils/typescript/ts-config.ts b/packages/js/src/utils/typescript/ts-config.ts index 33aa25b0b2f302..e52f146a3a210f 100644 --- a/packages/js/src/utils/typescript/ts-config.ts +++ b/packages/js/src/utils/typescript/ts-config.ts @@ -7,13 +7,12 @@ import { } from '@nrwl/devkit'; import { existsSync } from 'fs'; import { dirname, join } from 'path'; -import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; let tsModule: typeof import('typescript'); export function readTsConfig(tsConfigPath: string) { if (!tsModule) { - tsModule = ensureTypescript(); + tsModule = require('typescript'); } const readResult = tsModule.readConfigFile( tsConfigPath, diff --git a/packages/linter/src/generators/workspace-rules-project/workspace-rules-project.ts b/packages/linter/src/generators/workspace-rules-project/workspace-rules-project.ts index cbaf927fa29930..6aae5bdf01f4c8 100644 --- a/packages/linter/src/generators/workspace-rules-project/workspace-rules-project.ts +++ b/packages/linter/src/generators/workspace-rules-project/workspace-rules-project.ts @@ -25,7 +25,7 @@ export const WORKSPACE_PLUGIN_DIR = 'tools/eslint-rules'; export async function lintWorkspaceRulesProjectGenerator(tree: Tree) { const { addPropertyToJestConfig, jestProjectGenerator } = ensurePackage( - '@nrwl/jest/', + '@nrwl/jest', nxVersion ); diff --git a/packages/linter/src/migrations/update-13-3-0/eslint-8-updates.ts b/packages/linter/src/migrations/update-13-3-0/eslint-8-updates.ts index cbc9d8ff53d527..5037120a4e8aea 100644 --- a/packages/linter/src/migrations/update-13-3-0/eslint-8-updates.ts +++ b/packages/linter/src/migrations/update-13-3-0/eslint-8-updates.ts @@ -10,7 +10,7 @@ import { nxVersion } from '../../utils/versions'; export default async function eslint8Updates(tree: Tree) { try { - const { addPropertyToJestConfig } = ensurePackage('@nrwl/jest/', nxVersion); + const { addPropertyToJestConfig } = ensurePackage('@nrwl/jest', nxVersion); const existingJestConfigPath = normalizePath( 'tools/eslint-rules/jest.config.js' ); diff --git a/packages/next/src/generators/init/init.ts b/packages/next/src/generators/init/init.ts index 80b7af7449b59d..62792f9ef737d3 100644 --- a/packages/next/src/generators/init/init.ts +++ b/packages/next/src/generators/init/init.ts @@ -37,18 +37,21 @@ function updateDependencies(host: Tree) { } export async function nextInitGenerator(host: Tree, schema: InitSchema) { - await jsInitGenerator(host, { - js: schema.js, - skipFormat: true, - }); const tasks: GeneratorCallback[] = []; + tasks.push( + await jsInitGenerator(host, { + ...schema, + skipFormat: true, + }) + ); + if (!schema.unitTestRunner || schema.unitTestRunner === 'jest') { const jestTask = await jestInitGenerator(host, schema); tasks.push(jestTask); } if (!schema.e2eTestRunner || schema.e2eTestRunner === 'cypress') { - const cypressTask = cypressInitGenerator(host, {}); + const cypressTask = await cypressInitGenerator(host, {}); tasks.push(cypressTask); } diff --git a/packages/node/src/generators/init/init.ts b/packages/node/src/generators/init/init.ts index e0d01515404f24..34929de14cbe63 100644 --- a/packages/node/src/generators/init/init.ts +++ b/packages/node/src/generators/init/init.ts @@ -37,14 +37,15 @@ function normalizeOptions(schema: Schema) { export async function initGenerator(tree: Tree, schema: Schema) { const options = normalizeOptions(schema); - await jsInitGenerator(tree, { - ...schema, - tsConfigName: schema.rootProject ? 'tsconfig.json' : 'tsconfig.base.json', - js: schema.js, - skipFormat: true, - }); const tasks: GeneratorCallback[] = []; + tasks.push( + await jsInitGenerator(tree, { + ...schema, + tsConfigName: schema.rootProject ? 'tsconfig.json' : 'tsconfig.base.json', + skipFormat: true, + }) + ); if (options.unitTestRunner === 'jest') { tasks.push(await jestInitGenerator(tree, schema)); } diff --git a/packages/nx/src/project-graph/build-dependencies/typescript-import-locator.ts b/packages/nx/src/project-graph/build-dependencies/typescript-import-locator.ts index 9bf235cedbe9a3..ef6814479c31ff 100644 --- a/packages/nx/src/project-graph/build-dependencies/typescript-import-locator.ts +++ b/packages/nx/src/project-graph/build-dependencies/typescript-import-locator.ts @@ -3,7 +3,6 @@ import * as path from 'path'; import { stripSourceCode } from '../../utils/strip-source-code'; import { defaultFileRead } from '../file-utils'; import { DependencyType } from '../../config/project-graph'; -import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; let tsModule: typeof import('typescript'); @@ -11,7 +10,7 @@ export class TypeScriptImportLocator { private readonly scanner: ts.Scanner; constructor() { - tsModule = ensureTypescript(); + tsModule = require('typescript'); this.scanner = tsModule.createScanner(tsModule.ScriptTarget.Latest, false); } diff --git a/packages/nx/src/utils/nx-plugin.ts b/packages/nx/src/utils/nx-plugin.ts index fb6838ae525124..d3de42ca7c70fd 100644 --- a/packages/nx/src/utils/nx-plugin.ts +++ b/packages/nx/src/utils/nx-plugin.ts @@ -23,7 +23,6 @@ import { } from '../project-graph/utils/find-project-for-path'; import { normalizePath } from './path'; import { join } from 'path'; -import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export type ProjectTargetConfigurator = ( file: string diff --git a/packages/react-native/src/generators/init/init.ts b/packages/react-native/src/generators/init/init.ts index 8a9a543a6359b4..fe6e9a4e9a127c 100644 --- a/packages/react-native/src/generators/init/init.ts +++ b/packages/react-native/src/generators/init/init.ts @@ -43,12 +43,15 @@ import { addGitIgnoreEntry } from './lib/add-git-ignore-entry'; export async function reactNativeInitGenerator(host: Tree, schema: Schema) { addGitIgnoreEntry(host); addBabelInputs(host); - await jsInitGenerator(host, { - js: schema.js, - skipFormat: true, - }); const tasks: GeneratorCallback[] = []; + tasks.push( + await jsInitGenerator(host, { + ...schema, + skipFormat: true, + }) + ); + if (!schema.skipPackageJson) { const installTask = updateDependencies(host); diff --git a/packages/react-native/src/generators/stories/stories.ts b/packages/react-native/src/generators/stories/stories.ts index b5d7ebf80ba00b..4f1ef4cd879a9f 100644 --- a/packages/react-native/src/generators/stories/stories.ts +++ b/packages/react-native/src/generators/stories/stories.ts @@ -20,7 +20,10 @@ export async function createAllStories( projectName: string, ignorePaths?: string[] ) { - const { isTheFileAStory } = ensurePackage('@nrwl/storybook', nxVersion); + ensurePackage('@nrwl/storybook', nxVersion); + const { isTheFileAStory } = await import( + '@nrwl/storybook/src/utils/utilities' + ); const projects = getProjects(tree); const projectConfiguration = projects.get(projectName); diff --git a/packages/react/src/generators/init/init.ts b/packages/react/src/generators/init/init.ts index 704f7a468bdeb0..7c180e68c791ab 100755 --- a/packages/react/src/generators/init/init.ts +++ b/packages/react/src/generators/init/init.ts @@ -86,13 +86,15 @@ function initRootBabelConfig(tree: Tree, schema: InitSchema) { } export async function reactInitGenerator(host: Tree, schema: InitSchema) { - await jsInitGenerator(host, { + const tasks: GeneratorCallback[] = []; + + const jsInitTask = await jsInitGenerator(host, { ...schema, tsConfigName: schema.rootProject ? 'tsconfig.json' : 'tsconfig.base.json', - js: schema.js, skipFormat: true, }); - const tasks: GeneratorCallback[] = []; + + tasks.push(jsInitTask); setDefault(host); @@ -101,7 +103,7 @@ export async function reactInitGenerator(host: Tree, schema: InitSchema) { const { cypressInitGenerator } = await import( '@nrwl/cypress/src/generators/init/init' ); - const cypressTask = cypressInitGenerator(host, {}); + const cypressTask = await cypressInitGenerator(host, {}); tasks.push(cypressTask); } diff --git a/packages/storybook/src/generators/cypress-project/cypress-project.ts b/packages/storybook/src/generators/cypress-project/cypress-project.ts index 103fab4e9ef7a2..3d5b8c73100f4b 100644 --- a/packages/storybook/src/generators/cypress-project/cypress-project.ts +++ b/packages/storybook/src/generators/cypress-project/cypress-project.ts @@ -44,7 +44,7 @@ export async function cypressProjectGenerator( const tasks: GeneratorCallback[] = []; if (!projectAlreadyHasCypress(tree)) { - tasks.push(_cypressInitGenerator(tree, {})); + tasks.push(await _cypressInitGenerator(tree, {})); } const installTask = await _cypressProjectGenerator(tree, { diff --git a/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap b/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap index 7f77dbcf57b4a2..82ca798b12675c 100644 --- a/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap +++ b/packages/storybook/src/generators/init/__snapshots__/init.spec.ts.snap @@ -7,6 +7,7 @@ Object { }, "devDependencies": Object { "@angular/forms": "*", + "@nrwl/js": "0.0.1", "@nrwl/storybook": "^6.5.15", "@storybook/addon-essentials": "^6.5.15", "@storybook/angular": "^6.5.15", @@ -15,6 +16,7 @@ Object { "@storybook/manager-webpack5": "^6.5.15", "existing": "1.0.0", "html-webpack-plugin": "^5.5.0", + "typescript": "~4.9.5", "webpack": "^5.64.0", }, "name": "test-name", diff --git a/packages/storybook/src/generators/init/init.ts b/packages/storybook/src/generators/init/init.ts index 6e46bc6a5883b0..e512124c0b2c8c 100644 --- a/packages/storybook/src/generators/init/init.ts +++ b/packages/storybook/src/generators/init/init.ts @@ -1,6 +1,7 @@ import { addDependenciesToPackageJson, convertNxGenerator, + GeneratorCallback, readJson, readNxJson, Tree, @@ -26,6 +27,7 @@ import { webpack5Version, } from '../../utils/versions'; import { Schema } from './schema'; +import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; function checkDependenciesInstalled(host: Tree, schema: Schema) { const packageJson = readJson(host, 'package.json'); @@ -212,15 +214,18 @@ function editRootTsConfig(tree: Tree) { } export async function initGenerator(tree: Tree, schema: Schema) { - await jsInitGenerator(tree, { - js: schema.js, - skipFormat: true, - }); - const installTask = checkDependenciesInstalled(tree, schema); + const tasks: GeneratorCallback[] = []; + tasks.push( + await jsInitGenerator(tree, { + ...schema, + skipFormat: true, + }) + ); + tasks.push(checkDependenciesInstalled(tree, schema)); moveToDevDependencies(tree); editRootTsConfig(tree); addCacheableOperation(tree); - return installTask; + return runTasksInSerial(...tasks); } export default initGenerator; diff --git a/packages/web/src/generators/init/init.ts b/packages/web/src/generators/init/init.ts index b2c64baae86d92..9f5fa50fa759ea 100644 --- a/packages/web/src/generators/init/init.ts +++ b/packages/web/src/generators/init/init.ts @@ -50,7 +50,7 @@ export async function webInitGenerator(tree: Tree, schema: Schema) { tasks.push(jestTask); } if (!schema.e2eTestRunner || schema.e2eTestRunner === 'cypress') { - const cypressTask = cypressInitGenerator(tree, { + const cypressTask = await cypressInitGenerator(tree, { skipPackageJson: schema.skipPackageJson, }); tasks.push(cypressTask);