change npmts package name to being @gitzone scoped

This commit is contained in:
Philipp Kunz 2018-04-09 01:03:39 +02:00
parent 7e46b55de5
commit 896e0095fa
36 changed files with 630 additions and 550 deletions

View File

@ -7,76 +7,84 @@ cache:
key: "$CI_BUILD_STAGE" key: "$CI_BUILD_STAGE"
stages: stages:
- mirror - security
- test - test
- release - release
- trigger - trigger
- pages - pages
mirror: mirror:
image: hosttoday/ht-docker-node:npmci stage: security
stage: mirror
script: script:
- npmci git mirror - npmci git mirror
tags: tags:
- docker - docker
snyk:
stage: security
script:
- npmci command yarn global add snyk
- npmci command yarn install --ignore-scripts
- npmci command snyk test
tags:
- docker
testLEGACY: testLEGACY:
stage: test stage: test
script: script:
- npmci node install legacy - npmci node install legacy
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
allow_failure: true allow_failure: true
testLTS: testLTS:
stage: test stage: test
script: script:
- npmci node install lts - npmci node install lts
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
testSTABLE: testSTABLE:
stage: test stage: test
script: script:
- npmci node install stable - npmci node install stable
- npmci npm install - npmci npm install
- npmci npm test - npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
release: release:
stage: release stage: release
script: script:
- npmci npm prepare - npmci npm prepare
- npmci npm publish - npmci npm publish
only: only:
- tags - tags
tags: tags:
- docker - docker
trigger: trigger:
stage: trigger stage: trigger
script: script:
- npmci trigger - npmci trigger
only: only:
- tags - tags
tags: tags:
- docker - docker
pages: pages:
image: hosttoday/ht-docker-node:npmci image: hosttoday/ht-docker-node:npmci
stage: pages stage: pages
script: script:
- npmci command yarn global add npmpage - npmci command yarn global add npmpage
- npmci command npmpage --publish gitlab - npmci command npmpage
tags: tags:
- docker - docker
only: only:

3
dist/index.js vendored
View File

@ -8,8 +8,7 @@ const early = require("early");
early.start('NPMTS'); early.start('NPMTS');
const plugins = require("./npmts.plugins"); const plugins = require("./npmts.plugins");
const cli = require("./npmts.cli"); const cli = require("./npmts.cli");
early.stop() early.stop().then(() => {
.then(() => {
let loaded = plugins; // to make sure plugins get actually loaded let loaded = plugins; // to make sure plugins get actually loaded
cli.run(); cli.run();
}); });

View File

