From 39ad794d9ffaf05aea87caf8d8c05b614d064ed7 Mon Sep 17 00:00:00 2001 From: Anshuman Singh <41586858+Anshuman-37@users.noreply.github.com> Date: Sat, 31 Aug 2024 21:52:49 +0100 Subject: [PATCH] Ensure certain paths are always in gitignore (#158) --- programs/create/lib/messages.ts | 4 ++ programs/create/module.ts | 2 + programs/create/steps/write-gitignore.ts | 54 ++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 programs/create/steps/write-gitignore.ts diff --git a/programs/create/lib/messages.ts b/programs/create/lib/messages.ts index aa3bb670..5866b696 100644 --- a/programs/create/lib/messages.ts +++ b/programs/create/lib/messages.ts @@ -259,6 +259,10 @@ export function writingReadmeMetaData() { return `📄 - Writing ${brightYellow(`README.md`)} metadata...` } +export function writingGitIgnore() { + return `🙈 - Writing ${brightYellow(`.gitignore`)} lines...` +} + export function writingReadmeMetaDataEError(projectName: string, error: any) { return ( `${red(`✖︎✖︎✖︎`)} ` + diff --git a/programs/create/module.ts b/programs/create/module.ts index 6397f966..59d5ce4f 100644 --- a/programs/create/module.ts +++ b/programs/create/module.ts @@ -9,6 +9,7 @@ import {installDependencies} from './steps/install-dependencies' import {writeReadmeFile} from './steps/write-readme-file' import {writeManifestJson} from './steps/write-manifest-json' import {generateExtensionTypes} from './steps/generate-extension-types' +import {writeGitignore} from './steps/write-gitignore' import {initializeGitRepository} from './steps/initialize-git-repository' export interface CreateOptions { @@ -53,6 +54,7 @@ export async function extensionCreate( await writeReadmeFile(projectPath, projectName) await writeManifestJson(projectPath, projectName) await initializeGitRepository(projectPath, projectName) + await writeGitignore(projectPath) if (utils.isTypeScriptTemplate(template)) { await generateExtensionTypes(projectPath, projectName) diff --git a/programs/create/steps/write-gitignore.ts b/programs/create/steps/write-gitignore.ts new file mode 100644 index 00000000..5ec0912c --- /dev/null +++ b/programs/create/steps/write-gitignore.ts @@ -0,0 +1,54 @@ +import fs from 'fs/promises' +import * as messages from '../lib/messages' + +const globalDependencies = ['# dependencies', '/node_modules'] +const globalTesting = ['# testing', '/coverage'] +const globalProduction = ['# production', '/dist'] +const globalMisc = ['# misc', '.DS_Store', '.env.local', '.env.development.local', + '.env.test.local', '.env.production.local', 'npm-debug.log*', 'yarn-debug.log*', 'yarn-error.log*', 'extension.d.ts'] +const globalLockFiles = ['# lock files', 'yarn.lock', 'package-lock.json'] + +const globalLines = [ + ...globalDependencies, + ...globalTesting, + ...globalProduction, + ...globalMisc, + ...globalLockFiles +] + +export async function writeGitignore(projectPath: string) { + const gitIgnorePath = projectPath + '/.gitignore' + + const fileHandle = await fs.open(gitIgnorePath, 'a+').catch((err) => { + console.error(err) + process.exit(1) + }) + + const paths = new Set() + // autoClose is required, otherwise the stream will close the file + // and we'll be unable to append to it + // + // Note: while readLines works for this use-case, care needs to be had + // if adding more contents to the loop, basically, the loop should just + // consume the data from readLines and nothing else + // + // Reference: https://stackoverflow.com/a/70616910 + for await (let line of fileHandle.readLines({autoClose: false})) { + line = line.trim() + if (line.length === 0) { + continue + } + paths.add(line) + } + + const linesToAdd = globalLines.filter((line) => !paths.has(line)) + + console.log(messages.writingGitIgnore()) + + await fileHandle + .appendFile(linesToAdd.join('\n'), {flush: true}) + .catch((err) => { + console.error(err) + process.exit(1) + }) +}