import fs from 'fs'; import path from 'path'; import chalk from 'chalk'; import { readTsConfigByFile } from './readTsConfig'; import { applyOptionsChain } from './applyOptionsChain'; type AliasOption = | Record | ((aliases: Record) => Record) | Record | undefined; interface NormalizedConfig { source: { alias?: AliasOption | Array; }; } interface IAliasConfig { absoluteBaseUrl: string; paths?: Record; isTsPath?: boolean; isTsProject?: boolean; } export const validAlias = ( modernConfig: T, { tsconfigPath }: { tsconfigPath: string }, ) => { const { source: { alias }, } = modernConfig; if (!alias) { return null; } const isTsProject = fs.existsSync(tsconfigPath); if (!isTsProject) { return null; } const userAlias = getUserAlias(alias as Record); if (Object.keys(userAlias).length > 0) { return chalk.red( 'Note: Please use `compilerOptions.paths` in "tsconfig.json" file replace `source.alias` config in "modern.config.js/ts" when project is typescript', ); } return null; }; export const getAlias = ( aliasOption: AliasOption | Array, option: { appDirectory: string; tsconfigPath: string }, ) => { const isTsProject = fs.existsSync(option.tsconfigPath); let aliasConfig: IAliasConfig; if (!isTsProject) { aliasConfig = { absoluteBaseUrl: option.appDirectory, paths: applyOptionsChain({ '@': ['./src'] }, aliasOption as any), isTsPath: false, isTsProject, }; } else { const tsconfig = readTsConfigByFile(option.tsconfigPath); const baseUrl = tsconfig?.compilerOptions?.baseUrl; aliasConfig = { absoluteBaseUrl: baseUrl ? path.join(option.appDirectory, baseUrl) : option.appDirectory, paths: { ...(aliasOption || {}), ...tsconfig?.compilerOptions?.paths, }, isTsPath: true, isTsProject, }; } return aliasConfig; }; export const getUserAlias = (alias: Record = {}) => { const keys = Object.keys(alias); const userKeys = keys.filter(key => !key.includes('@modern-js/runtime')); return userKeys.reduce>((o, k) => { o[k] = alias[k]; return o; }, {}); };