UNPKG

pg-proto-parser

Version:
60 lines (59 loc) 2.47 kB
import { writeFileSync } from 'fs'; import { extname, basename } from 'path'; import { readAndParsePackageJson } from '../package'; const pkg = readAndParsePackageJson(); export const getUndefinedKey = (enumName) => { // Split the name into parts where a lowercase letter is followed by an uppercase letter const parts = enumName.split(/(?<=[a-z])(?=[A-Z])/); const processedParts = parts.map(part => { // For parts that are all uppercase and longer than 1 character, only the first character should remain uppercase if (part === part.toUpperCase() && part.length > 1) { return part.charAt(0) + part.slice(1).toLowerCase(); } return part; }); const upperSnakeCase = processedParts.join('_').toUpperCase(); return `${upperSnakeCase}_UNDEFINED`; }; export const toSpecialCamelCase = (s) => { return s .replace(/_+/g, '') // Remove all underscores .replace(/([A-Z]+)([A-Z][a-z]|$)/g, (match, p1, p2) => p1.toLowerCase() + p2 // Lowercase all but the last letter of consecutive caps ) .replace(/^./, (match) => match.toLowerCase()); // Ensure the first character is lowercase }; export const hasUndefinedInitialValue = (enumData) => { const entries = Object.entries(enumData.values); if (entries.length === 0) return false; const undefinedKey = getUndefinedKey(enumData.name); const firstEntry = entries[0]; return firstEntry[0] === undefinedKey && firstEntry[1] === 0; }; export const cloneAndNameNode = (node, name) => { const clone = JSON.parse(JSON.stringify(node)); return { name, ...clone }; }; export const getFieldName = (field, fallbackName) => { return field.options?.json_name ? field.options.json_name : fallbackName; }; export const getHeader = () => { const version = process.env.NODE_ENV === 'test' ? 'latest' : pkg.version; return `/** * This file was automatically generated by pg-proto-parser@${version}. * DO NOT MODIFY IT BY HAND. Instead, modify the source proto file, * and run the pg-proto-parser generate command to regenerate this file. */ `; }; export const writeFileToDisk = (path, contents, options) => { const c = (options.includeHeader && extname(path) === '.ts') ? `${getHeader()}${contents}` : contents; writeFileSync(path, c); }; export const stripExtension = (filename) => { const extension = extname(filename); return basename(filename, extension); };