From 1f0303bffd63bfcd92fb801e4c461504dcc54e55 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Tue, 15 Mar 2022 15:04:18 +0800 Subject: [PATCH] refactor: migrate the codebase to typescript --- index.js => index.ts | 35 ++++++++++++------- package.json | 3 ++ pnpm-lock.yaml | 27 ++++++++++++++ scripts/build.mjs | 2 +- tsconfig.json | 7 ++++ utils/{banner.js => banner.ts} | 0 utils/{deepMerge.js => deepMerge.ts} | 0 ...ectoryTraverse.js => directoryTraverse.ts} | 4 +-- .../{generateReadme.js => generateReadme.ts} | 4 +-- utils/{getCommand.js => getCommand.ts} | 0 utils/{renderEslint.js => renderEslint.ts} | 17 +++++---- .../{renderTemplate.js => renderTemplate.ts} | 12 +++---- ...ortDependencies.js => sortDependencies.ts} | 0 13 files changed, 81 insertions(+), 30 deletions(-) rename index.js => index.ts (94%) create mode 100644 tsconfig.json rename utils/{banner.js => banner.ts} (100%) rename utils/{deepMerge.js => deepMerge.ts} (100%) rename utils/{directoryTraverse.js => directoryTraverse.ts} (94%) rename utils/{generateReadme.js => generateReadme.ts} (98%) rename utils/{getCommand.js => getCommand.ts} (100%) rename utils/{renderEslint.js => renderEslint.ts} (91%) rename utils/{renderTemplate.js => renderTemplate.ts} (83%) rename utils/{sortDependencies.js => sortDependencies.ts} (100%) diff --git a/index.js b/index.ts similarity index 94% rename from index.js rename to index.ts index 55eb4638..57d51f6b 100755 --- a/index.js +++ b/index.ts @@ -1,19 +1,18 @@ #!/usr/bin/env node -// @ts-check -import fs from 'fs' -import path from 'path' +import * as fs from 'fs' +import * as path from 'path' import minimist from 'minimist' import prompts from 'prompts' import { red, green, bold } from 'kolorist' -import renderTemplate from './utils/renderTemplate.js' -import { postOrderDirectoryTraverse, preOrderDirectoryTraverse } from './utils/directoryTraverse.js' -import generateReadme from './utils/generateReadme.js' -import getCommand from './utils/getCommand.js' -import renderEslint from './utils/renderEslint.js' -import banner from './utils/banner.js' +import renderTemplate from './utils/renderTemplate' +import { postOrderDirectoryTraverse, preOrderDirectoryTraverse } from './utils/directoryTraverse' +import generateReadme from './utils/generateReadme' +import getCommand from './utils/getCommand' +import renderEslint from './utils/renderEslint' +import banner from './utils/banner' function isValidPackageName(projectName) { return /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/.test(projectName) @@ -89,7 +88,19 @@ async function init() { const forceOverwrite = argv.force - let result = {} + let result: { + projectName?: string + shouldOverwrite?: boolean + packageName?: string + needsTypeScript?: boolean + needsJsx?: boolean + needsRouter?: boolean + needsPinia?: boolean + needsVitest?: boolean + needsCypress?: boolean + needsEslint?: boolean + needsPrettier?: boolean + } = {} try { // Prompts: @@ -124,7 +135,7 @@ async function init() { }, { name: 'overwriteChecker', - type: (prev, values = {}) => { + type: (prev, values) => { if (values.shouldOverwrite === false) { throw new Error(red('✖') + ' Operation cancelled') } @@ -199,7 +210,7 @@ async function init() { }, { name: 'needsPrettier', - type: (prev, values = {}) => { + type: (prev, values) => { if (isFeatureFlagsUsed || !values.needsEslint) { return null } diff --git a/package.json b/package.json index 00331814..339b4c4a 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,9 @@ }, "homepage": "https://github.com/vuejs/create-vue#readme", "devDependencies": { + "@types/eslint": "^8.4.1", + "@types/prompts": "^2.0.14", + "@vue/tsconfig": "^0.1.3", "esbuild": "^0.14.23", "esbuild-plugin-license": "^1.2.2", "husky": "^7.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0f48dcb..b1dc73f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ importers: .: specifiers: + '@types/eslint': ^8.4.1 + '@types/prompts': ^2.0.14 + '@vue/tsconfig': ^0.1.3 esbuild: ^0.14.23 esbuild-plugin-license: ^1.2.2 husky: ^7.0.4 @@ -15,6 +18,9 @@ importers: prompts: ^2.4.2 zx: ^5.1.0 devDependencies: + '@types/eslint': 8.4.1 + '@types/prompts': 2.0.14 + '@vue/tsconfig': 0.1.3 esbuild: 0.14.23 esbuild-plugin-license: 1.2.2_esbuild@0.14.23 husky: 7.0.4 @@ -2627,6 +2633,17 @@ packages: resolution: {integrity: sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==} dev: true + /@types/eslint/8.4.1: + resolution: {integrity: sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==} + dependencies: + '@types/estree': 0.0.51 + '@types/json-schema': 7.0.9 + dev: true + + /@types/estree/0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + dev: true + /@types/fs-extra/9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: @@ -2641,6 +2658,10 @@ packages: '@types/tough-cookie': 4.0.1 dev: true + /@types/json-schema/7.0.9: + resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} + dev: true + /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true @@ -2661,6 +2682,12 @@ packages: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: true + /@types/prompts/2.0.14: + resolution: {integrity: sha512-HZBd99fKxRWpYCErtm2/yxUZv6/PBI9J7N4TNFffl5JbrYMHBwF25DjQGTW3b3jmXq+9P6/8fCIb2ee57BFfYA==} + dependencies: + '@types/node': 17.0.19 + dev: true + /@types/sinonjs__fake-timers/8.1.1: resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} dev: true diff --git a/scripts/build.mjs b/scripts/build.mjs index 61259936..b255ccd6 100644 --- a/scripts/build.mjs +++ b/scripts/build.mjs @@ -26,7 +26,7 @@ SOFTWARE. await esbuild.build({ bundle: true, - entryPoints: ['index.js'], + entryPoints: ['index.ts'], outfile: 'outfile.cjs', format: 'cjs', platform: 'node', diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..3487a8e2 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "@vue/tsconfig/tsconfig.node.json", + "include": ["index.ts", "utils/**/*"], + "compilerOptions": { + "strict": false + } +} diff --git a/utils/banner.js b/utils/banner.ts similarity index 100% rename from utils/banner.js rename to utils/banner.ts diff --git a/utils/deepMerge.js b/utils/deepMerge.ts similarity index 100% rename from utils/deepMerge.js rename to utils/deepMerge.ts diff --git a/utils/directoryTraverse.js b/utils/directoryTraverse.ts similarity index 94% rename from utils/directoryTraverse.js rename to utils/directoryTraverse.ts index 73b7fa3b..84f805f8 100644 --- a/utils/directoryTraverse.js +++ b/utils/directoryTraverse.ts @@ -1,5 +1,5 @@ -import fs from 'fs' -import path from 'path' +import * as fs from 'fs' +import * as path from 'path' export function preOrderDirectoryTraverse(dir, dirCallback, fileCallback) { for (const filename of fs.readdirSync(dir)) { diff --git a/utils/generateReadme.js b/utils/generateReadme.ts similarity index 98% rename from utils/generateReadme.js rename to utils/generateReadme.ts index 81f07aa9..16f7b1c3 100644 --- a/utils/generateReadme.js +++ b/utils/generateReadme.ts @@ -1,6 +1,4 @@ -import fs from 'fs' - -import getCommand from './getCommand.js' +import getCommand from './getCommand' const sfcTypeSupportDoc = [ '', diff --git a/utils/getCommand.js b/utils/getCommand.ts similarity index 100% rename from utils/getCommand.js rename to utils/getCommand.ts diff --git a/utils/renderEslint.js b/utils/renderEslint.ts similarity index 91% rename from utils/renderEslint.js rename to utils/renderEslint.ts index 487480b0..3fd661a4 100644 --- a/utils/renderEslint.js +++ b/utils/renderEslint.ts @@ -1,9 +1,11 @@ -import fs from 'fs' -import path from 'path' +import * as fs from 'fs' +import * as path from 'path' + +import type { ESLint, Linter } from 'eslint' import { devDependencies as allEslintDeps } from '../template/eslint/package.json' -import deepMerge from './deepMerge.js' -import sortDependencies from './sortDependencies.js' +import deepMerge from './deepMerge' +import sortDependencies from './sortDependencies' const dependencies = {} function addEslintDependency(name) { @@ -13,7 +15,10 @@ function addEslintDependency(name) { addEslintDependency('eslint') addEslintDependency('eslint-plugin-vue') -const config = { +interface ESLintConfig extends Linter.Config { + extends: string[] +} +const config: ESLintConfig = { root: true, extends: ['plugin:vue/vue3-essential'], env: { @@ -83,7 +88,7 @@ export default function renderEslint( // update package.json const packageJsonPath = path.resolve(rootDir, 'package.json') - const existingPkg = JSON.parse(fs.readFileSync(packageJsonPath)) + const existingPkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) const pkg = sortDependencies( deepMerge(existingPkg, { scripts: { diff --git a/utils/renderTemplate.js b/utils/renderTemplate.ts similarity index 83% rename from utils/renderTemplate.js rename to utils/renderTemplate.ts index 9d7c7070..97147143 100644 --- a/utils/renderTemplate.js +++ b/utils/renderTemplate.ts @@ -1,8 +1,8 @@ -import fs from 'fs' -import path from 'path' +import * as fs from 'fs' +import * as path from 'path' -import deepMerge from './deepMerge.js' -import sortDependencies from './sortDependencies.js' +import deepMerge from './deepMerge' +import sortDependencies from './sortDependencies' /** * Renders a template folder/file to the file system, @@ -34,8 +34,8 @@ function renderTemplate(src, dest) { if (filename === 'package.json' && fs.existsSync(dest)) { // merge instead of overwriting - const existing = JSON.parse(fs.readFileSync(dest)) - const newPackage = JSON.parse(fs.readFileSync(src)) + const existing = JSON.parse(fs.readFileSync(dest, 'utf8')) + const newPackage = JSON.parse(fs.readFileSync(src, 'utf8')) const pkg = sortDependencies(deepMerge(existing, newPackage)) fs.writeFileSync(dest, JSON.stringify(pkg, null, 2) + '\n') return diff --git a/utils/sortDependencies.js b/utils/sortDependencies.ts similarity index 100% rename from utils/sortDependencies.js rename to utils/sortDependencies.ts -- 2.39.5