Compare commits

...

45 Commits

Author SHA1 Message Date
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
da1ec0329f 7.1.4 2017-06-16 16:12:45 +02:00
95e3f9cb10 add command line options --nochecks and --nocoverage 2017-06-16 16:12:42 +02:00
def19f76e9 7.1.3 2017-06-16 16:08:41 +02:00
455c89d68d add coverage option 2017-06-16 16:08:36 +02:00
2bd187b704 Merge branch 'master' into 'master'
introduce a merge option

See merge request !5
2017-06-15 23:42:52 +00:00
29dff4c0e3 introduce a merge option 2017-06-15 23:42:48 +00:00
f236d77952 7.1.2 2017-06-09 16:25:52 +02:00
c91a8d8e69 add smarterror 2017-06-09 16:25:49 +02:00
0d5c49fe60 7.1.1 2017-05-13 10:55:38 +02:00
2112b4527d remove some old cleanup code 2017-05-13 10:55:35 +02:00
bd3873a359 7.1.0 2017-05-13 10:22:06 +02:00
6ec0ccac34 add sourcemap support for tests 2017-05-13 10:21:55 +02:00
9bff7db97b 7.0.18 2017-05-05 00:23:16 +02:00
2305be0daa update docs and include terminal session. 2017-05-05 00:23:04 +02:00
9cd24695db 7.0.17 2017-05-05 00:01:24 +02:00
46c79e711b now looking for coverage percentage being actually present, fixes #22 2017-05-05 00:01:21 +02:00
4b07c9951f update readme 2017-05-04 23:28:28 +02:00
559b5553eb 7.0.16 2017-05-01 22:43:35 +02:00
87ceed6f8f fix smartgulp 2017-05-01 22:43:32 +02:00
ee36914a42 7.0.15 2017-05-01 20:35:27 +02:00
7dc6cdb250 intermediate fix untel figuring out pathing problems with smartgulp 2017-05-01 20:35:24 +02:00
3ea6585992 7.0.14 2017-04-30 18:22:37 +02:00
0f0592cdaf replace gulp 2017-04-30 18:22:34 +02:00
cf438ae431 7.0.13 2017-04-22 13:00:05 +02:00
6cbf7cedc8 update dependencies 2017-04-22 13:00:02 +02:00
77bba7f865 7.0.12 2017-04-21 19:07:07 +02:00
49fc7e4687 update docs 2017-04-21 19:06:22 +02:00
7ee0c349e3 7.0.11 2017-04-21 13:35:24 +02:00
f706376e48 update to latest dependencies 2017-04-21 13:35:21 +02:00
8d8cdde15d 7.0.10 2017-04-21 00:38:36 +02:00
dc98d893b1 update dependencies 2017-04-21 00:38:32 +02:00
6070249cd2 7.0.9 2017-04-21 00:17:01 +02:00
05ce3e133d update to latest standards 2017-04-21 00:16:57 +02:00
5f5a421453 Merge branch 'master' of gitlab.com:gitzone/npmts 2017-04-21 00:16:24 +02:00
d5d0052ecf 7.0.8 2017-04-17 23:23:54 +02:00
9caa301f40 cli now sets environment variable 2017-04-17 23:23:48 +02:00
5fb2f3a81f 7.0.7 2017-04-17 15:04:04 +02:00
873c7af7a4 update smartanalytics id 2017-04-17 15:03:59 +02:00
5e82218d92 7.0.6 2017-04-17 14:55:44 +02:00
354b1b1bf7 add privacy policy to TypeScript files 2017-04-17 14:55:35 +02:00
467670863a Update README.md capitalization to all lower case. 2017-04-03 20:37:43 +00:00
07195d207d 7.0.5 2017-04-01 21:03:55 +02:00
b60bb25b0f update ci 2017-04-01 21:02:47 +02:00
28 changed files with 1095 additions and 1190 deletions

View File

