Skip to content

Commit

Permalink
feat(js): @nx/js:init generator does not generate prettier and tsconf…
Browse files Browse the repository at this point in the history
…ig.base.json files by default
  • Loading branch information
jaysoo committed Aug 13, 2024
1 parent e011892 commit deadba0
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 33 deletions.
22 changes: 22 additions & 0 deletions packages/js/src/generators/init/init.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down Expand Up @@ -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();
});
});
77 changes: 46 additions & 31 deletions packages/js/src/generators/init/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,17 +63,27 @@ async function getInstalledTypescriptVersion(
export async function initGenerator(
tree: Tree,
schema: InitSchema
): Promise<GeneratorCallback> {
return initGeneratorInternal(tree, {
addTsConfigBase: true,
setUpPrettier: true,
...schema,
});
}

export async function initGeneratorInternal(
tree: Tree,
schema: InitSchema
): Promise<GeneratorCallback> {
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,
Expand All @@ -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 ??= [];
Expand All @@ -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 () => {
Expand Down
4 changes: 3 additions & 1 deletion packages/js/src/generators/init/schema.d.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
export interface InitSchema {
addTsConfigBase?: boolean;
js?: boolean;
keepExistingVersions?: boolean;
setUpPrettier?: boolean;
skipFormat?: boolean;
skipPackageJson?: boolean;
keepExistingVersions?: boolean;
tsConfigName?: string;
}
14 changes: 13 additions & 1 deletion packages/js/src/generators/init/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
}

0 comments on commit deadba0

Please sign in to comment.