From cf926c630e1d4d0748f73c64f24299754bd4d25b Mon Sep 17 00:00:00 2001 From: 1cedrus Date: Thu, 23 Jan 2025 22:17:22 +0700 Subject: [PATCH] Add prettier format task, refactor files --- packages/create-typink/.prettierignore | 26 +++++++ packages/create-typink/.prettierr.cjs | 10 +++ packages/create-typink/package.json | 3 +- .../src/{utils => tasks}/createProject.ts | 17 +++-- packages/create-typink/src/tasks/index.ts | 1 + .../create-typink/src/tasks/prettierFormat.ts | 41 +++++++++++ .../utils/{promptOptions.ts => options.ts} | 69 ++++++++++++++++++ .../create-typink/src/utils/parseArguments.ts | 71 ------------------- yarn.lock | 1 + 9 files changed, 162 insertions(+), 77 deletions(-) create mode 100644 packages/create-typink/.prettierignore create mode 100644 packages/create-typink/.prettierr.cjs rename packages/create-typink/src/{utils => tasks}/createProject.ts (78%) create mode 100644 packages/create-typink/src/tasks/prettierFormat.ts rename packages/create-typink/src/utils/{promptOptions.ts => options.ts} (51%) delete mode 100644 packages/create-typink/src/utils/parseArguments.ts diff --git a/packages/create-typink/.prettierignore b/packages/create-typink/.prettierignore new file mode 100644 index 00000000..d1e8f993 --- /dev/null +++ b/packages/create-typink/.prettierignore @@ -0,0 +1,26 @@ +build/ +build-*/ +coverage/ +node_modules/ +tmp/ +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local +.npmrc +.yarn/* +!.yarn/releases +!.yarn/plugins +.pnp.* +cc-test-reporter +lerna-debug.log* +npm-debug.log* +tsconfig.*buildinfo +yarn-debug.log* +yarn-error.log* +package-lock.json +.idea +.vscode +yarn.lock +LICENSE diff --git a/packages/create-typink/.prettierr.cjs b/packages/create-typink/.prettierr.cjs new file mode 100644 index 00000000..749b6c45 --- /dev/null +++ b/packages/create-typink/.prettierr.cjs @@ -0,0 +1,10 @@ +module.exports = { + semi: true, + trailingComma: 'all', + singleQuote: true, + jsxSingleQuote: true, + printWidth: 120, + tabWidth: 2, + bracketSameLine: true, + importOrder: ['.*react.*', '^@polkadot/(.*)$', '^@dedot/(.*)$', '', '^[./]'], +}; diff --git a/packages/create-typink/package.json b/packages/create-typink/package.json index 157d879f..095d50e2 100644 --- a/packages/create-typink/package.json +++ b/packages/create-typink/package.json @@ -12,7 +12,8 @@ "chalk": "^5.4.1", "execa": "^9.5.2", "inquirer": "^12.3.2", - "listr2": "^8.2.5" + "listr2": "^8.2.5", + "prettier": "^3.4.2" }, "publishConfig": { "access": "public", diff --git a/packages/create-typink/src/utils/createProject.ts b/packages/create-typink/src/tasks/createProject.ts similarity index 78% rename from packages/create-typink/src/utils/createProject.ts rename to packages/create-typink/src/tasks/createProject.ts index b906ebf9..26186d02 100644 --- a/packages/create-typink/src/utils/createProject.ts +++ b/packages/create-typink/src/tasks/createProject.ts @@ -3,7 +3,13 @@ import { Listr } from 'listr2'; import { fileURLToPath } from 'url'; import * as path from 'path'; import chalk from 'chalk'; -import { createFirstCommit, installPackages, createProjectDirectory, copyTemplateFiles } from '../tasks/index.js'; +import { + prettierFormat, + createFirstCommit, + installPackages, + createProjectDirectory, + copyTemplateFiles, +} from '../tasks/index.js'; export async function createProject(options: Options) { const { projectName, skipInstall, noGit } = options; @@ -11,6 +17,7 @@ export async function createProject(options: Options) { const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); + const rootDirectory = path.resolve(__dirname, '../../'); const templateDirectory = path.resolve(__dirname, '../../templates'); const targetDirectory = path.resolve(process.cwd(), projectName!); @@ -27,12 +34,12 @@ export async function createProject(options: Options) { { title: '๐Ÿ“ฆ Installing dependencies with yarn, this could take a while', task: () => installPackages(targetDirectory), - rendererOptions: { - outputBar: 8, - persistentOutput: false, - }, skip: skipInstall, }, + { + title: '๐Ÿงน Formatting the code with Prettier', + task: () => prettierFormat(rootDirectory, targetDirectory, options), + }, { title: `๐Ÿšจ Create the very first Git commit`, task: () => createFirstCommit(targetDirectory), diff --git a/packages/create-typink/src/tasks/index.ts b/packages/create-typink/src/tasks/index.ts index 306c9b38..eafa038f 100644 --- a/packages/create-typink/src/tasks/index.ts +++ b/packages/create-typink/src/tasks/index.ts @@ -2,3 +2,4 @@ export * from './createFirstCommit.js'; export * from './copyTemplateFiles.js'; export * from './createProjectDirectory.js'; export * from './installPackages.js'; +export * from './prettierFormat.js'; diff --git a/packages/create-typink/src/tasks/prettierFormat.ts b/packages/create-typink/src/tasks/prettierFormat.ts new file mode 100644 index 00000000..4fb1756c --- /dev/null +++ b/packages/create-typink/src/tasks/prettierFormat.ts @@ -0,0 +1,41 @@ +import * as prettier from 'prettier'; +import * as path from 'path'; +import { promises as fs } from 'fs'; +import { Options } from '../types.js'; +import { execa } from 'execa'; + +export async function prettierFormat(rootDir: string, targetDir: string, options: Options) { + if (!options.skipInstall) { + await execa('yarn', ['prettify'], { cwd: targetDir }); + } else { + const prettierConfig = await prettier.resolveConfig(path.resolve(rootDir, './.prettierrc.js')); + + await prettierFormatWithConfig(targetDir, prettierConfig); + } +} + +export async function prettierFormatWithConfig(dir: string, config: prettier.Options | null) { + const files = await fs.readdir(dir, { withFileTypes: true }); + + for (const file of files) { + const filePath = path.join(dir, file.name); + + if (file.isDirectory()) { + await prettierFormatWithConfig(filePath, config); + } else { + const fileInfo = await prettier.getFileInfo(filePath); + + if (fileInfo.ignored || !fileInfo.inferredParser) { + continue; + } + + const content = await fs.readFile(filePath, 'utf-8'); + const formatted = await prettier.format(content, { + filepath: filePath, + ...config, + }); + + await fs.writeFile(filePath, formatted, 'utf-8'); + } + } +} diff --git a/packages/create-typink/src/utils/promptOptions.ts b/packages/create-typink/src/utils/options.ts similarity index 51% rename from packages/create-typink/src/utils/promptOptions.ts rename to packages/create-typink/src/utils/options.ts index 1495facc..314946c4 100644 --- a/packages/create-typink/src/utils/promptOptions.ts +++ b/packages/create-typink/src/utils/options.ts @@ -1,4 +1,5 @@ import inquirer from 'inquirer'; +import arg from 'arg'; import { BaseOptions, Options, TEMPLATES, PRESET_CONTRACTS, WALLET_CONNECTORS, NETWORKS } from '../types.js'; import { IS_VALID_PACKAGE_NAME } from './string.js'; @@ -68,3 +69,71 @@ export async function promptMissingOptions(options: Options): Promise { ...answers, }; } + +export function parseArguments(): Options { + const args = arg( + { + '--name': String, + '-n': '--name', + + '--template': String, + '-t': '--template', + + '--preset': String, + '-p': '--preset', + + '--wallet': String, + '-w': '--wallet', + + '--network': [String], + '-N': '--network', + + '--no-git': Boolean, + + '--skip-install': Boolean, + '--skip': '--skip-install', + + '--version': Boolean, + '-v': '--version', + + '--help': Boolean, + '-h': '--help', + }, + { + argv: process.argv.slice(2), + }, + ); + + if (args['--name'] && IS_VALID_PACKAGE_NAME.test(args['--name']) === false) { + throw new Error('Project ' + args['--name'] + ' is not a valid package name. Please use a valid package name.'); + } + + if (args['--preset'] && !PRESET_CONTRACTS.includes(args['--preset'] as any)) { + throw new Error('Preset contract ' + args['--preset'] + ' is not supported. Please use a valid preset contract.'); + } + + if (args['--wallet'] && !WALLET_CONNECTORS.includes(args['--wallet'] as any)) { + throw new Error( + 'Wallet connector ' + args['--wallet'] + ' is not supported. Please use a supported wallet connector.', + ); + } + + if (args['--network']) { + args['--network'].forEach((network: string) => { + if (!NETWORKS.includes(network as any)) { + throw new Error('Network ' + network + ' is not supported. Please use supported network.'); + } + }); + } + + return { + projectName: args['--name'] || null, + presetContract: args['--preset'] || null, + walletConnector: args['--wallet'] || null, + network: args['--network'] || null, + skipInstall: !!args['--skip-install'], + noGit: !!args['--no-git'], + version: args['--version'] || false, + help: args['--help'] || false, + } as Options; +} diff --git a/packages/create-typink/src/utils/parseArguments.ts b/packages/create-typink/src/utils/parseArguments.ts deleted file mode 100644 index 7d907317..00000000 --- a/packages/create-typink/src/utils/parseArguments.ts +++ /dev/null @@ -1,71 +0,0 @@ -import arg from 'arg'; -import { NETWORKS, Options, PRESET_CONTRACTS, WALLET_CONNECTORS } from '../types.js'; -import { IS_VALID_PACKAGE_NAME } from './string.js'; - -export function parseArguments(): Options { - const args = arg( - { - '--name': String, - '-n': '--name', - - '--template': String, - '-t': '--template', - - '--preset': String, - '-p': '--preset', - - '--wallet': String, - '-w': '--wallet', - - '--network': [String], - '-N': '--network', - - '--no-git': Boolean, - - '--skip-install': Boolean, - '--skip': '--skip-install', - - '--version': Boolean, - '-v': '--version', - - '--help': Boolean, - '-h': '--help', - }, - { - argv: process.argv.slice(2), - }, - ); - - if (args['--name'] && IS_VALID_PACKAGE_NAME.test(args['--name']) === false) { - throw new Error('Project ' + args['--name'] + ' is not a valid package name. Please use a valid package name.'); - } - - if (args['--preset'] && !PRESET_CONTRACTS.includes(args['--preset'] as any)) { - throw new Error('Preset contract ' + args['--preset'] + ' is not supported. Please use a valid preset contract.'); - } - - if (args['--wallet'] && !WALLET_CONNECTORS.includes(args['--wallet'] as any)) { - throw new Error( - 'Wallet connector ' + args['--wallet'] + ' is not supported. Please use a supported wallet connector.', - ); - } - - if (args['--network']) { - args['--network'].forEach((network: string) => { - if (!NETWORKS.includes(network as any)) { - throw new Error('Network ' + network + ' is not supported. Please use supported network.'); - } - }); - } - - return { - projectName: args['--name'] || null, - presetContract: args['--preset'] || null, - walletConnector: args['--wallet'] || null, - network: args['--network'] || null, - skipInstall: !!args['--skip-install'], - noGit: !!args['--no-git'], - version: args['--version'] || false, - help: args['--help'] || false, - } as Options; -} diff --git a/yarn.lock b/yarn.lock index 692111bd..2575d215 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6866,6 +6866,7 @@ __metadata: execa: "npm:^9.5.2" inquirer: "npm:^12.3.2" listr2: "npm:^8.2.5" + prettier: "npm:^3.4.2" bin: create-typink: ./bin/create-typink.mjs languageName: unknown