| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- // 创建模板
- const inquirer = require('inquirer');
- // import { ROOT_PACKAGE_PATH } from '../util/dic';
- //const conf = require(ROOT_PACKAGE_PATH('src/config.json'));
- //import {a} from "./a.js"
- // import {nav} from '../src/config.js';
- // import { from } from 'core-js/fn/array';
- const path = require('path');
- const fs = require('fs');
- // const copy = require('copy');
- //const createPkgDeclare = require('./createPkgDeclare');
- // const t = require('@babel/types');
- // const { parse } = require('@babel/parser');
- // const { default: traverse } = require('@babel/traverse');
- // const { default: generate } = require('@babel/generator');
- var newCpt = {
- version: '1.0.0',
- name: '',
- type: '',
- chnName: '',
- desc: '',
- sort: '',
- showDemo: true,
- author: '',
- star: undefined
- };
- function init() {
- inquirer
- .prompt([
- {
- type: 'input',
- name: 'name',
- message: '组件英文名(每个单词的首字母都大写,如TextBox):',
- validate(value) {
- // let repeat = false;
- // for (var i = 0; i < nav.length; i++) {
- // for (var j = 0; j < nav[i].packages.length; j++) {
- // if (nav[i].packages[j].name === value) {
- // repeat = true;
- // }
- // }
- // }
- // if (repeat) {
- // return '该组件名已存在!';
- // }
- const pass = value && value.match(/^[A-Z]/);
- if (pass) {
- return true;
- }
- return '不能为空,且每个单词的首字母都要大写,如TextBox';
- }
- },
- {
- type: 'input',
- name: 'chnName',
- message: '组件中文名(十个字以内):',
- validate(value) {
- const pass = value && value.length <= 10;
- if (pass) {
- return true;
- }
- return '不能为空,且不能超过十个字符';
- }
- },
- {
- type: 'input',
- name: 'desc',
- message: '组件描述(五十个字以内):'
- },
- {
- type: 'rawlist',
- name: 'type',
- message: '请选择组件类型(输入编号):目前只支持组建模板',
- choices: ['component', 'filter', 'directive', 'method'],
- validate(value) {
- const pass = value && /^[1-4]$/.test(value);
- if (pass) {
- return true;
- }
- return '输入有误!请输入选项前编号';
- }
- },
- // {
- // type: 'rawlist',
- // name: 'sort',
- // message: '请选择组件分类(输入编号):',
- // // choices: sorts,
- // validate(value) {
- // const pass = /^[1-7]$/.test(value);
- // if (pass) {
- // return true;
- // }
- // return '输入有误!请输入选项前编号';
- // }
- // },
- // {
- // type: 'confirm',
- // name: 'showDemo',
- // message: '是否需要DEMO页面?',
- // default: true
- // },
- // {
- // type: 'confirm',
- // name: 'showTest',
- // message: '是否需要单元测试页面?',
- // default: true
- // },
- {
- type: 'input',
- name: 'author',
- message: '组件作者(可署化名):'
- }
- ])
- .then(function(answers) {
- // answers.sort = String(sorts.indexOf(answers.sort));
- newCpt = Object.assign(newCpt, answers);
- createNew();
- });
- }
- function createIndexJs() {
- const nameLc = newCpt.name.toLowerCase();
- const destPath = path.join('src/packages/' + nameLc);
- if (!fs.existsSync(destPath)) {
- fs.mkdirSync(destPath);
- }
- // copy(path.join(__dirname, './__template__/**.*'), destPath, function (err: any, file: any) {
- // if (err) {
- // console.log('拷贝__template__目录失败!');
- // }
- // createNew();
- // });
- if (newCpt.type == 'method') return;
- return new Promise((resolve, reject) => {
- // let content = `import ${newCpt.name} from './src/${nameLc}.vue';
- // ${newCpt.name}.install = function(Vue) {
- // Vue.${newCpt.type}(${newCpt.name}.name, ${newCpt.name});
- // };
- // export default ${newCpt.name}`;
- // let content2 = `${newCpt.name}.install = function(Vue) {
- // Vue.${newCpt.type}(${newCpt.name}.name, ${newCpt.name});
- // };
- // export default ${newCpt.name}`;
- // const dirPath = path.join(__dirname, `../src/packages/${nameLc}/`);
- // const filePath = path.join(dirPath, `index.js`);
- // if (!fs.existsSync(dirPath)) {
- // fs.mkdirSync(filePath);
- // }
- // if (newCpt.type == 'filter' || newCpt.type == 'directive'){
- // content = content2;
- // }
- // fs.writeFile(filePath, content, (err) => {
- // if (err) throw err;
- resolve(`生成index.js文件成功`);
- // });
- });
- }
- function createVue() {
- return new Promise((resolve, reject) => {
- const nameLc = newCpt.name.toLowerCase();
- let content = `<template>
- <view :class="classes" @click="handleClick">
- <view>{{ name }}</view>
- <view>{{ txt }}</view>
- </view>
- </template>
- <script lang="ts">
- import { toRefs } from 'vue';
- import { createComponent } from '@/utils/create';
- const { componentName, create } = createComponent('temp');
-
- export default create({
- props: {
- name: {
- type: String,
- default: ''
- },
- txt: {
- type: String,
- default: ''
- }
- },
- components: {},
- emits: ['click'],
-
- setup(props, { emit }) {
- console.log('componentName', componentName);
-
- const { name, txt } = toRefs(props);
-
- const handleClick = (event: Event) => {
- emit('click', event);
- };
-
- return { name, txt, handleClick };
- }
- });
- </script>
-
- <style lang="scss">
- @import 'index.scss';
- </style>
- `;
- const dirPath = path.join(__dirname, `../src/packages/${nameLc}/`);
- const filePath = path.join(dirPath, `index.vue`);
- if (!fs.existsSync(dirPath)) {
- fs.mkdirSync(filePath);
- }
- fs.writeFile(filePath, content, err => {
- if (err) throw err;
- resolve(`生成${newCpt.name}.vue文件成功`);
- });
- });
- }
- function createDemo() {
- return new Promise((resolve, reject) => {
- const nameLc = newCpt.name.toLowerCase();
- let content = `<template>
- <div class="demo-list"></div>
- </template>
- <script>
- export default {
- data() {
- return {};
- },
- methods: {
- }
- }
- </script>`;
- const dirPath = path.join(__dirname, '../src/packages/' + nameLc);
- const filePath = path.join(dirPath, `demo.vue`);
- if (!fs.existsSync(dirPath)) {
- fs.mkdirSync(filePath);
- }
- fs.writeFile(filePath, content, err => {
- if (err) throw err;
- resolve(`生成demo.vue文件成功`);
- });
- });
- }
- function addToPackageJson() {
- // return new Promise((resolve, reject) => {
- // conf.packages.push(newCpt);
- // const dirPath = path.join(__dirname, `../`);
- // const filePath = path.join(dirPath, `config.json`);
- // fs.writeFile(filePath, JSON.stringify(conf, null, 2), (err) => {
- // if (err) throw err;
- // resolve(`修改config.json文件成功`);
- // });
- // });
- }
- function createScss() {
- return new Promise((resolve, reject) => {
- const nameLc = newCpt.name.toLowerCase();
- let content = `.nut-temp {}`;
- const dirPath = path.join(__dirname, '../src/packages/' + nameLc);
- const filePath = path.join(dirPath, `index.scss`);
- if (!fs.existsSync(dirPath)) {
- fs.mkdirSync(filePath);
- }
- fs.writeFile(filePath, content, err => {
- if (err) throw err;
- resolve(`index.scss文件成功`);
- });
- });
- }
- function createDoc() {
- return new Promise((resolve, reject) => {
- const nameLc = newCpt.name.toLowerCase();
- let content = `组建使用说明文件`;
- const dirPath = path.join(__dirname, '../src/packages/' + nameLc);
- const filePath = path.join(dirPath, `doc.md`);
- if (!fs.existsSync(dirPath)) {
- fs.mkdirSync(filePath);
- }
- fs.writeFile(filePath, content, err => {
- if (err) throw err;
- resolve(`doc.md文件成功`);
- });
- });
- }
- function createNew() {
- createIndexJs()
- .then(() => {
- if (newCpt.type == 'component' || newCpt.type == 'method') {
- return createVue();
- } else {
- return;
- }
- })
- .then(() => {
- return createScss();
- })
- .then(() => {
- return createDemo();
- })
- .then(() => {
- return createDoc();
- })
- .then(() => {
- // return addToPackageJson();
- })
- .then(() => {
- console.log('组件模板生成完毕,请开始你的表演~');
- process.exit();
- });
- }
- function createComponent() {
- init();
- }
- createComponent();
|