]> git.ipfire.org Git - thirdparty/vuejs/create-vue.git/commitdiff
refactor: migrate the codebase to typescript
authorHaoqun Jiang <haoqunjiang@gmail.com>
Tue, 15 Mar 2022 07:04:18 +0000 (15:04 +0800)
committerHaoqun Jiang <haoqunjiang@gmail.com>
Tue, 15 Mar 2022 07:04:18 +0000 (15:04 +0800)
13 files changed:
index.ts [moved from index.js with 94% similarity]
package.json
pnpm-lock.yaml
scripts/build.mjs
tsconfig.json [new file with mode: 0644]
utils/banner.ts [moved from utils/banner.js with 100% similarity]
utils/deepMerge.ts [moved from utils/deepMerge.js with 100% similarity]
utils/directoryTraverse.ts [moved from utils/directoryTraverse.js with 94% similarity]
utils/generateReadme.ts [moved from utils/generateReadme.js with 98% similarity]
utils/getCommand.ts [moved from utils/getCommand.js with 100% similarity]
utils/renderEslint.ts [moved from utils/renderEslint.js with 91% similarity]
utils/renderTemplate.ts [moved from utils/renderTemplate.js with 83% similarity]
utils/sortDependencies.ts [moved from utils/sortDependencies.js with 100% similarity]

similarity index 94%
rename from index.js
rename to index.ts
index 55eb46381234a261e494e27caa9a4bba790a3d11..57d51f6b2dfb06de0a85e337c9fc19925762db3a 100755 (executable)
--- 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
             }
index 00331814dc04c4303578db675d801bebdcae2fbe..339b4c4ac3312e3ef29efb4e4cf2dd523e83cc70 100644 (file)
@@ -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",
index f0f48dcb4415abebc545ddd579b11968889b492e..b1dc73f9e4e9deefefad7d4a2e10e215174e02f8 100644 (file)
@@ -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
index 612599368e39103d65f74e8a4b8494762f0d05a8..b255ccd673d69d5af3589cb863cae83bef7c90aa 100644 (file)
@@ -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 (file)
index 0000000..3487a8e
--- /dev/null
@@ -0,0 +1,7 @@
+{
+  "extends": "@vue/tsconfig/tsconfig.node.json",
+  "include": ["index.ts", "utils/**/*"],
+  "compilerOptions": {
+    "strict": false
+  }
+}
similarity index 100%
rename from utils/banner.js
rename to utils/banner.ts
similarity index 100%
rename from utils/deepMerge.js
rename to utils/deepMerge.ts
similarity index 94%
rename from utils/directoryTraverse.js
rename to utils/directoryTraverse.ts
index 73b7fa3b81bcb0a4dc65aab149524dedeeb43240..84f805f8d960d77c5be99866805c0e0422fa8a36 100644 (file)
@@ -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)) {
similarity index 98%
rename from utils/generateReadme.js
rename to utils/generateReadme.ts
index 81f07aa9344af426ce6b64ab224a9a515363db31..16f7b1c3c85f41c5f4ea10570956cf6540e78ae3 100644 (file)
@@ -1,6 +1,4 @@
-import fs from 'fs'
-
-import getCommand from './getCommand.js'
+import getCommand from './getCommand'
 
 const sfcTypeSupportDoc = [
   '',
similarity index 100%
rename from utils/getCommand.js
rename to utils/getCommand.ts
similarity index 91%
rename from utils/renderEslint.js
rename to utils/renderEslint.ts
index 487480b0f65f647f7da6f11ba92e4bc332436b0c..3fd661a475c3d8dae92a9d6f18a16c245a36fa83 100644 (file)
@@ -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: {
similarity index 83%
rename from utils/renderTemplate.js
rename to utils/renderTemplate.ts
index 9d7c7070c4db6346bfd514b1f30ca646dbaaf5e0..971471434f351d030fd938dbfcd70c7d69a059f6 100644 (file)
@@ -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