You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
4.5 KiB
136 lines
4.5 KiB
import { BaseCommand } from '../../utls/base-command';
|
|
import { system, filesystem, patching } from 'gluegun';
|
|
import * as prompts from 'prompts';
|
|
import * as fs from 'fs';
|
|
import { plugins, add, commit } from 'isomorphic-git';
|
|
import { BaseAddCommand } from '../../utls/base-add-command';
|
|
|
|
plugins.set('fs', fs);
|
|
|
|
export default class Prettier extends BaseAddCommand {
|
|
static description = 'add tailwindcss to a project';
|
|
|
|
static flags = {
|
|
...BaseCommand.flags,
|
|
};
|
|
|
|
async run() {
|
|
if (!this.hasDirPackageJson()) {
|
|
this.error('There is no package.json not found in the current folder');
|
|
}
|
|
|
|
if (!this.hasDependencyInPackageJson('react-scripts')) {
|
|
this.error('This script support only for now create react apps.');
|
|
}
|
|
|
|
const { shouldCommit } = await prompts(
|
|
[
|
|
{
|
|
type: 'confirm',
|
|
message: 'Do you want gitmoji commits with the prettier setup ?',
|
|
name: 'shouldCommit',
|
|
initial: true,
|
|
},
|
|
],
|
|
{ onCancel: () => this.error('User canceled prompt.') },
|
|
);
|
|
|
|
if (shouldCommit) {
|
|
this.initGit();
|
|
}
|
|
|
|
await this.installForCreateReactApps(shouldCommit);
|
|
}
|
|
|
|
async installForCreateReactApps(shouldCommit: boolean): Promise<void> {
|
|
await this.addDevDependency('@fullhuman/postcss-purgecss', shouldCommit);
|
|
await this.addDevDependency('autoprefixer', shouldCommit);
|
|
await this.addDevDependency('npm-run-all', shouldCommit);
|
|
await this.addDevDependency('postcss-cli', shouldCommit);
|
|
await this.addDependency('tailwindcss', shouldCommit);
|
|
|
|
await this.runWithSpinner('Generating tailwind initial config', async () => {
|
|
await system.exec('yarn tailwindcss init --full');
|
|
|
|
if (shouldCommit) {
|
|
await add({ filepath: 'tailwind.config.js', dir: '.' });
|
|
await commit({ dir: '.', message: ':wrench: add tailwind config file' });
|
|
}
|
|
});
|
|
await this.runWithSpinner('Generating postcss', async () => {
|
|
await filesystem.write(
|
|
'postcss.config.js',
|
|
`const purgecss = require('@fullhuman/postcss-purgecss')({
|
|
content: ['./src/**/*.jsx', './src/**/*.js', './src/index.js', './public/index.html'],
|
|
css: ['./src/tailwind.css'],
|
|
// Include any special characters you're using in this regular expression
|
|
defaultExtractor: content => content.match(/[A-Za-z0-9-_:/]+/g) || [],
|
|
});
|
|
module.exports = {
|
|
plugins: [
|
|
require('tailwindcss')('./tailwind.config.js'),
|
|
require('autoprefixer'),
|
|
...(process.env.NODE_ENV === 'production' ? [purgecss] : []),
|
|
],
|
|
};
|
|
`,
|
|
);
|
|
|
|
if (shouldCommit) {
|
|
await add({ filepath: 'postcss.config.js', dir: '.' });
|
|
await commit({ dir: '.', message: ':wrench: add postcss config file' });
|
|
}
|
|
});
|
|
|
|
await this.runWithSpinner('Generating tailwind full css', async () => {
|
|
await filesystem.dir('src/css');
|
|
await filesystem.write(
|
|
'src/css/tailwind.src.css',
|
|
`@tailwind base;
|
|
|
|
@tailwind components;
|
|
|
|
@tailwind utilities;
|
|
`,
|
|
);
|
|
|
|
if (shouldCommit) {
|
|
await add({ filepath: 'src/css/tailwind.src.css', dir: '.' });
|
|
await commit({ dir: '.', message: ':wrench: add tailwind css file' });
|
|
}
|
|
});
|
|
|
|
await this.runWithSpinner('Adding package.json scripts', async () => {
|
|
const packagePath = filesystem.path('.', 'package.json');
|
|
const packageJsonWithDeps = filesystem.read(packagePath, 'json');
|
|
const finalPackageJson = {
|
|
...packageJsonWithDeps,
|
|
scripts: {
|
|
...packageJsonWithDeps.scripts,
|
|
'start': 'npm-run-all -p start:css start:js',
|
|
'build': 'npm-run-all build:css build:js',
|
|
'start:js': 'react-scripts start',
|
|
'build:js': 'react-scripts build',
|
|
'start:css': 'postcss src/css/tailwind.src.css -o src/tailwind.css -w',
|
|
'build:css': 'postcss src/css/tailwind.src.css -o src/tailwind.css --env production',
|
|
},
|
|
};
|
|
|
|
await filesystem.write(packagePath, finalPackageJson, { jsonIndent: 2 });
|
|
|
|
if (shouldCommit) {
|
|
await add({ filepath: 'package.json', dir: '.' });
|
|
await commit({ dir: '.', message: ':wrench: add script for tailwind to package.json' });
|
|
}
|
|
});
|
|
|
|
await this.runWithSpinner('Adding full tailwind css to .gitignore', async () => {
|
|
await patching.append('.gitignore', '\n# ignore tailwind generated css\nsrc/tailwind.css');
|
|
|
|
if (shouldCommit) {
|
|
await add({ filepath: '.gitignore', dir: '.' });
|
|
await commit({ dir: '.', message: ':see_no_evil: add generated tailwind to .gitignore' });
|
|
}
|
|
});
|
|
}
|
|
}
|