sindresorhus / globby

User-friendly glob matching
MIT License
2.49k stars 126 forks source link

[Suggestion] Autocomplete directory path #249

Open OleksandrKucherenko opened 1 year ago

OleksandrKucherenko commented 1 year ago
import { glob } from 'glob'
import fs from 'node:fs'

const cwd = {
    message: `Current working directory (ex. ~/project, ../project, ./project):`,
    type: `autocomplete`,
    limit: 10,
    choices: [
      /* force prompts to render 10 lines */
      { title: `Current working directory`, value: process.cwd() },
      { title: `Parent directory`, value: `../` },
      { title: `Grand directory`, value: `../../` },
      { title: `Home directory`, value: `~` },
      { title: `Root directory`, value: `/` },
      { title: `reserved-1`, value: `./` },
      { title: `reserved-2`, value: `./` },
      { title: `reserved-3`, value: `./` },
      { title: `reserved-4`, value: `./` },
      { title: `reserved-5`, value: `./` },
    ],
    suggest: async (input, _choices) => {
      const cwd = process.cwd()
      const start = (input.length === 0 ? cwd : input).replace('~', process.env.HOME)
      const files = await glob(`${start}*`, { cwd, maxDepth: 1 })
      const value = files?.[0] ?? start

      const suggestions = files ?? [value]

      return suggestions
        .filter((f) => f !== '.' && f !== '..')
        .filter((f) => {
          try {
            return fs.lstatSync(f).isDirectory()
          } catch (error) {
            return false
          }
        })
        .map((f) => ({ title: f }))
        .slice(0, 10)
    },
  }