Compare commits

...

117 Commits

Author SHA1 Message Date
668fd0998f 8.0.38 2018-05-04 11:51:15 +02:00
e0611f3f64 8.0.37 2018-05-04 00:27:35 +02:00
928f3212a3 update dependencies 2018-05-04 00:27:31 +02:00
7c7e45ad54 8.0.36 2018-05-03 18:05:42 +02:00
797d9e2bcd add codequality step 2018-05-03 18:05:37 +02:00
578cd2d097 8.0.35 2018-05-03 13:30:05 +02:00
5a7dd901f0 update ci 2018-05-03 13:30:01 +02:00
2104fc01e6 update build 2018-05-03 13:28:46 +02:00
4eacef56d5 8.0.34 2018-05-03 13:05:24 +02:00
5722deb7a0 8.0.33 2018-05-03 12:57:29 +02:00
50d71dde67 update ci 2018-05-03 12:56:58 +02:00
13123e180d 8.0.32 2018-05-03 12:45:24 +02:00
b13db4184b update snyk security policy 2018-05-03 12:45:22 +02:00
19f6097ab9 8.0.31 2018-05-03 12:35:48 +02:00
34066d8a13 switch to seperate build/test commands to inrpove speed 2018-05-03 12:35:41 +02:00
df87337f4d 8.0.30 2018-04-09 01:28:46 +02:00
105e5c2ff0 fix npmextra.json 2018-04-09 01:26:14 +02:00
7115b699ba 8.0.29 2018-04-09 01:19:36 +02:00
8c7ac4c1d0 update snyk policy 2018-04-09 01:19:28 +02:00
fc8154b431 8.0.28 2018-04-09 01:03:49 +02:00
896e0095fa change npmts package name to being @gitzone scoped 2018-04-09 01:03:39 +02:00
7e46b55de5 8.0.27 2018-02-26 22:51:06 +01:00
6553e7432c now runs offline 2018-02-26 22:51:03 +01:00
cf4db90aef 8.0.26 2017-11-28 17:34:02 +01:00
8896d3ef76 refactor 2017-11-28 17:33:55 +01:00
c0b7dc2547 8.0.25 2017-11-25 20:57:51 +02:00
d65f19d108 update deps 2017-11-25 20:57:40 +02:00
5de4646453 8.0.24 2017-10-07 13:55:12 +02:00
44e9fcc977 update dependencies 2017-10-07 13:55:06 +02:00
784aec1ec3 8.0.23 2017-10-05 14:58:52 +02:00
61b7bbb168 change lib inclusion for tests 2017-10-05 14:58:49 +02:00
1d662ddef4 8.0.22 2017-09-23 00:00:27 +02:00
f7351c914e update dependencies 2017-09-23 00:00:25 +02:00
7132ae11a8 fix ci 2017-09-13 17:48:15 +02:00
b195b8911b switch position of mirror 2017-09-13 17:47:30 +02:00
e331e870d9 8.0.21 2017-09-13 17:44:34 +02:00
3a6bd3b583 now working when npms.io is down 2017-09-13 17:44:31 +02:00
594bccfc82 8.0.20 2017-09-11 14:30:36 +02:00
d9f1d36d14 update dependencies 2017-09-11 14:30:32 +02:00
f12c4aabd8 8.0.19 2017-09-08 18:04:44 +02:00
b62f7d8b31 update tracking domains 2017-09-08 18:04:40 +02:00
56cccb1b14 8.0.18 2017-09-08 15:13:29 +02:00
850df45d7f add mirror stage 2017-09-08 15:13:27 +02:00
2b1f371d8a 8.0.17 2017-09-06 15:59:40 +02:00
8196ca50a7 update readme 2017-09-06 15:59:27 +02:00
ad96661dda update structure docs 2017-09-06 15:52:46 +02:00
2fc6c3d358 8.0.16 2017-09-05 18:48:16 +02:00
0c74fb3343 update docs 2017-09-05 18:48:12 +02:00
d821a2efa6 update indention 2017-08-31 20:48:30 +02:00
66f2321d99 8.0.15 2017-08-29 16:17:52 +02:00
816f4f57fb update ci 2017-08-29 16:17:46 +02:00
9bdf3ec4c7 8.0.14 2017-08-29 16:15:27 +02:00
b9d4953bcd update analytics 2017-08-29 16:15:24 +02:00
8c0fcdf5b7 8.0.13 2017-08-20 00:48:35 +02:00
a477cc00e7 update dependencies 2017-08-20 00:48:21 +02:00
00b9a742ab 8.0.12 2017-08-19 12:39:29 +02:00
f5b8ab84cf update dependencies 2017-08-19 12:39:25 +02:00
4fc4efc0b9 8.0.11 2017-08-18 13:15:41 +02:00
30136f01a8 update dependencies 2017-08-18 13:15:38 +02:00
d1d85819d7 8.0.10 2017-08-17 12:06:12 +02:00
e267fce3bb update dependencies 2017-08-17 12:06:08 +02:00
f964b2737f 8.0.9 2017-08-16 23:53:56 +02:00
6ac634e178 improve update logs 2017-08-16 23:53:52 +02:00
3105f8f401 8.0.8 2017-08-16 23:46:26 +02:00
70b83fcafc fix smartupdate execution 2017-08-16 23:46:20 +02:00
7e8e4b1891 8.0.7 2017-08-16 23:33:48 +02:00
aa8279c281 update dependencies 2017-08-16 23:33:39 +02:00
7564e1fd18 8.0.6 2017-08-16 19:13:14 +02:00
a6fbe7da33 update 2017-08-16 19:13:01 +02:00
e0f208ba41 8.0.5 2017-08-02 13:20:05 +02:00
d2cf4346d4 update dependencies 2017-08-02 13:20:01 +02:00
b769dcae4f 8.0.4 2017-07-31 15:43:36 +02:00
7b58535dda update to latest version of smartsystem 2017-07-31 15:43:31 +02:00
f16103a632 8.0.3 2017-07-31 14:43:56 +02:00
befed099c5 update highlighting 2017-07-31 14:43:50 +02:00
6c0fa380a9 remove old Changelog 2017-07-31 14:39:46 +02:00
22de2c784f 8.0.2 2017-07-31 14:36:38 +02:00
e8fe4f1720 update docs and description 2017-07-31 14:36:33 +02:00
d7443bbf17 8.0.1 2017-07-30 22:39:55 +02:00
c4668bc0a6 add docs 2017-07-30 22:39:42 +02:00
bc489b6bf3 8.0.0 2017-07-30 22:27:59 +02:00
e2d0a7a939 update to more favorable testfile loading approach 2017-07-30 22:27:51 +02:00
0f5e451e60 7.2.10 2017-07-28 17:33:31 +02:00
3595bf3590 fix module testimport recognition 2017-07-28 17:33:28 +02:00
efe73d0fd0 7.2.9 2017-07-28 17:16:17 +02:00
c52322ec12 add smart replacer 2017-07-28 17:16:14 +02:00
b7cf9949bf update docs 2017-07-28 01:27:21 +02:00
beac49d5d2 7.2.8 2017-07-28 01:21:41 +02:00
25993bd66f update --nocoverage option 2017-07-28 01:21:37 +02:00
83b324054a 7.2.7 2017-07-23 15:15:26 +02:00
2c574fe015 update readme 2017-07-23 15:15:19 +02:00
3b50365ea9 7.2.6 2017-07-23 15:06:47 +02:00
e6f487eeee update readme 2017-07-23 15:06:43 +02:00
07c100ae44 7.2.5 2017-07-23 15:03:40 +02:00
55888cce89 now supports propper tracing of sourcemaps for coverage 2017-07-23 15:03:36 +02:00
d4c66af0d8 7.2.4 2017-07-20 17:51:44 +02:00
9359b5f7e9 update dependencies 2017-07-20 17:51:41 +02:00
87c0ec5728 7.2.3 2017-07-19 16:04:14 +02:00
aeb79f053f update dependencies 2017-07-19 16:04:09 +02:00
e01ecb9369 7.2.2 2017-07-18 15:13:18 +02:00
fd29434fa6 update dependencies 2017-07-18 15:13:14 +02:00
4684b9616c 7.2.1 2017-07-18 14:54:16 +02:00
a2701bc3be upgrade dependencies 2017-07-18 14:54:06 +02:00
425a86b33c 7.2.0 2017-07-18 14:41:55 +02:00
20631eb0a8 support SHELL PATH distributions in tests 2017-07-18 14:41:49 +02:00
27287d24fb 7.1.9 2017-06-30 18:55:16 +02:00
1b2393c7ed update to latest dependencies 2017-06-30 18:55:14 +02:00
330b0527c5 update to latest dependencies 2017-06-30 17:49:08 +02:00
4485b5bfc6 7.1.8 2017-06-23 16:40:02 +02:00
cf6f636d3e Merge branch 'master' of gitlab.com:gitzone/npmts 2017-06-23 16:39:27 +02:00
37e726a45f 7.1.7 2017-06-23 16:39:04 +02:00
0f0f2dd4ed Fix --nochecks option
See merge request !6
2017-06-21 18:54:29 +00:00
9033eede2c Fix --nochecks option 2017-06-21 18:54:28 +00:00
e65e7da26b 7.1.6 2017-06-17 11:10:55 +02:00
ef5c5eb2b8 update dependencies 2017-06-17 11:10:53 +02:00
ed156e6de8 7.1.5 2017-06-17 10:47:10 +02:00
d889a20572 now allows the setting of a better config for how tests are run 2017-06-17 10:47:07 +02:00
77 changed files with 7090 additions and 1908 deletions