@ -1,6 +1,11 @@
# standard ci # gitzone standard
image: hosttoday/ht-docker-node:npmci image: hosttoday/ht-docker-node:npmci
cache:
paths:
- .yarn/
key: "$CI_BUILD_STAGE"
stages: stages:
- test - test
- release - release
@ -11,6 +16,7 @@ testLEGACY:
stage: test stage: test
script: script:
- npmci test legacy - npmci test legacy
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
allow_failure: true allow_failure: true
@ -19,6 +25,7 @@ testLTS:
stage: test stage: test
script: script:
- npmci test lts - npmci test lts
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
@ -26,6 +33,7 @@ testSTABLE:
stage: test stage: test
script: script:
- npmci test stable - npmci test stable
coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- docker - docker
@ -51,12 +59,12 @@ pages:
image: hosttoday/ht-docker-node:npmci image: hosttoday/ht-docker-node:npmci
stage: pages stage: pages
script: script:
- npmci command yarn add npmpage - npmci command yarn global add npmpage
- npmci command npmpage - npmci command npmpage --publish gitlab
only:
- tags
tags: tags:
- docker - docker
only:
- tags
artifacts: artifacts:
expire_in: 1 week expire_in: 1 week
paths: paths:

View File

@ -1,2 +1,3 @@
#!/usr/bin/env node #!/usr/bin/env node
process.env.CLI_CALL = 'true'
var index = require("../{{pathToIndex}}"); var index = require("../{{pathToIndex}}");

2
dist/index.js vendored
View File

@ -1,8 +1,8 @@
"use strict";
/* ================================================== * /* ================================================== *
**** NPMTS **** **** NPMTS ****
Fabulous TypeScript development Fabulous TypeScript development
* ================================================== */ * ================================================== */
"use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const early = require("early"); const early = require("early");
early.start('NPMTS'); early.start('NPMTS');

View File

