// Copyright 2021-2024 Buf Technologies, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. /** * Converts snake_case to protoCamelCase according to the convention * used by protoc to convert a field name to a JSON name. */ export function protoCamelCase(snakeCase) { let capNext = false; const b = []; for (let i = 0; i < snakeCase.length; i++) { let c = snakeCase.charAt(i); switch (c) { case "_": capNext = true; break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": b.push(c); capNext = false; break; default: if (capNext) { capNext = false; c = c.toUpperCase(); } b.push(c); break; } } return b.join(""); } /** * Names that cannot be used for object properties because they are reserved * by built-in JavaScript properties. */ const reservedObjectProperties = new Set([ // names reserved by JavaScript "constructor", "toString", "toJSON", "valueOf", ]); /** * Escapes names that are reserved for ECMAScript built-in object properties. * * Also see safeIdentifier() from @bufbuild/protoplugin. */ export function safeObjectProperty(name) { return reservedObjectProperties.has(name) ? name + "$" : name; }