babel-plugin-styled-components
Advanced tools
Comparing version 1.11.0-0 to 1.11.0
@@ -8,14 +8,18 @@ "use strict"; | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } | ||
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; } } | ||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } | ||
function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _nonIterableRest(); } | ||
function _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); } | ||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } | ||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } | ||
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } | ||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } | ||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } | ||
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } | ||
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } | ||
@@ -22,0 +26,0 @@ |
@@ -29,6 +29,10 @@ "use strict"; | ||
visitor: { | ||
Program(programPath, state) { | ||
programPath.traverse({ | ||
Program(path, state) { | ||
path.traverse({ | ||
JSXAttribute(path, state) { | ||
(0, _transpileCssProp.default)(t)(path, state); | ||
}, | ||
VariableDeclarator(path, state) { | ||
(0, _assignStyledRequired.default)(t)(path, state); | ||
} | ||
@@ -49,6 +53,2 @@ | ||
(0, _pure.default)(t)(path, state); | ||
}, | ||
VariableDeclarator(path, state) { | ||
(0, _assignStyledRequired.default)(t)(path, state); | ||
} | ||
@@ -55,0 +55,0 @@ |
@@ -6,4 +6,12 @@ "use strict"; | ||
}); | ||
exports.isPureHelper = exports.isHelper = exports.isKeyframesHelper = exports.isInjectGlobalHelper = exports.isCreateGlobalStyleHelper = exports.isCSSHelper = exports.isStyled = exports.isValidTopLevelImport = void 0; | ||
exports.isPureHelper = exports.isHelper = exports.isWithThemeHelper = exports.isKeyframesHelper = exports.isInjectGlobalHelper = exports.isCreateGlobalStyleHelper = exports.isCSSHelper = exports.isStyled = exports.importLocalName = exports.isValidTopLevelImport = void 0; | ||
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } | ||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } | ||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } | ||
var VALID_TOP_LEVEL_IMPORT_PATHS = ['styled-components', 'styled-components/no-tags', 'styled-components/native', 'styled-components/primitives']; | ||
var CACHE_MISS = Symbol('CACHE_MISS'); | ||
@@ -18,9 +26,10 @@ var isValidTopLevelImport = function isValidTopLevelImport(x) { | ||
var importLocalName = function importLocalName(name, state) { | ||
var bypassCache = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; | ||
var cacheKey = name + state.file.opts.filename; | ||
if (localNameCache[cacheKey]) { | ||
if (!bypassCache && cacheKey in localNameCache && localNameCache[cacheKey] !== CACHE_MISS) { | ||
return localNameCache[cacheKey]; | ||
} | ||
var localName = name === 'default' ? 'styled' : name; | ||
var localName = state.styledRequired ? name === 'default' ? 'styled' : name : CACHE_MISS; | ||
state.file.path.traverse({ | ||
@@ -32,8 +41,7 @@ ImportDeclaration: { | ||
if (isValidTopLevelImport(node.source.value)) { | ||
var _iteratorNormalCompletion = true; | ||
var _didIteratorError = false; | ||
var _iteratorError = undefined; | ||
var _iterator = _createForOfIteratorHelper(path.get('specifiers')), | ||
_step; | ||
try { | ||
for (var _iterator = path.get('specifiers')[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { | ||
for (_iterator.s(); !(_step = _iterator.n()).done;) { | ||
var specifier = _step.value; | ||
@@ -54,14 +62,5 @@ | ||
} catch (err) { | ||
_didIteratorError = true; | ||
_iteratorError = err; | ||
_iterator.e(err); | ||
} finally { | ||
try { | ||
if (!_iteratorNormalCompletion && _iterator.return != null) { | ||
_iterator.return(); | ||
} | ||
} finally { | ||
if (_didIteratorError) { | ||
throw _iteratorError; | ||
} | ||
} | ||
_iterator.f(); | ||
} | ||
@@ -77,2 +76,4 @@ } | ||
exports.importLocalName = importLocalName; | ||
var isStyled = function isStyled(t) { | ||
@@ -133,5 +134,13 @@ return function (tag, state) { | ||
var isWithThemeHelper = function isWithThemeHelper(t) { | ||
return function (tag, state) { | ||
return t.isIdentifier(tag) && tag.name === importLocalName('withTheme', state); | ||
}; | ||
}; | ||
exports.isWithThemeHelper = isWithThemeHelper; | ||
var isHelper = function isHelper(t) { | ||
return function (tag, state) { | ||
return isCSSHelper(t)(tag, state) || isKeyframesHelper(t)(tag, state); | ||
return isCSSHelper(t)(tag, state) || isKeyframesHelper(t)(tag, state) || isWithThemeHelper(t)(tag, state); | ||
}; | ||
@@ -144,3 +153,3 @@ }; | ||
return function (tag, state) { | ||
return isCSSHelper(t)(tag, state) || isKeyframesHelper(t)(tag, state) || isCreateGlobalStyleHelper(t)(tag, state); | ||
return isCSSHelper(t)(tag, state) || isKeyframesHelper(t)(tag, state) || isCreateGlobalStyleHelper(t)(tag, state) || isWithThemeHelper(t)(tag, state); | ||
}; | ||
@@ -147,0 +156,0 @@ }; |
@@ -6,3 +6,3 @@ "use strict"; | ||
}); | ||
exports.useCssProp = exports.usePureAnnotation = exports.useTranspileTemplateLiterals = exports.useMinify = exports.useFileName = exports.useSSR = exports.useDisplayName = void 0; | ||
exports.useCssProp = exports.usePureAnnotation = exports.useNamespace = exports.useTranspileTemplateLiterals = exports.useMinify = exports.useFileName = exports.useSSR = exports.useDisplayName = void 0; | ||
@@ -45,2 +45,14 @@ function getOption(_ref, name) { | ||
var useNamespace = function useNamespace(state) { | ||
var namespace = getOption(state, 'namespace', ''); | ||
if (namespace) { | ||
return `${namespace}__`; | ||
} | ||
return ''; | ||
}; | ||
exports.useNamespace = useNamespace; | ||
var usePureAnnotation = function usePureAnnotation(state) { | ||
@@ -47,0 +59,0 @@ return getOption(state, 'pure', false); |
@@ -130,3 +130,3 @@ "use strict"; | ||
// Prefix the identifier with a character because CSS classes cannot start with a number | ||
return `${(0, _prefixDigit.default)(getFileHash(state))}-${getNextId(state)}`; | ||
return `${(0, _options.useNamespace)(state)}${(0, _prefixDigit.default)(getFileHash(state))}-${getNextId(state)}`; | ||
}; | ||
@@ -136,3 +136,7 @@ | ||
return function (path, state) { | ||
if (path.node.tag ? (0, _detectors.isStyled)(t)(path.node.tag, state) : (0, _detectors.isStyled)(t)(path.node.callee, state) && path.node.callee.property && path.node.callee.property.name !== 'withConfig') { | ||
if (path.node.tag ? (0, _detectors.isStyled)(t)(path.node.tag, state) : | ||
/* styled()`` */ | ||
(0, _detectors.isStyled)(t)(path.node.callee, state) && path.node.callee.property && path.node.callee.property.name !== 'withConfig' || // styled(x)({}) | ||
(0, _detectors.isStyled)(t)(path.node.callee, state) && !t.isMemberExpression(path.node.callee.callee) || // styled(x).attrs()({}) | ||
(0, _detectors.isStyled)(t)(path.node.callee, state) && t.isMemberExpression(path.node.callee.callee) && path.node.callee.callee.property && path.node.callee.callee.property.name && path.node.callee.callee.property.name !== 'withConfig') { | ||
var displayName = (0, _options.useDisplayName)(state) && getDisplayName(t)(path, (0, _options.useFileName)(state) && state); | ||
@@ -139,0 +143,0 @@ addConfig(t)(path, displayName && displayName.replace(/[^_a-zA-Z0-9-]/g, ''), (0, _options.useSSR)(state) && getComponentId(state)); |
@@ -14,8 +14,12 @@ "use strict"; | ||
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } | ||
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } | ||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } | ||
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } | ||
function _iterableToArrayLimit(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } | ||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } | ||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } | ||
function _iterableToArrayLimit(arr, i) { if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } | ||
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } | ||
@@ -22,0 +26,0 @@ |
@@ -10,10 +10,14 @@ "use strict"; | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } | ||
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } | ||
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } | ||
function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } | ||
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } | ||
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; } } | ||
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } | ||
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } | ||
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } | ||
var _default = function _default(t) { | ||
@@ -20,0 +24,0 @@ return function (path, state) { |
@@ -10,2 +10,4 @@ "use strict"; | ||
var _detectors = require("../utils/detectors"); | ||
var _options = require("../utils/options"); | ||
@@ -15,2 +17,4 @@ | ||
// @see https://github.com/satya164/babel-plugin-css-prop | ||
var TAG_NAME_REGEXP = /^[a-z][a-z\d]*(\-[a-z][a-z\d]*)?$/; | ||
var getName = function getName(node, t) { | ||
@@ -33,13 +37,13 @@ if (typeof node.name === 'string') return node.name; | ||
var importName = state.customImportName; // Insert import if it doesn't exist yet | ||
var importName = state.customImportName || (0, _detectors.importLocalName)('default', state); | ||
var bindings = program.scope.bindings; // Insert import if it doesn't exist yet | ||
var bindings = program.scope.bindings; | ||
if (!importName || !bindings[importName.name]) { | ||
importName = (0, _helperModuleImports.addDefault)(path, 'styled-components', { | ||
nameHint: importName ? importName.name : 'styled' | ||
if (!importName || !bindings[importName.name] || !bindings[importName]) { | ||
(0, _helperModuleImports.addDefault)(path, 'styled-components', { | ||
nameHint: 'styled' | ||
}); | ||
importName = t.identifier((0, _detectors.importLocalName)('default', state, true)); | ||
} | ||
if (!state.customImportName) state.customImportName = importName; | ||
if (!t.isIdentifier(importName)) importName = t.identifier(importName); | ||
var elem = path.parentPath; | ||
@@ -50,3 +54,17 @@ var name = getName(elem.node.name, t); | ||
})); | ||
var styled = t.callExpression(importName, [/^[a-z]/.test(name) ? t.stringLiteral(name) : t.identifier(name)]); | ||
var styled; | ||
var injector; | ||
if (TAG_NAME_REGEXP.test(name)) { | ||
styled = t.callExpression(importName, [t.stringLiteral(name)]); | ||
} else { | ||
styled = t.callExpression(importName, [t.identifier(name)]); | ||
if (bindings[name] && !t.isImportDeclaration(bindings[name].path.parent)) { | ||
injector = function injector(nodeToInsert) { | ||
return (t.isVariableDeclaration(bindings[name].path.parent) ? bindings[name].path.parentPath : bindings[name].path).insertAfter(nodeToInsert); | ||
}; | ||
} | ||
} | ||
var css; | ||
@@ -64,2 +82,4 @@ | ||
css = path.node.value.expression.quasi; | ||
} else if (t.isObjectExpression(path.node.value.expression)) { | ||
css = path.node.value.expression; | ||
} else { | ||
@@ -84,24 +104,79 @@ css = t.templateLiteral([t.templateElement({ | ||
elem.parentPath.node.closingElement.name = t.jSXIdentifier(id.name); | ||
} // object syntax | ||
if (t.isObjectExpression(css)) { | ||
/** | ||
* for objects as CSS props, we have to recurse through the object and replace any | ||
* object value scope references with generated props similar to how the template | ||
* literal transform above creates dynamic interpolations | ||
*/ | ||
var p = t.identifier('p'); | ||
var replaceObjectWithPropFunction = false; | ||
css.properties = css.properties.reduce(function propertiesReducer(acc, property) { | ||
if (t.isObjectExpression(property.value)) { | ||
// recurse for objects within objects (e.g. {'::before': { content: x }}) | ||
property.value.properties = property.value.properties.reduce(propertiesReducer, []); | ||
acc.push(property); | ||
} else if (t.isSpreadElement(property)) { | ||
// recurse for objects within objects (e.g. {'::before': { content: x }}) | ||
property.argument.properties = property.argument.properties.reduce(propertiesReducer, []); | ||
acc.push(property); | ||
} else if ( // if a non-primitive value we have to interpolate it | ||
[t.isBigIntLiteral, t.isBooleanLiteral, t.isNullLiteral, t.isNumericLiteral, t.isStringLiteral].filter(Boolean) // older versions of babel might not have bigint support baked in | ||
.every(function (x) { | ||
return !x(property.value); | ||
})) { | ||
replaceObjectWithPropFunction = true; | ||
var _name = path.scope.generateUidIdentifier('css'); | ||
elem.node.attributes.push(t.jSXAttribute(t.jSXIdentifier(_name.name), t.jSXExpressionContainer(property.value))); | ||
acc.push(t.objectProperty(property.key, t.memberExpression(p, _name))); | ||
} else { | ||
// some sort of primitive which is safe to pass through as-is | ||
acc.push(property); | ||
} | ||
return acc; | ||
}, []); | ||
if (replaceObjectWithPropFunction) { | ||
css = t.arrowFunctionExpression([p], css); | ||
} | ||
} else { | ||
// tagged template literal | ||
css.expressions = css.expressions.reduce(function (acc, ex) { | ||
if (Object.keys(bindings).some(function (key) { | ||
return bindings[key].referencePaths.find(function (p) { | ||
return p.node === ex; | ||
}); | ||
}) || t.isFunctionExpression(ex) || t.isArrowFunctionExpression(ex)) { | ||
acc.push(ex); | ||
} else { | ||
var _name2 = path.scope.generateUidIdentifier('css'); | ||
var _p = t.identifier('p'); | ||
elem.node.attributes.push(t.jSXAttribute(t.jSXIdentifier(_name2.name), t.jSXExpressionContainer(ex))); | ||
acc.push(t.arrowFunctionExpression([_p], t.memberExpression(_p, _name2))); | ||
} | ||
return acc; | ||
}, []); | ||
} | ||
css.expressions = css.expressions.reduce(function (acc, ex) { | ||
if (Object.keys(bindings).some(function (key) { | ||
return bindings[key].referencePaths.find(function (p) { | ||
return p.node === ex; | ||
}); | ||
}) || t.isFunctionExpression(ex) || t.isArrowFunctionExpression(ex)) { | ||
acc.push(ex); | ||
} else { | ||
var _name = path.scope.generateUidIdentifier('css'); | ||
if (!injector) { | ||
var parent = elem; | ||
var p = t.identifier('p'); | ||
elem.node.attributes.push(t.jSXAttribute(t.jSXIdentifier(_name.name), t.jSXExpressionContainer(ex))); | ||
acc.push(t.arrowFunctionExpression([p], t.memberExpression(p, _name))); | ||
while (!t.isProgram(parent.parentPath)) { | ||
parent = parent.parentPath; | ||
} | ||
return acc; | ||
}, []); // Add the tagged template expression and then requeue the newly added node | ||
// so Babel runs over it again | ||
injector = function injector(nodeToInsert) { | ||
return parent.insertBefore(nodeToInsert); | ||
}; | ||
} | ||
program.node.body.push(t.variableDeclaration('var', [t.variableDeclarator(id, t.taggedTemplateExpression(styled, css))])); | ||
injector(t.variableDeclaration('var', [t.variableDeclarator(id, t.isObjectExpression(css) || t.isArrowFunctionExpression(css) ? t.callExpression(styled, [css]) : t.taggedTemplateExpression(styled, css))])); | ||
}; | ||
@@ -108,0 +183,0 @@ }; |
{ | ||
"version": "1.11.0-0", | ||
"version": "1.11.0", | ||
"name": "babel-plugin-styled-components", | ||
@@ -25,7 +25,7 @@ "description": "Improve the debugging experience and add server-side rendering support to styled-components", | ||
"babel-test": "^0.2.1", | ||
"jest": "^24.8.0", | ||
"jest": "^26.1.0", | ||
"jest-file-snapshot": "^0.3.6", | ||
"prettier": "^1.18.2", | ||
"rimraf": "^2.6.3", | ||
"styled-components": "^4.3.1" | ||
"prettier": "^2.0.5", | ||
"rimraf": "^3.0.0", | ||
"styled-components": "^5.0.0" | ||
}, | ||
@@ -32,0 +32,0 @@ "dependencies": { |
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
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
43582
793
1