2
.gitignore vendored
View File

@ -1,6 +1,8 @@
.nogit/
node_modules/
test/
pages/
public/
npm-debug/
.DS_Store
.yarn/

View File

@ -7,44 +7,94 @@ cache:
key: "$CI_BUILD_STAGE"
stages:
- security
- test
- release
- trigger
- pages
mirror:
stage: security
script:
- npmci git mirror
tags:
- docker
- notpriv
snyk:
stage: security
script:
- npmci command yarn global add snyk
- npmci command yarn install --ignore-scripts
- npmci command snyk test
tags:
- docker
- notpriv
codequality:
stage: security
image: docker:stable
allow_failure: true
services:
- docker:stable-dind
script:
- export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
- docker run
--env SOURCE_CODE="$PWD"
--volume "$PWD":/code
--volume /var/run/docker.sock:/var/run/docker.sock
"registry.gitlab.com/gitlab-org/security-products/codequality:$SP_VERSION" /code
artifacts:
paths: [codeclimate.json]
tags:
- docker
- priv
testLEGACY:
stage: test
script:
- npmci test legacy
- npmci node install legacy
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
allow_failure: true
testLTS:
stage: test
script:
- npmci test lts
- npmci node install lts
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
testSTABLE:
stage: test
script:
- npmci test stable
- npmci node install stable
- npmci npm install
- npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/
tags:
- docker
- notpriv
release:
stage: release
script:
- npmci publish
- npmci node install stable
- npmci npm prepare
- npmci npm publish
only:
- tags
tags:
- docker
- notpriv
trigger:
stage: trigger
@ -54,15 +104,17 @@ trigger:
- tags
tags:
- docker
- notpriv
pages:
image: hosttoday/ht-docker-node:npmci
stage: pages
script:
- npmci command yarn global add npmpage
- npmci command npmpage --publish gitlab
- npmci command npmpage
tags:
- docker
- notpriv
only:
- tags
artifacts:

View File

@ -1,6 +0,0 @@
compile/
coverage/
test/
docs/
examples
.gitignore

111
.snyk Normal file
View File

@ -0,0 +1,111 @@
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
version: v1.12.0
# ignores vulnerabilities until expiry date; change duration by modifying expiry date
ignore:
'npm:debug:20170905':
- node-pre-gyp > tar-pack > debug:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > tar-pack > debug:
reason: None given
expires: '2018-05-08T23:12:05.487Z'
'npm:tough-cookie:20170905':
- node-pre-gyp > request > tough-cookie:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > request > tough-cookie:
reason: None given
expires: '2018-05-08T23:12:05.487Z'
'npm:hoek:20180212':
- boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- cryptiles > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- hawk > cryptiles > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > hawk > cryptiles > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > hawk > cryptiles > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > request > hawk > cryptiles > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > request > hawk > cryptiles > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- hawk > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > hawk > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > hawk > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > request > hawk > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > request > hawk > boom > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- hawk > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > hawk > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > hawk > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > request > hawk > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > request > hawk > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- hawk > sntp > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > hawk > sntp > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > hawk > sntp > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- node-pre-gyp > request > hawk > sntp > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
- smartchok > chokidar > fsevents > node-pre-gyp > request > hawk > sntp > hoek:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
'npm:shelljs:20140723':
- tapbuffer > smartshell > shelljs:
reason: None given
expires: '2018-05-08T23:10:17.169Z'
'npm:atob:20180429':
- gulp-sourcemaps > css > source-map-resolve > atob:
reason: None given
expires: '2018-06-02T10:44:49.656Z'
- gulp-sourcemaps > @gulp-sourcemaps/identity-map > css > source-map-resolve > atob:
reason: None given
expires: '2018-06-02T10:44:49.656Z'
'npm:deep-extend:20180409':
- smartchok > chokidar > fsevents > node-pre-gyp > rc > deep-extend:
reason: None given
expires: '2018-06-02T10:44:49.656Z'
- deep-extend:
reason: None given
expires: '2018-06-02T10:44:49.656Z'
- node-pre-gyp > rc > deep-extend:
reason: None given
expires: '2018-06-02T10:44:49.656Z'
'npm:sshpk:20180409':
- smartchok > chokidar > fsevents > node-pre-gyp > request > http-signature > sshpk:
reason: None given
expires: '2018-06-02T10:44:49.656Z'
patch: {}

View File

@ -1,11 +0,0 @@
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
v 7.0.0
- switch from mocha to tap
- run tests in SubProcesses with coverage
- improve ES6 handling
- add smartanalytics

1
dist/index.d.ts vendored
View File

@ -0,0 +1 @@
export {};

3
dist/index.js vendored
View File

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

View File

@ -1,3 +0,0 @@
import { ProjectinfoNpm } from 'projectinfo';
export declare let projectInfo: ProjectinfoNpm;
export declare let run: (configArg: any) => Promise<{}>;

View File

