Compare commits

...

24 Commits

Author SHA1 Message Date
54bbab232e 5.3.24 2016-07-19 00:25:37 +02:00
380407b5e8 improve README 2016-07-19 00:25:31 +02:00
2a5583946c 5.3.23 2016-07-18 19:06:04 +02:00
80e36a34ee now using initial cwd for writing coverage reports 2016-07-18 19:06:00 +02:00
1f90f4abff 5.3.22 2016-07-17 17:13:53 +02:00
3c7f5f1e2d now using npmextra 2016-07-17 17:13:47 +02:00
8104609306 5.3.21 2016-07-16 23:33:14 +02:00
a3077f7800 improve README 2016-07-16 23:33:10 +02:00
c947121243 5.3.20 2016-07-16 20:54:57 +02:00
4b3f0649fa now much faster due to skipping html coverage report 2016-07-16 20:54:52 +02:00
523c62530f 5.3.19 2016-07-16 20:14:47 +02:00
aa57617fc7 another fix 2016-07-16 20:14:43 +02:00
ef89a33dfc 5.3.18 2016-07-16 19:23:37 +02:00
474a730a09 another fix 2016-07-16 19:23:34 +02:00
e3b029c240 5.3.17 2016-07-16 19:08:23 +02:00
290824190d fix dependency 2016-07-16 19:08:20 +02:00
923d78caab 5.3.16 2016-07-16 19:05:17 +02:00
6587b74a23 now using better babel config 2016-07-16 19:05:12 +02:00
aa0a35f258 5.3.15 2016-07-15 19:27:56 +02:00
09b8809ede fix test 2016-07-15 19:27:53 +02:00
e25566490b 5.3.14 2016-07-15 18:18:14 +02:00
3ed7473066 fix istanbul 2016-07-15 18:18:11 +02:00
1202a68b01 5.3.13 2016-07-15 12:22:29 +02:00
c67d43e16d prevent typedoc from causing build fail 2016-07-15 12:22:19 +02:00
16 changed files with 161 additions and 156 deletions

View File

