Compare commits

...

24 Commits

Author SHA1 Message Date
5fb2f3a81f 7.0.7 2017-04-17 15:04:04 +02:00
873c7af7a4 update smartanalytics id 2017-04-17 15:03:59 +02:00
5e82218d92 7.0.6 2017-04-17 14:55:44 +02:00
354b1b1bf7 add privacy policy to TypeScript files 2017-04-17 14:55:35 +02:00
07195d207d 7.0.5 2017-04-01 21:03:55 +02:00
b60bb25b0f update ci 2017-04-01 21:02:47 +02:00
a7af34622b 7.0.4 2017-04-01 20:58:27 +02:00
9c58be69bf update docs 2017-04-01 20:58:23 +02:00
1681fc729d 7.0.3 2017-03-31 19:18:21 +02:00
50e2895ad9 fix #17, now computing coverage result correctly 2017-03-31 19:18:18 +02:00
95ba650a14 update pages job 2017-03-31 17:02:19 +02:00
83aa10eb52 7.0.2 2017-03-31 16:46:52 +02:00
ebc3cb70ff add support for picking up all .ts files in .test/ 2017-03-31 16:46:48 +02:00
9b595e75cd 7.0.1 2017-03-26 19:24:44 +02:00
4e85589dea now executing tests correctly 2017-03-26 19:24:41 +02:00
2b44f61ace improve README 2017-03-26 11:41:47 +02:00
0928a6d9d2 7.0.0 2017-03-25 21:52:46 +01:00
e464afd544 update dependencies 2017-03-25 21:52:38 +01:00
468d07f5f3 add smartanalytics 2017-03-04 23:44:16 +01:00
ae68ddfaf8 Merge branch 'switch_to_tap' into 'master'
Switch to tap

Closes #16

See merge request !3
2017-03-04 20:49:11 +00:00
ad275d2113 Switch to tap 2017-03-04 20:49:10 +00:00
f99605da8f 6.1.15 2017-02-27 23:52:30 +01:00
508aa23e59 6.1.14 2017-02-27 23:52:04 +01:00
ce7f28404a update projectinfo 2017-02-27 23:52:02 +01:00
33 changed files with 832 additions and 889 deletions

View File

@ -48,12 +48,15 @@ trigger:
- docker
pages:
image: hosttoday/ht-docker-node:npmpage
image: hosttoday/ht-docker-node:npmci
stage: pages
script:
- npmci command npmpage --publish gitlab
- npmci command yarn global add npmpage
- npmci command npmpage
only:
- tags
tags:
- docker
artifacts:
expire_in: 1 week
paths:

View File

@ -2,4 +2,10 @@ Please view this file on the master branch, on stable branches it's out of date.
v 6.0.0 (released)
- remove TypeDoc, please look at npmpage
- check package.json
- check package.json
v 7.0.0
- switch from mocha to tap
- run tests in SubProcesses with coverage
- improve ES6 handling
- add smartanalytics

View File