@ -85,7 +85,7 @@ let checkDevDependencies = (configArg) => {
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(`unused 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');
@ -110,11 +110,20 @@ let checkNodeVersion = (configArg) => {
exports.run = (configArg) => { exports.run = (configArg) => {
let done = q.defer(); let done = q.defer();
plugins.beautylog.ora.text('Check Module: ...'); plugins.beautylog.ora.text('Check Module: ...');
// check cli
if (configArg.argv.nocheck) {
configArg.checkDependencies = false;
}
if (configArg.checkDependencies) {
checkProjectTypings(configArg) checkProjectTypings(configArg)
.then(checkDependencies) .then(checkDependencies)
.then(checkDevDependencies) .then(checkDevDependencies)
.then(checkNodeVersion) .then(checkNodeVersion)
.then(done.resolve) .then(done.resolve)
.catch((err) => { console.log(err); }); .catch((err) => { console.log(err); });
}
else {
done.resolve(configArg);
}
return done.promise; return done.promise;
}; };

View File

@ -10,17 +10,6 @@ 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 .d.ts files from testDirctory
*/
let removeTestDeclarations = function () {
let done = q.defer();
plugins.smartfile.fs.listFileTree('./test/', '**/*.d.ts').then(fileArray => {
let fileArrayToRemove = plugins.smartpath.transform.toAbsolute(fileArray, process.cwd() + '//test/');
plugins.smartfile.fs.removeManySync(fileArrayToRemove);
done.resolve();
});
};
/** /**
* remove old pages * remove old pages
*/ */
@ -32,7 +21,6 @@ exports.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(removeTestDeclarations)
.then(removePages) .then(removePages)
.then(function () { .then(function () {
plugins.beautylog.ok('Cleaned up from previous builds!'); plugins.beautylog.ok('Cleaned up from previous builds!');

55
dist/mod02/index.js vendored
View File

@ -24,11 +24,31 @@ let tap = function (configArg) {
* the TabBuffer for npmts * the TabBuffer for npmts
*/ */
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer(); let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer();
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.gulp.src([plugins.path.join(paths.cwd, './ts/**/*.ts')]), 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.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.gulpSourcemaps.init(),
plugins.gulpTypeScript({ plugins.gulpTypeScript({
target: 'ES5', target: 'ES5',
@ -37,23 +57,6 @@ let tap = function (configArg) {
lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable'] lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable']
}), }),
plugins.gulpSourcemaps.write(), plugins.gulpSourcemaps.write(),
plugins.gulpFunction.forEach((file) => __awaiter(this, void 0, void 0, function* () {
file.path = file.path.replace(paths.tsDir, paths.distDir);
})),
npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe()
]);
/**
* handle the test files
*/
let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([plugins.path.join(paths.cwd, 'test/*.ts')]),
plugins.gulpTypeScript({
target: 'ES5',
emitDecoratorMetadata: true,
experimentalDecorators: true,
lib: ['DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable']
}),
npmtsTapBuffer.pipeTestFiles(), npmtsTapBuffer.pipeTestFiles(),
plugins.smartstream.cleanPipe() plugins.smartstream.cleanPipe()
]); ]);
@ -77,7 +80,13 @@ let tap = function (configArg) {
return done.promise; return done.promise;
}; };
let handleCoverageData = (configArg) => __awaiter(this, void 0, void 0, function* () { let handleCoverageData = (configArg) => __awaiter(this, void 0, void 0, function* () {
let coverageResult = yield plugins.smartcov.get.percentageFromLcovString(configArg.runData.coverageLcovInfo, 2); let coverageResult = 0; // the coverage in percent
if (configArg.runData.coverageLcovInfo) {
coverageResult = yield 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) { if (coverageResult >= configArg.coverageTreshold) {
plugins.beautylog.ok(`${(coverageResult).toString()}% ` plugins.beautylog.ok(`${(coverageResult).toString()}% `
+ `coverage exceeds your treshold of ` + `coverage exceeds your treshold of `
@ -101,12 +110,20 @@ exports.run = function (configArg) {
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.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 {
tap(config)
.then(() => {
done.resolve(config);
}).catch(err => { console.log(err); });
}
}
else { else {
plugins.beautylog.ora.end(); plugins.beautylog.ora.end();
done.resolve(config); done.resolve(config);

View File

@ -1,8 +1,8 @@
export * from '../npmts.plugins'; export * from '../npmts.plugins';
import * as gulp from 'gulp';
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 tapbuffer from 'tapbuffer'; import * as tapbuffer from 'tapbuffer';
export { gulp, gulpFunction, gulpSourcemaps, gulpTypeScript, smartcov, tapbuffer }; export { gulpFunction, gulpSourcemaps, gulpTypeScript, smartcov, smartgulp, tapbuffer };

View File

@ -4,8 +4,6 @@ function __export(m) {
} }
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
__export(require("../npmts.plugins")); __export(require("../npmts.plugins"));
const gulp = require("gulp");
exports.gulp = gulp;
const gulpFunction = require("gulp-function"); const gulpFunction = require("gulp-function");
exports.gulpFunction = gulpFunction; exports.gulpFunction = gulpFunction;
const gulpSourcemaps = require("gulp-sourcemaps"); const gulpSourcemaps = require("gulp-sourcemaps");
@ -14,5 +12,7 @@ const gulpTypeScript = require("gulp-typescript");
exports.gulpTypeScript = gulpTypeScript; exports.gulpTypeScript = gulpTypeScript;
const smartcov = require("smartcov"); const smartcov = require("smartcov");
exports.smartcov = smartcov; exports.smartcov = smartcov;
const smartgulp = require("smartgulp");
exports.smartgulp = smartgulp;
const tapbuffer = require("tapbuffer"); const tapbuffer = require("tapbuffer");
exports.tapbuffer = tapbuffer; exports.tapbuffer = tapbuffer;

15
dist/npmts.cli.js vendored
View File

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

View File

@ -1,10 +1,19 @@
export declare type npmtsMode = 'default' | 'custom'; /**
* specifies the different modes available
* default -> uses default options no matterm what
* merge -> uses merged default + custom options
* custom -> only uses specified options
*/
export declare type npmtsMode = 'default' | 'custom' | 'merge';
export interface INpmtsConfig { export interface INpmtsConfig {
argv: any; argv: any;
coverage: boolean;
coverageTreshold: number; coverageTreshold: number;
checkDependencies: boolean;
mode: npmtsMode; mode: npmtsMode;
test: boolean; test: boolean;
testTs: any; testTs: any;
testConfig: any;
ts: any; ts: any;
tsOptions: any; tsOptions: any;
watch: boolean; watch: boolean;

21
dist/npmts.config.js vendored
View File

@ -3,15 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
const plugins = require("./npmts.plugins"); const plugins = require("./npmts.plugins");
const paths = require("./npmts.paths"); const paths = require("./npmts.paths");
const q = require("smartq"); const q = require("smartq");
;
exports.run = function (argvArg) { exports.run = function (argvArg) {
let done = q.defer(); let done = q.defer();
let defaultConfig = { let defaultConfig = {
argv: undefined, argv: undefined,
coverage: true,
coverageTreshold: 70, coverageTreshold: 70,
checkDependencies: true,
mode: 'default', mode: 'default',
test: true, test: true,
testTs: {}, testTs: {},
testConfig: {
parallel: true
},
ts: {}, ts: {},
tsOptions: {}, tsOptions: {},
watch: false, watch: false,
@ -27,16 +31,16 @@ exports.run = function (argvArg) {
switch (config.mode) { switch (config.mode) {
case 'default': case 'default':
case 'custom': case 'custom':
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!`); 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') { if (config.mode === 'default' || config.mode === 'merge') {
config.ts = { config.ts = {
'./ts/**/*.ts': './dist/' './ts/**/*.ts': './dist/'
}; };
@ -44,16 +48,19 @@ exports.run = function (argvArg) {
'./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) {
config.coverage = false;
}
if (config.argv.nochecks) {
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);
return done.promise; return done.promise;

View File

@ -7,12 +7,11 @@ 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 smartenv from 'smartenv'; 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 through2 from 'through2'; import * as through2 from 'through2';
export declare let sourceMapSupport: any; 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, smartenv, smartfile, smartpath, smartstream, smartstring, smartsystem, through2 };

