From 896e0095faaaff15894e288b8b5a801ee1b76366 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Mon, 9 Apr 2018 01:03:39 +0200 Subject: [PATCH] change npmts package name to being @gitzone scoped --- .gitlab-ci.yml | 58 ++++++++------ dist/index.js | 3 +- dist/mod_compile/mod.check.js | 11 ++- dist/mod_compile/mod.compile.js | 8 +- dist/mod_test/index.js | 34 ++++---- dist/npmts.cli.js | 30 ++++--- dist/npmts.watch.js | 2 +- docs/changelog.md | 3 +- docs/config.md | 55 +++++++------ docs/default.md | 12 +-- docs/examples.md | 16 ++-- docs/getstarted.md | 4 +- docs/index.md | 18 +++-- docs/install.md | 7 +- docs/structure.md | 3 +- npmextra.json | 5 ++ package.json | 2 +- readme.md | 22 ++++-- ts/index.ts | 17 ++-- ts/mod_compile/index.ts | 30 +++---- ts/mod_compile/mod.assets.ts | 38 ++++----- ts/mod_compile/mod.check.ts | 135 +++++++++++++++++--------------- ts/mod_compile/mod.clean.ts | 40 +++++----- ts/mod_compile/mod.compile.ts | 30 ++++--- ts/mod_compile/mod.plugins.ts | 14 ++-- ts/mod_docs/index.ts | 18 ++--- ts/mod_docs/mod.plugins.ts | 3 +- ts/mod_test/index.ts | 129 +++++++++++++++--------------- ts/mod_test/mod.plugins.ts | 23 ++---- ts/npmts.cli.ts | 116 +++++++++++++++------------ ts/npmts.config.ts | 89 ++++++++++----------- ts/npmts.mods.ts | 16 ++-- ts/npmts.paths.ts | 26 +++--- ts/npmts.plugins.ts | 66 ++++++++-------- ts/npmts.ship.ts | 53 +++++++------ ts/npmts.watch.ts | 44 +++++------ 36 files changed, 630 insertions(+), 550 deletions(-) create mode 100644 npmextra.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d82c5e6..14931f9 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,76 +7,84 @@ cache: key: "$CI_BUILD_STAGE" stages: -- mirror +- security - test - release - trigger - pages mirror: - image: hosttoday/ht-docker-node:npmci - stage: mirror + stage: security script: - - npmci git mirror + - npmci git mirror tags: - - docker + - docker + +snyk: + stage: security + script: + - npmci command yarn global add snyk + - npmci command yarn install --ignore-scripts + - npmci command snyk test + tags: + - docker testLEGACY: stage: test script: - - npmci node install legacy - - npmci npm install - - npmci npm test + - npmci node install legacy + - npmci npm install + - npmci npm test coverage: /\d+.?\d+?\%\s*coverage/ tags: - - docker + - docker allow_failure: true testLTS: stage: test script: - - npmci node install lts - - npmci npm install - - npmci npm test + - npmci node install lts + - npmci npm install + - npmci npm test coverage: /\d+.?\d+?\%\s*coverage/ tags: - - docker + - docker testSTABLE: stage: test script: - - npmci node install stable - - npmci npm install - - npmci npm test + - npmci node install stable + - npmci npm install + - npmci npm test coverage: /\d+.?\d+?\%\s*coverage/ tags: - - docker + - docker release: stage: release script: - - npmci npm prepare - - npmci npm publish + - npmci npm prepare + - npmci npm publish only: - - tags + - tags tags: - - docker + - docker trigger: stage: trigger script: - - npmci trigger + - npmci trigger only: - - tags + - tags tags: - - docker + - docker 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 only: diff --git a/dist/index.js b/dist/index.js index 6446239..351ed2e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -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(); }); diff --git a/dist/mod_compile/mod.check.js b/dist/mod_compile/mod.check.js index 827708b..d226e79 100644 --- a/dist/mod_compile/mod.check.js +++ b/dist/mod_compile/mod.check.js @@ -26,13 +26,16 @@ let checkProjectTypings = (configArg) => { 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 ] @@ -42,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}"`); } @@ -77,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}`); } diff --git a/dist/mod_compile/mod.compile.js b/dist/mod_compile/mod.compile.js index 790eba7..a0fb939 100644 --- a/dist/mod_compile/mod.compile.js +++ b/dist/mod_compile/mod.compile.js @@ -7,10 +7,14 @@ 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; }; diff --git a/dist/mod_test/index.js b/dist/mod_test/index.js index f80247f..4f15b75 100644 --- a/dist/mod_test/index.js +++ b/dist/mod_test/index.js @@ -18,10 +18,7 @@ let testTypeScriptConfig = { target: 'ES5', emitDecoratorMetadata: true, experimentalDecorators: true, - lib: [ - 'DOM', - 'ESNext' - ] + lib: ['DOM', 'ESNext'] }; /** * runs mocha @@ -57,13 +54,10 @@ let tap = function (configArg) { 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) { @@ -84,14 +78,14 @@ let handleCoverageData = (configArg) => __awaiter(this, void 0, void 0, function plugins.beautylog.warn('Hey... Did your tests import and use your module that you are trying to test?'); } 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); @@ -111,13 +105,19 @@ exports.run = function (configArg) { .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 { diff --git a/dist/npmts.cli.js b/dist/npmts.cli.js index 52e27e4..0b71930 100644 --- a/dist/npmts.cli.js +++ b/dist/npmts.cli.js @@ -33,12 +33,14 @@ let npmtsAnalytics = new plugins.smartanalytics.Analytics({ }); process.nextTick(() => __awaiter(this, void 0, void 0, function* () { // make the analytics call - npmtsAnalytics.recordEvent('npmToolExecution', { + npmtsAnalytics + .recordEvent('npmToolExecution', { executionMode: (yield NpmtsConfig.configPromise).mode, tsOptions: (yield NpmtsConfig.configPromise).tsOptions, watch: (yield NpmtsConfig.configPromise).watch, coverageTreshold: (yield NpmtsConfig.configPromise).coverageTreshold - }).catch(err => { + }) + .catch(err => { plugins.beautylog.warn('Lossless Analytics API not available...'); }); })); @@ -50,21 +52,24 @@ exports.run = () => __awaiter(this, void 0, void 0, function* () { yield plugins.smartupdate.standardHandler.check('npmts', npmtsProjectInfo.version, 'http://gitzone.gitlab.io/npmts/changelog.html'); plugins.beautylog.log('---------------------------------------------'); let npmtsCli = new plugins.smartcli.Smartcli(); - npmtsCli.standardTask() - .then((argvArg) => { + npmtsCli + .standardTask() + .then(argvArg => { plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version); return NpmtsConfig.run(argvArg); }) .then((configArg) => { let done = q.defer(); plugins.beautylog.ora.start('loading additional modules...'); - NpmtsMods.modCompile.load() - .then((modCompile) => { + NpmtsMods.modCompile + .load() + .then(modCompile => { return modCompile.run(configArg); }) .then(configArg => { let done = q.defer(); - NpmtsMods.modDocs.load() + NpmtsMods.modDocs + .load() .then(modDocs => { return modDocs.run(configArg); }) @@ -75,7 +80,8 @@ exports.run = () => __awaiter(this, void 0, void 0, function* () { }) .then(configArg => { let done = q.defer(); - NpmtsMods.modTest.load() + NpmtsMods.modTest + .load() .then(modTest => { return modTest.run(configArg); }) @@ -88,9 +94,11 @@ exports.run = () => __awaiter(this, void 0, void 0, function* () { .then(NpmtsShip.run); return done.promise; }) - .catch((err) => { if (err instanceof Error) { - console.log(err); - } }); + .catch(err => { + if (err instanceof Error) { + console.log(err); + } + }); npmtsCli.addVersion(npmtsProjectInfo.version); npmtsCli.startParse(); return yield done.promise; diff --git a/dist/npmts.watch.js b/dist/npmts.watch.js index e07e75d..c7ff64e 100644 --- a/dist/npmts.watch.js +++ b/dist/npmts.watch.js @@ -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(); diff --git a/docs/changelog.md b/docs/changelog.md index b4d863d..73e74f4 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -1,9 +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 -``` \ No newline at end of file +``` diff --git a/docs/config.md b/docs/config.md index ea39824..e4422d1 100644 --- a/docs/config.md +++ b/docs/config.md @@ -1,58 +1,65 @@ --- 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. + +> Note: When you are using `"mode":"default"` it'll cause npmts to override any other settings you may have made except for tsOptions (ES target etc.) +> with default behaviour. ```json { - "npmts":{ - "mode":"default" + "npmts": { + "mode": "default" } } ``` **Custom settings** + ```json { - "mode":"custom", - "test":true, - "npmts":{ - "ts":{ - "./customdir/*.ts":"./" + "mode": "custom", + "test": true, + "npmts": { + "ts": { + "./customdir/*.ts": "./" }, - "tsOptions":{ - "declaration":false, - "target":"ES6" + "tsOptions": { + "declaration": false, + "target": "ES6" }, - "cli":true + "cli": true } } ``` -| key | default value | description | -| --- | --- | --- | -| `"mode"` | `"default"` | "default" will do default stuff and override , "custom" only does what you specify, "merge" will merge default options with whatever you specify on your own | -| `"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. | -| `"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 | +| key | default value | description | +| -------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `"mode"` | `"default"` | "default" will do default stuff and override , "custom" only does what you specify, "merge" will merge default options with whatever you specify on your own | +| `"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. | +| `"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. @@ -66,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. \ No newline at end of file +thanks to autogenerated source maps. diff --git a/docs/default.md b/docs/default.md index 360ed52..663a34d 100644 --- a/docs/default.md +++ b/docs/default.md @@ -1,11 +1,13 @@ --- 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)) -1. **Clean:** Clean up from any previous builds (old js files) -1. **Check:** Check project for typings declaration in package.json, unused dependencies and missing dependencies -1. **Transpile:** Transpile TypeScript with **inline sourcemaps** and **declaration files** to ES target -1. **Test:** transpile TypeScript of module to ES5 for tests (so it can be instrumentalized) and pipe it to tapbuffer. All this happens in memory. \ No newline at end of file +1. **Config:** Check config in ./npmextra.json (Check out [npmextra](https://www.npmjs.com/package/npmextra)) +1. **Clean:** Clean up from any previous builds (old js files) +1. **Check:** Check project for typings declaration in package.json, unused dependencies and missing dependencies +1. **Transpile:** Transpile TypeScript with **inline sourcemaps** and **declaration files** to ES target +1. **Test:** transpile TypeScript of module to ES5 for tests (so it can be instrumentalized) and pipe it to tapbuffer. All this happens in memory. diff --git a/docs/examples.md b/docs/examples.md index 9a23ff0..7e0fe5e 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -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. @@ -18,4 +20,4 @@ Module Name | Description * Use [npmts-g](https://www.npmjs.com/package/npmts-g) to use globally installed npmts and install npmts locally if no global npmts is available. * Use [npmpage](https://www.npmjs.com/package/npmpage) to create a webpage from coverage reports and TypeDoc for the module * Use [hosttoday/ht-docker-node:npmci](https://hub.docker.com/r/hosttoday/ht-docker-node/) for speedy CI builds -* Use [npmdocker](https://www.npmjs.com/package/npmdocker) for running tests consistently with docker. \ No newline at end of file +* Use [npmdocker](https://www.npmjs.com/package/npmdocker) for running tests consistently with docker. diff --git a/docs/getstarted.md b/docs/getstarted.md index 8295428..ddcf22a 100644 --- a/docs/getstarted.md +++ b/docs/getstarted.md @@ -2,7 +2,9 @@ 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 @@ -15,7 +17,7 @@ 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. +It'll proovide awesome scaffolding for new npmts maintained modules and also updates them later on. ```sh npm install -g gitzone # install with npm diff --git a/docs/index.md b/docs/index.md index 1d20749..5b2dcc1 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2,16 +2,20 @@ name: Index description: best practice npm TypeScript modules --- + # npmts + 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) @@ -23,17 +27,19 @@ best practice npm TypeScript modules [![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/) ## 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 - -1. check your dependencies and package.json (unused, missing, updates, security) -1. transpile your code with tsc, -1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes) -1. create coverage with istanbul (supports tracing of the originating TypeScript) + +1. check your dependencies and package.json (unused, missing, updates, security) +1. transpile your code with tsc, +1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes) +1. create coverage with istanbul (supports tracing of the originating TypeScript) For more information on how tests are run check out the [tapbuffer module](https://www.npmjs.com/package/tapbuffer). @@ -41,6 +47,6 @@ This works on your machine and in CI. There is a prebuild docker image available [hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/) > MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh) -| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html) +> | By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy.html) [![repo-footer](https://gitzone.gitlab.io/assets/repo-footer.svg)](https:/git.zone) diff --git a/docs/install.md b/docs/install.md index 198d35b..272e9c3 100644 --- a/docs/install.md +++ b/docs/install.md @@ -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 @@ -15,4 +16,4 @@ Then add it to your package.json's script section to trigger a build: "scripts": { "test": "(npmts)" } -``` \ No newline at end of file +``` diff --git a/docs/structure.md b/docs/structure.md index 53d46b0..a2c3d05 100644 --- a/docs/structure.md +++ b/docs/structure.md @@ -2,6 +2,7 @@ name: npmts project structure description: how npmts projects are structured --- + # npmts - Project Structure **locally** @@ -12,7 +13,7 @@ projectroot |- 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 +|- ts/ # contains the source TypeScript files - git | |- .gitignore # the normal gitignore file |- .gitlab-ci.yml # the gitlab ci yml file diff --git a/npmextra.json b/npmextra.json new file mode 100644 index 0000000..803b346 --- /dev/null +++ b/npmextra.json @@ -0,0 +1,5 @@ +{ + "npmci": { + "npmAccessLevell": "public" + } +} \ No newline at end of file diff --git a/package.json b/package.json index f39f255..a09a49c 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "npmts", + "name": "@gitzone/npmts", "version": "8.0.27", "description": "best practice npm TypeScript modules", "main": "dist/index.js", diff --git a/readme.md b/readme.md index 502d030..818f9b8 100644 --- a/readme.md +++ b/readme.md @@ -1,35 +1,40 @@ # npmts + 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 -1. check your dependencies and package.json (unused, missing, updates, security) -1. transpile your code with tsc, -1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes) -1. create coverage with istanbul (supports tracing of the originating TypeScript) +1. check your dependencies and package.json (unused, missing, updates, security) +1. transpile your code with tsc, +1. test your code with tap (supports the fancy stuff like Promises, Generators, async/await, sourcemaps, parallel test execution in child processes) +1. create coverage with istanbul (supports tracing of the originating TypeScript) For more information on how tests are run check out the [tapbuffer module](https://www.npmjs.com/package/tapbuffer). @@ -39,11 +44,12 @@ This works on your machine and in CI. There is a prebuild docker image available [hosttoday/ht-docker-node:npmts on Dockerhub](https://hub.docker.com/r/hosttoday/ht-docker-node/) ## 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 | **©** [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) diff --git a/ts/index.ts b/ts/index.ts index b90d9ca..084f8d6 100644 --- a/ts/index.ts +++ b/ts/index.ts @@ -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(); +}); diff --git a/ts/mod_compile/index.ts b/ts/mod_compile/index.ts index 52a27f1..fd1548e 100644 --- a/ts/mod_compile/index.ts +++ b/ts/mod_compile/index.ts @@ -2,26 +2,26 @@ * This module compiles the module's TypeScript files * Note: Test files are only compiled in memory * -------------------------------------------- */ -import * as q from 'smartq' +import * as q from 'smartq'; -import { INpmtsConfig } from '../npmts.config' +import { INpmtsConfig } from '../npmts.config'; -import * as plugins from './mod.plugins' +import * as plugins from './mod.plugins'; -import * as NpmtsAssets from './mod.assets' -import * as NpmtsCheck from './mod.check' -import * as NpmtsClean from './mod.clean' -import * as NpmtsCompile from './mod.compile' +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 { - let done = q.defer() - plugins.beautylog.ora.text('starting TypeScript Compilation') +export let run = function(configArg: INpmtsConfig): Promise { + let done = q.defer(); + 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 -} + .then(function() { + done.resolve(configArg); + }); + return done.promise; +}; diff --git a/ts/mod_compile/mod.assets.ts b/ts/mod_compile/mod.assets.ts index 6d40330..cd26d63 100644 --- a/ts/mod_compile/mod.assets.ts +++ b/ts/mod_compile/mod.assets.ts @@ -1,24 +1,26 @@ -import * as q from 'smartq' +import * as q from 'smartq'; -import paths = require('../npmts.paths') +import paths = require('../npmts.paths'); -import plugins = require('./mod.plugins') -import { projectInfo } from '../mod_compile/mod.check' +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') +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) + 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) + plugins.beautylog.ok('No additional assets required!'); + done.resolve(config); } - return done.promise -} + return done.promise; +}; diff --git a/ts/mod_compile/mod.check.ts b/ts/mod_compile/mod.check.ts index 32b1e1f..f299603 100644 --- a/ts/mod_compile/mod.check.ts +++ b/ts/mod_compile/mod.check.ts @@ -1,132 +1,139 @@ -import * as q from 'smartq' -import { ProjectinfoNpm } from 'projectinfo' +import * as q from 'smartq'; +import { ProjectinfoNpm } from 'projectinfo'; // interfaces -import { INpmtsConfig } from '../npmts.config' +import { INpmtsConfig } from '../npmts.config'; -import * as paths from '../npmts.paths' +import * as paths from '../npmts.paths'; -import * as plugins from './mod.plugins' +import * as plugins from './mod.plugins'; -export let projectInfo: ProjectinfoNpm +export let projectInfo: ProjectinfoNpm; let checkProjectTypings = (configArg: INpmtsConfig) => { - let done = q.defer() - plugins.beautylog.ora.text('Check Module: Check Project Typings...') - projectInfo = new ProjectinfoNpm(paths.cwd) + 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) + plugins.beautylog.error(`please add typings field to package.json`); + process.exit(1); } - done.resolve(configArg) - return done.promise -} + done.resolve(configArg); + return done.promise; +}; const depcheckOptions = { ignoreBinPackage: false, // ignore the packages with bin entry - parsers: { // the target parsers + parsers: { + // the target parsers '*.ts': plugins.depcheck.parser.typescript }, - detectors: [ // the target detectors + detectors: [ + // the target detectors plugins.depcheck.detector.requireCallExpression, plugins.depcheck.detector.importDeclaration ], - specials: [ // the target special parsers + specials: [ + // the target special parsers plugins.depcheck.special.eslint, plugins.depcheck.special.webpack ] -} +}; let checkDependencies = (configArg: INpmtsConfig) => { - let done = q.defer() - plugins.beautylog.ora.text('Check Module: Check Dependencies...') + 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 + ignoreDirs: [ + // folder with these names will be ignored 'test', 'dist', 'bower_components' ], - ignoreMatches: [ // ignore dependencies that matches these globs + 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}"`) + plugins.beautylog.warn(`Watch out: unused dependency "${item}"`); } for (let item in unused.missing) { - plugins.beautylog.error(`missing dependency "${item}" in package.json`) + plugins.beautylog.error(`missing dependency "${item}" in package.json`); } if (unused.missing.length > 0) { - plugins.beautylog.info('exiting due to missing dependencies in package.json') - process.exit(1) + 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}`) + 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}`) + plugins.beautylog.warn(`Watch out: could not parse directory ${item}`); } - done.resolve(configArg) - }) - return done.promise -} + done.resolve(configArg); + }); + return done.promise; +}; let checkDevDependencies = (configArg: INpmtsConfig) => { - let done = q.defer() - plugins.beautylog.ora.text('Check Module: Check devDependencies...') + 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 + ignoreDirs: [ + // folder with these names will be ignored 'ts', 'dist', 'bower_components' ], - ignoreMatches: [ // ignore dependencies that matches these globs + 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}`) + plugins.beautylog.log(`unused devDependency ${item}`); } for (let item in unused.missing) { - plugins.beautylog.error(`missing devDependency ${item}`) + 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) + 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}`) + 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}`) + plugins.beautylog.warn(`Watch out: could not parse directory ${item}`); } - done.resolve(configArg) - }) - return done.promise -} + done.resolve(configArg); + }); + return done.promise; +}; let checkNodeVersion = (configArg: INpmtsConfig) => { - let done = q.defer() - plugins.beautylog.ora.text('checking node version') - done.resolve(configArg) - return done.promise -} + let done = q.defer(); + 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: ...') + 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 + 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 + configArg = await checkProjectTypings(configArg); + return configArg; } -} +}; diff --git a/ts/mod_compile/mod.clean.ts b/ts/mod_compile/mod.clean.ts index b24f650..17e2587 100644 --- a/ts/mod_compile/mod.clean.ts +++ b/ts/mod_compile/mod.clean.ts @@ -1,32 +1,32 @@ -import * as q from 'smartq' -import paths = require('../npmts.paths') +import * as q from 'smartq'; +import paths = require('../npmts.paths'); -import plugins = require('./mod.plugins') +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) -} +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) -} +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() +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 -} + .then(function() { + plugins.beautylog.ok('Cleaned up from previous builds!'); + done.resolve(configArg); + }); + return done.promise; +}; diff --git a/ts/mod_compile/mod.compile.ts b/ts/mod_compile/mod.compile.ts index abaf402..e251412 100644 --- a/ts/mod_compile/mod.compile.ts +++ b/ts/mod_compile/mod.compile.ts @@ -1,17 +1,21 @@ -import * as q from 'smartq' +import * as q from 'smartq'; -import * as paths from '../npmts.paths' +import * as paths from '../npmts.paths'; -import * as plugins from './mod.plugins' +import * as plugins from './mod.plugins'; -export let run = function (configArg) { - let done = q.defer() - let config = configArg - plugins.beautylog.ora.text('now compiling ' + 'TypeScript') - plugins.tsn.compileGlobStringObject(config.ts, config.tsOptions, paths.cwd) +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 -} + plugins.beautylog.ok(`compiled the module's TypeScript!`); + done.resolve(config); + }) + .catch(err => { + console.log(err); + }); + return done.promise; +}; diff --git a/ts/mod_compile/mod.plugins.ts b/ts/mod_compile/mod.plugins.ts index a31a28e..34515ed 100644 --- a/ts/mod_compile/mod.plugins.ts +++ b/ts/mod_compile/mod.plugins.ts @@ -1,11 +1,7 @@ -export * from '../npmts.plugins' +export * from '../npmts.plugins'; -import * as tsn from 'tsn' -import * as smartchok from 'smartchok' -import * as smartstream from 'smartstream' +import * as tsn from 'tsn'; +import * as smartchok from 'smartchok'; +import * as smartstream from 'smartstream'; -export { - tsn, - smartchok, - smartstream -} +export { tsn, smartchok, smartstream }; diff --git a/ts/mod_docs/index.ts b/ts/mod_docs/index.ts index 69c2dc7..4e88cb3 100644 --- a/ts/mod_docs/index.ts +++ b/ts/mod_docs/index.ts @@ -1,15 +1,15 @@ /* ------------------------------------------ * This module creates TypeScript documentation * -------------------------------------------- */ -import * as q from 'smartq' +import * as q from 'smartq'; -import * as paths from '../npmts.paths' -import { INpmtsConfig } from '../npmts.config' +import * as paths from '../npmts.paths'; +import { INpmtsConfig } from '../npmts.config'; -import * as plugins from './mod.plugins' +import * as plugins from './mod.plugins'; -export let run = function (configArg: INpmtsConfig) { - let done = q.defer() - done.resolve(configArg) - return done.promise -} +export let run = function(configArg: INpmtsConfig) { + let done = q.defer(); + done.resolve(configArg); + return done.promise; +}; diff --git a/ts/mod_docs/mod.plugins.ts b/ts/mod_docs/mod.plugins.ts index c128845..85e3c5e 100644 --- a/ts/mod_docs/mod.plugins.ts +++ b/ts/mod_docs/mod.plugins.ts @@ -1,2 +1 @@ -export * from '../npmts.plugins' - +export * from '../npmts.plugins'; diff --git a/ts/mod_test/index.ts b/ts/mod_test/index.ts index 24350a1..2366303 100644 --- a/ts/mod_test/index.ts +++ b/ts/mod_test/index.ts @@ -1,136 +1,141 @@ /* ------------------------------------------ * This module tests the compiled TypeScript files * -------------------------------------------- */ -import plugins = require('./mod.plugins') -import paths = require('../npmts.paths') +import plugins = require('./mod.plugins'); +import paths = require('../npmts.paths'); -import * as q from 'smartq' +import * as q from 'smartq'; // interfaces -import { INpmtsConfig } from '../npmts.config' -import { Smartfile } from 'smartfile' +import { INpmtsConfig } from '../npmts.config'; +import { Smartfile } from 'smartfile'; let testTypeScriptConfig = { target: 'ES5', emitDecoratorMetadata: true, experimentalDecorators: true, - lib: [ - 'DOM', - 'ESNext' - ] -} + lib: ['DOM', 'ESNext'] +}; /** * runs mocha * @returns INpmtsConfig */ -let tap = function (configArg: INpmtsConfig) { - let done = q.defer() +let tap = function(configArg: INpmtsConfig) { + let done = q.defer(); /** * the TabBuffer for npmts */ - let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer() + let npmtsTapBuffer = new plugins.tapbuffer.TabBuffer(); - npmtsTapBuffer.setConfig(configArg.testConfig) + npmtsTapBuffer.setConfig(configArg.testConfig); /** * handle the testable files */ let testableFilesSmartstream = new plugins.smartstream.Smartstream([ - plugins.smartgulp.src([ plugins.path.join(paths.cwd, './ts/**/*.ts') ]), + plugins.smartgulp.src([plugins.path.join(paths.cwd, './ts/**/*.ts')]), plugins.gulpSourcemaps.init(), plugins.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.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( + 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) + configArg.runData.coverageLcovInfo = await npmtsTapBuffer.runTests(); + done.resolve(configArg); + }, + err => { + plugins.beautylog.error('Tests failed!'); + console.log(err); if (configArg.watch) { - done.resolve(configArg) + done.resolve(configArg); } else { - process.exit(1) + process.exit(1); } - }) + } + ); - return done.promise -} + return done.promise; +}; let handleCoverageData = async (configArg: INpmtsConfig) => { - let coverageResult: number = 0 // the coverage in percent + let coverageResult: number = 0; // the coverage in percent if (configArg.runData.coverageLcovInfo) { 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?') + 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()}%` - ) + `${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) } + `${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 -} + return configArg; +}; -export let run = function (configArg: INpmtsConfig) { - let done = q.defer() - let config = configArg +export let run = function(configArg: INpmtsConfig) { + let done = q.defer(); + let config = configArg; if (config.test === true) { - plugins.beautylog.ora.text('now starting tests') - plugins.beautylog.ora.end() - plugins.beautylog.log('ready for tapbuffer:') + 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) }) + done.resolve(config); + }) + .catch(err => { + console.log(err); + }); } else { tap(config) .then(() => { - done.resolve(config) - }).catch(err => { console.log(err) }) + done.resolve(config); + }) + .catch(err => { + console.log(err); + }); } - } else { - plugins.beautylog.ora.end() - done.resolve(config) + plugins.beautylog.ora.end(); + done.resolve(config); } - return done.promise -} + return done.promise; +}; diff --git a/ts/mod_test/mod.plugins.ts b/ts/mod_test/mod.plugins.ts index 2e63624..7b280b7 100644 --- a/ts/mod_test/mod.plugins.ts +++ b/ts/mod_test/mod.plugins.ts @@ -1,17 +1,10 @@ -export * from '../npmts.plugins' +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' +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 -} +export { gulpFunction, gulpSourcemaps, gulpTypeScript, smartcov, smartgulp, tapbuffer }; diff --git a/ts/npmts.cli.ts b/ts/npmts.cli.ts index c70a04c..beb452a 100644 --- a/ts/npmts.cli.ts +++ b/ts/npmts.cli.ts @@ -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 @@ -22,70 +22,84 @@ let npmtsAnalytics = new plugins.smartanalytics.Analytics({ apiEndPoint: 'https://pubapi.lossless.one/analytics', projectId: 'gitzone', appName: 'npmts' -}) +}); 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 - }).catch(err => { - plugins.beautylog.warn('Lossless Analytics API not available...') - }) -}) + npmtsAnalytics + .recordEvent('npmToolExecution', { + executionMode: (await NpmtsConfig.configPromise).mode, + tsOptions: (await NpmtsConfig.configPromise).tsOptions, + watch: (await NpmtsConfig.configPromise).watch, + coverageTreshold: (await NpmtsConfig.configPromise).coverageTreshold + }) + .catch(err => { + plugins.beautylog.warn('Lossless Analytics API not available...'); + }); +}); export let run = async () => { - let done = q.defer() + let done = q.defer(); - plugins.beautylog.figletSync('NPMTS') - let npmtsProjectInfo = new plugins.projectinfo.ProjectinfoNpm(paths.npmtsPackageRoot) + 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() - npmtsCli.standardTask() - .then((argvArg) => { - plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version) - return NpmtsConfig.run(argvArg) + await plugins.smartupdate.standardHandler.check( + 'npmts', + npmtsProjectInfo.version, + 'http://gitzone.gitlab.io/npmts/changelog.html' + ); + plugins.beautylog.log('---------------------------------------------'); + let npmtsCli = new plugins.smartcli.Smartcli(); + npmtsCli + .standardTask() + .then(argvArg => { + plugins.beautylog.info('npmts version: ' + npmtsProjectInfo.version); + return NpmtsConfig.run(argvArg); }) .then((configArg: NpmtsConfig.INpmtsConfig) => { - let done = q.defer() - plugins.beautylog.ora.start('loading additional modules...') - NpmtsMods.modCompile.load() - .then((modCompile) => { - return modCompile.run(configArg) + let done = q.defer(); + plugins.beautylog.ora.start('loading additional modules...'); + NpmtsMods.modCompile + .load() + .then(modCompile => { + return modCompile.run(configArg); }) .then(configArg => { - let done = q.defer() - NpmtsMods.modDocs.load() + let done = q.defer(); + NpmtsMods.modDocs + .load() .then(modDocs => { - return modDocs.run(configArg) + return modDocs.run(configArg); }) .then(configArg => { - done.resolve(configArg) - }) - return done.promise + done.resolve(configArg); + }); + return done.promise; }) .then(configArg => { - let done = q.defer() - NpmtsMods.modTest.load() + let done = q.defer(); + NpmtsMods.modTest + .load() .then(modTest => { - return modTest.run(configArg) + 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 + return done.promise; }) - .catch((err) => { if (err instanceof Error) { console.log(err) } }) - npmtsCli.addVersion(npmtsProjectInfo.version) - npmtsCli.startParse() - return await done.promise -} + .catch(err => { + if (err instanceof Error) { + console.log(err); + } + }); + npmtsCli.addVersion(npmtsProjectInfo.version); + npmtsCli.startParse(); + return await done.promise; +}; diff --git a/ts/npmts.config.ts b/ts/npmts.config.ts index d9a6e6b..f411e29 100644 --- a/ts/npmts.config.ts +++ b/ts/npmts.config.ts @@ -1,10 +1,10 @@ -import plugins = require('./npmts.plugins') -import paths = require('./npmts.paths') +import plugins = require('./npmts.plugins'); +import paths = require('./npmts.paths'); -import * as smartq from 'smartq' +import * as smartq from 'smartq'; // interfaces -import { ITapbufferConfig } from 'tapbuffer' +import { ITapbufferConfig } from 'tapbuffer'; /** * specifies the different modes available @@ -12,27 +12,27 @@ import { ITapbufferConfig } from 'tapbuffer' * 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 - coverageTreshold: number - checkDependencies: boolean - mode: npmtsMode - test: boolean - testTs: any - testConfig: ITapbufferConfig - 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 = smartq.defer() +export let run = function(argvArg) { + let done = smartq.defer(); let defaultConfig: INpmtsConfig = { argv: undefined, coverageTreshold: 70, @@ -48,66 +48,63 @@ export let run = function (argvArg) { 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( - 'npmts', - defaultConfig - ) + let localNpmextra = new plugins.npmextra.Npmextra(paths.cwd); + let config: INpmtsConfig = localNpmextra.dataFor('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.testConfig.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) - configDeferred.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() -export let configPromise = configDeferred.promise +let configDeferred = smartq.defer(); +export let configPromise = configDeferred.promise; diff --git a/ts/npmts.mods.ts b/ts/npmts.mods.ts index 9cb7dc6..04f239d 100644 --- a/ts/npmts.mods.ts +++ b/ts/npmts.mods.ts @@ -1,11 +1,11 @@ -import * as plugins from './npmts.plugins' +import * as plugins from './npmts.plugins'; -import { LazyModule } from 'smartsystem' +import { LazyModule } from 'smartsystem'; -import * as _modCompile from './mod_compile/index' -import * as _modDocs from './mod_docs/index' -import * as _modTest from './mod_test/index' +import * as _modCompile from './mod_compile/index'; +import * as _modDocs from './mod_docs/index'; +import * as _modTest from './mod_test/index'; -export let modCompile = new LazyModule('./mod_compile/index',__dirname) -export let modDocs = new LazyModule('./mod_docs/index',__dirname) -export let modTest = new LazyModule('./mod_test/index',__dirname) +export let modCompile = new LazyModule('./mod_compile/index', __dirname); +export let modDocs = new LazyModule('./mod_docs/index', __dirname); +export let modTest = new LazyModule('./mod_test/index', __dirname); diff --git a/ts/npmts.paths.ts b/ts/npmts.paths.ts index d38fa8c..cd7423f 100644 --- a/ts/npmts.paths.ts +++ b/ts/npmts.paths.ts @@ -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'); diff --git a/ts/npmts.plugins.ts b/ts/npmts.plugins.ts index fab63d5..7a46bc1 100644 --- a/ts/npmts.plugins.ts +++ b/ts/npmts.plugins.ts @@ -1,36 +1,36 @@ -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 smartupdate from 'smartupdate' -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 '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, - smartupdate, - through2 -} + beautylog, + depcheck, + lodash, + npmextra, + projectinfo, + path, + smartanalytics, + smartcli, + smarterror, + smartfile, + smartpath, + smartstream, + smartstring, + smartsystem, + smartupdate, + through2 +}; diff --git a/ts/npmts.ship.ts b/ts/npmts.ship.ts index c467e02..52898cf 100644 --- a/ts/npmts.ship.ts +++ b/ts/npmts.ship.ts @@ -1,30 +1,31 @@ -import * as q from 'smartq' +import * as q from 'smartq'; -import * as plugins from './npmts.plugins' +import * as plugins from './npmts.plugins'; -import { INpmtsConfig } from './npmts.config' +import { INpmtsConfig } from './npmts.config'; export let run = (configArg: INpmtsConfig) => { - let done = q.defer() - let shipString = '' + - '\n' + - '\n' + - ' # # ( )\n' + - ' ___#_#___|__\n' + - ' _ |____________| _\n' + - ' _=====| | | | | |==== _\n' + - ' =====| |.---------------------------. | |====\n' + - " <--------------------' . . . . . . . . '--------------/\n" + - ' \\ /\n' + - ' \\___________________________________________________________/\n' + - ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' + - ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' + - ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' - if (process.env.CI) { - console.log(shipString) - plugins.beautylog.success('READY TO SHIP!') - } else { - plugins.beautylog.success('Done!') - } - done.resolve(configArg) -} + let done = q.defer(); + let shipString = + '' + + '\n' + + '\n' + + ' # # ( )\n' + + ' ___#_#___|__\n' + + ' _ |____________| _\n' + + ' _=====| | | | | |==== _\n' + + ' =====| |.---------------------------. | |====\n' + + " <--------------------' . . . . . . . . '--------------/\n" + + ' \\ /\n' + + ' \\___________________________________________________________/\n' + + ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' + + ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n' + + ' wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n'; + if (process.env.CI) { + console.log(shipString); + plugins.beautylog.success('READY TO SHIP!'); + } else { + plugins.beautylog.success('Done!'); + } + done.resolve(configArg); +}; diff --git a/ts/npmts.watch.ts b/ts/npmts.watch.ts index 81b6c52..2220e29 100644 --- a/ts/npmts.watch.ts +++ b/ts/npmts.watch.ts @@ -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) + plugins.beautylog.info('not watching'); + done.resolve(configArg); } - return done.promise -} + return done.promise; +};