@juzi/protobufjs-cli
Advanced tools
Comparing version 1.0.3-alpha.2 to 1.1.1-alpha.1
# Changelog | ||
## [1.1.1](https://github.com/protobufjs/protobuf.js/compare/protobufjs-cli-v1.1.0...protobufjs-cli-v1.1.1) (2023-02-02) | ||
### Bug Fixes | ||
* **cli:** fix relative path to Google pb files ([#1859](https://github.com/protobufjs/protobuf.js/issues/1859)) ([e42eea4](https://github.com/protobufjs/protobuf.js/commit/e42eea4868b11f4a07934804a56683321ed191e2)) | ||
## [1.1.0](https://github.com/protobufjs/protobuf.js/compare/protobufjs-cli-v1.0.2...protobufjs-cli-v1.1.0) (2023-01-24) | ||
### Features | ||
* **cli:** generate static files at the granularity of proto messages ([#1840](https://github.com/protobufjs/protobuf.js/issues/1840)) ([32f2d6a](https://github.com/protobufjs/protobuf.js/commit/32f2d6a68b27997bd0f7619998695a9fa7a4fd70)) | ||
## [1.0.2](https://github.com/protobufjs/protobuf.js/compare/protobufjs-cli-v1.0.1...protobufjs-cli-v1.0.2) (2022-09-09) | ||
@@ -4,0 +18,0 @@ |
{ | ||
"name": "@juzi/protobufjs-cli", | ||
"description": "Translates between file formats and generates static code as well as TypeScript definitions.", | ||
"version": "1.0.3-alpha.2", | ||
"version": "1.1.1-alpha.1", | ||
"author": "Daniel Wirtz <dcode+protobufjs@dcode.io>", | ||
@@ -29,3 +29,3 @@ "repository": { | ||
"glob": "^8.0.0", | ||
"jsdoc": "^3.6.3", | ||
"jsdoc": "^4.0.0", | ||
"minimist": "^1.2.0", | ||
@@ -32,0 +32,0 @@ "semver": "^7.1.2", |
20
pbjs.js
@@ -42,3 +42,3 @@ "use strict"; | ||
}, | ||
string: [ "target", "out", "path", "wrap", "dependency", "root", "lint" ], | ||
string: [ "target", "out", "path", "wrap", "dependency", "root", "lint", "filter" ], | ||
boolean: [ "create", "encode", "decode", "verify", "convert", "delimited", "typeurl", "beautify", "comments", "service", "es6", "sparse", "keep-case", "alt-comment", "force-number", "force-enum-string", "force-message", "null-defaults" ], | ||
@@ -80,3 +80,3 @@ default: { | ||
// protobuf.js package directory contains additional, otherwise non-bundled google types | ||
paths.push(path.relative(process.cwd(), path.join(__dirname, "..")) || "."); | ||
paths.push(path.relative(process.cwd(), path.join(__dirname, "../protobufjs")) || "."); | ||
@@ -101,2 +101,5 @@ if (!files.length) { | ||
"", | ||
" --filter Set up a filter to configure only those messages you need and their dependencies to compile, this will effectively reduce the final file size", | ||
" Set A json file path, Example of file content: {\"messageNames\":[\"mypackage.messageName1\", \"messageName2\"] } ", | ||
"", | ||
" -o, --out Saves to a file instead of writing to stdout.", | ||
@@ -314,3 +317,16 @@ "", | ||
function filterMessage() { | ||
if (argv.filter) { | ||
// This is a piece of degradable logic | ||
try { | ||
const needMessage = JSON.parse(fs.readFileSync(argv.filter)); | ||
util.filterMessage(root, needMessage); | ||
} catch (error) { | ||
process.stderr.write(`The filter not work, please check whether the file is correct: ${error.message}\n`); | ||
} | ||
} | ||
} | ||
function callTarget() { | ||
filterMessage(); | ||
target(root, argv, function targetCallback(err, output) { | ||
@@ -317,0 +333,0 @@ if (err) { |
116
util.js
@@ -128,1 +128,117 @@ "use strict"; | ||
/** | ||
* DFS to get all message dependencies, cache in filterMap. | ||
* @param {Root} root The protobuf root instance | ||
* @param {Message} message The message need to process. | ||
* @param {Map} filterMap The result of message you need and their dependencies. | ||
* @param {Map} flatMap A flag to record whether the message was searched. | ||
* @returns {undefined} Does not return a value | ||
*/ | ||
function dfsFilterMessageDependencies(root, message, filterMap, flatMap) { | ||
if (message instanceof protobuf.Type) { | ||
if (flatMap.get(`${message.fullName}`)) return; | ||
flatMap.set(`${message.fullName}`, true); | ||
for (var field of message.fieldsArray) { | ||
if (field.resolvedType) { | ||
// a nested message | ||
if (field.resolvedType.parent.name === message.name) { | ||
var nestedMessage = message.nested[field.resolvedType.name]; | ||
dfsFilterMessageDependencies(root, nestedMessage, filterMap, flatMap); | ||
continue; | ||
} | ||
var packageName = field.resolvedType.parent.name; | ||
var typeName = field.resolvedType.name; | ||
var fullName = packageName ? `${packageName}.${typeName}` : typeName; | ||
doFilterMessage(root, { messageNames: [fullName] }, filterMap, flatMap, packageName); | ||
} | ||
} | ||
} | ||
} | ||
/** | ||
* DFS to get all message you need and their dependencies, cache in filterMap. | ||
* @param {Root} root The protobuf root instance | ||
* @param {object} needMessageConfig Need message config: | ||
* @param {string[]} needMessageConfig.messageNames The message names array in the root namespace you need to gen. example: [msg1, msg2] | ||
* @param {Map} filterMap The result of message you need and their dependencies. | ||
* @param {Map} flatMap A flag to record whether the message was searched. | ||
* @param {string} currentPackageName Current package name | ||
* @returns {undefined} Does not return a value | ||
*/ | ||
function doFilterMessage(root, needMessageConfig, filterMap, flatMap, currentPackageName) { | ||
var needMessageNames = needMessageConfig.messageNames; | ||
for (var messageFullName of needMessageNames) { | ||
var nameSplit = messageFullName.split("."); | ||
var packageName = ""; | ||
var messageName = ""; | ||
if (nameSplit.length > 1) { | ||
packageName = nameSplit[0]; | ||
messageName = nameSplit[1]; | ||
} else { | ||
messageName = nameSplit[0]; | ||
} | ||
// in Namespace | ||
if (packageName) { | ||
var ns = root.nested[packageName]; | ||
if (!ns || !(ns instanceof protobuf.Namespace)) { | ||
throw new Error(`package not foud ${currentPackageName}.${messageName}`); | ||
} | ||
doFilterMessage(root, { messageNames: [messageName] }, filterMap, flatMap, packageName); | ||
} else { | ||
var message = root.nested[messageName]; | ||
if (currentPackageName) { | ||
message = root.nested[currentPackageName].nested[messageName]; | ||
} | ||
if (!message) { | ||
throw new Error(`message not foud ${currentPackageName}.${messageName}`); | ||
} | ||
var set = filterMap.get(currentPackageName); | ||
if (!filterMap.has(currentPackageName)) { | ||
set = new Set(); | ||
filterMap.set(currentPackageName, set); | ||
} | ||
set.add(messageName); | ||
// dfs to find all dependencies | ||
dfsFilterMessageDependencies(root, message, filterMap, flatMap, currentPackageName); | ||
} | ||
} | ||
} | ||
/** | ||
* filter the message you need and their dependencies, all others will be delete from root. | ||
* @param {Root} root Root the protobuf root instance | ||
* @param {object} needMessageConfig Need message config: | ||
* @param {string[]} needMessageConfig.messageNames Tthe message names array in the root namespace you need to gen. example: [msg1, msg2] | ||
* @returns {boolean} True if a message should present in the generated files | ||
*/ | ||
exports.filterMessage = function (root, needMessageConfig) { | ||
var filterMap = new Map(); | ||
var flatMap = new Map(); | ||
doFilterMessage(root, needMessageConfig, filterMap, flatMap, ""); | ||
root._nestedArray = root._nestedArray.filter(ns => { | ||
if (ns instanceof protobuf.Type || ns instanceof protobuf.Enum) { | ||
return filterMap.get("").has(ns.name); | ||
} else if (ns instanceof protobuf.Namespace) { | ||
if (!filterMap.has(ns.name)) { | ||
return false; | ||
} | ||
ns._nestedArray = ns._nestedArray.filter(nns => { | ||
const nnsSet = filterMap.get(ns.name); | ||
return nnsSet.has(nns.name); | ||
}); | ||
return true; | ||
} | ||
return true; | ||
}); | ||
}; | ||
111455
2500
+ Added@jsdoc/salty@0.2.8(transitive)
+ Added@types/markdown-it@14.1.1(transitive)
+ Addedentities@4.5.0(transitive)
+ Addedjsdoc@4.0.3(transitive)
+ Addedlinkify-it@5.0.0(transitive)
+ Addedmarkdown-it@14.1.0(transitive)
+ Addedmdurl@2.0.0(transitive)
+ Addedpunycode.js@2.3.1(transitive)
+ Addeduc.micro@2.1.0(transitive)
- Removed@types/markdown-it@12.2.3(transitive)
- Removedentities@2.1.0(transitive)
- Removedjsdoc@3.6.11(transitive)
- Removedlinkify-it@3.0.3(transitive)
- Removedmarkdown-it@12.3.2(transitive)
- Removedmdurl@1.0.1(transitive)
- Removedtaffydb@2.6.2(transitive)
- Removeduc.micro@1.0.6(transitive)
Updatedjsdoc@^4.0.0