@bufbuild/protoc-gen-es
Advanced tools
Comparing version 2.0.0-alpha.4 to 2.0.0-beta.1
{ | ||
"name": "@bufbuild/protoc-gen-es", | ||
"version": "2.0.0-alpha.4", | ||
"version": "2.0.0-beta.1", | ||
"description": "Protocol Buffers code generator for ECMAScript", | ||
@@ -23,7 +23,7 @@ "license": "Apache-2.0", | ||
"dependencies": { | ||
"@bufbuild/protobuf": "^2.0.0-alpha.4", | ||
"@bufbuild/protoplugin": "2.0.0-alpha.4" | ||
"@bufbuild/protobuf": "^2.0.0-beta.1", | ||
"@bufbuild/protoplugin": "2.0.0-beta.1" | ||
}, | ||
"peerDependencies": { | ||
"@bufbuild/protobuf": "2.0.0-alpha.4" | ||
"@bufbuild/protobuf": "2.0.0-beta.1" | ||
}, | ||
@@ -30,0 +30,0 @@ "peerDependenciesMeta": { |
@@ -19,2 +19,3 @@ "use strict"; | ||
const codegenv1_1 = require("@bufbuild/protobuf/codegenv1"); | ||
const wkt_1 = require("@bufbuild/protobuf/wkt"); | ||
const protoplugin_1 = require("@bufbuild/protoplugin"); | ||
@@ -26,2 +27,3 @@ const util_1 = require("./util"); | ||
version: `v${String(package_json_1.version)}`, | ||
parseOptions, | ||
generateTs, | ||
@@ -31,2 +33,18 @@ generateJs, | ||
}); | ||
function parseOptions(options) { | ||
let jsonTypes = false; | ||
for (const { key, value } of options) { | ||
switch (key) { | ||
case "json_types": | ||
if (!["true", "1", "false", "0"].includes(value)) { | ||
throw "please provide true or false"; | ||
} | ||
jsonTypes = ["true", "1"].includes(value); | ||
break; | ||
default: | ||
throw new Error(); | ||
} | ||
} | ||
return { jsonTypes }; | ||
} | ||
// This annotation informs bundlers that the succeeding function call is free of | ||
@@ -43,3 +61,3 @@ // side effects. This means the symbol can be removed from the module during | ||
const { GenDescFile } = f.runtime.codegen; | ||
const fileDesc = f.importDesc(file); | ||
const fileDesc = f.importSchema(file); | ||
generateDescDoc(f, file); | ||
@@ -53,8 +71,17 @@ f.print(f.export("const", fileDesc.name), ": ", GenDescFile, " = ", pure); | ||
generateMessageShape(f, desc, "ts"); | ||
if (schema.options.jsonTypes) { | ||
generateMessageJsonShape(f, desc, "ts"); | ||
} | ||
generateDescDoc(f, desc); | ||
const name = f.importSchema(desc).name; | ||
const Shape = f.importShape(desc); | ||
const { GenDescMessage, messageDesc } = f.runtime.codegen; | ||
const MessageShape = f.importShape(desc); | ||
const name = f.importDesc(desc).name; | ||
generateDescDoc(f, desc); | ||
if (schema.options.jsonTypes) { | ||
const JsonType = f.importJson(desc); | ||
f.print(f.export("const", name), ": ", GenDescMessage, "<", Shape, ", ", JsonType, ">", " = ", pure); | ||
} | ||
else { | ||
f.print(f.export("const", name), ": ", GenDescMessage, "<", Shape, ">", " = ", pure); | ||
} | ||
const call = (0, util_1.functionCall)(messageDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
f.print(f.export("const", name), ": ", GenDescMessage, "<", MessageShape, ">", " = ", pure); | ||
f.print(" ", call, ";"); | ||
@@ -66,8 +93,17 @@ f.print(); | ||
generateEnumShape(f, desc); | ||
if (schema.options.jsonTypes) { | ||
generateEnumJsonShape(f, desc, "ts"); | ||
} | ||
generateDescDoc(f, desc); | ||
const name = f.importSchema(desc).name; | ||
const Shape = f.importShape(desc); | ||
const { GenDescEnum, enumDesc } = f.runtime.codegen; | ||
const EnumShape = f.importShape(desc); | ||
generateDescDoc(f, desc); | ||
const name = f.importDesc(desc).name; | ||
if (schema.options.jsonTypes) { | ||
const JsonType = f.importJson(desc); | ||
f.print(f.export("const", name), ": ", GenDescEnum, "<", Shape, ", ", JsonType, ">", " = ", pure); | ||
} | ||
else { | ||
f.print(f.export("const", name), ": ", GenDescEnum, "<", Shape, ">", " = ", pure); | ||
} | ||
const call = (0, util_1.functionCall)(enumDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
f.print(f.export("const", name), ": ", GenDescEnum, "<", EnumShape, ">", " = ", pure); | ||
f.print(" ", call, ";"); | ||
@@ -79,5 +115,5 @@ f.print(); | ||
const { GenDescExtension, extDesc } = f.runtime.codegen; | ||
const name = f.importDesc(desc).name; | ||
const name = f.importSchema(desc).name; | ||
const E = f.importShape(desc.extendee); | ||
const V = (0, util_1.fieldTypeScriptType)(desc).typing; | ||
const V = (0, util_1.fieldTypeScriptType)(desc, f.runtime).typing; | ||
const call = (0, util_1.functionCall)(extDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
@@ -92,3 +128,3 @@ f.print(f.jsDoc(desc)); | ||
const { GenDescService, serviceDesc } = f.runtime.codegen; | ||
const name = f.importDesc(desc).name; | ||
const name = f.importSchema(desc).name; | ||
const call = (0, util_1.functionCall)(serviceDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
@@ -110,3 +146,3 @@ f.print(f.jsDoc(desc)); | ||
f.preamble(file); | ||
const fileDesc = f.importDesc(file); | ||
const fileDesc = f.importSchema(file); | ||
generateDescDoc(f, file); | ||
@@ -119,5 +155,5 @@ f.print(f.export("const", fileDesc.name), " = ", pure); | ||
case "message": { | ||
const name = f.importSchema(desc).name; | ||
generateDescDoc(f, desc); | ||
const { messageDesc } = f.runtime.codegen; | ||
const name = f.importDesc(desc).name; | ||
generateDescDoc(f, desc); | ||
const call = (0, util_1.functionCall)(messageDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
@@ -132,7 +168,7 @@ f.print(f.export("const", name), " = ", pure); | ||
{ | ||
generateDescDoc(f, desc); | ||
const name = f.importSchema(desc).name; | ||
f.print(f.export("const", name), " = ", pure); | ||
const { enumDesc } = f.runtime.codegen; | ||
generateDescDoc(f, desc); | ||
const name = f.importDesc(desc).name; | ||
const call = (0, util_1.functionCall)(enumDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
f.print(f.export("const", name), " = ", pure); | ||
f.print(" ", call, ";"); | ||
@@ -144,5 +180,5 @@ f.print(); | ||
f.print(f.jsDoc(desc)); | ||
f.print(f.export("const", f.importShape(desc).name), " = ", pure); | ||
const { tsEnum } = f.runtime.codegen; | ||
const call = (0, util_1.functionCall)(tsEnum, [f.importDesc(desc)]); | ||
f.print(f.export("const", f.importShape(desc).name), " = ", pure); | ||
const call = (0, util_1.functionCall)(tsEnum, [f.importSchema(desc)]); | ||
f.print(" ", call, ";"); | ||
@@ -154,7 +190,7 @@ f.print(); | ||
case "extension": { | ||
f.print(f.jsDoc(desc)); | ||
const name = f.importSchema(desc).name; | ||
f.print(f.export("const", name), " = ", pure); | ||
const { extDesc } = f.runtime.codegen; | ||
const name = f.importDesc(desc).name; | ||
const call = (0, util_1.functionCall)(extDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
f.print(f.jsDoc(desc)); | ||
f.print(f.export("const", name), " = ", pure); | ||
f.print(" ", call, ";"); | ||
@@ -165,7 +201,7 @@ f.print(); | ||
case "service": { | ||
f.print(f.jsDoc(desc)); | ||
const name = f.importSchema(desc).name; | ||
f.print(f.export("const", name), " = ", pure); | ||
const { serviceDesc } = f.runtime.codegen; | ||
const name = f.importDesc(desc).name; | ||
f.print(f.jsDoc(desc)); | ||
const call = (0, util_1.functionCall)(serviceDesc, [fileDesc, ...(0, codegenv1_1.pathInFileDesc)(desc)]); | ||
f.print(f.export("const", name), " = ", pure); | ||
f.print(" ", call, ";"); | ||
@@ -185,3 +221,3 @@ f.print(); | ||
const { GenDescFile } = f.runtime.codegen; | ||
const fileDesc = f.importDesc(file); | ||
const fileDesc = f.importSchema(file); | ||
generateDescDoc(f, file); | ||
@@ -194,7 +230,16 @@ f.print(f.export("declare const", fileDesc.name), ": ", GenDescFile, ";"); | ||
generateMessageShape(f, desc, "dts"); | ||
if (schema.options.jsonTypes) { | ||
generateMessageJsonShape(f, desc, "dts"); | ||
} | ||
const name = f.importSchema(desc).name; | ||
const Shape = f.importShape(desc); | ||
const { GenDescMessage } = f.runtime.codegen; | ||
const MessageShape = f.importShape(desc); | ||
const name = f.importDesc(desc).name; | ||
generateDescDoc(f, desc); | ||
f.print(f.export("declare const", name), ": ", GenDescMessage, "<", MessageShape, ">", ";"); | ||
if (schema.options.jsonTypes) { | ||
const JsonType = f.importJson(desc); | ||
f.print(f.export("declare const", name), ": ", GenDescMessage, "<", Shape, ", ", JsonType, ">", ";"); | ||
} | ||
else { | ||
f.print(f.export("declare const", name), ": ", GenDescMessage, "<", Shape, ">", ";"); | ||
} | ||
f.print(); | ||
@@ -205,7 +250,16 @@ break; | ||
generateEnumShape(f, desc); | ||
if (schema.options.jsonTypes) { | ||
generateEnumJsonShape(f, desc, "dts"); | ||
} | ||
generateDescDoc(f, desc); | ||
const name = f.importSchema(desc).name; | ||
const Shape = f.importShape(desc); | ||
const { GenDescEnum } = f.runtime.codegen; | ||
const EnumShape = f.importShape(desc); | ||
generateDescDoc(f, desc); | ||
const name = f.importDesc(desc).name; | ||
f.print(f.export("declare const", name), ": ", GenDescEnum, "<", EnumShape, ">;"); | ||
if (schema.options.jsonTypes) { | ||
const JsonType = f.importJson(desc); | ||
f.print(f.export("declare const", name), ": ", GenDescEnum, "<", Shape, ", ", JsonType, ">;"); | ||
} | ||
else { | ||
f.print(f.export("declare const", name), ": ", GenDescEnum, "<", Shape, ">;"); | ||
} | ||
f.print(); | ||
@@ -216,5 +270,5 @@ break; | ||
const { GenDescExtension } = f.runtime.codegen; | ||
const name = f.importDesc(desc).name; | ||
const name = f.importSchema(desc).name; | ||
const E = f.importShape(desc.extendee); | ||
const V = (0, util_1.fieldTypeScriptType)(desc).typing; | ||
const V = (0, util_1.fieldTypeScriptType)(desc, f.runtime).typing; | ||
f.print(f.jsDoc(desc)); | ||
@@ -227,3 +281,3 @@ f.print(f.export("declare const", name), ": ", GenDescExtension, "<", E, ", ", V, ">;"); | ||
const { GenDescService } = f.runtime.codegen; | ||
const name = f.importDesc(desc).name; | ||
const name = f.importSchema(desc).name; | ||
f.print(f.jsDoc(desc)); | ||
@@ -247,3 +301,3 @@ f.print(f.export("declare const", name), ": ", GenDescService, "<", getServiceShapeExpr(f, desc), ">;"); | ||
`Describes the ${desc.toString()}.`, | ||
`Use \`create(${f.importDesc(desc).name})\` to create a new message.`, | ||
`Use \`create(${f.importSchema(desc).name})\` to create a new message.`, | ||
]; | ||
@@ -301,4 +355,4 @@ break; | ||
print(" methodKind: ", f.string(method.methodKind), ";"); | ||
print(" input: typeof ", f.importDesc(method.input, true), ";"); | ||
print(" output: typeof ", f.importDesc(method.output, true), ";"); | ||
print(" input: typeof ", f.importSchema(method.input, true), ";"); | ||
print(" output: typeof ", f.importSchema(method.output, true), ";"); | ||
print(" },"); | ||
@@ -324,2 +378,21 @@ } | ||
// prettier-ignore | ||
function generateEnumJsonShape(f, enumeration, target) { | ||
f.print(f.jsDoc(`JSON type for the ${enumeration.toString()}.`)); | ||
const declaration = target == "ts" ? "type" : "declare type"; | ||
const values = []; | ||
if (enumeration.typeName == "google.protobuf.NullValue") { | ||
values.push("null"); | ||
} | ||
else { | ||
for (const v of enumeration.values) { | ||
if (enumeration.values.indexOf(v) > 0) { | ||
values.push(" | "); | ||
} | ||
values.push(f.string(v.name)); | ||
} | ||
} | ||
f.print(f.export(declaration, f.importJson(enumeration).name), " = ", values, ";"); | ||
f.print(); | ||
} | ||
// prettier-ignore | ||
function generateMessageShape(f, message, target) { | ||
@@ -340,3 +413,3 @@ const { Message } = f.runtime; | ||
f.print(f.jsDoc(field, " ")); | ||
const { typing } = (0, util_1.fieldTypeScriptType)(field); | ||
const { typing } = (0, util_1.fieldTypeScriptType)(field, f.runtime); | ||
f.print(` value: `, typing, `;`); | ||
@@ -349,3 +422,3 @@ f.print(` case: "`, field.localName, `";`); | ||
f.print(f.jsDoc(member, " ")); | ||
const { typing, optional } = (0, util_1.fieldTypeScriptType)(member); | ||
const { typing, optional } = (0, util_1.fieldTypeScriptType)(member, f.runtime); | ||
if (optional) { | ||
@@ -367,1 +440,61 @@ f.print(" ", member.localName, "?: ", typing, ";"); | ||
} | ||
// prettier-ignore | ||
function generateMessageJsonShape(f, message, target) { | ||
const exp = f.export(target == "ts" ? "type" : "declare type", f.importJson(message).name); | ||
f.print(f.jsDoc(`JSON type for the ${message.toString()}.`)); | ||
switch (message.typeName) { | ||
case "google.protobuf.Any": | ||
f.print(exp, " = {"); | ||
f.print(` "@type"?: string`); | ||
f.print("};"); | ||
break; | ||
case "google.protobuf.Timestamp": | ||
f.print(exp, " = string;"); | ||
break; | ||
case "google.protobuf.Duration": | ||
f.print(exp, " = string;"); | ||
break; | ||
case "google.protobuf.FieldMask": | ||
f.print(exp, " = string;"); | ||
break; | ||
case "google.protobuf.Struct": | ||
f.print(exp, " = ", f.runtime.JsonObject, ";"); | ||
break; | ||
case "google.protobuf.Value": | ||
f.print(exp, " = ", f.runtime.JsonValue, ";"); | ||
break; | ||
case "google.protobuf.ListValue": | ||
f.print(exp, " = ", f.runtime.JsonValue, "[];"); | ||
break; | ||
case "google.protobuf.Empty": | ||
f.print(exp, " = Record<string, never>;"); | ||
break; | ||
default: | ||
if ((0, wkt_1.isWrapperDesc)(message)) { | ||
f.print(exp, " = ", (0, util_1.fieldJsonType)(message.fields[0]), ";"); | ||
} | ||
else { | ||
f.print(exp, " = {"); | ||
for (const field of message.fields) { | ||
switch (field.kind) { | ||
default: | ||
f.print(f.jsDoc(`@generated from field: ${(0, protoplugin_1.getDeclarationString)(field)};`, " ")); | ||
// eslint-disable-next-line no-case-declarations | ||
let jsonName = field.jsonName; | ||
if (jsonName === "" | ||
|| /^[0-9]/.test(jsonName) | ||
|| jsonName.indexOf("@") > -1) { | ||
jsonName = f.string(jsonName); | ||
} | ||
f.print(" ", jsonName, "?: ", (0, util_1.fieldJsonType)(field), ";"); | ||
break; | ||
} | ||
if (message.fields.indexOf(field) < message.fields.length - 1) { | ||
f.print(); | ||
} | ||
} | ||
f.print("};"); | ||
} | ||
} | ||
f.print(); | ||
} |
@@ -16,7 +16,7 @@ "use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.arrayLiteral = exports.functionCall = exports.fieldTypeScriptType = void 0; | ||
exports.arrayLiteral = exports.functionCall = exports.fieldJsonType = exports.fieldTypeScriptType = void 0; | ||
const protobuf_1 = require("@bufbuild/protobuf"); | ||
const codegenv1_1 = require("@bufbuild/protobuf/codegenv1"); | ||
const wkt_1 = require("@bufbuild/protobuf/wkt"); | ||
function fieldTypeScriptType(field) { | ||
function fieldTypeScriptType(field, imports) { | ||
const typing = []; | ||
@@ -30,12 +30,3 @@ let optional = false; | ||
case "message": { | ||
if (!field.oneof && (0, wkt_1.isWrapperDesc)(field.message)) { | ||
const baseType = field.message.fields[0].scalar; | ||
typing.push((0, codegenv1_1.scalarTypeScriptType)(baseType, false)); | ||
} | ||
else { | ||
typing.push({ | ||
kind: "es_shape_ref", | ||
desc: field.message, | ||
}); | ||
} | ||
typing.push(messageFieldTypeScriptType(field, imports)); | ||
optional = true; | ||
@@ -64,6 +55,3 @@ break; | ||
case "message": { | ||
typing.push({ | ||
kind: "es_shape_ref", | ||
desc: field.message, | ||
}, "[]"); | ||
typing.push(messageFieldTypeScriptType(field, imports), "[]"); | ||
break; | ||
@@ -93,6 +81,3 @@ } | ||
case "message": | ||
valueType = { | ||
kind: "es_shape_ref", | ||
desc: field.message, | ||
}; | ||
valueType = messageFieldTypeScriptType(field, imports); | ||
break; | ||
@@ -114,2 +99,97 @@ case "enum": | ||
exports.fieldTypeScriptType = fieldTypeScriptType; | ||
function messageFieldTypeScriptType(field, imports) { | ||
var _a; | ||
if ((0, wkt_1.isWrapperDesc)(field.message) && | ||
!field.oneof && | ||
field.fieldKind == "message") { | ||
const baseType = field.message.fields[0].scalar; | ||
return (0, codegenv1_1.scalarTypeScriptType)(baseType, false); | ||
} | ||
if (field.message.typeName == wkt_1.StructSchema.typeName && | ||
((_a = field.parent) === null || _a === void 0 ? void 0 : _a.typeName) != wkt_1.ValueSchema.typeName) { | ||
return imports.JsonObject; | ||
} | ||
return { | ||
kind: "es_shape_ref", | ||
desc: field.message, | ||
}; | ||
} | ||
function fieldJsonType(field) { | ||
switch (field.fieldKind) { | ||
case "scalar": | ||
return (0, codegenv1_1.scalarJsonType)(field.scalar); | ||
case "message": | ||
return { | ||
kind: "es_json_type_ref", | ||
desc: field.message, | ||
}; | ||
case "enum": | ||
return { | ||
kind: "es_json_type_ref", | ||
desc: field.enum, | ||
}; | ||
case "list": | ||
switch (field.listKind) { | ||
case "enum": | ||
return [ | ||
{ | ||
kind: "es_json_type_ref", | ||
desc: field.enum, | ||
}, | ||
"[]", | ||
]; | ||
case "scalar": { | ||
const t = (0, codegenv1_1.scalarJsonType)(field.scalar); | ||
if (t.includes("|")) { | ||
return ["(", t, ")[]"]; | ||
} | ||
return [t, "[]"]; | ||
} | ||
case "message": | ||
return [ | ||
{ | ||
kind: "es_json_type_ref", | ||
desc: field.message, | ||
}, | ||
"[]", | ||
]; | ||
} | ||
break; | ||
case "map": { | ||
let keyType; | ||
switch (field.mapKey) { | ||
case protobuf_1.ScalarType.INT32: | ||
case protobuf_1.ScalarType.FIXED32: | ||
case protobuf_1.ScalarType.UINT32: | ||
case protobuf_1.ScalarType.SFIXED32: | ||
case protobuf_1.ScalarType.SINT32: | ||
keyType = "number"; | ||
break; | ||
default: | ||
keyType = "string"; | ||
break; | ||
} | ||
let valueType; | ||
switch (field.mapKind) { | ||
case "scalar": | ||
valueType = (0, codegenv1_1.scalarJsonType)(field.scalar); | ||
break; | ||
case "message": | ||
valueType = { | ||
kind: "es_json_type_ref", | ||
desc: field.message, | ||
}; | ||
break; | ||
case "enum": | ||
valueType = { | ||
kind: "es_json_type_ref", | ||
desc: field.enum, | ||
}; | ||
break; | ||
} | ||
return ["{ [key: ", keyType, "]: ", valueType, " }"]; | ||
} | ||
} | ||
} | ||
exports.fieldJsonType = fieldJsonType; | ||
function functionCall(fn, args, typeParams) { | ||
@@ -116,0 +196,0 @@ let tp = []; |
{ | ||
"name": "@bufbuild/protoc-gen-es", | ||
"version": "2.0.0-alpha.4", | ||
"version": "2.0.0-beta.1", | ||
"description": "Protocol Buffers code generator for ECMAScript", | ||
@@ -23,7 +23,7 @@ "license": "Apache-2.0", | ||
"dependencies": { | ||
"@bufbuild/protobuf": "^2.0.0-alpha.4", | ||
"@bufbuild/protoplugin": "2.0.0-alpha.4" | ||
"@bufbuild/protobuf": "^2.0.0-beta.1", | ||
"@bufbuild/protoplugin": "2.0.0-beta.1" | ||
}, | ||
"peerDependencies": { | ||
"@bufbuild/protobuf": "2.0.0-alpha.4" | ||
"@bufbuild/protobuf": "2.0.0-beta.1" | ||
}, | ||
@@ -30,0 +30,0 @@ "peerDependenciesMeta": { |
@@ -138,1 +138,6 @@ # @bufbuild/protoc-gen-es | ||
the top of each file to skip type checks: `// @ts-nocheck`. | ||
### `json_types=true` | ||
Generates JSON types for every Protobuf message and enumeration. Calling `toJson()` | ||
will automatically return the JSON type if available. |
35240
686
143
+ Added@bufbuild/protobuf@2.0.0-beta.1(transitive)
+ Added@bufbuild/protoplugin@2.0.0-beta.1(transitive)
+ Addedtypescript@5.4.5(transitive)
- Removed@bufbuild/protobuf@2.0.0-alpha.4(transitive)
- Removed@bufbuild/protoplugin@2.0.0-alpha.4(transitive)
- Removedtypescript@4.5.2(transitive)