From 44a4ae39430d1cf50370d2b85a67b85dd7fb04f4 Mon Sep 17 00:00:00 2001 From: sorrycc Date: Tue, 23 Jun 2015 16:59:58 +0800 Subject: [PATCH] initial commit --- .editorconfig | 16 ++++++++++ .gitignore | 6 ++++ .jshintignore | 7 +++++ .jshintrc | 32 ++++++++++++++++++++ .npmignore | 6 ++++ HISTORY.md | 3 ++ README.md | 37 +++++++++++++++++++++++ bin/antd | 42 ++++++++++++++++++++++++++ bin/antd-build | 9 ++++++ bin/antd-init | 33 ++++++++++++++++++++ bin/antd-server | 12 ++++++++ boilerplate/package.json | 5 ++++ demo/README.md | 31 +++++++++++++++++++ demo/a.html | 19 ++++++++++++ demo/a.js | 31 +++++++++++++++++++ demo/package.json | 8 +++++ lib/build.js | 27 +++++++++++++++++ lib/middleware.js | 22 ++++++++++++++ lib/printResult.js | 23 ++++++++++++++ lib/server.js | 21 +++++++++++++ lib/webpack.common.config.js | 58 ++++++++++++++++++++++++++++++++++++ lib/webpack.config.js | 17 +++++++++++ lib/webpack.dev.config.js | 16 ++++++++++ package.json | 39 ++++++++++++++++++++++++ 24 files changed, 520 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .jshintignore create mode 100644 .jshintrc create mode 100644 .npmignore create mode 100644 HISTORY.md create mode 100644 README.md create mode 100755 bin/antd create mode 100755 bin/antd-build create mode 100755 bin/antd-init create mode 100755 bin/antd-server create mode 100644 boilerplate/package.json create mode 100644 demo/README.md create mode 100644 demo/a.html create mode 100644 demo/a.js create mode 100644 demo/package.json create mode 100644 lib/build.js create mode 100644 lib/middleware.js create mode 100644 lib/printResult.js create mode 100644 lib/server.js create mode 100644 lib/webpack.common.config.js create mode 100644 lib/webpack.config.js create mode 100644 lib/webpack.dev.config.js create mode 100644 package.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7e3649a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[Makefile] +indent_style = tab diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..81fc9ab --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.idea +.DS_Store +tmp +spm_modules +node_modules +demo/dist diff --git a/.jshintignore b/.jshintignore new file mode 100644 index 0000000..3b2c31a --- /dev/null +++ b/.jshintignore @@ -0,0 +1,7 @@ +node_modules +coverage +test/fixtures +test/expected +tmp +demo +spm_modules diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 0000000..63dd1ee --- /dev/null +++ b/.jshintrc @@ -0,0 +1,32 @@ +{ + "expr": true, + "eqeqeq": true, + "eqnull": true, + "indent": 2, + "latedef": "nofunc", + "newcap": true, + "quotmark": true, + "trailing": true, + "undef": true, + "unused": true, + "lastsemic": true, + "boss": true, + "funcscope": true, + "loopfunc": true, + "smarttabs": true, + "sub": true, + "strict": true, + "node": true, + "esnext": true, + "globals": { + "describe": false, + "xdescribe": false, + "it": false, + "xit": false, + "before": false, + "beforeEach": false, + "after": false, + "afterEach": false, + "define": false + } +} diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..c30ce90 --- /dev/null +++ b/.npmignore @@ -0,0 +1,6 @@ +.idea +.DS_Store +tmp +spm_modules +node_modules +demo diff --git a/HISTORY.md b/HISTORY.md new file mode 100644 index 0000000..15731e3 --- /dev/null +++ b/HISTORY.md @@ -0,0 +1,3 @@ +# History + +--- diff --git a/README.md b/README.md new file mode 100644 index 0000000..5d038f7 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# antd + +[![NPM version](https://img.shields.io/npm/v/antd.svg?style=flat)](https://npmjs.org/package/antd) + +Development tool for ant.design . + +---- + +## 使用说明 + +### 安装 + +```bash +$ npm i antd -g +``` + +### 脚手架 + +```bash +$ antd init +``` + +这会创建一个 package.json,此外你还需要在 package.json 中配置 entry 声明哪些是入口文件,格式详见:http://webpack.github.io/docs/configuration.html#entry + +### 本地调试 + +```bash +$ antd server +``` + +然后访问 http://127.0.0.1:8000 。 + +### 构建 + +```bash +$ antd build +``` diff --git a/bin/antd b/bin/antd new file mode 100755 index 0000000..51da2d0 --- /dev/null +++ b/bin/antd @@ -0,0 +1,42 @@ +#!/usr/bin/env node + +var spawn = require('win-spawn'); +var join = require('path').join; +var exists = require('fs').existsSync; +var program = require('commander'); + +program + .version(require('../package').version, '-v, --version') + .usage(' [options]') + .on('--help', printHelp) + .parse(process.argv); + +var subcmd = program.args[0]; +var args = process.argv.slice(3); + +if (!subcmd) { + program.help(); +} else { + var bin = executable(subcmd); + if (bin) { + spawn(bin, args, {stdio: 'inherit', customFds: [0, 1, 2]}); + } else { + printHelp(); + } +} + +function printHelp() { + console.log(' Commands:'); + console.log(); + console.log(' init initialize'); + console.log(' build build entry files specified in package.json'); + console.log(' server debug with server'); + console.log(); +} + +function executable(subcmd) { + var file = join(__dirname, 'antd-' + subcmd); + if (exists(file)) { + return file; + } +} diff --git a/bin/antd-build b/bin/antd-build new file mode 100755 index 0000000..62b59d7 --- /dev/null +++ b/bin/antd-build @@ -0,0 +1,9 @@ +#!/usr/bin/env node + +var program = require('commander'); +require('gnode'); + +program + .parse(process.argv); + +require('../lib/build')(); diff --git a/bin/antd-init b/bin/antd-init new file mode 100755 index 0000000..42bee0f --- /dev/null +++ b/bin/antd-init @@ -0,0 +1,33 @@ +#!/usr/bin/env node + +var vfs = require('vinyl-fs'); +var through = require('through2'); +var join = require('path').join; +var basename = require('path').basename; + +var cwd = join(__dirname, '../boilerplate'); +var dest = process.cwd(); + +vfs.src('**/*', {cwd: cwd, cwdbase: true, dot: true}) + .pipe(template(dest)) + .pipe(vfs.dest(dest)) + .on('end', function() { + + }) + .resume(); + +function template(dest) { + return through.obj(function (file, enc, cb) { + if (!file.stat.isFile()) { + return cb(); + } + + console.log('Write %s', simplifyFilename(join(dest, basename(file.path)))); + this.push(file); + cb(); + }); +} + +function simplifyFilename(filename) { + return filename.replace(process.cwd(), "."); +} diff --git a/bin/antd-server b/bin/antd-server new file mode 100755 index 0000000..fef5141 --- /dev/null +++ b/bin/antd-server @@ -0,0 +1,12 @@ +#!/usr/bin/env node + +var program = require('commander'); +require('gnode'); + +program + .option('-p, --port ', 'port') + .parse(process.argv); + +require('../lib/server')({ + port: program.port +}); diff --git a/boilerplate/package.json b/boilerplate/package.json new file mode 100644 index 0000000..35022d4 --- /dev/null +++ b/boilerplate/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "ant-design": "https://github.com/ant-design/ant-design.git" + } +} diff --git a/demo/README.md b/demo/README.md new file mode 100644 index 0000000..f11debb --- /dev/null +++ b/demo/README.md @@ -0,0 +1,31 @@ +# demo + +---- + +## 使用方法 + +### 安装 antd + +```bash +$ npm install antd -g +``` + +### 安装依赖 + +```bash +$ npm install +``` + +### 本地调试 + +```bash +$ antd server +``` + +然后访问 http://127.0.0.1:8000/a.html 。 + +### 构建 + +```bash +$ antd build +``` diff --git a/demo/a.html b/demo/a.html new file mode 100644 index 0000000..a6e36b4 --- /dev/null +++ b/demo/a.html @@ -0,0 +1,19 @@ + + + + + antd demo + + + + +

