diff --git a/docs/generated/packages/js/generators/init.json b/docs/generated/packages/js/generators/init.json index 9e796004bd42c2..47095512a69e44 100644 --- a/docs/generated/packages/js/generators/init.json +++ b/docs/generated/packages/js/generators/init.json @@ -30,10 +30,22 @@ "description": "Keep existing dependencies versions", "default": false }, + "addTsConfigBase": { + "type": "boolean", + "description": "Add a base tsconfig file to the workspace.", + "x-priority": "internal", + "default": false + }, "tsConfigName": { "type": "string", - "description": "Customize the generated tsconfig file name.", + "description": "Customize the generated base tsconfig file name.", "x-priority": "internal" + }, + "setUpPrettier": { + "type": "boolean", + "description": "Add Prettier and corresponding configuration files.", + "x-priority": "internal", + "default": false } }, "presets": [] diff --git a/packages/js/src/generators/init/init.spec.ts b/packages/js/src/generators/init/init.spec.ts index f268c06d284218..b6c7a9fb33e11c 100644 --- a/packages/js/src/generators/init/init.spec.ts +++ b/packages/js/src/generators/init/init.spec.ts @@ -8,6 +8,9 @@ describe('js init generator', () => { beforeEach(() => { tree = createTreeWithEmptyWorkspace(); + // Remove files that should be part of the init generator + tree.delete('tsconfig.base.json'); + tree.delete('.prettierrc'); }); it('should install prettier package', async () => { @@ -117,4 +120,23 @@ describe('js init generator', () => { typescriptVersion ); }); + + it('should support skipping base tsconfig file', async () => { + await init(tree, { + addTsConfigBase: false, + }); + + expect(tree.exists('tsconfig.base.json')).toBeFalsy(); + }); + + it('should support skipping prettier setup', async () => { + await init(tree, { + setUpPrettier: false, + }); + + const packageJson = readJson(tree, 'package.json'); + expect(packageJson.devDependencies['prettier']).toBeUndefined(); + expect(tree.exists('.prettierignore')).toBeFalsy(); + expect(tree.exists('.prettierrc')).toBeFalsy(); + }); }); diff --git a/packages/js/src/generators/init/init.ts b/packages/js/src/generators/init/init.ts index 4a3136f2483894..dca25dac34f07c 100644 --- a/packages/js/src/generators/init/init.ts +++ b/packages/js/src/generators/init/init.ts @@ -63,17 +63,27 @@ async function getInstalledTypescriptVersion( export async function initGenerator( tree: Tree, schema: InitSchema +): Promise { + return initGeneratorInternal(tree, { + addTsConfigBase: true, + setUpPrettier: true, + ...schema, + }); +} + +export async function initGeneratorInternal( + tree: Tree, + schema: InitSchema ): Promise { const tasks: GeneratorCallback[] = []; // add tsconfig.base.json - if (!getRootTsConfigFileName(tree)) { + if (schema.addTsConfigBase && !getRootTsConfigFileName(tree)) { generateFiles(tree, join(__dirname, './files'), '.', { fileName: schema.tsConfigName ?? 'tsconfig.base.json', }); } const devDependencies = { '@nx/js': nxVersion, - prettier: prettierVersion, // When loading .ts config files (e.g. webpack.config.ts, jest.config.ts, etc.) // we prefer to use SWC, and fallback to ts-node for workspaces that don't use SWC. '@swc-node/register': swcNodeVersion, @@ -94,40 +104,45 @@ export async function initGenerator( } } - // https://prettier.io/docs/en/configuration.html - const prettierrcNameOptions = [ - '.prettierrc', - '.prettierrc.json', - '.prettierrc.yml', - '.prettierrc.yaml', - '.prettierrc.json5', - '.prettierrc.js', - '.prettierrc.cjs', - '.prettierrc.mjs', - '.prettierrc.toml', - 'prettier.config.js', - 'prettier.config.cjs', - 'prettier.config.mjs', - ]; - - if (prettierrcNameOptions.every((name) => !tree.exists(name))) { - writeJson(tree, '.prettierrc', { - singleQuote: true, - }); - } + if (schema.setUpPrettier) { + devDependencies['prettier'] = prettierVersion; + + // https://prettier.io/docs/en/configuration.html + const prettierrcNameOptions = [ + '.prettierrc', + '.prettierrc.json', + '.prettierrc.yml', + '.prettierrc.yaml', + '.prettierrc.json5', + '.prettierrc.js', + '.prettierrc.cjs', + '.prettierrc.mjs', + '.prettierrc.toml', + 'prettier.config.js', + 'prettier.config.cjs', + 'prettier.config.mjs', + ]; + + if (prettierrcNameOptions.every((name) => !tree.exists(name))) { + writeJson(tree, '.prettierrc', { + singleQuote: true, + }); + } - if (!tree.exists(`.prettierignore`)) { - tree.write( - '.prettierignore', - stripIndents` + if (!tree.exists(`.prettierignore`)) { + tree.write( + '.prettierignore', + stripIndents` # Add files here to ignore them from prettier formatting /dist /coverage /.nx/cache /.nx/workspace-data ` - ); + ); + } } + if (tree.exists('.vscode/extensions.json')) { updateJson(tree, '.vscode/extensions.json', (json) => { json.recommendations ??= []; @@ -150,9 +165,9 @@ export async function initGenerator( : () => {}; tasks.push(installTask); - ensurePackage('prettier', prettierVersion); - if (!schema.skipFormat) { - await formatFiles(tree); + if (schema.setUpPrettier) { + ensurePackage('prettier', prettierVersion); + if (!schema.skipFormat) await formatFiles(tree); } return async () => { diff --git a/packages/js/src/generators/init/schema.d.ts b/packages/js/src/generators/init/schema.d.ts index 7329258780cef7..e8b1e8613d5f76 100644 --- a/packages/js/src/generators/init/schema.d.ts +++ b/packages/js/src/generators/init/schema.d.ts @@ -1,7 +1,9 @@ export interface InitSchema { + addTsConfigBase?: boolean; js?: boolean; + keepExistingVersions?: boolean; + setUpPrettier?: boolean; skipFormat?: boolean; skipPackageJson?: boolean; - keepExistingVersions?: boolean; tsConfigName?: string; } diff --git a/packages/js/src/generators/init/schema.json b/packages/js/src/generators/init/schema.json index 21d94373c353e0..131bcfead9997b 100644 --- a/packages/js/src/generators/init/schema.json +++ b/packages/js/src/generators/init/schema.json @@ -27,10 +27,22 @@ "description": "Keep existing dependencies versions", "default": false }, + "addTsConfigBase": { + "type": "boolean", + "description": "Add a base tsconfig file to the workspace.", + "x-priority": "internal", + "default": false + }, "tsConfigName": { "type": "string", - "description": "Customize the generated tsconfig file name.", + "description": "Customize the generated base tsconfig file name.", "x-priority": "internal" + }, + "setUpPrettier": { + "type": "boolean", + "description": "Add Prettier and corresponding configuration files.", + "x-priority": "internal", + "default": false } } }