@ -26,13 +26,16 @@ let checkProjectTypings = (configArg) => {
const depcheckOptions = { const depcheckOptions = {
ignoreBinPackage: false, ignoreBinPackage: false,
parsers: { parsers: {
// the target parsers
'*.ts': plugins.depcheck.parser.typescript '*.ts': plugins.depcheck.parser.typescript
}, },
detectors: [ detectors: [
// the target detectors
plugins.depcheck.detector.requireCallExpression, plugins.depcheck.detector.requireCallExpression,
plugins.depcheck.detector.importDeclaration plugins.depcheck.detector.importDeclaration
], ],
specials: [ specials: [
// the target special parsers
plugins.depcheck.special.eslint, plugins.depcheck.special.eslint,
plugins.depcheck.special.webpack plugins.depcheck.special.webpack
] ]
@ -42,16 +45,18 @@ let checkDependencies = (configArg) => {
plugins.beautylog.ora.text('Check Module: Check Dependencies...'); plugins.beautylog.ora.text('Check Module: Check Dependencies...');
let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, { let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, {
ignoreDirs: [ ignoreDirs: [
// folder with these names will be ignored
'test', 'test',
'dist', 'dist',
'bower_components' 'bower_components'
], ],
ignoreMatches: [ ignoreMatches: [
// ignore dependencies that matches these globs
'@types/*', '@types/*',
'babel-preset-*' 'babel-preset-*'
] ]
}); });
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => { plugins.depcheck(paths.cwd, depcheckOptionsMerged, unused => {
for (let item of unused.dependencies) { for (let item of unused.dependencies) {
plugins.beautylog.warn(`Watch out: unused dependency "${item}"`); plugins.beautylog.warn(`Watch out: unused dependency "${item}"`);
} }
@ -77,16 +82,18 @@ let checkDevDependencies = (configArg) => {
plugins.beautylog.ora.text('Check Module: Check devDependencies...'); plugins.beautylog.ora.text('Check Module: Check devDependencies...');
let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, { let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, {
ignoreDirs: [ ignoreDirs: [
// folder with these names will be ignored
'ts', 'ts',
'dist', 'dist',
'bower_components' 'bower_components'
], ],
ignoreMatches: [ ignoreMatches: [
// ignore dependencies that matches these globs
'@types/*', '@types/*',
'babel-preset-*' 'babel-preset-*'
] ]
}); });
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => { plugins.depcheck(paths.cwd, depcheckOptionsMerged, unused => {
for (let item of unused.devDependencies) { for (let item of unused.devDependencies) {
plugins.beautylog.log(`unused devDependency ${item}`); plugins.beautylog.log(`unused devDependency ${item}`);
} }

View File

@ -7,10 +7,14 @@ exports.run = function (configArg) {
let done = q.defer(); let done = q.defer();
let config = configArg; let config = configArg;
plugins.beautylog.ora.text('now compiling ' + 'TypeScript'); plugins.beautylog.ora.text('now compiling ' + 'TypeScript');
plugins.tsn.compileGlobStringObject(config.ts, config.tsOptions, paths.cwd) plugins.tsn
.compileGlobStringObject(config.ts, config.tsOptions, paths.cwd)
.then(() => { .then(() => {
plugins.beautylog.ok(`compiled the module's TypeScript!`); plugins.beautylog.ok(`compiled the module's TypeScript!`);
done.resolve(config); done.resolve(config);
}).catch(err => { console.log(err); }); })
.catch(err => {
console.log(err);
});
return done.promise; return done.promise;
}; };

View File

@ -18,10 +18,7 @@ let testTypeScriptConfig = {
target: 'ES5', target: 'ES5',
emitDecoratorMetadata: true, emitDecoratorMetadata: true,
experimentalDecorators: true, experimentalDecorators: true,
lib: [ lib: ['DOM', 'ESNext']
'DOM',
'ESNext'
]
}; };
/** /**
* runs mocha * runs mocha
@ -57,13 +54,10 @@ let tap = function (configArg) {
plugins.smartstream.cleanPipe() plugins.smartstream.cleanPipe()
]); ]);
// lets run the smartstream // lets run the smartstream
Promise.all([ Promise.all([testableFilesSmartstream.run(), testFilesSmartstream.run()]).then(() => __awaiter(this, void 0, void 0, function* () {
testableFilesSmartstream.run(),
testFilesSmartstream.run()
]).then(() => __awaiter(this, void 0, void 0, function* () {
configArg.runData.coverageLcovInfo = yield npmtsTapBuffer.runTests(); configArg.runData.coverageLcovInfo = yield npmtsTapBuffer.runTests();
done.resolve(configArg); done.resolve(configArg);
}), (err) => { }), err => {
plugins.beautylog.error('Tests failed!'); plugins.beautylog.error('Tests failed!');
console.log(err); console.log(err);
if (configArg.watch) { if (configArg.watch) {
@ -84,14 +78,14 @@ let handleCoverageData = (configArg) => __awaiter(this, void 0, void 0, function
plugins.beautylog.warn('Hey... Did your tests import and use your module that you are trying to test?'); plugins.beautylog.warn('Hey... Did your tests import and use your module that you are trying to test?');
} }
if (coverageResult >= configArg.coverageTreshold) { if (coverageResult >= configArg.coverageTreshold) {
plugins.beautylog.ok(`${(coverageResult).toString()}% ` plugins.beautylog.ok(`${coverageResult.toString()}% ` +
+ `coverage exceeds your treshold of ` `coverage exceeds your treshold of ` +
+ `${configArg.coverageTreshold.toString()}%`); `${configArg.coverageTreshold.toString()}%`);
} }
else { else {
plugins.beautylog.warn(`${(coverageResult).toString()}% ` plugins.beautylog.warn(`${coverageResult.toString()}% ` +
+ `coverage fails your treshold of ` `coverage fails your treshold of ` +
+ `${configArg.coverageTreshold.toString()}%`); `${configArg.coverageTreshold.toString()}%`);
plugins.beautylog.error('exiting due to coverage failure'); plugins.beautylog.error('exiting due to coverage failure');
if (!configArg.watch) { if (!configArg.watch) {
process.exit(1); process.exit(1);
@ -111,13 +105,19 @@ exports.run = function (configArg) {
.then(handleCoverageData) .then(handleCoverageData)
.then(() => { .then(() => {
done.resolve(config); done.resolve(config);
}).catch(err => { console.log(err); }); })
.catch(err => {
console.log(err);
});
} }
else { else {
tap(config) tap(config)
.then(() => { .then(() => {
done.resolve(config); done.resolve(config);
}).catch(err => { console.log(err); }); })
.catch(err => {
console.log(err);
});
} }
} }
else { else {

30
dist/npmts.cli.js vendored
View File

@ -33,12 +33,14 @@ let npmtsAnalytics = new plugins.smartanalytics.Analytics({
}); });
process.nextTick(() => __awaiter(this, void 0, void 0, function* () { process.nextTick(() => __awaiter(this, void 0, void 0, function* () {
// make the analytics call // make the analytics call
npmtsAnalytics.recordEvent('npmToolExecution', { npmtsAnalytics
.recordEvent('npmToolExecution', {
executionMode: (yield NpmtsConfig.configPromise).mode, executionMode: (yield NpmtsConfig.configPromise).mode,
tsOptions: (yield NpmtsConfig.configPromise).tsOptions, tsOptions: (yield NpmtsConfig.configPromise).tsOptions,
watch: (yield NpmtsConfig.configPromise).watch, watch: (yield NpmtsConfig.configPromise).watch,
coverageTreshold: (yield NpmtsConfig.configPromise).coverageTreshold coverageTreshold: (yield NpmtsConfig.configPromise).coverageTreshold
}).catch(err => { })
.catch(err => {
plugins.beautylog.warn('Lossless Analytics API not available...'); plugins.beautylog.warn('Lossless Analytics API not available...');
}); });
})); }));
@ -50,21 +52,24 @@ exports.run = () => __awaiter(this, void 0, void 0, function* () {
yield plugins.smartupdate.standardHandler.check('npmts', npmtsProjectInfo.version, 'http://gitzone.gitlab.io/npmts/changelog.html'); yield plugins.smartupdate.standardHandler.check('npmts', npmtsProjectInfo.version, 'http://gitzone.gitlab.io/npmts/changelog.html');
plugins.beautylog.log('---------------------------------------------'); plugins.beautylog.log('---------------------------------------------');
let npmtsCli = new plugins.smartcli.Smartcli(); let npmtsCli = new plugins.smartcli.Smartcli();
npmtsCli.standardTask() npmtsCli
.then((argvArg) => { .standardTask()
.then(argvArg => {
plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version); plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version);
return NpmtsConfig.run(argvArg); return NpmtsConfig.run(argvArg);
}) })
.then((configArg) => { .then((configArg) => {
let done = q.defer(); let done = q.defer();
plugins.beautylog.ora.start('loading additional modules...'); plugins.beautylog.ora.start('loading additional modules...');
NpmtsMods.modCompile.load() NpmtsMods.modCompile
.then((modCompile) => { .load()
.then(modCompile => {
return modCompile.run(configArg); return modCompile.run(configArg);
}) })
.then(configArg => { .then(configArg => {
let done = q.defer(); let done = q.defer();
NpmtsMods.modDocs.load() NpmtsMods.modDocs
.load()
.then(modDocs => { .then(modDocs => {
return modDocs.run(configArg); return modDocs.run(configArg);
}) })
@ -75,7 +80,8 @@ exports.run = () => __awaiter(this, void 0, void 0, function* () {
}) })
.then(configArg => { .then(configArg => {
let done = q.defer(); let done = q.defer();
NpmtsMods.modTest.load() NpmtsMods.modTest
.load()
.then(modTest => { .then(modTest => {
return modTest.run(configArg); return modTest.run(configArg);
}) })
@ -88,9 +94,11 @@ exports.run = () => __awaiter(this, void 0, void 0, function* () {
.then(NpmtsShip.run); .then(NpmtsShip.run);
return done.promise; return done.promise;
}) })
.catch((err) => { if (err instanceof Error) { .catch(err => {
console.log(err); if (err instanceof Error) {
} }); console.log(err);
}
});
npmtsCli.addVersion(npmtsProjectInfo.version); npmtsCli.addVersion(npmtsProjectInfo.version);
npmtsCli.startParse(); npmtsCli.startParse();
return yield done.promise; return yield done.promise;

2
dist/npmts.watch.js vendored
View File

@ -16,7 +16,7 @@ exports.run = (configArg) => {
pathsToWatch.push(key); pathsToWatch.push(key);
} }
npmtsSmartchok = new smartchok.Smartchok(pathsToWatch); npmtsSmartchok = new smartchok.Smartchok(pathsToWatch);
npmtsSmartchok.getObservableFor('change').then((changeObservableArg) => { npmtsSmartchok.getObservableFor('change').then(changeObservableArg => {
plugins.beautylog.info('now watching...'); plugins.beautylog.info('now watching...');
changeObservableArg.subscribe(() => { changeObservableArg.subscribe(() => {
cli.run(); cli.run();

View File

@ -1,6 +1,7 @@
# Changelog # Changelog
## 2017-07-30: Version 7.x.x -> 8.x.x ## 2017-07-30: Version 7.x.x -> 8.x.x
Testfiles in ./test/ can now import files directly from the ts dir: Testfiles in ./test/ can now import files directly from the ts dir:
```javascript ```javascript

View File

@ -1,58 +1,65 @@
--- ---
name: config name: config
--- ---
# Configuration # Configuration
npmts can be configured to your needs. npmts can be configured to your needs.
### npmextra.json ### npmextra.json
the npmts section in npmextra.json can be used to configure npmts. the npmts section in npmextra.json can be used to configure npmts.
**Default** **Default**
>Note: When you are using `"mode":"default"` it'll cause npmts to override any other settings you may have made except for tsOptions (ES target etc.)
with default behaviour. > Note: When you are using `"mode":"default"` it'll cause npmts to override any other settings you may have made except for tsOptions (ES target etc.)
> with default behaviour.
```json ```json
{ {
"npmts":{ "npmts": {
"mode":"default" "mode": "default"
} }
} }
``` ```
**Custom settings** **Custom settings**
```json ```json
{ {
"mode":"custom", "mode": "custom",
"test":true, "test": true,
"npmts":{ "npmts": {
"ts":{ "ts": {
"./customdir/*.ts":"./" "./customdir/*.ts": "./"
}, },
"tsOptions":{ "tsOptions": {
"declaration":false, "declaration": false,
"target":"ES6" "target": "ES6"
}, },
"cli":true "cli": true
} }
} }
``` ```
| key | default value | description | | key | default value | description |
| --- | --- | --- | | -------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `"mode"` | `"default"` | "default" will do default stuff and override , "custom" only does what you specify, "merge" will merge default options with whatever you specify on your own | | `"mode"` | `"default"` | "default" will do default stuff and override , "custom" only does what you specify, "merge" will merge default options with whatever you specify on your own |
| `"test"` | `true` | test your module | | `"test"` | `true` | test your module |
| `"ts"` | `{"./ts/*.ts":"./","./test/test.ts":"./test/"}` | allows you to define multiple ts portions | | `"ts"` | `{"./ts/*.ts":"./","./test/test.ts":"./test/"}` | allows you to define multiple ts portions |
| `"tsOptions"` | `{"target":"ES5", "declaration":"true"}` | specify options for tsc | | `"tsOptions"` | `{"target":"ES5", "declaration":"true"}` | specify options for tsc |
| `"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. | | `"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. |
| `"testConfig"` | `{ parallel: true, coverage: true }` | allows you to control test behaviour. `"parallel"` controls wether testfiles are run sequentially or in parallel, and `"coverage` wether to create coverage reports | | `"testConfig"` | `{ parallel: true, coverage: true }` | allows you to control test behaviour. `"parallel"` controls wether testfiles are run sequentially or in parallel, and `"coverage` wether to create coverage reports |
### TypeScript ### TypeScript
by default npmts looks for `./ts/*.ts` and `./test/test.ts` that will compile to by default npmts looks for `./ts/*.ts` and `./test/test.ts` that will compile to
`./dist/*.js` and `./test/test.js` `./dist/*.js` and `./test/test.js`
Use commonjs module system for wiring up files. Use commonjs module system for wiring up files.
### Declaration files ### Declaration files
**npmts** also creates declaration files like `./dist/index.d.ts` by default. **npmts** also creates declaration files like `./dist/index.d.ts` by default.
You can reference it in your package.json like this. You can reference it in your package.json like this.
@ -66,12 +73,16 @@ You can then import plugins via the TypeScript `import` Syntax
and tsc will pick up the declaration file automatically. and tsc will pick up the declaration file automatically.
## Some notes: ## Some notes:
#### Typings for third party modules that do not bundle declaration files #### Typings for third party modules that do not bundle declaration files
NPMTS no longer supports typings.json. Instead use the new TypeScript 2.x approach to typings using the @types/ npm scope. NPMTS no longer supports typings.json. Instead use the new TypeScript 2.x approach to typings using the @types/ npm scope.
#### Instrumentalize Code #### Instrumentalize Code
npmts instrumentalizes (using istanbul) the created JavaScript code to create a coverage report. npmts instrumentalizes (using istanbul) the created JavaScript code to create a coverage report.
#### Tests #### Tests
Any errors will be shown with reference to their originating source in TypeScript Any errors will be shown with reference to their originating source in TypeScript
thanks to autogenerated source maps. thanks to autogenerated source maps.

View File

@ -1,11 +1,13 @@
--- ---
name: Default Behaviour name: Default Behaviour
--- ---
# Default Behaviour # Default Behaviour
when you don't configure it otherwise. when you don't configure it otherwise.
1. **Config:** Check config in ./npmextra.json (Check out [npmextra](https://www.npmjs.com/package/npmextra)) 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. **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. **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. **Transpile:** Transpile TypeScript with **inline sourcemaps** and **declaration files** to ES target
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. 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,15 +1,17 @@
--- ---
name: Examples name: Examples
--- ---
# Examples # Examples
modules that use npmts in theis development workflow modules that use npmts in theis development workflow
Module Name | Description | Module Name | Description |
--- | --- | ---------------------------------------------------------- | --------------------------- |
[gitzone](https://www.npmjs.com/package/gitzone) | fast npm module prototyping | [gitzone](https://www.npmjs.com/package/gitzone) | fast npm module prototyping |
[gulp-browser](https://www.npmjs.com/package/gulp-browser) | browserify for gulp | [gulp-browser](https://www.npmjs.com/package/gulp-browser) | browserify for gulp |
[npmdocker](https://www.npmjs.com/package/npmdocker) | dockerized npm development | [npmdocker](https://www.npmjs.com/package/npmdocker) | dockerized npm development |
[smartcli](https://www.npmjs.com/package/smartcli) | easy cli tool creation | [smartcli](https://www.npmjs.com/package/smartcli) | easy cli tool creation |
> There are tons more... We will add them here over time. > There are tons more... We will add them here over time.

View File

@ -2,7 +2,9 @@
name: Get Started name: Get Started
description: learn how to quickly write npm TypeScript modules description: learn how to quickly write npm TypeScript modules
--- ---
# Get Started with NPMTS # Get Started with NPMTS
and learn how to quickly write npm TypeScript modules and learn how to quickly write npm TypeScript modules
## Step1: Install the tools ## Step1: Install the tools

View File

@ -2,16 +2,20 @@
name: Index name: Index
description: best practice npm TypeScript modules description: best practice npm TypeScript modules
--- ---
# npmts # npmts
best practice npm TypeScript modules best practice npm TypeScript modules
## Availabililty ## Availabililty
[![npm](https://gitzone.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/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-git.svg)](https://GitLab.com/gitzone/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-mirror.svg)](https://github.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/) [![docs](https://gitzone.gitlab.io/assets/repo-button-docs.svg)](https://gitzone.gitlab.io/npmts/)
## Status for master ## Status for master
[![build status](https://GitLab.com/gitzone/npmts/badges/master/build.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) [![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) [![npm downloads per month](https://img.shields.io/npm/dm/npmts.svg)](https://www.npmjs.com/package/npmts)
@ -23,17 +27,19 @@ best practice npm TypeScript modules
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/) [![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Quick Demo ## Quick Demo
[![asciicast](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze.png)](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze?speed=2&t=0) [![asciicast](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze.png)](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze?speed=2&t=0)
## Usage ## Usage
NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript. NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript.
npmts will npmts will
1. check your dependencies and package.json (unused, missing, updates, security) 1. check your dependencies and package.json (unused, missing, updates, security)
1. transpile your code with tsc, 1. transpile your code with tsc,
1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes) 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) 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). For more information on how tests are run check out the [tapbuffer module](https://www.npmjs.com/package/tapbuffer).
@ -41,6 +47,6 @@ This works on your machine and in CI. There is a prebuild docker image available
[hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/) [hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/)
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) > MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html) > | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https:/git.zone) [![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https:/git.zone)

View File

@ -1,8 +1,9 @@
# Install npmts # Install npmts
Get started with TypeScript awesomeness. Get started with TypeScript awesomeness.
> **npmts-g* checks if the global version of npmts suffices the modules requirements. > \*_npmts-g_ checks if the global version of npmts suffices the modules requirements.
If not it installs npmts locally in the right version during npm install. > If not it installs npmts locally in the right version during npm install.
```sh ```sh
npm install npmts -g # installs npmts globally npm install npmts -g # installs npmts globally

View File

@ -2,6 +2,7 @@
name: npmts project structure name: npmts project structure
description: how npmts projects are structured description: how npmts projects are structured
--- ---
# npmts - Project Structure # npmts - Project Structure
**locally** **locally**

5
npmextra.json Normal file
View File

@ -0,0 +1,5 @@
{
"npmci": {
"npmAccessLevell": "public"
}
}

View File

@ -1,5 +1,5 @@
{ {
"name": "npmts", "name": "@gitzone/npmts",
"version": "8.0.27", "version": "8.0.27",
"description": "best practice npm TypeScript modules", "description": "best practice npm TypeScript modules",
"main": "dist/index.js", "main": "dist/index.js",

View File

@ -1,35 +1,40 @@
# npmts # npmts
best practice npm TypeScript modules best practice npm TypeScript modules
## Availabililty ## Availabililty
[![npm](https://gitzone.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/npmts)
[![npm](https://gitzone.gitlab.io/assets/repo-button-npm.svg)](https://www.npmjs.com/package/@gitzone/npmts)
[![git](https://gitzone.gitlab.io/assets/repo-button-git.svg)](https://GitLab.com/gitzone/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) [![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/) [![docs](https://gitzone.gitlab.io/assets/repo-button-docs.svg)](https://gitzone.gitlab.io/npmts/)
## Status for master ## Status for master
[![build status](https://GitLab.com/gitzone/npmts/badges/master/build.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) [![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) [![npm downloads per month](https://img.shields.io/npm/dm/@gitzone/npmts.svg)](https://www.npmjs.com/package/npmts)
[![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 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) [![bitHound Code](https://www.bithound.io/github/gitzonetools/npmts/badges/code.svg)](https://www.bithound.io/github/gitzonetools/npmts)
[![Known Vulnerabilities](https://snyk.io/test/npm/@gitzone/npmts/badge.svg)]
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/) [![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/) [![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/) [![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Quick Demo ## Quick Demo
[![asciicast](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze.png)](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze?speed=2&t=0) [![asciicast](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze.png)](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze?speed=2&t=0)
## Usage ## Usage
NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript. NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript.
npmts will npmts will
1. check your dependencies and package.json (unused, missing, updates, security) 1. check your dependencies and package.json (unused, missing, updates, security)
1. transpile your code with tsc, 1. transpile your code with tsc,
1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes) 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) 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). For more information on how tests are run check out the [tapbuffer module](https://www.npmjs.com/package/tapbuffer).
@ -39,11 +44,12 @@ This works on your machine and in CI. There is a prebuild docker image available
[hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/) [hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/)
## Changelog ## Changelog
For breaking changes please see the [changelog](https://gitzone.gitlab.io/npmts/changelog.html). For breaking changes please see the [changelog](https://gitzone.gitlab.io/npmts/changelog.html).
For further information read the linked docs at the top of this README. For further information read the linked docs at the top of this README.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) > MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html) > | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html)
[![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https://push.rocks) [![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https://push.rocks)

View File

@ -3,12 +3,11 @@
Fabulous TypeScript development Fabulous TypeScript development
* ================================================== */ * ================================================== */
import * as early from 'early' import * as early from 'early';
early.start('NPMTS') early.start('NPMTS');
import * as plugins from './npmts.plugins' import * as plugins from './npmts.plugins';
import * as cli from './npmts.cli' import * as cli from './npmts.cli';
early.stop() early.stop().then(() => {
.then(() => { let loaded = plugins; // to make sure plugins get actually loaded
let loaded = plugins // to make sure plugins get actually loaded cli.run();
cli.run() });
})

View File

@ -2,26 +2,26 @@
* This module compiles the module's TypeScript files * This module compiles the module's TypeScript files
* Note: Test files are only compiled in memory * Note: Test files are only compiled in memory
* -------------------------------------------- */ * -------------------------------------------- */
import * as q from 'smartq' import * as q from 'smartq';
import { INpmtsConfig } from '../npmts.config' import { INpmtsConfig } from '../npmts.config';
import * as plugins from './mod.plugins' import * as plugins from './mod.plugins';
import * as NpmtsAssets from './mod.assets' import * as NpmtsAssets from './mod.assets';
import * as NpmtsCheck from './mod.check' import * as NpmtsCheck from './mod.check';
import * as NpmtsClean from './mod.clean' import * as NpmtsClean from './mod.clean';
import * as NpmtsCompile from './mod.compile' import * as NpmtsCompile from './mod.compile';
export let run = function (configArg: INpmtsConfig): Promise<INpmtsConfig> { export let run = function(configArg: INpmtsConfig): Promise<INpmtsConfig> {
let done = q.defer<INpmtsConfig>() let done = q.defer<INpmtsConfig>();
plugins.beautylog.ora.text('starting TypeScript Compilation') plugins.beautylog.ora.text('starting TypeScript Compilation');
NpmtsClean.run(configArg) NpmtsClean.run(configArg)
.then(NpmtsCheck.run) .then(NpmtsCheck.run)
.then(NpmtsCompile.run) .then(NpmtsCompile.run)
.then(NpmtsAssets.run) .then(NpmtsAssets.run)
.then(function () { .then(function() {
done.resolve(configArg) done.resolve(configArg);
}) });
return done.promise return done.promise;
} };

View File

@ -1,24 +1,26 @@
import * as q from 'smartq' import * as q from 'smartq';
import paths = require('../npmts.paths') import paths = require('../npmts.paths');
import plugins = require('./mod.plugins') import plugins = require('./mod.plugins');
import { projectInfo } from '../mod_compile/mod.check' import { projectInfo } from '../mod_compile/mod.check';
export let run = function (configArg) { export let run = function(configArg) {
let done = q.defer() let done = q.defer();
let config = configArg let config = configArg;
plugins.beautylog.ora.text('now looking at ' + 'required assets') plugins.beautylog.ora.text('now looking at ' + 'required assets');
if (config.cli === true) { if (config.cli === true) {
let mainJsPath = projectInfo.packageJson.main let mainJsPath = projectInfo.packageJson.main;
let cliJsString: string = plugins.smartfile.fs.toStringSync(plugins.path.join(paths.npmtsAssetsDir, 'cli.js')) let cliJsString: string = plugins.smartfile.fs.toStringSync(
cliJsString = cliJsString.replace('{{pathToIndex}}', mainJsPath) plugins.path.join(paths.npmtsAssetsDir, 'cli.js')
plugins.smartfile.memory.toFsSync(cliJsString, plugins.path.join(paths.distDir, 'cli.js')) );
plugins.beautylog.ok('installed CLI assets!') cliJsString = cliJsString.replace('{{pathToIndex}}', mainJsPath);
done.resolve(config) plugins.smartfile.memory.toFsSync(cliJsString, plugins.path.join(paths.distDir, 'cli.js'));
plugins.beautylog.ok('installed CLI assets!');
done.resolve(config);
} else { } else {
plugins.beautylog.ok('No additional assets required!') plugins.beautylog.ok('No additional assets required!');
done.resolve(config) done.resolve(config);
} }
return done.promise return done.promise;
} };

View File

@ -1,132 +1,139 @@
import * as q from 'smartq' import * as q from 'smartq';
import { ProjectinfoNpm } from 'projectinfo' import { ProjectinfoNpm } from 'projectinfo';
// interfaces // interfaces
import { INpmtsConfig } from '../npmts.config' import { INpmtsConfig } from '../npmts.config';
import * as paths from '../npmts.paths' import * as paths from '../npmts.paths';
import * as plugins from './mod.plugins' import * as plugins from './mod.plugins';
export let projectInfo: ProjectinfoNpm export let projectInfo: ProjectinfoNpm;
let checkProjectTypings = (configArg: INpmtsConfig) => { let checkProjectTypings = (configArg: INpmtsConfig) => {
let done = q.defer<INpmtsConfig>() let done = q.defer<INpmtsConfig>();
plugins.beautylog.ora.text('Check Module: Check Project Typings...') plugins.beautylog.ora.text('Check Module: Check Project Typings...');
projectInfo = new ProjectinfoNpm(paths.cwd) projectInfo = new ProjectinfoNpm(paths.cwd);
if (typeof projectInfo.packageJson.typings === 'undefined') { if (typeof projectInfo.packageJson.typings === 'undefined') {
plugins.beautylog.error(`please add typings field to package.json`) plugins.beautylog.error(`please add typings field to package.json`);
process.exit(1) process.exit(1);
} }
done.resolve(configArg) done.resolve(configArg);
return done.promise return done.promise;
} };
const depcheckOptions = { const depcheckOptions = {
ignoreBinPackage: false, // ignore the packages with bin entry ignoreBinPackage: false, // ignore the packages with bin entry
parsers: { // the target parsers parsers: {
// the target parsers
'*.ts': plugins.depcheck.parser.typescript '*.ts': plugins.depcheck.parser.typescript
}, },
detectors: [ // the target detectors detectors: [
// the target detectors
plugins.depcheck.detector.requireCallExpression, plugins.depcheck.detector.requireCallExpression,
plugins.depcheck.detector.importDeclaration plugins.depcheck.detector.importDeclaration
], ],
specials: [ // the target special parsers specials: [
// the target special parsers
plugins.depcheck.special.eslint, plugins.depcheck.special.eslint,
plugins.depcheck.special.webpack plugins.depcheck.special.webpack
] ]
} };
let checkDependencies = (configArg: INpmtsConfig) => { let checkDependencies = (configArg: INpmtsConfig) => {
let done = q.defer<INpmtsConfig>() let done = q.defer<INpmtsConfig>();
plugins.beautylog.ora.text('Check Module: Check Dependencies...') plugins.beautylog.ora.text('Check Module: Check Dependencies...');
let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, { let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, {
ignoreDirs: [ // folder with these names will be ignored ignoreDirs: [
// folder with these names will be ignored
'test', 'test',
'dist', 'dist',
'bower_components' 'bower_components'
], ],
ignoreMatches: [ // ignore dependencies that matches these globs ignoreMatches: [
// ignore dependencies that matches these globs
'@types/*', '@types/*',
'babel-preset-*' 'babel-preset-*'
] ]
}) });
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => { plugins.depcheck(paths.cwd, depcheckOptionsMerged, unused => {
for (let item of unused.dependencies) { for (let item of unused.dependencies) {
plugins.beautylog.warn(`Watch out: unused dependency "${item}"`) plugins.beautylog.warn(`Watch out: unused dependency "${item}"`);
} }
for (let item in unused.missing) { for (let item in unused.missing) {
plugins.beautylog.error(`missing dependency "${item}" in package.json`) plugins.beautylog.error(`missing dependency "${item}" in package.json`);
} }
if (unused.missing.length > 0) { if (unused.missing.length > 0) {
plugins.beautylog.info('exiting due to missing dependencies in package.json') plugins.beautylog.info('exiting due to missing dependencies in package.json');
process.exit(1) process.exit(1);
} }
for (let item in unused.invalidFiles) { for (let item in unused.invalidFiles) {
plugins.beautylog.warn(`Watch out: could not parse file ${item}`) plugins.beautylog.warn(`Watch out: could not parse file ${item}`);
} }
for (let item in unused.invalidDirs) { for (let item in unused.invalidDirs) {
plugins.beautylog.warn(`Watch out: could not parse directory ${item}`) plugins.beautylog.warn(`Watch out: could not parse directory ${item}`);
} }
done.resolve(configArg) done.resolve(configArg);
}) });
return done.promise return done.promise;
} };
let checkDevDependencies = (configArg: INpmtsConfig) => { let checkDevDependencies = (configArg: INpmtsConfig) => {
let done = q.defer<INpmtsConfig>() let done = q.defer<INpmtsConfig>();
plugins.beautylog.ora.text('Check Module: Check devDependencies...') plugins.beautylog.ora.text('Check Module: Check devDependencies...');
let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, { let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, {
ignoreDirs: [ // folder with these names will be ignored ignoreDirs: [
// folder with these names will be ignored
'ts', 'ts',
'dist', 'dist',
'bower_components' 'bower_components'
], ],
ignoreMatches: [ // ignore dependencies that matches these globs ignoreMatches: [
// ignore dependencies that matches these globs
'@types/*', '@types/*',
'babel-preset-*' 'babel-preset-*'
] ]
}) });
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => { plugins.depcheck(paths.cwd, depcheckOptionsMerged, unused => {
for (let item of unused.devDependencies) { for (let item of unused.devDependencies) {
plugins.beautylog.log(`unused devDependency ${item}`) plugins.beautylog.log(`unused devDependency ${item}`);
} }
for (let item in unused.missing) { for (let item in unused.missing) {
plugins.beautylog.error(`missing devDependency ${item}`) plugins.beautylog.error(`missing devDependency ${item}`);
} }
if (unused.missing.length > 0) { if (unused.missing.length > 0) {
plugins.beautylog.info('exiting due to missing dependencies in package.json') plugins.beautylog.info('exiting due to missing dependencies in package.json');
process.exit(1) process.exit(1);
} }
for (let item in unused.invalidFiles) { for (let item in unused.invalidFiles) {
plugins.beautylog.warn(`Watch out: could not parse file ${item}`) plugins.beautylog.warn(`Watch out: could not parse file ${item}`);
} }
for (let item in unused.invalidDirs) { for (let item in unused.invalidDirs) {
plugins.beautylog.warn(`Watch out: could not parse directory ${item}`) plugins.beautylog.warn(`Watch out: could not parse directory ${item}`);
} }
done.resolve(configArg) done.resolve(configArg);
}) });
return done.promise return done.promise;
} };
let checkNodeVersion = (configArg: INpmtsConfig) => { let checkNodeVersion = (configArg: INpmtsConfig) => {
let done = q.defer<INpmtsConfig>() let done = q.defer<INpmtsConfig>();
plugins.beautylog.ora.text('checking node version') plugins.beautylog.ora.text('checking node version');
done.resolve(configArg) done.resolve(configArg);
return done.promise return done.promise;
} };
export let run = async (configArg: INpmtsConfig) => { export let run = async (configArg: INpmtsConfig) => {
plugins.beautylog.ora.text('Check Module: ...') plugins.beautylog.ora.text('Check Module: ...');
if (configArg.checkDependencies) { if (configArg.checkDependencies) {
configArg = await checkProjectTypings(configArg) configArg = await checkProjectTypings(configArg);
configArg = await checkDependencies(configArg) configArg = await checkDependencies(configArg);
configArg = await checkDevDependencies(configArg) configArg = await checkDevDependencies(configArg);
configArg = await checkNodeVersion(configArg) configArg = await checkNodeVersion(configArg);
return configArg return configArg;
} else { } else {
configArg = await checkProjectTypings(configArg) configArg = await checkProjectTypings(configArg);
return configArg return configArg;
} }
} };

