knex/scripts/update_gitignore_for_tsc_output.js

91 lines
2.7 KiB
JavaScript
Executable File

#!/usr/bin/env node
const path = require('path');
const fs = require('fs');
// Directory constants
const scriptDirectory = __dirname;
const repoDirectory = path.join(scriptDirectory, '..');
const libDirectory = path.join(repoDirectory, 'lib');
const helpText = `
Helper script to update lib/.gitignore for all .js files from .ts files.
update_gitignore_for_tsc_output.js COMMAND
COMMAND:
run: Update lib/.gitignore file.
help: Print this menu.
NOTES FOR USAGE:
1. This script is tested to work on Ubuntu 18.04 LTS.
`;
const gitignoreHeader = `# DO NOT EDIT, GENERATED BY: scripts/update_gitignore_for_tsc_output.js
# Do not include tsc generated type definitions
**/*.d.ts
# Do not include tsc source maps
**/*.js.map
# Do not include .js files from .ts files
`;
function main(cliCommand) {
if (cliCommand === 'run') {
console.log('Generating lib/.gitignore ...');
// Find all .ts files in lib/
const directoriesToProcess = [libDirectory];
const tsFiles = [];
while (directoriesToProcess.length > 0) {
const directory = directoriesToProcess.pop();
if (!fs.existsSync(directory)) {
throw new Error("Directory doesn't exist:", directory);
}
const files = fs.readdirSync(directory);
files.forEach((file) => {
const filename = path.join(directory, file);
const stat = fs.lstatSync(filename);
if (stat.isDirectory()) {
directoriesToProcess.push(filename);
} else if (filename.endsWith('.ts') && !filename.endsWith('.d.ts')) {
tsFiles.push(filename);
console.log('Found .ts file:', filename);
}
});
}
// Get paths of .js files to ignore
const jsFilesToIgnore = tsFiles.map((filepath) => {
// Cuts off `${libDirectory}/`
const relativeTsPath = filepath.slice(libDirectory.length + 1);
// Swaps .ts for .js file ending
const relativeJsPath =
relativeTsPath.slice(0, relativeTsPath.length - 3) + '.js';
// Always use POSIX-style path separators - .gitignore requires it
return relativeJsPath.split(path.sep).join(path.posix.sep);
});
const jsFilesToIgnoreString = jsFilesToIgnore.join('\n');
const libGitignorePath = path.join(libDirectory, '.gitignore');
fs.writeFileSync(
libGitignorePath,
gitignoreHeader + jsFilesToIgnoreString + '\n'
);
console.log('DONE');
} else if (['help', '--help', '-h', undefined].includes(cliCommand)) {
console.log(helpText);
} else {
console.log(`Unsupported command: ${cliCommand}`);
console.log("Try running with 'help' to see supported commands.");
process.exit(1);
}
}
// Main script logic
const cliCommand = process.argv[2];
// Start the bash app's main function
main(cliCommand);