@gmod/binary-parser
Advanced tools
Comparing version 1.3.5 to 1.4.0
@@ -1,139 +0,146 @@ | ||
"use strict";function _typeof(obj) {if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {_typeof = function _typeof(obj) {return typeof obj;};} else {_typeof = function _typeof(obj) {return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;};}return _typeof(obj);} //= ======================================================================================= | ||
// class Context | ||
//= ======================================================================================= | ||
"use strict"; | ||
//---------------------------------------------------------------------------------------- | ||
// constructor | ||
//---------------------------------------------------------------------------------------- | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
}); | ||
exports.Context = void 0; | ||
var Context = function Context() { | ||
this.code = ""; | ||
this.scopes = [["vars"]]; | ||
this.isAsync = false; | ||
this.bitFields = []; | ||
this.tmpVariableCount = 0; | ||
this.references = {}; | ||
}; | ||
function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } | ||
//---------------------------------------------------------------------------------------- | ||
// public methods | ||
//---------------------------------------------------------------------------------------- | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } | ||
Context.prototype.generateVariable = function (name) { | ||
var arr = []; | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } | ||
Array.prototype.push.apply(arr, this.scopes[this.scopes.length - 1]); | ||
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } | ||
// $parent. prefixes allow sub-parsers to access values of their parent parsers | ||
while (/^\$parent\./.test(name)) { | ||
arr.pop(); | ||
name = name.replace(/^\$parent\./, ""); | ||
} | ||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } | ||
if (name) { | ||
arr.push(name); | ||
} | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
return arr.join("."); | ||
}; | ||
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } | ||
Context.prototype.generateOption = function (val) { | ||
switch (_typeof(val)) { | ||
case "number": | ||
return val.toString(); | ||
case "string": | ||
return this.generateVariable(val); | ||
case "function": | ||
return "(".concat(val, ").call(").concat(this.generateVariable(), ", vars)"); | ||
default: | ||
return undefined;} | ||
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } | ||
}; | ||
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } | ||
Context.prototype.generateError = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
var err = Context.interpolate.apply(this, args); | ||
var Context = | ||
/*#__PURE__*/ | ||
function () { | ||
function Context() { | ||
_classCallCheck(this, Context); | ||
if (this.isAsync) { | ||
this.pushCode("return process.nextTick(function() { callback(new Error(".concat( | ||
err, "), vars); });")); | ||
_defineProperty(this, "code", ''); | ||
} else { | ||
this.pushCode("throw new Error(".concat(err, ");")); | ||
} | ||
}; | ||
_defineProperty(this, "scopes", [['vars']]); | ||
Context.prototype.generateTmpVariable = function () { | ||
return "$tmp".concat(this.tmpVariableCount++); | ||
}; | ||
_defineProperty(this, "bitFields", []); | ||
Context.prototype.pushCode = function () { | ||
var args = Array.prototype.slice.call(arguments); | ||
_defineProperty(this, "tmpVariableCount", 0); | ||
this.code += "".concat(Context.interpolate.apply(this, args), "\n"); | ||
}; | ||
Context.prototype.pushPath = function (name) { | ||
if (name) { | ||
this.scopes[this.scopes.length - 1].push(name); | ||
_defineProperty(this, "references", {}); | ||
} | ||
}; | ||
Context.prototype.popPath = function (name) { | ||
if (name) { | ||
this.scopes[this.scopes.length - 1].pop(); | ||
} | ||
}; | ||
_createClass(Context, [{ | ||
key: "generateVariable", | ||
value: function generateVariable(name) { | ||
var arr = []; | ||
var scopes = this.scopes[this.scopes.length - 1]; | ||
arr.push.apply(arr, _toConsumableArray(scopes)); | ||
Context.prototype.pushScope = function (name) { | ||
this.scopes.push([name]); | ||
}; | ||
if (name) { | ||
arr.push(name); | ||
} | ||
Context.prototype.popScope = function () { | ||
this.scopes.pop(); | ||
}; | ||
return arr.join('.'); | ||
} | ||
}, { | ||
key: "generateOption", | ||
value: function generateOption(val) { | ||
switch (_typeof(val)) { | ||
case 'number': | ||
return val.toString(); | ||
Context.prototype.addReference = function (alias) { | ||
if (this.references[alias]) return; | ||
this.references[alias] = { resolved: false, requested: false }; | ||
}; | ||
case 'string': | ||
return this.generateVariable(val); | ||
Context.prototype.markResolved = function (alias) { | ||
this.references[alias].resolved = true; | ||
}; | ||
case 'function': | ||
return "(".concat(val, ").call(").concat(this.generateVariable(), ", vars)"); | ||
} | ||
} | ||
}, { | ||
key: "generateError", | ||
value: function generateError(err) { | ||
this.pushCode('throw new Error(' + err + ');'); | ||
} | ||
}, { | ||
key: "generateTmpVariable", | ||
value: function generateTmpVariable() { | ||
return '$tmp' + this.tmpVariableCount++; | ||
} | ||
}, { | ||
key: "pushCode", | ||
value: function pushCode(code) { | ||
this.code += code + '\n'; | ||
} | ||
}, { | ||
key: "pushPath", | ||
value: function pushPath(name) { | ||
if (name) { | ||
this.scopes[this.scopes.length - 1].push(name); | ||
} | ||
} | ||
}, { | ||
key: "popPath", | ||
value: function popPath(name) { | ||
if (name) { | ||
this.scopes[this.scopes.length - 1].pop(); | ||
} | ||
} | ||
}, { | ||
key: "pushScope", | ||
value: function pushScope(name) { | ||
this.scopes.push([name]); | ||
} | ||
}, { | ||
key: "popScope", | ||
value: function popScope() { | ||
this.scopes.pop(); | ||
} | ||
}, { | ||
key: "addReference", | ||
value: function addReference(alias) { | ||
if (this.references[alias]) return; | ||
this.references[alias] = { | ||
resolved: false, | ||
requested: false | ||
}; | ||
} | ||
}, { | ||
key: "markResolved", | ||
value: function markResolved(alias) { | ||
this.references[alias].resolved = true; | ||
} | ||
}, { | ||
key: "markRequested", | ||
value: function markRequested(aliasList) { | ||
var _this = this; | ||
Context.prototype.markRequested = function (aliasList) { | ||
aliasList.forEach( | ||
function (alias) { | ||
this.references[alias].requested = true; | ||
}.bind(this)); | ||
aliasList.forEach(function (alias) { | ||
_this.references[alias].requested = true; | ||
}); | ||
} | ||
}, { | ||
key: "getUnresolvedReferences", | ||
value: function getUnresolvedReferences() { | ||
var references = this.references; | ||
return Object.keys(this.references).filter(function (alias) { | ||
return !references[alias].resolved && !references[alias].requested; | ||
}); | ||
} | ||
}]); | ||
}; | ||
return Context; | ||
}(); | ||
Context.prototype.getUnresolvedReferences = function () { | ||
var references = this.references; | ||
return Object.keys(this.references).filter(function (alias) { | ||
return !references[alias].resolved && !references[alias].requested; | ||
}); | ||
}; | ||
//---------------------------------------------------------------------------------------- | ||
// private methods | ||
//---------------------------------------------------------------------------------------- | ||
Context.interpolate = function (s) { | ||
var re = /{\d+}/g; | ||
var matches = s.match(re); | ||
var params = Array.prototype.slice.call(arguments, 1); | ||
if (matches) { | ||
matches.forEach(function (match) { | ||
var index = parseInt(match.substr(1, match.length - 2), 10); | ||
s = s.replace(match, params[index].toString()); | ||
}); | ||
} | ||
return s; | ||
}; | ||
exports.Context = Context; | ||
exports.Context = Context; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9jb250ZXh0LnRzIl0sIm5hbWVzIjpbIkNvbnRleHQiLCJuYW1lIiwiYXJyIiwic2NvcGVzIiwibGVuZ3RoIiwicHVzaCIsImpvaW4iLCJ2YWwiLCJ0b1N0cmluZyIsImdlbmVyYXRlVmFyaWFibGUiLCJlcnIiLCJwdXNoQ29kZSIsInRtcFZhcmlhYmxlQ291bnQiLCJjb2RlIiwicG9wIiwiYWxpYXMiLCJyZWZlcmVuY2VzIiwicmVzb2x2ZWQiLCJyZXF1ZXN0ZWQiLCJhbGlhc0xpc3QiLCJmb3JFYWNoIiwiT2JqZWN0Iiwia2V5cyIsImZpbHRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUVhQSxPOzs7Ozs7a0NBQ0osRTs7b0NBQ0UsQ0FBQyxDQUFDLE1BQUQsQ0FBRCxDOzt1Q0FDYSxFOzs4Q0FDSCxDOzt3Q0FDd0QsRTs7Ozs7cUNBRTFEQyxJLEVBQWU7QUFDOUIsVUFBTUMsR0FBRyxHQUFHLEVBQVo7QUFFQSxVQUFNQyxNQUFNLEdBQUcsS0FBS0EsTUFBTCxDQUFZLEtBQUtBLE1BQUwsQ0FBWUMsTUFBWixHQUFxQixDQUFqQyxDQUFmO0FBQ0FGLE1BQUFBLEdBQUcsQ0FBQ0csSUFBSixPQUFBSCxHQUFHLHFCQUFTQyxNQUFULEVBQUg7O0FBQ0EsVUFBSUYsSUFBSixFQUFVO0FBQ1JDLFFBQUFBLEdBQUcsQ0FBQ0csSUFBSixDQUFTSixJQUFUO0FBQ0Q7O0FBRUQsYUFBT0MsR0FBRyxDQUFDSSxJQUFKLENBQVMsR0FBVCxDQUFQO0FBQ0Q7OzttQ0FFY0MsRyxFQUFpQztBQUM5QyxzQkFBZUEsR0FBZjtBQUNFLGFBQUssUUFBTDtBQUNFLGlCQUFPQSxHQUFHLENBQUNDLFFBQUosRUFBUDs7QUFDRixhQUFLLFFBQUw7QUFDRSxpQkFBTyxLQUFLQyxnQkFBTCxDQUFzQkYsR0FBdEIsQ0FBUDs7QUFDRixhQUFLLFVBQUw7QUFDRSw0QkFBV0EsR0FBWCxvQkFBd0IsS0FBS0UsZ0JBQUwsRUFBeEI7QUFOSjtBQVFEOzs7a0NBRWFDLEcsRUFBYTtBQUN6QixXQUFLQyxRQUFMLENBQWMscUJBQXFCRCxHQUFyQixHQUEyQixJQUF6QztBQUNEOzs7MENBRXFCO0FBQ3BCLGFBQU8sU0FBUyxLQUFLRSxnQkFBTCxFQUFoQjtBQUNEOzs7NkJBRVFDLEksRUFBYztBQUNyQixXQUFLQSxJQUFMLElBQWFBLElBQUksR0FBRyxJQUFwQjtBQUNEOzs7NkJBRVFaLEksRUFBYztBQUNyQixVQUFJQSxJQUFKLEVBQVU7QUFDUixhQUFLRSxNQUFMLENBQVksS0FBS0EsTUFBTCxDQUFZQyxNQUFaLEdBQXFCLENBQWpDLEVBQW9DQyxJQUFwQyxDQUF5Q0osSUFBekM7QUFDRDtBQUNGOzs7NEJBRU9BLEksRUFBYztBQUNwQixVQUFJQSxJQUFKLEVBQVU7QUFDUixhQUFLRSxNQUFMLENBQVksS0FBS0EsTUFBTCxDQUFZQyxNQUFaLEdBQXFCLENBQWpDLEVBQW9DVSxHQUFwQztBQUNEO0FBQ0Y7Ozs4QkFFU2IsSSxFQUFjO0FBQ3RCLFdBQUtFLE1BQUwsQ0FBWUUsSUFBWixDQUFpQixDQUFDSixJQUFELENBQWpCO0FBQ0Q7OzsrQkFFVTtBQUNULFdBQUtFLE1BQUwsQ0FBWVcsR0FBWjtBQUNEOzs7aUNBRVlDLEssRUFBZTtBQUMxQixVQUFJLEtBQUtDLFVBQUwsQ0FBZ0JELEtBQWhCLENBQUosRUFBNEI7QUFDNUIsV0FBS0MsVUFBTCxDQUFnQkQsS0FBaEIsSUFBeUI7QUFBRUUsUUFBQUEsUUFBUSxFQUFFLEtBQVo7QUFBbUJDLFFBQUFBLFNBQVMsRUFBRTtBQUE5QixPQUF6QjtBQUNEOzs7aUNBRVlILEssRUFBZTtBQUMxQixXQUFLQyxVQUFMLENBQWdCRCxLQUFoQixFQUF1QkUsUUFBdkIsR0FBa0MsSUFBbEM7QUFDRDs7O2tDQUVhRSxTLEVBQXFCO0FBQUE7O0FBQ2pDQSxNQUFBQSxTQUFTLENBQUNDLE9BQVYsQ0FBa0IsVUFBQUwsS0FBSyxFQUFJO0FBQ3pCLFFBQUEsS0FBSSxDQUFDQyxVQUFMLENBQWdCRCxLQUFoQixFQUF1QkcsU0FBdkIsR0FBbUMsSUFBbkM7QUFDRCxPQUZEO0FBR0Q7Ozs4Q0FFeUI7QUFDeEIsVUFBTUYsVUFBVSxHQUFHLEtBQUtBLFVBQXhCO0FBQ0EsYUFBT0ssTUFBTSxDQUFDQyxJQUFQLENBQVksS0FBS04sVUFBakIsRUFBNkJPLE1BQTdCLENBQ0wsVUFBQVIsS0FBSztBQUFBLGVBQUksQ0FBQ0MsVUFBVSxDQUFDRCxLQUFELENBQVYsQ0FBa0JFLFFBQW5CLElBQStCLENBQUNELFVBQVUsQ0FBQ0QsS0FBRCxDQUFWLENBQWtCRyxTQUF0RDtBQUFBLE9BREEsQ0FBUDtBQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyc2VyIH0gZnJvbSAnLi9iaW5hcnlfcGFyc2VyJztcblxuZXhwb3J0IGNsYXNzIENvbnRleHQge1xuICBjb2RlID0gJyc7XG4gIHNjb3BlcyA9IFtbJ3ZhcnMnXV07XG4gIGJpdEZpZWxkczogUGFyc2VyW10gPSBbXTtcbiAgdG1wVmFyaWFibGVDb3VudCA9IDA7XG4gIHJlZmVyZW5jZXM6IHsgW2tleTogc3RyaW5nXTogeyByZXNvbHZlZDogYm9vbGVhbjsgcmVxdWVzdGVkOiBib29sZWFuIH0gfSA9IHt9O1xuXG4gIGdlbmVyYXRlVmFyaWFibGUobmFtZT86IHN0cmluZykge1xuICAgIGNvbnN0IGFyciA9IFtdO1xuXG4gICAgY29uc3Qgc2NvcGVzID0gdGhpcy5zY29wZXNbdGhpcy5zY29wZXMubGVuZ3RoIC0gMV07XG4gICAgYXJyLnB1c2goLi4uc2NvcGVzKTtcbiAgICBpZiAobmFtZSkge1xuICAgICAgYXJyLnB1c2gobmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyci5qb2luKCcuJyk7XG4gIH1cblxuICBnZW5lcmF0ZU9wdGlvbih2YWw6IG51bWJlciB8IHN0cmluZyB8IEZ1bmN0aW9uKSB7XG4gICAgc3dpdGNoICh0eXBlb2YgdmFsKSB7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gdmFsLnRvU3RyaW5nKCk7XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVZhcmlhYmxlKHZhbCk7XG4gICAgICBjYXNlICdmdW5jdGlvbic6XG4gICAgICAgIHJldHVybiBgKCR7dmFsfSkuY2FsbCgke3RoaXMuZ2VuZXJhdGVWYXJpYWJsZSgpfSwgdmFycylgO1xuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlRXJyb3IoZXJyOiBzdHJpbmcpIHtcbiAgICB0aGlzLnB1c2hDb2RlKCd0aHJvdyBuZXcgRXJyb3IoJyArIGVyciArICcpOycpO1xuICB9XG5cbiAgZ2VuZXJhdGVUbXBWYXJpYWJsZSgpIHtcbiAgICByZXR1cm4gJyR0bXAnICsgdGhpcy50bXBWYXJpYWJsZUNvdW50Kys7XG4gIH1cblxuICBwdXNoQ29kZShjb2RlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvZGUgKz0gY29kZSArICdcXG4nO1xuICB9XG5cbiAgcHVzaFBhdGgobmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHRoaXMuc2NvcGVzW3RoaXMuc2NvcGVzLmxlbmd0aCAtIDFdLnB1c2gobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcG9wUGF0aChuYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAobmFtZSkge1xuICAgICAgdGhpcy5zY29wZXNbdGhpcy5zY29wZXMubGVuZ3RoIC0gMV0ucG9wKCk7XG4gICAgfVxuICB9XG5cbiAgcHVzaFNjb3BlKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuc2NvcGVzLnB1c2goW25hbWVdKTtcbiAgfVxuXG4gIHBvcFNjb3BlKCkge1xuICAgIHRoaXMuc2NvcGVzLnBvcCgpO1xuICB9XG5cbiAgYWRkUmVmZXJlbmNlKGFsaWFzOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5yZWZlcmVuY2VzW2FsaWFzXSkgcmV0dXJuO1xuICAgIHRoaXMucmVmZXJlbmNlc1thbGlhc10gPSB7IHJlc29sdmVkOiBmYWxzZSwgcmVxdWVzdGVkOiBmYWxzZSB9O1xuICB9XG5cbiAgbWFya1Jlc29sdmVkKGFsaWFzOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlZmVyZW5jZXNbYWxpYXNdLnJlc29sdmVkID0gdHJ1ZTtcbiAgfVxuXG4gIG1hcmtSZXF1ZXN0ZWQoYWxpYXNMaXN0OiBzdHJpbmdbXSkge1xuICAgIGFsaWFzTGlzdC5mb3JFYWNoKGFsaWFzID0+IHtcbiAgICAgIHRoaXMucmVmZXJlbmNlc1thbGlhc10ucmVxdWVzdGVkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFVucmVzb2x2ZWRSZWZlcmVuY2VzKCkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSB0aGlzLnJlZmVyZW5jZXM7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucmVmZXJlbmNlcykuZmlsdGVyKFxuICAgICAgYWxpYXMgPT4gIXJlZmVyZW5jZXNbYWxpYXNdLnJlc29sdmVkICYmICFyZWZlcmVuY2VzW2FsaWFzXS5yZXF1ZXN0ZWQsXG4gICAgKTtcbiAgfVxufVxuIl19 |
//= ======================================================================================= | ||
// Globals | ||
//= ======================================================================================= | ||
var { Buffer } = require("buffer"); | ||
var vm = require("vm"); | ||
@@ -5,0 +6,0 @@ |
{ | ||
"name": "@gmod/binary-parser", | ||
"version": "1.3.5", | ||
"version": "1.4.0", | ||
"description": "Blazing-fast binary parser builder", | ||
@@ -16,3 +16,3 @@ "main": "dist/binary_parser.js", | ||
"eslint-plugin-import": "^2.10.0", | ||
"eslint-plugin-prettier": "^2.6.0", | ||
"eslint-plugin-prettier": "^3.1.0", | ||
"jest": "^24.7.1", | ||
@@ -22,3 +22,3 @@ "mocha": "^6.0.0", | ||
"puppeteer": "^1.11.0", | ||
"webpack": "^4.28.4", | ||
"webpack": "^4.37.0", | ||
"webpack-cli": "^3.2.1" | ||
@@ -32,2 +32,5 @@ }, | ||
}, | ||
"browser": { | ||
"vm": "./vm-browser.js" | ||
}, | ||
"keywords": [ | ||
@@ -34,0 +37,0 @@ "binary", |
@@ -19,6 +19,23 @@ | ||
Important! Default this library is default little endian instead instead of big endian while https://github.com/keichi/binary-parser is default big endian | ||
## Special data types | ||
The ITF-8 and LTF-8 types documented in https://samtools.github.io/hts-specs/CRAMv3.pdf | ||
The 64-bit parsing in this library is done by https://www.npmjs.com/package/long and simply returns .toNumber() on the parsed 64 bit data. | ||
You can also access `Long` inside formatter callbacks (this is not possible in keichi/binary-parser since these are eval'd and the `Long` library instance is not available to the eval'd code) | ||
## Differences with keichi/binary-parser | ||
* This library is default little endian instead instead of big endian while https://github.com/keichi/binary-parser is default big endian | ||
* The return value of the parse `{result: {<parsed results>},offset: <number of bytes parsed>}` instead of just `{<parsed results>}` | ||
## Example usage | ||
Example of reading a 64-bit int | ||
new Parser() | ||
.uint64('mylong64bitint') | ||
@@ -29,2 +46,2 @@ .int64('mylong64bitint') | ||
Verification of whether it is valid 2^53 max int is not done for 64 bit either | ||
Verification of whether the long is a valid 2^53 int is not done for 64 bit numbers. If you require this make a custom callback using `Long` in a formatter for buffer |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
230756
17
2247
46