@ -1,5 +1,5 @@
# npmts
Write npm modules with TypeScript without hassle.
Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
## Status
[![build status](https://gitlab.com/pushrocks/npmts/badges/master/build.svg)](https://gitlab.com/pushrocks/npmts/commits/master)
@ -36,48 +36,45 @@ Then add it to your package.json's script section to trigger a build:
### Default task execution order
1. Check config in ./npmts.json
1. Clean up from any previous builds (old js files)
1. Install typings
1. Transpile TypeScript with **inline sourcemaps** and **declaration files**
1. Create EsDoc Documentation
1. Instrumentalize created JavaScript files with istanbul
1. Run Tests
1. Create Coverage report
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. **Transpile:** Transpile TypeScript with **inline sourcemaps** and **declaration files** to ES6
1. **Documentation:** Create TypeDoc Documentation from TypeScript files
1. **Test:** Babelify ES6 to ES5 on the fly, instrumentalize ES5 JavaScript with istanbul and run tests with Mocha.
#### npmts.json
the npmts.json is the main config file. You can use it to customize the behaviour of NPMTS.
### npmextra.json
the npmts section in npmtsextra.json can be used to configure npmts.
```json
{
"mode":"default",
"ts":{
"./customdir/*.ts":"./"
},
"tsOptions":{
"declaration":false,
"target":"ES6"
},
"cli":true
"npmts":{
"mode":"default",
"ts":{
"./customdir/*.ts":"./"
},
"tsOptions":{
"declaration":false,
"target":"ES6"
},
"cli":true
}
}
```
| key | default value | description |
| --- | --- | --- |
| `"codecov"` | `true` | if true, coverage data will be uploaded to codecov when running on travis |
| `"docs"` | `{"publish":"false"}` | `{"publish":true, destination:"github"}` lets you control what happens with your module documentation |
| `"mode"` | `"default"` | "default" will do some defualt stuff, "custom" only does what you specify |
| `"mode"` | `"default"` | "default" will do some default stuff, "custom" only does what you specify |
| `"tsOptions"` | `{"target":"ES5", "declaration":"true"}` | specify options for tsc |
| `"typings"` | `["./ts/typings.json"]` | allows you to specify multiple locations for typings.json to install. This is needed for modules that do not yet bundle typings |
| `"cli"` | "false" | some modules are designed to be used from cli. If set to true NPMTS will create a cli.js that wires you dist files up for cli use. |
#### TypeScript
### TypeScript
by default npmts looks for `./ts/*.ts` and `./test/test.ts` that will compile to
`./dist/*.js` and `./test/test.js`
Use commonjs module system for wiring up files.
#### Declaration files
### Declaration files
**npmts** also creates an `./dist/index.d.ts` declaration file by default.
You can reference it in your package.json like this.
@ -90,6 +87,7 @@ This is in line with the latest TypeScript best practices.
You can then import plugins via the TypeScript `import` Syntax
and tsc will pick up the declaration file automatically.
## Some notes:
#### Typings for third party modules that do not bundle declaration files
NPMTS does no longer supports typings.json. Instead use the new TypeScript 2.x approach to typings using the @types/ npm scope.
@ -97,22 +95,20 @@ NPMTS does no longer supports typings.json. Instead use the new TypeScript 2.x a
npmts instrumentalizes (using istanbul) the created JavaScript code to create a coverage report.
#### Tests
When Typings have been installed, TypeScript + Declaration files have been transpiled and the resulting JS has been instrumentalized,
npmts looks for `.test/test.ts` which will be transpiled to test.js and run with mocha.
Any errors will be shown with reference to their originating source in TypeScript
thanks to autogenerated source maps.
## Example Usage in modules:
* [gulp-browser](https://www.npmjs.com/package/gulp-typings)
* [gulp-browser](https://www.npmjs.com/package/gulp-browser)
> We will add more options over time.
## 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/npmtspage) to create a webpage from coverage reports and EsDocs for the module
* 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 [npmdocker](https://www.npmjs.com/package/npmdocker) for running tests consistently with docker.
## About the authors:
[![Project Phase](https://mediaserve.lossless.digital/lossless.com/img/createdby_github.svg)](https://lossless.com/)

1
dist/npmts.cli.d.ts vendored
View File

@ -1 +0,0 @@
import "typings-global";

2
dist/npmts.cli.js vendored
View File

@ -1,2 +0,0 @@
"use strict";
require("typings-global");

View File

@ -9,7 +9,7 @@ var compileTs = function (tsFileArrayArg, tsOptionsArg) {
var done = plugins.Q.defer();
var tsOptionsDefault = {
declaration: true,
target: "ES5",
target: "ES6",
module: "commonjs"
};
/**

View File

@ -2,33 +2,34 @@
require("typings-global");
var plugins = require("./npmts.plugins");
var paths = require("./npmts.paths");
var npmts_promisechain_1 = require("./npmts.promisechain");
exports.run = function (argvArg) {
var done = plugins.Q.defer();
var config = {};
var configPath = plugins.path.join(paths.cwd, "npmts.json");
npmts_promisechain_1.npmtsOra.text("looking for npmextra.json");
var defaultConfig = {
mode: "default",
notest: false
};
if (argvArg.notest) {
config.notest = true;
}
if (plugins.smartfile.fs.fileExistsSync(configPath)) {
plugins.beautylog.info("npmts.json".blue + " config file found!");
config = plugins.lodashObject.assign(config, plugins.smartfile.fs.toObjectSync(configPath));
switch (config.mode) {
case "default":
case "custom":
plugins.beautylog.ok("mode is " + config.mode.yellow);
done.resolve(config);
break;
default:
plugins.beautylog.error("mode " + config.mode.yellow + " not recognised!".red);
process.exit(1);
}
;
}
else {
plugins.beautylog.log("no config file found: so mode is " + "default".yellow);
config.mode = "default";
done.resolve(config);
defaultConfig.notest = true;
}
;
var config = plugins.npmextra.dataFor({
toolName: "npmts",
defaultSettings: defaultConfig,
cwd: paths.cwd
});
switch (config.mode) {
case "default":
case "custom":
plugins.beautylog.ok("mode is " + config.mode.yellow);
done.resolve(config);
break;
default:
plugins.beautylog.error("mode " + config.mode.yellow + " not recognised!".red);
process.exit(1);
}
;
done.resolve(config);
return done.promise;
};

View File

@ -2,15 +2,17 @@ import "typings-global";
export import beautylog = require("beautylog");
export declare let gulp: any;
export declare let g: {
gFunction: any;
babel: any;
istanbul: any;
gFunction: any;
injectModules: any;
mocha: any;
replace: any;
sourcemaps: any;
typedoc: any;
};
export declare let lodashObject: any;
export declare let merge2: any;
export import npmextra = require("npmextra");
export import projectinfo = require("projectinfo");
export import path = require("path");
export import Q = require("q");

View File

@ -3,15 +3,17 @@ require("typings-global");
exports.beautylog = require("beautylog");
exports.gulp = require("gulp");
exports.g = {
gFunction: require("gulp-function"),
babel: require("gulp-babel"),
istanbul: require("gulp-istanbul"),
gFunction: require("gulp-function"),
injectModules: require("gulp-inject-modules"),
mocha: require("gulp-mocha"),
replace: require("gulp-replace"),
sourcemaps: require("gulp-sourcemaps"),
typedoc: require("gulp-typedoc")
};
exports.lodashObject = require('lodash/fp/object');
exports.merge2 = require("merge2");
exports.npmextra = require("npmextra");
exports.projectinfo = require("projectinfo");
exports.path = require("path");
exports.Q = require("q");

55
dist/npmts.tests.js vendored
View File

@ -7,34 +7,38 @@ var npmts_promisechain_1 = require("./npmts.promisechain");
*
* @returns {*}
*/
var istanbul = function (configArg) {
npmts_promisechain_1.npmtsOra.text("Instrumentalizing transpiled JS...");
var mocha = function (configArg) {
npmts_promisechain_1.npmtsOra.text("Instrumentalizing and testing transpiled JS");
npmts_promisechain_1.npmtsOra.end(); // end npmtsOra for tests.
var done = plugins.Q.defer();
var stream = plugins.gulp.src([plugins.path.join(paths.cwd, "dist/*.js")])
.pipe(plugins.g.sourcemaps.init())
.pipe(plugins.g.istanbul()) // Covering files
.pipe(plugins.g.babel({
presets: [
require.resolve("babel-preset-es2015")
]
}))
.pipe(plugins.g.istanbul({}))
.pipe(plugins.g.sourcemaps.write())
.pipe(plugins.g.istanbul.hookRequire()) // Force `require` to return covered files
.pipe(plugins.g.gFunction(function () {
plugins.beautylog.ok("JS has been instrumentalized to get test code coverage!");
done.resolve(configArg);
}, "atEnd"));
return done.promise;
};
/**
*
* @returns {*}
*/
var mocha = function (configArg) {
var done = plugins.Q.defer();
npmts_promisechain_1.npmtsOra.end(); // end npmtsOra for tests.
var stream = plugins.gulp.src(["./test/test.js"])
.pipe(plugins.g.mocha())
.pipe(plugins.g.istanbul.writeReports()) // Creating the reports after tests ran
.pipe(plugins.g.gFunction(function () {
plugins.beautylog.ok("Tests have passed!");
done.resolve(configArg);
}, "atEnd"));
.pipe(plugins.g.injectModules())
.on("finish", function () {
plugins.gulp.src([plugins.path.join(paths.cwd, "test/test.js")])
.pipe(plugins.g.babel({
presets: [
plugins.path.join(paths.npmtsPackageRoot, "node_modules/babel-preset-es2015/index.js")
]
}))
.pipe(plugins.g.injectModules())
.pipe(plugins.g.mocha())
.pipe(plugins.g.istanbul.writeReports({
dir: plugins.path.join(paths.cwd, "./coverage"),
reporters: ['lcovonly', 'json', 'text', 'text-summary']
}))
.pipe(plugins.g.gFunction(function () {
plugins.beautylog.ok("Tested!");
done.resolve(configArg);
}, "atEnd"));
});
return done.promise;
};
var coverage = function (configArg) {
@ -63,8 +67,7 @@ exports.run = function (configArg) {
plugins.beautylog.log("-------------------------------------------------------\n" +
"*************************** TESTS: ***************************\n" +
"--------------------------------------------------------------");
istanbul(config)
.then(mocha)
mocha(config)
.then(coverage)
.then(function () {
done.resolve(config);

View File

@ -5,7 +5,7 @@ var paths = require("./npmts.paths");
var npmts_promisechain_1 = require("./npmts.promisechain");
var genTypeDoc = function (configArg) {
var done = plugins.Q.defer();
npmts_promisechain_1.npmtsOra.text("now generating " + "EsDoc documentation".yellow);
npmts_promisechain_1.npmtsOra.text("now generating " + "TypeDoc documentation".yellow);
plugins.beautylog.log("TypeDoc Output:");
plugins.gulp.src(plugins.path.join(paths.tsDir, "**/*.ts"))
.pipe(plugins.g.typedoc({
@ -19,7 +19,7 @@ var genTypeDoc = function (configArg) {
// TypeDoc options (see typedoc docs)
name: "my-project",
//theme: "default",
ignoreCompilerErrors: false,
ignoreCompilerErrors: true,
version: true,
}))
.pipe(plugins.g.gFunction(done.resolve, "atEnd"));

View File

@ -1,7 +1,7 @@
{
"name": "npmts",
"version": "5.3.12",
"description": "write npm modules with TypeScript",
"version": "5.3.24",
"description": "Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.",
"main": "dist/index.js",
"bin": {
"npmts": "dist/cli.js"
@ -29,24 +29,25 @@
},
"homepage": "https://gitlab.com/pushrocks/npmts#readme",
"dependencies": {
"@types/minimatch": "*",
"@types/q": "*",
"@types/shelljs": "*",
"@types/minimatch": "^2.0.28",
"@types/q": "^0.0.27",
"@types/shelljs": "^0.3.27",
"babel-preset-es2015": "^6.9.0",
"beautylog": "5.0.14",
"early": "^2.0.13",
"esdoc": "^0.4.7",
"gulp": "3.9.1",
"gulp-babel": "^6.1.2",
"gulp-concat": "^2.6.0",
"gulp-function": "^1.3.6",
"gulp-if": "^2.0.1",
"gulp-inject-modules": "^1.0.0",
"gulp-istanbul": "^1.0.0",
"gulp-jsdoc3": "^0.3.0",
"gulp-mocha": "^2.2.0",
"gulp-replace": "^0.5.4",
"gulp-sourcemaps": "^1.6.0",
"gulp-typedoc": "^2.0.0",
"lodash": "^4.13.1",
"merge2": "1.0.2",
"npmextra": "^1.0.7",
"projectinfo": "1.0.3",
"q": "^1.4.1",
"shelljs": "^0.7.0",

View File

@ -1 +0,0 @@
import "typings-global";

View File

@ -10,7 +10,7 @@ let compileTs = (tsFileArrayArg:string[],tsOptionsArg = {}) => {
let tsOptionsDefault = {
declaration: true,
target: "ES5",
target: "ES6",
module: "commonjs"
};

View File

@ -1,33 +1,32 @@
import "typings-global";
import plugins = require("./npmts.plugins");
import paths = require("./npmts.paths");
import {npmtsOra} from "./npmts.promisechain";
export var run = function(argvArg){
var done = plugins.Q.defer();
var config:any = {};
var configPath = plugins.path.join(paths.cwd,"npmts.json");
if(argvArg.notest){
config.notest = true;
}
if(plugins.smartfile.fs.fileExistsSync(configPath)){
plugins.beautylog.info("npmts.json".blue + " config file found!");
config = plugins.lodashObject.assign(
config,
plugins.smartfile.fs.toObjectSync(configPath)
);
switch (config.mode){
case "default":
case "custom":
plugins.beautylog.ok("mode is " + config.mode.yellow);
done.resolve(config);
break;
default:
plugins.beautylog.error("mode " + config.mode.yellow + " not recognised!".red);
process.exit(1);
};
} else {
plugins.beautylog.log("no config file found: so mode is " + "default".yellow);
config.mode = "default";
done.resolve(config);
let done = plugins.Q.defer();
npmtsOra.text("looking for npmextra.json");
let defaultConfig = {
mode: "default",
notest:false
};
if(argvArg.notest){
defaultConfig.notest = true;
};
let config = plugins.npmextra.dataFor({
toolName:"npmts",
defaultSettings:defaultConfig,
cwd:paths.cwd
});
switch (config.mode){
case "default":
case "custom":
plugins.beautylog.ok("mode is " + config.mode.yellow);
done.resolve(config);
break;
default:
plugins.beautylog.error("mode " + config.mode.yellow + " not recognised!".red);
process.exit(1);
};
done.resolve(config);
return done.promise;
};

View File

@ -2,15 +2,17 @@ import "typings-global";
export import beautylog = require("beautylog");
export let gulp = require("gulp");
export let g = {
gFunction: require("gulp-function"),
babel: require("gulp-babel"),
istanbul: require("gulp-istanbul"),
gFunction: require("gulp-function"),
injectModules: require("gulp-inject-modules"),
mocha: require("gulp-mocha"),
replace: require("gulp-replace"),
sourcemaps: require("gulp-sourcemaps"),
typedoc: require("gulp-typedoc")
};
export let lodashObject = require('lodash/fp/object');
export let merge2 = require("merge2");
export import npmextra = require("npmextra");
export import projectinfo = require("projectinfo");
export import path = require("path");
export import Q = require("q");

View File

@ -7,35 +7,39 @@ import {npmtsOra} from "./npmts.promisechain";
*
* @returns {*}
*/
let istanbul = function (configArg) {
npmtsOra.text("Instrumentalizing transpiled JS...");
let mocha = function (configArg) {
npmtsOra.text("Instrumentalizing and testing transpiled JS");
npmtsOra.end(); // end npmtsOra for tests.
let done = plugins.Q.defer();
var stream = plugins.gulp.src([plugins.path.join(paths.cwd,"dist/*.js")])
.pipe(plugins.g.sourcemaps.init())
.pipe(plugins.g.istanbul()) // Covering files
.pipe(plugins.g.babel({
presets: [
require.resolve("babel-preset-es2015")
]
}))
.pipe(plugins.g.istanbul({
}))
.pipe(plugins.g.sourcemaps.write())
.pipe(plugins.g.istanbul.hookRequire()) // Force `require` to return covered files
.pipe(plugins.g.gFunction(function(){
plugins.beautylog.ok("JS has been instrumentalized to get test code coverage!");
done.resolve(configArg);
},"atEnd"));
return done.promise;
};
/**
*
* @returns {*}
*/
let mocha = function (configArg) {
let done = plugins.Q.defer();
npmtsOra.end(); // end npmtsOra for tests.
let stream = plugins.gulp.src(["./test/test.js"])
.pipe(plugins.g.mocha())
.pipe(plugins.g.istanbul.writeReports()) // Creating the reports after tests ran
.pipe(plugins.g.gFunction(function(){
plugins.beautylog.ok("Tests have passed!");
done.resolve(configArg);
},"atEnd"));
.pipe(plugins.g.injectModules())
.on("finish",function(){
plugins.gulp.src([plugins.path.join(paths.cwd,"test/test.js")])
.pipe(plugins.g.babel({
presets: [
plugins.path.join(paths.npmtsPackageRoot,"node_modules/babel-preset-es2015/index.js")
]
}))
.pipe(plugins.g.injectModules())
.pipe(plugins.g.mocha())
.pipe(plugins.g.istanbul.writeReports({
dir: plugins.path.join(paths.cwd,"./coverage"),
reporters: [ 'lcovonly', 'json', 'text', 'text-summary']
}))
.pipe(plugins.g.gFunction(function(){
plugins.beautylog.ok("Tested!");
done.resolve(configArg);
},"atEnd"));
});
return done.promise;
};
@ -72,8 +76,7 @@ export let run = function(configArg) {
"--------------------------------------------------------------"
);
istanbul(config)
.then(mocha)
mocha(config)
.then(coverage)
.then(() => {
done.resolve(config);

View File

@ -5,7 +5,7 @@ import {npmtsOra} from "./npmts.promisechain";
let genTypeDoc = function(configArg){
let done = plugins.Q.defer();
npmtsOra.text("now generating " + "EsDoc documentation".yellow);
npmtsOra.text("now generating " + "TypeDoc documentation".yellow);
plugins.beautylog.log("TypeDoc Output:");
plugins.gulp.src(plugins.path.join(paths.tsDir,"**/*.ts"))
.pipe(plugins.g.typedoc({
@ -22,7 +22,7 @@ let genTypeDoc = function(configArg){
name: "my-project",
//theme: "default",
ignoreCompilerErrors: false,
ignoreCompilerErrors: true,
version: true,
}))
.pipe(plugins.g.gFunction(done.resolve,"atEnd"));