So that users' subsequent `npm add` calls won't mess the `package.json`.
"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"
}
}
},
"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"
}
}
"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"
}
}
},
"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"
}
}
"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"
}
}
},
"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"
}
}
"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"
}
}
},
"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"
}
}
"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"
}
}
"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"
}
}
"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"
}
}
},
"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"
}
}
"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"
}
}
},
"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"
}
}
"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"
}
}
},
"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"
}
}
"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"
}
}
},
"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"
}
}
"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"
}
}
},
"devDependencies": {
"@vitejs/plugin-vue": "^1.9.0",
+ "typescript": "~4.3.5",
"vite": "^2.5.10",
- "typescript": "~4.4.3",
"vue-tsc": "^0.3.0"
}
}
"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"
}
}
},
"devDependencies": {
"@vitejs/plugin-vue": "^1.9.0",
+ "typescript": "~4.3.5",
"vite": "^2.5.10",
- "typescript": "~4.4.3",
"vue-tsc": "^0.3.0"
}
}
"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"
}
}
},
"devDependencies": {
"@vitejs/plugin-vue": "^1.9.0",
+ "typescript": "~4.3.5",
"vite": "^2.5.10",
- "typescript": "~4.4.3",
"vue-tsc": "^0.3.0"
}
}
"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"
}
}
},
"devDependencies": {
"@vitejs/plugin-vue": "^1.9.0",
+ "typescript": "~4.3.5",
"vite": "^2.5.10",
- "typescript": "~4.4.3",
"vue-tsc": "^0.3.0"
}
}
"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"
}
}
"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"
}
}
import path from 'path'
import deepMerge from './deepMerge.js'
+import sortDependencies from './sortDependencies.js'
/**
* Renders a template folder/file to the file system,
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
}
--- /dev/null
+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
+ }
+}