babel-plugin-define-variables
Advanced tools
+25
-3
@@ -5,3 +5,5 @@ "use strict"; | ||
| getConstCache = _require.getConstCache, | ||
| var2Expression = _require.var2Expression; | ||
| var2Expression = _require.var2Expression, | ||
| expr2str = _require.expr2str, | ||
| getPackage = _require.getPackage; | ||
@@ -18,6 +20,26 @@ module.exports = function (_ref) { | ||
| if (parent.type === 'ObjectProperty' && parent.key === path.node) return; | ||
| if (parent.type === 'MemberExpression' && parent.object !== path.node) return; | ||
| if (parent.type === 'VariableDeclarator' && parent.id === path.node) return; | ||
| var identifier = expr2str(path.node); | ||
| if (parent.type === 'MemberExpression') { | ||
| var parentPath = path.parentPath; | ||
| while (parentPath && parentPath.node.type === 'MemberExpression') { | ||
| if (path.node === parentPath.node.property) identifier = "".concat(expr2str(parentPath.node.object), ".").concat(identifier); | ||
| path = parentPath; | ||
| parentPath = parentPath.parentPath; | ||
| } | ||
| } else if (parent.type === 'CallExpression' && expr2str(parent.callee) === identifier) { | ||
| if (identifier !== '__packageversion' || !parent.arguments.length || !t.isStringLiteral(parent.arguments[0])) return; | ||
| path = path.parentPath; | ||
| var packageName = expr2str(path.node.arguments[0]); | ||
| var packagePath = packageName && require.resolve(packageName); | ||
| var pkg = getPackage(packagePath); | ||
| path.replaceWith(t.stringLiteral(pkg ? pkg.version : '')); | ||
| return; | ||
| } | ||
| var defines = opts && opts.defines || {}; | ||
| var identifier = path.node.name; | ||
@@ -24,0 +46,0 @@ if (identifier === '__filename') { |
+160
-4
| "use strict"; | ||
| function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } | ||
| function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } | ||
| function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); } | ||
| 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 _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); } | ||
@@ -34,4 +42,2 @@ | ||
| ; | ||
| function fileExists(path) { | ||
@@ -85,2 +91,3 @@ try { | ||
| arr.forEach(function (v, i) { | ||
| // eslint-disable-next-line no-use-before-define | ||
| var expr = var2Expression(v, arr); | ||
@@ -97,3 +104,4 @@ if (!expr) return; | ||
| var props = Object.keys(obj).map(function (k) { | ||
| var v = obj[k]; | ||
| var v = obj[k]; // eslint-disable-next-line no-use-before-define | ||
| var expr = var2Expression(v, obj); | ||
@@ -135,2 +143,147 @@ if (!expr) return; | ||
| function expr2str(expr) { | ||
| if (!expr) return ''; | ||
| if (typeof expr === 'string') return expr; // if (expr.extra) return expr.extra.raw; | ||
| switch (expr.type) { | ||
| case 'JSXExpressionContainer': | ||
| return expr2str(expr.expression); | ||
| case 'MemberExpression': | ||
| case 'JSXMemberExpression': | ||
| // eslint-disable-next-line no-use-before-define | ||
| return memberExpr2Str(expr); | ||
| case 'Identifier': | ||
| case 'JSXIdentifier': | ||
| return expr.name; | ||
| case 'JSXNamespacedName': | ||
| return "".concat(expr.namespace.name, ":").concat(expr.name.name); | ||
| case 'ThisExpression': | ||
| return 'this'; | ||
| case 'NumericLiteral': | ||
| case 'BooleanLiteral': | ||
| case 'StringLiteral': | ||
| return expr.value; | ||
| case 'NullLiteral': | ||
| return 'null'; | ||
| case 'RegExpLiteral': | ||
| return "/".concat(expr.pattern, "/").concat(expr.flags); | ||
| case 'SpreadElement': | ||
| return "...".concat(expr2str(expr.argument)); | ||
| case 'BinaryExpression': | ||
| return "".concat(expr2str(expr.left), " ").concat(expr.operator, " ").concat(expr2str(expr.right)); | ||
| case 'UpdateExpression': | ||
| case 'UnaryExpression': | ||
| return "".concat(expr.prefix ? expr.operator : '').concat(expr2str(expr.argument)).concat(!expr.prefix ? expr.operator : ''); | ||
| case 'ConditionalExpression': | ||
| return "".concat(expr2str(expr.test), " ? ").concat(expr2str(expr.consequent), " : ").concat(expr2str(expr.alternate)); | ||
| case 'CallExpression': | ||
| return "".concat(expr2str(expr.callee), "(").concat(expr.arguments.map(function (a) { | ||
| return expr2str(a); | ||
| }).join(','), ")"); | ||
| case 'NewExpression': | ||
| return "new ".concat(expr2str(expr.callee), "(").concat(expr.arguments.map(function (a) { | ||
| return expr2str(a); | ||
| }).join(','), ")"); | ||
| case 'VariableDeclarator': | ||
| return "".concat(expr.id).concat(expr.init ? " = ".concat(expr2str(expr.init)) : ''); | ||
| case 'VariableDeclaration': | ||
| return "".concat(expr.kind, " ").concat(expr.declarations.map(function (d) { | ||
| return expr2str(d); | ||
| }), ";"); | ||
| case 'BlockStatement': | ||
| return "{".concat(expr2str(expr.body), "}"); | ||
| case 'TemplateLiteral': | ||
| // eslint-disable-next-line no-use-before-define | ||
| return temp2var(expr); | ||
| case 'TaggedTemplateExpression': | ||
| return "".concat(expr2str(expr2str(expr.tag))).concat(expr2str(expr.quasi)); | ||
| case 'FunctionExpression': | ||
| return "function ".concat(expr2str(expr.id), "(").concat(expr.params.map(function (a) { | ||
| return expr2str(a); | ||
| }).join(','), ")").concat(expr2str(expr.body)); | ||
| case 'AssignmentPattern': | ||
| return "".concat(expr2str(expr.left), " = ").concat(expr2str(expr.right)); | ||
| case 'ArrayExpression': | ||
| case 'ArrayPattern': | ||
| return "[".concat(expr.elements.map(function (v) { | ||
| return expr2str(v); | ||
| }).join(', '), "]"); | ||
| case 'ObjectProperty': | ||
| return "".concat(expr.computed ? "[".concat(expr2str(expr.key), "]") : expr2str(expr.key), ": ").concat(expr2str(expr.value)); | ||
| case 'ObjectMethod': | ||
| // eslint-disable-next-line | ||
| return "".concat(expr.kind !== 'method' ? "".concat(expr.kind, " ") : '').concat(expr2str(expr.key), "(").concat(expr.params.map(function (a) { | ||
| return expr2str(a); | ||
| }).join(', '), ")").concat(expr2str(expr.body)); | ||
| case 'ObjectPattern': | ||
| case 'ObjectExpression': | ||
| return "{".concat(expr.properties.map(function (v) { | ||
| return expr2str(v); | ||
| }).join(', '), "}"); | ||
| default: | ||
| return ''; | ||
| } | ||
| } | ||
| function temp2var(expr) { | ||
| var arr = [].concat(_toConsumableArray(expr.expressions), _toConsumableArray(expr.quasis)).sort(function (a, b) { | ||
| return a.start - b.start; | ||
| }); | ||
| var ret = ''; | ||
| arr.forEach(function (v) { | ||
| if (v.type === 'TemplateElement') ret += v.value.raw;else ret += '${' + expr2str(v) + '}'; | ||
| }); | ||
| return '`' + ret + '`'; | ||
| } | ||
| function memberExpr2Str(expr) { | ||
| var objStr; | ||
| var object = expr.object; | ||
| if (!object) return String(expr.value); | ||
| switch (expr.object.type) { | ||
| case 'MemberExpression': | ||
| case 'JSXMemberExpression': | ||
| objStr = memberExpr2Str(expr.object); | ||
| break; | ||
| default: | ||
| objStr = expr2str(expr.object); | ||
| } | ||
| var propIsMember = expr.property.type === 'MemberExpression'; | ||
| var propStr = expr2str(expr.property); | ||
| return objStr + (objStr && !propIsMember ? '.' : '') + (propIsMember ? "[".concat(propStr, "]") : propStr); | ||
| } | ||
| function getPackage(filename) { | ||
| var configPath = filename && getConfigPath(filename); | ||
| if (configPath) return require(configPath); | ||
| } | ||
| module.exports = { | ||
@@ -140,3 +293,6 @@ getConstCache: getConstCache, | ||
| arr2Expression: arr2Expression, | ||
| obj2Expression: obj2Expression | ||
| obj2Expression: obj2Expression, | ||
| expr2str: expr2str, | ||
| getConfigPath: getConfigPath, | ||
| getPackage: getPackage | ||
| }; |
+1
-1
| { | ||
| "name": "babel-plugin-define-variables", | ||
| "version": "0.0.1", | ||
| "version": "0.0.2", | ||
| "description": "a babel define vars that like webpack.DefinePlugin", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
+21
-5
@@ -26,5 +26,4 @@ # babel-plugin-define-variables | ||
| defines: { | ||
| a: 1, | ||
| b: 'str', | ||
| c: new Date(), | ||
| 'process.env.BUILD_ENV': process.env.BUILD_ENV, | ||
| 'process.env.NODE_ENV': process.env.NODE_ENV, | ||
| } | ||
@@ -40,12 +39,29 @@ } | ||
| - __filename | ||
| - __filename | ||
| the filename of code file than relative of `package.json` path that current project. | ||
| - __dirname | ||
| the dirname of code file than relative of `package.json` path that current project. | ||
| - __now | ||
| the time that build moment. format: 'yyyy-MM-dd hh:mm:ss' | ||
| - __timestamp | ||
| the timestamp that build moment. | ||
| - __packagename | ||
| - __packageversion | ||
| the package name of this project. | ||
| - __packageversion | ||
| the package version of this project. you can also use like this: | ||
| ```js | ||
| __packageversion('react'); | ||
| ``` | ||
| that you will get version of react; |
+25
-5
| const { | ||
| getConstCache, | ||
| var2Expression | ||
| var2Expression, | ||
| expr2str, | ||
| getPackage | ||
| } = require('./utils'); | ||
@@ -9,11 +11,29 @@ | ||
| function IdentifierVisitor(path, { opts, cache }) { | ||
| const parent = path.parent; | ||
| let parent = path.parent; | ||
| if (!parent) return; | ||
| if (['FunctionDeclaration', 'ClassMethod', 'ObjectMethod'].includes(parent.type)) return; | ||
| if (parent.type === 'ObjectProperty' && parent.key === path.node) return; | ||
| if (parent.type === 'MemberExpression' && parent.object !== path.node) return; | ||
| if (parent.type === 'VariableDeclarator' && parent.id === path.node) return; | ||
| let identifier = expr2str(path.node); | ||
| if (parent.type === 'MemberExpression') { | ||
| let parentPath = path.parentPath; | ||
| while (parentPath && parentPath.node.type === 'MemberExpression') { | ||
| if (path.node === parentPath.node.property) identifier = `${expr2str(parentPath.node.object)}.${identifier}`; | ||
| path = parentPath; | ||
| parentPath = parentPath.parentPath; | ||
| } | ||
| } else if (parent.type === 'CallExpression' && expr2str(parent.callee) === identifier) { | ||
| if (identifier !== '__packageversion' | ||
| || !parent.arguments.length | ||
| || !t.isStringLiteral(parent.arguments[0])) return; | ||
| path = path.parentPath; | ||
| let packageName = expr2str(path.node.arguments[0]); | ||
| let packagePath = packageName && require.resolve(packageName); | ||
| let pkg = getPackage(packagePath); | ||
| path.replaceWith(t.stringLiteral(pkg ? pkg.version : '')); | ||
| return; | ||
| } | ||
| const defines = (opts && opts.defines) || {}; | ||
| const identifier = path.node.name; | ||
| if (identifier === '__filename') { | ||
@@ -60,2 +80,2 @@ path.replaceWith(t.stringLiteral(cache.filename)); | ||
| }; | ||
| }; | ||
| }; |
+110
-3
@@ -24,3 +24,3 @@ const t = require('@babel/types'); | ||
| return fmt; | ||
| }; | ||
| } | ||
@@ -75,2 +75,3 @@ function fileExists(path) { | ||
| arr.forEach((v, i) => { | ||
| // eslint-disable-next-line no-use-before-define | ||
| let expr = var2Expression(v, arr); | ||
@@ -88,2 +89,3 @@ if (!expr) return; | ||
| let v = obj[k]; | ||
| // eslint-disable-next-line no-use-before-define | ||
| let expr = var2Expression(v, obj); | ||
@@ -114,2 +116,104 @@ if (!expr) return; | ||
| function expr2str(expr) { | ||
| if (!expr) return ''; | ||
| if (typeof expr === 'string') return expr; | ||
| // if (expr.extra) return expr.extra.raw; | ||
| switch (expr.type) { | ||
| case 'JSXExpressionContainer': | ||
| return expr2str(expr.expression); | ||
| case 'MemberExpression': | ||
| case 'JSXMemberExpression': | ||
| // eslint-disable-next-line no-use-before-define | ||
| return memberExpr2Str(expr); | ||
| case 'Identifier': | ||
| case 'JSXIdentifier': | ||
| return expr.name; | ||
| case 'JSXNamespacedName': | ||
| return `${expr.namespace.name}:${expr.name.name}`; | ||
| case 'ThisExpression': | ||
| return 'this'; | ||
| case 'NumericLiteral': | ||
| case 'BooleanLiteral': | ||
| case 'StringLiteral': | ||
| return expr.value; | ||
| case 'NullLiteral': | ||
| return 'null'; | ||
| case 'RegExpLiteral': | ||
| return `/${expr.pattern}/${expr.flags}`; | ||
| case 'SpreadElement': | ||
| return `...${expr2str(expr.argument)}`; | ||
| case 'BinaryExpression': | ||
| return `${expr2str(expr.left)} ${expr.operator} ${expr2str(expr.right)}`; | ||
| case 'UpdateExpression': | ||
| case 'UnaryExpression': | ||
| return `${expr.prefix ? expr.operator : ''}${expr2str(expr.argument)}${!expr.prefix ? expr.operator : ''}`; | ||
| case 'ConditionalExpression': | ||
| return `${expr2str(expr.test)} ? ${expr2str(expr.consequent)} : ${expr2str(expr.alternate)}`; | ||
| case 'CallExpression': | ||
| return `${expr2str(expr.callee)}(${expr.arguments.map(a => expr2str(a)).join(',')})`; | ||
| case 'NewExpression': | ||
| return `new ${expr2str(expr.callee)}(${expr.arguments.map(a => expr2str(a)).join(',')})`; | ||
| case 'VariableDeclarator': | ||
| return `${expr.id}${expr.init ? ` = ${expr2str(expr.init)}` : ''}`; | ||
| case 'VariableDeclaration': | ||
| return `${expr.kind} ${expr.declarations.map(d => expr2str(d))};`; | ||
| case 'BlockStatement': | ||
| return `{${expr2str(expr.body)}}`; | ||
| case 'TemplateLiteral': | ||
| // eslint-disable-next-line no-use-before-define | ||
| return temp2var(expr); | ||
| case 'TaggedTemplateExpression': | ||
| return `${expr2str(expr2str(expr.tag))}${expr2str(expr.quasi)}`; | ||
| case 'FunctionExpression': | ||
| return `function ${expr2str(expr.id)}(${expr.params.map(a => expr2str(a)).join(',')})${expr2str(expr.body)}`; | ||
| case 'AssignmentPattern': | ||
| return `${expr2str(expr.left)} = ${expr2str(expr.right)}`; | ||
| case 'ArrayExpression': | ||
| case 'ArrayPattern': | ||
| return `[${expr.elements.map(v => expr2str(v)).join(', ')}]`; | ||
| case 'ObjectProperty': | ||
| return `${expr.computed ? `[${expr2str(expr.key)}]` : expr2str(expr.key)}: ${expr2str(expr.value)}`; | ||
| case 'ObjectMethod': | ||
| // eslint-disable-next-line | ||
| return `${expr.kind !== 'method' ? `${expr.kind} ` : ''}${expr2str(expr.key)}(${expr.params.map(a => expr2str(a)).join(', ')})${expr2str(expr.body)}`; | ||
| case 'ObjectPattern': | ||
| case 'ObjectExpression': | ||
| return `{${expr.properties.map(v => expr2str(v)).join(', ')}}`; | ||
| default: return ''; | ||
| } | ||
| } | ||
| function temp2var(expr) { | ||
| let arr = [...expr.expressions, ...expr.quasis].sort((a, b) => a.start - b.start); | ||
| let ret = ''; | ||
| arr.forEach(v => { | ||
| if (v.type === 'TemplateElement') ret += v.value.raw; | ||
| else ret += '${' + expr2str(v) + '}'; | ||
| }); | ||
| return '`' + ret + '`'; | ||
| } | ||
| function memberExpr2Str(expr) { | ||
| let objStr; | ||
| const object = expr.object; | ||
| if (!object) return String(expr.value); | ||
| switch (expr.object.type) { | ||
| case 'MemberExpression': | ||
| case 'JSXMemberExpression': | ||
| objStr = memberExpr2Str(expr.object); | ||
| break; | ||
| default: | ||
| objStr = expr2str(expr.object); | ||
| } | ||
| let propIsMember = expr.property.type === 'MemberExpression'; | ||
| let propStr = expr2str(expr.property); | ||
| return objStr + (objStr && !propIsMember ? '.' : '') + (propIsMember ? `[${propStr}]` : propStr); | ||
| } | ||
| function getPackage(filename) { | ||
| let configPath = filename && getConfigPath(filename); | ||
| if (configPath) return require(configPath); | ||
| } | ||
| module.exports = { | ||
@@ -119,3 +223,6 @@ getConstCache, | ||
| arr2Expression, | ||
| obj2Expression | ||
| } | ||
| obj2Expression, | ||
| expr2str, | ||
| getConfigPath, | ||
| getPackage | ||
| }; |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
25629
81.47%575
80.25%66
34.69%7
75%