View File

@ -1,32 +1,32 @@
import * as q from 'smartq' import * as q from 'smartq';
import paths = require('../npmts.paths') import paths = require('../npmts.paths');
import plugins = require('./mod.plugins') import plugins = require('./mod.plugins');
/** /**
* removes the dist directory which will be entirely rebuild * removes the dist directory which will be entirely rebuild
*/ */
let removeDist = function () { let removeDist = function() {
plugins.beautylog.ora.text('cleaning dist folder') plugins.beautylog.ora.text('cleaning dist folder');
return plugins.smartfile.fs.remove(paths.distDir) return plugins.smartfile.fs.remove(paths.distDir);
} };
/** /**
* remove old pages * remove old pages
*/ */
let removePages = function () { let removePages = function() {
plugins.beautylog.ora.text('cleaning pages folder') plugins.beautylog.ora.text('cleaning pages folder');
return plugins.smartfile.fs.remove(paths.pagesDir) return plugins.smartfile.fs.remove(paths.pagesDir);
} };
export let run = function (configArg) { export let run = function(configArg) {
plugins.beautylog.ora.text('cleaning up from previous builds...') plugins.beautylog.ora.text('cleaning up from previous builds...');
let done = q.defer() let done = q.defer();
removeDist() removeDist()
.then(removePages) .then(removePages)
.then(function () { .then(function() {
plugins.beautylog.ok('Cleaned up from previous builds!') plugins.beautylog.ok('Cleaned up from previous builds!');
done.resolve(configArg) done.resolve(configArg);
}) });
return done.promise return done.promise;
} };

