UNPKG

ts-proto

Version:

> `ts-proto` transforms your `.proto` files into strongly-typed, idiomatic TypeScript files!

145 lines (130 loc) 4.48 kB
import ReadStream = NodeJS.ReadStream; import { Options, LongOption, EnvOption, OneofOption } from './main'; import { SourceDescription } from './sourceInfo'; export function readToBuffer(stream: ReadStream): Promise<Buffer> { return new Promise((resolve) => { const ret: Array<Buffer | string> = []; let len = 0; stream.on('readable', () => { let chunk; while ((chunk = stream.read())) { ret.push(chunk); len += chunk.length; } }); stream.on('end', () => { resolve(Buffer.concat(ret as any, len)); }); }); } export function fail(message: string): never { throw new Error(message); } export function singular(name: string): string { return name.substring(0, name.length - 1); // drop the 's', which is extremely naive } export function lowerFirst(name: string): string { return name.substring(0, 1).toLowerCase() + name.substring(1); } export function upperFirst(name: string): string { return name.substring(0, 1).toUpperCase() + name.substring(1); } export function defaultOptions(): Options { return { useContext: false, snakeToCamel: true, forceLong: LongOption.NUMBER, useOptionals: false, oneof: OneofOption.PROPERTIES, lowerCaseServiceMethods: false, outputEncodeMethods: true, outputJsonMethods: true, outputClientImpl: true, returnObservable: false, addGrpcMetadata: false, addNestjsRestParameter: false, nestJs: false, env: EnvOption.BOTH, }; } export function optionsFromParameter(parameter: string): Options { const options = defaultOptions(); if (parameter) { if (parameter.includes('context=true')) { options.useContext = true; } if (parameter.includes('snakeToCamel=false')) { options.snakeToCamel = false; } if (parameter.includes('forceLong=true') || parameter.includes('forceLong=long')) { options.forceLong = LongOption.LONG; } if (parameter.includes('forceLong=string')) { options.forceLong = LongOption.STRING; } if (parameter.includes('useOptionals=true')) { options.useOptionals = true; } if (parameter.includes('oneof=properties')) { options.oneof = OneofOption.PROPERTIES; } if (parameter.includes('oneof=unions')) { options.oneof = OneofOption.UNIONS; } if (parameter.includes('lowerCaseServiceMethods=true')) { options.lowerCaseServiceMethods = true; } if (parameter.includes('outputEncodeMethods=false')) { options.outputEncodeMethods = false; } if (parameter.includes('outputJsonMethods=false')) { options.outputJsonMethods = false; } if (parameter.includes('outputClientImpl=false')) { options.outputClientImpl = false; } if (parameter.includes('outputClientImpl=grpc-web')) { options.outputClientImpl = 'grpc-web'; } if (parameter.includes('nestJs=true')) { options.nestJs = true; options.lowerCaseServiceMethods = true; options.outputEncodeMethods = false; options.outputJsonMethods = false; options.outputClientImpl = false; if (parameter.includes('addGrpcMetadata=true')) { options.addGrpcMetadata = true; } if (parameter.includes('addNestjsRestParameter=true')) { options.addNestjsRestParameter = true; } if (parameter.includes('returnObservable=true')) { options.returnObservable = true; } } if (parameter.includes('env=node')) { options.env = EnvOption.NODE; } if (parameter.includes('env=browser')) { options.env = EnvOption.BROWSER; } } return options; } // addJavadoc will attempt to expand unescaped percent %, so we replace these within source comments. const PercentAll = /\%/g; // Since we don't know what form the comment originally took, it may contain closing block comments. const CloseComment = /\*\//g; /** * Removes potentially harmful characters from comments and calls the provided expression * @param desc {SourceDescription} original comment information * @param process {(comment: string) => void} called if a comment exists * @returns {string} scrubbed text */ export function maybeAddComment(desc: SourceDescription, process: (comment: string) => void): void { if (desc.leadingComments || desc.trailingComments) { return process( (desc.leadingComments || desc.trailingComments || '').replace(PercentAll, '%%').replace(CloseComment, '* /') ); } }