@ -5,11 +5,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
* Note: Test files are only compiled in memory
* -------------------------------------------- */
const q = require("smartq");
const plugins = require("./mod00.plugins");
const NpmtsAssets = require("./mod00.assets");
const NpmtsCheck = require("./mod00.check");
const NpmtsClean = require("./mod00.clean");
const NpmtsCompile = require("./mod00.compile");
const plugins = require("./mod.plugins");
const NpmtsAssets = require("./mod.assets");
const NpmtsCheck = require("./mod.check");
const NpmtsClean = require("./mod.clean");
const NpmtsCompile = require("./mod.compile");
exports.run = function (configArg) {
let done = q.defer();
plugins.beautylog.ora.text('starting TypeScript Compilation');

View File

@ -2,14 +2,14 @@
Object.defineProperty(exports, "__esModule", { value: true });
const q = require("smartq");
const paths = require("../npmts.paths");
const plugins = require("./mod00.plugins");
const mod00_check_1 = require("../mod00/mod00.check");
const plugins = require("./mod.plugins");
const mod_check_1 = require("../mod_compile/mod.check");
exports.run = function (configArg) {
let done = q.defer();
let config = configArg;
plugins.beautylog.ora.text('now looking at ' + 'required assets');
if (config.cli === true) {
let mainJsPath = mod00_check_1.projectInfo.packageJson.main;
let mainJsPath = mod_check_1.projectInfo.packageJson.main;
let cliJsString = plugins.smartfile.fs.toStringSync(plugins.path.join(paths.npmtsAssetsDir, 'cli.js'));
cliJsString = cliJsString.replace('{{pathToIndex}}', mainJsPath);
plugins.smartfile.memory.toFsSync(cliJsString, plugins.path.join(paths.distDir, 'cli.js'));

4
dist/mod_compile/mod.check.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
import { ProjectinfoNpm } from 'projectinfo';
import { INpmtsConfig } from '../npmts.config';
export declare let projectInfo: ProjectinfoNpm;
export declare let run: (configArg: INpmtsConfig) => Promise<INpmtsConfig>;

View File

@ -1,9 +1,17 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const q = require("smartq");
const projectinfo_1 = require("projectinfo");
const paths = require("../npmts.paths");
const plugins = require("./mod00.plugins");
const plugins = require("./mod.plugins");
let checkProjectTypings = (configArg) => {
let done = q.defer();
plugins.beautylog.ora.text('Check Module: Check Project Typings...');
@ -12,20 +20,22 @@ let checkProjectTypings = (configArg) => {
plugins.beautylog.error(`please add typings field to package.json`);
process.exit(1);
}
;
done.resolve(configArg);
return done.promise;
};
const depcheckOptions = {
ignoreBinPackage: false,
parsers: {
// the target parsers
'*.ts': plugins.depcheck.parser.typescript
},
detectors: [
// the target detectors
plugins.depcheck.detector.requireCallExpression,
plugins.depcheck.detector.importDeclaration
],
specials: [
// the target special parsers
plugins.depcheck.special.eslint,
plugins.depcheck.special.webpack
]
@ -35,16 +45,18 @@ let checkDependencies = (configArg) => {
plugins.beautylog.ora.text('Check Module: Check Dependencies...');
let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, {
ignoreDirs: [
// folder with these names will be ignored
'test',
'dist',
'bower_components'
],
ignoreMatches: [
// ignore dependencies that matches these globs
'@types/*',
'babel-preset-*'
]
});
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => {
plugins.depcheck(paths.cwd, depcheckOptionsMerged, unused => {
for (let item of unused.dependencies) {
plugins.beautylog.warn(`Watch out: unused dependency "${item}"`);
}
@ -58,7 +70,6 @@ let checkDependencies = (configArg) => {
for (let item in unused.invalidFiles) {
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}`);
}
@ -71,16 +82,18 @@ let checkDevDependencies = (configArg) => {
plugins.beautylog.ora.text('Check Module: Check devDependencies...');
let depcheckOptionsMerged = plugins.lodash.merge(depcheckOptions, {
ignoreDirs: [
// folder with these names will be ignored
'ts',
'dist',
'bower_components'
],
ignoreMatches: [
// ignore dependencies that matches these globs
'@types/*',
'babel-preset-*'
]
});
plugins.depcheck(paths.cwd, depcheckOptionsMerged, (unused) => {
plugins.depcheck(paths.cwd, depcheckOptionsMerged, unused => {
for (let item of unused.devDependencies) {
plugins.beautylog.log(`unused devDependency ${item}`);
}
@ -107,23 +120,17 @@ let checkNodeVersion = (configArg) => {
done.resolve(configArg);
return done.promise;
};
exports.run = (configArg) => {
let done = q.defer();
exports.run = (configArg) => __awaiter(this, void 0, void 0, function* () {
plugins.beautylog.ora.text('Check Module: ...');
// check cli
if (configArg.argv.nocheck) {
configArg.checkDependencies = false;
}
if (configArg.checkDependencies) {
checkProjectTypings(configArg)
.then(checkDependencies)
.then(checkDevDependencies)
.then(checkNodeVersion)
.then(done.resolve)
.catch((err) => { console.log(err); });
configArg = yield checkProjectTypings(configArg);
configArg = yield checkDependencies(configArg);
configArg = yield checkDevDependencies(configArg);
configArg = yield checkNodeVersion(configArg);
return configArg;
}
else {
done.resolve(configArg);
configArg = yield checkProjectTypings(configArg);
return configArg;
}
return done.promise;
};
});

View File

@ -2,7 +2,7 @@
Object.defineProperty(exports, "__esModule", { value: true });
const q = require("smartq");
const paths = require("../npmts.paths");
const plugins = require("./mod00.plugins");
const plugins = require("./mod.plugins");
/**
* removes the dist directory which will be entirely rebuild
*/

View File

@ -2,15 +2,19 @@
Object.defineProperty(exports, "__esModule", { value: true });
const q = require("smartq");
const paths = require("../npmts.paths");
const plugins = require("./mod00.plugins");
const plugins = require("./mod.plugins");
exports.run = function (configArg) {
let done = q.defer();
let config = configArg;
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(() => {
plugins.beautylog.ok(`compiled the module's TypeScript!`);
done.resolve(config);
}).catch(err => { console.log(err); });
})
.catch(err => {
console.log(err);
});
return done.promise;
};

View File

@ -1,2 +1,6 @@
import { INpmtsConfig } from '../npmts.config';
/**
* run this module
* @param configArg some config for how to run this module
*/
export declare let run: (configArg: INpmtsConfig) => Promise<INpmtsConfig>;

View File

@ -11,9 +11,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
/* ------------------------------------------
* This module tests the compiled TypeScript files
* -------------------------------------------- */
const plugins = require("./mod02.plugins");
const plugins = require("./mod.plugins");
const paths = require("../npmts.paths");
const q = require("smartq");
let testTypeScriptConfig = {
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: ['DOM', 'ESNext']
};
/**
* runs mocha
* @returns INpmtsConfig
@ -24,21 +30,14 @@ let tap = function (configArg) {
* the TabBuffer for npmts
*/
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer();
npmtsTapBuffer.setConfig(configArg.testConfig);
/**
* handle the testable files
*/
let testableFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.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.gulpFunction.forEach((file) => __awaiter(this, void 0, void 0, function* () {
file.path = file.path.replace(paths.tsDir, paths.distDir);
})),
plugins.gulpTypeScript(testTypeScriptConfig),
plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe()
@ -49,24 +48,16 @@ let tap = function (configArg) {
let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.src([plugins.path.join(paths.cwd, 'test/*.ts')]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable']
}),
plugins.gulpTypeScript(testTypeScriptConfig),
plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestFiles(),
plugins.smartstream.cleanPipe()
]);
// lets run the smartstream
Promise.all([
testableFilesSmartstream.run(),
testFilesSmartstream.run()
]).then(() => __awaiter(this, void 0, void 0, function* () {
Promise.all([testableFilesSmartstream.run(), testFilesSmartstream.run()]).then(() => __awaiter(this, void 0, void 0, function* () {
configArg.runData.coverageLcovInfo = yield npmtsTapBuffer.runTests();
done.resolve(configArg);
}), (err) => {
}), err => {
plugins.beautylog.error('Tests failed!');
console.log(err);
if (configArg.watch) {
@ -87,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?');
}
if (coverageResult >= configArg.coverageTreshold) {
plugins.beautylog.ok(`${(coverageResult).toString()}% `
+ `coverage exceeds your treshold of `
+ `${configArg.coverageTreshold.toString()}%`);
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.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);
@ -102,6 +93,10 @@ let handleCoverageData = (configArg) => __awaiter(this, void 0, void 0, function
}
return configArg;
});
/**
* run this module
* @param configArg some config for how to run this module
*/
exports.run = function (configArg) {
let done = q.defer();
let config = configArg;
@ -109,18 +104,24 @@ exports.run = function (configArg) {
plugins.beautylog.ora.text('now starting tests');
plugins.beautylog.ora.end();
plugins.beautylog.log('ready for tapbuffer:');
if (configArg.coverage) {
if (configArg.testConfig.coverage) {
tap(config)
.then(handleCoverageData)
.then(() => {
done.resolve(config);
}).catch(err => { console.log(err); });
})
.catch(err => {
console.log(err);
});
}
else {
tap(config)
.then(() => {
done.resolve(config);
}).catch(err => { console.log(err); });
})
.catch(err => {
console.log(err);
});
}
}
else {

91
dist/npmts.cli.js vendored
View File

@ -1,4 +1,12 @@
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const q = require("smartq");
const plugins = require("./npmts.plugins");
@ -15,33 +23,54 @@ const NpmtsShip = require("./npmts.ship");
* 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.
* It is just an https call to our own Lossless Analytics API.
* 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);
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);
let npmtsAnalytics = new plugins.smartanalytics.Analytics({
apiEndPoint: 'https://pubapi.lossless.one/analytics',
projectId: 'gitzone',
appName: 'npmts'
});
process.nextTick(() => __awaiter(this, void 0, void 0, function* () {
// make the analytics call
npmtsAnalytics
.recordEvent('npmToolExecution', {
executionMode: (yield NpmtsConfig.configPromise).mode,
tsOptions: (yield NpmtsConfig.configPromise).tsOptions,
watch: (yield NpmtsConfig.configPromise).watch,
coverageTreshold: (yield NpmtsConfig.configPromise).coverageTreshold
})
.then((configArg) => {
.catch(err => {
plugins.beautylog.warn('Lossless Analytics API not available...');
});
}));
exports.run = () => __awaiter(this, void 0, void 0, function* () {
let done = q.defer();
plugins.beautylog.figletSync('NPMTS');
let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot);
// check for updates
yield plugins.smartupdate.standardHandler.check('npmts', npmtsProjectInfo.version, 'http://gitzone.gitlab.io/npmts/changelog.html');
plugins.beautylog.log('---------------------------------------------');
let npmtsCli = new plugins.smartcli.Smartcli();
// build
npmtsCli
.addCommand('build')
.subscribe((argvArg) => __awaiter(this, void 0, void 0, function* () {
let done = q.defer();
plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version);
const configArg = yield NpmtsConfig.run(argvArg);
plugins.beautylog.ora.start('loading additional modules...');
NpmtsMods.mod00.load()
.then((mod00) => {
return mod00.run(configArg);
NpmtsMods.modCompile
.load()
.then(modCompile => {
return modCompile.run(configArg);
})
.then(configArg => {
let done = q.defer();
NpmtsMods.mod01.load()
.then(mod01 => {
return mod01.run(configArg);
NpmtsMods.modDocs
.load()
.then(modDocs => {
return modDocs.run(configArg);
})
.then(configArg => {
done.resolve(configArg);
@ -50,9 +79,10 @@ exports.run = () => {
})
.then(configArg => {
let done = q.defer();
NpmtsMods.mod02.load()
.then(mod02 => {
return mod02.run(configArg);
NpmtsMods.modTest
.load()
.then(modTest => {
return modTest.run(configArg);
})
.then(configArg => {
done.resolve(configArg);
@ -62,11 +92,18 @@ exports.run = () => {
.then(NpmtsWatch.run)
.then(NpmtsShip.run);
return done.promise;
})
.catch((err) => { if (err instanceof Error) {
}), err => {
if (err instanceof Error) {
console.log(err);
} });
}
});
// standard task
npmtsCli.standardTask().subscribe((argvArg) => __awaiter(this, void 0, void 0, function* () {
yield npmtsCli.trigger('build');
}));
// cli metadata
npmtsCli.addVersion(npmtsProjectInfo.version);
// start parsing
npmtsCli.startParse();
return done.promise;
};
return yield done.promise;
});

View File

@ -1,3 +1,4 @@
import { ITapbufferConfig } from 'tapbuffer';
/**
* specifies the different modes available
* default -> uses default options no matterm what
@ -7,12 +8,12 @@
export declare type npmtsMode = 'default' | 'custom' | 'merge';
export interface INpmtsConfig {
argv: any;
coverage: boolean;
coverageTreshold: number;
checkDependencies: boolean;
mode: npmtsMode;
test: boolean;
testTs: any;
testConfig: ITapbufferConfig;
ts: any;
tsOptions: any;
watch: boolean;
@ -21,4 +22,5 @@ export interface INpmtsConfig {
coverageResult?: number;
};
}
export declare let run: (argvArg: any) => Promise<{}>;
export declare let run: (argvArg: any) => Promise<INpmtsConfig>;
export declare let configPromise: Promise<INpmtsConfig>;

15
dist/npmts.config.js vendored
View File

@ -2,17 +2,20 @@
Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./npmts.plugins");
const paths = require("./npmts.paths");
const q = require("smartq");
const smartq = require("smartq");
exports.run = function (argvArg) {
let done = q.defer();
let done = smartq.defer();
let defaultConfig = {
argv: undefined,
coverage: true,
coverageTreshold: 70,
checkDependencies: true,
mode: 'default',
test: true,
testTs: {},
testConfig: {
parallel: true,
coverage: true
},
ts: {},
tsOptions: {},
watch: false,
@ -50,7 +53,7 @@ exports.run = function (argvArg) {
config.test = false;
}
if (config.argv.nocoverage) {
config.coverage = false;
config.testConfig.coverage = false;
}
if (config.argv.nochecks) {
config.checkDependencies = false;
@ -60,5 +63,9 @@ exports.run = function (argvArg) {
}
plugins.beautylog.ok('build options are ready!');
done.resolve(config);
configDeferred.resolve(config);
return done.promise;
};
// config deferred usage
let configDeferred = smartq.defer();
exports.configPromise = configDeferred.promise;

14
dist/npmts.mods.d.ts vendored
View File

@ -1,7 +1,7 @@
import { LazyModule } from 'smartsystem';
import * as _mod00 from './mod00/index';
import * as _mod01 from './mod01/index';
import * as _mod02 from './mod02/index';
export declare let mod00: LazyModule<typeof _mod00>;
export declare let mod01: LazyModule<typeof _mod01>;
export declare let mod02: LazyModule<typeof _mod02>;
import * as plugins from './npmts.plugins';
import * as _modCompile from './mod_compile/index';
import * as _modDocs from './mod_docs/index';
import * as _modTest from './mod_test/index';
export declare let modCompile: plugins.smartsystem.LazyModule<typeof _modCompile>;
export declare let modDocs: plugins.smartsystem.LazyModule<typeof _modDocs>;
export declare let modTest: plugins.smartsystem.LazyModule<typeof _modTest>;

6
dist/npmts.mods.js vendored
View File

@ -1,6 +1,6 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const smartsystem_1 = require("smartsystem");
exports.mod00 = new smartsystem_1.LazyModule('./mod00/index', __dirname);
exports.mod01 = new smartsystem_1.LazyModule('./mod01/index', __dirname);
exports.mod02 = new smartsystem_1.LazyModule('./mod02/index', __dirname);
exports.modCompile = new smartsystem_1.LazyModule('./mod_compile/index', __dirname);
exports.modDocs = new smartsystem_1.LazyModule('./mod_docs/index', __dirname);
exports.modTest = new smartsystem_1.LazyModule('./mod_test/index', __dirname);

View File

@ -1,4 +1,3 @@
import 'typings-global';
import * as beautylog from 'beautylog';
declare let depcheck: any;
import * as lodash from 'lodash';
@ -6,12 +5,13 @@ 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 smartcli from '@pushrocks/smartcli';
import * as smarterror from 'smarterror';
import * as smartfile from 'smartfile';
import * as smartpath from 'smartpath';
import * as smartstream from 'smartstream';
import * as smartstring from 'smartstring';
import * as smartsystem from 'smartsystem';
import * as smartupdate from 'smartupdate';
import * as through2 from 'through2';
export { beautylog, depcheck, lodash, npmextra, projectinfo, path, smartanalytics, smartcli, smarterror, smartfile, smartpath, smartstream, smartstring, smartsystem, through2 };
export { beautylog, depcheck, lodash, npmextra, projectinfo, path, smartanalytics, smartcli, smarterror, smartfile, smartpath, smartstream, smartstring, smartsystem, smartupdate, through2 };

View File

@ -1,6 +1,5 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("typings-global");
const beautylog = require("beautylog");
exports.beautylog = beautylog;
let depcheck = require('depcheck');
@ -15,7 +14,7 @@ const path = require("path");
exports.path = path;
const smartanalytics = require("smartanalytics");
exports.smartanalytics = smartanalytics;
const smartcli = require("smartcli");
const smartcli = require("@pushrocks/smartcli");
exports.smartcli = smartcli;
const smarterror = require("smarterror");
exports.smarterror = smarterror;
@ -29,5 +28,7 @@ const smartstring = require("smartstring");
exports.smartstring = smartstring;
const smartsystem = require("smartsystem");
exports.smartsystem = smartsystem;
const smartupdate = require("smartupdate");
exports.smartupdate = smartupdate;
const through2 = require("through2");
exports.through2 = through2;

2
dist/npmts.watch.js vendored
View File

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

10
docs/changelog.md Normal file
View File

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

View File

@ -1,15 +1,19 @@
---
name: config
---
# Configuration
npmts can be configured to your needs.
### npmextra.json
the npmts section in npmextra.json can be used to configure npmts.
**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.
> with default behaviour.
```json
{
@ -20,6 +24,7 @@ with default behaviour.
```
**Custom settings**
```json
{
"mode": "custom",
@ -38,20 +43,23 @@ with default behaviour.
```
| key | default value | description |
| --- | --- | --- |
| `"mode"` | `"default"` | "default" will do default stuff and override , "custom" only does what you specify |
| -------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `"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 |
| `"ts"` | `{"./ts/*.ts":"./","./test/test.ts":"./test/"}` | allows you to define multiple ts portions |
| `"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 |
### 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
**npmts** also creates declaration files like `./dist/index.d.ts` by default.
You can reference it in your package.json like this.
@ -65,12 +73,16 @@ 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 no longer supports typings.json. Instead use the new TypeScript 2.x approach to typings using the @types/ npm scope.
#### Instrumentalize Code
npmts instrumentalizes (using istanbul) the created JavaScript code to create a coverage report.
#### Tests
Any errors will be shown with reference to their originating source in TypeScript
thanks to autogenerated source maps.

View File

@ -1,7 +1,9 @@
---
name: Default Behaviour
---
# Default Behaviour
when you don't configure it otherwise.
1. **Config:** Check config in ./npmextra.json (Check out [npmextra](https://www.npmjs.com/package/npmextra))

View File

@ -1,15 +1,17 @@
---
name: Examples
---
# Examples
modules that use npmts in theis development workflow
Module Name | Description
--- | ---
[gitzone](https://www.npmjs.com/package/gitzone) | fast npm module prototyping
[gulp-browser](https://www.npmjs.com/package/gulp-browser) | browserify for gulp
[npmdocker](https://www.npmjs.com/package/npmdocker) | dockerized npm development
[smartcli](https://www.npmjs.com/package/smartcli) | easy cli tool creation
| Module Name | Description |
| ---------------------------------------------------------- | --------------------------- |
| [gitzone](https://www.npmjs.com/package/gitzone) | fast npm module prototyping |
| [gulp-browser](https://www.npmjs.com/package/gulp-browser) | browserify for gulp |
| [npmdocker](https://www.npmjs.com/package/npmdocker) | dockerized npm development |
| [smartcli](https://www.npmjs.com/package/smartcli) | easy cli tool creation |
> There are tons more... We will add them here over time.

40
docs/getstarted.md Normal file
View File

@ -0,0 +1,40 @@
---
name: Get Started
description: learn how to quickly write npm TypeScript modules
---
# Get Started with NPMTS
and learn how to quickly write npm TypeScript modules
## Step1: Install the tools
To use npmts install it using npm or yarn:
```sh
npm install -g npmts # install with npm
yarn global add npmts # install with yarn
```
For the purpose of getting started quickly please also install **gitzone**.
It'll proovide awesome scaffolding for new npmts maintained modules and also updates them later on.
```sh
npm install -g gitzone # install with npm
yarn global add gitzone # install with yarn
```
You can make sure npmts and gitzone are installed correctly by typing `npmts -v && gitzone -v`.
## Scaffold a new module
To scaffold a new module type
```shell
gitzone template npm
```
This will run you through a series of question to get gitzone to know the specifics of your module.
Enter all information accordingly.
## Run NPMTS for the first time

View File

@ -1,16 +1,21 @@
---
name: Start
name: Index
description: best practice npm TypeScript modules
---
# npmts
Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
best practice npm TypeScript modules
## 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/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)
[![npm downloads per month](https://img.shields.io/npm/dm/npmts.svg)](https://www.npmjs.com/package/npmts)
@ -22,9 +27,11 @@ Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## Quick Demo
[![asciicast](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze.png)](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze?speed=2&t=0)
## Usage
NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript.
npmts will
@ -40,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/)
> MIT licensed | **&copy;** [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)

View File

@ -1,8 +1,9 @@
# Install npmts
Get started with TypeScript awesomeness.
> **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.
> \*_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.
```sh
npm install npmts -g # installs npmts globally

27
docs/structure.md Normal file
View File

@ -0,0 +1,27 @@
---
name: npmts project structure
description: how npmts projects are structured
---
# npmts - Project Structure
**locally**
```text
projectroot
|- .nogit/ # contains files that should not be checked into git - NOgit
|- dist/ # contains compiled js files and their corresponding typings - git
|- node_modules/ # contains the installed node modules - NOgit
|- test/ # contains the test files - git
|- ts/ # contains the source TypeScript files - git
|
|- .gitignore # the normal gitignore file
|- .gitlab-ci.yml # the gitlab ci yml file
|- npmextra.json # npmextra.json
|- package.json # the standard npm module package.json file
|- readme.md # the standard project readme
|- tslint.json # the standard tslint.json for TypeScript
|- yarn.lock # yarn.lock - the standard yarn.lock file
```
**in git**

5
npmextra.json Normal file
View File

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

View File

@ -1,13 +1,14 @@
{
"name": "npmts",
"version": "7.1.4",
"description": "Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.",
"name": "@gitzone/npmts",
"version": "8.0.38",
"description": "best practice npm TypeScript modules",
"main": "dist/index.js",
"bin": {
"npmts": "assets/cliNpmts.js"
},
"scripts": {
"test": "(npm run compile && npm run prepareTest && npm run setupCheck && npm run check && npm run checkVersion && npm run checkNoTest && npm run checkNoDocs)",
"build": "npm test",
"testShort": "(npm run compile && npm run check)",
"prepareTest": "(rm -rf test/)",
"compile": "(rm -rf dist/ && tsc)",
@ -34,35 +35,37 @@
},
"homepage": "https://gitlab.com/gitzone/npmts#readme",
"dependencies": {
"@types/gulp-sourcemaps": "0.0.30",
"@types/minimatch": "^2.0.29",
"@pushrocks/smartcli": "^3.0.1",
"@types/gulp-sourcemaps": "0.0.32",
"@types/minimatch": "^3.0.1",
"@types/through2": "^2.0.33",
"beautylog": "6.1.10",
"depcheck": "^0.6.7",
"beautylog": "^6.1.10",
"depcheck": "^0.6.9",
"early": "^2.1.1",
"gulp-function": "^2.2.9",
"gulp-sourcemaps": "^2.6.0",
"gulp-typescript": "^3.1.7",
"lodash": "^4.17.4",
"npmextra": "^2.0.5",
"projectinfo": "^3.0.2",
"smartanalytics": "^1.0.6",
"smartchok": "^1.0.8",
"smartcli": "^2.0.7",
"gulp-sourcemaps": "^2.6.1",
"gulp-typescript": "^4.0.2",
"lodash": "^4.17.10",
"npmextra": "^2.0.9",
"projectinfo": "^3.0.4",
"smartanalytics": "^2.0.9",
"smartchok": "1.0.14",
"smartcov": "^1.0.2",
"smarterror": "^1.0.3",
"smartfile": "^4.2.17",
"smartfile": "^4.2.26",
"smartgulp": "^1.0.6",
"smartpath": "^3.2.8",
"smartq": "^1.1.1",
"smartstream": "^1.0.8",
"smartstring": "^2.0.24",
"smartsystem": "^1.0.17",
"tapbuffer": "^1.0.13",
"smartq": "^1.1.8",
"smartstream": "^1.0.10",
"smartstring": "^2.0.28",
"smartsystem": "^2.0.2",
"smartupdate": "^1.0.13",
"tapbuffer": "^1.0.31",
"through2": "^2.0.3",
"tsn": "^2.0.15",
"typescript": "^2.3.4",
"typings-global": "^1.0.16"
"typescript": "^2.8.3"
},
"devDependencies": {}
"devDependencies": {
"@types/node": "^10.0.3"
}
}

View File

@ -1,27 +1,32 @@
# npmts
Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
best practice npm TypeScript modules
## 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-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)
[![npm downloads per month](https://img.shields.io/npm/dm/npmts.svg)](https://www.npmjs.com/package/npmts)
[![Dependency Status](https://david-dm.org/gitzonetools/npmts.svg)](https://david-dm.org/gitzonetools/npmts)
[![npm downloads per month](https://img.shields.io/npm/dm/@gitzone/npmts.svg)](https://www.npmjs.com/package/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)
[![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/)
[![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/)
## Quick Demo
[![asciicast](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze.png)](https://asciinema.org/a/9c3assmh21i49qhe5lmi48sze?speed=2&t=0)
## Usage
NPMTS is your friend when writing, testing, publishing and documenting npm modules written in TypeScript.
npmts will
@ -33,12 +38,18 @@ npmts will
For more information on how tests are run check out the [tapbuffer module](https://www.npmjs.com/package/tapbuffer).
For more information about how to best write tap tests check out the [tapbundle module's linked docs](https://www.npmjs.com/package/tapbundle).
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/)
## Changelog
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.
> MIT licensed | **&copy;** [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)

View File

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

View File

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

View File

@ -1,24 +0,0 @@
import * as q from 'smartq'
import paths = require('../npmts.paths')
import plugins = require('./mod00.plugins')
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')
if (config.cli === true) {
let mainJsPath = projectInfo.packageJson.main
let cliJsString: string = plugins.smartfile.fs.toStringSync(plugins.path.join(paths.npmtsAssetsDir,'cli.js'))
cliJsString = cliJsString.replace('{{pathToIndex}}',mainJsPath)
plugins.smartfile.memory.toFsSync(cliJsString, plugins.path.join(paths.distDir,'cli.js'))
plugins.beautylog.ok('installed CLI assets!')
done.resolve(config)
} else {
plugins.beautylog.ok('No additional assets required!')
done.resolve(config)
}
return done.promise
}

View File

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

View File

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

View File

@ -1,17 +0,0 @@
import * as q from 'smartq'
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')
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

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

View File

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

View File

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

View File

@ -1,135 +0,0 @@
/* ------------------------------------------
* This module tests the compiled TypeScript files
* -------------------------------------------- */
import plugins = require('./mod02.plugins')
import paths = require('../npmts.paths')
import * as q from 'smartq'
import { INpmtsConfig } from '../npmts.config'
/**
* runs mocha
* @returns INpmtsConfig
*/
let tap = function (configArg: INpmtsConfig) {
let done = q.defer()
/**
* the TabBuffer for npmts
*/
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer()
/**
* handle the testable files
*/
let testableFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.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.gulpFunction.forEach(async file => {
file.path = file.path.replace(paths.tsDir, paths.distDir)
}),
plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe()
])
/**
* handle the test files
*/
let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.src([ plugins.path.join(paths.cwd, 'test/*.ts') ]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: [ 'DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable' ]
}),
plugins.gulpSourcemaps.write(),
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 handleCoverageData = async (configArg: INpmtsConfig) => {
let coverageResult: number = 0 // the coverage in percent
if (configArg.runData.coverageLcovInfo) {
coverageResult = await plugins.smartcov.get.percentageFromLcovString(
configArg.runData.coverageLcovInfo,
2
)
} else {
plugins.beautylog.warn('Hey... Did your tests import and use your module that you are trying to test?')
}
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.ora.end()
plugins.beautylog.log('ready for tapbuffer:')
if (configArg.coverage) {
tap(config)
.then(handleCoverageData)
.then(() => {
done.resolve(config)
}).catch(err => { console.log(err) })
} else {
tap(config)
.then(() => {
done.resolve(config)
}).catch(err => { console.log(err) })
}
} else {
plugins.beautylog.ora.end()
done.resolve(config)
}
return done.promise
}

View File

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

27
ts/mod_compile/index.ts Normal file
View File

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

View File

@ -0,0 +1,26 @@
import * as q from 'smartq';
import paths = require('../npmts.paths');
import plugins = require('./mod.plugins');
import { projectInfo } from '../mod_compile/mod.check';
export let run = function(configArg) {
let done = q.defer();
let config = configArg;
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')
);
cliJsString = cliJsString.replace('{{pathToIndex}}', mainJsPath);
plugins.smartfile.memory.toFsSync(cliJsString, plugins.path.join(paths.distDir, 'cli.js'));
plugins.beautylog.ok('installed CLI assets!');
done.resolve(config);
} else {
plugins.beautylog.ok('No additional assets required!');
done.resolve(config);
}
return done.promise;
};

139
ts/mod_compile/mod.check.ts Normal file
View File

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

View File

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

View File

@ -0,0 +1,21 @@
import * as q from 'smartq';
import * as paths from '../npmts.paths';
import * as plugins from './mod.plugins';
export let run = function(configArg) {
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

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

15
ts/mod_docs/index.ts Normal file
View File

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

View File

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

145
ts/mod_test/index.ts Normal file
View File

@ -0,0 +1,145 @@
/* ------------------------------------------
* This module tests the compiled TypeScript files
* -------------------------------------------- */
import plugins = require('./mod.plugins');
import paths = require('../npmts.paths');
import * as q from 'smartq';
// interfaces
import { INpmtsConfig } from '../npmts.config';
import { Smartfile } from 'smartfile';
let testTypeScriptConfig = {
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: ['DOM', 'ESNext']
};
/**
* runs mocha
* @returns INpmtsConfig
*/
let tap = function(configArg: INpmtsConfig) {
let done = q.defer();
/**
* the TabBuffer for npmts
*/
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer();
npmtsTapBuffer.setConfig(configArg.testConfig);
/**
* handle the testable files
*/
let testableFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.src([plugins.path.join(paths.cwd, './ts/**/*.ts')]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript(testTypeScriptConfig),
plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe()
]);
/**
* handle the test files
*/
let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.smartgulp.src([plugins.path.join(paths.cwd, 'test/*.ts')]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript(testTypeScriptConfig),
plugins.gulpSourcemaps.write(),
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 handleCoverageData = async (configArg: INpmtsConfig) => {
let coverageResult: number = 0; // the coverage in percent
if (configArg.runData.coverageLcovInfo) {
coverageResult = await plugins.smartcov.get.percentageFromLcovString(
configArg.runData.coverageLcovInfo,
2
);
} else {
plugins.beautylog.warn(
'Hey... Did your tests import and use your module that you are trying to test?'
);
}
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;
};
/**
* run this module
* @param configArg some config for how to run this module
*/
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.ora.end();
plugins.beautylog.log('ready for tapbuffer:');
if (configArg.testConfig.coverage) {
tap(config)
.then(handleCoverageData)
.then(() => {
done.resolve(config);
})
.catch(err => {
console.log(err);
});
} else {
tap(config)
.then(() => {
done.resolve(config);
})
.catch(err => {
console.log(err);
});
}
} else {
plugins.beautylog.ora.end();
done.resolve(config);
}
return done.promise;
};

View File

@ -0,0 +1,10 @@
export * from '../npmts.plugins';
import * as gulpFunction from 'gulp-function';
import * as gulpSourcemaps from 'gulp-sourcemaps';
import * as gulpTypeScript from 'gulp-typescript';
import * as smartcov from 'smartcov';
import * as smartgulp from 'smartgulp';
import * as tapbuffer from 'tapbuffer';
export { 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 paths from './npmts.paths'
import * as NpmtsConfig from './npmts.config'
import * as NpmtsMods from './npmts.mods'
import * as NpmtsWatch from './npmts.watch'
import * as NpmtsShip from './npmts.ship'
import * as plugins from './npmts.plugins';
import * as paths from './npmts.paths';
import * as NpmtsConfig from './npmts.config';
import * as NpmtsMods from './npmts.mods';
import * as NpmtsWatch from './npmts.watch';
import * as NpmtsShip from './npmts.ship';
/**
* smartanalytics
@ -15,58 +15,101 @@ import * as NpmtsShip from './npmts.ship'
* 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.
* It is just an https call to our own Lossless Analytics API.
* 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')
let npmtsAnalytics = new plugins.smartanalytics.Analytics({
apiEndPoint: 'https://pubapi.lossless.one/analytics',
projectId: 'gitzone',
appName: 'npmts'
});
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)
process.nextTick(async () => {
// make the analytics call
npmtsAnalytics
.recordEvent('npmToolExecution', {
executionMode: (await NpmtsConfig.configPromise).mode,
tsOptions: (await NpmtsConfig.configPromise).tsOptions,
watch: (await NpmtsConfig.configPromise).watch,
coverageTreshold: (await NpmtsConfig.configPromise).coverageTreshold
})
.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 => {
plugins.beautylog.warn('Lossless Analytics API not available...');
});
});
export let run = async () => {
let done = q.defer();
plugins.beautylog.figletSync('NPMTS');
let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot);
// check for updates
await plugins.smartupdate.standardHandler.check(
'npmts',
npmtsProjectInfo.version,
'http://gitzone.gitlab.io/npmts/changelog.html'
);
plugins.beautylog.log('---------------------------------------------');
let npmtsCli = new plugins.smartcli.Smartcli();
// build
npmtsCli.addCommand('build').subscribe(
async argvArg => {
let done = q.defer();
plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version);
const configArg: NpmtsConfig.INpmtsConfig = await NpmtsConfig.run(argvArg);
plugins.beautylog.ora.start('loading additional modules...');
NpmtsMods.modCompile
.load()
.then(modCompile => {
return modCompile.run(configArg);
})
.then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>()
NpmtsMods.mod01.load()
.then(mod01 => {
return mod01.run(configArg)
let done = q.defer<NpmtsConfig.INpmtsConfig>();
NpmtsMods.modDocs
.load()
.then(modDocs => {
return modDocs.run(configArg);
})
.then(configArg => {
done.resolve(configArg)
})
return done.promise
done.resolve(configArg);
});
return done.promise;
})
.then(configArg => {
let done = q.defer<NpmtsConfig.INpmtsConfig>()
NpmtsMods.mod02.load()
.then(mod02 => {
return mod02.run(configArg)
let done = q.defer<NpmtsConfig.INpmtsConfig>();
NpmtsMods.modTest
.load()
.then(modTest => {
return modTest.run(configArg);
})
.then(configArg => {
done.resolve(configArg)
})
return done.promise
done.resolve(configArg);
});
return done.promise;
})
.then(NpmtsWatch.run)
.then(NpmtsShip.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
return done.promise;
},
err => {
if (err instanceof Error) {
console.log(err);
}
}
);
// standard task
npmtsCli.standardTask().subscribe(async argvArg => {
await npmtsCli.trigger('build');
});
// cli metadata
npmtsCli.addVersion(npmtsProjectInfo.version);
// start parsing
npmtsCli.startParse();
return await done.promise;
};

View File

@ -1,7 +1,10 @@
import plugins = require('./npmts.plugins')
import paths = require('./npmts.paths')
import plugins = require('./npmts.plugins');
import paths = require('./npmts.paths');
import * as q from 'smartq'
import * as smartq from 'smartq';
// interfaces
import { ITapbufferConfig } from 'tapbuffer';
/**
* specifies the different modes available
@ -9,94 +12,99 @@ import * as q from 'smartq'
* merge -> uses merged default + custom options
* custom -> only uses specified options
*/
export type npmtsMode = 'default' | 'custom' | 'merge'
export type npmtsMode = 'default' | 'custom' | 'merge';
export interface INpmtsConfig {
argv: any
coverage: boolean
coverageTreshold: number
checkDependencies: boolean
mode: npmtsMode
test: boolean
testTs: any
ts: any
tsOptions: any
watch: boolean
argv: any;
coverageTreshold: number;
checkDependencies: boolean;
mode: npmtsMode;
test: boolean;
testTs: any;
testConfig: ITapbufferConfig;
ts: any;
tsOptions: any;
watch: boolean;
runData: {
coverageLcovInfo?: string
coverageResult?: number
}
coverageLcovInfo?: string;
coverageResult?: number;
};
}
export let run = function(argvArg) {
let done = q.defer()
let done = smartq.defer<INpmtsConfig>();
let defaultConfig: INpmtsConfig = {
argv: undefined,
coverage: true,
coverageTreshold: 70,
checkDependencies: true,
mode: 'default',
test: true,
testTs: {},
testConfig: {
parallel: true,
coverage: true
},
ts: {},
tsOptions: {},
watch: false,
runData: {}
}
};
// mix with configfile
plugins.beautylog.ora.text('running npmextra')
plugins.beautylog.ora.text('running npmextra');
let localNpmextra = new plugins.npmextra.Npmextra(paths.cwd)
let config: INpmtsConfig = localNpmextra.dataFor<INpmtsConfig>(
'npmts',
defaultConfig
)
let localNpmextra = new plugins.npmextra.Npmextra(paths.cwd);
let config: INpmtsConfig = localNpmextra.dataFor<INpmtsConfig>('npmts', defaultConfig);
// add argv
config.argv = argvArg
config.argv = argvArg;
// check mode
switch (config.mode) {
case 'default':
case 'custom':
case 'merge':
plugins.beautylog.ok('mode is ' + config.mode)
done.resolve(config)
break
plugins.beautylog.ok('mode is ' + config.mode);
done.resolve(config);
break;
default:
plugins.beautylog.error(`mode not recognised! Can be default or custom`)
process.exit(1)
plugins.beautylog.error(`mode not recognised! Can be default or custom`);
process.exit(1);
}
// handle default mode
if (config.mode === 'default' || config.mode === 'merge') {
config.ts = {
'./ts/**/*.ts': './dist/'
}
};
config.testTs = {
'./test/**/*.ts': './test/'
}
};
}
// mix with commandline
if (config.argv.notest) {
config.test = false
config.test = false;
}
if (config.argv.nocoverage) {
config.coverage = false
config.testConfig.coverage = false;
}
if (config.argv.nochecks) {
config.checkDependencies = false
config.checkDependencies = false;
}
if (config.argv.watch) {
config.watch = true
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);
configDeferred.resolve(config);
return done.promise;
};
// config deferred usage
let configDeferred = smartq.defer<INpmtsConfig>();
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 _mod00 from './mod00/index'
import * as _mod01 from './mod01/index'
import * as _mod02 from './mod02/index'
import * as _modCompile from './mod_compile/index';
import * as _modDocs from './mod_docs/index';
import * as _modTest from './mod_test/index';
export let mod00 = new LazyModule<typeof _mod00>('./mod00/index',__dirname)
export let mod01 = new LazyModule<typeof _mod01>('./mod01/index',__dirname)
export let mod02 = new LazyModule<typeof _mod02>('./mod02/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 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
export let npmtsPackageRoot = plugins.path.join(__dirname,'../')
export let npmtsPackageRoot = plugins.path.join(__dirname, '../');
// Project paths
export let cwd = process.cwd()
export let cwd = process.cwd();
// Directories
export let tsDir = plugins.path.join(cwd,'ts/')
export let distDir = plugins.path.join(cwd,'dist/')
export let testDir = plugins.path.join(cwd,'test/')
export let typingsDir = plugins.path.join(cwd,'ts/typings/')
export let coverageDir = plugins.path.join(cwd,'coverage/')
export let tsDir = plugins.path.join(cwd, 'ts/');
export let distDir = plugins.path.join(cwd, 'dist/');
export let testDir = plugins.path.join(cwd, 'test/');
export let typingsDir = plugins.path.join(cwd, 'ts/typings/');
export let coverageDir = plugins.path.join(cwd, 'coverage/');
// Pages
export let pagesDir = plugins.path.join(cwd,'pages/')
export let pagesApiDir = plugins.path.join(pagesDir,'/api')
export let pagesDir = plugins.path.join(cwd, 'pages/');
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
export let indexTS = plugins.path.join(cwd,'ts/index.ts')
export let testTS = plugins.path.join(cwd,'ts/test.ts')
export let indexTS = plugins.path.join(cwd, 'ts/index.ts');
export let testTS = plugins.path.join(cwd, 'ts/test.ts');

View File

@ -1,20 +1,20 @@
import 'typings-global'
import * as beautylog from 'beautylog'
let depcheck = require('depcheck')
import * as beautylog from 'beautylog';
let depcheck = require('depcheck');
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 smarterror from 'smarterror'
import * as smartfile from 'smartfile'
import * as smartpath from 'smartpath'
import * as smartstream from 'smartstream'
import * as smartstring from 'smartstring'
import * as smartsystem from 'smartsystem'
import * as through2 from 'through2'
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 '@pushrocks/smartcli';
import * as smarterror from 'smarterror';
import * as smartfile from 'smartfile';
import * as smartpath from 'smartpath';
import * as smartstream from 'smartstream';
import * as smartstring from 'smartstring';
import * as smartsystem from 'smartsystem';
import * as smartupdate from 'smartupdate';
import * as through2 from 'through2';
export {
beautylog,
@ -31,5 +31,6 @@ export {
smartstream,
smartstring,
smartsystem,
smartupdate,
through2
}
};

View File

@ -1,12 +1,13 @@
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) => {
let done = q.defer()
let shipString = '' +
let done = q.defer();
let shipString =
'' +
'\n' +
'\n' +
' # # ( )\n' +
@ -19,12 +20,12 @@ export let run = (configArg: INpmtsConfig) => {
' \\___________________________________________________________/\n' +
' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' +
' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' +
' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n'
' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n';
if (process.env.CI) {
console.log(shipString)
plugins.beautylog.success('READY TO SHIP!')
console.log(shipString);
plugins.beautylog.success('READY TO SHIP!');
} else {
plugins.beautylog.success('Done!')
}
done.resolve(configArg)
plugins.beautylog.success('Done!');
}
done.resolve(configArg);
};

View File

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

4026
yarn-error.log Normal file

File diff suppressed because it is too large Load Diff

2885
yarn.lock

File diff suppressed because it is too large Load Diff