UNPKG

11.1 kBPlain TextView Raw
1#!/usr/bin/env node
2"use strict";function _interopDefault(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var fs=_interopDefault(require("fs")),path=_interopDefault(require("path")),rimraf=_interopDefault(require("rimraf")),mkdirp=_interopDefault(require("mkdirp")),chalk=_interopDefault(require("chalk")),minimist=_interopDefault(require("minimist")),rollup=_interopDefault(require("rollup")),rp_babel=_interopDefault(require("rollup-plugin-babel")),lodash=require("lodash"),lodash__default=_interopDefault(lodash),babylon=_interopDefault(require("babylon")),types=_interopDefault(require("@babel/types")),core=_interopDefault(require("@babel/core")),prettifyXml=_interopDefault(require("prettify-xml"));function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var transform_1=createCommonjsModule(function(e){const t=require("@babel/traverse").default,n=require("@babel/generator").default,{transformSync:r}=core,{zip:s}=lodash__default,o={string:"String",number:"Number",bool:"Boolean",object:"Object",array:"Array"};var a;e.exports=(({id:e,code:i,dependedModules:p={},referencedBy:l=[],sourcePath:c})=>{const d=[],u=[],m={},y=[],f={},h={},b=[],g={},j={},v={type:"local_module"},x=function(){return"template"===v.type},E=function(){return"component"===v.type},_=function(){return"page"===v.type},S=function(){return"app"===v.type},k={TaggedTemplateExpression(e){const{tag:t,quasi:n}=e.node;/CSS|WXSS/.test(t.name)&&(v[t.name.toLowerCase()]=n.quasis[0].value.raw,e.remove())}},$={JSXOpeningElement(e){if(h[e.node.name.name]){const t=e.node.name.name;e.node.name.name="template";const r=e.node.attributes.reduce((e,t)=>{if("JSXSpreadAttribute"===t.type)e.push(`...${t.argument.name}`);else if("StringLiteral"===t.value.type)e.push(`${t.name.name}: '${t.value.value}'`);else if("JSXExpressionContainer"===t.value.type){const r=n(t.value.expression).code;if("Identifier"===t.value.expression.type&&r===t.name.name)e.push(`${r}`);else{if("Identifier"===t.value.expression.type&&r!==t.name.name)return e;e.push(`${t.name.name}: ${r}`)}}return e},[]).join(", ");e.node.attributes=[types.jSXAttribute(types.jSXIdentifier("is"),types.stringLiteral(t)),types.jSXAttribute(types.jSXIdentifier("data"),types.stringLiteral(`{{${r}}}`))],e.node.selfClosing=!1,e.parent.closingElement=types.jSXClosingElement(types.jSXIdentifier("template"))}},JSXExpressionContainer(e){e.node.expression=types.identifier(`{${n(e.node.expression).code}}`)},JSXAttribute(e){const{name:t,value:r}=e.node;if(e.node.name.name=/if|elif|else|for|key|for-index|for-item/.test(t.name)?`wx:${t.name}`:/^on(\w*)$/.test(t.name)?t.name.replace(/^on(\w*)$/,"bind$1").toLowerCase():t.name,!r||r.expression)if(r)if(types.isTemplateLiteral(r.expression))e.node.value=types.stringLiteral(s(r.expression.quasis.map(e=>e.value.raw),r.expression.expressions.map(e=>e.name)).reduce((e,[t,n])=>t||n?n?e+`${t}{{${n}}}`:e+t:e,""));else if(types.isObjectExpression(r.expression)){const t=n(r.expression,{concise:!0}).code;e.node.value=types.stringLiteral(`{${t}}`)}else if(/^bind/.test(e.node.name.name)){const t=n(r.expression).code;e.node.value=types.stringLiteral(t.replace("this.",""))}else{const t=n(r.expression).code;e.node.value=types.stringLiteral(`{{${t}}}`)}else{if(/else/.test(t.name))return;e.node.value=types.stringLiteral("{{true}}")}}},P={CallExpression(e){types.isMemberExpression(e.node.callee)&&"setState"===e.node.callee.property.name&&(e.node.callee.property.name="setData")},ClassProperty(e){if(/state/.test(e.node.key.name))d.push(types.objectProperty(types.identifier("data"),e.node.value));else if(E()&&/defaultProps/.test(e.node.key.name))e.node.value.properties.forEach(e=>{const t=e.value,n=e.key.name;m[n]=m[n]||{},m[n].value=t});else if(E()&&/propTypes/.test(e.node.key.name))e.node.value.properties.forEach(e=>{const t=e.value,n=e.key.name;if(m[n]=m[n]||{},"PropTypes"===t.object.name){const e=o[t.property.name];if(!e)return;m[n].type=types.identifier(e)}});else if(S()&&/window|tabBar|networkTimeout|debug/.test(e.node.key.name)){const t=n(e.node.value,{concise:!0,comments:!1,jsonCompatibleStrings:!0}).code.replace(/'/g,'"').replace(/([A-Za-z0-9_$]*):/g,'"$1":');j[e.node.key.name]=JSON.parse(t)}else d.push(types.objectProperty(types.identifier(e.node.key.name),e.node.value))},ClassMethod:{enter(e){if("render"!==e.node.key.name)if(/created|attached|ready|moved|detached/.test(e.node.key.name)){if(!E())return;const t=types.objectProperty(types.identifier(e.node.key.name),types.functionExpression(null,e.node.params,e.node.body));d.push(t)}else if(E()){const t=types.objectProperty(types.identifier(e.node.key.name),types.functionExpression(null,e.node.params,e.node.body));u.push(t)}else{const t=types.objectProperty(types.identifier(e.node.key.name),types.functionExpression(null,e.node.params,e.node.body));d.push(t)}},exit(e){if("render"===e.node.key.name){const t=e.node.body.body.find(e=>"ReturnStatement"===e.type);if(!t)return;"JSXElement"===t.argument.type&&(v.wxml=prettifyXml(n(t.argument,{concise:!0}).code,{indent:2}))}}},ImportDeclaration(t){const n=t.node.source.value;let r,s=t.node.specifiers.length?t.node.specifiers[0].local.name:"";if(e){const{dir:t}=path.parse(e),s=path.resolve(t,n);r=p[s]}else r=p[n];if(r)switch(r.type){case"page":{const{dir:e,name:r}=path.parse(n);y.push(path.join(e.replace(`.${path.sep}`,""),r,r)),t.remove();break}case"component":{const{dir:e,name:r}=path.parse(n),o=path.format({dir:e,name:r}),a=path.join("..",o,r);f[s]=a,g[path.join("..",o)]={type:"child"},t.remove();break}case"template":{const{dir:e,name:r}=path.parse(n),o=path.join("..",e,`${r}.wxml`);h[s]=o,t.remove();break}}else if(path.parse(n).dir){const e=`${n}.${path.extname(n)||"js"}`;t.node.source.value=e,b.push(t.node.source)}else{if(/weact/.test(n))return void t.remove();const r=path.format({dir:path.join(path.relative(path.dirname(e),c),"modules"),name:n,ext:".js"});t.node.source.value=r,b.push(t.node.source)}},ExportDefaultDeclaration:{enter(e){const{node:{declaration:t}}=e,{superClass:n}=t;if(types.isFunctionDeclaration(t)||types.isArrowFunctionExpression(t)){const e=t.body.body.find(types.isReturnStatement);if(!e)return;types.isJSXElement(e.argument)&&(v.type="template")}n&&/App|Page|Component/.test(n.name)&&(v.type=n.name.toLowerCase())},exit(e){const{node:{declaration:t}}=e,{superClass:r}=t;if(x()){const r=t.body.body.find(types.isReturnStatement);t.id&&(v.name=t.id.name),v.wxml=prettifyXml(`<template name="${v.name}">\n ${n(r.argument,{concise:!0}).code} \n</template>`,{indent:2}),e.remove()}if(E()){const e=[];l.forEach(function(e){const{dir:t,name:n}=path.parse(e),r=path.format({dir:t,name:n});g[r]={type:"parent"}}),Object.keys(g).forEach(t=>{if(/pages/.test(t))return;const{name:n}=path.parse(t),r=path.format({dir:t,name:n});e.push(types.objectProperty(types.stringLiteral(r),types.objectExpression([types.objectProperty(types.identifier("type"),types.stringLiteral(g[t].type))])))}),e.length&&d.push(types.objectProperty(types.identifier("relations"),types.objectExpression(e)))}const s=[];Object.keys(m).forEach(e=>{const{type:t,value:n}=m[e],r=[];r.push(types.objectProperty(types.identifier("type"),t)),n&&r.push(types.objectProperty(types.identifier("value"),n)),s.push(types.objectProperty(types.identifier(e),types.objectExpression(r)))}),u.length&&d.push(types.objectProperty(types.identifier("methods"),types.objectExpression(u))),s.length&&d.push(types.objectProperty(types.identifier("properties"),types.objectExpression(s))),r&&/App|Page|Component/.test(r.name)&&e.replaceWith(types.CallExpression(types.identifier(r.name),[types.objectExpression(d)]))}}},w=(a=i,babylon.parse(a,{babelrc:!1,sourceType:"module",plugins:["jsx","objectRestSpread","classProperties"]}));t(w,Object.assign({},P,$,k)),Object.keys(h).length&&(v.wxml=Object.entries(h).map(([,e])=>`<import src="${e}" />\n`).join("")+v.wxml);const O=S()?y.length?Object.assign({pages:y},j):Object.keys(j).length?j:void 0:E()?{component:!0,usingComponents:Object.keys(f).length?f:void 0}:_()&&Object.keys(f).length?{usingComponents:f}:void 0;return v.json=O&&JSON.stringify(O),b.forEach(function(e){(E()||_())&&(e.value=path.join("..",e.value))}),v.js=x()?null:r(n(w).code,{babelrc:!1,plugins:[["@babel/plugin-transform-modules-commonjs",{loose:!0,noInterop:!0}]]}).code.replace('"use strict";\n\n',""),v})}),transform_2=transform_1.transform;const error=(e,...t)=>console.log(chalk.red.bold(`[ERR] ${e}`,t)),INFO_TYPE={page:"页面",app:"应用",component:"组件",template:"模版",local_module:"模块",node_module:"NPM包"},info=(e,t,...n)=>console.log(chalk.cyanBright.bold(`[${INFO_TYPE[e]}]\t`),chalk.dim.bold(`${t}`,n)),command=minimist(process.argv.slice(2));function copyNodeModule(e,t){let n=path.resolve("node_modules",e,"dist",`${e}.js`);if(fs.existsSync(n)||(n=path.resolve("node_modules",e,`${e}.js`)),!fs.existsSync(n))return error(`无法加载 ${e}`);const r=path.join(t,"modules"),s=path.join(r,`${e}.js`);fs.existsSync(r)||mkdirp.sync(r),fs.existsSync(s)||fs.copyFileSync(n,s),info("node_module",path.relative("",n))}async function build(e,t){const n={input:e,external:["weact"],plugins:[rp_babel({exclude:"node_modules/**",babelrc:!1,presets:["@babel/preset-react"],plugins:["@babel/plugin-proposal-class-properties"]})],onwarn({code:e,source:n,importer:r,names:s,message:o,url:a}){switch(e){case"UNRESOLVED_IMPORT":return void copyNodeModule(n,t);case"UNUSED_EXTERNAL_IMPORT":case"NON_EXISTENT_EXPORT":return;default:error(o)}}},r=await rollup.rollup(n),s={},o={};return r.modules.forEach(function({id:e,dependencies:t,originalCode:n,resolvedIds:r}){if("rollupPluginBabelHelpers"===e)return;lodash.remove(t,e=>"rollupPluginBabelHelpers"===e),t.forEach(function(t){"rollupPluginBabelHelpers"!==t&&(Array.isArray(o[t])||(o[t]=[]),o[t].push(path.relative(t,e)))});const a=lodash.invert(r);s[e]={id:e,depended:t,code:n,resolved:a}}),{modules:s,referenced:o,main:r.modules[r.modules.length-1].id}}function writeOutput(e,t){const{id:n,type:r,js:s}=e,{target:o,src:a}=t,{name:i,dir:p}=path.parse(path.join(o,path.relative(a,n))),l=/page|component/.test(r)?path.resolve(p,i):p;r?(info(r,path.relative(a,n)),fs.existsSync(l)||mkdirp.sync(l),Object.entries(e).forEach(function([e,t]){if(t&&/json|js|wxml|wxss/.test(e)){const n=path.join(l,`${i}.${e}`);fs.writeFileSync(n,t)}})):error(n,s)}function gen(e,t,n,r,s){const{depended:o,code:a}=t[e];if(o.length){if(o.reduce((e,n)=>gen(n,t,e,r,s),n),!n[e]){const t=o.reduce((e,t)=>(e[t]=n[t])&&e,{});n[e]=Object.assign({id:e},transform_1({id:e,code:a,dependedModules:t,referencedBy:s[e],sourcePath:r.src})),writeOutput(n[e],r)}}else n[e]||(n[e]=Object.assign({id:e},transform_1({id:e,code:a,referencedBy:s[e],sourcePath:r.src})),writeOutput(n[e],r));return n}!async function(){const[e,t="./dist"]=command._;if(!e)return void error("No app.jsx");if(!t)return void error("No target project path");const n=fs.statSync(e).isDirectory()?path.join(e,"app.jsx"):e,r=path.isAbsolute(t)?t:path.resolve(t),{modules:s,referenced:o,main:a}=await build(n,r);gen(a,s,{},{target:r,src:path.parse(path.resolve(n)).dir},o)}();