ts-proto 1.156.6 → 1.156.8

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/build/main.js CHANGED
@@ -67,8 +67,10 @@ function generateFile(ctx, fileDesc) {
67
67
  });
68
68
  // If nestJs=true export [package]_PACKAGE_NAME and [service]_SERVICE_NAME const
69
69
  if (options.nestJs) {
70
- const prefix = (0, case_1.camelToSnake)(fileDesc.package.replace(/\./g, "_"));
71
- chunks.push((0, ts_poet_1.code) `export const ${prefix}_PACKAGE_NAME = '${fileDesc.package}';`);
70
+ if (options.exportCommonSymbols) {
71
+ const prefix = (0, case_1.camelToSnake)(fileDesc.package.replace(/\./g, "_"));
72
+ chunks.push((0, ts_poet_1.code) `export const ${prefix}_PACKAGE_NAME = '${fileDesc.package}';`);
73
+ }
72
74
  if (options.useDate === options_1.DateOption.DATE &&
73
75
  fileDesc.messageType.find((message) => message.field.find((field) => field.typeName === ".google.protobuf.Timestamp"))) {
74
76
  chunks.push(makeProtobufTimestampWrapper());
@@ -677,7 +679,7 @@ function generateBaseInstanceFactory(ctx, fullName, messageDesc, fullTypeName) {
677
679
  const val = (0, types_1.isWithinOneOf)(field)
678
680
  ? "undefined"
679
681
  : (0, types_1.isMapType)(ctx, messageDesc, field)
680
- ? ctx.options.useMapType
682
+ ? (0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field)
681
683
  ? "new Map()"
682
684
  : "{}"
683
685
  : (0, types_1.isRepeated)(field)
@@ -805,16 +807,22 @@ function generateDecode(ctx, fullName, messageDesc) {
805
807
  const initializerNecessary = !options.initializeFieldsAsUndefined && (0, types_1.isOptionalProperty)(field, messageDesc.options, options);
806
808
  if ((0, types_1.isRepeated)(field)) {
807
809
  const maybeNonNullAssertion = ctx.options.useOptionals === "all" ? "!" : "";
808
- if ((0, types_1.isMapType)(ctx, messageDesc, field)) {
810
+ const mapType = (0, types_1.detectMapType)(ctx, messageDesc, field);
811
+ if (mapType) {
809
812
  // We need a unique const within the `cast` statement
810
813
  const varName = `entry${field.number}`;
811
- const valueSetterSnippet = ctx.options.useMapType
812
- ? `message.${fieldName}${maybeNonNullAssertion}.set(${varName}.key, ${varName}.value)`
813
- : `message.${fieldName}${maybeNonNullAssertion}[${varName}.key] = ${varName}.value`;
814
+ const generateMapType = (0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field);
815
+ let valueSetterSnippet;
816
+ if (generateMapType) {
817
+ valueSetterSnippet = `message.${fieldName}${maybeNonNullAssertion}.set(${varName}.key, ${varName}.value)`;
818
+ }
819
+ else {
820
+ valueSetterSnippet = `message.${fieldName}${maybeNonNullAssertion}[${varName}.key] = ${varName}.value`;
821
+ }
814
822
  const initializerSnippet = initializerNecessary
815
823
  ? `
816
824
  if (message.${fieldName} === undefined) {
817
- message.${fieldName} = ${ctx.options.useMapType ? "new Map()" : "{}"};
825
+ message.${fieldName} = ${generateMapType ? "new Map()" : "{}"};
818
826
  }`
819
827
  : "";
820
828
  chunks.push((0, ts_poet_1.code) `
@@ -1008,8 +1016,9 @@ function generateEncode(ctx, fullName, messageDesc) {
1008
1016
  }
1009
1017
  `
1010
1018
  : writeSnippet(`{ ${maybeTypeField} key: key as any, value }`);
1011
- const optionalAlternative = isOptional ? (ctx.options.useMapType ? " || new Map()" : " || {}") : "";
1012
- if (ctx.options.useMapType) {
1019
+ const useMapType = (0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field);
1020
+ const optionalAlternative = isOptional ? (useMapType ? " || new Map()" : " || {}") : "";
1021
+ if (useMapType) {
1013
1022
  chunks.push((0, ts_poet_1.code) `
1014
1023
  (message.${fieldName}${optionalAlternative}).forEach((value, key) => {
1015
1024
  ${entryWriteSnippet}
@@ -1532,7 +1541,7 @@ function generateFromJson(ctx, fullName, fullTypeName, messageDesc) {
1532
1541
  if ((0, types_1.isMapType)(ctx, messageDesc, field)) {
1533
1542
  const fieldType = (0, types_1.toTypeName)(ctx, messageDesc, field);
1534
1543
  const i = convertFromObjectKey(ctx, messageDesc, field, "key");
1535
- if (ctx.options.useMapType) {
1544
+ if ((0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field)) {
1536
1545
  const fallback = noDefaultValue ? "undefined" : "new Map()";
1537
1546
  chunks.push((0, ts_poet_1.code) `
1538
1547
  ${fieldName}: ${ctx.utils.isObject}(${jsonProperty})
@@ -1733,7 +1742,7 @@ function generateToJson(ctx, fullName, fullProtobufTypeName, messageDesc) {
1733
1742
  if ((0, types_1.isMapType)(ctx, messageDesc, field)) {
1734
1743
  // Maps might need their values transformed, i.e. bytes --> base64
1735
1744
  const i = convertToObjectKey(ctx, messageDesc, field, "k");
1736
- if (ctx.options.useMapType) {
1745
+ if ((0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field)) {
1737
1746
  chunks.push((0, ts_poet_1.code) `
1738
1747
  if (message.${fieldName}?.size) {
1739
1748
  ${jsonProperty} = {};
@@ -1901,7 +1910,7 @@ function generateFromPartial(ctx, fullName, messageDesc) {
1901
1910
  const noValueSnippet = noDefaultValue
1902
1911
  ? `(object.${fieldName} === undefined || object.${fieldName} === null) ? undefined : `
1903
1912
  : "";
1904
- if (ctx.options.useMapType) {
1913
+ if ((0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field)) {
1905
1914
  chunks.push((0, ts_poet_1.code) `
1906
1915
  message.${fieldName} = ${noValueSnippet} (() => {
1907
1916
  const m = new Map();
@@ -1970,7 +1979,7 @@ function convertFromObjectKey(ctx, messageDesc, field, variableName) {
1970
1979
  if (keyType.toCodeString([]) === "string") {
1971
1980
  return (0, ts_poet_1.code) `${variableName}`;
1972
1981
  }
1973
- else if ((0, types_1.isLong)(keyField) && ctx.options.useMapType) {
1982
+ else if ((0, types_1.isLong)(keyField) && (0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field)) {
1974
1983
  if (ctx.options.forceLong === options_1.LongOption.LONG) {
1975
1984
  return (0, ts_poet_1.code) `${(0, case_1.capitalize)(keyType.toCodeString([]))}.fromValue(${variableName})`;
1976
1985
  }
@@ -1993,7 +2002,7 @@ function convertToObjectKey(ctx, messageDesc, field, variableName) {
1993
2002
  if (keyType.toCodeString([]) === "string") {
1994
2003
  return (0, ts_poet_1.code) `${variableName}`;
1995
2004
  }
1996
- else if ((0, types_1.isLong)(keyField) && ctx.options.useMapType) {
2005
+ else if ((0, types_1.isLong)(keyField) && (0, types_1.shouldGenerateJSMapType)(ctx, messageDesc, field)) {
1997
2006
  if (ctx.options.forceLong === options_1.LongOption.LONG) {
1998
2007
  return (0, ts_poet_1.code) `${ctx.utils.longToNumber}(${variableName})`;
1999
2008
  }
package/build/types.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.detectBatchMethod = exports.responsePromiseOrObservable = exports.responseObservable = exports.responsePromise = exports.responseType = exports.requestType = exports.observableType = exports.rawRequestType = exports.detectMapType = exports.toTypeName = exports.getEnumMethod = exports.messageToTypeName = exports.wrapperTypeName = exports.valueTypeName = exports.isEmptyType = exports.isLongValueType = exports.isStructTypeName = exports.isStructType = exports.isListValueTypeName = exports.isListValueType = exports.isFieldMaskTypeName = exports.isFieldMaskType = exports.isBytesValueType = exports.isAnyValueTypeName = exports.isAnyValueType = exports.isValueType = exports.isTimestamp = exports.isObjectId = exports.isMapType = exports.isWholeNumber = exports.isLong = exports.isRepeated = exports.isWithinOneOfThatShouldBeUnion = exports.isWithinOneOf = exports.isEnum = exports.isMessage = exports.isBytes = exports.isPrimitive = exports.isOptionalProperty = exports.isScalar = exports.createTypeMap = exports.notDefaultCheck = exports.defaultValue = exports.packedType = exports.toReaderCall = exports.basicTypeName = exports.basicLongWireType = exports.basicWireType = void 0;
3
+ exports.detectBatchMethod = exports.responsePromiseOrObservable = exports.responseObservable = exports.responsePromise = exports.responseType = exports.requestType = exports.observableType = exports.rawRequestType = exports.detectMapType = exports.shouldGenerateJSMapType = exports.toTypeName = exports.getEnumMethod = exports.messageToTypeName = exports.wrapperTypeName = exports.valueTypeName = exports.isEmptyType = exports.isLongValueType = exports.isStructTypeName = exports.isStructType = exports.isListValueTypeName = exports.isListValueType = exports.isFieldMaskTypeName = exports.isFieldMaskType = exports.isBytesValueType = exports.isAnyValueTypeName = exports.isAnyValueType = exports.isValueType = exports.isTimestamp = exports.isObjectId = exports.isMapType = exports.isWholeNumber = exports.isLong = exports.isRepeated = exports.isWithinOneOfThatShouldBeUnion = exports.isWithinOneOf = exports.isEnum = exports.isMessage = exports.isBytes = exports.isPrimitive = exports.isOptionalProperty = exports.isScalar = exports.createTypeMap = exports.notDefaultCheck = exports.defaultValue = exports.packedType = exports.toReaderCall = exports.basicTypeName = exports.basicLongWireType = exports.basicWireType = void 0;
4
4
  const ts_proto_descriptors_1 = require("ts-proto-descriptors");
5
5
  const ts_poet_1 = require("ts-poet");
6
6
  const options_1 = require("./options");
@@ -587,7 +587,7 @@ function toTypeName(ctx, messageDesc, field, ensureOptional = false) {
587
587
  const mapType = messageDesc ? detectMapType(ctx, messageDesc, field) : false;
588
588
  if (mapType) {
589
589
  const { keyType, valueType } = mapType;
590
- if (ctx.options.useMapType) {
590
+ if (shouldGenerateJSMapType(ctx, messageDesc, field)) {
591
591
  return finalize((0, ts_poet_1.code) `Map<${keyType}, ${valueType}>`, ensureOptional);
592
592
  }
593
593
  return finalize((0, ts_poet_1.code) `{ [key: ${keyType} ]: ${valueType} }`, ensureOptional);
@@ -622,6 +622,29 @@ function toTypeName(ctx, messageDesc, field, ensureOptional = false) {
622
622
  ensureOptional);
623
623
  }
624
624
  exports.toTypeName = toTypeName;
625
+ /**
626
+ * For a protobuf map field, if the generated code should use the javascript Map type.
627
+ *
628
+ * If the type of a protobuf map key corresponds to the Long type, we always use the Map type. This avoids generating
629
+ * invalid code such as below (using Long as key of a javascript object):
630
+ *
631
+ * export interface Foo {
632
+ * bar: { [key: Long]: Long }
633
+ * }
634
+ *
635
+ * See https://github.com/stephenh/ts-proto/issues/708 for more details.
636
+ */
637
+ function shouldGenerateJSMapType(ctx, message, field) {
638
+ if (ctx.options.useMapType) {
639
+ return true;
640
+ }
641
+ const mapType = detectMapType(ctx, message, field);
642
+ if (!mapType) {
643
+ return false;
644
+ }
645
+ return isLong(mapType.keyField) && ctx.options.forceLong === options_1.LongOption.LONG;
646
+ }
647
+ exports.shouldGenerateJSMapType = shouldGenerateJSMapType;
625
648
  function detectMapType(ctx, messageDesc, fieldDesc) {
626
649
  var _a;
627
650
  const { typeMap } = ctx;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ts-proto",
3
- "version": "1.156.6",
3
+ "version": "1.156.8",
4
4
  "description": "",
5
5
  "main": "build/plugin.js",
6
6
  "repository": "github:stephenh/ts-proto",
@@ -54,7 +54,7 @@
54
54
  "mongodb": "^5.7.0",
55
55
  "nice-grpc": "^2.1.4",
56
56
  "object-hash": "^3.0.0",
57
- "prettier": "^3.0.0",
57
+ "prettier": "^2.8.8",
58
58
  "protobufjs-cli": "^1.1.1",
59
59
  "reflect-metadata": "^0.1.13",
60
60
  "rxjs": "^7.8.1",