diff --git a/packages/angular/src/generators/application/angular-v14/lib/root-router-config.ts b/packages/angular/src/generators/application/angular-v14/lib/root-router-config.ts index c315768ae9ef4c..5cdfd1997d7086 100644 --- a/packages/angular/src/generators/application/angular-v14/lib/root-router-config.ts +++ b/packages/angular/src/generators/application/angular-v14/lib/root-router-config.ts @@ -1,21 +1,25 @@ import type { Tree } from '@nrwl/devkit'; -import type { NormalizedSchema } from './normalized-schema'; - import { insertImport } from '@nrwl/workspace/src/utilities/ast-utils'; -import * as ts from 'typescript'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; import { addImportToModule } from '../../../../utils/nx-devkit/ast-utils'; +import type { NormalizedSchema } from './normalized-schema'; + +let tsModule: typeof import('typescript'); export function addRouterRootConfiguration( host: Tree, options: NormalizedSchema ) { + if (!tsModule) { + tsModule = ensureTypescript(); + } const modulePath = `${options.appProjectRoot}/src/app/app.module.ts`; const moduleSource = host.read(modulePath, 'utf-8'); - let sourceFile = ts.createSourceFile( + let sourceFile = tsModule.createSourceFile( modulePath, moduleSource, - ts.ScriptTarget.Latest, + tsModule.ScriptTarget.Latest, true ); diff --git a/packages/angular/src/generators/application/angular-v14/lib/update-app-component-template.ts b/packages/angular/src/generators/application/angular-v14/lib/update-app-component-template.ts index 473a3b45e3389f..cde348f017398d 100644 --- a/packages/angular/src/generators/application/angular-v14/lib/update-app-component-template.ts +++ b/packages/angular/src/generators/application/angular-v14/lib/update-app-component-template.ts @@ -1,16 +1,20 @@ import type { Tree } from '@nrwl/devkit'; -import type { NormalizedSchema } from './normalized-schema'; - -import * as ts from 'typescript'; +import type * as ts from 'typescript'; import { replaceNodeValue } from '@nrwl/workspace/src/utilities/ast-utils'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; import { getDecoratorPropertyValueNode } from '../../../../utils/nx-devkit/ast-utils'; - import { nrwlHomeTemplate } from './nrwl-home-tpl'; +import type { NormalizedSchema } from './normalized-schema'; + +let tsModule: typeof import('typescript'); export function updateAppComponentTemplate( host: Tree, options: NormalizedSchema ) { + if (!tsModule) { + tsModule = ensureTypescript(); + } const content = options.routing ? `${nrwlHomeTemplate.getSelector( options.prefix @@ -35,10 +39,10 @@ export function updateAppComponentTemplate( replaceNodeValue( host, - ts.createSourceFile( + tsModule.createSourceFile( componentPath, host.read(componentPath, 'utf-8'), - ts.ScriptTarget.Latest, + tsModule.ScriptTarget.Latest, true ), componentPath, diff --git a/packages/angular/src/generators/application/angular-v14/lib/update-component-spec.ts b/packages/angular/src/generators/application/angular-v14/lib/update-component-spec.ts index 7f6765cfec918b..5d94bdfd862bde 100644 --- a/packages/angular/src/generators/application/angular-v14/lib/update-component-spec.ts +++ b/packages/angular/src/generators/application/angular-v14/lib/update-component-spec.ts @@ -1,17 +1,17 @@ import type { Tree } from '@nrwl/devkit'; -import type { NormalizedSchema } from './normalized-schema'; - import { insertImport } from '@nrwl/workspace/src/utilities/ast-utils'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; import { addImportToTestBed, replaceIntoToTestBed, } from '../../../../utils/nx-devkit/ast-utils'; +import type { NormalizedSchema } from './normalized-schema'; let tsModule: typeof import('typescript'); export function updateComponentSpec(host: Tree, options: NormalizedSchema) { if (!tsModule) { - tsModule = require('typescript'); + tsModule = ensureTypescript(); } if (options.skipTests !== true) { const componentSpecPath = `${options.appProjectRoot}/src/app/app.component.spec.ts`; diff --git a/packages/angular/src/generators/ngrx/lib/validate-options.ts b/packages/angular/src/generators/ngrx/lib/validate-options.ts index dc1f3fdc2b6c8f..39906c5fbc970b 100644 --- a/packages/angular/src/generators/ngrx/lib/validate-options.ts +++ b/packages/angular/src/generators/ngrx/lib/validate-options.ts @@ -1,5 +1,4 @@ import type { Tree } from '@nrwl/devkit'; -import { tsquery } from '@phenomnomnominal/tsquery'; import { coerce, lt, major } from 'semver'; import { getInstalledAngularVersionInfo, @@ -36,6 +35,7 @@ export function validateOptions( if (lt(angularVersionInfo.version, '14.1.0') || ngrxMajorVersion < 15) { const parentPath = options.parent ?? options.module; const parentContent = tree.read(parentPath, 'utf-8'); + const { tsquery } = require('@phenomnomnominal/tsquery'); const ast = tsquery.ast(parentContent); const NG_MODULE_DECORATOR_SELECTOR = diff --git a/packages/angular/src/generators/scam-to-standalone/lib/convert-scam-to-standalone.ts b/packages/angular/src/generators/scam-to-standalone/lib/convert-scam-to-standalone.ts index 998e5b73ccdf44..59e564962e7a7f 100644 --- a/packages/angular/src/generators/scam-to-standalone/lib/convert-scam-to-standalone.ts +++ b/packages/angular/src/generators/scam-to-standalone/lib/convert-scam-to-standalone.ts @@ -1,6 +1,5 @@ import { Node, SourceFile } from 'typescript'; import { Tree } from 'nx/src/generators/tree'; -import { tsquery } from '@phenomnomnominal/tsquery'; import { parse } from 'path'; import { joinPathFragments } from 'nx/src/utils/path'; @@ -17,6 +16,7 @@ export function convertScamToStandalone( let newComponentContents = ''; const COMPONENT_PROPERTY_SELECTOR = 'ClassDeclaration > Decorator > CallExpression:has(Identifier[name=Component]) ObjectLiteralExpression'; + const { tsquery } = require('@phenomnomnominal/tsquery'); const componentDecoratorMetadataNode = tsquery( componentAST, COMPONENT_PROPERTY_SELECTOR, diff --git a/packages/angular/src/generators/scam-to-standalone/lib/get-component-data-from-ast.ts b/packages/angular/src/generators/scam-to-standalone/lib/get-component-data-from-ast.ts index 81eacb145bc6fe..fbb1a5a6d42dff 100644 --- a/packages/angular/src/generators/scam-to-standalone/lib/get-component-data-from-ast.ts +++ b/packages/angular/src/generators/scam-to-standalone/lib/get-component-data-from-ast.ts @@ -1,5 +1,4 @@ import { Tree } from 'nx/src/generators/tree'; -import { tsquery } from '@phenomnomnominal/tsquery'; export function getComponentDataFromAST( tree: Tree, @@ -11,6 +10,7 @@ export function getComponentDataFromAST( 'ClassDeclaration:has(Decorator > CallExpression:has(Identifier[name=Component])) > Identifier'; const componentFileContents = tree.read(normalizedComponentPath, 'utf-8'); + const { tsquery } = require('@phenomnomnominal/tsquery'); const componentAST = tsquery.ast(componentFileContents); const componentNode = tsquery(componentAST, COMPONENT_CONTENT_SELECTOR, { diff --git a/packages/angular/src/generators/scam-to-standalone/lib/get-module-metadata-from-ast.ts b/packages/angular/src/generators/scam-to-standalone/lib/get-module-metadata-from-ast.ts index c98d5b5c48982e..58447c635c9bf5 100644 --- a/packages/angular/src/generators/scam-to-standalone/lib/get-module-metadata-from-ast.ts +++ b/packages/angular/src/generators/scam-to-standalone/lib/get-module-metadata-from-ast.ts @@ -1,5 +1,4 @@ -import { SourceFile } from 'typescript'; -import { tsquery } from '@phenomnomnominal/tsquery'; +import type { SourceFile } from 'typescript'; export function getModuleMetadataFromAST( componentAST: SourceFile, @@ -7,6 +6,7 @@ export function getModuleMetadataFromAST( ) { const NGMODULE_CONTENT_SELECTOR = 'ClassDeclaration:has(Decorator > CallExpression:has(Identifier[name=NgModule]))'; + const { tsquery } = require('@phenomnomnominal/tsquery'); const moduleNodes = tsquery(componentAST, NGMODULE_CONTENT_SELECTOR, { visitAllChildren: true, }); diff --git a/packages/angular/src/generators/scam-to-standalone/lib/selector-exists-in-ast.ts b/packages/angular/src/generators/scam-to-standalone/lib/selector-exists-in-ast.ts index a6dd28e2727498..74bdf7c8c35427 100644 --- a/packages/angular/src/generators/scam-to-standalone/lib/selector-exists-in-ast.ts +++ b/packages/angular/src/generators/scam-to-standalone/lib/selector-exists-in-ast.ts @@ -1,6 +1,6 @@ -import { SourceFile } from 'typescript'; -import { tsquery } from '@phenomnomnominal/tsquery'; +import type { SourceFile } from 'typescript'; export function selectorExistsInAST(selector: string, ast: SourceFile) { + const { tsquery } = require('@phenomnomnominal/tsquery'); return tsquery(ast, selector, { visitAllChildren: true }).length > 0; } diff --git a/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts b/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts index 5a5207cf1219d1..41846e96a400bf 100644 --- a/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts +++ b/packages/angular/src/generators/setup-mf/lib/add-remote-to-host.ts @@ -7,8 +7,6 @@ import { updateJson, } from '@nrwl/devkit'; import type { Schema } from '../schema'; -import { tsquery } from '@phenomnomnominal/tsquery'; -import type * as ts from 'typescript'; import { ArrayLiteralExpression } from 'typescript'; import { insertImport } from '@nrwl/workspace/src/utilities/ast-utils'; import { addRoute } from '../../../utils/nx-devkit/route-utils'; @@ -85,6 +83,7 @@ function addRemoteToStaticHost( } const hostMFConfig = tree.read(hostMFConfigPath, 'utf-8'); + const { tsquery } = require('@phenomnomnominal/tsquery'); const webpackAst = tsquery.ast(hostMFConfig); const mfRemotesNode = tsquery( webpackAst, diff --git a/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts b/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts index 86d037f4b1d282..e96d0d8aa947ad 100644 --- a/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts +++ b/packages/angular/src/generators/setup-mf/lib/update-host-app-routes.ts @@ -1,11 +1,17 @@ import { Tree } from 'nx/src/generators/tree'; -import { Schema } from '../schema'; import { readProjectConfiguration } from 'nx/src/generators/utils/project-configuration'; import { generateFiles, joinPathFragments, names } from '@nrwl/devkit'; -import * as ts from 'typescript'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; import { addRoute } from '../../../utils/nx-devkit/route-utils'; +import { Schema } from '../schema'; + +let tsModule: typeof import('typescript'); export function updateHostAppRoutes(tree: Tree, options: Schema) { + if (!tsModule) { + tsModule = ensureTypescript(); + } + const { sourceRoot } = readProjectConfiguration(tree, options.appName); const remoteRoutes = @@ -36,10 +42,10 @@ ${remoteRoutes} const hostRootRoutingFile = tree.read(pathToHostRootRoutingFile, 'utf-8'); - let sourceFile = ts.createSourceFile( + let sourceFile = tsModule.createSourceFile( pathToHostRootRoutingFile, hostRootRoutingFile, - ts.ScriptTarget.Latest, + tsModule.ScriptTarget.Latest, true ); diff --git a/packages/angular/src/generators/utils/storybook-ast/storybook-inputs.ts b/packages/angular/src/generators/utils/storybook-ast/storybook-inputs.ts index 3bd28dc5261110..6abb07bc2e81e1 100644 --- a/packages/angular/src/generators/utils/storybook-ast/storybook-inputs.ts +++ b/packages/angular/src/generators/utils/storybook-ast/storybook-inputs.ts @@ -2,8 +2,10 @@ import type { Tree } from '@nrwl/devkit'; import { findNodes } from 'nx/src/utils/typescript'; import { getSourceNodes } from '@nrwl/workspace/src/utilities/typescript'; import type { PropertyDeclaration } from 'typescript'; -import { SyntaxKind } from 'typescript'; import { getTsSourceFile } from '../../../utils/nx-devkit/ast-utils'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; + +let tsModule: typeof import('typescript'); export type KnobType = 'text' | 'boolean' | 'number' | 'select'; export interface InputDescriptor { @@ -16,15 +18,18 @@ export function getInputPropertyDeclarations( tree: Tree, path: string ): PropertyDeclaration[] { + if (!tsModule) { + tsModule = ensureTypescript(); + } const file = getTsSourceFile(tree, path); const decorators = getSourceNodes(file).filter( - (node) => node.kind === SyntaxKind.Decorator + (node) => node.kind === tsModule.SyntaxKind.Decorator ); return decorators .filter((decorator) => - findNodes(decorator, SyntaxKind.Identifier).some( + findNodes(decorator, tsModule.SyntaxKind.Identifier).some( (node) => node.getText() === 'Input' ) ) @@ -39,13 +44,16 @@ export function getComponentProps( ) => string | undefined = getArgsDefaultValue, useDecoratorName = true ): InputDescriptor[] { + if (!tsModule) { + tsModule = ensureTypescript(); + } const props = getInputPropertyDeclarations(tree, componentPath).map( (node) => { const decoratorContent = findNodes( - findNodes(node, SyntaxKind.Decorator).find((n) => + findNodes(node, tsModule.SyntaxKind.Decorator).find((n) => n.getText().startsWith('@Input') ), - SyntaxKind.StringLiteral + tsModule.SyntaxKind.StringLiteral ); const name = useDecoratorName && decoratorContent.length @@ -69,6 +77,9 @@ export function getComponentProps( } export function getKnobType(property: PropertyDeclaration): KnobType { + if (!tsModule) { + tsModule = ensureTypescript(); + } if (property.type) { const typeName = property.type.getText(); const typeNameToKnobType: Record = { @@ -80,10 +91,10 @@ export function getKnobType(property: PropertyDeclaration): KnobType { } if (property.initializer) { const initializerKindToKnobType: Record = { - [SyntaxKind.StringLiteral]: 'text', - [SyntaxKind.NumericLiteral]: 'number', - [SyntaxKind.TrueKeyword]: 'boolean', - [SyntaxKind.FalseKeyword]: 'boolean', + [tsModule.SyntaxKind.StringLiteral]: 'text', + [tsModule.SyntaxKind.NumericLiteral]: 'number', + [tsModule.SyntaxKind.TrueKeyword]: 'boolean', + [tsModule.SyntaxKind.FalseKeyword]: 'boolean', }; return initializerKindToKnobType[property.initializer.kind] || 'text'; } diff --git a/packages/angular/src/utils/get-mf-projects.ts b/packages/angular/src/utils/get-mf-projects.ts index 6605ff41ffe91b..fc4202361f5792 100644 --- a/packages/angular/src/utils/get-mf-projects.ts +++ b/packages/angular/src/utils/get-mf-projects.ts @@ -1,5 +1,4 @@ import type { Tree } from '@nrwl/devkit'; -import { tsquery } from '@phenomnomnominal/tsquery'; import { forEachExecutorOptions } from '@nrwl/workspace/src/utilities/executor-options-utils'; export function getMFProjects( @@ -22,6 +21,7 @@ export function getMFProjects( return; } const webpackConfig = tree.read(webpackPath, 'utf-8'); + const { tsquery } = require('@phenomnomnominal/tsquery'); const ast = tsquery.ast(webpackConfig); const moduleFederationWebpackConfig = tsquery( ast, diff --git a/packages/angular/src/utils/nx-devkit/route-utils.ts b/packages/angular/src/utils/nx-devkit/route-utils.ts index 96b1bf2a459057..35b73bda8aaf80 100644 --- a/packages/angular/src/utils/nx-devkit/route-utils.ts +++ b/packages/angular/src/utils/nx-devkit/route-utils.ts @@ -19,9 +19,8 @@ export function addRoute( ); } if (!tsModule) { - tsModule = require('typescript'); + tsModule = ensureTypescript(); } - ensureTypescript(); const { tsquery } = require('@phenomnomnominal/tsquery'); let routesFileContents = tree.read(routesFile, 'utf-8'); diff --git a/packages/devkit/src/generators/to-js.ts b/packages/devkit/src/generators/to-js.ts index 709adc79ef586c..01c6afb23a9fc8 100644 --- a/packages/devkit/src/generators/to-js.ts +++ b/packages/devkit/src/generators/to-js.ts @@ -1,10 +1,16 @@ import type { Tree } from 'nx/src/generators/tree'; +// eslint-disable-next-line @typescript-eslint/no-restricted-imports +import { typescriptVersion } from 'nx/src/utils/versions'; +import { ensurePackage } from '../utils/package-json'; /** * Rename and transpile any new typescript files created to javascript files */ export function toJS(tree: Tree): void { - const { JsxEmit, ScriptTarget, transpile } = require('typescript'); + const { JsxEmit, ScriptTarget, transpile } = ensurePackage( + 'typescript', + typescriptVersion + ); for (const c of tree.listChanges()) { if ( diff --git a/packages/js/src/generators/library/library.ts b/packages/js/src/generators/library/library.ts index 0b0ef4dd785dff..bf3f0c2665f972 100644 --- a/packages/js/src/generators/library/library.ts +++ b/packages/js/src/generators/library/library.ts @@ -12,7 +12,6 @@ import { names, offsetFromRoot, ProjectConfiguration, - readJson, toJS, Tree, updateJson, diff --git a/packages/react-native/src/generators/component/component.ts b/packages/react-native/src/generators/component/component.ts index 9ba5280263ffdf..962162ddc7807f 100644 --- a/packages/react-native/src/generators/component/component.ts +++ b/packages/react-native/src/generators/component/component.ts @@ -1,4 +1,3 @@ -import * as ts from 'typescript'; import { Schema } from './schema'; import { applyChangesToString, @@ -12,6 +11,7 @@ import { } from '@nrwl/devkit'; import { NormalizedSchema, normalizeOptions } from './lib/normalize-options'; import { addImport } from './lib/add-import'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; export async function reactNativeComponentGenerator( host: Tree, @@ -53,7 +53,11 @@ function createComponentFiles(host: Tree, options: NormalizedSchema) { } } +let tsModule: typeof import('typescript'); function addExportsToBarrel(host: Tree, options: NormalizedSchema) { + if (!tsModule) { + tsModule = ensureTypescript(); + } const workspace = getProjects(host); const isApp = workspace.get(options.project).projectType === 'application'; @@ -64,10 +68,10 @@ function addExportsToBarrel(host: Tree, options: NormalizedSchema) { ); const indexSource = host.read(indexFilePath, 'utf-8'); if (indexSource !== null) { - const indexSourceFile = ts.createSourceFile( + const indexSourceFile = tsModule.createSourceFile( indexFilePath, indexSource, - ts.ScriptTarget.Latest, + tsModule.ScriptTarget.Latest, true ); const changes = applyChangesToString( diff --git a/packages/react-native/src/generators/component/lib/add-import.ts b/packages/react-native/src/generators/component/lib/add-import.ts index 5e51c4bb21f736..46035d9023be93 100644 --- a/packages/react-native/src/generators/component/lib/add-import.ts +++ b/packages/react-native/src/generators/component/lib/add-import.ts @@ -1,12 +1,17 @@ import { findNodes } from 'nx/src/utils/typescript'; -import * as ts from 'typescript'; +import type * as ts from 'typescript'; import { ChangeType, StringChange } from '@nrwl/devkit'; +import { ensureTypescript } from '@nrwl/js/src/utils/typescript/ensure-typescript'; +let tsModule: typeof import('typescript'); export function addImport( source: ts.SourceFile, statement: string ): StringChange[] { - const allImports = findNodes(source, ts.SyntaxKind.ImportDeclaration); + if (!tsModule) { + tsModule = ensureTypescript(); + } + const allImports = findNodes(source, tsModule.SyntaxKind.ImportDeclaration); if (allImports.length > 0) { const lastImport = allImports[allImports.length - 1]; return [