// Menu: Open Project
// Description: Opens a project in code
// Shortcut: cmd shift .
import path from 'path'
import fs from 'fs'
import os from 'os'
const isDirectory = async filePath => {
try {
const stat = await fs.promises.stat(filePath)
return stat.isDirectory()
} catch (e) {
return false
}
}
const isFile = async filePath => {
try {
const stat = await fs.promises.stat(filePath)
return stat.isFile()
} catch (e) {
return false
}
}
async function getProjects(parentDir) {
const codeDir = (await ls(parentDir)).stdout.split('\n').filter(Boolean)
const choices = []
for (const dir of codeDir) {
let fullPath = dir
if (!path.isAbsolute(dir)) {
fullPath = path.join(parentDir, dir)
}
if (fullPath.includes('/node_modules/')) continue
if (fullPath.includes('/build/')) continue
if (fullPath.includes('/dist/')) continue
if (fullPath.includes('/coverage/')) continue
const pkgjson = path.join(fullPath, 'package.json')
if (await isFile(pkgjson)) {
choices.push({
name: dir,
value: fullPath,
description: fullPath,
})
} else if (await isDirectory(fullPath)) {
choices.push(...(await getProjects(fullPath)))
}
}
return choices
}
const choice = await arg('Which project?', async () => {
const choices = [
...(await getProjects(path.join(os.homedir(), 'code'))),
...(await getProjects(path.join(os.homedir(), 'Desktop'))),
]
return choices
})
await edit(choice)