@ -3,37 +3,37 @@ Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
## Availabililty
[![npm](https://gitzone.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-git.svg)](https://gitlab.com/gitzone/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/gitzonetools/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/gitzone/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/gitzone/npmts)
[![docs](https://gitzone.gitlab.io/assets/repo-button-docs.svg)](https://gitzone.gitlab.io/npmts/)
## Status for master
[![build status](https://gitlab.com/gitzone/npmts/badges/master/build.svg)](https://gitlab.com/gitzone/npmts/commits/master)
[![coverage report](https://gitlab.com/gitzone/npmts/badges/master/coverage.svg)](https://gitlab.com/gitzone/npmts/commits/master)
[![build status](https://GitLab.com/gitzone/npmts/badges/master/build.svg)](https://GitLab.com/gitzone/npmts/commits/master)
[![coverage report](https://GitLab.com/gitzone/npmts/badges/master/coverage.svg)](https://GitLab.com/gitzone/npmts/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/npmts.svg)](https://www.npmjs.com/package/npmts)
[![docker pulls](https://img.shields.io/docker/pulls/hosttoday/ht-docker-node.svg)](https://hub.docker.com/r/hosttoday/ht-docker-node/)
[![Dependency Status](https://david-dm.org/gitzonetools/npmts.svg)](https://david-dm.org/gitzonetools/npmts)
[![bitHound Dependencies](https://www.bithound.io/github/gitzonetools/npmts/badges/dependencies.svg)](https://www.bithound.io/github/gitzonetools/npmts/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/gitzonetools/npmts/badges/code.svg)](https://www.bithound.io/github/gitzonetools/npmts)
[![Dependency Status](https://david-dm.org/gitzone/npmts.svg)](https://david-dm.org/gitzone/npmts)
[![bitHound Dependencies](https://www.bithound.io/github/gitzone/npmts/badges/dependencies.svg)](https://www.bithound.io/github/gitzone/npmts/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/gitzone/npmts/badges/code.svg)](https://www.bithound.io/github/gitzone/npmts)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Introduction
## Usage
NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript.
npmts will
1. check your dependencies and package.json (unused, missing, updates, security)
1. transpile your code with tsc,
1. test your code with mocha (supports the fancy stuff like Promises, Generators, async/await, sourcemaps)
1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes)
1. create coverage with istanbul (supports tracing of the originating TypeScript)
For more information on how tests are run check out the [tapbuffer module](https://www.npmjs.com/package/tapbuffer).
This works on your machine and in CI. There is a prebuild docker image available that includes npmts to make CI a breeze:
[hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/)
For further information read the linked docs at the top of this README.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
> MIT licensed | **©** 2016 - 2017 [Lossless GmbH](https://lossless.gmbh)
[![npm](https://gitzone.gitlab.io/assets/repo-footer.svg)](https://git.zone)
[![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https://git.zone)

3
dist/mod00/index.js vendored
View File

@ -1,7 +1,8 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/* ------------------------------------------
* This module compiles TypeScript files
* This module compiles the module's TypeScript files
* Note: Test files are only compiled in memory
* -------------------------------------------- */
const q = require("smartq");
const plugins = require("./mod00.plugins");

View File

@ -7,7 +7,7 @@ const mod00_check_1 = require("../mod00/mod00.check");
exports.run = function (configArg) {
let done = q.defer();
let config = configArg;
plugins.beautylog.ora.text('now looking at ' + 'required assets'.yellow);
plugins.beautylog.ora.text('now looking at ' + 'required assets');
if (config.cli === true) {
let mainJsPath = mod00_check_1.projectInfo.packageJson.main;
let cliJsString = plugins.smartfile.fs.toStringSync(plugins.path.join(paths.npmtsAssetsDir, 'cli.js'));

View File

@ -56,11 +56,11 @@ let checkDependencies = (configArg) => {
process.exit(1);
}
for (let item in unused.invalidFiles) {
plugins.beautylog.warn(`Watch out: could not parse file ${item.red}`);
plugins.beautylog.warn(`Watch out: could not parse file ${item}`);
}
;
for (let item in unused.invalidDirs) {
plugins.beautylog.warn(`Watch out: could not parse directory ${item.red}`);
plugins.beautylog.warn(`Watch out: could not parse directory ${item}`);
}
done.resolve(configArg);
});
@ -82,20 +82,20 @@ let checkDevDependencies = (configArg) => {
});
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => {
for (let item of unused.devDependencies) {
plugins.beautylog.log(`unused devDependency ${item.red}`);
plugins.beautylog.log(`unused devDependency ${item}`);
}
for (let item in unused.missing) {
plugins.beautylog.error(`unused devDependency ${item.red}`);
plugins.beautylog.error(`unused devDependency ${item}`);
}
if (unused.missing.length > 0) {
plugins.beautylog.info('exiting due to missing dependencies in package.json');
process.exit(1);
}
for (let item in unused.invalidFiles) {
plugins.beautylog.warn(`Watch out: could not parse file ${item.red}`);
plugins.beautylog.warn(`Watch out: could not parse file ${item}`);
}
for (let item in unused.invalidDirs) {
plugins.beautylog.warn(`Watch out: could not parse directory ${item.red}`);
plugins.beautylog.warn(`Watch out: could not parse directory ${item}`);
}
done.resolve(configArg);
});

View File

@ -6,15 +6,10 @@ const plugins = require("./mod00.plugins");
exports.run = function (configArg) {
let done = q.defer();
let config = configArg;
plugins.beautylog.ora.text('now compiling ' + 'TypeScript'.yellow);
plugins.beautylog.ora.text('now compiling ' + 'TypeScript');
plugins.tsn.compileGlobStringObject(config.ts, config.tsOptions, paths.cwd)
.then(() => {
plugins.beautylog.ok('compiled main TypeScript!');
plugins.beautylog.log('now compiling tests!');
return plugins.tsn.compileGlobStringObject(config.testTs, config.tsOptions, paths.cwd);
})
.then(function () {
plugins.beautylog.ok('compiled all TypeScript!');
plugins.beautylog.ok(`compiled the module's TypeScript!`);
done.resolve(config);
}).catch(err => { console.log(err); });
return done.promise;

110
dist/mod02/index.js vendored
View File

@ -18,11 +18,16 @@ const q = require("smartq");
* runs mocha
* @returns INpmtsConfig
*/
let mocha = function (configArg) {
plugins.beautylog.ora.text('Instrumentalizing and testing transpiled JS');
plugins.beautylog.ora.end(); // end plugins.beautylog.ora for tests.
let tap = function (configArg) {
let done = q.defer();
let coverageSmartstream = new plugins.smartstream.Smartstream([
/**
* the TabBuffer for npmts
*/
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer();
/**
* handle the testable files
*/
let testableFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([plugins.path.join(paths.cwd, './ts/**/*.ts')]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript({
@ -31,84 +36,73 @@ let mocha = function (configArg) {
experimentalDecorators: true,
lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable']
}),
plugins.gulpIstanbul({}),
plugins.gulpSourcemaps.write(),
plugins.gulpFunction.forEach((file) => __awaiter(this, void 0, void 0, function* () {
file.path = file.path.replace(paths.tsDir, paths.distDir);
})),
plugins.gulpInjectModules(),
plugins.through2.obj((file, enc, cb) => {
cb();
}, (cb) => {
cb();
})
npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe()
]);
let localSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([plugins.path.join(paths.cwd, 'test/test.ts')]),
/**
* handle the test files
*/
let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([plugins.path.join(paths.cwd, 'test/*.ts')]),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable']
}),
plugins.gulpInjectModules(),
plugins.gulpMocha(),
plugins.gulpIstanbul.writeReports({
dir: plugins.path.join(paths.cwd, './coverage'),
reporters: ['lcovonly', 'json', 'text', 'text-summary']
})
npmtsTapBuffer.pipeTestFiles(),
plugins.smartstream.cleanPipe()
]);
coverageSmartstream.run()
.then(() => {
plugins.beautylog.info('code is now transpiled to ES5, instrumented with istanbul, and injected for mocha!');
return localSmartstream.run()
.then(() => { done.resolve(configArg); }, (err) => {
plugins.beautylog.error('Tests failed!');
console.log(err);
if (configArg.watch) {
done.resolve(configArg);
}
else {
process.exit(1);
}
});
}, (err) => {
// lets run the smartstream
Promise.all([
testableFilesSmartstream.run(),
testFilesSmartstream.run()
]).then(() => __awaiter(this, void 0, void 0, function* () {
configArg.runData.coverageLcovInfo = yield npmtsTapBuffer.runTests();
done.resolve(configArg);
}), (err) => {
plugins.beautylog.error('Tests failed!');
console.log(err);
});
return done.promise;
};
let coverage = function (configArg) {
let done = q.defer();
plugins.smartcov.get.percentage(plugins.path.join(paths.coverageDir, 'lcov.info'), 2)
.then(function (percentageArg) {
if (percentageArg >= configArg.coverageTreshold) {
plugins.beautylog.ok(`${percentageArg.toString()}% `
+ `coverage exceeds your treshold of `
+ `${configArg.coverageTreshold.toString()}%`);
if (configArg.watch) {
done.resolve(configArg);
}
else {
plugins.beautylog.warn(`${percentageArg.toString()}% `
+ `coverage fails your treshold of `
+ `${configArg.coverageTreshold.toString()}%`);
plugins.beautylog.error('exiting due to coverage failure');
if (!configArg.watch) {
process.exit(1);
}
process.exit(1);
}
done.resolve(configArg);
});
return done.promise;
};
let handleCoverageData = (configArg) => __awaiter(this, void 0, void 0, function* () {
let coverageResult = yield plugins.smartcov.get.percentageFromLcovString(configArg.runData.coverageLcovInfo, 2);
if (coverageResult >= configArg.coverageTreshold) {
plugins.beautylog.ok(`${(coverageResult).toString()}% `
+ `coverage exceeds your treshold of `
+ `${configArg.coverageTreshold.toString()}%`);
}
else {
plugins.beautylog.warn(`${(coverageResult).toString()}% `
+ `coverage fails your treshold of `
+ `${configArg.coverageTreshold.toString()}%`);
plugins.beautylog.error('exiting due to coverage failure');
if (!configArg.watch) {
process.exit(1);
}
}
return configArg;
});
exports.run = function (configArg) {
let done = q.defer();
let config = configArg;
if (config.test === true) {
plugins.beautylog.ora.text('now starting tests');
plugins.beautylog.log('------------------------------------------------------\n' +
'*************************** TESTS: ***************************\n' +
'--------------------------------------------------------------');
mocha(config)
.then(coverage)
plugins.beautylog.ora.end();
plugins.beautylog.log('ready for tapbuffer:');
tap(config)
.then(handleCoverageData)
.then(() => {
done.resolve(config);
}).catch(err => { console.log(err); });

View File

@ -1,9 +1,8 @@
export * from '../npmts.plugins';
import * as gulp from 'gulp';
import * as gulpFunction from 'gulp-function';
import * as gulpIstanbul from 'gulp-istanbul';
declare let gulpInjectModules: any;
import * as gulpMocha from 'gulp-mocha';
import * as gulpSourcemaps from 'gulp-sourcemaps';
import * as gulpTypeScript from 'gulp-typescript';
export { gulp, gulpFunction, gulpIstanbul, gulpInjectModules, gulpMocha, gulpSourcemaps, gulpTypeScript };
import * as smartcov from 'smartcov';
import * as tapbuffer from 'tapbuffer';
export { gulp, gulpFunction, gulpSourcemaps, gulpTypeScript, smartcov, tapbuffer };

View File

@ -8,13 +8,11 @@ const gulp = require("gulp");
exports.gulp = gulp;
const gulpFunction = require("gulp-function");
exports.gulpFunction = gulpFunction;
const gulpIstanbul = require("gulp-istanbul");
exports.gulpIstanbul = gulpIstanbul;
let gulpInjectModules = require('gulp-inject-modules');
exports.gulpInjectModules = gulpInjectModules;
const gulpMocha = require("gulp-mocha");
exports.gulpMocha = gulpMocha;
const gulpSourcemaps = require("gulp-sourcemaps");
exports.gulpSourcemaps = gulpSourcemaps;
const gulpTypeScript = require("gulp-typescript");
exports.gulpTypeScript = gulpTypeScript;
const smartcov = require("smartcov");
exports.smartcov = smartcov;
const tapbuffer = require("tapbuffer");
exports.tapbuffer = tapbuffer;

13
dist/npmts.cli.js vendored
View File

@ -7,6 +7,19 @@ const NpmtsConfig = require("./npmts.config");
const NpmtsMods = require("./npmts.mods");
const NpmtsWatch = require("./npmts.watch");
const NpmtsShip = require("./npmts.ship");
/**
* smartanalytics
* this data is fully anonymized (no Ips or any other personal information is tracked).
* It just keeps track which of our tools are really used...
* ... so we know where to spend our limited resources for improving them.
* Since yarn is out and there is heavy caching going on,
* pure download stats are just not reliable enough for us anymore
* Feel free to dig into the smartanalytics package, if you are interested in how it works.
* It is just an https call to Google Analytics.
* Our privacy policy can be found here: https://lossless.gmbh/privacy.html
*/
let npmtsAnalytics = new plugins.smartanalytics.AnalyticsAccount('npmts', 'UA-64087619-5');
npmtsAnalytics.sendEvent('npm', 'exec', 'git.zone');
exports.run = () => {
let done = q.defer();
let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot);

View File

@ -8,5 +8,9 @@ export interface INpmtsConfig {
ts: any;
tsOptions: any;
watch: boolean;
runData: {
coverageLcovInfo?: string;
coverageResult?: number;
};
}
export declare let run: (argvArg: any) => Promise<{}>;

View File

@ -14,7 +14,8 @@ exports.run = function (argvArg) {
testTs: {},
ts: {},
tsOptions: {},
watch: false
watch: false,
runData: {}
};
// mix with configfile
plugins.beautylog.ora.text('running npmextra');

View File

@ -5,8 +5,8 @@ import * as lodash from 'lodash';
import * as npmextra from 'npmextra';
import * as projectinfo from 'projectinfo';
import * as path from 'path';
import * as smartanalytics from 'smartanalytics';
import * as smartcli from 'smartcli';
import * as smartcov from 'smartcov';
import * as smartenv from 'smartenv';
import * as smartfile from 'smartfile';
import * as smartpath from 'smartpath';
@ -15,4 +15,4 @@ import * as smartstring from 'smartstring';
import * as smartsystem from 'smartsystem';
import * as through2 from 'through2';
export declare let sourceMapSupport: any;
export { beautylog, depcheck, lodash, npmextra, projectinfo, path, smartcli, smartcov, smartenv, smartfile, smartpath, smartstream, smartstring, smartsystem, through2 };
export { beautylog, depcheck, lodash, npmextra, projectinfo, path, smartanalytics, smartcli, smartenv, smartfile, smartpath, smartstream, smartstring, smartsystem, through2 };

View File

@ -13,10 +13,10 @@ const projectinfo = require("projectinfo");
exports.projectinfo = projectinfo;
const path = require("path");
exports.path = path;
const smartanalytics = require("smartanalytics");
exports.smartanalytics = smartanalytics;
const smartcli = require("smartcli");
exports.smartcli = smartcli;
const smartcov = require("smartcov");
exports.smartcov = smartcov;
const smartenv = require("smartenv");
exports.smartenv = smartenv;
const smartfile = require("smartfile");

9
docs/00footer.md Normal file
View File

@ -0,0 +1,9 @@
[Legal Info](https://lossless.gmbh)
[Privacy Policy](https://lossless.gmbh/privacy.html)
///
[Git.Zone](https://git.zone)
<span>tools for a seamless dev workflow</span>
[Lossless GmbH](https://push.rocks)
<span>the company behind git.zone and npmts</span>
///

View File

@ -1,4 +1,9 @@
# Configuration of NPMTS
---
name: config
---
# Configuration
## of npmts
npmts can be configured to your needs:
### npmextra.json

View File

@ -1,7 +1,11 @@
# Default task execution of npmts
---
name: Default Behaviour
---
# Default Behaviour
## of npmts
1. **Config:** Check config in ./npmextra.json (Check out [npmextra](https://www.npmjs.com/package/npmextra))
1. **Clean:** Clean up from any previous builds (old js files)
1. **Check:** Check project for typings declaration in package.json, unused dependencies and missing dependencies
1. **Transpile:** Transpile TypeScript with **inline sourcemaps** and **declaration files** to ES target
1. **Test:** Babelify ES6 to ES5 on the fly, instrumentalize ES5 JavaScript with istanbul and run tests with Mocha.
1. **Test:** transpile TypeScript of module to ES5 for tests (so it can be instrumentalized) and pipe it to tapbuffer. All this happens in memory.

View File

@ -1,13 +1,19 @@
# Examples for npmts
---
name: Examples
---
# Examples
## of modules that use npmts
Module Name | Description
--- | ---
[gulp-browser](https://www.npmjs.com/package/gulp-browser) | browserify for gulp
## Example Usage in modules:
* [gulp-browser](https://www.npmjs.com/package/gulp-browser)
> We will add more options over time.
## Tips and tricks:
### Tips and tricks:
* Use [npmts-g](https://www.npmjs.com/package/npmts-g) to use globally installed npmts and install npmts locally if no global npmts is available.
* Use [npmpage](https://www.npmjs.com/package/npmpage) to create a webpage from coverage reports and TypeDoc for the module
* Use [hosttoday/ht-docker-node:npmts](https://hub.docker.com/r/hosttoday/ht-docker-node/) for speedy CI builds
* Use [hosttoday/ht-docker-node:npmci](https://hub.docker.com/r/hosttoday/ht-docker-node/) for speedy CI builds
* Use [npmdocker](https://www.npmjs.com/package/npmdocker) for running tests consistently with docker.

View File

@ -1,44 +1,42 @@
---
name: Start
---
# npmts
Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
## Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
## Availabililty
[![npm](https://push.rocks/assets/repo-button-npm.svg)](https://www.npmjs.com/package/npmts)
[![git](https://push.rocks/assets/repo-button-git.svg)](https://gitlab.com/pushrocks/npmts)
[![git](https://push.rocks/assets/repo-button-mirror.svg)](https://github.com/pushrocks/npmts)
[![docs](https://push.rocks/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/npmts/)
[![npm](https://gitzone.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/gitzone/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-mirror.svg)](https://github.com/gitzone/npmts)
[![docs](https://gitzone.gitlab.io/assets/repo-button-docs.svg)](https://gitzone.gitlab.io/npmts/)
## Status for master
[![build status](https://gitlab.com/pushrocks/npmts/badges/master/build.svg)](https://gitlab.com/pushrocks/npmts/commits/master)
[![coverage report](https://gitlab.com/pushrocks/npmts/badges/master/coverage.svg)](https://gitlab.com/pushrocks/npmts/commits/master)
[![build status](https://GitLab.com/gitzone/npmts/badges/master/build.svg)](https://GitLab.com/gitzone/npmts/commits/master)
[![coverage report](https://GitLab.com/gitzone/npmts/badges/master/coverage.svg)](https://GitLab.com/gitzone/npmts/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/npmts.svg)](https://www.npmjs.com/package/npmts)
[![docker pulls](https://img.shields.io/docker/pulls/hosttoday/ht-docker-node.svg)](https://hub.docker.com/r/hosttoday/ht-docker-node/)
[![Dependency Status](https://david-dm.org/pushrocks/npmts.svg)](https://david-dm.org/pushrocks/npmts)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/npmts/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/npmts/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/npmts/badges/code.svg)](https://www.bithound.io/github/pushrocks/npmts)
[![Dependency Status](https://david-dm.org/gitzone/npmts.svg)](https://david-dm.org/gitzone/npmts)
[![bitHound Dependencies](https://www.bithound.io/github/gitzone/npmts/badges/dependencies.svg)](https://www.bithound.io/github/gitzone/npmts/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/gitzone/npmts/badges/code.svg)](https://www.bithound.io/github/gitzone/npmts)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Introduction
## Usage
NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript.
npmts will
1. check your dependencies and package.json
1. check your dependencies and package.json (unused, missing, updates, security)
1. transpile your code with tsc,
1. document your code with typedoc,
1. test your code with mocha
1. create coverage with istanbul
1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes)
1. create coverage with istanbul (supports tracing of the originating TypeScript)
For more information on how tests are run check out the [tapbuffer module](https://www.npmjs.com/package/tapbuffer).
This works on your machine and in CI. There is a prebuild docker image available that includes npmts to make CI a breeze:
[hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/)
For further information read the docs:
1. [Intro](https://pushrocks.gitlab.io/npmts/index.html)
2. [Install](https://pushrocks.gitlab.io/npmts/install.html)
3. [Default Behaviour](https://pushrocks.gitlab.io/npmts/default.html)
4. [Configuration](https://pushrocks.gitlab.io/npmts/config.html)
5. [Examples](https://pushrocks.gitlab.io/npmts/examples.html)
6. [Info](https://pushrocks.gitlab.io/npmts/info.html)
> MIT licensed | **&copy;** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks)
[![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https://push.rocks)

View File

@ -1,14 +0,0 @@
# Info
## Future Scope:
* automatically manage badges in README
* manage tslint to enforce code best practices
* tear down any differences between local and CI environments by using brand new npmdocker
## About the authors:
[![Project Phase](https://mediaserve.lossless.digital/lossless.com/img/createdby_github.svg)](https://lossless.com/)
[![PayPal](https://img.shields.io/badge/Support%20us-PayPal-blue.svg)](https://paypal.me/lossless)
## Legal Info
https://lossless.gmbh

View File

@ -1,8 +0,0 @@
# Summary
* [1. Intro](index.md)
* [2. Install](install.md)
* [3. Default Behaviour](default.md)
* [4. Configuration](config.md)
* [5. Examples](examples.md)
* [6. Info](info.md)

View File

@ -1,6 +1,6 @@
{
"name": "npmts",
"version": "6.1.14",
"version": "7.0.7",
"description": "Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.",
"main": "dist/index.js",
"bin": {
@ -14,7 +14,7 @@
"setupCheck": "(git clone https://gitlab.com/sandboxzone/sandbox-npmts.git test/)",
"typedoc": "(typedoc --out ./pages/api --target ES6 ./ts/)",
"npmpage": "(npmpage)",
"check": "(cd test && npm install && node ../dist/index.js)",
"check": "(cd test && yarn install && node ../dist/index.js)",
"checkVersion": "(cd test/ && node ../dist/index.js -v)",
"checkNoTest": "(cd test && node ../dist/index.js --notest)",
"checkNoDocs": "(cd test && node ../dist/index.js --nodocs)"
@ -34,39 +34,36 @@
},
"homepage": "https://gitlab.com/gitzone/npmts#readme",
"dependencies": {
"@types/gulp": "^3.8.32",
"@types/gulp-istanbul": "^0.9.30",
"@types/gulp-mocha": "0.0.29",
"@types/gulp-sourcemaps": "0.0.29",
"@types/gulp": "^4.0.2",
"@types/gulp-sourcemaps": "0.0.30",
"@types/minimatch": "^2.0.29",
"@types/through2": "^2.0.32",
"beautylog": "6.1.1",
"beautylog": "6.1.5",
"depcheck": "^0.6.7",
"early": "^2.0.36",
"early": "^2.0.38",
"gulp": "3.9.1",
"gulp-function": "^2.2.3",
"gulp-inject-modules": "^1.0.0",
"gulp-istanbul": "^1.1.1",
"gulp-mocha": "^3.0.1",
"gulp-sourcemaps": "^2.4.1",
"gulp-typescript": "^3.1.5",
"gulp-sourcemaps": "^2.5.0",
"gulp-typescript": "^3.1.6",
"lodash": "^4.17.4",
"npmextra": "^2.0.3",
"projectinfo": "3.0.2",
"npmextra": "^2.0.5",
"projectinfo": "^3.0.2",
"smartanalytics": "^1.0.3",
"smartchok": "^1.0.5",
"smartcli": "2.0.1",
"smartcov": "1.0.0",
"smartcli": "^2.0.1",
"smartcov": "^1.0.2",
"smartenv": "2.0.0",
"smartfile": "^4.1.6",
"smartfile": "^4.1.9",
"smartpath": "^3.2.8",
"smartq": "^1.1.1",
"smartstream": "^1.0.5",
"smartstream": "^1.0.8",
"smartstring": "^2.0.24",
"smartsystem": "^1.0.12",
"source-map-support": "^0.4.11",
"source-map-support": "^0.4.14",
"tapbuffer": "^1.0.10",
"through2": "^2.0.3",
"tsn": "^2.0.15",
"typescript": "^2.2.1",
"typescript": "^2.2.2",
"typings-global": "^1.0.14"
},
"devDependencies": {}

View File

@ -1,5 +1,6 @@
/* ------------------------------------------
* This module compiles TypeScript files
* This module compiles the module's TypeScript files
* Note: Test files are only compiled in memory
* -------------------------------------------- */
import * as q from 'smartq'

View File

@ -8,7 +8,7 @@ import { projectInfo } from '../mod00/mod00.check'
export let run = function(configArg){
let done = q.defer()
let config = configArg
plugins.beautylog.ora.text('now looking at ' + 'required assets'.yellow)
plugins.beautylog.ora.text('now looking at ' + 'required assets')
if (config.cli === true) {
let mainJsPath = projectInfo.packageJson.main
let cliJsString: string = plugins.smartfile.fs.toStringSync(plugins.path.join(paths.npmtsAssetsDir,'cli.js'))

View File

@ -60,10 +60,10 @@ let checkDependencies = (configArg) => {
process.exit(1)
}
for (let item in unused.invalidFiles) {
plugins.beautylog.warn(`Watch out: could not parse file ${item.red}`)
plugins.beautylog.warn(`Watch out: could not parse file ${item}`)
};
for (let item in unused.invalidDirs) {
plugins.beautylog.warn(`Watch out: could not parse directory ${item.red}`)
plugins.beautylog.warn(`Watch out: could not parse directory ${item}`)
}
done.resolve(configArg)
})
@ -86,20 +86,20 @@ let checkDevDependencies = (configArg) => {
})
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => {
for (let item of unused.devDependencies) {
plugins.beautylog.log(`unused devDependency ${item.red}`)
plugins.beautylog.log(`unused devDependency ${item}`)
}
for (let item in unused.missing) {
plugins.beautylog.error(`unused devDependency ${item.red}`)
plugins.beautylog.error(`unused devDependency ${item}`)
}
if (unused.missing.length > 0) {
plugins.beautylog.info('exiting due to missing dependencies in package.json')
process.exit(1)
}
for (let item in unused.invalidFiles) {
plugins.beautylog.warn(`Watch out: could not parse file ${item.red}`)
plugins.beautylog.warn(`Watch out: could not parse file ${item}`)
}
for (let item in unused.invalidDirs) {
plugins.beautylog.warn(`Watch out: could not parse directory ${item.red}`)
plugins.beautylog.warn(`Watch out: could not parse directory ${item}`)
}
done.resolve(configArg)
})

View File

@ -5,18 +5,13 @@ import * as paths from '../npmts.paths'
import * as plugins from './mod00.plugins'
export let run = function (configArg) {
let done = q.defer()
let config = configArg
plugins.beautylog.ora.text('now compiling ' + 'TypeScript'.yellow)
plugins.tsn.compileGlobStringObject(config.ts,config.tsOptions,paths.cwd)
.then(() => {
plugins.beautylog.ok('compiled main TypeScript!')
plugins.beautylog.log('now compiling tests!')
return plugins.tsn.compileGlobStringObject(config.testTs,config.tsOptions,paths.cwd)
})
.then(function () {
plugins.beautylog.ok('compiled all TypeScript!')
done.resolve(config)
}).catch(err => { console.log(err) })
return done.promise
let done = q.defer()
let config = configArg
plugins.beautylog.ora.text('now compiling ' + 'TypeScript')
plugins.tsn.compileGlobStringObject(config.ts, config.tsOptions, paths.cwd)
.then(() => {
plugins.beautylog.ok(`compiled the module's TypeScript!`)
done.resolve(config)
}).catch(err => { console.log(err) })
return done.promise
}

View File

@ -12,116 +12,109 @@ import { INpmtsConfig } from '../npmts.config'
* runs mocha
* @returns INpmtsConfig
*/
let mocha = function (configArg: INpmtsConfig) {
plugins.beautylog.ora.text('Instrumentalizing and testing transpiled JS')
plugins.beautylog.ora.end() // end plugins.beautylog.ora for tests.
let done = q.defer()
let tap = function (configArg: INpmtsConfig) {
let done = q.defer()
let coverageSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([plugins.path.join(paths.cwd, './ts/**/*.ts')]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable']
}),
plugins.gulpIstanbul({
}),
plugins.gulpSourcemaps.write(),
plugins.gulpFunction.forEach(async file => {
file.path = file.path.replace(paths.tsDir, paths.distDir)
}),
plugins.gulpInjectModules(),
plugins.through2.obj(
(file, enc, cb) => {
cb()
},
(cb) => {
cb()
}
)
])
/**
* the TabBuffer for npmts
*/
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer()
let localSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([plugins.path.join(paths.cwd, 'test/test.ts')]),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable']
}),
plugins.gulpInjectModules(),
plugins.gulpMocha(),
plugins.gulpIstanbul.writeReports({
dir: plugins.path.join(paths.cwd, './coverage'),
reporters: ['lcovonly', 'json', 'text', 'text-summary']
})
])
coverageSmartstream.run()
.then(
() => {
plugins.beautylog.info('code is now transpiled to ES5, instrumented with istanbul, and injected for mocha!')
return localSmartstream.run()
.then(() => { done.resolve(configArg) }, (err) => {
plugins.beautylog.error('Tests failed!')
console.log(err)
if (configArg.watch) {
done.resolve(configArg)
} else {
process.exit(1)
}
})
},
(err) => {
console.log(err)
})
return done.promise
/**
* handle the testable files
*/
let testableFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([ plugins.path.join(paths.cwd, './ts/**/*.ts') ]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: [ 'DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable' ]
}),
plugins.gulpSourcemaps.write(),
plugins.gulpFunction.forEach(async file => {
file.path = file.path.replace(paths.tsDir, paths.distDir)
}),
npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe()
])
/**
* handle the test files
*/
let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([ plugins.path.join(paths.cwd, 'test/*.ts') ]),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: [ 'DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable' ]
}),
npmtsTapBuffer.pipeTestFiles(),
plugins.smartstream.cleanPipe()
])
// lets run the smartstream
Promise.all([
testableFilesSmartstream.run(),
testFilesSmartstream.run()
]).then(
async () => {
configArg.runData.coverageLcovInfo = await npmtsTapBuffer.runTests()
done.resolve(configArg)
}, (err) => {
plugins.beautylog.error('Tests failed!')
console.log(err)
if (configArg.watch) {
done.resolve(configArg)
} else {
process.exit(1)
}
})
return done.promise
}
let coverage = function (configArg: INpmtsConfig) {
let done = q.defer()
plugins.smartcov.get.percentage(plugins.path.join(paths.coverageDir, 'lcov.info'), 2)
.then(function (percentageArg) {
if (percentageArg >= configArg.coverageTreshold) {
plugins.beautylog.ok(
`${percentageArg.toString()}% `
+ `coverage exceeds your treshold of `
+ `${configArg.coverageTreshold.toString()}%`
)
} else {
plugins.beautylog.warn(
`${percentageArg.toString()}% `
+ `coverage fails your treshold of `
+ `${configArg.coverageTreshold.toString()}%`
)
plugins.beautylog.error('exiting due to coverage failure')
if (!configArg.watch) { process.exit(1) }
}
done.resolve(configArg)
})
return done.promise
let handleCoverageData = async (configArg: INpmtsConfig) => {
let coverageResult = await plugins.smartcov.get.percentageFromLcovString(
configArg.runData.coverageLcovInfo,
2
)
if (coverageResult >= configArg.coverageTreshold) {
plugins.beautylog.ok(
`${(coverageResult).toString()}% `
+ `coverage exceeds your treshold of `
+ `${configArg.coverageTreshold.toString()}%`
)
} else {
plugins.beautylog.warn(
`${(coverageResult).toString()}% `
+ `coverage fails your treshold of `
+ `${configArg.coverageTreshold.toString()}%`
)
plugins.beautylog.error('exiting due to coverage failure')
if (!configArg.watch) { process.exit(1) }
}
return configArg
}
export let run = function (configArg: INpmtsConfig) {
let done = q.defer<INpmtsConfig>()
let config = configArg
if (config.test === true) {
plugins.beautylog.ora.text('now starting tests')
plugins.beautylog.log(
'------------------------------------------------------\n' +
'*************************** TESTS: ***************************\n' +
'--------------------------------------------------------------'
)
let done = q.defer<INpmtsConfig>()
let config = configArg
if (config.test === true) {
plugins.beautylog.ora.text('now starting tests')
plugins.beautylog.ora.end()
plugins.beautylog.log('ready for tapbuffer:')
mocha(config)
.then(coverage)
.then(() => {
done.resolve(config)
}).catch(err => { console.log(err) })
} else {
plugins.beautylog.ora.end()
tap(config)
.then(handleCoverageData)
.then(() => {
done.resolve(config)
}
return done.promise
}).catch(err => { console.log(err) })
} else {
plugins.beautylog.ora.end()
done.resolve(config)
}
return done.promise
}

View File

@ -2,18 +2,16 @@ export * from '../npmts.plugins'
import * as gulp from 'gulp'
import * as gulpFunction from 'gulp-function'
import * as gulpIstanbul from 'gulp-istanbul'
let gulpInjectModules = require('gulp-inject-modules')
import * as gulpMocha from 'gulp-mocha'
import * as gulpSourcemaps from 'gulp-sourcemaps'
import * as gulpTypeScript from 'gulp-typescript'
import * as smartcov from 'smartcov'
import * as tapbuffer from 'tapbuffer'
export {
gulp,
gulpFunction,
gulpIstanbul,
gulpInjectModules,
gulpMocha,
gulpSourcemaps,
gulpTypeScript
gulpTypeScript,
smartcov,
tapbuffer
}

View File

@ -7,52 +7,66 @@ import * as NpmtsMods from './npmts.mods'
import * as NpmtsWatch from './npmts.watch'
import * as NpmtsShip from './npmts.ship'
export let run = () => {
let done = q.defer()
let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot)
let npmtsCli = new plugins.smartcli.Smartcli()
npmtsCli.standardTask()
.then((argvArg) => {
plugins.beautylog.figletSync('NPMTS')
plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version)
return NpmtsConfig.run(argvArg)
})
.then((configArg: NpmtsConfig.INpmtsConfig) => {
let done = q.defer()
plugins.beautylog.ora.start('loading additional modules...')
NpmtsMods.mod00.load()
.then((mod00) => {
return mod00.run(configArg)
})
.then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>()
NpmtsMods.mod01.load()
.then(mod01 => {
return mod01.run(configArg)
})
.then(configArg => {
done.resolve(configArg)
})
return done.promise
})
.then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>()
NpmtsMods.mod02.load()
.then(mod02 => {
return mod02.run(configArg)
})
.then(configArg => {
done.resolve(configArg)
})
return done.promise
})
.then(NpmtsWatch.run)
.then(NpmtsShip.run)
/**
* smartanalytics
* this data is fully anonymized (no Ips or any other personal information is tracked).
* It just keeps track which of our tools are really used...
* ... so we know where to spend our limited resources for improving them.
* Since yarn is out and there is heavy caching going on,
* pure download stats are just not reliable enough for us anymore
* Feel free to dig into the smartanalytics package, if you are interested in how it works.
* It is just an https call to Google Analytics.
* Our privacy policy can be found here: https://lossless.gmbh/privacy.html
*/
let npmtsAnalytics = new plugins.smartanalytics.AnalyticsAccount('npmts','UA-64087619-5')
npmtsAnalytics.sendEvent('npm','exec','git.zone')
return done.promise
export let run = () => {
let done = q.defer()
let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot)
let npmtsCli = new plugins.smartcli.Smartcli()
npmtsCli.standardTask()
.then((argvArg) => {
plugins.beautylog.figletSync('NPMTS')
plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version)
return NpmtsConfig.run(argvArg)
})
.then((configArg: NpmtsConfig.INpmtsConfig) => {
let done = q.defer()
plugins.beautylog.ora.start('loading additional modules...')
NpmtsMods.mod00.load()
.then((mod00) => {
return mod00.run(configArg)
})
.catch((err) => { if (err instanceof Error) { console.log(err) } } )
npmtsCli.addVersion(npmtsProjectInfo.version)
npmtsCli.startParse()
return done.promise
.then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>()
NpmtsMods.mod01.load()
.then(mod01 => {
return mod01.run(configArg)
})
.then(configArg => {
done.resolve(configArg)
})
return done.promise
})
.then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>()
NpmtsMods.mod02.load()
.then(mod02 => {
return mod02.run(configArg)
})
.then(configArg => {
done.resolve(configArg)
})
return done.promise
})
.then(NpmtsWatch.run)
.then(NpmtsShip.run)
return done.promise
})
.catch((err) => { if (err instanceof Error) { console.log(err) } })
npmtsCli.addVersion(npmtsProjectInfo.version)
npmtsCli.startParse()
return done.promise
}

View File

@ -6,73 +6,77 @@ import * as q from 'smartq'
export type npmtsMode = 'default' | 'custom'
export interface INpmtsConfig {
argv: any,
coverageTreshold: number,
mode: npmtsMode,
test: boolean,
testTs: any,
ts: any,
tsOptions: any,
watch: boolean
argv: any,
coverageTreshold: number,
mode: npmtsMode,
test: boolean,
testTs: any,
ts: any,
tsOptions: any,
watch: boolean
runData: {
coverageLcovInfo?: string,
coverageResult?: number
}
};
export let run = function (argvArg) {
let done = q.defer()
let defaultConfig: INpmtsConfig = {
argv: undefined,
coverageTreshold: 70,
mode: 'default',
test: true,
testTs: {},
ts: {},
tsOptions: {},
watch: false
let done = q.defer()
let defaultConfig: INpmtsConfig = {
argv: undefined,
coverageTreshold: 70,
mode: 'default',
test: true,
testTs: {},
ts: {},
tsOptions: {},
watch: false,
runData: {}
}
// mix with configfile
plugins.beautylog.ora.text('running npmextra')
let localNpmextra = new plugins.npmextra.Npmextra(paths.cwd)
let config: INpmtsConfig = localNpmextra.dataFor<INpmtsConfig>(
'npmts',
defaultConfig
)
// add argv
config.argv = argvArg
// check mode
switch (config.mode) {
case 'default':
case 'custom':
plugins.beautylog.ok('mode is ' + config.mode)
done.resolve(config)
break
default:
plugins.beautylog.error(`mode not recognised!`)
process.exit(1)
};
// handle default mode
if (config.mode === 'default') {
config.ts = {
'./ts/**/*.ts': './dist/'
}
config.testTs = {
'./test/**/*.ts': './test/'
}
};
// mix with configfile
plugins.beautylog.ora.text('running npmextra')
// mix with commandline
if (config.argv.notest) {
config.test = false
};
if (config.argv.watch) {
config.watch = true
};
let localNpmextra = new plugins.npmextra.Npmextra(paths.cwd)
let config: INpmtsConfig = localNpmextra.dataFor<INpmtsConfig>(
'npmts',
defaultConfig
)
// add argv
config.argv = argvArg
// check mode
switch (config.mode) {
case 'default':
case 'custom':
plugins.beautylog.ok('mode is ' + config.mode)
done.resolve(config)
break
default:
plugins.beautylog.error(`mode not recognised!`)
process.exit(1)
};
// handle default mode
if (config.mode === 'default') {
config.ts = {
'./ts/**/*.ts': './dist/'
}
config.testTs = {
'./test/**/*.ts': './test/'
}
};
// mix with commandline
if (config.argv.notest) {
config.test = false
};
if (config.argv.watch) {
config.watch = true
};
plugins.beautylog.ok('build options are ready!')
done.resolve(config)
return done.promise
plugins.beautylog.ok('build options are ready!')
done.resolve(config)
return done.promise
}

View File

@ -6,8 +6,8 @@ import * as lodash from 'lodash'
import * as npmextra from 'npmextra'
import * as projectinfo from 'projectinfo'
import * as path from 'path'
import * as smartanalytics from 'smartanalytics'
import * as smartcli from 'smartcli'
import * as smartcov from 'smartcov'
import * as smartenv from 'smartenv'
import * as smartfile from 'smartfile'
import * as smartpath from 'smartpath'
@ -24,8 +24,8 @@ export {
npmextra,
projectinfo,
path,
smartanalytics,
smartcli,
smartcov,
smartenv,
smartfile,
smartpath,

859
yarn.lock

File diff suppressed because it is too large Load Diff