From 229f71ef1758ee625869aaa6fa6355dc3284fa5b Mon Sep 17 00:00:00 2001 From: Chau Tran Date: Thu, 3 Mar 2022 14:47:06 -0600 Subject: [PATCH] feat(nest): use nrwl/js to generate library (#9164) * chore(js): rename GeneratorSchema to LibraryGeneratorSchema * fix(js): add publishable to library generator schema * feat(nest): use nrwl/js for library generator * fix(js): update documentation about publishable * chore(nest): fix depcheck for nrwl/js * chore(nest): update test snapshot * chore(nest): update nestjs/swagger version in node e2e * chore(js): rename loadTsPlugins function * fix(nest): default standaloneConfig for library generator to true * feat(nest): rename tsPlugins to transformers and add tsPlugins to aliases * chore(nest): fix e2e test on generate a new nest library Co-authored-by: Chau Tran --- docs/generated/api-js/generators/library.md | 8 +++++++ docs/generated/api-nest/generators/library.md | 2 ++ docs/generated/api-node/executors/webpack.md | 6 +++-- e2e/node/src/node.test.ts | 16 ++++++------- e2e/utils/index.ts | 23 +++++++++---------- .../convert-to-swc/convert-to-swc.spec.ts | 4 ++-- .../js/src/generators/library/library.spec.ts | 4 ++-- packages/js/src/generators/library/library.ts | 22 ++++++++++++++---- .../js/src/generators/library/schema.json | 5 ++++ packages/js/src/utils/schema.d.ts | 3 ++- .../typescript/compile-typescript-files.ts | 6 +++-- ...s.spec.ts => load-ts-transformers.spec.ts} | 12 +++++----- ...-ts-plugins.ts => load-ts-transformers.ts} | 4 ++-- packages/nest/package.json | 1 + .../__snapshots__/library.spec.ts.snap | 18 +++++++++++---- .../library/lib/normalize-options.ts | 8 +++---- .../src/generators/library/library.spec.ts | 2 +- .../nest/src/generators/library/library.ts | 10 ++++---- .../nest/src/generators/library/schema.json | 3 ++- .../node/src/executors/webpack/schema.json | 9 ++++---- packages/node/src/utils/config.ts | 15 ++++++------ ...s.spec.ts => load-ts-transformers.spec.ts} | 12 +++++----- ...-ts-plugins.ts => load-ts-transformers.ts} | 10 ++++---- packages/node/src/utils/types.ts | 6 ++--- 24 files changed, 125 insertions(+), 84 deletions(-) rename packages/js/src/utils/typescript/{load-ts-plugins.spec.ts => load-ts-transformers.spec.ts} (72%) rename packages/js/src/utils/typescript/{load-ts-plugins.ts => load-ts-transformers.ts} (98%) rename packages/node/src/utils/{load-ts-plugins.spec.ts => load-ts-transformers.spec.ts} (72%) rename packages/node/src/utils/{load-ts-plugins.ts => load-ts-transformers.ts} (91%) diff --git a/docs/generated/api-js/generators/library.md b/docs/generated/api-js/generators/library.md index d0c205f2b7e9c..27d84e71a7370 100644 --- a/docs/generated/api-js/generators/library.md +++ b/docs/generated/api-js/generators/library.md @@ -115,6 +115,14 @@ Type: `boolean` Use pascal case file names. +### publishable + +Default: `false` + +Type: `boolean` + +Generate a publishable library. + ### setParserOptionsProject Default: `false` diff --git a/docs/generated/api-nest/generators/library.md b/docs/generated/api-nest/generators/library.md index 4a886fcea6f2c..db0ab1c7381d1 100644 --- a/docs/generated/api-nest/generators/library.md +++ b/docs/generated/api-nest/generators/library.md @@ -135,6 +135,8 @@ Do not update tsconfig.base.json for development experience. ### standaloneConfig +Default: `true` + Type: `boolean` Split the project configuration into /project.json rather than including it inside workspace.json diff --git a/docs/generated/api-node/executors/webpack.md b/docs/generated/api-node/executors/webpack.md index 2a5755cfb4a01..db3030261e176 100644 --- a/docs/generated/api-node/executors/webpack.md +++ b/docs/generated/api-node/executors/webpack.md @@ -159,11 +159,13 @@ Type: `boolean` Generates a 'stats.json' file which can be analyzed using tools such as: 'webpack-bundle-analyzer' or . -### tsPlugins +### transformers + +Alias(es): tsPlugins Type: `array` -List of TypeScript Compiler Plugins. +List of TypeScript Compiler Transfomers Plugins. ### verbose diff --git a/e2e/node/src/node.test.ts b/e2e/node/src/node.test.ts index 03fdd4fe35903..3a7b36c86b545 100644 --- a/e2e/node/src/node.test.ts +++ b/e2e/node/src/node.test.ts @@ -1,6 +1,4 @@ import { stripIndents } from '@angular-devkit/core/src/utils/literals'; -import { exec, execSync } from 'child_process'; -import * as http from 'http'; import { checkFilesDoNotExist, checkFilesExist, @@ -18,6 +16,8 @@ import { updateFile, updateProjectConfig, } from '@nrwl/e2e/utils'; +import { exec, execSync } from 'child_process'; +import * as http from 'http'; function getData(port): Promise { return new Promise((resolve) => { @@ -291,8 +291,7 @@ describe('Build Node apps', () => { const nestapp = uniq('nestapp'); runCLI(`generate @nrwl/nest:app ${nestapp} --linter=eslint`); - // TODO: update to v5 when Nest8 is supported - packageInstall('@nestjs/swagger', undefined, '4.8.2'); + packageInstall('@nestjs/swagger', undefined, '~5.0.0'); updateProjectConfig(nestapp, (config) => { config.targets.build.options.tsPlugins = ['@nestjs/swagger/plugin']; @@ -370,9 +369,9 @@ describe('nest libraries', function () { }, testEnvironment: 'node', transform: { - '^.+\\.[tj]sx?$': 'ts-jest', + '^.+\\.[tj]s$': 'ts-jest', }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/libs/${nestlib}', }; ` @@ -424,13 +423,12 @@ describe('nest libraries', function () { ); }, 200000); - it('should have plugin output if specified in `tsPlugins`', async () => { + it('should have plugin output if specified in `transformers`', async () => { newProject(); const nestlib = uniq('nestlib'); runCLI(`generate @nrwl/nest:lib ${nestlib} --buildable`); - // TODO: update to v5 when Nest8 is supported - packageInstall('@nestjs/swagger', undefined, '4.8.2'); + packageInstall('@nestjs/swagger', undefined, '~5.0.0'); updateProjectConfig(nestlib, (config) => { config.targets.build.options.transformers = [ diff --git a/e2e/utils/index.ts b/e2e/utils/index.ts index 4ac783787665e..5182081d3ad20 100644 --- a/e2e/utils/index.ts +++ b/e2e/utils/index.ts @@ -1,4 +1,12 @@ +import { + joinPathFragments, + parseJson, + ProjectConfiguration, + WorkspaceJsonConfiguration, +} from '@nrwl/devkit'; import { detectPackageManager } from '@nrwl/tao/src/shared/package-manager'; +import { Workspaces } from '@nrwl/tao/src/shared/workspace'; +import { angularCliVersion } from '@nrwl/workspace/src/utils/versions'; import { ChildProcess, exec, execSync } from 'child_process'; import { copySync, @@ -14,21 +22,12 @@ import { } from 'fs-extra'; import * as path from 'path'; import { join } from 'path'; -import { dirSync } from 'tmp'; +import { coerce } from 'semver'; import { check as portCheck } from 'tcp-port-used'; -import { - joinPathFragments, - parseJson, - ProjectConfiguration, - WorkspaceJsonConfiguration, -} from '@nrwl/devkit'; +import { dirSync } from 'tmp'; import { promisify } from 'util'; -import { Workspaces } from '@nrwl/tao/src/shared/workspace'; -import { angularCliVersion } from '@nrwl/workspace/src/utils/versions'; -import { coerce } from 'semver'; -import isCI = require('is-ci'); - import chalk = require('chalk'); +import isCI = require('is-ci'); import treeKill = require('tree-kill'); const kill = require('kill-port'); diff --git a/packages/js/src/generators/convert-to-swc/convert-to-swc.spec.ts b/packages/js/src/generators/convert-to-swc/convert-to-swc.spec.ts index d620168608782..3d78c8d042d5c 100644 --- a/packages/js/src/generators/convert-to-swc/convert-to-swc.spec.ts +++ b/packages/js/src/generators/convert-to-swc/convert-to-swc.spec.ts @@ -1,14 +1,14 @@ import { readProjectConfiguration, Tree } from '@nrwl/devkit'; import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; import { join } from 'path'; -import { GeneratorSchema } from '../../utils/schema'; +import { LibraryGeneratorSchema } from '../../utils/schema'; import { libraryGenerator } from '../library/library'; import { convertToSwcGenerator } from './convert-to-swc'; describe('convert to swc', () => { let tree: Tree; - const defaultLibGenerationOptions: Omit = { + const defaultLibGenerationOptions: Omit = { skipTsConfig: false, unitTestRunner: 'jest', skipFormat: false, diff --git a/packages/js/src/generators/library/library.spec.ts b/packages/js/src/generators/library/library.spec.ts index edd87a0405d70..a003b797c9de6 100644 --- a/packages/js/src/generators/library/library.spec.ts +++ b/packages/js/src/generators/library/library.spec.ts @@ -6,12 +6,12 @@ import { updateJson, } from '@nrwl/devkit'; import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; -import { GeneratorSchema } from '../../utils/schema'; +import { LibraryGeneratorSchema } from '../../utils/schema'; import libraryGenerator from './library'; describe('lib', () => { let tree: Tree; - const defaultOptions: Omit = { + const defaultOptions: Omit = { skipTsConfig: false, unitTestRunner: 'jest', skipFormat: false, diff --git a/packages/js/src/generators/library/library.ts b/packages/js/src/generators/library/library.ts index 997f1e324510f..2b6a7e9a093cb 100644 --- a/packages/js/src/generators/library/library.ts +++ b/packages/js/src/generators/library/library.ts @@ -14,21 +14,24 @@ import { updateJson, } from '@nrwl/devkit'; import { join } from 'path'; -import { GeneratorSchema } from '../../utils/schema'; +import { LibraryGeneratorSchema } from '../../utils/schema'; import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; import { Linter, lintProjectGenerator } from '@nrwl/linter'; import { jestProjectGenerator } from '@nrwl/jest'; import { addSwcDependencies } from '../../utils/swc/add-swc-dependencies'; import { addSwcConfig } from '../../utils/swc/add-swc-config'; -export async function libraryGenerator(tree: Tree, schema: GeneratorSchema) { +export async function libraryGenerator( + tree: Tree, + schema: LibraryGeneratorSchema +) { const { libsDir } = getWorkspaceLayout(tree); return projectGenerator(tree, schema, libsDir, join(__dirname, './files')); } export async function projectGenerator( tree: Tree, - schema: GeneratorSchema, + schema: LibraryGeneratorSchema, destinationDir: string, filesDir: string ) { @@ -60,7 +63,7 @@ export async function projectGenerator( return runTasksInSerial(...tasks); } -export interface NormalizedSchema extends GeneratorSchema { +export interface NormalizedSchema extends LibraryGeneratorSchema { name: string; fileName: string; projectRoot: string; @@ -221,9 +224,18 @@ async function addJest( function normalizeOptions( tree: Tree, - options: GeneratorSchema, + options: LibraryGeneratorSchema, destinationDir: string ): NormalizedSchema { + if (options.publishable) { + if (!options.importPath) { + throw new Error( + `For publishable libs you have to provide a proper "--importPath" which needs to be a valid npm package name (e.g. my-awesome-lib or @myorg/my-lib)` + ); + } + options.buildable = true; + } + if (options.config === 'npm-scripts') { options.unitTestRunner = 'none'; options.linter = Linter.None; diff --git a/packages/js/src/generators/library/schema.json b/packages/js/src/generators/library/schema.json index 00fb014f72fa3..a192022c88fa8 100644 --- a/packages/js/src/generators/library/schema.json +++ b/packages/js/src/generators/library/schema.json @@ -77,6 +77,11 @@ "description": "Whether to enable tsconfig strict mode or not.", "default": true }, + "publishable": { + "type": "boolean", + "default": false, + "description": "Generate a publishable library." + }, "buildable": { "type": "boolean", "default": true, diff --git a/packages/js/src/utils/schema.d.ts b/packages/js/src/utils/schema.d.ts index 9549334fc3439..04e4584a58186 100644 --- a/packages/js/src/utils/schema.d.ts +++ b/packages/js/src/utils/schema.d.ts @@ -8,7 +8,7 @@ import { TransformerEntry } from './typescript/types'; export type Compiler = 'tsc' | 'swc'; -export interface GeneratorSchema { +export interface LibraryGeneratorSchema { name: string; directory?: string; skipFormat?: boolean; @@ -22,6 +22,7 @@ export interface GeneratorSchema { js?: boolean; pascalCaseFiles?: boolean; strict?: boolean; + publishable?: boolean; buildable?: boolean; setParserOptionsProject?: boolean; config?: 'workspace' | 'project' | 'npm-scripts'; diff --git a/packages/js/src/utils/typescript/compile-typescript-files.ts b/packages/js/src/utils/typescript/compile-typescript-files.ts index 8f471bcb6ebee..8a7ed15900de8 100644 --- a/packages/js/src/utils/typescript/compile-typescript-files.ts +++ b/packages/js/src/utils/typescript/compile-typescript-files.ts @@ -12,7 +12,7 @@ import type { } from 'typescript'; import { createAsyncIterable } from '../create-async-iterable/create-async-iteratable'; import { NormalizedExecutorOptions } from '../schema'; -import { loadTsPlugins } from './load-ts-plugins'; +import { loadTsTransformers } from './load-ts-transformers'; export async function* compileTypeScriptFiles( normalizedOptions: NormalizedExecutorOptions, @@ -24,7 +24,9 @@ export async function* compileTypeScriptFiles( outfile: normalizedOptions.mainOutputPath, }); - const { compilerPluginHooks } = loadTsPlugins(normalizedOptions.transformers); + const { compilerPluginHooks } = loadTsTransformers( + normalizedOptions.transformers + ); const getCustomTransformers = (program: Program): CustomTransformers => ({ before: compilerPluginHooks.beforeHooks.map( diff --git a/packages/js/src/utils/typescript/load-ts-plugins.spec.ts b/packages/js/src/utils/typescript/load-ts-transformers.spec.ts similarity index 72% rename from packages/js/src/utils/typescript/load-ts-plugins.spec.ts rename to packages/js/src/utils/typescript/load-ts-transformers.spec.ts index e3f420f26ce85..69610f2b0c136 100644 --- a/packages/js/src/utils/typescript/load-ts-plugins.spec.ts +++ b/packages/js/src/utils/typescript/load-ts-transformers.spec.ts @@ -1,22 +1,22 @@ -import { loadTsPlugins } from './load-ts-plugins'; +import { loadTsTransformers } from './load-ts-transformers'; jest.mock('plugin-a'); jest.mock('plugin-b'); const mockRequireResolve = jest.fn((path) => path); -describe('loadTsPlugins', () => { +describe('loadTsTransformers', () => { it('should return empty hooks if plugins is falsy', () => { - const result = loadTsPlugins(undefined); + const result = loadTsTransformers(undefined); assertEmptyResult(result); }); it('should return empty hooks if plugins is []', () => { - const result = loadTsPlugins([]); + const result = loadTsTransformers([]); assertEmptyResult(result); }); it('should return correct compiler hooks', () => { - const result = loadTsPlugins( + const result = loadTsTransformers( ['plugin-a', 'plugin-b'], mockRequireResolve as any ); @@ -29,7 +29,7 @@ describe('loadTsPlugins', () => { }); }); - function assertEmptyResult(result: ReturnType) { + function assertEmptyResult(result: ReturnType) { expect(result.hasPlugin).toEqual(false); expect(result.compilerPluginHooks).toEqual({ beforeHooks: [], diff --git a/packages/js/src/utils/typescript/load-ts-plugins.ts b/packages/js/src/utils/typescript/load-ts-transformers.ts similarity index 98% rename from packages/js/src/utils/typescript/load-ts-plugins.ts rename to packages/js/src/utils/typescript/load-ts-transformers.ts index cb0d321271c52..fc847c54b4632 100644 --- a/packages/js/src/utils/typescript/load-ts-plugins.ts +++ b/packages/js/src/utils/typescript/load-ts-transformers.ts @@ -3,11 +3,11 @@ import { join } from 'path'; import { CompilerPlugin, CompilerPluginHooks, - TransformerPlugin, TransformerEntry, + TransformerPlugin, } from './types'; -export function loadTsPlugins( +export function loadTsTransformers( plugins: TransformerEntry[], moduleResolver: typeof require.resolve = require.resolve ): { diff --git a/packages/nest/package.json b/packages/nest/package.json index 44cf78ede7c5b..5e128a4d8f63d 100644 --- a/packages/nest/package.json +++ b/packages/nest/package.json @@ -32,6 +32,7 @@ "@nrwl/devkit": "*", "@nrwl/linter": "*", "@nrwl/node": "*", + "@nrwl/js": "*", "@nrwl/jest": "*", "@nestjs/schematics": "^8.0.0" } diff --git a/packages/nest/src/generators/library/__snapshots__/library.spec.ts.snap b/packages/nest/src/generators/library/__snapshots__/library.spec.ts.snap index 861dfda1ad2a3..46914eaad4728 100644 --- a/packages/nest/src/generators/library/__snapshots__/library.spec.ts.snap +++ b/packages/nest/src/generators/library/__snapshots__/library.spec.ts.snap @@ -9,11 +9,10 @@ exports[`lib --testEnvironment should set target jest testEnvironment to jsdom 1 tsconfig: '/tsconfig.spec.json', } }, - testEnvironment: 'node', transform: { - '^.+\\\\\\\\.[tj]sx?$': 'ts-jest' + '^.+\\\\\\\\.[tj]s$': 'ts-jest' }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/libs/my-lib' }; " @@ -30,9 +29,9 @@ exports[`lib --testEnvironment should set target jest testEnvironment to node by }, testEnvironment: 'node', transform: { - '^.+\\\\\\\\.[tj]sx?$': 'ts-jest' + '^.+\\\\\\\\.[tj]s$': 'ts-jest' }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], + moduleFileExtensions: ['ts', 'js', 'html'], coverageDirectory: '../../coverage/libs/my-lib' }; " @@ -40,6 +39,9 @@ exports[`lib --testEnvironment should set target jest testEnvironment to node by exports[`lib --unit-test-runner none should not generate test configuration 1`] = ` Object { + "compilerOptions": Object { + "module": "CommonJS", + }, "extends": "../../tsconfig.base.json", "files": Array [], "include": Array [], @@ -67,6 +69,9 @@ Object { exports[`lib nested should create a local tsconfig.json 1`] = ` Object { + "compilerOptions": Object { + "module": "CommonJS", + }, "extends": "../../../tsconfig.base.json", "files": Array [], "include": Array [], @@ -96,6 +101,9 @@ export class MyLibModule {} exports[`lib not nested should create a local tsconfig.json 1`] = ` Object { + "compilerOptions": Object { + "module": "CommonJS", + }, "extends": "../../tsconfig.base.json", "files": Array [], "include": Array [], diff --git a/packages/nest/src/generators/library/lib/normalize-options.ts b/packages/nest/src/generators/library/lib/normalize-options.ts index 34ccb641ee443..e4a9cac1db32c 100644 --- a/packages/nest/src/generators/library/lib/normalize-options.ts +++ b/packages/nest/src/generators/library/lib/normalize-options.ts @@ -1,7 +1,7 @@ import type { Tree } from '@nrwl/devkit'; import { getWorkspaceLayout, joinPathFragments, names } from '@nrwl/devkit'; +import type { LibraryGeneratorSchema as JsLibraryGeneratorSchema } from '@nrwl/js/src/utils/schema'; import { Linter } from '@nrwl/linter'; -import type { Schema as NodeLibraryGeneratorOptions } from '@nrwl/node/src/generators/library/schema'; import type { LibraryGeneratorOptions, NormalizedOptions } from '../schema'; export function normalizeOptions( @@ -42,9 +42,9 @@ export function normalizeOptions( return normalized; } -export function toNodeLibraryGeneratorOptions( +export function toJsLibraryGeneratorOptions( options: LibraryGeneratorOptions -): NodeLibraryGeneratorOptions { +): JsLibraryGeneratorSchema { return { name: options.name, buildable: options.buildable, @@ -58,7 +58,7 @@ export function toNodeLibraryGeneratorOptions( tags: options.tags, testEnvironment: options.testEnvironment, unitTestRunner: options.unitTestRunner, - standaloneConfig: options.standaloneConfig, + config: options.standaloneConfig ? 'project' : 'workspace', setParserOptionsProject: options.setParserOptionsProject, }; } diff --git a/packages/nest/src/generators/library/library.spec.ts b/packages/nest/src/generators/library/library.spec.ts index bf0982f42ced9..f18e2ec175833 100644 --- a/packages/nest/src/generators/library/library.spec.ts +++ b/packages/nest/src/generators/library/library.spec.ts @@ -1,4 +1,4 @@ -import type { NxJsonConfiguration, Tree } from '@nrwl/devkit'; +import type { Tree } from '@nrwl/devkit'; import * as devkit from '@nrwl/devkit'; import { readJson, readProjectConfiguration } from '@nrwl/devkit'; import { createTreeWithEmptyWorkspace } from '@nrwl/devkit/testing'; diff --git a/packages/nest/src/generators/library/library.ts b/packages/nest/src/generators/library/library.ts index 2b68503a7863d..471f59dc631de 100644 --- a/packages/nest/src/generators/library/library.ts +++ b/packages/nest/src/generators/library/library.ts @@ -1,6 +1,6 @@ import type { GeneratorCallback, Tree } from '@nrwl/devkit'; import { convertNxGenerator, formatFiles } from '@nrwl/devkit'; -import { libraryGenerator as nodeLibraryGenerator } from '@nrwl/node'; +import { libraryGenerator as jsLibraryGenerator } from '@nrwl/js'; import { runTasksInSerial } from '@nrwl/workspace/src/utilities/run-tasks-in-serial'; import { addDependencies } from '../init/lib'; import { @@ -9,7 +9,7 @@ import { createFiles, deleteFiles, normalizeOptions, - toNodeLibraryGeneratorOptions, + toJsLibraryGeneratorOptions, updateTsConfig, } from './lib'; import type { LibraryGeneratorOptions } from './schema'; @@ -19,9 +19,9 @@ export async function libraryGenerator( rawOptions: LibraryGeneratorOptions ): Promise { const options = normalizeOptions(tree, rawOptions); - const nodeLibraryTask = await nodeLibraryGenerator( + const jsLibraryTask = await jsLibraryGenerator( tree, - toNodeLibraryGeneratorOptions(options) + toJsLibraryGeneratorOptions(options) ); const installDepsTask = addDependencies(tree); deleteFiles(tree, options); @@ -34,7 +34,7 @@ export async function libraryGenerator( await formatFiles(tree); } - return runTasksInSerial(nodeLibraryTask, installDepsTask); + return runTasksInSerial(jsLibraryTask, installDepsTask); } export default libraryGenerator; diff --git a/packages/nest/src/generators/library/schema.json b/packages/nest/src/generators/library/schema.json index e049834e84253..052929d46fae7 100644 --- a/packages/nest/src/generators/library/schema.json +++ b/packages/nest/src/generators/library/schema.json @@ -109,7 +109,8 @@ }, "standaloneConfig": { "description": "Split the project configuration into /project.json rather than including it inside workspace.json", - "type": "boolean" + "type": "boolean", + "default": true }, "setParserOptionsProject": { "type": "boolean", diff --git a/packages/node/src/executors/webpack/schema.json b/packages/node/src/executors/webpack/schema.json index 0082201051eb5..26ee092b1759a 100644 --- a/packages/node/src/executors/webpack/schema.json +++ b/packages/node/src/executors/webpack/schema.json @@ -131,12 +131,13 @@ "description": "Generates a package.json file with the project's node_module dependencies populated for installing in a container. If a package.json exists in the project's directory, it will be reused with dependencies populated.", "default": false }, - "tsPlugins": { + "transformers": { "type": "array", - "description": "List of TypeScript Compiler Plugins.", + "description": "List of TypeScript Compiler Transfomers Plugins.", "default": [], + "aliases": ["tsPlugins"], "items": { - "$ref": "#/definitions/tsPluginPattern" + "$ref": "#/definitions/transformerPattern" } }, "additionalEntryPoints": { @@ -196,7 +197,7 @@ } ] }, - "tsPluginPattern": { + "transformerPattern": { "oneOf": [ { "type": "string" diff --git a/packages/node/src/utils/config.ts b/packages/node/src/utils/config.ts index b0084db6ab73d..f231d413805e7 100644 --- a/packages/node/src/utils/config.ts +++ b/packages/node/src/utils/config.ts @@ -1,14 +1,13 @@ +import { readTsConfig } from '@nrwl/workspace/src/utilities/typescript'; +import { LicenseWebpackPlugin } from 'license-webpack-plugin'; +import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin'; +import * as ts from 'typescript'; import type { Configuration, WebpackPluginInstance } from 'webpack'; import * as webpack from 'webpack'; -import * as ts from 'typescript'; -import { LicenseWebpackPlugin } from 'license-webpack-plugin'; - -import { readTsConfig } from '@nrwl/workspace/src/utilities/typescript'; +import { loadTsTransformers } from './load-ts-transformers'; import { BuildBuilderOptions } from './types'; -import { loadTsPlugins } from './load-ts-plugins'; import CopyWebpackPlugin = require('copy-webpack-plugin'); import ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin'); -import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin'; export const OUT_FILENAME_TEMPLATE = '[name].js'; @@ -22,7 +21,9 @@ export function getBaseWebpackPartial( const mainFields = [...(supportsEs2015 ? ['es2015'] : []), 'module', 'main']; const extensions = ['.ts', '.tsx', '.mjs', '.js', '.jsx']; - const { compilerPluginHooks, hasPlugin } = loadTsPlugins(options.tsPlugins); + const { compilerPluginHooks, hasPlugin } = loadTsTransformers( + options.transformers + ); const additionalEntryPoints = options.additionalEntryPoints?.reduce( diff --git a/packages/node/src/utils/load-ts-plugins.spec.ts b/packages/node/src/utils/load-ts-transformers.spec.ts similarity index 72% rename from packages/node/src/utils/load-ts-plugins.spec.ts rename to packages/node/src/utils/load-ts-transformers.spec.ts index e3f420f26ce85..69610f2b0c136 100644 --- a/packages/node/src/utils/load-ts-plugins.spec.ts +++ b/packages/node/src/utils/load-ts-transformers.spec.ts @@ -1,22 +1,22 @@ -import { loadTsPlugins } from './load-ts-plugins'; +import { loadTsTransformers } from './load-ts-transformers'; jest.mock('plugin-a'); jest.mock('plugin-b'); const mockRequireResolve = jest.fn((path) => path); -describe('loadTsPlugins', () => { +describe('loadTsTransformers', () => { it('should return empty hooks if plugins is falsy', () => { - const result = loadTsPlugins(undefined); + const result = loadTsTransformers(undefined); assertEmptyResult(result); }); it('should return empty hooks if plugins is []', () => { - const result = loadTsPlugins([]); + const result = loadTsTransformers([]); assertEmptyResult(result); }); it('should return correct compiler hooks', () => { - const result = loadTsPlugins( + const result = loadTsTransformers( ['plugin-a', 'plugin-b'], mockRequireResolve as any ); @@ -29,7 +29,7 @@ describe('loadTsPlugins', () => { }); }); - function assertEmptyResult(result: ReturnType) { + function assertEmptyResult(result: ReturnType) { expect(result.hasPlugin).toEqual(false); expect(result.compilerPluginHooks).toEqual({ beforeHooks: [], diff --git a/packages/node/src/utils/load-ts-plugins.ts b/packages/node/src/utils/load-ts-transformers.ts similarity index 91% rename from packages/node/src/utils/load-ts-plugins.ts rename to packages/node/src/utils/load-ts-transformers.ts index 9ecda283689c2..fc847c54b4632 100644 --- a/packages/node/src/utils/load-ts-plugins.ts +++ b/packages/node/src/utils/load-ts-transformers.ts @@ -3,12 +3,12 @@ import { join } from 'path'; import { CompilerPlugin, CompilerPluginHooks, - TsPlugin, - TsPluginEntry, + TransformerEntry, + TransformerPlugin, } from './types'; -export function loadTsPlugins( - plugins: TsPluginEntry[], +export function loadTsTransformers( + plugins: TransformerEntry[], moduleResolver: typeof require.resolve = require.resolve ): { compilerPluginHooks: CompilerPluginHooks; @@ -29,7 +29,7 @@ export function loadTsPlugins( hasPlugin: false, }; - const normalizedPlugins: TsPlugin[] = plugins.map((plugin) => + const normalizedPlugins: TransformerPlugin[] = plugins.map((plugin) => typeof plugin === 'string' ? { name: plugin, options: {} } : plugin ); diff --git a/packages/node/src/utils/types.ts b/packages/node/src/utils/types.ts index bbc3f5b80265e..a56934941bf37 100644 --- a/packages/node/src/utils/types.ts +++ b/packages/node/src/utils/types.ts @@ -26,12 +26,12 @@ type TransformerFactory = | TypescriptTransformerFactory | CustomTransformerFactory; -export interface TsPlugin { +export interface TransformerPlugin { name: string; options: Record; } -export type TsPluginEntry = string | TsPlugin; +export type TransformerEntry = string | TransformerPlugin; export interface CompilerPlugin { before?: ( @@ -84,7 +84,7 @@ export interface BuildBuilderOptions { sourceRoot?: string; projectRoot?: string; - tsPlugins?: TsPluginEntry[]; + transformers?: TransformerEntry[]; additionalEntryPoints?: AdditionalEntryPoint[]; outputFileName?: string;