babel-plugin-mettle 0.9.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- module.exports=function({types:n}){function e(t){const o=function(e){return e.node.id?e.node.id.name:n.isVariableDeclarator(e.parent)?e.parent.id.name:n.isAssignmentExpression(e.parent)?null==(t=e.parent.left.property)?void 0:t.name:n.isProperty(e.parent)?e.parent.key.name:null;var t}(t);if((r=o)&&/^[A-Z]/.test(r)){var r;if(t.isArrowFunctionExpression()&&!n.isBlockStatement(t.node.body)){const e=n.blockStatement([n.returnStatement(t.node.body)]);t.node.body=e}t.traverse({ReturnStatement(e){if(e.getFunctionParent()===t&&e.node.argument){const t=n.functionExpression(null,[],n.blockStatement([n.returnStatement(e.node.argument)]));e.node.argument=t}},FunctionDeclaration(n){n!==t&&(e(n),n.skip())},FunctionExpression(n){n!==t&&(e(n),n.skip())},ArrowFunctionExpression(n){n!==t&&(e(n),n.skip())}})}}return{name:"babel-plugin-mettle",visitor:{FunctionDeclaration(n){e(n)},FunctionExpression(n){e(n)},ArrowFunctionExpression(n){e(n)}}}};
1
+ var e;const n=require("@babel/traverse"),t=null!=(e=n.default)?e:n,i=(e,n)=>{let t=n;for(;e.isParenthesizedExpression(t);)t=t.expression;return t},r=(e,n)=>{const t=i(e,n);return e.isArrowFunctionExpression(t)||e.isFunctionExpression(t)},o=(e,n)=>n.some(n=>{if(!e.isReturnStatement(n))return!1;const t=i(e,n.argument);if(e.isArrowFunctionExpression(t)||e.isJSXElement(t)||e.isJSXFragment(t))return!0;if(e.isFunctionExpression(t)){const n=t.body;if(e.isBlockStatement(n)&&1===n.body.length){const t=n.body[0];if(e.isReturnStatement(t)&&t.argument){const n=i(e,t.argument);return e.isJSXElement(n)||e.isJSXFragment(n)}}}return!1}),s=(e,n)=>{const t=i(e,n);if(e.isJSXElement(t)||e.isJSXFragment(t))return!0;if(e.isArrowFunctionExpression(t)){const n=t.body;return e.isBlockStatement(n)?o(e,n.body):s(e,n)}return!!e.isFunctionExpression(t)&&!!e.isBlockStatement(t.body)&&o(e,t.body.body)},a=(e,n)=>!(!e.isArrowFunctionExpression(n)&&!e.isFunctionExpression(n))&&(e.isBlockStatement(n.body)?o(e,n.body.body):!!e.isArrowFunctionExpression(n)&&s(e,n.body));function d(e,n){let t=!1;return n.traverse({VariableDeclarator(i){var r;if((null==(r=i.getFunctionParent())?void 0:r.node)!==n.node)return;const o=i.node.init;e.isCallExpression(o)&&e.isIdentifier(o.callee)&&"$signal"===o.callee.name&&(t=!0,i.stop())}}),t}function l(e,n){const t=e.getFunctionParent();return null!=t&&t.node===n.node}const c=(e,n,i,r)=>{const o=new Set;return e.isBlockStatement(n.body)&&r?(t(r,{ReturnStatement(t){var r;if((null==(r=t.getFunctionParent())?void 0:r.node)!==n)return;const s=t.node.argument;if(s&&e.isObjectExpression(s))for(const n of s.properties){if(!e.isObjectProperty(n)||n.computed||!e.isIdentifier(n.key))continue;const t=n.key.name;i.has(t)&&(n.shorthand||e.isIdentifier(n.value)&&n.value.name===t)&&o.add(t)}}}),o):o},f=(e,n)=>{const t=n.node.body;return e.isBlockStatement(t)&&d(e,n)&&!o(e,t.body)};module.exports=function(e){const n=e.types,s={include:/\.(jsx|js|mjs|tsx|ts)$/,excludeVars:["window","document","console","this"],restrictToTemplateReach:!0},u=e=>{if(n.isJSXElement(e)||n.isJSXFragment(e))return!0;if(n.isCallExpression(e)&&n.isIdentifier(e.callee)){const n=e.callee.name;return"_jsx"===n||"_jsxs"===n||"jsx"===n||"jsxs"===n||"jsxDEV"===n}return!1};function p(e){const t=function(e){const t=e.node;if(n.isIdentifier(t.id))return t.id.name;const i=e.parent;if(n.isVariableDeclarator(i)&&n.isIdentifier(i.id))return i.id.name;if(n.isAssignmentExpression(i)){const e=i.left;return n.isIdentifier(e)?e.name:n.isMemberExpression(e)&&!e.computed&&n.isIdentifier(e.property)?e.property.name:n.isMemberExpression(e)&&e.computed&&n.isStringLiteral(e.property)?e.property.value:null}if(n.isProperty(i))return!i.computed&&n.isIdentifier(i.key)?i.key.name:!i.computed&&n.isStringLiteral(i.key)||i.computed&&n.isStringLiteral(i.key)?i.key.value:null;if(n.isExportDefaultDeclaration(i))return"Default";if(n.isClassMethod(i)||n.isClassPrivateMethod(i)){const e=i.key;return n.isIdentifier(e)?e.name:n.isStringLiteral(e)?e.value:null}return n.isClassProperty(i)&&!i.computed&&n.isIdentifier(i.key)?i.key.name:null}(e);if((o=t)&&/^[A-Z]/.test(o)){var o;if(e.isArrowFunctionExpression()){const t=e.get("body");if(t.isExpression()&&!r(n,t.node)){const r=t.node,o=i(n,r);u(o)&&(e.node.body=n.blockStatement([n.returnStatement(n.functionExpression(null,[],n.blockStatement([n.returnStatement(r)])))]))}}e.traverse({ReturnStatement(t){var o;if((null==(o=t.getFunctionParent())?void 0:o.node)===e.node&&t.node.argument){const e=t.node.argument;if(r(n,e))return;const o=i(n,e);if(!u(o))return;const s=n.functionExpression(null,[],n.blockStatement([n.returnStatement(e)]));t.node.argument=s}},FunctionDeclaration(n){n.node!==e.node&&(p(n),n.skip())},FunctionExpression(n){n.node!==e.node&&(p(n),n.skip())},ArrowFunctionExpression(n){n.node!==e.node&&(p(n),n.skip())}})}}return{name:"babel-plugin-mettle",visitor:{Program:{exit(e,i){const r="string"==typeof i.file.opts.filename&&i.file.opts.filename||"string"==typeof i.filename&&i.filename||"";if("string"==typeof(u=r)&&u&&u.replace(/\\/g,"/").includes("/node_modules/"))return;var u;if(!s.include.test(r))return;const m=i.file.ast;t(m,{FunctionDeclaration(e){p(e)},FunctionExpression(e){p(e)},ArrowFunctionExpression(e){p(e)}});let g=!1,x=!1,v=[],b=null,E=null,I=null;try{const e=[],i=new Set,r=n=>{const t=n.node;i.has(t)||(i.add(t),e.push(n))};if(t(m,{ImportDeclaration(e){if(v.push(e),"mettle"===e.node.source.value)for(const i of e.node.specifiers){var t;if(!n.isImportSpecifier(i))continue;const e=null==(t=i.imported)?void 0:t.name,r=i.local.name;"signal"===e&&(g=!0,b=r),"computed"===e&&(x=!0,E=r),"effect"===e&&(I=r)}},FunctionDeclaration(e){n.isBlockStatement(e.node.body)&&(o(n,e.node.body.body)||d(n,e))&&r(e)},VariableDeclarator(e){const t=e.node.init;if(t&&(n.isArrowFunctionExpression(t)||n.isFunctionExpression(t))){const i=e.get("init");(a(n,t)||d(n,i))&&r(i)}},ExportDefaultDeclaration(e){const t=e.node.declaration;if(n.isFunctionDeclaration(t)){const i=e.get("declaration");if(!n.isBlockStatement(t.body))return;(o(n,t.body.body)||d(n,i))&&r(i)}else if(n.isArrowFunctionExpression(t)){const i=e.get("declaration");(a(n,t)||d(n,i))&&r(i)}},ExportNamedDeclaration(e){const t=e.node.declaration;if(t)if(n.isFunctionDeclaration(t)){const i=e.get("declaration");if(!n.isBlockStatement(t.body))return;(o(n,t.body.body)||d(n,i))&&r(i)}else if(n.isVariableDeclaration(t))for(const t of e.get("declaration").get("declarations")){const e=t.node.init;if(e&&(n.isArrowFunctionExpression(e)||n.isFunctionExpression(e))){const i=t.get("init");(a(n,e)||d(n,i))&&r(i)}}}}),0===e.length)return;e.sort((e,t)=>{const i=f(n,e);return i===f(n,t)?0:i?-1:1});const u=new Map,p=new WeakMap;let w=!1;const k=()=>n.identifier(null!=b?b:"signal"),D=()=>n.identifier(null!=E?E:"computed"),j=()=>null!=E?E:"computed",A=()=>null!=I?I:"effect",B=new Set(e.map(e=>e.node)),P=new Map,C=new Map;t(m,{VariableDeclarator(e){var t;const i=e.getFunctionParent();if(!i||!B.has(i.node))return;const r=i.node;if(!n.isIdentifier(e.node.id))return;const o=e.node.init;if(n.isCallExpression(o)&&n.isIdentifier(o.callee)&&"$signal"===o.callee.name){let n=P.get(r);n||(n=[],P.set(r,n)),n.push(e)}const a=e.parentPath.node.kind;if("const"!==a&&"let"!==a&&"var"!==a)return;const d=e.node.id.name;if(!s.excludeVars.includes(d)&&(null==o||null==(t=o.callee)?void 0:t.name)===j()){let e=C.get(r);e||(e=new Set,C.set(r,e)),e.add(d)}}});for(const t of e){var S;const e=new Set,i=f(n,t),r=new Set;for(const e of null!=(y=P.get(t.node))?y:[]){var y;if(!n.isIdentifier(e.node.id))continue;const t=e.node.id.name,i=e.node.init.arguments;i.length>1&&p.set(e.node,i),e.node.init=0===i.length?n.identifier("undefined"):i[0],r.add(t)}const o=null!=(S=C.get(t.node))?S:new Set,a=new Set;for(const n of r)e.add(n);if(!s.restrictToTemplateReach||i)for(const e of o)a.add(e);else{const e=(e,n)=>{null!=e&&e.node&&(e.isIdentifier()?n.add(e.node.name):e.traverse({Identifier(e){e.isReferencedIdentifier()&&n.add(e.node.name)}}))},i=e=>{let n=e;for(;null!=(t=n)&&t.node;){for(var t;n.isParenthesizedExpression();)n=n.get("expression");if(n.isFunctionExpression()||n.isArrowFunctionExpression()){const e=n.get("body");if(e.isBlockStatement()&&1===e.node.body.length){const t=e.get("body.0");if(t.isReturnStatement()&&t.node.argument){n=t.get("argument");continue}}else if(n.isArrowFunctionExpression()&&e.isExpression()){n=e;continue}}break}return n},r=e=>n.isIdentifier(e)&&("_jsx"===e.name||"_jsxs"===e.name||"jsx"===e.name||"jsxs"===e.name),s=(t,i)=>{null!=t&&t.node&&t.traverse({JSXExpressionContainer(n){const t=n.get("expression");t.isJSXEmptyExpression()||e(t,i)},JSXSpreadAttribute(n){e(n.get("argument"),i)},JSXAttribute(t){if(n.isJSXExpressionContainer(t.node.value)){const n=t.get("value").get("expression");n.isJSXEmptyExpression()||e(n,i)}},CallExpression(t){if(!r(t.node.callee))return;if(t.node.arguments.length<2)return;const o=t.get("arguments.1");if(null!=o&&o.node&&n.isObjectExpression(o.node))for(const t of o.get("properties")){const r=t.node;if(!n.isObjectProperty(r)||r.computed)continue;const o=r.key;if("children"!==(n.isIdentifier(o)?o.name:n.isStringLiteral(o)?o.value:null))continue;const s=t.get("value");if(s.isArrayExpression())for(const n of s.get("elements"))n.node&&e(n,i);else e(s,i)}}})},d=new Map;t.traverse({FunctionDeclaration(e){var n;(null==(n=e.getFunctionParent())?void 0:n.node)===t.node&&e.node.id&&d.set(e.node.id.name,e)},VariableDeclarator(e){if(!l(e,t))return;const i=e.get("init");i&&(i.isFunctionExpression()||i.isArrowFunctionExpression())&&n.isIdentifier(e.node.id)&&d.set(e.node.id.name,i)}});const c=new Set;t.get("body").traverse({ReturnStatement(e){var n;if((null==(n=e.getFunctionParent())?void 0:n.node)!==t.node)return;const r=e.get("argument");if(null==r||!r.node)return;const o=i(r);s(o,c)}});const f=new Set,u=[],p=e=>{e&&(o.has(e)&&a.add(e),d.has(e)&&!f.has(e)&&(f.add(e),u.push(e)))};for(const e of c)p(e);for(;u.length;){const e=u.shift(),n=d.get(e);n&&n.traverse({Identifier(e){if(!e.isReferencedIdentifier())return;const n=e.node.name;o.has(n)&&a.add(n),d.has(n)&&!f.has(n)&&(f.add(n),u.push(n))}})}}i&&e.size>0&&u.set(t.node,c(n,t.node,e,m));const d=new Set,v=new Map,I=t.get("body");if(I.isBlockStatement())for(const e of I.get("body"))if(e.isVariableDeclaration())for(const i of e.get("declarations")){const e=i.node.id;if(!n.isObjectPattern(e))continue;const r=i.node.init;if(!n.isCallExpression(r)||!n.isIdentifier(r.callee))continue;const o=t.scope.getBinding(r.callee.name);if(!o)continue;let s=null;if(o.path.isFunctionDeclaration())s=o.path.node;else if(o.path.isVariableDeclarator()){const e=o.path.node.init;(n.isArrowFunctionExpression(e)||n.isFunctionExpression(e))&&(s=e)}let a=null;if(s&&(a=u.get(s),!a||0===a.size)){const e=r.callee.name;for(const[t,i]of u){var h;if(null!=i&&i.size&&n.isFunctionDeclaration(t)&&(null==(h=t.id)?void 0:h.name)===e){a=i;break}}}if(a&&0!==a.size)for(const t of e.properties){if(n.isRestElement(t))break;if(!n.isObjectProperty(t)||t.computed||!n.isIdentifier(t.key))continue;const e=t.key.name;if(a.has(e))if(t.shorthand)d.add(e),v.set(e,i.scope.getBinding(e));else if(n.isIdentifier(t.value)){const e=t.value.name;d.add(e),v.set(e,i.scope.getBinding(e))}}}if(0===e.size&&0===a.size&&0===d.size)continue;w=!0;const B=new Map;for(const e of null!=(F=P.get(t.node))?F:[]){var F;if(!n.isIdentifier(e.node.id))continue;const t=e.node.id.name,i=e.scope.getBinding(t);i&&B.set(t,i)}t.traverse({VariableDeclarator(e){if(!l(e,t))return;if(!n.isIdentifier(e.node.id))return;const i=e.node.id.name;if(!a.has(i))return;const r=e.node.init;if(!n.isCallExpression(r)||!n.isIdentifier(r.callee))return;if(r.callee.name!==j())return;const o=e.scope.getBinding(i);o&&B.set(i,o)}});for(const[e,n]of v)n&&B.set(e,n);const J=n=>e.has(n)||a.has(n)||d.has(n),X=(e,n)=>{const t=B.get(e);return!!t&&n.scope.getBinding(e)===t},M=e=>{const t=e.node;n.isIdentifier(t)&&J(t.name)&&e.isReferencedIdentifier()&&X(t.name,e)&&(n.isCallExpression(e.parent)&&e.parent.callee===t||n.isAssignmentExpression(e.parent)&&e.parent.left===t||n.isUpdateExpression(e.parent)&&e.parent.argument===t||n.isMemberExpression(e.parent)&&e.parent.object===t&&n.isIdentifier(e.parent.property)&&"value"===e.parent.property.name||e.replaceWith(n.memberExpression(t,n.identifier("value"))))},R={ForStatement(e){const n=e.get("init"),t=e.get("test"),i=e.get("update");n.node&&n.traverse({Identifier:M}),t.node&&t.traverse({Identifier:M}),i.node&&i.traverse({Identifier:M})},ForOfStatement(e){e.get("right").traverse({Identifier:M})},ForInStatement(e){e.get("right").traverse({Identifier:M})},WhileStatement(e){e.get("test").traverse({Identifier:M})},DoWhileStatement(e){e.get("test").traverse({Identifier:M})},SwitchStatement(e){e.get("discriminant").traverse({Identifier:M})}};t.traverse({...R,ReturnStatement(e){var n;if((null==(n=e.getFunctionParent())?void 0:n.node)!==t.node)return;const i=e.get("argument");i.node&&(i.isIdentifier()?M(i):i.traverse({Identifier:M}))},ExpressionStatement(e){var n;if((null==(n=e.getFunctionParent())?void 0:n.node)!==t.node)return;const i=e.get("expression");i.node&&(i.isIdentifier()?M(i):i.traverse({Identifier:M}))},JSXExpressionContainer(e){const n=e.get("expression");n.isIdentifier()?M(n):n.traverse({Identifier:M})},CallExpression(e){let t=null;if(n.isIdentifier(e.node.callee)&&(t=e.node.callee.name),null==t||t!==j()&&t!==A())for(let n=0;n<e.node.arguments.length;n++){const t=e.get(`arguments.${n}`);t.node&&t.traverse({Identifier:M})}else{const n=e.get("arguments.0");if(null!=n&&n.isFunction()){const e=n.get("body");e.isBlockStatement()?e.traverse({Identifier:M}):e.isIdentifier()?M(e):e.traverse({Identifier:M})}for(let n=1;n<e.node.arguments.length;n++){const t=e.get(`arguments.${n}`);t.node&&t.traverse({Identifier:M})}}},BinaryExpression:{enter(e){e.traverse({Identifier:M})}},LogicalExpression:{enter(e){e.traverse({Identifier:M})}},ConditionalExpression:{enter(e){e.traverse({Identifier:M})}},UnaryExpression:{enter(e){e.traverse({Identifier:M})}},MemberExpression(e){const{object:t,property:i}=e.node,r=e.get("object");n.isIdentifier(t)&&n.isIdentifier(i)&&"value"===i.name&&J(t.name)&&X(t.name,r)||n.isIdentifier(t)&&J(t.name)&&X(t.name,r)&&(e.node.object=n.memberExpression(t,n.identifier("value")))},AssignmentExpression(e){e.get("right").traverse({Identifier:M})},VariableDeclarator(e){if(!l(e,t))return;const n=e.get("init");n.node&&n.traverse({Identifier:M})}}),t.traverse({...R,AssignmentExpression(t){const i=t.get("left");if(i.isIdentifier()&&e.has(i.node.name))X(i.node.name,i)&&(t.node.left=n.memberExpression(i.node,n.identifier("value")));else if(i.isMemberExpression()){const r=i.node;if(n.isIdentifier(r.object)&&e.has(r.object.name)){const e=i.get("object");X(r.object.name,e)&&(t.node.left.object=n.memberExpression(r.object,n.identifier("value")))}}},UpdateExpression(t){const i=t.get("argument");i.isIdentifier()&&e.has(i.node.name)&&X(i.node.name,i)&&(t.node.argument=n.memberExpression(i.node,n.identifier("value")))}}),t.traverse({VariableDeclarator(i){if(!l(i,t))return;if(!n.isIdentifier(i.node.id))return;if(!e.has(i.node.id.name))return;const r=i.node.init||n.identifier("undefined"),o=p.get(i.node);let s=!1;if(i.node.init){const n=i.get("init");if(n.isIdentifier()){const t=n.node.name,i=B.get(t);e.has(t)&&i&&n.scope.getBinding(t)===i&&(s=!0)}else n.traverse({Identifier(n){if(!n.isReferencedIdentifier())return;const t=n.node.name,i=B.get(t);e.has(t)&&i&&n.scope.getBinding(t)===i&&(s=!0)}})}o&&o.length>1?(i.node.init=n.callExpression(k(),o),null==b&&(g=!1)):s?(i.node.init=n.callExpression(D(),[n.arrowFunctionExpression([],r)]),null==E&&(x=!1)):(i.node.init=n.callExpression(k(),[r]),null==b&&(g=!1))}})}if(!w)return;const J=[];if(g||J.push(n.importSpecifier(n.identifier("signal"),n.identifier("signal"))),x||J.push(n.importSpecifier(n.identifier("computed"),n.identifier("computed"))),J.length>0){const e=v.find(e=>"mettle"===e.node.source.value);e?function(e,n,t){const i=new Set(n.node.specifiers.map(n=>{var t;return e.isImportSpecifier(n)?n.local.name:null==(t=n.local)?void 0:t.name}).filter(Boolean));for(const e of t)i.has(e.local.name)||(n.node.specifiers.push(e),i.add(e.local.name))}(n,e,J):m.program.body.unshift(n.importDeclaration(J,n.stringLiteral("mettle")))}}catch(e){console.error(`[babel-plugin-mettle] Transform failed: ${r}`,e)}}}}}};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "babel-plugin-mettle",
3
3
  "description": "A babel plugin for mettle.js",
4
- "version": "0.9.3",
4
+ "version": "1.1.0",
5
5
  "main": "dist/babel-plugin-mettle.js",
6
6
  "scripts": {
7
7
  "build": "microbundle src/index.js -f cjs --target node --compress --no-sourcemap"
@@ -11,7 +11,7 @@
11
11
  ],
12
12
  "repository": {
13
13
  "type": "git",
14
- "url": "https://github.com/maomincoding/babel-plugin-mettle"
14
+ "url": "git+https://github.com/maomincoding/babel-plugin-mettle.git"
15
15
  },
16
16
  "bugs": {
17
17
  "url": "https://github.com/maomincoding/babel-plugin-mettle/issues"
@@ -29,6 +29,12 @@
29
29
  ],
30
30
  "author": "maomincoding",
31
31
  "license": "MIT",
32
+ "peerDependencies": {
33
+ "@babel/core": "^7.0.0"
34
+ },
35
+ "dependencies": {
36
+ "@babel/traverse": "^7.29.0"
37
+ },
32
38
  "devDependencies": {
33
39
  "microbundle": "^0.15.1"
34
40
  }