@ngx-grpc/protoc-gen-ng
Advanced tools
Comparing version 0.1.1 to 0.2.0
@@ -26,4 +26,4 @@ #!/usr/bin/env node | ||
var config_1 = require("./config"); | ||
var logger_1 = require("./logger"); | ||
var proto_1 = require("./proto/proto"); | ||
var utils_1 = require("./utils"); | ||
function main() { | ||
@@ -37,7 +37,23 @@ protoc_plugin_1.default(function (protosProtocPlugin) { | ||
} | ||
protos.forEach(function (p) { | ||
p.resolved.dependencies = p.dependencyList.map(function (d) { return protos.find(function (pp) { return pp.name === d; }); }); | ||
p.resolved.publicDependencies = p.publicDependencyList.map(function (i) { return p.resolved.dependencies[i]; }); | ||
}); | ||
// TODO add cascade public import. Currently works with one-level only | ||
protos | ||
.filter(function (p) { return p.resolved.publicDependencies.length; }) | ||
.forEach(function (protoWithPublicImport) { | ||
return protos | ||
.filter(function (pp) { return pp.resolved.dependencies.includes(protoWithPublicImport); }) | ||
.forEach(function (protoImportingProtoWithPublicImport) { | ||
var _a; | ||
logger_1.Logger.debug(protoImportingProtoWithPublicImport.name + " reimports " + protoWithPublicImport.resolved.publicDependencies.map(function (p) { return p.name; }).join(', ') + " via " + protoWithPublicImport.name); | ||
(_a = protoImportingProtoWithPublicImport.resolved.dependencies).push.apply(_a, protoWithPublicImport.resolved.publicDependencies); | ||
}); | ||
}); | ||
return protos.map(function (proto) { | ||
var types = __spreadArrays(proto.enumTypeList, proto.messageTypeList, proto.serviceList); | ||
var generated = "// THIS IS A GENERATED FILE\n // DO NOT MODIFY IT! YOUR CHANGES WILL BE LOST\n\n/*\n To configure the services you need to provider a configuration for each of them.\n\n E.g. you can create a module where you configure all of them and then import this module into your AppModule:\n\n const grpcSettings = { host: environment.grpcHost };\n\n @NgModule({\n providers: [\n" + proto.serviceList.map(function (s) { return " { provide: " + s.getConfigInjectionTokenName() + ", useValue: grpcSettings },"; }).sort().join('\n') + "\n ],\n })\n export class GrpcConfigModule { }\n*/\n\n /* tslint:disable */\n /* eslint-disable */\n import { Inject, Injectable, InjectionToken } from '@angular/core';\n import { GrpcCallType, GrpcClient, GrpcClientSettings, GrpcHandler } from '@ngx-grpc/core';\n import { BinaryReader, BinaryWriter, ByteSource } from 'google-protobuf';\n import { AbstractClientBase, Error, GrpcWebClientBase, Metadata, Status } from 'grpc-web';\n import { Observable } from 'rxjs';\n\n " + types.map(function (t) { return t.toString(); }).join('\n\n') + "\n"; | ||
var generated = "// THIS IS A GENERATED FILE\n // DO NOT MODIFY IT! YOUR CHANGES WILL BE LOST\n\n/*\n To configure the services you need to provider a configuration for each of them.\n\n E.g. you can create a module where you configure all of them and then import this module into your AppModule:\n\n const grpcSettings = { host: environment.grpcHost };\n\n @NgModule({\n providers: [\n" + proto.serviceList.map(function (s) { return " { provide: " + s.getConfigInjectionTokenName() + ", useValue: grpcSettings },"; }).sort().join('\n') + "\n ],\n })\n export class GrpcConfigModule { }\n*/\n\n /* tslint:disable */\n /* eslint-disable */\n import { Inject, Injectable, InjectionToken } from '@angular/core';\n import { GrpcCallType, GrpcClient, GrpcClientSettings, GrpcHandler } from '@ngx-grpc/core';\n import { BinaryReader, BinaryWriter, ByteSource } from 'google-protobuf';\n import { AbstractClientBase, Error, GrpcWebClientBase, Metadata, Status } from 'grpc-web';\n import { Observable } from 'rxjs';\n " + proto.getImportedDependencies() + "\n\n " + types.map(function (t) { return t.toString(); }).join('\n\n') + "\n"; | ||
return { | ||
name: utils_1.dasherize(proto.getFlatName()) + ".pb.ts", | ||
name: proto.getGeneratedFileBaseName() + '.ts', | ||
content: prettier.format(generated, { parser: 'typescript', singleQuote: true }), | ||
@@ -44,0 +60,0 @@ }; |
@@ -75,4 +75,4 @@ "use strict"; | ||
if (field.type === types_1.MessageFieldType.message) { | ||
var msg = this.proto.findMessage(field.typeName); | ||
if (msg.options.mapEntry) { | ||
var msg = this.proto.resolveTypeMetadata(field.typeName).message; | ||
if (msg && msg.options.mapEntry) { | ||
return true; | ||
@@ -84,3 +84,3 @@ } | ||
Message.prototype.getMapKeyValueFields = function (field) { | ||
var msg = this.proto.findMessage(field.typeName); | ||
var msg = this.proto.resolveTypeMetadata(field.typeName).message; | ||
var key = msg.fieldList.find(function (f) { return f.name === 'key'; }); | ||
@@ -103,3 +103,3 @@ var value = msg.fieldList.find(function (f) { return f.name === 'value'; }); | ||
if (field.type === types_1.MessageFieldType.enum || field.type === types_1.MessageFieldType.message) { | ||
return utils_1.extractType(field.typeName, _this.proto.pb_package) + suffix; | ||
return _this.proto.getRelativeTypeName(field.typeName) + suffix; | ||
} | ||
@@ -113,3 +113,3 @@ return FieldTypesConfig[field.type].type + suffix; | ||
if (field.type === types_1.MessageFieldType.message) { | ||
var subType = utils_1.extractType(field.typeName, _this.proto.pb_package); | ||
var subType = _this.proto.getRelativeTypeName(field.typeName); | ||
if (_this.isFieldMap(field)) { | ||
@@ -131,3 +131,3 @@ var key = _this.getMapKeyValueFields(field)[0]; | ||
if (field.type === types_1.MessageFieldType.message) { | ||
var subType = utils_1.extractType(field.typeName, _this.proto.pb_package); | ||
var subType = _this.proto.getRelativeTypeName(field.typeName); | ||
if (_this.isFieldMap(field)) { | ||
@@ -134,0 +134,0 @@ var msgVarName = "msg_" + field.number; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
var path_1 = require("path"); | ||
var logger_1 = require("../logger"); | ||
var utils_1 = require("../utils"); | ||
@@ -11,5 +11,7 @@ var enum_1 = require("./enum"); | ||
var _this = this; | ||
this.resolved = {}; | ||
this.messageIndex = new Map(); | ||
this.name = value.name; | ||
this.pb_package = value.pb_package; // eslint-disable-line @typescript-eslint/camelcase | ||
this.dependencyList = value.dependencyList; | ||
this.dependencyList = value.dependencyList || []; | ||
this.publicDependencyList = value.publicDependencyList; | ||
@@ -21,34 +23,67 @@ this.weakDependencyList = value.weakDependencyList; | ||
this.extensionList = value.extensionList; | ||
this.index(); | ||
} | ||
Proto.prototype.findMessage = function (typeName) { | ||
var path = utils_1.extractType(typeName, this.pb_package).split('.'); | ||
var array = this.messageTypeList; | ||
var msg; | ||
var i = 0; | ||
var _loop_1 = function () { | ||
var name = path.shift(); | ||
if (!name || !array.length) { | ||
throw new Error('Error finding ' + typeName); | ||
} | ||
msg = array.find(function (mt) { return mt.name === name; }); | ||
if (!msg) { | ||
throw new Error('Error finding ' + typeName); | ||
} | ||
array = msg.nestedTypeList; | ||
if (!path.length) { | ||
return { value: msg }; | ||
} | ||
i++; | ||
Proto.prototype.index = function () { | ||
var _this = this; | ||
var indexEnums = function (path, enums) { | ||
enums.forEach(function (oneEnum) { | ||
_this.messageIndex.set(path + '.' + oneEnum.name, { proto: _this, enum: oneEnum }); | ||
}); | ||
}; | ||
while (i < 100) { | ||
var state_1 = _loop_1(); | ||
if (typeof state_1 === "object") | ||
return state_1.value; | ||
var indexMessages = function (path, submessages) { | ||
submessages.forEach(function (message) { | ||
var fullname = path + '.' + message.name; | ||
_this.messageIndex.set(fullname, { | ||
proto: _this, | ||
message: message, | ||
}); | ||
indexMessages(fullname, message.nestedTypeList); | ||
indexEnums(fullname, message.enumTypeList); | ||
}); | ||
}; | ||
indexMessages(this.pb_package ? '.' + this.pb_package : '', this.messageTypeList); | ||
indexEnums(this.pb_package ? '.' + this.pb_package : '', this.enumTypeList); | ||
}; | ||
Proto.prototype.resolveTypeMetadata = function (pbType) { | ||
var meta = this.messageIndex.get(pbType); | ||
if (meta) { | ||
return meta; | ||
} | ||
meta = undefined; | ||
this.resolved.dependencies.forEach(function (proto) { | ||
if (!meta) { | ||
try { | ||
meta = proto.resolveTypeMetadata(pbType); | ||
} | ||
catch (ex) { | ||
} | ||
} | ||
}); | ||
if (meta) { | ||
return meta; | ||
} | ||
logger_1.Logger.debug("Cannot find type " + pbType + " in proto " + this.name); | ||
throw new Error('Error finding ' + pbType); | ||
}; | ||
Proto.prototype.getFlatName = function () { | ||
return path_1.basename(this.name).replace(/\.proto$/, ''); | ||
Proto.prototype.getDependencyPackageName = function (proto) { | ||
return proto.pb_package ? proto.pb_package.replace(/\.([a-z])/g, function (v) { return v.toUpperCase(); }).replace(/\./g, '') : ('noPackage' + this.resolved.dependencies.indexOf(proto)); | ||
}; | ||
Proto.prototype.getRelativeTypeName = function (pbType) { | ||
var meta = this.resolveTypeMetadata(pbType); | ||
var _a = pbType.match(/^\.(([a-z0-9.]*)\.)?([A-Za-z0-9.]+$)/), typeName = _a[3]; | ||
if (meta.proto === this) { | ||
return typeName; | ||
} | ||
return this.getDependencyPackageName(meta.proto) + '.' + typeName; | ||
}; | ||
Proto.prototype.getImportedDependencies = function () { | ||
var _this = this; | ||
var root = Array(this.name.split('/').length - 1).fill('..').join('/'); | ||
return this.resolved.dependencies.map(function (pp) { return "import * as " + _this.getDependencyPackageName(pp) + " from '" + (root || '.') + "/" + pp.getGeneratedFileBaseName() + "';"; }).join('\n'); | ||
}; | ||
Proto.prototype.getGeneratedFileBaseName = function () { | ||
return utils_1.dasherize(this.name.replace(/\.proto$/, '')) + ".pb"; | ||
}; | ||
return Proto; | ||
}()); | ||
exports.Proto = Proto; |
@@ -33,4 +33,4 @@ "use strict"; | ||
var methods = this.methodList.map(function (method) { | ||
var inputType = utils_1.extractType(method.inputType, _this.proto.pb_package); | ||
var outputType = utils_1.extractType(method.outputType, _this.proto.pb_package); | ||
var inputType = _this.proto.getRelativeTypeName(method.inputType); | ||
var outputType = _this.proto.getRelativeTypeName(method.outputType); | ||
var jsdoc = new js_doc_1.JSDoc(); | ||
@@ -42,3 +42,3 @@ jsdoc.setDescription((method.serverStreaming ? 'Server streaming' : 'Unary') + " RPC"); | ||
jsdoc.setDeprecation(!!method.options && method.options.deprecated); | ||
return "\n " + jsdoc.toString() + "\n " + processName(method.name) + "(requestData: " + inputType + ", requestMetadata: Metadata = {}) {\n return this.handler.handle({\n type: GrpcCallType." + (method.serverStreaming ? 'serverStream' : 'unary') + ",\n client: this.client,\n path: '/" + serviceUrlPrefix + _this.name + "/" + utils_1.camelize(method.name) + "',\n requestData,\n requestMetadata,\n requestClass: " + inputType + ",\n responseClass: " + outputType + ",\n }) as Observable<" + outputType + (method.serverStreaming ? " | Status" : '') + ">;\n }\n "; | ||
return "\n " + jsdoc.toString() + "\n " + processName(method.name) + "(requestData: " + inputType + ", requestMetadata: Metadata = {}) {\n return this.handler.handle({\n type: GrpcCallType." + (method.serverStreaming ? 'serverStream' : 'unary') + ",\n client: this.client,\n path: '/" + serviceUrlPrefix + _this.name + "/" + utils_1.camelize(method.name) + "',\n requestData,\n requestMetadata,\n requestClass: " + inputType + ",\n responseClass: " + outputType + ",\n }) as Observable<" + outputType + (method.serverStreaming ? ' | Status' : '') + ">;\n }\n "; | ||
}); | ||
@@ -45,0 +45,0 @@ var tokenName = this.getConfigInjectionTokenName(); |
@@ -45,11 +45,1 @@ "use strict"; | ||
exports.pascalize = pascalize; | ||
function extractType(originalType, packageName) { | ||
var packageRef = '.' + packageName + '.'; | ||
var type = originalType.replace(new RegExp('^' + packageRef.replace(/\./g, '\\.')), ''); | ||
// a deeper package reference is here | ||
if (type[0].toLowerCase() === type[0]) { | ||
return originalType.replace(/^\./, ''); // still replace "dot" in the beginning | ||
} | ||
return type; // type without package prefix | ||
} | ||
exports.extractType = extractType; |
{ | ||
"name": "@ngx-grpc/protoc-gen-ng", | ||
"version": "0.1.1", | ||
"version": "0.2.0", | ||
"author": "smnbbrv", | ||
@@ -24,8 +24,8 @@ "license": "MIT", | ||
"lint": "eslint src/**/*.ts", | ||
"test": "jest --watch", | ||
"test:ci": "jest", | ||
"test:generate": "rimraf ./test/out/* && protoc --plugin=protoc-gen-ng=$(pwd)/dist/main.js --ng_out=./test/out -I $(pwd)/test/proto $(pwd)/test/proto/*", | ||
"test:generate-grpc-web": "rimraf ./test/out-grpc-web/* && protoc -I=$(pwd)/test/proto $(pwd)/test/proto/* --js_out=import_style=commonjs:$(pwd)/test/out-grpc-web --grpc-web_out=import_style=typescript,mode=grpcwebtext:$(pwd)/test/out-grpc-web", | ||
"test": "jest", | ||
"test:watch": "jest --watch", | ||
"test:coverage": "jest --coverage", | ||
"preversion": "npm run build && npm run test:generate && npm run test:ci" | ||
"test:generate": "rimraf ./test/out/* && protoc --plugin=protoc-gen-ng=$(pwd)/dist/main.js --ng_out=./test/out -I test/proto $(find test/proto -iname \"*.proto\")", | ||
"test:generate-grpc-web": "rimraf ./test/out-grpc-web/* --js_out=import_style=commonjs:$(pwd)/test/out-grpc-web --grpc-web_out=import_style=typescript,mode=grpcwebtext:$(pwd)/test/out-grpc-web && protoc -I=test/proto $(find test/proto -iname \"*.proto\")", | ||
"release": "semantic-release" | ||
}, | ||
@@ -35,2 +35,7 @@ "devDependencies": { | ||
"@ngx-grpc/core": "0.0.1", | ||
"@semantic-release/changelog": "^3.0.5", | ||
"@semantic-release/commit-analyzer": "^6.3.3", | ||
"@semantic-release/git": "^7.0.18", | ||
"@semantic-release/npm": "^5.3.4", | ||
"@semantic-release/release-notes-generator": "^7.3.3", | ||
"@types/google-protobuf": "^3.7.2", | ||
@@ -52,2 +57,3 @@ "@types/jasmine": "^3.4.6", | ||
"rxjs": "^6.5.3", | ||
"semantic-release": "^15.13.31", | ||
"ts-jest": "^24.1.0", | ||
@@ -58,4 +64,5 @@ "typescript": "^3.7.2" | ||
"prettier": "1.19.1", | ||
"protoc-plugin": "0.0.6" | ||
"protoc-plugin": "0.0.6", | ||
"winston": "^3.2.1" | ||
} | ||
} |
@@ -1,6 +0,6 @@ | ||
# protoc-gen-ng | ||
# @ngx-grpc/protoc-gen-ng | ||
gRPC Angular code generator. | ||
For documentation please refer [ngx-grpc/core](https://github.com/ngx-grpc/core) | ||
For documentation please refer [Github page](https://github.com/ngx-grpc/core) | ||
@@ -7,0 +7,0 @@ ## License |
34976
14
555
3
26
+ Addedwinston@^3.2.1
+ Added@colors/colors@1.6.0(transitive)
+ Added@dabh/diagnostics@2.0.3(transitive)
+ Added@types/triple-beam@1.3.5(transitive)
+ Addedasync@3.2.6(transitive)
+ Addedcolor@3.2.1(transitive)
+ Addedcolor-convert@1.9.3(transitive)
+ Addedcolor-name@1.1.3(transitive)
+ Addedcolor-string@1.9.1(transitive)
+ Addedcolorspace@1.1.4(transitive)
+ Addedenabled@2.0.0(transitive)
+ Addedfecha@4.2.3(transitive)
+ Addedfn.name@1.1.0(transitive)
+ Addedinherits@2.0.4(transitive)
+ Addedis-arrayish@0.3.2(transitive)
+ Addedis-stream@2.0.1(transitive)
+ Addedkuler@2.0.0(transitive)
+ Addedlogform@2.7.0(transitive)
+ Addedms@2.1.3(transitive)
+ Addedone-time@1.0.0(transitive)
+ Addedreadable-stream@3.6.2(transitive)
+ Addedsafe-buffer@5.2.1(transitive)
+ Addedsafe-stable-stringify@2.5.0(transitive)
+ Addedsimple-swizzle@0.2.2(transitive)
+ Addedstack-trace@0.0.10(transitive)
+ Addedstring_decoder@1.3.0(transitive)
+ Addedtext-hex@1.0.0(transitive)
+ Addedtriple-beam@1.4.1(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedwinston@3.17.0(transitive)
+ Addedwinston-transport@4.9.0(transitive)