View File

@ -1,17 +1,21 @@
import * as q from 'smartq' import * as q from 'smartq';
import * as paths from '../npmts.paths' import * as paths from '../npmts.paths';
import * as plugins from './mod.plugins' import * as plugins from './mod.plugins';
export let run = function (configArg) { export let run = function(configArg) {
let done = q.defer() let done = q.defer();
let config = configArg let config = configArg;
plugins.beautylog.ora.text('now compiling ' + 'TypeScript') plugins.beautylog.ora.text('now compiling ' + 'TypeScript');
plugins.tsn.compileGlobStringObject(config.ts, config.tsOptions, paths.cwd) plugins.tsn
.compileGlobStringObject(config.ts, config.tsOptions, paths.cwd)
.then(() => { .then(() => {
plugins.beautylog.ok(`compiled the module's TypeScript!`) plugins.beautylog.ok(`compiled the module's TypeScript!`);
done.resolve(config) done.resolve(config);
}).catch(err => { console.log(err) }) })
return done.promise .catch(err => {
} console.log(err);
});
return done.promise;
};

View File

@ -1,11 +1,7 @@
export * from '../npmts.plugins' export * from '../npmts.plugins';
import * as tsn from 'tsn' import * as tsn from 'tsn';
import * as smartchok from 'smartchok' import * as smartchok from 'smartchok';
import * as smartstream from 'smartstream' import * as smartstream from 'smartstream';
export { export { tsn, smartchok, smartstream };
tsn,
smartchok,
smartstream
}

