From 9150b62a4286f2fff8c4c7395830dc769a687b1a Mon Sep 17 00:00:00 2001 From: Justin Hileman Date: Mon, 25 Nov 2024 10:47:20 -0500 Subject: [PATCH] Detect ts-proto generated files. (#7082) ts-proto [added generated code comments in May](https://github.com/stephenh/ts-proto/pull/1037). This updates linguist to properly detect them. --- lib/linguist/generated.rb | 23 ++++++++ samples/TypeScript/proto.ts | 113 ++++++++++++++++++++++++++++++++++++ test/test_blob.rb | 1 + 3 files changed, 137 insertions(+) create mode 100644 samples/TypeScript/proto.ts diff --git a/lib/linguist/generated.rb b/lib/linguist/generated.rb index 539fc7029e..f3ecf58ba2 100644 --- a/lib/linguist/generated.rb +++ b/lib/linguist/generated.rb @@ -91,6 +91,7 @@ def generated? generated_protocol_buffer_from_go? || generated_protocol_buffer? || generated_javascript_protocol_buffer? || + generated_typescript_protocol_buffer? || generated_apache_thrift? || generated_jni_header? || vcr_cassette? || @@ -367,6 +368,28 @@ def generated_javascript_protocol_buffer? return lines[5].include?("GENERATED CODE -- DO NOT EDIT!") end + # Internal: Is the blob a TypeScript source file generated by the + # Protocol Buffer compiler? + # + # Files generated by ts-proto typically start with something like this + # (though the versions lines are optional): + # + # // Code generated by protoc-gen-ts_proto. DO NOT EDIT. + # // versions: + # // protoc-gen-ts_proto v1.181.2 + # // protoc v5.28.2 + # // source: hello.proto + # + # /* eslint-disable */ + # + # Returns true or false. + def generated_typescript_protocol_buffer? + return false unless extname == ".ts" + return false unless lines.count > 4 + + return lines[0].include?("Code generated by protoc-gen-ts_proto. DO NOT EDIT.") + end + APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php'] # Internal: Is the blob generated by Apache Thrift compiler? diff --git a/samples/TypeScript/proto.ts b/samples/TypeScript/proto.ts new file mode 100644 index 0000000000..3396bcc746 --- /dev/null +++ b/samples/TypeScript/proto.ts @@ -0,0 +1,113 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v1.181.2 +// protoc v5.28.2 +// source: hello.proto + +/* eslint-disable */ +import _m0 from "protobufjs/minimal"; +import { Any } from "./google/protobuf/any"; + +export const protobufPackage = "helloworld"; + +export interface HelloWorld { + payload: Any | undefined; +} + +function createBaseHelloWorld(): HelloWorld { + return { payload: undefined }; +} + +export const HelloWorld = { + encode( + message: HelloWorld, + writer: _m0.Writer = _m0.Writer.create() + ): _m0.Writer { + if (message.payload !== undefined) { + Any.encode(message.payload, writer.uint32(10).fork()).ldelim(); + } + return writer; + }, + + decode(input: _m0.Reader | Uint8Array, length?: number): HelloWorld { + const reader = + input instanceof _m0.Reader ? input : _m0.Reader.create(input); + let end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHelloWorld(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: + if (tag !== 10) { + break; + } + + message.payload = Any.decode(reader, reader.uint32()); + continue; + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skipType(tag & 7); + } + return message; + }, + + fromJSON(object: any): HelloWorld { + return { + payload: isSet(object.payload) ? Any.fromJSON(object.payload) : undefined, + }; + }, + + toJSON(message: HelloWorld): unknown { + const obj: any = {}; + if (message.payload !== undefined) { + obj.payload = Any.toJSON(message.payload); + } + return obj; + }, + + create, I>>(base?: I): HelloWorld { + return HelloWorld.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I + ): HelloWorld { + const message = createBaseHelloWorld(); + message.payload = + object.payload !== undefined && object.payload !== null + ? Any.fromPartial(object.payload) + : undefined; + return message; + }, +}; + +type Builtin = + | Date + | Function + | Uint8Array + | string + | number + | boolean + | undefined; + +export type DeepPartial = T extends Builtin + ? T + : T extends globalThis.Array + ? globalThis.Array> + : T extends ReadonlyArray + ? ReadonlyArray> + : T extends {} + ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin + ? P + : P & { [K in keyof P]: Exact } & { + [K in Exclude>]: never; + }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} diff --git a/test/test_blob.rb b/test/test_blob.rb index fc69a86283..767c023f26 100644 --- a/test/test_blob.rb +++ b/test/test_blob.rb @@ -202,6 +202,7 @@ def test_generated assert sample_blob_memory("Go/embedded.go").generated? assert sample_blob_memory("Go/oapi-codegen.go").generated? assert sample_blob_memory("JavaScript/proto.js").generated? + assert sample_blob_memory("TypeScript/proto.ts").generated? assert sample_blob_memory("PHP/ProtobufGenerated.php").generated? # Apache Thrift generated code