#!/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)
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:
},
{
name: 'overwriteChecker',
- type: (prev, values = {}) => {
+ type: (prev, values) => {
if (values.shouldOverwrite === false) {
throw new Error(red('✖') + ' Operation cancelled')
}
},
{
name: 'needsPrettier',
- type: (prev, values = {}) => {
+ type: (prev, values) => {
if (isFeatureFlagsUsed || !values.needsEslint) {
return null
}
},
"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",
.:
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
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
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:
'@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
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
await esbuild.build({
bundle: true,
- entryPoints: ['index.js'],
+ entryPoints: ['index.ts'],
outfile: 'outfile.cjs',
format: 'cjs',
platform: 'node',
--- /dev/null
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["index.ts", "utils/**/*"],
+ "compilerOptions": {
+ "strict": false
+ }
+}
-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)) {
-import fs from 'fs'
-
-import getCommand from './getCommand.js'
+import getCommand from './getCommand'
const sfcTypeSupportDoc = [
'',
-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) {
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: {
// 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: {
-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,
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