View File

@ -17,8 +17,8 @@ const smartanalytics = require("smartanalytics");
exports.smartanalytics = smartanalytics; exports.smartanalytics = smartanalytics;
const smartcli = require("smartcli"); const smartcli = require("smartcli");
exports.smartcli = smartcli; exports.smartcli = smartcli;
const smartenv = require("smartenv"); const smarterror = require("smarterror");
exports.smartenv = smartenv; exports.smarterror = smarterror;
const smartfile = require("smartfile"); const smartfile = require("smartfile");
exports.smartfile = smartfile; exports.smartfile = smartfile;
const smartpath = require("smartpath"); const smartpath = require("smartpath");
@ -31,4 +31,3 @@ const smartsystem = require("smartsystem");
exports.smartsystem = smartsystem; exports.smartsystem = smartsystem;
const through2 = require("through2"); const through2 = require("through2");
exports.through2 = through2; exports.through2 = through2;
exports.sourceMapSupport = require('source-map-support').install(); // display errors correctly during testing

View File

@ -2,9 +2,7 @@
name: config name: config
--- ---
# Configuration # Configuration
## of npmts 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.

View File

@ -2,7 +2,7 @@
name: Default Behaviour name: Default Behaviour
--- ---
# Default Behaviour # Default Behaviour
## of npmts 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)

View File

