diff --git a/packages/protons/package.json b/packages/protons/package.json index af45049..539dcaf 100644 --- a/packages/protons/package.json +++ b/packages/protons/package.json @@ -137,7 +137,7 @@ }, "dependencies": { "meow": "^14.1.0", - "protobufjs-cli": "^2.6.1", + "protobufjs-cli": "^2.7.0", "protons-runtime": "^8.0.0" }, "devDependencies": { diff --git a/packages/protons/src/fields/array-field.ts b/packages/protons/src/fields/array-field.ts index 31051d4..41b709f 100644 --- a/packages/protons/src/fields/array-field.ts +++ b/packages/protons/src/fields/array-field.ts @@ -73,15 +73,20 @@ export class ArrayField extends Field { if (parent.def.edition === 'proto2') { this.packed = false - // check user overrides for field encoding + // check only old-school user overrides for field encoding if (usePackedEncoding(def.options, parent.def.options)) { this.packed = true } } else { - // the default from protobuf3 onwards + // the default from editions onwards this.packed = supportsPacked - // check user overrides for field encoding + // support older `packed` option in proto3 only + if (parent.def.edition === 'proto3' && def.options?.packed === false) { + this.packed = false + } + + // check only new-school user overrides for field encoding if (useExpandedEncoding(def.options, parent.def.options)) { this.packed = false } diff --git a/packages/protons/src/fields/field.ts b/packages/protons/src/fields/field.ts index fa8dfd2..9bd6d45 100644 --- a/packages/protons/src/fields/field.ts +++ b/packages/protons/src/fields/field.ts @@ -145,7 +145,7 @@ export class Field implements MessageField { console.info(`[WARN] ${message}`) } } - } else { + } else if (parent.def.edition != null && parent.def.edition !== 'proto3') { if (def.options?.packed != null) { const message = `field "${name}" has the packed=${def.options.packed} option, this is unsupported in edition="${parent.def.edition}". Please use features.repeated_field_encoding=${def.options?.packed === true ? 'PACKED' : 'EXPANDED'} instead - see https://protobuf.dev/editions/features/#repeated_field_encoding` diff --git a/packages/protons/src/types/enum.ts b/packages/protons/src/types/enum.ts index 7e2c2a9..a0eacf8 100644 --- a/packages/protons/src/types/enum.ts +++ b/packages/protons/src/types/enum.ts @@ -4,6 +4,7 @@ import type { Parent, Type, TypeCodec } from './index.ts' import type { Field } from '../fields/field.ts' export interface EnumDef { + edition: string values: Record } diff --git a/packages/protons/src/types/message.ts b/packages/protons/src/types/message.ts index c9e4e4c..6abc1fb 100644 --- a/packages/protons/src/types/message.ts +++ b/packages/protons/src/types/message.ts @@ -70,7 +70,7 @@ export class Message implements Type { const mapEntryType = `${this.pbType}$${fieldName}Entry` def.nested[mapEntryType] = { - edition: def.edition, + edition: def.edition || 'proto3', fields: { key: { type: fieldDef.keyType, diff --git a/packages/protons/src/types/module.ts b/packages/protons/src/types/module.ts index 23b16de..461ad43 100644 --- a/packages/protons/src/types/module.ts +++ b/packages/protons/src/types/module.ts @@ -106,6 +106,7 @@ export class Module { for (const [name, def] of Object.entries(defs)) { let type: Message | Enum + def.edition ??= 'proto3' if (isEnumDef(def)) { type = new Enum(name, {