Skip to content

Commit

Permalink
Merge branch 'medz-swc-io'
Browse files Browse the repository at this point in the history
  • Loading branch information
kamilmysliwiec committed Jun 30, 2023
2 parents 19bb1df + f6264ab commit 72599a0
Show file tree
Hide file tree
Showing 15 changed files with 366 additions and 178 deletions.
77 changes: 39 additions & 38 deletions actions/build.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import * as ts from 'typescript';
import { Input } from '../commands';
import { AssetsManager } from '../lib/compiler/assets-manager';
import { Compiler } from '../lib/compiler/compiler';
import { getBuilder } from '../lib/compiler/helpers/get-builder';
import { getTscConfigPath } from '../lib/compiler/helpers/get-tsc-config.path';
import { getValueOrDefault } from '../lib/compiler/helpers/get-value-or-default';
import { getWebpackConfigPath } from '../lib/compiler/helpers/get-webpack-config-path';
import { TsConfigProvider } from '../lib/compiler/helpers/tsconfig-provider';
import { PluginsLoader } from '../lib/compiler/plugins/plugins-loader';
import { SwcCompiler } from '../lib/compiler/swc/swc-compiler';
Expand All @@ -17,7 +20,10 @@ import {
ConfigurationLoader,
NestConfigurationLoader,
} from '../lib/configuration';
import { defaultOutDir } from '../lib/configuration/defaults';
import {
defaultOutDir,
defaultWebpackConfigFilename,
} from '../lib/configuration/defaults';
import { FileSystemReader } from '../lib/readers';
import { ERROR_PREFIX } from '../lib/ui';
import { AbstractAction } from './abstract.action';
Expand All @@ -34,19 +40,26 @@ export class BuildAction extends AbstractAction {
protected readonly assetsManager = new AssetsManager();
protected readonly workspaceUtils = new WorkspaceUtils();

public async handle(inputs: Input[], options: Input[]) {
public async handle(commandInputs: Input[], commandOptions: Input[]) {
try {
const watchModeOption = options.find((option) => option.name === 'watch');
const watchModeOption = commandOptions.find(
(option) => option.name === 'watch',
);
const watchMode = !!(watchModeOption && watchModeOption.value);

const watchAssetsModeOption = options.find(
const watchAssetsModeOption = commandOptions.find(
(option) => option.name === 'watchAssets',
);
const watchAssetsMode = !!(
watchAssetsModeOption && watchAssetsModeOption.value
);

await this.runBuild(inputs, options, watchMode, watchAssetsMode);
await this.runBuild(
commandInputs,
commandOptions,
watchMode,
watchAssetsMode,
);
} catch (err) {
if (err instanceof Error) {
console.log(`\n${ERROR_PREFIX} ${err.message}\n`);
Expand All @@ -58,25 +71,24 @@ export class BuildAction extends AbstractAction {
}

public async runBuild(
inputs: Input[],
options: Input[],
commandInputs: Input[],
commandOptions: Input[],
watchMode: boolean,
watchAssetsMode: boolean,
isDebugEnabled = false,
onSuccess?: () => void,
) {
const configFileName = options.find((option) => option.name === 'config')!
.value as string;
const configFileName = commandOptions.find(
(option) => option.name === 'config',
)!.value as string;
const configuration = await this.loader.load(configFileName);
const appName = inputs.find((input) => input.name === 'app')!
const appName = commandInputs.find((input) => input.name === 'app')!
.value as string;

const pathToTsconfig = getValueOrDefault<string>(
const pathToTsconfig = getTscConfigPath(
configuration,
'compilerOptions.tsConfigPath',
commandOptions,
appName,
'path',
options,
);
const { options: tsOptions } =
this.tsConfigProvider.getByConfigFilename(pathToTsconfig);
Expand All @@ -87,18 +99,11 @@ export class BuildAction extends AbstractAction {
'compilerOptions.webpack',
appName,
'webpack',
options,
commandOptions,
);
const builder = isWebpackEnabled
? 'webpack'
: getValueOrDefault<'tsc' | 'swc' | 'webpack'>(
configuration,
'compilerOptions.builder',
appName,
'builder',
options,
'tsc',
);
? { type: 'webpack' }
: getBuilder(configuration, commandOptions, appName);

await this.workspaceUtils.deleteOutDirIfEnabled(
configuration,
Expand All @@ -112,11 +117,11 @@ export class BuildAction extends AbstractAction {
watchAssetsMode,
);

switch (builder) {
switch (builder.type) {
case 'tsc':
return this.runTsc(
watchMode,
options,
commandOptions,
configuration,
pathToTsconfig,
appName,
Expand All @@ -126,7 +131,7 @@ export class BuildAction extends AbstractAction {
return this.runWebpack(
configuration,
appName,
options,
commandOptions,
pathToTsconfig,
isDebugEnabled,
watchMode,
Expand All @@ -138,7 +143,7 @@ export class BuildAction extends AbstractAction {
appName,
pathToTsconfig,
watchMode,
options,
commandOptions,
tsOptions,
onSuccess,
);
Expand Down Expand Up @@ -178,32 +183,28 @@ export class BuildAction extends AbstractAction {
private runWebpack(
configuration: Required<Configuration>,
appName: string,
inputs: Input[],
commandOptions: Input[],
pathToTsconfig: string,
debug: boolean,
watchMode: boolean,
onSuccess: (() => void) | undefined,
) {
const webpackCompiler = new WebpackCompiler(this.pluginsLoader);

const webpackPath = getValueOrDefault<string>(
configuration,
'compilerOptions.webpackConfigPath',
appName,
'webpackPath',
inputs,
);
const webpackPath =
getWebpackConfigPath(configuration, commandOptions, appName) ??
defaultWebpackConfigFilename;

const webpackConfigFactoryOrConfig = this.getWebpackConfigFactoryByPath(
webpackPath,
configuration.compilerOptions!.webpackConfigPath!,
defaultWebpackConfigFilename,
);
return webpackCompiler.run(
configuration,
pathToTsconfig,
appName,
{
inputs,
inputs: commandOptions,
webpackConfigFactoryOrConfig,
debug,
watchMode,
Expand Down
38 changes: 21 additions & 17 deletions actions/start.action.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,37 +3,41 @@ import { spawn } from 'child_process';
import * as fs from 'fs';
import { join } from 'path';
import * as killProcess from 'tree-kill';
import { treeKillSync as killProcessSync } from '../lib/utils/tree-kill';
import { Input } from '../commands';
import { getTscConfigPath } from '../lib/compiler/helpers/get-tsc-config.path';
import { getValueOrDefault } from '../lib/compiler/helpers/get-value-or-default';
import {
defaultConfiguration,
defaultOutDir,
} from '../lib/configuration/defaults';
import { ERROR_PREFIX } from '../lib/ui';
import { treeKillSync as killProcessSync } from '../lib/utils/tree-kill';
import { BuildAction } from './build.action';

export class StartAction extends BuildAction {
public async handle(inputs: Input[], options: Input[]) {
public async handle(commandInputs: Input[], commandOptions: Input[]) {
try {
const configFileName = options.find((option) => option.name === 'config')!
.value as string;
const configFileName = commandOptions.find(
(option) => option.name === 'config',
)!.value as string;
const configuration = await this.loader.load(configFileName);
const appName = inputs.find((input) => input.name === 'app')!
const appName = commandInputs.find((input) => input.name === 'app')!
.value as string;

const pathToTsconfig = getValueOrDefault<string>(
const pathToTsconfig = getTscConfigPath(
configuration,
'compilerOptions.tsConfigPath',
commandOptions,
appName,
'path',
options,
);

const debugModeOption = options.find((option) => option.name === 'debug');
const watchModeOption = options.find((option) => option.name === 'watch');
const debugModeOption = commandOptions.find(
(option) => option.name === 'debug',
);
const watchModeOption = commandOptions.find(
(option) => option.name === 'watch',
);
const isWatchEnabled = !!(watchModeOption && watchModeOption.value);
const watchAssetsModeOption = options.find(
const watchAssetsModeOption = commandOptions.find(
(option) => option.name === 'watchAssets',
);
const isWatchAssetsEnabled = !!(
Expand All @@ -45,7 +49,7 @@ export class StartAction extends BuildAction {
'exec',
appName,
'exec',
options,
commandOptions,
defaultConfiguration.exec,
);

Expand All @@ -57,15 +61,15 @@ export class StartAction extends BuildAction {
'entryFile',
appName,
'entryFile',
options,
commandOptions,
defaultConfiguration.entryFile,
);
const sourceRoot = getValueOrDefault(
configuration,
'sourceRoot',
appName,
'sourceRoot',
options,
commandOptions,
defaultConfiguration.sourceRoot,
);
const onSuccess = this.createOnSuccessHook(
Expand All @@ -77,8 +81,8 @@ export class StartAction extends BuildAction {
);

await this.runBuild(
inputs,
options,
commandInputs,
commandOptions,
isWatchEnabled,
isWatchAssetsEnabled,
!!debugFlag,
Expand Down
2 changes: 1 addition & 1 deletion commands/build.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export class BuildCommand extends AbstractCommand {
.option('--watchAssets', 'Watch non-ts (e.g., .graphql) files mode.')
.option(
'--webpack',
'Use webpack for compilation (deprecated option, use --build instead).',
'Use webpack for compilation (deprecated option, use --builder instead).',
)
.option('--type-check', 'Enable type checking (when SWC is used).')
.option('--webpackPath [path]', 'Path to webpack configuration.')
Expand Down
2 changes: 1 addition & 1 deletion commands/start.command.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class StartCommand extends AbstractCommand {
)
.option(
'--webpack',
'Use webpack for compilation (deprecated option, use --build instead).',
'Use webpack for compilation (deprecated option, use --builder instead).',
)
.option('--webpackPath [path]', 'Path to webpack configuration.')
.option('--type-check', 'Enable type checking (when SWC is used).')
Expand Down
18 changes: 14 additions & 4 deletions lib/compiler/defaults/swc-defaults.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
import * as ts from 'typescript';
import { Configuration } from '../../configuration';

export const swcDefaultsFactory = (
tsOptions: ts.CompilerOptions,
configuration: Configuration,
) => {
const builderOptions =
typeof configuration.compilerOptions?.builder !== 'string'
? configuration.compilerOptions?.builder?.options
: {};

export const swcDefaultsFactory = (tsOptions: ts.CompilerOptions) => {
return {
swcOptions: {
module: {
Expand All @@ -25,14 +34,15 @@ export const swcDefaultsFactory = (tsOptions: ts.CompilerOptions) => {
swcrc: true,
},
cliOptions: {
outDir: 'dist',
filenames: ['src'],
outDir: tsOptions.outDir ?? 'dist',
filenames: [configuration?.sourceRoot ?? 'src'],
sync: false,
extensions: ['.js', '.ts'],
watch: false,
copyFiles: false,
includeDotfiles: false,
quiet: false,
watch: false,
...builderOptions,
},
};
};
4 changes: 2 additions & 2 deletions lib/compiler/defaults/webpack-defaults.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { join } from 'path';
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
import { defaultConfiguration } from '../../configuration/defaults';
import { defaultTsconfigFilename } from '../../configuration/defaults';
import { appendTsExtension } from '../helpers/append-extension';
import { MultiNestCompilerPlugins } from '../plugins/plugins-loader';
import webpack = require('webpack');
Expand All @@ -11,7 +11,7 @@ export const webpackDefaultsFactory = (
relativeSourceRoot: string,
entryFilename: string,
isDebugEnabled = false,
tsConfigFile = defaultConfiguration.compilerOptions.tsConfigPath,
tsConfigFile = defaultTsconfigFilename,
plugins: MultiNestCompilerPlugins,
): webpack.Configuration => {
const isPluginRegistered = isAnyPluginRegistered(plugins);
Expand Down
30 changes: 30 additions & 0 deletions lib/compiler/helpers/get-builder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { Input } from '../../../commands';
import { Builder, Configuration } from '../../configuration';
import { getValueOrDefault } from './get-value-or-default';

/**
* Returns the builder to use for the given application.
* @param configuration Configuration object.
* @param cmdOptions Command line options.
* @param appName Application name.
* @returns The builder to use.
*/
export function getBuilder(
configuration: Required<Configuration>,
cmdOptions: Input[],
appName: string,
) {
const builderValue = getValueOrDefault<Builder>(
configuration,
'compilerOptions.builder',
appName,
'builder',
cmdOptions,
'tsc',
);
return typeof builderValue === 'string'
? {
type: builderValue,
}
: builderValue;
}

0 comments on commit 72599a0

Please sign in to comment.