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 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.${fieldName} ?? {}).reduce<${fieldType}>((acc, [key, value]) => {
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?.${fieldName}) ? [...object.${fieldName}] : [];
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.${fieldName} ?? []).map((e: any) => ${readSnippet('e')});
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.${fieldName} !== undefined && object.${fieldName} !== null) {`);
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.${fieldName}`)} }
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.${fieldName} !== undefined && object.${fieldName} !== null)
968
- ? ${readSnippet(`object.${fieldName}`)}
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.${fieldName} = {};
1066
+ obj.${jsonName} = {};
1065
1067
  if (message.${fieldName}) {
1066
1068
  Object.entries(message.${fieldName}).forEach(([k, v]) => {
1067
- obj.${fieldName}[k] = ${readSnippet('v')};
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.${fieldName} = message.${fieldName}.map(e => ${readSnippet('e')});
1078
+ obj.${jsonName} = message.${fieldName}.map(e => ${readSnippet('e')});
1077
1079
  } else {
1078
- obj.${fieldName} = [];
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.${fieldName} = ${v});`);
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.${fieldName} = ${v});`);
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;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-proto",
3
- "version": "1.89.0",
3
+ "version": "1.90.0",
4
4
  "description": "",
5
5
  "main": "build/plugin.js",
6
6
  "repository": "github:stephenh/ts-proto",