@ -2,14 +2,16 @@
name: Examples name: Examples
--- ---
# Examples # Examples
## of modules that use npmts 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
[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
[smartcli](https://www.npmjs.com/package/smartcli) | easy cli tool creation
> There are tons more... We will add them here over time.
> We will add more options over time.
### Tips and tricks: ### Tips and tricks:

View File

@ -2,7 +2,7 @@
name: Start name: Start
--- ---
# npmts # npmts
## Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6. Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
## 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)
@ -14,13 +14,16 @@ name: Start
[![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)
[![Dependency Status](https://david-dm.org/gitzone/npmts.svg)](https://david-dm.org/gitzone/npmts) [![Dependency Status](https://david-dm.org/gitzonetools/npmts.svg)](https://david-dm.org/gitzonetools/npmts)
[![bitHound Dependencies](https://www.bithound.io/github/gitzone/npmts/badges/dependencies.svg)](https://www.bithound.io/github/gitzone/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/gitzone/npmts/badges/code.svg)](https://www.bithound.io/github/gitzone/npmts) [![bitHound Code](https://www.bithound.io/github/gitzonetools/npmts/badges/code.svg)](https://www.bithound.io/github/gitzonetools/npmts)
[![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
[![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.
@ -39,4 +42,4 @@ This works on your machine and in CI. There is a prebuild docker image available
> 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:/git.zone)

View File

@ -1,5 +1,5 @@
# Install npmts # Install npmts
First install npmts globally, then install the npmts-g locally. 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.

View File

@ -1,6 +1,6 @@
{ {
"name": "npmts", "name": "npmts",
"version": "7.0.4", "version": "7.1.5",
"description": "Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.", "description": "Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.",
"main": "dist/index.js", "main": "dist/index.js",
"bin": { "bin": {
@ -34,37 +34,35 @@
}, },
"homepage": "https://gitlab.com/gitzone/npmts#readme", "homepage": "https://gitlab.com/gitzone/npmts#readme",
"dependencies": { "dependencies": {
"@types/gulp": "^4.0.2",
"@types/gulp-sourcemaps": "0.0.30", "@types/gulp-sourcemaps": "0.0.30",
"@types/minimatch": "^2.0.29", "@types/minimatch": "^2.0.29",
"@types/through2": "^2.0.32", "@types/through2": "^2.0.33",
"beautylog": "6.1.5", "beautylog": "6.1.10",
"depcheck": "^0.6.7", "depcheck": "^0.6.7",
"early": "^2.0.38", "early": "^2.1.1",
"gulp": "3.9.1", "gulp-function": "^2.2.9",
"gulp-function": "^2.2.3", "gulp-sourcemaps": "^2.6.0",
"gulp-sourcemaps": "^2.5.0", "gulp-typescript": "^3.1.7",
"gulp-typescript": "^3.1.6",
"lodash": "^4.17.4", "lodash": "^4.17.4",
"npmextra": "^2.0.5", "npmextra": "^2.0.5",
"projectinfo": "^3.0.2", "projectinfo": "^3.0.2",
"smartanalytics": "^1.0.3", "smartanalytics": "^1.0.6",
"smartchok": "^1.0.5", "smartchok": "^1.0.8",
"smartcli": "^2.0.1", "smartcli": "^2.0.7",
"smartcov": "^1.0.2", "smartcov": "^1.0.2",
"smartenv": "2.0.0", "smarterror": "^1.0.3",
"smartfile": "^4.1.9", "smartfile": "^4.2.17",
"smartgulp": "^1.0.6",
"smartpath": "^3.2.8", "smartpath": "^3.2.8",
"smartq": "^1.1.1", "smartq": "^1.1.1",
"smartstream": "^1.0.8", "smartstream": "^1.0.8",
"smartstring": "^2.0.24", "smartstring": "^2.0.24",
"smartsystem": "^1.0.12", "smartsystem": "^1.0.17",
"source-map-support": "^0.4.14", "tapbuffer": "^1.0.14",
"tapbuffer": "^1.0.10",
"through2": "^2.0.3", "through2": "^2.0.3",
"tsn": "^2.0.15", "tsn": "^2.0.15",
"typescript": "^2.2.2", "typescript": "^2.3.4",
"typings-global": "^1.0.14" "typings-global": "^1.0.17"
}, },
"devDependencies": {} "devDependencies": {}
} }

View File

@ -11,13 +11,16 @@ Write npm modules with TypeScript without hassle. TypeScript ready. Fully ES6.
[![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)
[![Dependency Status](https://david-dm.org/gitzone/npmts.svg)](https://david-dm.org/gitzone/npmts) [![Dependency Status](https://david-dm.org/gitzonetools/npmts.svg)](https://david-dm.org/gitzonetools/npmts)
[![bitHound Dependencies](https://www.bithound.io/github/gitzone/npmts/badges/dependencies.svg)](https://www.bithound.io/github/gitzone/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/gitzone/npmts/badges/code.svg)](https://www.bithound.io/github/gitzone/npmts) [![bitHound Code](https://www.bithound.io/github/gitzonetools/npmts/badges/code.svg)](https://www.bithound.io/github/gitzonetools/npmts)
[![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
[![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.
@ -33,6 +36,8 @@ For more information on how tests are run check out the [tapbuffer module](https
This works on your machine and in CI. There is a prebuild docker image available that includes npmts to make CI a breeze: 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/) [hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/)
For further information read the linked docs at the top of this README.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) > 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)

View File

@ -89,7 +89,7 @@ let checkDevDependencies = (configArg) => {
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(`unused 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')
@ -116,11 +116,21 @@ let checkNodeVersion = (configArg) => {
export let run = (configArg) => { export let run = (configArg) => {
let done = q.defer() let done = q.defer()
plugins.beautylog.ora.text('Check Module: ...') plugins.beautylog.ora.text('Check Module: ...')
// check cli
if (configArg.argv.nocheck) {
configArg.checkDependencies = false
}
if (configArg.checkDependencies) {
checkProjectTypings(configArg) checkProjectTypings(configArg)
.then(checkDependencies) .then(checkDependencies)
.then(checkDevDependencies) .then(checkDevDependencies)
.then(checkNodeVersion) .then(checkNodeVersion)
.then(done.resolve) .then(done.resolve)
.catch((err) => { console.log(err) }) .catch((err) => { console.log(err) })
} else {
done.resolve(configArg)
}
return done.promise return done.promise
} }

View File

@ -11,18 +11,6 @@ let removeDist = function () {
return plugins.smartfile.fs.remove(paths.distDir) return plugins.smartfile.fs.remove(paths.distDir)
} }
/**
* remove .d.ts files from testDirctory
*/
let removeTestDeclarations = function () {
let done = q.defer()
plugins.smartfile.fs.listFileTree('./test/', '**/*.d.ts').then(fileArray => {
let fileArrayToRemove = plugins.smartpath.transform.toAbsolute(fileArray, process.cwd() + '//test/')
plugins.smartfile.fs.removeManySync(fileArrayToRemove)
done.resolve()
})
}
/** /**
* remove old pages * remove old pages
*/ */
@ -35,7 +23,6 @@ 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(removeTestDeclarations)
.then(removePages) .then(removePages)
.then(function () { .then(function () {
plugins.beautylog.ok('Cleaned up from previous builds!') plugins.beautylog.ok('Cleaned up from previous builds!')

View File

@ -20,11 +20,13 @@ let tap = function (configArg: INpmtsConfig) {
*/ */
let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer() let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer()
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.gulp.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({ plugins.gulpTypeScript({
target: 'ES5', target: 'ES5',
@ -32,10 +34,10 @@ let tap = function (configArg: INpmtsConfig) {
experimentalDecorators: true, experimentalDecorators: true,
lib: [ 'DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable' ] lib: [ 'DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable' ]
}), }),
plugins.gulpSourcemaps.write(),
plugins.gulpFunction.forEach(async file => { plugins.gulpFunction.forEach(async file => {
file.path = file.path.replace(paths.tsDir, paths.distDir) file.path = file.path.replace(paths.tsDir, paths.distDir)
}), }),
plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestableFiles(), npmtsTapBuffer.pipeTestableFiles(),
plugins.smartstream.cleanPipe() plugins.smartstream.cleanPipe()
]) ])
@ -44,13 +46,15 @@ let tap = function (configArg: INpmtsConfig) {
* handle the test files * handle the test files
*/ */
let testFilesSmartstream = new plugins.smartstream.Smartstream([ let testFilesSmartstream = new plugins.smartstream.Smartstream([
plugins.gulp.src([ plugins.path.join(paths.cwd, 'test/*.ts') ]), plugins.smartgulp.src([ plugins.path.join(paths.cwd, 'test/*.ts') ]),
plugins.gulpSourcemaps.init(),
plugins.gulpTypeScript({ plugins.gulpTypeScript({
target: 'ES5', target: 'ES5',
emitDecoratorMetadata: true, emitDecoratorMetadata: true,
experimentalDecorators: true, experimentalDecorators: true,
lib: [ 'DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable' ] lib: [ 'DOM', 'ES5', 'ES2015.Promise', 'ES2015.Generator', 'ES2015.Iterable' ]
}), }),
plugins.gulpSourcemaps.write(),
npmtsTapBuffer.pipeTestFiles(), npmtsTapBuffer.pipeTestFiles(),
plugins.smartstream.cleanPipe() plugins.smartstream.cleanPipe()
]) ])
@ -77,10 +81,16 @@ let tap = function (configArg: INpmtsConfig) {
} }
let handleCoverageData = async (configArg: INpmtsConfig) => { let handleCoverageData = async (configArg: INpmtsConfig) => {
let coverageResult = await plugins.smartcov.get.percentageFromLcovString( let coverageResult: number = 0 // the coverage in percent
if (configArg.runData.coverageLcovInfo) {
coverageResult = await plugins.smartcov.get.percentageFromLcovString(
configArg.runData.coverageLcovInfo, configArg.runData.coverageLcovInfo,
2 2
) )
} else {
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()}% `
@ -106,12 +116,19 @@ export let run = function (configArg: INpmtsConfig) {
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.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 {
tap(config)
.then(() => {
done.resolve(config)
}).catch(err => { console.log(err) })
}
} else { } else {
plugins.beautylog.ora.end() plugins.beautylog.ora.end()
done.resolve(config) done.resolve(config)

View File

@ -1,17 +1,17 @@
export * from '../npmts.plugins' export * from '../npmts.plugins'
import * as gulp from 'gulp'
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 tapbuffer from 'tapbuffer' import * as tapbuffer from 'tapbuffer'
export { export {
gulp,
gulpFunction, gulpFunction,
gulpSourcemaps, gulpSourcemaps,
gulpTypeScript, gulpTypeScript,
smartcov, smartcov,
smartgulp,
tapbuffer tapbuffer
} }

View File

@ -7,8 +7,19 @@ 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'
let npmtsAnalytics = new plugins.smartanalytics.AnalyticsAccount('npmts','UA-64087619-2') /**
npmtsAnalytics.sendEvent('npm','exec','push.rocks') * smartanalytics
* this data is fully anonymized (no Ips or any other personal information is tracked).
* It just keeps track which of our tools are really used...
* ... so we know where to spend our limited resources for improving them.
* Since yarn is out and there is heavy caching going on,
* pure download stats are just not reliable enough for us anymore
* Feel free to dig into the smartanalytics package, if you are interested in how it works.
* It is just an https call to Google Analytics.
* Our privacy policy can be found here: https://lossless.gmbh/privacy.html
*/
let npmtsAnalytics = new plugins.smartanalytics.AnalyticsAccount('npmts','UA-64087619-5')
npmtsAnalytics.sendEvent('npm','exec','git.zone')
export let run = () => { export let run = () => {
let done = q.defer() let done = q.defer()

View File

@ -3,31 +3,45 @@ import paths = require('./npmts.paths')
import * as q from 'smartq' import * as q from 'smartq'
export type npmtsMode = 'default' | 'custom' /**
* specifies the different modes available
* default -> uses default options no matterm what
* merge -> uses merged default + custom options
* custom -> only uses specified options
*/
export type npmtsMode = 'default' | 'custom' | 'merge'
export interface INpmtsConfig { export interface INpmtsConfig {
argv: any, argv: any
coverageTreshold: number, coverage: boolean
mode: npmtsMode, coverageTreshold: number
test: boolean, checkDependencies: boolean
testTs: any, mode: npmtsMode
ts: any, test: boolean
tsOptions: any, testTs: any
testConfig: any
ts: 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 = q.defer() let done = q.defer()
let defaultConfig: INpmtsConfig = { let defaultConfig: INpmtsConfig = {
argv: undefined, argv: undefined,
coverage: true,
coverageTreshold: 70, coverageTreshold: 70,
checkDependencies: true,
mode: 'default', mode: 'default',
test: true, test: true,
testTs: {}, testTs: {},
testConfig: {
parallel: true
},
ts: {}, ts: {},
tsOptions: {}, tsOptions: {},
watch: false, watch: false,
@ -50,31 +64,41 @@ export let run = function (argvArg) {
switch (config.mode) { switch (config.mode) {
case 'default': case 'default':
case 'custom': case 'custom':
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!`) 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') { 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) {
config.coverage = false
}
if (config.argv.nochecks) {
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)

View File

@ -8,14 +8,13 @@ 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 smartenv from 'smartenv' 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 through2 from 'through2' import * as through2 from 'through2'
export let sourceMapSupport = require('source-map-support').install() // display errors correctly during testing
export { export {
beautylog, beautylog,
@ -26,7 +25,7 @@ export {
path, path,
smartanalytics, smartanalytics,
smartcli, smartcli,
smartenv, smarterror,
smartfile, smartfile,
smartpath, smartpath,
smartstream, smartstream,

1653
yarn.lock

File diff suppressed because it is too large Load Diff