{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import { blue, cyan, green, magenta, red, reset, yellow } from 'kolorist';\nimport minimist from 'minimist';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport prompts from 'prompts';\n\n// Avoids autoconversion to number of the project name by defining that the args\n// non associated with an option ( _ ) needs to be parsed as a string. See #4606\nconst argv = minimist<{\n  t?: string;\n  template?: string;\n}>(process.argv.slice(2), { string: ['_'] });\nconst cwd = process.cwd();\n\ntype ColorFunc = (str: string | number) => string;\ntype Framework = {\n  name: string;\n  display: string;\n  color: ColorFunc;\n  variants: FrameworkVariant[];\n};\ntype FrameworkVariant = {\n  name: string;\n  display: string;\n  color: ColorFunc;\n  customCommand?: string;\n};\n\nconst FRAMEWORKS: Framework[] = [\n  {\n    name: 'empty',\n    display: 'Empty',\n    color: yellow,\n    variants: [\n      {\n        name: 'empty',\n        display: 'JavaScript',\n        color: yellow,\n      },\n      {\n        name: 'empty-ts',\n        display: 'TypeScript',\n        color: blue,\n      },\n    ],\n  },\n  {\n    name: 'vanilla',\n    display: 'Vanilla',\n    color: yellow,\n    variants: [\n      {\n        name: 'vanilla',\n        display: 'JavaScript',\n        color: yellow,\n      },\n      {\n        name: 'vanilla-ts',\n        display: 'TypeScript',\n        color: blue,\n      },\n    ],\n  },\n  {\n    name: 'vue',\n    display: 'Vue',\n    color: green,\n    variants: [\n      {\n        name: 'vue',\n        display: 'JavaScript',\n        color: yellow,\n      },\n      {\n        name: 'vue-ts',\n        display: 'TypeScript',\n        color: blue,\n      },\n    ],\n  },\n  {\n    name: 'react',\n    display: 'React',\n    color: cyan,\n    variants: [\n      {\n        name: 'react',\n        display: 'JavaScript',\n        color: yellow,\n      },\n      {\n        name: 'react-ts',\n        display: 'TypeScript',\n        color: blue,\n      },\n      {\n        name: 'react-swc',\n        display: 'JavaScript + SWC',\n        color: yellow,\n      },\n      {\n        name: 'react-swc-ts',\n        display: 'TypeScript + SWC',\n        color: blue,\n      },\n    ],\n  },\n  {\n    name: 'preact',\n    display: 'Preact',\n    color: magenta,\n    variants: [\n      {\n        name: 'preact',\n        display: 'JavaScript',\n        color: yellow,\n      },\n      {\n        name: 'preact-ts',\n        display: 'TypeScript',\n        color: blue,\n      },\n    ],\n  },\n  {\n    name: 'svelte',\n    display: 'Svelte',\n    color: red,\n    variants: [\n      {\n        name: 'svelte',\n        display: 'JavaScript',\n        color: yellow,\n      },\n      {\n        name: 'svelte-ts',\n        display: 'TypeScript',\n        color: blue,\n      },\n    ],\n  },\n  {\n    name: 'solid',\n    display: 'Solid',\n    color: red,\n    variants: [\n      {\n        name: 'solid',\n        display: 'JavaScript',\n        color: yellow,\n      },\n      {\n        name: 'solid-ts',\n        display: 'TypeScript',\n        color: blue,\n      },\n    ],\n  },\n];\n\nconst TEMPLATES = FRAMEWORKS.map(\n  (f) => (f.variants && f.variants.map((v) => v.name)) || [f.name],\n).reduce((a, b) => a.concat(b), []);\n\nconst renameFiles: Record<string, string | undefined> = {\n  _gitignore: '.gitignore',\n};\n\nconst defaultTargetDir = 'vite-project';\n\nasync function init() {\n  const argTargetDir = formatTargetDir(argv._[0]);\n  const argTemplate = argv.template || argv.t;\n\n  let targetDir = argTargetDir || defaultTargetDir;\n  const getProjectName = () =>\n    targetDir === '.' ? path.basename(path.resolve()) : targetDir;\n\n  let result: prompts.Answers<\n    'projectName' | 'overwrite' | 'packageName' | 'framework' | 'variant'\n  >;\n\n  try {\n    result = await prompts(\n      [\n        {\n          type: argTargetDir ? null : 'text',\n          name: 'projectName',\n          message: reset('Project name:'),\n          initial: defaultTargetDir,\n          onState: (state) => {\n            targetDir = formatTargetDir(state.value) || defaultTargetDir;\n          },\n        },\n        {\n          type: () =>\n            !fs.existsSync(targetDir) || isEmpty(targetDir) ? null : 'confirm',\n          name: 'overwrite',\n          message: () =>\n            (targetDir === '.'\n              ? 'Current directory'\n              : `Target directory \"${targetDir}\"`) +\n            ` is not empty. Remove existing files and continue?`,\n        },\n        {\n          type: (_, { overwrite }: { overwrite?: boolean }) => {\n            if (overwrite === false) {\n              throw new Error(red('✖') + ' Operation cancelled');\n            }\n            return null;\n          },\n          name: 'overwriteChecker',\n        },\n        {\n          type: () => (isValidPackageName(getProjectName()) ? null : 'text'),\n          name: 'packageName',\n          message: reset('Package name:'),\n          initial: () => toValidPackageName(getProjectName()),\n          validate: (dir) =>\n            isValidPackageName(dir) || 'Invalid package.json name',\n        },\n        {\n          type:\n            argTemplate && TEMPLATES.includes(argTemplate) ? null : 'select',\n          name: 'framework',\n          message:\n            typeof argTemplate === 'string' && !TEMPLATES.includes(argTemplate)\n              ? reset(\n                  `\"${argTemplate}\" isn't a valid template. Please choose from below: `,\n                )\n              : reset('Select a framework:'),\n          initial: 0,\n          choices: FRAMEWORKS.map((framework) => {\n            const frameworkColor = framework.color;\n            return {\n              title: frameworkColor(framework.display || framework.name),\n              value: framework,\n            };\n          }),\n        },\n        {\n          type: (framework: Framework) =>\n            framework && framework.variants ? 'select' : null,\n          name: 'variant',\n          message: reset('Select a variant:'),\n          choices: (framework: Framework) =>\n            framework.variants.map((variant) => {\n              const variantColor = variant.color;\n              return {\n                title: variantColor(variant.display || variant.name),\n                value: variant.name,\n              };\n            }),\n        },\n      ],\n      {\n        onCancel: () => {\n          throw new Error(red('✖') + ' Operation cancelled');\n        },\n      },\n    );\n  } catch (cancelled: any) {\n    console.log(cancelled.message);\n    return;\n  }\n\n  // user choice associated with prompts\n  const { framework, overwrite, packageName, variant } = result;\n\n  const root = path.join(cwd, targetDir);\n\n  if (overwrite) {\n    emptyDir(root);\n  } else if (!fs.existsSync(root)) {\n    fs.mkdirSync(root, { recursive: true });\n  }\n\n  // determine template\n  let template: string = variant || framework?.name || argTemplate;\n  let isReactSwc = false;\n  if (template.includes('-swc')) {\n    isReactSwc = true;\n    template = template.replace('-swc', '');\n  }\n\n  const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent);\n  const pkgManager = pkgInfo ? pkgInfo.name : 'npm';\n\n  console.log(`\\nScaffolding project in ${root}...`);\n\n  const templateDir = path.resolve(\n    fileURLToPath(import.meta.url),\n    '../..',\n    `template-${template}`,\n  );\n\n  const write = (file: string, content?: string) => {\n    const targetPath = path.join(root, renameFiles[file] ?? file);\n    if (content) {\n      fs.writeFileSync(targetPath, content);\n    } else {\n      copy(path.join(templateDir, file), targetPath);\n    }\n  };\n\n  const files = fs.readdirSync(templateDir);\n  for (const file of files.filter((f) => f !== 'package.json')) {\n    write(file);\n  }\n\n  const pkg = JSON.parse(\n    fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8'),\n  );\n\n  pkg.name = packageName || getProjectName();\n\n  write('package.json', JSON.stringify(pkg, null, 2));\n\n  if (isReactSwc) {\n    setupReactSwc(root, template.endsWith('-ts'));\n  }\n\n  console.log(`\\nDone. Now run:\\n`);\n  if (root !== cwd) {\n    console.log(`  cd ${path.relative(cwd, root)}`);\n  }\n  switch (pkgManager) {\n    case 'yarn':\n      console.log('  yarn');\n      console.log('  yarn dev');\n      break;\n    default:\n      console.log(`  ${pkgManager} install`);\n      console.log(`  ${pkgManager} run dev`);\n      break;\n  }\n  console.log();\n}\n\nfunction formatTargetDir(targetDir: string | undefined) {\n  return targetDir?.trim().replace(/\\/+$/g, '');\n}\n\nfunction copy(src: string, dest: string) {\n  const stat = fs.statSync(src);\n  if (stat.isDirectory()) {\n    copyDir(src, dest);\n  } else {\n    fs.copyFileSync(src, dest);\n  }\n}\n\nfunction isValidPackageName(projectName: string) {\n  return /^(?:@[a-z\\d\\-*~][a-z\\d\\-*._~]*\\/)?[a-z\\d\\-~][a-z\\d\\-._~]*$/.test(\n    projectName,\n  );\n}\n\nfunction toValidPackageName(projectName: string) {\n  return projectName\n    .trim()\n    .toLowerCase()\n    .replace(/\\s+/g, '-')\n    .replace(/^[._]/, '')\n    .replace(/[^a-z\\d\\-~]+/g, '-');\n}\n\nfunction copyDir(srcDir: string, destDir: string) {\n  fs.mkdirSync(destDir, { recursive: true });\n  for (const file of fs.readdirSync(srcDir)) {\n    const srcFile = path.resolve(srcDir, file);\n    const destFile = path.resolve(destDir, file);\n    copy(srcFile, destFile);\n  }\n}\n\nfunction isEmpty(path: string) {\n  const files = fs.readdirSync(path);\n  return files.length === 0 || (files.length === 1 && files[0] === '.git');\n}\n\nfunction emptyDir(dir: string) {\n  if (!fs.existsSync(dir)) {\n    return;\n  }\n  for (const file of fs.readdirSync(dir)) {\n    if (file === '.git') {\n      continue;\n    }\n    fs.rmSync(path.resolve(dir, file), { recursive: true, force: true });\n  }\n}\n\nfunction pkgFromUserAgent(userAgent: string | undefined) {\n  if (!userAgent) return undefined;\n  const pkgSpec = userAgent.split(' ')[0];\n  const pkgSpecArr = pkgSpec.split('/');\n  return {\n    name: pkgSpecArr[0],\n    version: pkgSpecArr[1],\n  };\n}\n\nfunction setupReactSwc(root: string, isTs: boolean) {\n  editFile(path.resolve(root, 'package.json'), (content) => {\n    return content.replace(\n      /\"@vitejs\\/plugin-react\": \".+?\"/,\n      `\"@vitejs/plugin-react-swc\": \"^3.0.0\"`,\n    );\n  });\n  editFile(\n    path.resolve(root, `vite.config.${isTs ? 'ts' : 'js'}`),\n    (content) => {\n      return content.replace(\n        '@vitejs/plugin-react',\n        '@vitejs/plugin-react-swc',\n      );\n    },\n  );\n}\n\nfunction editFile(file: string, callback: (content: string) => string) {\n  const content = fs.readFileSync(file, 'utf-8');\n  fs.writeFileSync(file, callback(content), 'utf-8');\n}\n\ninit().catch((e) => {\n  console.error(e);\n});\n"],"mappings":";;;;;;;;AASA,MAAM,OAAO,SAGV,QAAQ,KAAK,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC5C,MAAM,MAAM,QAAQ,KAAK;AAgBzB,MAAM,aAA0B;CAC9B;EACE,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CACR;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,EACD;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF;EACF;CACD;EACE,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CACR;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,EACD;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF;EACF;CACD;EACE,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CACR;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,EACD;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF;EACF;CACD;EACE,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU;GACR;IACE,MAAM;IACN,SAAS;IACT,OAAO;IACR;GACD;IACE,MAAM;IACN,SAAS;IACT,OAAO;IACR;GACD;IACE,MAAM;IACN,SAAS;IACT,OAAO;IACR;GACD;IACE,MAAM;IACN,SAAS;IACT,OAAO;IACR;GACF;EACF;CACD;EACE,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CACR;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,EACD;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF;EACF;CACD;EACE,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CACR;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,EACD;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF;EACF;CACD;EACE,MAAM;EACN,SAAS;EACT,OAAO;EACP,UAAU,CACR;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,EACD;GACE,MAAM;GACN,SAAS;GACT,OAAO;GACR,CACF;EACF;CACF;AAED,MAAM,YAAY,WAAW,KAC1B,MAAO,EAAE,YAAY,E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"}