Open dev-project in Script Kit
// Preview: docs// Menu: Open Project// Description: Opens a project in vscode// Shortcut: command shift .import '@johnlindquist/kit'import { rmdirSync, existsSync } from 'fs'const envPath = await env('PROJECT_DIR')const projectDir = home(envPath)const isGit = (input: string | Record<string, string>) =>typeof input == 'string' ? input.includes('github.com') : falseconst unfilteredProjectList = await readdir(projectDir)const projectList = unfilteredProjectList.filter((value: string) => !value.includes('.'))let { projects, write } = await db('projects', {projects: projectList})projects.sort((a: string, b: string) => {if (a < b) {return -1}if (a > b) {return 1}return 0})projects.forEach(async (val: string) => {if (val.includes('.')) {projects.pop(val)await write()}})projectList.forEach(async (value: string) => {if (!projects.includes(value)) {projects.push(value)await write()}})async function addExistingF (input: string) {const pathToFolder = await selectFolder()const dirname = path.basename(pathToFolder)const pathToDir = path.resolve(projectDir, dirname)const dirExists = existsSync(pathToDir)if (dirExists) {projects.push(input)await write()await submit('exit')}}async function gitCloneRepo (input: string, state: any) {if (isGit(input)) {await term({command: `git clone ${input}`,cwd: projectDir,shortcuts: [{name: 'Exit',key: `${cmd}+w`,bar: 'right',onPress: async () => {await mainScript()}},{name: 'Back to Main Menu',key: `${cmd}+enter`,bar: 'right',onPress: async () => {await submit('exit')}}]})} else {throw new Error('Not a git repository!')}}async function removeProjectActionHandler (input: string, state: any) {let project = state?.focused?.valuermdirSync(path.resolve(projectDir, project), { recursive: true })let indexOfProject = projects.indexOf(project)projects.splice(indexOfProject, 1)await write()await submit('exit')}async function purgeFromList (input: string, state: any) {let project = state?.focused?.valuelet indexOfProject = projects.indexOf(project)projects.splice(indexOfProject, 1)await write()await submit('exit')}async function createF (input: string, state: any) {const dir = path.resolve(projectDir, input)const exists = await isDir(dir)if (exists) {return `${input} already exists`} else {const { code, stderr, stdout } = mkdir(dir)if (stderr) {throw stderr}}const initorNot = await arg('Create git repo?', ['yes', 'no'])if (initorNot === 'yes') {cd(dir)execLog('git init')}projects.push(input)await write()edit('', dir)}const specialChoices = [{miss: true,name: 'Clone Git Repository',onSubmit: gitCloneRepo},{miss: true,name: 'Add folder to list',onSubmit: addExistingF},{miss: true,name: 'Create Project folder',onSubmit: createF}]while (true) {const projList = projects.map(project => project.split('\\').pop())const previewList = projList.concat(specialChoices)let project = await arg({placeholder: 'Projects',actions: [{ name: 'Remove Project', onAction: removeProjectActionHandler },{name: 'Remove from List',onAction: purgeFromList}]},previewList)const isExistingProject =projects.filter((e: string) => e.includes(project)).length !== 0if (project !== 'exit') {if (isExistingProject) {edit('', path.resolve(projectDir, project))}}}