]> git.ipfire.org Git - thirdparty/vuejs/create-vue.git/commitdiff
feat: sort dependencies before writing to disk
authorHaoqun Jiang <haoqunjiang@gmail.com>
Thu, 7 Oct 2021 06:39:40 +0000 (14:39 +0800)
committerHaoqun Jiang <haoqunjiang@gmail.com>
Thu, 7 Oct 2021 06:39:40 +0000 (14:39 +0800)
So that users' subsequent `npm add` calls won't mess the `package.json`.

30 files changed:
playground/jsx-router-vuex-with-tests/package.json
playground/jsx-router-vuex/package.json
playground/jsx-router-with-tests/package.json
playground/jsx-router/package.json
playground/jsx-vuex-with-tests/package.json
playground/jsx-vuex/package.json
playground/jsx-with-tests/package.json
playground/jsx/package.json
playground/router-vuex-with-tests/package.json
playground/router-with-tests/package.json
playground/typescript-jsx-router-vuex-with-tests/package.json
playground/typescript-jsx-router-vuex/package.json
playground/typescript-jsx-router-with-tests/package.json
playground/typescript-jsx-router/package.json
playground/typescript-jsx-vuex-with-tests/package.json
playground/typescript-jsx-vuex/package.json
playground/typescript-jsx-with-tests/package.json
playground/typescript-jsx/package.json
playground/typescript-router-vuex-with-tests/package.json
playground/typescript-router-vuex/package.json
playground/typescript-router-with-tests/package.json
playground/typescript-router/package.json
playground/typescript-vuex-with-tests/package.json
playground/typescript-vuex/package.json
playground/typescript-with-tests/package.json
playground/typescript/package.json
playground/vuex-with-tests/package.json
playground/with-tests/package.json
utils/renderTemplate.js
utils/sortDependencies.js [new file with mode: 0644]

index f0a587675d683dff8f8afe5f008aa659821e7fdd..4d926163c251ca351e7629321a8ce31c3d383b5b 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index 0b78e2c2e333e22056b7335ece83dca6822daa63..aac1267c871335235f4c00203ffe6325f50c08f8 100644 (file)
@@ -14,7 +14,7 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8"
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
+    "vite": "^2.5.10"
   }
 }
index 2c7dc52c4e1cf5dc3709bdbb9f9ddd44b5d3040c..698bc44d03b41497a4bfc96e9324068491d8910b 100644 (file)
     "vue-router": "^4.0.11"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index 8ded6f1f02c367c8231d1d34b54d89197220da21..c40a5ba748a1c80b0c473ef6c5b49935c07fab65 100644 (file)
@@ -13,7 +13,7 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8"
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
+    "vite": "^2.5.10"
   }
 }
index 5419d5bd28bc5f3896f3edfe0ff6bce40ba73c84..dc94074697c2ad1bb4155e5a8ebb40c58db720ae 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index 98f2cdc022395f278c1342203efa7fc08146d329..96197f1ebea3036ff52f89f024daec21e73c17db 100644 (file)
@@ -13,7 +13,7 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8"
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
+    "vite": "^2.5.10"
   }
 }
index 947156597726c65ff29b3962393df439e571e1a9..9a71515d599b8ade296ce0d56754ce83e5ad4331 100644 (file)
     "vue": "^3.2.14"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index 6ef981a27b2c8d219bcc985b8b889e156ba1808f..58d163da392287f46002307f213d9a23eb944a2c 100644 (file)
@@ -12,7 +12,7 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8"
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
+    "vite": "^2.5.10"
   }
 }
index ec1f28f22b51e5a7bb5f2848a5c5d0f928d7bb0b..8e5299789e78b01f2c2be8ea2db6860748303fae 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index 22ff7ce187dee44d24ebfbf931ae28e408cb5438..77f004cf5c8493989833582b746a358009b01b38 100644 (file)
     "vue-router": "^4.0.11"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index 628d74c52c1b280b37a943eb24263abecc3cd5a7..9d7e769ceef0ed96107c72ac096a81db6e5fa892 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index c80923e41e62e4ff58507707c95b0fc22d595985..6c75c6169cec2346a7ce19a0692d779c6f4c431b 100644 (file)
@@ -15,9 +15,9 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@vitejs/plugin-vue-jsx": "^1.1.8",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index f04733c45419da99976ee49782aabbd9d72c28f9..202eea678ee9367060189bc9bbe22f9bc06fc757 100644 (file)
     "vue-router": "^4.0.11"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index 91aba406bef217bee9f046abda2778238700e20a..cc3549f96ce72ac0ad39f74917f660ad0a082eb5 100644 (file)
@@ -14,9 +14,9 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@vitejs/plugin-vue-jsx": "^1.1.8",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index 459ddcda617a43182ca690812de0df96399bf5a5..ec59c6d5d1dc366754aedacba52e869c2d28c1e7 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index f9e22a86495b0968c14cd27810f0aa6bb6203964..96b51edcff7294ea83f512f93955819967e82a85 100644 (file)
@@ -14,9 +14,9 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@vitejs/plugin-vue-jsx": "^1.1.8",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index cdbde2f2cf4daa551fc87dfa6653733259bed02a..42ccce569c3e542cde6f6158acfdecb171214278 100644 (file)
     "vue": "^3.2.14"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
