Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
c28d210
fix: support for nested messages and enums within group blocks
JoshuaWisePostmanaut Jan 31, 2022
a75d7b8
test: support for nested messages and enums within group blocks
JoshuaWisePostmanaut Jan 31, 2022
a6c51a5
Merge branch 'protobufjs:master' into master
codenirvana Jul 5, 2022
bb099f2
chore: add google/rpc protos
codenirvana Jul 5, 2022
f154e21
chore: update package name
codenirvana Jul 5, 2022
ed28206
6.11.3-postman.1
codenirvana Jul 5, 2022
65b1a0a
Merge branch 'master' of github.com:protobufjs/protobuf.js into proto…
codenirvana Aug 8, 2022
8d933fa
Merge branch 'protobufjs-master'
codenirvana Aug 8, 2022
c87a7fd
fix: lookup own properties from type, service, and namespace objects
codenirvana Aug 9, 2022
76b434c
Merge pull request #2 from postmanlabs/fix/get-prop
codenirvana Aug 9, 2022
e9fba6e
7.0.0-postman.1
codenirvana Aug 9, 2022
3649d70
Merge branch 'protobufjs:master' into master
codenirvana Aug 17, 2022
aba78f8
Merge branch 'master' of github.com:protobufjs/protobuf.js into proto…
codenirvana Nov 27, 2022
da60c8e
Merge branch 'protobufjs-master'
codenirvana Nov 27, 2022
41ad43f
7.1.2-postman.2
codenirvana Nov 27, 2022
0dd0d86
use original casing for common protobufs
JoshuaWisePostmanaut Mar 22, 2023
41830e1
v7.2.0-postman.2
JoshuaWisePostmanaut Mar 22, 2023
fa7fc5c
Merge branch 'protobufjs:master' into master
appurva21 Jun 26, 2024
676843f
fix: transformation of map entry from File Descriptor to Reflection obj
appurva21 Jun 26, 2024
27ff3bb
Merge pull request #5 from postmanlabs/fix/from-descriptor
appurva21 Jun 27, 2024
e09ab56
7.3.2-postman.1
appurva21 Jun 27, 2024
4d98dd7
7.3.2-postman.2
appurva21 Jun 27, 2024
0957636
chore: update package.lock
appurva21 Jun 27, 2024
c4c1160
fix: map field detection for converting file descriptor to reflection…
appurva21 Jul 19, 2024
8931a67
Merge pull request #6 from postmanlabs/feature/fix-map-from-descriptor
appurva21 Jul 19, 2024
fab5b59
7.3.2-postman.3
appurva21 Jul 19, 2024
5128bf3
Added wrappers for Struct and ListValue
Jun 27, 2025
32b9316
Removed logs + added fallback to wrappers
Jul 2, 2025
626b944
Merge pull request #7 from postmanlabs/proto-wrappers-fix
ankurdengla Jul 10, 2025
634457a
Added support for Duration and Timestamp as string
Sep 15, 2025
fdd99c0
Only calling custom converter logic for Timestamp and Duration
Sep 17, 2025
2ee27f3
Fixed fallback case
Sep 17, 2025
cb15aaf
Added support for ms, us and ns in Duration and also always return va…
Sep 25, 2025
3dde10c
Using object check instead of options.json
Sep 25, 2025
3745acd
Fixed duplication of regex matching
Sep 25, 2025
70c1d00
Added isLegacyStruct util to handle old struct syntax
Sep 26, 2025
439b27b
Fixed case for negative duration
Sep 29, 2025
7cfa813
Update isLegacyStruct to handle fields array
Sep 29, 2025
117a0b3
Fixed error message
Sep 29, 2025
4f2d74e
Adressed comments
Sep 29, 2025
8f0bfa2
Fixed long conversion in Timestamp toObject wrapper
Sep 29, 2025
c794702
Fixed long conversion in Timestamp fromObject wrapper
Sep 29, 2025
14c2434
Fixed fields array handling
Sep 29, 2025
0b393fc
Added safecheck
Sep 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cli/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 83 additions & 7 deletions ext/descriptor/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ var Namespace = $protobuf.Namespace,
* @param {IFileDescriptorSet|Reader|Uint8Array} descriptor Descriptor
* @returns {Root} Root instance
*/
Root.fromDescriptor = function fromDescriptor(descriptor) {
Root.fromDescriptor = function fromDescriptor(descriptor, options) {

// Decode the descriptor message if specified as a buffer:
if (typeof descriptor.length === "number")
Expand All @@ -89,7 +89,7 @@ Root.fromDescriptor = function fromDescriptor(descriptor) {
root.files.push(filePackage.filename = fileDescriptor.name);
if (fileDescriptor.messageType)
for (i = 0; i < fileDescriptor.messageType.length; ++i)
filePackage.add(Type.fromDescriptor(fileDescriptor.messageType[i], fileDescriptor.syntax));
filePackage.add(Type.fromDescriptor(fileDescriptor.messageType[i], fileDescriptor.syntax, options));
if (fileDescriptor.enumType)
for (i = 0; i < fileDescriptor.enumType.length; ++i)
filePackage.add(Enum.fromDescriptor(fileDescriptor.enumType[i]));
Expand Down Expand Up @@ -198,22 +198,33 @@ var unnamedMessageIndex = 0;
* @param {string} [syntax="proto2"] Syntax
* @returns {Type} Type instance
*/
Type.fromDescriptor = function fromDescriptor(descriptor, syntax) {
Type.fromDescriptor = function fromDescriptor(descriptor, syntax, options) {

// Decode the descriptor message if specified as a buffer:
if (typeof descriptor.length === "number")
descriptor = exports.DescriptorProto.decode(descriptor);

// Create the message type
var type = new Type(descriptor.name.length ? descriptor.name : "Type" + unnamedMessageIndex++, fromDescriptorOptions(descriptor.options, exports.MessageOptions)),
useMapField = options && options.useMapField,
i;

/* Oneofs */ if (descriptor.oneofDecl)
for (i = 0; i < descriptor.oneofDecl.length; ++i)
type.add(OneOf.fromDescriptor(descriptor.oneofDecl[i]));
/* Fields */ if (descriptor.field)
for (i = 0; i < descriptor.field.length; ++i) {
var field = Field.fromDescriptor(descriptor.field[i], syntax);
var mapType = useMapField && descriptor.nestedType
? descriptor.nestedType.find(function (t) {
var currField = descriptor.field[i];
var nestedTypeName = currField.typeName && currField.typeName.split('.').pop();
return t.options && t.options.mapEntry && t.name === nestedTypeName
})
: null;
var field = mapType
? MapField.fromDescriptor(descriptor.field[i], mapType, syntax)
: Field.fromDescriptor(descriptor.field[i], syntax);

type.add(field);
if (descriptor.field[i].hasOwnProperty("oneofIndex")) // eslint-disable-line no-prototype-builtins
type.oneofsArray[descriptor.field[i].oneofIndex].add(field);
Expand All @@ -223,9 +234,15 @@ Type.fromDescriptor = function fromDescriptor(descriptor, syntax) {
type.add(Field.fromDescriptor(descriptor.extension[i], syntax));
/* Nested types */ if (descriptor.nestedType)
for (i = 0; i < descriptor.nestedType.length; ++i) {
type.add(Type.fromDescriptor(descriptor.nestedType[i], syntax));
if (descriptor.nestedType[i].options && descriptor.nestedType[i].options.mapEntry)
type.setOption("map_entry", true);
if (useMapField) {
// Nested types representing map entry are added as MapField and should not be added as Type
if (!descriptor.nestedType[i].options || !descriptor.nestedType[i].options.mapEntry)
type.add(Type.fromDescriptor(descriptor.nestedType[i], syntax, options));
} else {
type.add(Type.fromDescriptor(descriptor.nestedType[i], syntax, options));
if (descriptor.nestedType[i].options && descriptor.nestedType[i].options.mapEntry)
type.setOption("map_entry", true);
}
}
/* Nested enums */ if (descriptor.enumType)
for (i = 0; i < descriptor.enumType.length; ++i)
Expand Down Expand Up @@ -503,6 +520,65 @@ Field.prototype.toDescriptor = function toDescriptor(syntax) {
return descriptor;
};

// --- MapField ---

/**
* Creates a map field from a descriptor.
* @param {IFieldDescriptorProto|Reader|Uint8Array} descriptor Descriptor
* @param {IDescriptorProto} nestedType Nested type descriptor
* @returns {MapField} MapField instance
*/
MapField.fromDescriptor = function fromDescriptor(descriptor, nestedType) {
// Decode the descriptor message if specified as a buffer:
if (typeof descriptor.length === "number")
descriptor = exports.DescriptorProto.decode(descriptor);

// Decode the nested type if specified as a buffer:
if (typeof nestedType.length === "number")
nestedType = exports.DescriptorProto.decode(nestedType);

if (typeof descriptor.number !== "number")
throw Error("missing field id");

var typeName = nestedType.field[1].typeName;
var type = typeName && typeName.length
? typeName
: fromDescriptorType(nestedType.field[1].type);

var field = new MapField(
descriptor.name.length ? descriptor.name : "field" + descriptor.number,
descriptor.number,
fromDescriptorType(nestedType.field[0].type),
type,
fromDescriptorOptions(descriptor.options, exports.FieldOptions)
);

var extendee = descriptor.extendee;
if (extendee !== undefined) {
field.extend = extendee.length ? extendee : undefined;
}

if (descriptor.defaultValue && descriptor.defaultValue.length) {
var defaultValue = descriptor.defaultValue;
switch (defaultValue) {
case "true": case "TRUE":
defaultValue = true;
break;
case "false": case "FALSE":
defaultValue = false;
break;
default:
var match = numberRe.exec(defaultValue);
if (match)
defaultValue = parseInt(defaultValue); // eslint-disable-line radix
break;
}
field.setOption("default", defaultValue);
}

return field;
}

// --- Enum ---

/**
Expand Down
204 changes: 204 additions & 0 deletions google/rpc/error_details.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
{
"nested": {
"google": {
"nested": {
"rpc": {
"nested": {
"RetryInfo": {
"fields": {
"retryDelay": {
"type": "Duration",
"id": 1
}
},
"nested": {
"Duration": {
"fields": {
"seconds": {
"type": "int64",
"id": 1
},
"nanos": {
"type": "int32",
"id": 2
}
}
}
}
},
"DebugInfo": {
"fields": {
"stackEntries": {
"rule": "repeated",
"type": "string",
"id": 1
},
"detail": {
"type": "string",
"id": 2
}
}
},
"QuotaFailure": {
"fields": {
"violations": {
"rule": "repeated",
"type": "Violation",
"id": 1
}
},
"nested": {
"Violation": {
"fields": {
"subject": {
"type": "string",
"id": 1
},
"description": {
"type": "string",
"id": 2
}
}
}
}
},
"ErrorInfo": {
"fields": {
"reason": {
"type": "string",
"id": 1
},
"domain": {
"type": "string",
"id": 2
},
"metadata": {
"keyType": "string",
"type": "string",
"id": 3
}
}
},
"PreconditionFailure": {
"fields": {
"violations": {
"rule": "repeated",
"type": "Violation",
"id": 1
}
},
"nested": {
"Violation": {
"fields": {
"type": {
"type": "string",
"id": 1
},
"subject": {
"type": "string",
"id": 2
},
"description": {
"type": "string",
"id": 3
}
}
}
}
},
"BadRequest": {
"fields": {
"fieldViolations": {
"rule": "repeated",
"type": "FieldViolation",
"id": 1
}
},
"nested": {
"FieldViolation": {
"fields": {
"field": {
"type": "string",
"id": 1
},
"description": {
"type": "string",
"id": 2
}
}
}
}
},
"RequestInfo": {
"fields": {
"requestId": {
"type": "string",
"id": 1
},
"servingData": {
"type": "string",
"id": 2
}
}
},
"ResourceInfo": {
"fields": {
"resourceType": {
"type": "string",
"id": 1
},
"resourceName": {
"type": "string",
"id": 2
},
"owner": {
"type": "string",
"id": 3
},
"description": {
"type": "string",
"id": 4
}
}
},
"Help": {
"fields": {
"links": {
"rule": "repeated",
"type": "Link",
"id": 1
}
},
"nested": {
"Link": {
"fields": {
"description": {
"type": "string",
"id": 1
},
"url": {
"type": "string",
"id": 2
}
}
}
}
},
"LocalizedMessage": {
"fields": {
"locale": {
"type": "string",
"id": 1
},
"message": {
"type": "string",
"id": 2
}
}
}
}
}
}
}
}
}
Loading