View File

@ -1,15 +1,15 @@
/* ------------------------------------------ /* ------------------------------------------
* This module creates TypeScript documentation * This module creates TypeScript documentation
* -------------------------------------------- */ * -------------------------------------------- */
import * as q from 'smartq' import * as q from 'smartq';
import * as paths from '../npmts.paths' import * as paths from '../npmts.paths';
import { INpmtsConfig } from '../npmts.config' import { INpmtsConfig } from '../npmts.config';
import * as plugins from './mod.plugins' import * as plugins from './mod.plugins';
export let run = function (configArg: INpmtsConfig) { export let run = function(configArg: INpmtsConfig) {
let done = q.defer<INpmtsConfig>() let done = q.defer<INpmtsConfig>();
done.resolve(configArg) done.resolve(configArg);
return done.promise return done.promise;
} };

View File

@ -1,2 +1 @@
export * from '../npmts.plugins' export * from '../npmts.plugins';

View File

@ -1,136 +1,141 @@
/* ------------------------------------------ /* ------------------------------------------
* This module tests the compiled TypeScript files * This module tests the compiled TypeScript files
* -------------------------------------------- */ * -------------------------------------------- */
import plugins = require('./mod.plugins') import plugins = require('./mod.plugins');
import paths = require('../npmts.paths') import paths = require('../npmts.paths');
import * as q from 'smartq' import * as q from 'smartq';
// interfaces // interfaces
import { INpmtsConfig } from '../npmts.config' import { INpmtsConfig } from '../npmts.config';
import { Smartfile } from 'smartfile' import { Smartfile } from 'smartfile';
let testTypeScriptConfig = { let testTypeScriptConfig = {
target: 'ES5', target: 'ES5',
emitDecoratorMetadata: true, emitDecoratorMetadata: true,
experimentalDecorators: true, experimentalDecorators: true,
lib: [ lib: ['DOM', 'ESNext']
'DOM', };
'ESNext'
]
}
/** /**
* runs mocha * runs mocha
* @returns INpmtsConfig * @returns INpmtsConfig
*/ */
let tap = function (configArg: INpmtsConfig) { let tap = function(configArg: INpmtsConfig) {
let done = q.defer() let done = q.defer();
/** /**
* the TabBuffer for npmts * the TabBuffer for npmts
*/ */
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer() let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer();
npmtsTapBuffer.setConfig(configArg.testConfig) npmtsTapBuffer.setConfig(configArg.testConfig);
/** /**
* handle the testable files * handle the testable files
*/ */
let testableFilesSmartstream = new plugins.smartstream.Smartstream([ let testableFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.src([ plugins.path.join(paths.cwd, './ts/**/*.ts') ]), plugins.smartgulp.src([plugins.path.join(paths.cwd, './ts/**/*.ts')]),
plugins.gulpSourcemaps.init(), plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript(testTypeScriptConfig), plugins.gulpTypeScript(testTypeScriptConfig),
plugins.gulpSourcemaps.write(), plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestableFiles(), npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe() plugins.smartstream.cleanPipe()
]) ]);
/** /**
* handle the test files * handle the test files
*/ */
let testFilesSmartstream = new plugins.smartstream.Smartstream([ let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.src([ plugins.path.join(paths.cwd, 'test/*.ts') ]), plugins.smartgulp.src([plugins.path.join(paths.cwd, 'test/*.ts')]),
plugins.gulpSourcemaps.init(), plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript(testTypeScriptConfig), plugins.gulpTypeScript(testTypeScriptConfig),
plugins.gulpSourcemaps.write(), plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestFiles(), npmtsTapBuffer.pipeTestFiles(),
plugins.smartstream.cleanPipe() plugins.smartstream.cleanPipe()
]) ]);
// lets run the smartstream // lets run the smartstream
Promise.all([ Promise.all([testableFilesSmartstream.run(), testFilesSmartstream.run()]).then(
testableFilesSmartstream.run(),
testFilesSmartstream.run()
]).then(
async () => { async () => {
configArg.runData.coverageLcovInfo = await npmtsTapBuffer.runTests() configArg.runData.coverageLcovInfo = await npmtsTapBuffer.runTests();
done.resolve(configArg) done.resolve(configArg);
}, (err) => { },
plugins.beautylog.error('Tests failed!') err => {
console.log(err) plugins.beautylog.error('Tests failed!');
console.log(err);
if (configArg.watch) { if (configArg.watch) {
done.resolve(configArg) done.resolve(configArg);
} else { } else {
process.exit(1) process.exit(1);
} }
}) }
);
return done.promise return done.promise;
} };
let handleCoverageData = async (configArg: INpmtsConfig) => { let handleCoverageData = async (configArg: INpmtsConfig) => {
let coverageResult: number = 0 // the coverage in percent let coverageResult: number = 0; // the coverage in percent
if (configArg.runData.coverageLcovInfo) { if (configArg.runData.coverageLcovInfo) {
coverageResult = await plugins.smartcov.get.percentageFromLcovString( coverageResult = await plugins.smartcov.get.percentageFromLcovString(
configArg.runData.coverageLcovInfo, configArg.runData.coverageLcovInfo,
2 2
) );
} else { } else {
plugins.beautylog.warn('Hey... Did your tests import and use your module that you are trying to test?') plugins.beautylog.warn(
'Hey... Did your tests import and use your module that you are trying to test?'
);
} }
if (coverageResult >= configArg.coverageTreshold) { if (coverageResult >= configArg.coverageTreshold) {
plugins.beautylog.ok( plugins.beautylog.ok(
`${(coverageResult).toString()}% ` `${coverageResult.toString()}% ` +
+ `coverage exceeds your treshold of ` `coverage exceeds your treshold of ` +
+ `${configArg.coverageTreshold.toString()}%` `${configArg.coverageTreshold.toString()}%`
) );
} else { } else {
plugins.beautylog.warn( plugins.beautylog.warn(
`${(coverageResult).toString()}% ` `${coverageResult.toString()}% ` +
+ `coverage fails your treshold of ` `coverage fails your treshold of ` +
+ `${configArg.coverageTreshold.toString()}%` `${configArg.coverageTreshold.toString()}%`
) );
plugins.beautylog.error('exiting due to coverage failure') plugins.beautylog.error('exiting due to coverage failure');
if (!configArg.watch) { process.exit(1) } if (!configArg.watch) {
process.exit(1);
}
} }
return configArg return configArg;
} };
export let run = function (configArg: INpmtsConfig) { export let run = function(configArg: INpmtsConfig) {
let done = q.defer<INpmtsConfig>() let done = q.defer<INpmtsConfig>();
let config = configArg let config = configArg;
if (config.test === true) { if (config.test === true) {
plugins.beautylog.ora.text('now starting tests') plugins.beautylog.ora.text('now starting tests');
plugins.beautylog.ora.end() plugins.beautylog.ora.end();
plugins.beautylog.log('ready for tapbuffer:') plugins.beautylog.log('ready for tapbuffer:');
if (configArg.testConfig.coverage) { if (configArg.testConfig.coverage) {
tap(config) tap(config)
.then(handleCoverageData) .then(handleCoverageData)
.then(() => { .then(() => {
done.resolve(config) done.resolve(config);
}).catch(err => { console.log(err) }) })
.catch(err => {
console.log(err);
});
} else { } else {
tap(config) tap(config)
.then(() => { .then(() => {
done.resolve(config) done.resolve(config);
}).catch(err => { console.log(err) }) })
.catch(err => {
console.log(err);
});
} }
} else { } else {
plugins.beautylog.ora.end() plugins.beautylog.ora.end();
done.resolve(config) done.resolve(config);
} }
return done.promise return done.promise;
} };