-    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
+    "@vitejs/plugin-vue-jsx": "^1.1.8",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index a97d9bb49bcdce097128f8d8a7b1124cf1d24542..26a97304fbb3acf5bd78f8b8c781fbe0d91716ac 100644 (file)
@@ -13,9 +13,9 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@vitejs/plugin-vue-jsx": "^1.1.8",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index 9df9339f8d02cf166e4f0a8386b50bebba778e0a..e483d34a22cf3dfcc1c1eeb0749ed7f36169bef6 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index af49f99de1d07ef5fd9ccd7891be2074bc1c4bc8..dcfc29be279e3b8dab7ce96d7d9d40cbef2d60e9 100644 (file)
@@ -15,8 +15,8 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
+    "typescript": "~4.3.5",
     "vite": "^2.5.10",
-    "typescript": "~4.4.3",
     "vue-tsc": "^0.3.0"
   }
 }
index d2c0318409471051e18692116f540a52e33a1602..1380ab38528bc806950657e3b64012f65e94807e 100644 (file)
     "vue-router": "^4.0.11"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index 9b04f569e72cf25d9b1e4c9760f2fab0db29af37..28b96d1efc520aab46b3bd9a4295864b0752239d 100644 (file)
@@ -14,8 +14,8 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
+    "typescript": "~4.3.5",
     "vite": "^2.5.10",
-    "typescript": "~4.4.3",
     "vue-tsc": "^0.3.0"
   }
 }
index 24dff70e04894e66d7197ca6dcd8d465aa418bf2..c1c61d373c9f127b38cf12d6f97a2835020c3e5f 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index 2914296ba04b98b8511db20da70085fc79b87306..19f0c31bc4e8b575add8ad43ffb88ed4b87b2ff9 100644 (file)
@@ -14,8 +14,8 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
+    "typescript": "~4.3.5",
     "vite": "^2.5.10",
-    "typescript": "~4.4.3",
     "vue-tsc": "^0.3.0"
   }
 }
index 6b11e932dd4134a63d57b8fe68c9ae1a5834afbe..99851e55a812cc752fcbbf64dab75d274345f899 100644 (file)
     "vue": "^3.2.14"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
     "start-server-and-test": "^1.14.0",
-    "typescript": "~4.4.3",
+    "typescript": "~4.3.5",
+    "vite": "^2.5.10",
     "vue-tsc": "^0.3.0"
   }
 }
index 9f7cdeb1a49c532b7f7119436917c252d0786926..2ff1e1202ef16ec601b3f589e4aa34c4eb35a4a8 100644 (file)
@@ -13,8 +13,8 @@
   },
   "devDependencies": {
     "@vitejs/plugin-vue": "^1.9.0",
+    "typescript": "~4.3.5",
     "vite": "^2.5.10",
-    "typescript": "~4.4.3",
     "vue-tsc": "^0.3.0"
   }
 }
index a7ace7521cf50b939a7211e3327318e24f4a4b56..b6bf55b818efc55ed9508e773d0a2bb72e9561b7 100644 (file)
     "vuex": "^4.0.2"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index 762402f7741a9daafc685f0264b8a687b45338d0..ebae5b13a5588a47a88d147e3139563f8d5424b5 100644 (file)
     "vue": "^3.2.14"
   },
   "devDependencies": {
-    "@vitejs/plugin-vue": "^1.9.0",
-    "vite": "^2.5.10",
     "@cypress/vite-dev-server": "^2.1.0",
     "@cypress/vue": "^3.0.3",
+    "@vitejs/plugin-vue": "^1.9.0",
     "cypress": "^8.4.1",
-    "start-server-and-test": "^1.14.0"
+    "start-server-and-test": "^1.14.0",
+    "vite": "^2.5.10"
   }
 }
index e9d4a3ac0b5960abcad0d37454ee94e0f98f1711..09640051da6458252002a6982c1e982adbff9c0e 100644 (file)
@@ -2,6 +2,7 @@ import fs from 'fs'
 import path from 'path'
 
 import deepMerge from './deepMerge.js'
+import sortDependencies from './sortDependencies.js'
 
 /**
  * Renders a template folder/file to the file system,
@@ -28,7 +29,9 @@ function renderTemplate(src, dest) {
 
   if (filename === 'package.json' && fs.existsSync(dest)) {
     // merge instead of overwriting
-    const pkg = deepMerge(JSON.parse(fs.readFileSync(dest)), JSON.parse(fs.readFileSync(src)))
+    const existing = JSON.parse(fs.readFileSync(dest))
+    const newPackage = JSON.parse(fs.readFileSync(src))
+    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.js
new file mode 100644 (file)
index 0000000..60d07dd
--- /dev/null
@@ -0,0 +1,22 @@
+export default function sortDependencies(packageJson) {
+  const sorted = {}
+
+  const depTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies']
+
+  for (const depType of depTypes) {
+    if (packageJson[depType]) {
+      sorted[depType] = {}
+
+      Object.keys(packageJson[depType])
+        .sort()
+        .forEach((name) => {
+          sorted[depType][name] = packageJson[depType][name]
+        })
+    }
+  }
+
+  return {
+    ...packageJson,
+    ...sorted
+  }
+}