antd demo

+

+ +
+ + + + + + \ No newline at end of file diff --git a/demo/a.js b/demo/a.js new file mode 100644 index 0000000..5cde875 --- /dev/null +++ b/demo/a.js @@ -0,0 +1,31 @@ +'use strict'; + +require('antd/style/index.less'); + +var ProgressCircle = require('antd/components/progress').Circle; + +var MyProgress = React.createClass({ + getInitialState() { + return { + percent: 0 + }; + }, + componentDidMount: function() { + var self = this; + setInterval(function() { + if (self.state.percent < 100) { + self.state.percent += 4; + } + self.setState({ + percent: self.state.percent + }); + }, 200); + }, + render() { + return ; + } +}); + +React.render( + + , document.getElementById('components-progress-demo-circle-dynamic')); diff --git a/demo/package.json b/demo/package.json new file mode 100644 index 0000000..8490503 --- /dev/null +++ b/demo/package.json @@ -0,0 +1,8 @@ +{ + "entry": { + "a": "./a.js" + }, + "dependencies": { + "ant-design": "https://github.com/ant-design/ant-design.git" + } +} diff --git a/lib/build.js b/lib/build.js new file mode 100644 index 0000000..caa4630 --- /dev/null +++ b/lib/build.js @@ -0,0 +1,27 @@ +'use strict'; + +var shelljs = require('shelljs'); +var join = require('path').join; +var webpack = require('webpack'); + +module.exports = function() { + var printResult = require('../lib/printResult'); + + var cwd = process.cwd(); + shelljs.rm('-rf', join(cwd, './dist')); + + var webpackConfig; + try { + webpackConfig = require(join(cwd, 'webpack.config.js')); + } catch(e) { + webpackConfig = require('../lib/webpack.config.js'); + } + + webpack(webpackConfig, function(err, stats) { + printResult(stats); + console.log(stats.toString()); + if (err) { + console.error(err); + } + }); +}; diff --git a/lib/middleware.js b/lib/middleware.js new file mode 100644 index 0000000..6a11424 --- /dev/null +++ b/lib/middleware.js @@ -0,0 +1,22 @@ +'use strict'; + +var join = require('path').join; +var webpack = require('webpack'); +var printResult = require('./printResult'); + +module.exports = function () { + var webpackConfig; + + try { + webpackConfig = require(join(process.cwd(), 'config/webpack.dev.config.js')); + } catch (e) { + webpackConfig = require('./webpack.dev.config.js'); + } + + var compiler = webpack(webpackConfig); + compiler.plugin('done', printResult); + + return require('koa-webpack-dev-middleware')(compiler, { + publicPath: '/' + }); +}; diff --git a/lib/printResult.js b/lib/printResult.js new file mode 100644 index 0000000..a7ae415 --- /dev/null +++ b/lib/printResult.js @@ -0,0 +1,23 @@ +'use strict'; + +module.exports = function(stats) { + stats = stats.toJson(); + + if (stats.errors && stats.errors.length) { + var hasChildError = false; + stats.children.forEach(function(item) { + if (item.errors) { + hasChildError = true; + item.errors.forEach(function(err) { + console.error('error', err); + }); + } + }); + if (!hasChildError) { + stats.errors.forEach(function(err) { + console.error('error', err); + }); + } + console.log(); + } +}; diff --git a/lib/server.js b/lib/server.js new file mode 100644 index 0000000..0d462f0 --- /dev/null +++ b/lib/server.js @@ -0,0 +1,21 @@ +'use strict'; + +module.exports = function(args) { + args = args || {}; + args.port = args.port || 8000; + args.cwd = args.cwd || process.cwd(); + + var koa = require('koa'); + var app = koa(); + + app.use(require('./middleware')()); + app.use(require('koa-static')(args.cwd)); + app.use(require('koa-serve-index')(args.cwd, { + hidden: true, + view: 'details' + })); + + app.listen(args.port, function() { + console.log('listened on %s', args.port); + }); +}; diff --git a/lib/webpack.common.config.js b/lib/webpack.common.config.js new file mode 100644 index 0000000..c11a40e --- /dev/null +++ b/lib/webpack.common.config.js @@ -0,0 +1,58 @@ +'use strict'; + +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var path = require('path'); +var pkg = require(path.join(process.cwd(), 'package.json')); + +module.exports = { + + output: { + path: path.join(process.cwd(), './dist/'), + filename: '[name].js', + chunkFilename: '[name].js' + }, + + devtool: '#source-map', + + resolve: { + extensions: ['', '.js', '.jsx'] + }, + + resolveLoader: { + root: path.join(__dirname, '../node_modules') + }, + + entry: pkg.entry, + + module: { + loaders: [ + { + test: /\.(js|jsx)$/, + loader: 'babel' + }, + { + test: /\.css$/, + loader: ExtractTextPlugin.extract( + 'css?sourceMap' + ) + }, + { + test: /\.less$/, + loader: ExtractTextPlugin.extract( + 'css?sourceMap!' + + 'less?sourceMap' + ) + }, + {test: /\.woff(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&minetype=application/font-woff'}, + {test: /\.woff2(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&minetype=application/font-woff'}, + {test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&minetype=application/octet-stream'}, + {test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, loader: 'file'}, + {test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, loader: 'url?limit=10000&minetype=image/svg+xml'} + ] + }, + + externals: { + jquery: 'window.jQuery', + react: 'window.React' + } +}; diff --git a/lib/webpack.config.js b/lib/webpack.config.js new file mode 100644 index 0000000..006e4cb --- /dev/null +++ b/lib/webpack.config.js @@ -0,0 +1,17 @@ +'use strict'; + +var path = require('path'); +var webpack = require('webpack'); +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var assign = require('object-assign'); + +module.exports = assign({}, require('./webpack.common.config'), { + plugins: [ + new ExtractTextPlugin('[name].css', { + disable: false, + allChunks: true + }), + new webpack.optimize.UglifyJsPlugin(), + new webpack.optimize.OccurenceOrderPlugin() + ] +}); diff --git a/lib/webpack.dev.config.js b/lib/webpack.dev.config.js new file mode 100644 index 0000000..fef3b8c --- /dev/null +++ b/lib/webpack.dev.config.js @@ -0,0 +1,16 @@ +'use strict'; + +var path = require('path'); +var webpack = require('webpack'); +var ExtractTextPlugin = require('extract-text-webpack-plugin'); +var assign = require('object-assign'); + +module.exports = assign({}, require('./webpack.common.config'), { + plugins: [ + new ExtractTextPlugin('[name].css', { + disable: false, + allChunks: true + }), + new webpack.optimize.OccurenceOrderPlugin() + ] +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..7a88801 --- /dev/null +++ b/package.json @@ -0,0 +1,39 @@ +{ + "name": "antd", + "version": "0.1.0", + "description": "Development tool for ant.design", + "repository": { + "type": "git", + "url": "https://github.com/ant-design/antd" + }, + "homepage": "https://github.com/ant-design/antd", + "author": "chencheng ", + "license": "MIT", + "bin": { + "antd": "./bin/antd" + }, + "dependencies": { + "babel-core": "~5.5.8", + "babel-loader": "~5.1.4", + "chalk": "~1.0.0", + "commander": "~2.8.1", + "css-loader": "~0.14.5", + "extract-text-webpack-plugin": "~0.8.2", + "file-loader": "~0.8.4", + "gnode": "~0.1.1", + "koa": "~0.21.0", + "koa-serve-index": "~1.0.4", + "koa-static": "~1.4.9", + "koa-webpack-dev-middleware": "~1.0.0", + "less": "~2.5.1", + "less-loader": "~2.2.0", + "object-assign": "~3.0.0", + "shelljs": "~0.5.1", + "through2": "~2.0.0", + "url-loader": "~0.5.6", + "vinyl-fs": "~1.0.0", + "webpack": "~1.9.11", + "webpack-dev-middleware": "~1.1.0", + "win-spawn": "~2.0.0" + } +}