ts-proto 1.89.0 → 1.90.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.markdown +0 -1
- package/build/main.js +15 -13
- package/build/utils.js +10 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.90.0](https://github.com/stephenh/ts-proto/compare/v1.89.0...v1.90.0) (2021-11-24)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* Add support for 'json_name' annotation ([#408](https://github.com/stephenh/ts-proto/issues/408)) ([b519717](https://github.com/stephenh/ts-proto/commit/b5197174bcaacb8f163cd197d52ab9c645d21d4c))
|
|
7
|
+
|
|
1
8
|
# [1.89.0](https://github.com/stephenh/ts-proto/compare/v1.88.0...v1.89.0) (2021-11-24)
|
|
2
9
|
|
|
3
10
|
|
package/README.markdown
CHANGED
|
@@ -379,7 +379,6 @@ The test suite's proto files (i.e. `simple.proto`, `batching.proto`, etc.) curre
|
|
|
379
379
|
# Todo
|
|
380
380
|
|
|
381
381
|
- Support the string-based encoding of duration in `fromJSON`/`toJSON`
|
|
382
|
-
- Support the `json_name` annotation
|
|
383
382
|
- Make `oneof=unions` the default behavior in 2.0
|
|
384
383
|
- Probably change `forceLong` default in 2.0, should default to `forceLong=long`
|
|
385
384
|
- Make `esModuleInterop=true` the default in 2.0
|
package/build/main.js
CHANGED
|
@@ -814,6 +814,7 @@ function generateFromJson(ctx, fullName, messageDesc) {
|
|
|
814
814
|
// add a check for each incoming field
|
|
815
815
|
messageDesc.field.forEach((field) => {
|
|
816
816
|
const fieldName = case_1.maybeSnakeToCamel(field.name, options);
|
|
817
|
+
const jsonName = utils_1.determineFieldJsonName(field, options);
|
|
817
818
|
// get a generic 'reader.doSomething' bit that is specific to the basic type
|
|
818
819
|
const readSnippet = (from) => {
|
|
819
820
|
if (types_1.isEnum(field)) {
|
|
@@ -922,7 +923,7 @@ function generateFromJson(ctx, fullName, messageDesc) {
|
|
|
922
923
|
const fieldType = types_1.toTypeName(ctx, messageDesc, field);
|
|
923
924
|
const i = maybeCastToNumber(ctx, messageDesc, field, 'key');
|
|
924
925
|
chunks.push(ts_poet_1.code `
|
|
925
|
-
message.${fieldName} = Object.entries(object.${
|
|
926
|
+
message.${fieldName} = Object.entries(object.${jsonName} ?? {}).reduce<${fieldType}>((acc, [key, value]) => {
|
|
926
927
|
acc[${i}] = ${readSnippet('value')};
|
|
927
928
|
return acc;
|
|
928
929
|
}, {});
|
|
@@ -930,21 +931,21 @@ function generateFromJson(ctx, fullName, messageDesc) {
|
|
|
930
931
|
}
|
|
931
932
|
else if (types_1.isAnyValueType(field)) {
|
|
932
933
|
chunks.push(ts_poet_1.code `
|
|
933
|
-
message.${fieldName} = Array.isArray(object?.${
|
|
934
|
+
message.${fieldName} = Array.isArray(object?.${jsonName}) ? [...object.${jsonName}] : [];
|
|
934
935
|
`);
|
|
935
936
|
}
|
|
936
937
|
else {
|
|
937
938
|
// Explicit `any` type required to make TS with noImplicitAny happy. `object` is also `any` here.
|
|
938
939
|
chunks.push(ts_poet_1.code `
|
|
939
|
-
message.${fieldName} = (object.${
|
|
940
|
+
message.${fieldName} = (object.${jsonName} ?? []).map((e: any) => ${readSnippet('e')});
|
|
940
941
|
`);
|
|
941
942
|
}
|
|
942
943
|
}
|
|
943
944
|
else if (types_1.isWithinOneOfThatShouldBeUnion(options, field)) {
|
|
944
|
-
chunks.push(ts_poet_1.code `if (object.${
|
|
945
|
+
chunks.push(ts_poet_1.code `if (object.${jsonName} !== undefined && object.${jsonName} !== null) {`);
|
|
945
946
|
const oneofName = case_1.maybeSnakeToCamel(messageDesc.oneofDecl[field.oneofIndex].name, options);
|
|
946
947
|
chunks.push(ts_poet_1.code `
|
|
947
|
-
message.${oneofName} = { $case: '${fieldName}', ${fieldName}: ${readSnippet(`object.${
|
|
948
|
+
message.${oneofName} = { $case: '${fieldName}', ${fieldName}: ${readSnippet(`object.${jsonName}`)} }
|
|
948
949
|
`);
|
|
949
950
|
chunks.push(ts_poet_1.code `}`);
|
|
950
951
|
}
|
|
@@ -964,8 +965,8 @@ function generateFromJson(ctx, fullName, messageDesc) {
|
|
|
964
965
|
else {
|
|
965
966
|
const fallback = types_1.isWithinOneOf(field) ? 'undefined' : types_1.defaultValue(ctx, field);
|
|
966
967
|
chunks.push(ts_poet_1.code `
|
|
967
|
-
message.${fieldName} = (object.${
|
|
968
|
-
? ${readSnippet(`object.${
|
|
968
|
+
message.${fieldName} = (object.${jsonName} !== undefined && object.${jsonName} !== null)
|
|
969
|
+
? ${readSnippet(`object.${jsonName}`)}
|
|
969
970
|
: ${fallback};
|
|
970
971
|
`);
|
|
971
972
|
}
|
|
@@ -986,6 +987,7 @@ function generateToJson(ctx, fullName, messageDesc) {
|
|
|
986
987
|
// then add a case for each field
|
|
987
988
|
messageDesc.field.forEach((field) => {
|
|
988
989
|
const fieldName = case_1.maybeSnakeToCamel(field.name, options);
|
|
990
|
+
const jsonName = utils_1.determineFieldJsonName(field, options);
|
|
989
991
|
const readSnippet = (from) => {
|
|
990
992
|
if (types_1.isEnum(field)) {
|
|
991
993
|
const toJson = types_1.getEnumMethod(typeMap, field.typeName, 'ToJSON');
|
|
@@ -1061,10 +1063,10 @@ function generateToJson(ctx, fullName, messageDesc) {
|
|
|
1061
1063
|
if (types_1.isMapType(ctx, messageDesc, field)) {
|
|
1062
1064
|
// Maps might need their values transformed, i.e. bytes --> base64
|
|
1063
1065
|
chunks.push(ts_poet_1.code `
|
|
1064
|
-
obj.${
|
|
1066
|
+
obj.${jsonName} = {};
|
|
1065
1067
|
if (message.${fieldName}) {
|
|
1066
1068
|
Object.entries(message.${fieldName}).forEach(([k, v]) => {
|
|
1067
|
-
obj.${
|
|
1069
|
+
obj.${jsonName}[k] = ${readSnippet('v')};
|
|
1068
1070
|
});
|
|
1069
1071
|
}
|
|
1070
1072
|
`);
|
|
@@ -1073,9 +1075,9 @@ function generateToJson(ctx, fullName, messageDesc) {
|
|
|
1073
1075
|
// Arrays might need their elements transformed
|
|
1074
1076
|
chunks.push(ts_poet_1.code `
|
|
1075
1077
|
if (message.${fieldName}) {
|
|
1076
|
-
obj.${
|
|
1078
|
+
obj.${jsonName} = message.${fieldName}.map(e => ${readSnippet('e')});
|
|
1077
1079
|
} else {
|
|
1078
|
-
obj.${
|
|
1080
|
+
obj.${jsonName} = [];
|
|
1079
1081
|
}
|
|
1080
1082
|
`);
|
|
1081
1083
|
}
|
|
@@ -1083,11 +1085,11 @@ function generateToJson(ctx, fullName, messageDesc) {
|
|
|
1083
1085
|
// oneofs in a union are only output as `oneof name = ...`
|
|
1084
1086
|
const oneofName = case_1.maybeSnakeToCamel(messageDesc.oneofDecl[field.oneofIndex].name, options);
|
|
1085
1087
|
const v = readSnippet(`message.${oneofName}?.${fieldName}`);
|
|
1086
|
-
chunks.push(ts_poet_1.code `message.${oneofName}?.$case === '${fieldName}' && (obj.${
|
|
1088
|
+
chunks.push(ts_poet_1.code `message.${oneofName}?.$case === '${fieldName}' && (obj.${jsonName} = ${v});`);
|
|
1087
1089
|
}
|
|
1088
1090
|
else {
|
|
1089
1091
|
const v = readSnippet(`message.${fieldName}`);
|
|
1090
|
-
chunks.push(ts_poet_1.code `message.${fieldName} !== undefined && (obj.${
|
|
1092
|
+
chunks.push(ts_poet_1.code `message.${fieldName} !== undefined && (obj.${jsonName} = ${v});`);
|
|
1091
1093
|
}
|
|
1092
1094
|
});
|
|
1093
1095
|
chunks.push(ts_poet_1.code `return obj;`);
|
package/build/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FormattedMethodDescriptor = exports.assertInstanceOf = exports.maybePrefixPackage = exports.prefixDisableLinter = exports.maybeAddComment = exports.upperFirst = exports.lowerFirst = exports.singular = exports.fail = exports.readToBuffer = exports.protoFilesToGenerate = void 0;
|
|
3
|
+
exports.determineFieldJsonName = exports.FormattedMethodDescriptor = exports.assertInstanceOf = exports.maybePrefixPackage = exports.prefixDisableLinter = exports.maybeAddComment = exports.upperFirst = exports.lowerFirst = exports.singular = exports.fail = exports.readToBuffer = exports.protoFilesToGenerate = void 0;
|
|
4
4
|
const ts_poet_1 = require("ts-poet");
|
|
5
5
|
const options_1 = require("./options");
|
|
6
6
|
const case_1 = require("./case");
|
|
@@ -144,3 +144,12 @@ class FormattedMethodDescriptor {
|
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
146
|
exports.FormattedMethodDescriptor = FormattedMethodDescriptor;
|
|
147
|
+
function determineFieldJsonName(field, options) {
|
|
148
|
+
// By default jsonName is camelCased by the protocol compilier unless the user has
|
|
149
|
+
// set a "json_name" option on this field.
|
|
150
|
+
if (field.jsonName.length > 0) {
|
|
151
|
+
return field.jsonName;
|
|
152
|
+
}
|
|
153
|
+
return case_1.maybeSnakeToCamel(field.name, options);
|
|
154
|
+
}
|
|
155
|
+
exports.determineFieldJsonName = determineFieldJsonName;
|