|
|
@@ -0,0 +1,83 @@
|
|
|
+const fs = require('fs');
|
|
|
+const path = require('path');
|
|
|
+const t = require('@babel/types');
|
|
|
+const {parse} = require('@babel/parser');
|
|
|
+const {default: traverse} = require('@babel/traverse');
|
|
|
+const {default: generate} = require('@babel/generator');
|
|
|
+
|
|
|
+const PKGS = 'packages';
|
|
|
+const emptyLine = '/*hr*/';
|
|
|
+const nutMainFile = path.join(__dirname, '../src/nutui.js');
|
|
|
+const nutTypings = path.join(__dirname, '../types/nutui.d.ts');
|
|
|
+
|
|
|
+function transformCodes(codes, visitor) {
|
|
|
+ const ast = parse(codes, {
|
|
|
+ sourceType: "module"
|
|
|
+ });
|
|
|
+ traverse(ast, visitor);
|
|
|
+ const {code} = generate(ast, { /* options */ }, codes);
|
|
|
+ return code;
|
|
|
+}
|
|
|
+
|
|
|
+function insertImports(pkg) {
|
|
|
+ const lowername = pkg.toLowerCase();
|
|
|
+ this.insertBefore(
|
|
|
+ t.importDeclaration([
|
|
|
+ t.importDefaultSpecifier(t.identifier(pkg))
|
|
|
+ ],
|
|
|
+ t.stringLiteral(`./packages/${lowername}/index.js`))
|
|
|
+ );
|
|
|
+ this.insertBefore(
|
|
|
+ t.importDeclaration([], t.stringLiteral(`./packages/${lowername}/${lowername}.scss`))
|
|
|
+ );
|
|
|
+ this.insertBefore(t.stringLiteral(emptyLine));
|
|
|
+}
|
|
|
+
|
|
|
+function createProp(pkg) {
|
|
|
+ return t.objectProperty(t.identifier(pkg), t.identifier(pkg));
|
|
|
+}
|
|
|
+
|
|
|
+function addToExport(pkg, init) {
|
|
|
+ init.properties.push(createProp(pkg));
|
|
|
+ this.replaceWith(t.variableDeclaration('const', [
|
|
|
+ t.variableDeclarator(t.identifier(PKGS), init)
|
|
|
+ ]));
|
|
|
+}
|
|
|
+
|
|
|
+function addPkgDeclare(pkg) {
|
|
|
+ const codes = fs.readFileSync(nutMainFile).toString();
|
|
|
+ const visitor = {
|
|
|
+ VariableDeclaration: function(p) {
|
|
|
+ const {node} = p;//console.log(Object.keys(p.__proto__))
|
|
|
+ if(node) {
|
|
|
+ const {declarations = []} = node;
|
|
|
+ if(declarations.length) {
|
|
|
+ for(const {id, init} of declarations) {
|
|
|
+
|
|
|
+ if(id.name === PKGS && init.properties && init.properties.length) {
|
|
|
+ const props = init.properties.filter(({key}) => key.name.toLowerCase() === pkg.toLowerCase());
|
|
|
+ if(!props.length) {
|
|
|
+ insertImports.call(p, pkg);
|
|
|
+ addToExport.call(p, pkg, init);
|
|
|
+ p.insertAfter(t.stringLiteral(emptyLine));
|
|
|
+ p.stop();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const code = transformCodes(codes, visitor);
|
|
|
+ return code;
|
|
|
+}
|
|
|
+
|
|
|
+function createPkgDeclare(pkg) {
|
|
|
+ const code = addPkgDeclare(pkg);
|
|
|
+ fs.writeFileSync(nutMainFile, code.replace(/"\/\*hr\*\/"/g, ''));
|
|
|
+ fs.appendFileSync(nutTypings, `export declare class ${pkg} extends UIComponent {}\n`);
|
|
|
+}
|
|
|
+
|
|
|
+module.exports = createPkgDeclare;
|