View File

@ -1,17 +1,10 @@
export * from '../npmts.plugins' export * from '../npmts.plugins';
import * as gulpFunction from 'gulp-function' import * as gulpFunction from 'gulp-function';
import * as gulpSourcemaps from 'gulp-sourcemaps' import * as gulpSourcemaps from 'gulp-sourcemaps';
import * as gulpTypeScript from 'gulp-typescript' import * as gulpTypeScript from 'gulp-typescript';
import * as smartcov from 'smartcov' import * as smartcov from 'smartcov';
import * as smartgulp from 'smartgulp' import * as smartgulp from 'smartgulp';
import * as tapbuffer from 'tapbuffer' import * as tapbuffer from 'tapbuffer';
export { export { gulpFunction, gulpSourcemaps, gulpTypeScript, smartcov, smartgulp, tapbuffer };
gulpFunction,
gulpSourcemaps,
gulpTypeScript,
smartcov,
smartgulp,
tapbuffer
}

View File

@ -1,11 +1,11 @@
import * as q from 'smartq' import * as q from 'smartq';
import * as plugins from './npmts.plugins' import * as plugins from './npmts.plugins';
import * as paths from './npmts.paths' import * as paths from './npmts.paths';
import * as NpmtsConfig from './npmts.config' import * as NpmtsConfig from './npmts.config';
import * as NpmtsMods from './npmts.mods' import * as NpmtsMods from './npmts.mods';
import * as NpmtsWatch from './npmts.watch' import * as NpmtsWatch from './npmts.watch';
import * as NpmtsShip from './npmts.ship' import * as NpmtsShip from './npmts.ship';
/** /**
* smartanalytics * smartanalytics
@ -22,70 +22,84 @@ let npmtsAnalytics = new plugins.smartanalytics.Analytics({
apiEndPoint: 'https://pubapi.lossless.one/analytics', apiEndPoint: 'https://pubapi.lossless.one/analytics',
projectId: 'gitzone', projectId: 'gitzone',
appName: 'npmts' appName: 'npmts'
}) });
process.nextTick(async () => { process.nextTick(async () => {
// make the analytics call // make the analytics call
npmtsAnalytics.recordEvent('npmToolExecution', { npmtsAnalytics
executionMode: (await NpmtsConfig.configPromise).mode, .recordEvent('npmToolExecution', {
tsOptions: (await NpmtsConfig.configPromise).tsOptions, executionMode: (await NpmtsConfig.configPromise).mode,
watch: (await NpmtsConfig.configPromise).watch, tsOptions: (await NpmtsConfig.configPromise).tsOptions,
coverageTreshold: (await NpmtsConfig.configPromise).coverageTreshold watch: (await NpmtsConfig.configPromise).watch,
}).catch(err => { coverageTreshold: (await NpmtsConfig.configPromise).coverageTreshold
plugins.beautylog.warn('Lossless Analytics API not available...') })
}) .catch(err => {
}) plugins.beautylog.warn('Lossless Analytics API not available...');
});
});
export let run = async () => { export let run = async () => {
let done = q.defer() let done = q.defer();
plugins.beautylog.figletSync('NPMTS') plugins.beautylog.figletSync('NPMTS');
let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot) let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot);
// check for updates // check for updates
await plugins.smartupdate.standardHandler.check('npmts', npmtsProjectInfo.version, 'http://gitzone.gitlab.io/npmts/changelog.html') await plugins.smartupdate.standardHandler.check(
plugins.beautylog.log('---------------------------------------------') 'npmts',
let npmtsCli = new plugins.smartcli.Smartcli() npmtsProjectInfo.version,
npmtsCli.standardTask() 'http://gitzone.gitlab.io/npmts/changelog.html'
.then((argvArg) => { );
plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version) plugins.beautylog.log('---------------------------------------------');
return NpmtsConfig.run(argvArg) let npmtsCli = new plugins.smartcli.Smartcli();
npmtsCli
.standardTask()
.then(argvArg => {
plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version);
return NpmtsConfig.run(argvArg);
}) })
.then((configArg: NpmtsConfig.INpmtsConfig) => { .then((configArg: NpmtsConfig.INpmtsConfig) => {
let done = q.defer() let done = q.defer();
plugins.beautylog.ora.start('loading additional modules...') plugins.beautylog.ora.start('loading additional modules...');
NpmtsMods.modCompile.load() NpmtsMods.modCompile
.then((modCompile) => { .load()
return modCompile.run(configArg) .then(modCompile => {
return modCompile.run(configArg);
}) })
.then(configArg => { .then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>() let done = q.defer<NpmtsConfig.INpmtsConfig>();
NpmtsMods.modDocs.load() NpmtsMods.modDocs
.load()
.then(modDocs => { .then(modDocs => {
return modDocs.run(configArg) return modDocs.run(configArg);
}) })
.then(configArg => { .then(configArg => {
done.resolve(configArg) done.resolve(configArg);
}) });
return done.promise return done.promise;
}) })
.then(configArg => { .then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>() let done = q.defer<NpmtsConfig.INpmtsConfig>();
NpmtsMods.modTest.load() NpmtsMods.modTest
.load()
.then(modTest => { .then(modTest => {
return modTest.run(configArg) return modTest.run(configArg);
}) })
.then(configArg => { .then(configArg => {
done.resolve(configArg) done.resolve(configArg);
}) });
return done.promise return done.promise;
}) })
.then(NpmtsWatch.run) .then(NpmtsWatch.run)
.then(NpmtsShip.run) .then(NpmtsShip.run);
return done.promise return done.promise;
}) })
.catch((err) => { if (err instanceof Error) { console.log(err) } }) .catch(err => {
npmtsCli.addVersion(npmtsProjectInfo.version) if (err instanceof Error) {
npmtsCli.startParse() console.log(err);
return await done.promise }
} });
npmtsCli.addVersion(npmtsProjectInfo.version);
npmtsCli.startParse();
return await done.promise;
};

View File

@ -1,10 +1,10 @@
import plugins = require('./npmts.plugins') import plugins = require('./npmts.plugins');
import paths = require('./npmts.paths') import paths = require('./npmts.paths');
import * as smartq from 'smartq' import * as smartq from 'smartq';
// interfaces // interfaces
import { ITapbufferConfig } from 'tapbuffer' import { ITapbufferConfig } from 'tapbuffer';
/** /**
* specifies the different modes available * specifies the different modes available
@ -12,27 +12,27 @@ import { ITapbufferConfig } from 'tapbuffer'
* merge -> uses merged default + custom options * merge -> uses merged default + custom options
* custom -> only uses specified options * custom -> only uses specified options
*/ */
export type npmtsMode = 'default' | 'custom' | 'merge' export type npmtsMode = 'default' | 'custom' | 'merge';
export interface INpmtsConfig { export interface INpmtsConfig {
argv: any argv: any;
coverageTreshold: number coverageTreshold: number;
checkDependencies: boolean checkDependencies: boolean;
mode: npmtsMode mode: npmtsMode;
test: boolean test: boolean;
testTs: any testTs: any;
testConfig: ITapbufferConfig testConfig: ITapbufferConfig;
ts: any ts: any;
tsOptions: any tsOptions: any;
watch: boolean watch: boolean;
runData: { runData: {
coverageLcovInfo?: string coverageLcovInfo?: string;
coverageResult?: number coverageResult?: number;
} };
} }
export let run = function (argvArg) { export let run = function(argvArg) {
let done = smartq.defer() let done = smartq.defer();
let defaultConfig: INpmtsConfig = { let defaultConfig: INpmtsConfig = {
argv: undefined, argv: undefined,
coverageTreshold: 70, coverageTreshold: 70,
@ -48,66 +48,63 @@ export let run = function (argvArg) {
tsOptions: {}, tsOptions: {},
watch: false, watch: false,
runData: {} runData: {}
} };
// mix with configfile // mix with configfile
plugins.beautylog.ora.text('running npmextra') plugins.beautylog.ora.text('running npmextra');
let localNpmextra = new plugins.npmextra.Npmextra(paths.cwd) let localNpmextra = new plugins.npmextra.Npmextra(paths.cwd);
let config: INpmtsConfig = localNpmextra.dataFor<INpmtsConfig>( let config: INpmtsConfig = localNpmextra.dataFor<INpmtsConfig>('npmts', defaultConfig);
'npmts',
defaultConfig
)
// add argv // add argv
config.argv = argvArg config.argv = argvArg;
// check mode // check mode
switch (config.mode) { switch (config.mode) {
case 'default': case 'default':
case 'custom': case 'custom':
case 'merge': case 'merge':
plugins.beautylog.ok('mode is ' + config.mode) plugins.beautylog.ok('mode is ' + config.mode);
done.resolve(config) done.resolve(config);
break break;
default: default:
plugins.beautylog.error(`mode not recognised! Can be default or custom`) plugins.beautylog.error(`mode not recognised! Can be default or custom`);
process.exit(1) process.exit(1);
} }
// handle default mode // handle default mode
if (config.mode === 'default' || config.mode === 'merge') { if (config.mode === 'default' || config.mode === 'merge') {
config.ts = { config.ts = {
'./ts/**/*.ts': './dist/' './ts/**/*.ts': './dist/'
} };
config.testTs = { config.testTs = {
'./test/**/*.ts': './test/' './test/**/*.ts': './test/'
} };
} }
// mix with commandline // mix with commandline
if (config.argv.notest) { if (config.argv.notest) {
config.test = false config.test = false;
} }
if (config.argv.nocoverage) { if (config.argv.nocoverage) {
config.testConfig.coverage = false config.testConfig.coverage = false;
} }
if (config.argv.nochecks) { if (config.argv.nochecks) {
config.checkDependencies = false config.checkDependencies = false;
} }
if (config.argv.watch) { if (config.argv.watch) {
config.watch = true config.watch = true;
} }
plugins.beautylog.ok('build options are ready!') plugins.beautylog.ok('build options are ready!');
done.resolve(config) done.resolve(config);
configDeferred.resolve(config) configDeferred.resolve(config);
return done.promise return done.promise;
} };
// config deferred usage // config deferred usage
let configDeferred = smartq.defer<INpmtsConfig>() let configDeferred = smartq.defer<INpmtsConfig>();
export let configPromise = configDeferred.promise export let configPromise = configDeferred.promise;

View File

@ -1,11 +1,11 @@
import * as plugins from './npmts.plugins' import * as plugins from './npmts.plugins';
import { LazyModule } from 'smartsystem' import { LazyModule } from 'smartsystem';
import * as _modCompile from './mod_compile/index' import * as _modCompile from './mod_compile/index';
import * as _modDocs from './mod_docs/index' import * as _modDocs from './mod_docs/index';
import * as _modTest from './mod_test/index' import * as _modTest from './mod_test/index';
export let modCompile = new LazyModule<typeof _modCompile>('./mod_compile/index',__dirname) export let modCompile = new LazyModule<typeof _modCompile>('./mod_compile/index', __dirname);
export let modDocs = new LazyModule<typeof _modDocs>('./mod_docs/index',__dirname) export let modDocs = new LazyModule<typeof _modDocs>('./mod_docs/index', __dirname);
export let modTest = new LazyModule<typeof _modTest>('./mod_test/index',__dirname) export let modTest = new LazyModule<typeof _modTest>('./mod_test/index', __dirname);

View File

@ -1,24 +1,24 @@
import plugins = require('./npmts.plugins') import plugins = require('./npmts.plugins');
// NPMTS Paths // NPMTS Paths
export let npmtsPackageRoot = plugins.path.join(__dirname,'../') export let npmtsPackageRoot = plugins.path.join(__dirname, '../');
// Project paths // Project paths
export let cwd = process.cwd() export let cwd = process.cwd();
// Directories // Directories
export let tsDir = plugins.path.join(cwd,'ts/') export let tsDir = plugins.path.join(cwd, 'ts/');
export let distDir = plugins.path.join(cwd,'dist/') export let distDir = plugins.path.join(cwd, 'dist/');
export let testDir = plugins.path.join(cwd,'test/') export let testDir = plugins.path.join(cwd, 'test/');
export let typingsDir = plugins.path.join(cwd,'ts/typings/') export let typingsDir = plugins.path.join(cwd, 'ts/typings/');
export let coverageDir = plugins.path.join(cwd,'coverage/') export let coverageDir = plugins.path.join(cwd, 'coverage/');
// Pages // Pages
export let pagesDir = plugins.path.join(cwd,'pages/') export let pagesDir = plugins.path.join(cwd, 'pages/');
export let pagesApiDir = plugins.path.join(pagesDir,'/api') export let pagesApiDir = plugins.path.join(pagesDir, '/api');
export let npmtsAssetsDir = plugins.path.join(__dirname,'../assets/') export let npmtsAssetsDir = plugins.path.join(__dirname, '../assets/');
// Files // Files
export let indexTS = plugins.path.join(cwd,'ts/index.ts') export let indexTS = plugins.path.join(cwd, 'ts/index.ts');
export let testTS = plugins.path.join(cwd,'ts/test.ts') export let testTS = plugins.path.join(cwd, 'ts/test.ts');

View File

@ -1,36 +1,36 @@
import * as beautylog from 'beautylog' import * as beautylog from 'beautylog';
let depcheck = require('depcheck') let depcheck = require('depcheck');
import * as lodash from 'lodash' import * as lodash from 'lodash';
import * as npmextra from 'npmextra' import * as npmextra from 'npmextra';
import * as projectinfo from 'projectinfo' import * as projectinfo from 'projectinfo';
import * as path from 'path' import * as path from 'path';
import * as smartanalytics from 'smartanalytics' import * as smartanalytics from 'smartanalytics';
import * as smartcli from 'smartcli' import * as smartcli from 'smartcli';
import * as smarterror from 'smarterror' import * as smarterror from 'smarterror';
import * as smartfile from 'smartfile' import * as smartfile from 'smartfile';
import * as smartpath from 'smartpath' import * as smartpath from 'smartpath';
import * as smartstream from 'smartstream' import * as smartstream from 'smartstream';
import * as smartstring from 'smartstring' import * as smartstring from 'smartstring';
import * as smartsystem from 'smartsystem' import * as smartsystem from 'smartsystem';
import * as smartupdate from 'smartupdate' import * as smartupdate from 'smartupdate';
import * as through2 from 'through2' import * as through2 from 'through2';
export { export {
beautylog, beautylog,
depcheck, depcheck,
lodash, lodash,
npmextra, npmextra,
projectinfo, projectinfo,
path, path,
smartanalytics, smartanalytics,
smartcli, smartcli,
smarterror, smarterror,
smartfile, smartfile,
smartpath, smartpath,
smartstream, smartstream,
smartstring, smartstring,
smartsystem, smartsystem,
smartupdate, smartupdate,
through2 through2
} };

View File

@ -1,30 +1,31 @@
import * as q from 'smartq' import * as q from 'smartq';
import * as plugins from './npmts.plugins' import * as plugins from './npmts.plugins';
import { INpmtsConfig } from './npmts.config' import { INpmtsConfig } from './npmts.config';
export let run = (configArg: INpmtsConfig) => { export let run = (configArg: INpmtsConfig) => {
let done = q.defer() let done = q.defer();
let shipString = '' + let shipString =
'\n' + '' +
'\n' + '\n' +
' # # ( )\n' + '\n' +
' ___#_#___|__\n' + ' # # ( )\n' +
' _ |____________| _\n' + ' ___#_#___|__\n' +
' _=====| | | | | |==== _\n' + ' _ |____________| _\n' +
' =====| |.---------------------------. | |====\n' + ' _=====| | | | | |==== _\n' +
" <--------------------' . . . . . . . . '--------------/\n" + ' =====| |.---------------------------. | |====\n' +
' \\ /\n' + " <--------------------' . . . . . . . . '--------------/\n" +
' \\___________________________________________________________/\n' + ' \\ /\n' +
' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' + ' \\___________________________________________________________/\n' +
' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' + ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' +
' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' +
if (process.env.CI) { ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n';
console.log(shipString) if (process.env.CI) {
plugins.beautylog.success('READY TO SHIP!') console.log(shipString);
} else { plugins.beautylog.success('READY TO SHIP!');
plugins.beautylog.success('Done!') } else {
} plugins.beautylog.success('Done!');
done.resolve(configArg) }
} done.resolve(configArg);
};

View File

@ -1,34 +1,34 @@
import * as q from 'smartq' import * as q from 'smartq';
import * as smartchok from 'smartchok' import * as smartchok from 'smartchok';
import * as plugins from './npmts.plugins' import * as plugins from './npmts.plugins';
import * as cli from './npmts.cli' import * as cli from './npmts.cli';
import { INpmtsConfig } from './npmts.config' import { INpmtsConfig } from './npmts.config';
let npmtsSmartchok: smartchok.Smartchok = null let npmtsSmartchok: smartchok.Smartchok = null;
export let run = (configArg: INpmtsConfig) => { export let run = (configArg: INpmtsConfig) => {
let done = q.defer() let done = q.defer();
if (configArg.watch && npmtsSmartchok === null) { if (configArg.watch && npmtsSmartchok === null) {
let pathsToWatch: string[] = [] let pathsToWatch: string[] = [];
for (let key in configArg.ts) { for (let key in configArg.ts) {
pathsToWatch.push(key) pathsToWatch.push(key);
} }
for (let key in configArg.testTs) { for (let key in configArg.testTs) {
pathsToWatch.push(key) pathsToWatch.push(key);
} }
npmtsSmartchok = new smartchok.Smartchok(pathsToWatch) npmtsSmartchok = new smartchok.Smartchok(pathsToWatch);
npmtsSmartchok.getObservableFor('change').then((changeObservableArg) => { npmtsSmartchok.getObservableFor('change').then(changeObservableArg => {
plugins.beautylog.info('now watching...') plugins.beautylog.info('now watching...');
changeObservableArg.subscribe(() => { changeObservableArg.subscribe(() => {
cli.run() cli.run();
}) });
}) });
npmtsSmartchok.start() npmtsSmartchok.start();
done.resolve(configArg) done.resolve(configArg);
} else { } else {
plugins.beautylog.info('not watching') plugins.beautylog.info('not watching');
done.resolve(configArg) done.resolve(configArg);
} }
return done.promise return done.promise;
} };