From 67860ba213a389eb1d5f1961d358a422ba81bc17 Mon Sep 17 00:00:00 2001 From: Fabio Silva <37403306+fabiogomessilva@users.noreply.github.com> Date: Tue, 1 May 2018 19:58:08 -0300 Subject: [PATCH 1/2] feat: add opencensus-core package (#2) * PoD(Proof Of Design) - v0 * Added basic structure of tests * finished test-trace * added new tests in test-trace * Add unit tests for span.ts * finished test-tracemanager * Add initial Stackdriver exporter * added test-tracemanager * finished interfaces creation * Fix end trace * Add license on the unit tests * Changing class name TraceManger to Tracer, creating class Tracing. Moving class files Span.ts, Trace.ts and Tracer.ts to trace/model * Changing class name TraceManger to Tracer, creating class Tracing. Moving class files Span.ts, Trace.ts and Tracer.ts to trace/model * Send real data to Stackdriver and create registerExporter method * traceId logic update * Fix code style. * Make spans in a trace private * Add start methods for Stackdriver and Zipkin * added basic struct * Refactoring: rename class and file Trace to RootSpan, add TraceConfig interface, add TraceContext interface * More refactorings, add endspan event listener, correct bug in zipkin exporter and others * Fix code style * Adds patching for http GET requests * Buffer refactoring * Add sampler * Change startRootSpan to deal with context * Change startRootSpan to deal with context * Add wrapEmitter to req and res, Improving debug mensages * Fixed zipkin url configuration * Move sampler to options * Add a README.md for the OpenCensus Node example * chord: merge commit * Adapted tests for dev * Update example README.md * Add design doc * Creates Traces with sent context * Move sampler.ts from model to config * Ajusted import sampler * Revert "Ajusted import sampler" * Fix buffer and exporters local bugs * Fixed trace tests * Removing unnecessary import * Refactor the Sampler class * Propagate trace context over B3 format * Add examples for automatic tracing on Stackdriver and Zipkin * WIP: Example of manual tracing on Zipkin * Remove unused variables * Move easy-notes instrumentation do it's own directory * Changes http span naming method * Enable propagation to work with non sampled spans * Add manual examples for Stackdriver and Zipkin and add license on files * Change getContext to SpanBaseModel * WIP: Refactor examples for both exporters * Update readme * refactor: remove some unwanted dependencies from Tracer * refactor: apply code guidelines rules to sampler.ts file * refactor: typescript doc rewrited * refactor: apply code guidelines rules to buffer.ts file * refactor: apply code guidelines rules to plugingtypes.ts file * refactor: modified variable traceId for private * refactor: apply code guidelines rules to stackdriver.ts file * docs: document interface todo * refactor: apply code guidelines rules to test-rootspan.ts file * refactor: apply code guidelines rules to test-span.ts file * refactor: apply code guidelines rules to rootspan.ts file * refactor: apply code guidelines rules to span.ts * refactor: apply code guidelines rules to clock.ts file * refactor: create new module structure * refactor: create interfaces for model classes * refactor: update interface types * refactor: type, classes overall refactoring * fix: fixed span tests * test: added GTS scripts * fix: fixed gts issues * refactor: update buffer and exporters * refactor: modify sampler config to use optionsTracing * fix: fixed typescript code style * test: created rootspan test * refactor: apply code guidelines rules to util.ts * feat: added spans optional parameters * feat: more general config interface * test: adding unit test to buffer.ts * fix: some tests and tslint issues * doc: added readme.md files * doc: update README.md * test: created new tests for trace * feat: Add console logger * refactor: add jsdoc to core package * test: created tests for spanbasemodel * feat: update console log * test: add unit test to consolelogger.ts * docs: add jsdoc to consolelogger * test: add unit tests for consolelog-exporter * test: created testes for pluginloader * refactor: add logger to ather classes * test: add sampler test * fix: minor tslint issues * refactor: rework after review * fix: make buffer queue public * refactor: add index-types.ts * fix: export logger to others packages * refactor: remove Impl classes suffixes and use module namespace for types * refactor: update and standardize use of types module namespace * style: update Copyright notice * refactor: rename class SpanBaseModel to SpanBase and file span-base-model to span-base * doc: remove doc files unrelated to core * doc: update tracer jsdoc for wrap and wraEmitter * refactor: changes after PR review * refactor: rework according to review follow up * refactor: fix some dependencies, file copyright and typos --- .gitignore | 20 + .npmignore | 4 + AUTHORS | 7 +- README.md | 14 +- .../design/opencensus.nodejs.first.design.pdf | Bin 0 -> 253990 bytes lerna.json | 7 + package-lock.json | 2917 ++++++++++++ package.json | 42 + packages/opencensus-core/.npmignore | 4 + packages/opencensus-core/AUTHORS | 6 + packages/opencensus-core/LICENSE | 202 + packages/opencensus-core/README.md | 16 + packages/opencensus-core/package-lock.json | 4094 +++++++++++++++++ packages/opencensus-core/package.json | 65 + packages/opencensus-core/scripts/compile.ts | 22 + .../opencensus-core/scripts/tsconfig.json | 10 + .../src/common/console-logger.ts | 124 + packages/opencensus-core/src/common/types.ts | 30 + .../src/exporters/console-exporter.ts | 73 + .../src/exporters/exporter-buffer.ts | 124 + .../opencensus-core/src/exporters/types.ts | 31 + packages/opencensus-core/src/index-classes.ts | 32 + packages/opencensus-core/src/index-types.ts | 24 + packages/opencensus-core/src/index.ts | 22 + .../opencensus-core/src/internal/clock.ts | 77 + .../opencensus-core/src/internal/cls-ah.ts | 148 + packages/opencensus-core/src/internal/cls.ts | 59 + packages/opencensus-core/src/internal/util.ts | 40 + .../opencensus-core/src/trace/config/types.ts | 72 + .../src/trace/instrumentation/base-plugin.ts | 69 + .../src/trace/instrumentation/types.ts | 41 + .../src/trace/model/root-span.ts | 122 + .../src/trace/model/span-base.ts | 218 + .../opencensus-core/src/trace/model/span.ts | 73 + .../opencensus-core/src/trace/model/tracer.ts | 223 + .../opencensus-core/src/trace/model/types.ts | 277 ++ .../src/trace/sampler/sampler.ts | 90 + .../src/trace/sampler/types.ts | 55 + packages/opencensus-core/src/trace/types.ts | 47 + .../test/test-console-exporter.ts | 100 + .../test/test-console-logger.ts | 154 + .../test/test-exporter-buffer.ts | 117 + .../opencensus-core/test/test-root-span.ts | 256 ++ packages/opencensus-core/test/test-sampler.ts | 87 + packages/opencensus-core/test/test-span.ts | 262 ++ packages/opencensus-core/test/test-tracer.ts | 287 ++ packages/opencensus-core/tsconfig.json | 24 + 47 files changed, 10782 insertions(+), 6 deletions(-) create mode 100644 .npmignore create mode 100644 docs/design/opencensus.nodejs.first.design.pdf create mode 100644 lerna.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/opencensus-core/.npmignore create mode 100644 packages/opencensus-core/AUTHORS create mode 100644 packages/opencensus-core/LICENSE create mode 100644 packages/opencensus-core/README.md create mode 100644 packages/opencensus-core/package-lock.json create mode 100644 packages/opencensus-core/package.json create mode 100644 packages/opencensus-core/scripts/compile.ts create mode 100644 packages/opencensus-core/scripts/tsconfig.json create mode 100644 packages/opencensus-core/src/common/console-logger.ts create mode 100644 packages/opencensus-core/src/common/types.ts create mode 100644 packages/opencensus-core/src/exporters/console-exporter.ts create mode 100644 packages/opencensus-core/src/exporters/exporter-buffer.ts create mode 100644 packages/opencensus-core/src/exporters/types.ts create mode 100644 packages/opencensus-core/src/index-classes.ts create mode 100644 packages/opencensus-core/src/index-types.ts create mode 100644 packages/opencensus-core/src/index.ts create mode 100644 packages/opencensus-core/src/internal/clock.ts create mode 100644 packages/opencensus-core/src/internal/cls-ah.ts create mode 100644 packages/opencensus-core/src/internal/cls.ts create mode 100644 packages/opencensus-core/src/internal/util.ts create mode 100644 packages/opencensus-core/src/trace/config/types.ts create mode 100644 packages/opencensus-core/src/trace/instrumentation/base-plugin.ts create mode 100644 packages/opencensus-core/src/trace/instrumentation/types.ts create mode 100644 packages/opencensus-core/src/trace/model/root-span.ts create mode 100644 packages/opencensus-core/src/trace/model/span-base.ts create mode 100644 packages/opencensus-core/src/trace/model/span.ts create mode 100644 packages/opencensus-core/src/trace/model/tracer.ts create mode 100644 packages/opencensus-core/src/trace/model/types.ts create mode 100644 packages/opencensus-core/src/trace/sampler/sampler.ts create mode 100644 packages/opencensus-core/src/trace/sampler/types.ts create mode 100644 packages/opencensus-core/src/trace/types.ts create mode 100644 packages/opencensus-core/test/test-console-exporter.ts create mode 100644 packages/opencensus-core/test/test-console-logger.ts create mode 100644 packages/opencensus-core/test/test-exporter-buffer.ts create mode 100644 packages/opencensus-core/test/test-root-span.ts create mode 100644 packages/opencensus-core/test/test-sampler.ts create mode 100644 packages/opencensus-core/test/test-span.ts create mode 100644 packages/opencensus-core/test/test-tracer.ts create mode 100644 packages/opencensus-core/tsconfig.json diff --git a/.gitignore b/.gitignore index 7b0ff1e7e..558cddceb 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,25 @@ bin # Vim .swp +#VScode +.vscode/ + # Other TAGS + +# nodejs +node_modules/ +npm-debug.log +.nyc_output/ +build/ + +#backup files +*-- +*_backup + +#log files +*.log + +#istanbul files +coverage/ + diff --git a/.npmignore b/.npmignore new file mode 100644 index 000000000..9505ba945 --- /dev/null +++ b/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/AUTHORS b/AUTHORS index e068e731e..3aa6d434a 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1 +1,6 @@ -Google Inc. \ No newline at end of file +#CESAR's team (www.cesar.org.br): +Fabio Silva +Djonathas Cardoso +Luana Martins dos Santos +Eduardo Emery +Eldrey Seolin Galindo diff --git a/README.md b/README.md index b2808a59d..1983dec59 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ -# OpenCensus - A stats collection and distributed tracing framework +# OpenCensus Core Node.js [![Gitter chat][gitter-image]][gitter-url] -OpenCensus is a toolkit for collecting application performance and behavior data. It currently -includes 3 apis: stats, tracing and tags. +OpenCensus for Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. The library is in alpha stage and the API is subject to change. -Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this -project. +Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. + +## Useful links +- For more information on OpenCensus, visit: +- To checkout the OpenCensus for Node.js, visit: +- For help or feedback on this project, join us on [gitter](https://gitter.im/census-instrumentation/Lobby) [gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg [gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge + diff --git a/docs/design/opencensus.nodejs.first.design.pdf b/docs/design/opencensus.nodejs.first.design.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c2117c5c3f2bf1f229f74d3779d4e59972a707b3 GIT binary patch literal 253990 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 JUKJh6{0ANeuf+fW literal 0 HcmV?d00001 diff --git a/lerna.json b/lerna.json new file mode 100644 index 000000000..9fef7c549 --- /dev/null +++ b/lerna.json @@ -0,0 +1,7 @@ +{ + "lerna": "2.10.1", + "packages": [ + "packages/*" + ], + "version": "0.0.0" +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..a8980391a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2917 @@ +{ + "name": "@opencensus/opencensus-base", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/node": { + "version": "9.6.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz", + "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==", + "dev": true + }, + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "ci-info": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", + "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "cmd-shim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dev": true, + "requires": { + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" + } + }, + "command-join": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/command-join/-/command-join-2.0.0.tgz", + "integrity": "sha1-Uui5hPSHLZUv8b3IuYOX0nxxRM8=", + "dev": true + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "1.0.0", + "dot-prop": "3.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "conventional-changelog": { + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.23.tgz", + "integrity": "sha512-yCPXU/OXJmxgbvTQfIKXKwKa4KQTvlO0a4T/371Raz3bdxcHIGhQtHtdrNee4Z8nGLNfe54njHDblVG2JNFyjg==", + "dev": true, + "requires": { + "conventional-changelog-angular": "1.6.6", + "conventional-changelog-atom": "0.2.8", + "conventional-changelog-codemirror": "0.3.8", + "conventional-changelog-core": "2.0.10", + "conventional-changelog-ember": "0.3.11", + "conventional-changelog-eslint": "1.0.9", + "conventional-changelog-express": "0.3.6", + "conventional-changelog-jquery": "0.1.0", + "conventional-changelog-jscs": "0.1.0", + "conventional-changelog-jshint": "0.3.8", + "conventional-changelog-preset-loader": "1.1.8" + } + }, + "conventional-changelog-angular": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", + "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-cli": { + "version": "1.3.21", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.21.tgz", + "integrity": "sha512-K9VBljxzuATZCLTVnI83PN7WdeRJRPPB5FumuLk4ES3E+m2YJvX07DRbdJlINk6C2DeAjj4ioS5JvsvJaaCRbA==", + "dev": true, + "requires": { + "add-stream": "1.0.0", + "conventional-changelog": "1.1.23", + "lodash": "4.17.5", + "meow": "4.0.0", + "tempfile": "1.1.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", + "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.10.tgz", + "integrity": "sha512-FP0NHXIbpvU+f5jk/qZdnodhFmlzKW8ENRHQIWT69oe7ffur9nFRVJZlnXnFBOzwHM9WIRbC15ZWh9HZN6t9Uw==", + "dev": true, + "requires": { + "conventional-changelog-writer": "3.0.9", + "conventional-commits-parser": "2.1.7", + "dateformat": "3.0.3", + "get-pkg-repo": "1.4.0", + "git-raw-commits": "1.3.6", + "git-remote-origin-url": "2.0.0", + "git-semver-tags": "1.3.6", + "lodash": "4.17.5", + "normalize-package-data": "2.4.0", + "q": "1.5.1", + "read-pkg": "1.1.0", + "read-pkg-up": "1.0.1", + "through2": "2.0.3" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "conventional-changelog-ember": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.11.tgz", + "integrity": "sha512-ErjPPiDmTd/WPgj2bSp+CGsLtJiv7FbdPKjZXH2Cd5P7j44Rqf0V9SIAAYFTQNoPqmvcp+sIcr/vH52WzPJUbw==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", + "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", + "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", + "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", + "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", + "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "conventional-commits-filter": "1.1.6", + "dateformat": "3.0.3", + "handlebars": "4.0.11", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.5", + "meow": "4.0.0", + "semver": "5.5.0", + "split": "1.0.1", + "through2": "2.0.3" + } + }, + "conventional-commits-filter": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "dev": true, + "requires": { + "is-subset": "0.1.1", + "modify-values": "1.0.1" + } + }, + "conventional-commits-parser": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "dev": true, + "requires": { + "JSONStream": "1.3.2", + "is-text-path": "1.0.1", + "lodash": "4.17.5", + "meow": "4.0.0", + "split2": "2.2.0", + "through2": "2.0.3", + "trim-off-newlines": "1.0.1" + } + }, + "conventional-recommended-bump": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz", + "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "conventional-commits-filter": "1.1.6", + "conventional-commits-parser": "2.1.7", + "git-raw-commits": "1.3.6", + "git-semver-tags": "1.3.6", + "meow": "3.7.0", + "object-assign": "4.1.1" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "1.2.0", + "map-obj": "1.0.1" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.4" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.21", + "tmp": "0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "meow": "3.7.0", + "normalize-package-data": "2.4.0", + "parse-github-repo-url": "1.4.1", + "through2": "2.0.3" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + } + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "dev": true, + "requires": { + "dargs": "4.1.0", + "lodash.template": "4.4.0", + "meow": "4.0.0", + "split2": "2.2.0", + "through2": "2.0.3" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "1.0.0", + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "git-semver-tags": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", + "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "dev": true, + "requires": { + "meow": "4.0.0", + "semver": "5.5.0" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.1", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", + "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.3.2", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.2.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-ci": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", + "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", + "dev": true, + "requires": { + "ci-info": "1.1.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "1.7.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "lerna": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-2.10.1.tgz", + "integrity": "sha512-p0Rmew8TEa/4wKDuaOYfTFx1VtNeMqjSJgjUkmIqqIdnFeEMDuL0gTY3JFRjnjfmWT9BEHaObC+orHlgN9orfA==", + "dev": true, + "requires": { + "async": "1.5.2", + "chalk": "2.3.2", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "command-join": "2.0.0", + "conventional-changelog-cli": "1.3.21", + "conventional-recommended-bump": "1.2.1", + "dedent": "0.7.0", + "execa": "0.8.0", + "find-up": "2.1.0", + "fs-extra": "4.0.3", + "get-port": "3.2.0", + "glob": "7.1.2", + "glob-parent": "3.1.0", + "globby": "6.1.0", + "graceful-fs": "4.1.11", + "hosted-git-info": "2.6.0", + "inquirer": "3.3.0", + "is-ci": "1.1.0", + "load-json-file": "4.0.0", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "npmlog": "4.1.2", + "p-finally": "1.0.0", + "package-json": "4.0.1", + "path-exists": "3.0.0", + "read-cmd-shim": "1.0.1", + "read-pkg": "3.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "semver": "5.5.0", + "signal-exit": "3.0.2", + "slash": "1.0.0", + "strong-log-transformer": "1.0.6", + "temp-write": "3.4.0", + "write-file-atomic": "2.3.0", + "write-json-file": "2.3.0", + "write-pkg": "3.1.0", + "yargs": "8.0.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "meow": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "dev": true, + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist": "1.2.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.4.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "is-plain-obj": "1.1.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true + }, + "moment": { + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz", + "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + }, + "dependencies": { + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true, + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.2" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, + "rc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", + "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.6", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.6" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "2.0.3" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "strong-log-transformer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz", + "integrity": "sha1-9/uTdYpppXEUAYEnfuoMLrEwH6M=", + "dev": true, + "requires": { + "byline": "5.0.0", + "duplexer": "0.1.1", + "minimist": "0.1.0", + "moment": "2.22.0", + "through": "2.3.8" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", + "dev": true + } + } + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "temp-write": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", + "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "is-stream": "1.1.0", + "make-dir": "1.2.0", + "pify": "3.0.0", + "temp-dir": "1.0.0", + "uuid": "3.2.1" + }, + "dependencies": { + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + } + } + }, + "tempfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2", + "uuid": "2.0.3" + } + }, + "text-extensions": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", + "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", + "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "1.0.3" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "5.0.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "pify": "3.0.0", + "sort-keys": "2.0.0", + "write-file-atomic": "2.3.0" + } + }, + "write-pkg": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.1.0.tgz", + "integrity": "sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk=", + "dev": true, + "requires": { + "sort-keys": "2.0.0", + "write-json-file": "2.3.0" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..1a80d1e21 --- /dev/null +++ b/package.json @@ -0,0 +1,42 @@ +{ + "name": "@opencensus/opencensus-base", + "version": "0.0.1", + "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "repository": "census-instrumentation/opencensus-node", + "scripts": { + "postinstall": "npm run bootstrap;npm run build;", + "build": "node_modules/.bin/lerna run build", + "test": "node_modules/.bin/lerna run test", + "bootstrap": "node_modules/.bin/lerna bootstrap", + "bump": "node_modules/.bin/lerna publish" + }, + "keywords": [ + "opencensus", + "nodejs", + "tracing", + "profiling" + ], + "author": "Google Inc.", + "license": "Apache-2.0", + "engines": { + "node": ">=6.0" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.d.ts", + "doc", + "CHANGELOG.md", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@types/node": "^9.4.7", + "lerna": "^2.10.1", + "typescript": "^2.7.2" + } +} diff --git a/packages/opencensus-core/.npmignore b/packages/opencensus-core/.npmignore new file mode 100644 index 000000000..9505ba945 --- /dev/null +++ b/packages/opencensus-core/.npmignore @@ -0,0 +1,4 @@ +/bin +/coverage +/doc +/test diff --git a/packages/opencensus-core/AUTHORS b/packages/opencensus-core/AUTHORS new file mode 100644 index 000000000..3aa6d434a --- /dev/null +++ b/packages/opencensus-core/AUTHORS @@ -0,0 +1,6 @@ +#CESAR's team (www.cesar.org.br): +Fabio Silva +Djonathas Cardoso +Luana Martins dos Santos +Eduardo Emery +Eldrey Seolin Galindo diff --git a/packages/opencensus-core/LICENSE b/packages/opencensus-core/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/packages/opencensus-core/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/opencensus-core/README.md b/packages/opencensus-core/README.md new file mode 100644 index 000000000..675f7e1bf --- /dev/null +++ b/packages/opencensus-core/README.md @@ -0,0 +1,16 @@ +# OpenCensus Core Node.js +[![Gitter chat][gitter-image]][gitter-url] + +OpenCensus for Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. + +The library is in alpha stage and the API is subject to change. + +Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. + +## Useful links +- For more information on OpenCensus, visit: +- To checkout the OpenCensus for Node.js, visit: +- For help or feedback on this project, join us on [gitter](https://gitter.im/census-instrumentation/Lobby) + +[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg +[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json new file mode 100644 index 000000000..91a86ae4c --- /dev/null +++ b/packages/opencensus-core/package-lock.json @@ -0,0 +1,4094 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@types/continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", + "requires": { + "@types/node": "9.4.7" + } + }, + "@types/debug": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", + "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" + }, + "@types/mocha": { + "version": "2.2.48", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", + "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" + }, + "@types/node": { + "version": "9.4.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", + "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" + }, + "@types/semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" + }, + "@types/shimmer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", + "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==" + }, + "@types/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" + }, + "@types/strip-json-comments": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", + "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" + }, + "@types/uuid": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", + "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", + "requires": { + "@types/node": "9.4.7" + } + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "1.9.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "async-listener": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", + "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", + "requires": { + "semver": "5.5.0", + "shimmer": "1.2.0" + } + }, + "async_hooks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async_hooks/-/async_hooks-1.0.0.tgz", + "integrity": "sha1-gV9ehh/nP2TrKf2ULDLpXIBkBS8=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.2", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "requires": { + "camelcase": "4.1.0", + "map-obj": "2.0.0", + "quick-lru": "1.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "chalk": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", + "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", + "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "clang-format": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", + "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", + "requires": { + "async": "1.5.2", + "glob": "7.1.2", + "resolve": "1.5.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.2.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "1.0.1" + } + } + } + }, + "continuation-local-storage": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", + "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", + "requires": { + "async-listener": "0.6.9", + "emitter-listener": "1.1.1" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "1.0.2" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "1.2.0", + "map-obj": "1.0.1" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "emitter-listener": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", + "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", + "requires": { + "shimmer": "1.2.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "1.3.5" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + }, + "gts": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", + "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", + "requires": { + "chalk": "2.3.2", + "clang-format": "1.2.2", + "inquirer": "3.3.0", + "meow": "4.0.0", + "pify": "3.0.0", + "rimraf": "2.6.2", + "tslint": "5.9.1", + "update-notifier": "2.3.0", + "write-file-atomic": "2.3.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", + "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.2", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "intercept-stdout": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", + "integrity": "sha1-Emq/H65sUJpCipjGGmMVWQQq6f0=", + "requires": { + "lodash.toarray": "3.0.2" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.1" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, + "json-parse-better-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", + "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "4.0.1" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "4.0.0", + "pify": "3.0.0", + "strip-bom": "3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "1.3.1", + "json-parse-better-errors": "1.0.1" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.toarray": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", + "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._basevalues": "3.0.0", + "lodash.keys": "3.1.2" + } + }, + "log-driver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", + "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", + "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", + "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", + "requires": { + "pify": "3.0.0" + } + }, + "make-error": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", + "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + }, + "meow": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", + "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", + "requires": { + "camelcase-keys": "4.2.0", + "decamelize-keys": "1.1.0", + "loud-rejection": "1.6.0", + "minimist": "1.2.0", + "minimist-options": "3.0.2", + "normalize-package-data": "2.4.0", + "read-pkg-up": "3.0.0", + "redent": "2.0.0", + "trim-newlines": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "requires": { + "arrify": "1.0.1", + "is-plain-obj": "1.1.0" + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", + "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "nyc": { + "version": "11.6.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.6.0.tgz", + "integrity": "sha512-ZaXCh0wmbk2aSBH2B5hZGGvK2s9aM8DIm2rVY+BG3Fx8tUS+bpJSswUVZqOD1YfCmnYRFSqgYJSr7UeeUcW0jg==", + "requires": { + "archy": "1.0.0", + "arrify": "1.0.1", + "caching-transform": "1.0.1", + "convert-source-map": "1.5.1", + "debug-log": "1.0.1", + "default-require-extensions": "1.0.0", + "find-cache-dir": "0.1.1", + "find-up": "2.1.0", + "foreground-child": "1.5.6", + "glob": "7.1.2", + "istanbul-lib-coverage": "1.2.0", + "istanbul-lib-hook": "1.1.0", + "istanbul-lib-instrument": "1.10.1", + "istanbul-lib-report": "1.1.3", + "istanbul-lib-source-maps": "1.2.3", + "istanbul-reports": "1.3.0", + "md5-hex": "1.3.0", + "merge-source-map": "1.1.0", + "micromatch": "2.3.11", + "mkdirp": "0.5.1", + "resolve-from": "2.0.0", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "spawn-wrap": "1.4.2", + "test-exclude": "4.2.1", + "yargs": "11.1.0", + "yargs-parser": "8.1.0" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "bundled": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "ansi-styles": { + "version": "2.2.1", + "bundled": true + }, + "append-transform": { + "version": "0.4.0", + "bundled": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "archy": { + "version": "1.0.0", + "bundled": true + }, + "arr-diff": { + "version": "2.0.0", + "bundled": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "bundled": true + }, + "arr-union": { + "version": "3.1.0", + "bundled": true + }, + "array-unique": { + "version": "0.2.1", + "bundled": true + }, + "arrify": { + "version": "1.0.1", + "bundled": true + }, + "assign-symbols": { + "version": "1.0.0", + "bundled": true + }, + "async": { + "version": "1.5.2", + "bundled": true + }, + "atob": { + "version": "2.0.3", + "bundled": true + }, + "babel-code-frame": { + "version": "6.26.0", + "bundled": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-generator": { + "version": "6.26.1", + "bundled": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "bundled": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "bundled": true, + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "bundled": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + } + }, + "babel-traverse": { + "version": "6.26.0", + "bundled": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.3", + "lodash": "4.17.5" + } + }, + "babel-types": { + "version": "6.26.0", + "bundled": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "base": { + "version": "0.11.2", + "bundled": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "bundled": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "builtin-modules": { + "version": "1.1.1", + "bundled": true + }, + "cache-base": { + "version": "1.0.1", + "bundled": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "caching-transform": { + "version": "1.0.1", + "bundled": true, + "requires": { + "md5-hex": "1.3.0", + "mkdirp": "0.5.1", + "write-file-atomic": "1.3.4" + } + }, + "camelcase": { + "version": "1.2.1", + "bundled": true, + "optional": true + }, + "center-align": { + "version": "0.1.3", + "bundled": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "1.1.3", + "bundled": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "class-utils": { + "version": "0.3.6", + "bundled": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true + }, + "kind-of": { + "version": "5.1.0", + "bundled": true + } + } + }, + "cliui": { + "version": "2.1.0", + "bundled": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "bundled": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "collection-visit": { + "version": "1.0.0", + "bundled": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "commondir": { + "version": "1.0.1", + "bundled": true + }, + "component-emitter": { + "version": "1.2.1", + "bundled": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "convert-source-map": { + "version": "1.5.1", + "bundled": true + }, + "copy-descriptor": { + "version": "0.1.1", + "bundled": true + }, + "core-js": { + "version": "2.5.3", + "bundled": true + }, + "cross-spawn": { + "version": "4.0.2", + "bundled": true, + "requires": { + "lru-cache": "4.1.2", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "debug-log": { + "version": "1.0.1", + "bundled": true + }, + "decamelize": { + "version": "1.2.0", + "bundled": true + }, + "decode-uri-component": { + "version": "0.2.0", + "bundled": true + }, + "default-require-extensions": { + "version": "1.0.0", + "bundled": true, + "requires": { + "strip-bom": "2.0.0" + } + }, + "define-property": { + "version": "2.0.2", + "bundled": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "detect-indent": { + "version": "4.0.0", + "bundled": true, + "requires": { + "repeating": "2.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "bundled": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "bundled": true + }, + "esutils": { + "version": "2.0.2", + "bundled": true + }, + "execa": { + "version": "0.7.0", + "bundled": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "bundled": true, + "requires": { + "lru-cache": "4.1.2", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "bundled": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "bundled": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extend-shallow": { + "version": "3.0.2", + "bundled": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "bundled": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "filename-regex": { + "version": "2.0.1", + "bundled": true + }, + "fill-range": { + "version": "2.2.3", + "bundled": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "0.1.1", + "bundled": true, + "requires": { + "commondir": "1.0.1", + "mkdirp": "0.5.1", + "pkg-dir": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "bundled": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "bundled": true + }, + "for-own": { + "version": "0.1.5", + "bundled": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreground-child": { + "version": "1.5.6", + "bundled": true, + "requires": { + "cross-spawn": "4.0.2", + "signal-exit": "3.0.2" + } + }, + "fragment-cache": { + "version": "0.2.1", + "bundled": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "get-caller-file": { + "version": "1.0.2", + "bundled": true + }, + "get-stream": { + "version": "3.0.0", + "bundled": true + }, + "get-value": { + "version": "2.0.6", + "bundled": true + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "bundled": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "bundled": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "bundled": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "handlebars": { + "version": "4.0.11", + "bundled": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "bundled": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "bundled": true + }, + "has-value": { + "version": "1.0.0", + "bundled": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "has-values": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hosted-git-info": { + "version": "2.6.0", + "bundled": true + }, + "imurmurhash": { + "version": "0.1.4", + "bundled": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "invariant": { + "version": "2.2.3", + "bundled": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "bundled": true + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "bundled": true + }, + "is-buffer": { + "version": "1.1.6", + "bundled": true + }, + "is-builtin-module": { + "version": "1.0.0", + "bundled": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "bundled": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "bundled": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "bundled": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "bundled": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "bundled": true + }, + "is-extglob": { + "version": "1.0.0", + "bundled": true + }, + "is-finite": { + "version": "1.0.2", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "bundled": true + }, + "is-glob": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-odd": { + "version": "2.0.0", + "bundled": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "bundled": true + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "bundled": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "bundled": true + }, + "is-primitive": { + "version": "2.0.0", + "bundled": true + }, + "is-stream": { + "version": "1.1.0", + "bundled": true + }, + "is-utf8": { + "version": "0.2.1", + "bundled": true + }, + "is-windows": { + "version": "1.0.2", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isexe": { + "version": "2.0.0", + "bundled": true + }, + "isobject": { + "version": "2.1.0", + "bundled": true, + "requires": { + "isarray": "1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.0", + "bundled": true + }, + "istanbul-lib-hook": { + "version": "1.1.0", + "bundled": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.1", + "bundled": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.0", + "semver": "5.5.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.3", + "bundled": true, + "requires": { + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "path-parse": "1.0.5", + "supports-color": "3.2.3" + }, + "dependencies": { + "supports-color": { + "version": "3.2.3", + "bundled": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.3", + "bundled": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.0", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "istanbul-reports": { + "version": "1.3.0", + "bundled": true, + "requires": { + "handlebars": "4.0.11" + } + }, + "js-tokens": { + "version": "3.0.2", + "bundled": true + }, + "jsesc": { + "version": "1.3.0", + "bundled": true + }, + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "1.0.4", + "bundled": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "bundled": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "bundled": true + } + } + }, + "lodash": { + "version": "4.17.5", + "bundled": true + }, + "longest": { + "version": "1.0.1", + "bundled": true + }, + "loose-envify": { + "version": "1.3.1", + "bundled": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.2", + "bundled": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "map-cache": { + "version": "0.2.2", + "bundled": true + }, + "map-visit": { + "version": "1.0.0", + "bundled": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5-hex": { + "version": "1.3.0", + "bundled": true, + "requires": { + "md5-o-matic": "0.1.1" + } + }, + "md5-o-matic": { + "version": "0.1.1", + "bundled": true + }, + "mem": { + "version": "1.1.0", + "bundled": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "bundled": true, + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "bundled": true + } + } + }, + "micromatch": { + "version": "2.3.11", + "bundled": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mimic-fn": { + "version": "1.2.0", + "bundled": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mixin-deep": { + "version": "1.3.1", + "bundled": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "bundled": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "nanomatch": { + "version": "1.2.9", + "bundled": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "bundled": true, + "requires": { + "hosted-git-info": "2.6.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.3" + } + }, + "normalize-path": { + "version": "2.1.1", + "bundled": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "bundled": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "object-copy": { + "version": "0.1.0", + "bundled": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "bundled": true + } + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "bundled": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "bundled": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "bundled": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "bundled": true, + "requires": { + "minimist": "0.0.8", + "wordwrap": "0.0.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-locale": { + "version": "2.1.0", + "bundled": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "bundled": true + }, + "p-limit": { + "version": "1.2.0", + "bundled": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "bundled": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "bundled": true + }, + "parse-glob": { + "version": "3.0.4", + "bundled": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "bundled": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "bundled": true + }, + "path-exists": { + "version": "2.1.0", + "bundled": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "path-key": { + "version": "2.0.1", + "bundled": true + }, + "path-parse": { + "version": "1.0.5", + "bundled": true + }, + "path-type": { + "version": "1.1.0", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pify": { + "version": "2.3.0", + "bundled": true + }, + "pinkie": { + "version": "2.0.4", + "bundled": true + }, + "pinkie-promise": { + "version": "2.0.1", + "bundled": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "bundled": true, + "requires": { + "find-up": "1.1.2" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "bundled": true + }, + "preserve": { + "version": "0.2.0", + "bundled": true + }, + "pseudomap": { + "version": "1.0.2", + "bundled": true + }, + "randomatic": { + "version": "1.1.7", + "bundled": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "bundled": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "bundled": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "bundled": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "bundled": true + }, + "regex-cache": { + "version": "0.4.4", + "bundled": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "bundled": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "bundled": true + }, + "repeat-element": { + "version": "1.1.2", + "bundled": true + }, + "repeat-string": { + "version": "1.6.1", + "bundled": true + }, + "repeating": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "bundled": true + }, + "require-main-filename": { + "version": "1.0.1", + "bundled": true + }, + "resolve-from": { + "version": "2.0.0", + "bundled": true + }, + "resolve-url": { + "version": "0.2.1", + "bundled": true + }, + "ret": { + "version": "0.1.15", + "bundled": true + }, + "right-align": { + "version": "0.1.3", + "bundled": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-regex": { + "version": "1.1.0", + "bundled": true, + "requires": { + "ret": "0.1.15" + } + }, + "semver": { + "version": "5.5.0", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "set-value": { + "version": "2.0.0", + "bundled": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "bundled": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "slide": { + "version": "1.1.6", + "bundled": true + }, + "snapdragon": { + "version": "0.8.2", + "bundled": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "bundled": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "source-map": { + "version": "0.5.7", + "bundled": true + }, + "source-map-resolve": { + "version": "0.5.1", + "bundled": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "bundled": true + }, + "spawn-wrap": { + "version": "1.4.2", + "bundled": true, + "requires": { + "foreground-child": "1.5.6", + "mkdirp": "0.5.1", + "os-homedir": "1.0.2", + "rimraf": "2.6.2", + "signal-exit": "3.0.2", + "which": "1.3.0" + } + }, + "spdx-correct": { + "version": "3.0.0", + "bundled": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "bundled": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "bundled": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "bundled": true + }, + "split-string": { + "version": "3.1.0", + "bundled": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "static-extend": { + "version": "0.1.2", + "bundled": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true + } + } + }, + "string-width": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "bundled": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "bundled": true + }, + "supports-color": { + "version": "2.0.0", + "bundled": true + }, + "test-exclude": { + "version": "4.2.1", + "bundled": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "3.1.9", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "bundled": true + }, + "array-unique": { + "version": "0.3.2", + "bundled": true + }, + "braces": { + "version": "2.3.1", + "bundled": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "bundled": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "bundled": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "bundled": true + } + } + }, + "extglob": { + "version": "2.0.4", + "bundled": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "bundled": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "bundled": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "bundled": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "bundled": true + }, + "kind-of": { + "version": "6.0.2", + "bundled": true + }, + "micromatch": { + "version": "3.1.9", + "bundled": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "to-fast-properties": { + "version": "1.0.3", + "bundled": true + }, + "to-object-path": { + "version": "0.3.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "bundled": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "bundled": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "bundled": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "trim-right": { + "version": "1.0.1", + "bundled": true + }, + "uglify-js": { + "version": "2.8.29", + "bundled": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "bundled": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "union-value": { + "version": "1.0.0", + "bundled": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "bundled": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "bundled": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "bundled": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "bundled": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "bundled": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "bundled": true + }, + "isobject": { + "version": "3.0.1", + "bundled": true + } + } + }, + "urix": { + "version": "0.1.0", + "bundled": true + }, + "use": { + "version": "3.1.0", + "bundled": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "bundled": true + } + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "bundled": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.3.0", + "bundled": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "bundled": true + }, + "window-size": { + "version": "0.1.0", + "bundled": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "bundled": true + }, + "wrap-ansi": { + "version": "2.1.0", + "bundled": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + }, + "write-file-atomic": { + "version": "1.3.4", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "y18n": { + "version": "3.2.1", + "bundled": true + }, + "yallist": { + "version": "2.1.2", + "bundled": true + }, + "yargs": { + "version": "11.1.0", + "bundled": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "bundled": true + }, + "camelcase": { + "version": "4.1.0", + "bundled": true + }, + "cliui": { + "version": "4.0.0", + "bundled": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "bundled": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "yargs-parser": { + "version": "9.0.2", + "bundled": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "8.1.0", + "bundled": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "bundled": true + } + } + } + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.2.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + }, + "dependencies": { + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + } + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "3.0.0" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + }, + "rc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", + "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "4.0.0", + "normalize-package-data": "2.4.0", + "path-type": "3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "2.1.0", + "read-pkg": "3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "requires": { + "indent-string": "3.2.0", + "strip-indent": "2.0.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "requires": { + "rc": "1.2.6", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "1.2.6" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "5.5.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "source-map-support": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", + "requires": { + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "requires": { + "has-flag": "2.0.0" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "0.7.0" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + }, + "ts-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", + "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", + "requires": { + "arrify": "1.0.1", + "chalk": "2.3.2", + "diff": "3.5.0", + "make-error": "1.3.4", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.5.4", + "tsconfig": "7.0.0", + "v8flags": "3.0.2", + "yn": "2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "tsconfig": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", + "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", + "requires": { + "@types/strip-bom": "3.0.0", + "@types/strip-json-comments": "0.0.30", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + } + }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + }, + "tslint": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.3.2", + "commander": "2.15.1", + "diff": "3.5.0", + "glob": "7.1.2", + "js-yaml": "3.11.0", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.5.0", + "tslib": "1.9.0", + "tsutils": "2.22.2" + }, + "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" + } + } + }, + "tsutils": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", + "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", + "requires": { + "tslib": "1.9.0" + } + }, + "typescript": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "requires": { + "boxen": "1.3.0", + "chalk": "2.3.2", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "v8flags": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", + "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", + "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "widest-line": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", + "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", + "requires": { + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" + } + } +} diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json new file mode 100644 index 000000000..70c610928 --- /dev/null +++ b/packages/opencensus-core/package.json @@ -0,0 +1,65 @@ +{ + "name": "@opencensus/opencensus-core", + "version": "0.0.1", + "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", + "main": "build/src/index.js", + "types": "build/src/index.d.ts", + "repository": "census-instrumentation/opencensus-node", + "scripts": { + "build": "node_modules/.bin/tsc --declaration", + "test": "nyc -x '**/test/**' --reporter=html --reporter=text mocha 'build/test/**/*.js'", + "clean": "rimraf build/*", + "check": "gts check", + "compile": "tsc -p .", + "fix": "gts fix", + "prepare": "npm run compile", + "pretest": "npm run compile", + "posttest": "npm run check" + }, + "keywords": [ + "opencensus", + "nodejs", + "tracing", + "profiling" + ], + "author": "Google Inc.", + "license": "Apache-2.0", + "engines": { + "node": ">=6.0" + }, + "files": [ + "build/src/**/*.js", + "build/src/**/*.d.ts", + "doc", + "CHANGELOG.md", + "LICENSE", + "README.md" + ], + "publishConfig": { + "access": "public" + }, + "devDependencies": { + "@types/continuation-local-storage": "^3.2.1", + "@types/debug": "0.0.30", + "@types/mocha": "^2.2.48", + "@types/node": "^9.4.7", + "@types/semver": "^5.5.0", + "@types/shimmer": "^1.0.1", + "@types/uuid": "^3.4.3", + "gts": "^0.5.4", + "mocha": "^5.0.4", + "ncp": "^2.0.0", + "ts-node": "^4.0.0", + "typescript": "~2.6.1", + "nyc": "11.6.0" + }, + "dependencies": { + "continuation-local-storage": "^3.2.1", + "debug": "^3.1.0", + "intercept-stdout": "^0.1.2", + "log-driver": "^1.2.7", + "semver": "^5.5.0", + "shimmer": "^1.2.0", + "uuid": "^3.2.1" + } +} diff --git a/packages/opencensus-core/scripts/compile.ts b/packages/opencensus-core/scripts/compile.ts new file mode 100644 index 000000000..da139552f --- /dev/null +++ b/packages/opencensus-core/scripts/compile.ts @@ -0,0 +1,22 @@ +import * as path from 'path'; +import { forkP } from './utils'; +import * as ts from 'typescript'; +import * as semver from 'semver'; + +export interface CompileOptions { + strict: boolean; + languageLevel: string; +} + +export async function compile(options: CompileOptions) { + let { strict, languageLevel } = options; + if (languageLevel === 'auto') { + languageLevel = semver.satisfies(process.version, '>=7.5') ? 'es2017' : 'es2015'; + } + await forkP(`node_modules/.bin/tsc`, [ + '-p', + strict ? '.' : './tsconfig.full.json', + '--target', + languageLevel + ]); +} diff --git a/packages/opencensus-core/scripts/tsconfig.json b/packages/opencensus-core/scripts/tsconfig.json new file mode 100644 index 000000000..e4b33561a --- /dev/null +++ b/packages/opencensus-core/scripts/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../node_modules/gts/tsconfig-google.json", + "compilerOptions": { + "rootDir": "..", + "outDir": "../build" + }, + "include": [ + "*.ts" + ] +} \ No newline at end of file diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts new file mode 100644 index 000000000..decd19bfb --- /dev/null +++ b/packages/opencensus-core/src/common/console-logger.ts @@ -0,0 +1,124 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as util from 'util'; + +import * as types from './types'; + +const logDriver = require('log-driver'); + + +/** + * This class implements a console logger. + */ +export class ConsoleLogger implements types.Logger { + // tslint:disable:no-any + private logger: any; + static LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; + level: string; + + + // TODO: reevaluate options to accept numbers as a parameter + + /** + * Constructs a new ConsoleLogger instance + * @param options A logger configuration object. + */ + constructor(options?: types.LoggerOptions|string|number) { + let opt: types.LoggerOptions = {}; + if (typeof options === 'number') { + if (options < 0) { + options = 0; + } else if (options > ConsoleLogger.LEVELS.length) { + options = ConsoleLogger.LEVELS.length - 1; + } + opt = {level: ConsoleLogger.LEVELS[options]}; + } else if (typeof options === 'string') { + opt = {level: options}; + } else { + opt = options || {}; + } + this.level = opt.level; + this.logger = + logDriver({levels: ConsoleLogger.LEVELS, level: opt.level || 'silent'}); + } + + /** + * Logger error function. + * @param message menssage erro to log in console + * @param args arguments to log in console + */ + // tslint:disable:no-any + error(message: any, ...args: any[]): void { + this.logger.error(util.format(message, ...args)); + } + + /** + * Logger warning function. + * @param message menssage warning to log in console + * @param args arguments to log in console + */ + // tslint:disable:no-any + warn(message: any, ...args: any[]): void { + this.logger.warn(util.format(message, ...args)); + } + + /** + * Logger info function. + * @param message menssage info to log in console + * @param args arguments to log in console + */ + // tslint:disable:no-any + info(message: any, ...args: any[]): void { + this.logger.info(util.format(message, ...args)); + } + + /** + * Logger debug function. + * @param message menssage debug to log in console + * @param args arguments to log in console + */ + // tslint:disable:no-any + debug(message: any, ...args: any[]): void { + this.logger.debug(util.format(message, ...args)); + } + + /** + * Logger silly function. + * @param message menssage silly to log in console + * @param args arguments to log in console + */ + // tslint:disable:no-any + silly(message: any, ...args: any[]): void { + this.logger.silly(util.format(message, ...args)); + } +} + + +// TODO: reevaluate the need to create a new logger instance on every call to +// logger(); + +/** + * Function logger exported to others classes. + * @param options A logger options or strig to logger in console + */ +const logger = (options?: types.LoggerOptions|string|number) => { + const aLogger = new ConsoleLogger(options); + logger['logger'] = aLogger; + return aLogger; +}; + +export {logger}; diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts new file mode 100644 index 000000000..5eb987e04 --- /dev/null +++ b/packages/opencensus-core/src/common/types.ts @@ -0,0 +1,30 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// tslint:disable:no-any +export type LogFunction = (message: any, ...args: any[]) => void; + +/** Defines an logger interface. */ +export interface Logger { + error: LogFunction; + warn: LogFunction; + info: LogFunction; + debug: LogFunction; + silly: LogFunction; +} + +/** Defines an logger options interface. */ +export interface LoggerOptions { level?: string; } diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts new file mode 100644 index 000000000..9c1f17f5c --- /dev/null +++ b/packages/opencensus-core/src/exporters/console-exporter.ts @@ -0,0 +1,73 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as loggerTypes from '../common/types'; +import * as modelTypes from '../trace/model/types'; + +import {ExporterBuffer} from './exporter-buffer'; +import * as types from './types'; + +/** Do not send span data */ +export class NoopExporter implements types.Exporter { + logger: loggerTypes.Logger; + onEndSpan(root: modelTypes.RootSpan) {} + publish(rootSpans: modelTypes.RootSpan[]) {} +} + +/** Format and sends span data to the console. */ +export class ConsoleExporter implements types.Exporter { + /** Buffer object to store the spans. */ + private buffer: ExporterBuffer; + private logger: loggerTypes.Logger; + + /** + * Constructs a new ConsoleLogExporter instance. + * @param config Exporter configuration object to create a console log + * exporter. + */ + constructor(config: types.ExporterConfig) { + this.buffer = new ExporterBuffer(this, config); + this.logger = config.logger; + } + + /** + * Event called when a span is ended. + * @param root Ended span. + */ + onEndSpan(root: modelTypes.RootSpan) { + this.buffer.addToBuffer(root); + } + + /** + * Sends the spans information to the console. + * @param rootSpans + */ + publish(rootSpans: modelTypes.RootSpan[]) { + rootSpans.map((root) => { + const ROOT_STR = `RootSpan: {traceId: ${root.traceId}, spanId: ${ + root.id}, name: ${root.name} }`; + const SPANS_STR: string[] = root.spans.map( + (span) => [`\t\t{spanId: ${span.id}, name: ${span.name}}`].join( + '\n')); + const result: string[] = []; + + result.push( + ROOT_STR + '\n\tChildSpans:\n' + + `${SPANS_STR.join('\n')}`); + console.log(`${result}`); + }); + } +} diff --git a/packages/opencensus-core/src/exporters/exporter-buffer.ts b/packages/opencensus-core/src/exporters/exporter-buffer.ts new file mode 100644 index 000000000..42e081ba8 --- /dev/null +++ b/packages/opencensus-core/src/exporters/exporter-buffer.ts @@ -0,0 +1,124 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as uuidv4 from 'uuid/v4'; +import * as logger from '../common/console-logger'; +import * as loggerTypes from '../common/types'; +import * as configTypes from '../trace/config/types'; +import * as modelTypes from '../trace/model/types'; +import * as types from './types'; + + +/** Controls the sending of traces to exporters. */ +export class ExporterBuffer { + /** The service to send the collected spans. */ + private exporter: types.Exporter; + /** Maximum size of a buffer. */ + private bufferSize: number; + /** Max time for a buffer can wait before being sent */ + private bufferTimeout: number; + /** Manage when the buffer timeout needs to be reseted */ + private resetTimeout = false; + /** Indicates when the buffer timeout is running */ + private bufferTimeoutInProgress = false; + /** An object to log information to */ + private logger: loggerTypes.Logger; + /** Trace queue of a buffer */ + private queue: modelTypes.RootSpan[] = []; + + /** + * Constructs a new Buffer instance. + * @param exporter The service to send the collected spans. + * @param config A buffer configuration object to create a buffer. + */ + constructor(exporter: types.Exporter, config: configTypes.BufferConfig) { + this.exporter = exporter; + this.logger = config.logger || logger.logger(); + this.bufferSize = config.bufferSize; + this.bufferTimeout = config.bufferTimeout; + return this; + } + + /** + * Set the buffer size value. + * @param bufferSize The new buffer size. + */ + setBufferSize(bufferSize: number) { + this.bufferSize = bufferSize; + return this; + } + + getBufferSize(): number { + return this.bufferSize; + } + + getQueue(): modelTypes.RootSpan[] { + return this.queue; + } + /** + * Add a rootSpan in the buffer. + * @param root RootSpan to be added in the buffer. + */ + addToBuffer(root: modelTypes.RootSpan) { + this.queue.push(root); + this.logger.debug('ExporterBuffer: added new rootspan'); + + if (this.queue.length > this.bufferSize) { + this.flush(); + } + + if (this.bufferTimeoutInProgress) { + this.resetBufferTimeout(); + } else { + this.setBufferTimeout(); + } + + return this; + } + + /** Reset the buffer timeout */ + private resetBufferTimeout() { + this.logger.debug('ExporterBuffer: reset timeout'); + this.resetTimeout = true; + } + + /** Start the buffer timeout, when finished calls flush method */ + private setBufferTimeout() { + this.logger.debug('ExporterBuffer: set timeout'); + this.bufferTimeoutInProgress = true; + + setTimeout(() => { + if (this.queue.length === 0) { + return; + } + + if (this.resetTimeout) { + this.resetTimeout = false; + this.setBufferTimeout(); + } else { + this.bufferTimeoutInProgress = false; + this.flush(); + } + }, this.bufferTimeout); + } + + /** Send the trace queue to all exporters */ + private flush() { + this.exporter.publish(this.queue); + this.queue = []; + return this; + } +} diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts new file mode 100644 index 000000000..7974402ce --- /dev/null +++ b/packages/opencensus-core/src/exporters/types.ts @@ -0,0 +1,31 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import * as loggerTypes from '../common/types'; +import * as configTypes from '../trace/config/types'; +import * as modelTypes from '../trace/model/types'; + +/** Defines an exporter interface. */ +export interface Exporter extends modelTypes.OnEndSpanEventListener { + /** + * Sends a list of root spans to the service. + * @param rootSpans A list of root spans to publish. + */ + publish(rootSpans: modelTypes.RootSpan[]): void; +} + +export type ExporterConfig = configTypes.BufferConfig; diff --git a/packages/opencensus-core/src/index-classes.ts b/packages/opencensus-core/src/index-classes.ts new file mode 100644 index 000000000..c072bc87f --- /dev/null +++ b/packages/opencensus-core/src/index-classes.ts @@ -0,0 +1,32 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// all classes + +// domain models impls +export * from './trace/model/root-span'; +export * from './trace/model/span'; +export * from './trace/model/tracer'; + +// sampler impl +export * from './trace/sampler/sampler'; + +// base instrumetation class +export * from './trace/instrumentation/base-plugin'; + +// console exporter and buffer impls +export * from './exporters/exporter-buffer'; +export * from './exporters/console-exporter'; diff --git a/packages/opencensus-core/src/index-types.ts b/packages/opencensus-core/src/index-types.ts new file mode 100644 index 000000000..d09fa413a --- /dev/null +++ b/packages/opencensus-core/src/index-types.ts @@ -0,0 +1,24 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// all types +export * from './trace/types'; +export * from './trace/model/types'; +export * from './trace/config/types'; +export * from './trace/sampler/types'; +export * from './trace/instrumentation/types'; +export * from './exporters/types'; +export * from './common/types'; diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts new file mode 100644 index 000000000..5d9e34ff0 --- /dev/null +++ b/packages/opencensus-core/src/index.ts @@ -0,0 +1,22 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import * as logger from './common/console-logger'; +import * as classes from './index-classes'; +import * as types from './index-types'; + +export {classes, logger, types}; diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts new file mode 100644 index 000000000..3e80f7270 --- /dev/null +++ b/packages/opencensus-core/src/internal/clock.ts @@ -0,0 +1,77 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +/** + * The Clock class is used to record the duration and endTime for spans. + */ +export class Clock { + /** Indicates if the clock is endend. */ + private endedLocal = false; + /** Indicates the clock's start time. */ + private startTimeLocal: Date; + /** The time in high resolution in a [seconds, nanoseconds]. */ + private hrtimeLocal: [number, number]; + /** The duration between start and end of the clock. */ + private diff: [number, number] = null; + + /** Constructs a new SamplerImpl instance. */ + constructor() { + this.startTimeLocal = new Date(); + this.hrtimeLocal = process.hrtime(); + } + + /** Ends the clock. */ + end(): void { + if (this.endedLocal) { + return; + } + this.diff = process.hrtime(this.hrtimeLocal); + this.endedLocal = true; + } + + /** Gets the duration of the clock. */ + get duration(): number { + if (!this.endedLocal) { + return null; + } + const ns = this.diff[0] * 1e9 + this.diff[1]; + return ns / 1e6; + } + + + /** Starts the clock. */ + get startTime(): Date { + return this.startTimeLocal; + } + + /** + * Gets the time so far. + * @returns A Date object with the current duration. + */ + get endTime(): Date { + let result: Date = null; + if (this.ended) { + result = new Date(this.startTime.getTime() + this.duration); + } + return result; + } + + /** Indicates if the clock was ended. */ + get ended(): boolean { + return this.endedLocal; + } +} diff --git a/packages/opencensus-core/src/internal/cls-ah.ts b/packages/opencensus-core/src/internal/cls-ah.ts new file mode 100644 index 000000000..8e273454c --- /dev/null +++ b/packages/opencensus-core/src/internal/cls-ah.ts @@ -0,0 +1,148 @@ +/** + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Original file from Stackdriver Trace Agent for Node.js +// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs + +import * as asyncHook from 'async_hooks'; +import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage'; +import {EventEmitter} from 'events'; +import * as shimmer from 'shimmer'; + +const wrappedSymbol = Symbol('context_wrapped'); +let contexts: {[asyncId: number]: Context;} = {}; +let current: Context = {}; + +asyncHook.createHook({init, before, destroy}).enable(); + +const EVENT_EMITTER_METHODS: Array = + ['addListener', 'on', 'once', 'prependListener', 'prependOnceListener']; + +class AsyncHooksNamespace implements CLSNamespace { + get name(): string { + throw new Error('Not implemented'); + } + + get active(): Context { + throw new Error('Not implemented'); + } + + createContext(): Context { + throw new Error('Not implemented'); + } + + get(k: string) { + return current[k]; + } + + set(k: string, v: T): T { + current[k] = v; + return v; + } + + run(fn: Func): Context { + this.runAndReturn(fn); + return current; + } + + runAndReturn(fn: Func): T { + const oldContext = current; + current = {}; + const res = fn(); + current = oldContext; + return res; + } + + bind(cb: Func): Func { + // TODO(kjin): Monitor https://github.com/Microsoft/TypeScript/pull/15473. + // When it's landed and released, we can remove these `any` casts. + // tslint:disable-next-line:no-any + if ((cb as any)[wrappedSymbol] as boolean || !current) { + return cb; + } + const boundContext = current; + const contextWrapper = function(this: {}) { + const oldContext = current; + current = boundContext; + const res = cb.apply(this, arguments) as T; + current = oldContext; + return res; + }; + // tslint:disable-next-line:no-any + (contextWrapper as any)[wrappedSymbol] = true; + Object.defineProperty(contextWrapper, 'length', { + enumerable: false, + configurable: true, + writable: false, + value: cb.length + }); + return contextWrapper; + } + + // This function is not technically needed and all tests currently pass + // without it (after removing call sites). While it is not a complete + // solution, restoring correct context before running every request/response + // event handler reduces the number of situations in which userspace queuing + // will cause us to lose context. + bindEmitter(ee: NodeJS.EventEmitter): void { + const ns = this; + EVENT_EMITTER_METHODS.forEach((method) => { + if (ee[method]) { + shimmer.wrap(ee, method, (oldMethod) => { + return function(this: {}, event: string, cb: Func) { + return oldMethod.call(this, event, ns.bind(cb)); + }; + }); + } + }); + } +} + +const namespace = new AsyncHooksNamespace(); + +// AsyncWrap Hooks + +function init( + uid: number, provider: string, parentUid: number, parentHandle: {}) { + contexts[uid] = current; +} + +function before(uid: number) { + if (contexts[uid]) { + current = contexts[uid]; + } +} + +function destroy(uid: number) { + delete contexts[uid]; +} + +export function createNamespace(): CLSNamespace { + return namespace; +} + +export function destroyNamespace(): void { + current = {}; + contexts = {}; +} + +export function getNamespace(): CLSNamespace { + return namespace; +} + +export function reset(): void { + throw new Error('Not implemented'); +} diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts new file mode 100644 index 000000000..15384f2bc --- /dev/null +++ b/packages/opencensus-core/src/internal/cls.ts @@ -0,0 +1,59 @@ +/** + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Original file from Stackdriver Trace Agent for Node.js +// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs + +import * as CLS from 'continuation-local-storage'; +import * as semver from 'semver'; + +import * as cls_ah from './cls-ah'; + +export type Namespace = CLS.Namespace; +export type Func = CLS.Func; + +const useAsyncHooks: boolean = semver.satisfies( + process.version, '>=8'); //&& + // !!process.env.GCLOUD_TRACE_NEW_CONTEXT; + +import * as Debug from 'debug'; +const debug = Debug('opencensus'); +debug('useAsyncHooks = %s', useAsyncHooks); + +const cls: typeof CLS = useAsyncHooks ? cls_ah : CLS; + + +const TRACE_NAMESPACE = 'opencensus.io'; + +/** + * Stack traces are captured when a root span is started. Because the stack + * trace height varies on the context propagation mechanism, to keep published + * stack traces uniform we need to remove the top-most frames when using the + * c-l-s module. Keep track of this number here. + */ +export const ROOT_SPAN_STACK_OFFSET = useAsyncHooks ? 0 : 2; + +export function createNamespace(): CLS.Namespace { + return cls.createNamespace(TRACE_NAMESPACE); +} + +export function destroyNamespace(): void { + cls.destroyNamespace(TRACE_NAMESPACE); +} + +export function getNamespace(): CLS.Namespace { + return cls.getNamespace(TRACE_NAMESPACE); +} diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts new file mode 100644 index 000000000..358727af1 --- /dev/null +++ b/packages/opencensus-core/src/internal/util.ts @@ -0,0 +1,40 @@ +/** + * Copyright 2018 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Code snippets from Stackdriver Trace Agent +// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs + +import * as crypto from 'crypto'; + + +// TODO: rethink this snippet aproach + +// Use 6 bytes of randomness only as JS numbers are doubles not 64-bit ints. +const SPAN_ID_RANDOM_BYTES = 6; + +// Use the faster crypto.randomFillSync when available (Node 7+) falling back to +// using crypto.randomBytes. +const spanIdBuffer = Buffer.alloc(SPAN_ID_RANDOM_BYTES); +const randomFillSync = crypto.randomFillSync; +const randomBytes = crypto.randomBytes; +const spanRandomBuffer = randomFillSync ? + () => randomFillSync(spanIdBuffer) : + () => randomBytes(SPAN_ID_RANDOM_BYTES); + +export function randomSpanId() { + // tslint:disable-next-line:ban Needed to parse hexadecimal. + return parseInt(spanRandomBuffer().toString('hex'), 16).toString(); +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts new file mode 100644 index 000000000..12947ebdd --- /dev/null +++ b/packages/opencensus-core/src/trace/config/types.ts @@ -0,0 +1,72 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Logger} from '../../common/types'; +import {Exporter} from '../../exporters/types'; +import {PluginNames} from '../instrumentation/types'; + +/** Interface configuration for a buffer. */ +export interface BufferConfig { + /** Maximum size of a buffer. */ + bufferSize?: number; + /** Max time for a buffer can wait before being sent */ + bufferTimeout?: number; + /** A logger object */ + logger?: Logger; +} + +/** Defines tracer configuration parameters */ +export interface TracerConfig { + /** Determines the samplin rate. Ranges from 0.0 to 1.0 */ + samplingRate?: number; + /** Determines the ignored (or blacklisted) URLs */ + ignoreUrls?: Array; + /** A logger object */ + logger?: Logger; +} + +/** Available configuration options. */ +export interface TracingConfig { + /** level of logger - 0:disable, 1: error, 2: warn, 3: info, 4: debug */ + logLevel?: number; + + /** + * The maximum number of characters reported on a label value. + */ + maximumLabelValueSize?: number; + + /** + * A list of trace instrumentations plugins to load. + * Each key is the name of the module to trace, and its + * value is the name of the package which has the plugin + * implementation. + * Ex.: + * plugins: { + * 'http': '@opencensus/opencensus-instrumentation-http', + * 'mongodb-core': '@opencensus/opencensus-instrumentation-mongodb-core', + * ... + * } + * Any user-provided value will be added to the default list. + * It will override any default plugin for the same key. + */ + plugins?: PluginNames; + /** An exporter object */ + exporter?: Exporter; + /** An instance of a logger */ + logger?: Logger; +} + +export type Config = TracingConfig&TracerConfig&BufferConfig; diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts new file mode 100644 index 000000000..9021aface --- /dev/null +++ b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts @@ -0,0 +1,69 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as shimmer from 'shimmer'; +import * as modelTypes from '../model/types'; +import * as types from './types'; + +// TODO: improve Jsdoc comments + +/** This class represent the base to patch plugin. */ +export abstract class BasePlugin implements types.Plugin { + /** Exporters from the nodejs module to be instrumented */ + // tslint:disable:no-any + protected moduleExporters: any; + /** The module name */ + protected moduleName: string; + /** A tracer object. */ + protected tracer: modelTypes.Tracer; + /** The module version. */ + protected version: string; + + /** + * Constructs a new BasePlugin instance. + * @param moduleName The module name. + */ + constructor(moduleName: string) { + this.moduleName = moduleName; + } + + /** + * Sets modified plugin to the context. + * @param moduleExporters object moduleExporters to set as context + * @param tracer tracer relating to context + * @param version module version description + */ + // tslint:disable:no-any + protected setPluginContext( + moduleExporters: any, tracer: modelTypes.Tracer, version: string) { + this.moduleExporters = moduleExporters; + this.tracer = tracer; + this.version = version; + } + + + // TODO: review this implementation + // From the perspective of an instrumentation module author, + // that applyUnpatch is abstract makes it seem like patching is optional, + // while unpatching is not. It should be the other way around + + // tslint:disable:no-any + applyPatch(moduleExporters: any, tracer: modelTypes.Tracer, version: string): + any { + this.setPluginContext(moduleExporters, tracer, version); + } + + abstract applyUnpatch(): void; +} diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts new file mode 100644 index 000000000..b81fe70be --- /dev/null +++ b/packages/opencensus-core/src/trace/instrumentation/types.ts @@ -0,0 +1,41 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Tracer} from '../model/types'; + +/** Interface Plugin to apply patch. */ +export interface Plugin { + /** + * Method to apply the instrumentation patch + * @param moduleExporters exporters from the module to patch + * @param tracer a tracer instance + * @param version version of the current instaled module to patch + */ + // tslint:disable:no-any + applyPatch(moduleExporters: any, tracer: Tracer, version: string): any; + /** Method to unpatch the instrumentation */ + applyUnpatch(): void; +} + + +/** + * Type PluginNames: each key should be the name of the module to trace, + * and its value should be the name of the package which has the + * plugin implementation. + */ +export type PluginNames = { + [pluginName: string]: string; +}; diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts new file mode 100644 index 000000000..4c73e7e06 --- /dev/null +++ b/packages/opencensus-core/src/trace/model/root-span.ts @@ -0,0 +1,122 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as uuid from 'uuid'; + +import * as logger from '../../common/console-logger'; +import {Clock} from '../../internal/clock'; + +import {Span} from './span'; +import {SpanBase} from './span-base'; +import * as types from './types'; + + +/** Defines a root span */ +export class RootSpan extends SpanBase implements types.RootSpan { + /** A tracer object */ + private tracer: types.Tracer; + /** A list of child spans. */ + private spansLocal: types.Span[]; + /** It's trace ID. */ + private traceIdLocal: string; + + /** + * Constructs a new RootSpanImpl instance. + * @param tracer A tracer object. + * @param context A trace options object to build the root span. + */ + constructor(tracer: types.Tracer, context?: types.TraceOptions) { + super(); + this.tracer = tracer; + this.traceIdLocal = + context && context.spanContext && context.spanContext.traceId ? + context.spanContext.traceId : + (uuid.v4().split('-').join('')); + this.name = context && context.name ? context.name : 'undefined'; + if (context && context.spanContext) { + this.parentSpanId = context.spanContext.spanId || ''; + } + this.spansLocal = []; + this.type = context && context.type ? context.type : null; + this.logger = tracer.logger || logger.logger(); + } + + /** Gets span list from rootspan instance. */ + get spans(): types.Span[] { + return this.spansLocal; + } + + /** Gets trace id from rootspan instance. */ + get traceId(): string { + return this.traceIdLocal; + } + + /** Starts a rootspan instance. */ + start() { + super.start(); + this.logger.debug( + 'starting %s %o', this.className, + {traceId: this.traceId, id: this.id, parentSpanId: this.parentSpanId}); + } + + // TODO: review end() behavior if it should throw an error when it is called + // before start() + /** Ends a rootspan instance. */ + end() { + super.end(); + + for (const span of this.spansLocal) { + if (!span.ended && span.started) { + span.truncate(); + } + } + + this.tracer.onEndSpan(this); + } + + + /** + * Starts a new child span in the root span. + * @param name Span name. + * @param type Span type. + * @param parentSpanId Span parent ID. + */ + startChildSpan(name: string, type: string, parentSpanId?: string): + types.Span { + if (this.ended) { + this.logger.debug( + 'calling %s.startSpan() on ended %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return null; + } + if (!this.started) { + this.logger.debug( + 'calling %s.startSpan() on un-started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return null; + } + const newSpan = new Span(this); + if (name) { + newSpan.name = name; + } + if (type) { + newSpan.type = type; + } + newSpan.start(); + this.spansLocal.push(newSpan); + return newSpan; + } +} diff --git a/packages/opencensus-core/src/trace/model/span-base.ts b/packages/opencensus-core/src/trace/model/span-base.ts new file mode 100644 index 000000000..2e0fcb83e --- /dev/null +++ b/packages/opencensus-core/src/trace/model/span-base.ts @@ -0,0 +1,218 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {Logger} from '../../common/types'; +import {Clock} from '../../internal/clock'; +import {randomSpanId} from '../../internal/util'; + +import * as types from './types'; + + +/** Defines a base model for spans. */ +export abstract class SpanBase implements types.Span { + protected className: string; + /** The clock used to mesure the beginning and ending of a span */ + private clock: Clock = null; + /** Indicates if this span was started */ + private startedLocal = false; + /** Indicates if this span was ended */ + private endedLocal = false; + /** Indicates if this span was forced to end */ + private truncated = false; + /** The Span ID of this span */ + readonly id: string; + /** An object to log information to */ + logger: Logger; + /** A set of attributes, each in the format [KEY]:[VALUE] */ + attributes: types.Attributes = {}; + /** A text annotation with a set of attributes. */ + annotations: types.Annotation[] = []; + /** An event describing a message sent/received between Spans */ + messageEvents: types.MessageEvent[] = []; + /** Pointers from the current span to another span */ + links: types.Link[] = []; + /** If the parent span is in another process. */ + remoteParent: boolean; + /** The span ID of this span's parent. If it's a root span, must be empty */ + parentSpanId: string = null; + /** The resource name of the span */ + name: string = null; + /** Type of span. Used to specify additional relationships between spans */ + type: string = null; + /** A final status for this span */ + status: number; + + /** Constructs a new SpanBaseModel instance. */ + constructor() { + this.className = this.constructor.name; + this.id = randomSpanId(); + } + + /** Gets the trace ID. */ + abstract get traceId(): string; + + + /** Indicates if span was started. */ + get started(): boolean { + return this.startedLocal; + } + + /** Indicates if span was ended. */ + get ended(): boolean { + return this.endedLocal; + } + + /** + * Gives a timestamp that indicates the span's start time in RFC3339 UTC + * "Zulu" format. + */ + get startTime(): Date { + if (!this.clock) { + this.logger.debug('calling startTime() on null clock'); + return null; + } + + return this.clock.startTime; + } + + /** + * Gives a timestap that indicates the span's end time in RFC3339 UTC + * "Zulu" format. + */ + get endTime(): Date { + if (!this.clock) { + this.logger.debug('calling endTime() on null clock'); + return null; + } + + return this.clock.endTime; + } + + /** + * Gives a timestap that indicates the span's duration in RFC3339 UTC + * "Zulu" format. + */ + get duration(): number { + if (!this.clock) { + this.logger.debug('calling duration() on null clock'); + return null; + } + + return this.clock.duration; + } + + /** Gives the TraceContext of the span. */ + get spanContext(): types.SpanContext { + return { + traceId: this.traceId.toString(), + spanId: this.id.toString(), + parentSpanId: this.parentSpanId + } as types.SpanContext; + } + + /** + * Adds an atribute to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAttribute(key: string, value: string|number|boolean) { + this.attributes[key] = value; + } + + /** + * Adds an annotation to the span. + * @param description Describes the event. + * @param timestamp A timestamp that maks the event. + * @param attributes A set of attributes on the annotation. + */ + addAnnotation( + description: string, timestamp: number, attributes?: types.Attributes) { + this.annotations.push({ + 'description': description, + 'timestamp': timestamp, + 'attributes': attributes, + } as types.Annotation); + } + + /** + * Adds a link to the span. + * @param traceId The trace ID for a trace within a project. + * @param spanId The span ID for a span within a trace. + * @param type The relationship of the current span relative to the linked. + * @param attributes A set of attributes on the link. + */ + addLink( + traceId: string, spanId: string, type: string, + attributes?: types.Attributes) { + this.links.push({ + 'traceId': traceId, + 'spanId': spanId, + 'type': type, + 'attributes': attributes + } as types.Link); + } + + /** + * Adds a message event to the span. + * @param type The type of message event. + * @param id An identifier for the message event. + */ + addMessageEvent(type: string, id: string) { + this.messageEvents.push({ + 'type': type, + 'id': id, + } as types.MessageEvent); + } + + /** Starts the span. */ + start() { + if (this.started) { + this.logger.debug( + 'calling %s.start() on already started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; + } + this.clock = new Clock(); + this.startedLocal = true; + } + + /** Ends the span. */ + end(): void { + if (this.ended) { + this.logger.debug( + 'calling %s.end() on already ended %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; + } + if (!this.started) { + this.logger.debug( + 'calling %s.end() on un-started %s %o', this.className, + this.className, {id: this.id, name: this.name, type: this.type}); + return; + } + this.startedLocal = false; + this.endedLocal = true; + this.clock.end(); + } + + + /** Forces the span to end. */ + truncate() { + this.truncated = true; + this.end(); + this.logger.debug( + 'truncating %s %o', this.className, {id: this.id, name: this.name}); + } +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts new file mode 100644 index 000000000..9842b199a --- /dev/null +++ b/packages/opencensus-core/src/trace/model/span.ts @@ -0,0 +1,73 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as logger from '../../common/console-logger'; + +import {SpanBase} from './span-base'; +import * as types from './types'; + + +/** Defines a Span. */ +export class Span extends SpanBase implements types.Span { + private root: types.RootSpan; + + /** + * Constructs a new SpanImpl instance. + * @param root + */ + constructor(root: types.RootSpan) { + super(); + this.root = root; + this.logger = this.root.logger || logger.logger(); + } + + /** Gets trace id of span. */ + get traceId(): string { + return this.root.traceId; + } + + /** Gets trace context of span. */ + get spanContext(): types.SpanContext { + return { + traceId: this.traceId.toString(), + spanId: this.id.toString(), + options: 1 // always traced + }; + } + + /** Starts the span instance. */ + start() { + super.start(); + this.logger.debug( + 'starting span %o', + {traceId: this.traceId, spanId: this.id, name: this.name}); + } + + + + /** Ends the span. */ + end(): void { + super.end(); + this.logger.debug('ending span %o', { + spanId: this.id, + traceId: this.traceId, + name: this.name, + startTime: this.startTime, + endTime: this.endTime, + duration: this.duration + }); + } +} diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts new file mode 100644 index 000000000..4d5267e15 --- /dev/null +++ b/packages/opencensus-core/src/trace/model/tracer.ts @@ -0,0 +1,223 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as logger from '../../common/console-logger'; +import * as loggerTypes from '../../common/types'; +import * as cls from '../../internal/cls'; +import * as configTypes from '../config/types'; +import {Sampler} from '../sampler/sampler'; +import * as samplerTypes from '../sampler/types'; + +import {RootSpan} from './root-span'; +import {Span} from './span'; +import * as types from './types'; + + +/** + * This class represent a tracer. + */ +export class Tracer implements types.Tracer { + /** Indicates if the tracer is active */ + private activeLocal: boolean; + /** Manage context automatic propagation */ + private contextManager: cls.Namespace; + /** A configuration for starting the tracer */ + private config: configTypes.TracerConfig; + /** A list of end span event listeners */ + private eventListenersLocal: types.OnEndSpanEventListener[] = []; + /** A list of ended root spans */ + private endedTraces: types.RootSpan[] = []; + /** Bit to represent whether trace is sampled or not. */ + private readonly IS_SAMPLED = 0x1; + /** A sampler used to make sample decisions */ + sampler: samplerTypes.Sampler; + /** A configuration for starting the tracer */ + logger: loggerTypes.Logger = logger.logger(); + + + /** Constructs a new TraceImpl instance. */ + constructor() { + this.activeLocal = false; + this.contextManager = cls.createNamespace(); + this.clearCurrentTrace(); + } + + /** Gets the current root span. */ + get currentRootSpan(): types.RootSpan { + return this.contextManager.get('rootspan'); + } + + /** Sets the current root span. */ + set currentRootSpan(root: types.RootSpan) { + this.contextManager.set('rootspan', root); + } + + /** + * Starts a tracer. + * @param config A tracer configuration object to start a tracer. + */ + start(config: configTypes.TracerConfig): types.Tracer { + this.activeLocal = true; + this.config = config; + this.logger = this.config.logger || logger.logger(); + this.sampler = new Sampler().probability(config.samplingRate); + return this; + } + + /** Stops the tracer. */ + stop(): types.Tracer { + this.activeLocal = false; + return this; + } + + /** Gets the list of event listners. */ + get eventListeners(): types.OnEndSpanEventListener[] { + return this.eventListenersLocal; + } + + /** Indicates if the tracer is active or not. */ + get active(): boolean { + return this.activeLocal; + } + + /** + * Starts a root span. + * @param options A TraceOptions object to start a root span. + * @param fn A callback function to run after starting a root span. + */ + startRootSpan( + options: types.TraceOptions, fn: (root: types.RootSpan) => T): T { + return this.contextManager.runAndReturn((root) => { + let newRoot = null; + if (this.active) { + let propagatedSample = null; + + // if there is a context propagation, keep the decistion + if (options && options.spanContext) { + if (options.spanContext.options) { + propagatedSample = + ((options.spanContext.options & this.IS_SAMPLED) !== 0); + } + if (!propagatedSample) { + options.spanContext = null; + } + } + const aRoot = new RootSpan(this, options); + const sampleDecision: boolean = propagatedSample ? + propagatedSample : + this.sampler.shouldSample(aRoot.traceId); + + if (sampleDecision) { + aRoot.start(); + this.currentRootSpan = aRoot; + newRoot = aRoot; + } + } else { + this.logger.debug('Tracer is inactive, can\'t start new RootSpan'); + } + return fn(newRoot); + }); + } + + /** + * Is called when a span is ended. + * @param root The ended span. + */ + onEndSpan(root: types.RootSpan): void { + if (this.active) { + if (!root) { + return this.logger.debug('cannot end trace - no active trace found'); + } + if (this.currentRootSpan !== root) { + this.logger.debug( + 'currentRootSpan != root on notifyEnd. Need more investigation.'); + } + this.notifyEndSpan(root); + } + } + + /** + * Registers an end span event listener. + * @param listener The listener to register. + */ + registerEndSpanListener(listner: types.OnEndSpanEventListener) { + this.eventListenersLocal.push(listner); + } + + private notifyEndSpan(root: types.RootSpan) { + if (this.active) { + this.logger.debug('starting to notify listeners the end of rootspans'); + if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { + for (const listener of this.eventListenersLocal) { + listener.onEndSpan(root); + } + } + } else { + this.logger.debug('this tracer is inactivate cant notify endspan'); + } + } + + /** Clears the current root span. */ + clearCurrentTrace() { + this.currentRootSpan = null; + } + + /** + * Starts a span. + * @param name The span name. + * @param type The span type. + */ + startChildSpan(name?: string, type?: string): types.Span { + let newSpan: types.Span = null; + if (!this.currentRootSpan) { + this.logger.debug( + 'no current trace found - must start a new root span first'); + } else { + newSpan = this.currentRootSpan.startChildSpan(name, type); + } + return newSpan; + } + + /** + * Binds the trace context to the given function. + * This is necessary in order to create child spans correctly in functions + * that are called asynchronously (for example, in a network response + * handler). + * @param fn A function to which to bind the trace context. + */ + wrap(fn: types.Func): types.Func { + if (!this.active) { + return fn; + } + const namespace = this.contextManager; + return namespace.bind(fn); + } + + /** + * Binds the trace context to the given event emitter. + * This is necessary in order to create child spans correctly in event + * handlers. + * @param emitter An event emitter whose handlers should have + * the trace context binded to them. + */ + wrapEmitter(emitter: NodeJS.EventEmitter): void { + if (!this.active) { + return; + } + const namespace = this.contextManager; + namespace.bindEmitter(emitter); + } +} diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts new file mode 100644 index 000000000..5bf8e3509 --- /dev/null +++ b/packages/opencensus-core/src/trace/model/types.ts @@ -0,0 +1,277 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as loggerTypes from '../../common/types'; +import * as configTypes from '../config/types'; +import * as samplerTypes from '../sampler/types'; + + + +/** Default type for functions */ +// tslint:disable:no-any +export type Func = (...args: any[]) => T; + +/** Maps a label to a string, number or boolean. */ +export interface Attributes { [attributeKey: string]: string|number|boolean; } + +/** A text annotation with a set of attributes. */ +export interface Annotation { + /** A user-supplied message describing the event. */ + description: string; + /** A timestamp that maks the event. */ + timestamp: number; + /** A set of attributes on the annotation. */ + attributes: Attributes; +} + +/** An event describing a message sent/received between Spans. */ +export interface MessageEvent { + /** Indicates whether the message was sent or received. */ + type: string; + /** An identifier for the MessageEvent's message. */ + id: string; +} + +/** + * A pointer from the current span to another span in the same trace or in a + * different trace. + */ +export interface Link { + /** The trace ID for a trace within a project. */ + traceId: string; + /** The span ID for a span within a trace. */ + spanId: string; + /** The relationship of the current span relative to the linked. */ + type: string; + /** A set of attributes on the link. */ + attributes: Attributes; +} + +/** Defines the trace options */ +export interface TraceOptions { + /** Root span name */ + name: string; + /** Trace context */ + spanContext?: SpanContext; + /** Span type */ + type?: string; +} + +/** Defines the span context */ +export interface SpanContext { + /** Trace ID */ + traceId: string; + /** Span ID */ + spanId: string; + /** Options */ + options?: number; +} + +/** Defines an end span event listener */ +export interface OnEndSpanEventListener { + /** Happens when a span is ended */ + onEndSpan(span: RootSpan): void; +} + +/** Interface for Span */ +export interface Span { + /** The Span ID of this span */ + readonly id: string; + + /** If the parent span is in another process. */ + remoteParent: boolean; + + /** The span ID of this span's parent. If it's a root span, must be empty */ + parentSpanId: string; + + /** The resource name of the span */ + name: string; + + /** Type of span. Used to specify additional relationships between spans */ + type: string; + + /** An object to log information to */ + logger: loggerTypes.Logger; + + /** A final status for this span */ + status: number; + + /** A set of attributes, each in the format [KEY]:[VALUE] */ + attributes: Attributes; + + /** A text annotation with a set of attributes. */ + annotations: Annotation[]; + + /** An event describing a message sent/received between Spans. */ + messageEvents: MessageEvent[]; + + /** Pointers from the current span to another span */ + links: Link[]; + + /** Constructs a new SpanBaseModel instance. */ + readonly traceId: string; + + /** Indicates if span was started. */ + readonly started: boolean; + + /** Indicates if span was ended. */ + readonly ended: boolean; + + /** + * Gives a timestap that indicates the span's start time in RFC3339 UTC + * "Zulu" format. + */ + readonly startTime: Date; + + /** + * Gives a timestap that indicates the span's end time in RFC3339 UTC + * "Zulu" format. + */ + readonly endTime: Date; + + /** + * Gives a timestap that indicates the span's duration in RFC3339 UTC + * "Zulu" format. + */ + readonly duration: number; + + /** Gives the TraceContext of the span. */ + readonly spanContext: SpanContext; + + /** + * Adds an atribute to the span. + * @param key Describes the value added. + * @param value The result of an operation. + */ + addAttribute(key: string, value: string): void; + + /** + * Adds an annotation to the span. + * @param description Describes the event. + * @param timestamp A timestamp that maks the event. + * @param attributes A set of attributes on the annotation. + */ + addAnnotation( + description: string, timestamp: number, attributes?: Attributes): void; + + /** + * Adds a link to the span. + * @param traceId The trace ID for a trace within a project. + * @param spanId The span ID for a span within a trace. + * @param type The relationship of the current span relative to the linked. + * @param attributes A set of attributes on the link. + */ + addLink( + traceId: string, spanId: string, type: string, + attributes?: Attributes): void; + + /** + * Adds a message event to the span. + * @param type The type of message event. + * @param id An identifier for the message event. + */ + addMessageEvent(type: string, id: string): void; + + /** Starts a span. */ + start(): void; + + /** Ends a span. */ + end(): void; + + /** Forces to end a span. */ + truncate(): void; +} + +/** Interface for RootSpan */ +export interface RootSpan extends Span { + /** Get the span list from RootSpan instance */ + readonly spans: Span[]; + + /** Starts a new Span instance in the RootSpan instance */ + startChildSpan(name: string, type: string): Span; +} + + +/** Interface for Tracer */ +export interface Tracer extends OnEndSpanEventListener { + /** Get and set the currentRootSpan to tracer instance */ + currentRootSpan: RootSpan; + + /** A sampler that will decide if the span will be sampled or not */ + sampler: samplerTypes.Sampler; + + /** A configuration for starting the tracer */ + logger: loggerTypes.Logger; + + /** Get the eventListeners from tracer instance */ + readonly eventListeners: OnEndSpanEventListener[]; + + /** Get the active status from tracer instance */ + readonly active: boolean; + + /** + * Start a tracer instance + * @param config Configuration for tracer instace + * @returns A tracer instance started + */ + start(config: configTypes.TracerConfig): Tracer; + + /** Stop the tracer instance */ + stop(): Tracer; + + /** + * Start a new RootSpan to currentRootSpan + * @param options Options for tracer instance + * @param fn Callback function + * @returns The callback return + */ + startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; + + /** + * Start a new Span instance to the currentRootSpan + * @param name Span name + * @param type Span type + * @returns The new Span instance started + */ + startChildSpan(name?: string, type?: string): Span; + + /** + * Register a OnEndSpanEventListener on the tracer instance + * @param listener An OnEndSpanEventListener instance + */ + registerEndSpanListener(listener: OnEndSpanEventListener): void; + + /** Clear the currentRootSpan from tracer instance */ + clearCurrentTrace(): void; + + /** + * Binds the trace context to the given function. + * This is necessary in order to create child spans correctly in functions + * that are called asynchronously (for example, in a network response + * handler). + * @param fn A function to which to bind the trace context. + */ + wrap(fn: Func): Func; + + /** + * Binds the trace context to the given event emitter. + * This is necessary in order to create child spans correctly in event + * handlers. + * @param emitter An event emitter whose handlers should have + * the trace context binded to them. + */ + wrapEmitter(emitter: NodeJS.EventEmitter): void; +} diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts new file mode 100644 index 000000000..91ed245c4 --- /dev/null +++ b/packages/opencensus-core/src/trace/sampler/sampler.ts @@ -0,0 +1,90 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {randomSpanId} from '../../internal/util'; +import * as types from './types'; + + +const MIN_NUMBER = Number.MIN_VALUE; +const MAX_NUMBER = Number.MAX_VALUE; + + +/** This class represent the probability of a tracer. */ +export class Sampler implements types.Sampler { + private idUpperBound: number; + description: string; + + /** + * Constructs a new Sampler instance. + */ + constructor() {} + + /** + * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1 + * @returns a Sampler object + */ + always(): Sampler { + this.description = 'always'; + this.idUpperBound = MAX_NUMBER; + return this; + } + + /** + * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0 + * @returns a Sampler object + */ + never(): Sampler { + this.description = 'never'; + this.idUpperBound = MIN_NUMBER; + return this; + } + + /** + * Sets idUpperBound with the probability. If probability + * parameter is bigger then 1 set always. If probability parameter less + * than 0, set never. + * @param probability probability between 0 and 1 + * @returns a Sampler object + */ + probability(probability: number): Sampler { + if (probability >= 1.0) { + return this.always(); + } else if (probability <= 0) { + return this.never(); + } + this.description = `probability.(${probability})`; + this.idUpperBound = probability * MAX_NUMBER; + return this; + } + + /** + * Checks if trace belong the sample. + * @param traceId Used to check the probability + * @returns a boolean. True if the traceId is in probability + * False if the traceId is not in probability. + */ + shouldSample(traceId: string): boolean { + const LOWER_BYTES = traceId ? traceId.substring(16) : '0'; + // tslint:disable-next-line:ban Needed to parse hexadecimal. + const LOWER_LONG = parseInt(LOWER_BYTES, 16); + + if (LOWER_LONG <= this.idUpperBound) { + return true; + } else { + return false; + } + } +} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/sampler/types.ts b/packages/opencensus-core/src/trace/sampler/types.ts new file mode 100644 index 000000000..4942aa4dc --- /dev/null +++ b/packages/opencensus-core/src/trace/sampler/types.ts @@ -0,0 +1,55 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {Logger} from '../../common/types'; +import {Exporter} from '../../exporters/types'; +import {PluginNames} from '../instrumentation/types'; + +/** This interface represent the probability of a tracer. */ +export interface Sampler { + /** + * A Sampler description name + */ + description: string; + /** + * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1. + * @returns a Sampler object. + */ + always(): Sampler; + + /** + * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0. + * @returns a Sampler object. + */ + never(): Sampler; + + /** + * Sets idUpperBound with the probability. If probability + * parameter is bigger then 1 set always. If probability parameter less + * than 0, set never. + * @param probability probability between 0 and 1. + * @returns a Sampler object. + */ + probability(probability: number): Sampler; + + /** + * Checks if trace belong the sample. + * @param traceId Used to check the probability. + * @returns a boolean. True if the traceId is in probability + * False if the traceId is not in probability. + */ + shouldSample(traceId: string): boolean; +} diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts new file mode 100644 index 000000000..77f1bb864 --- /dev/null +++ b/packages/opencensus-core/src/trace/types.ts @@ -0,0 +1,47 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as exportersTypes from '../exporters/types'; + +import * as configTypes from './config/types'; +import * as modelTypes from './model/types'; +import * as samplerTypes from './sampler/types'; + +/** Main interface for tracing. */ +export interface Tracing { + /** Object responsible for managing a trace. */ + readonly tracer: modelTypes.Tracer; + + /** Service to send collected traces to. */ + readonly exporter: exportersTypes.Exporter; + + /** + * Enables the tracing process. + * @param userConfig A configuration object. + * @returns The tracing object. + */ + start(userConfig?: configTypes.Config): Tracing; + + /** Stops tracing. */ + stop(): void; + + /** + * Registers an exporter to send the collected traces to. + * @param exporter The exporter to send the traces to. + * @returns The tracing object. + */ + registerExporter(exporter: exportersTypes.Exporter): Tracing; +} diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts new file mode 100644 index 000000000..82bc79a2e --- /dev/null +++ b/packages/opencensus-core/test/test-console-exporter.ts @@ -0,0 +1,100 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {ConsoleExporter, NoopExporter} from '../src/exporters/console-exporter'; +import {ExporterBuffer} from '../src/exporters/exporter-buffer'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; + +const tracer = new Tracer().start({}); +const DEFAULT_BUFFER_SIZE = 3; +const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds +const defaultBufferConfig = { + bufferSize: DEFAULT_BUFFER_SIZE, + bufferTimeout: DEFAULT_BUFFER_TIMEOUT +}; + +const createRootSpans = (): RootSpan[] => { + const rootSpans = []; + for (let i = 0; i < DEFAULT_BUFFER_SIZE + 1; i++) { + const rootSpan = new RootSpan(tracer, {name: `rootSpan.${i}`}); + rootSpan.start(); + for (let j = 0; j < 10; j++) { + rootSpan.startChildSpan(`childSpan.${i}.${j}`, 'client'); + } + rootSpans.push(rootSpan); + } + return rootSpans; +}; + + +describe('NoopExporter', () => { + /** Should do nothing when calling onEndSpan() */ + describe('onEndSpan()', () => { + it('should do anything', () => { + const exporter = new NoopExporter(); + const rootSpan = new RootSpan(tracer); + exporter.onEndSpan(rootSpan); + assert.ok(true); + }); + }); + + /** Should do anything when calling publish() */ + describe('publish()', () => { + it('should do anything', () => { + const exporter = new NoopExporter(); + const rootSpan = new RootSpan(tracer); + const queue: RootSpan[] = []; + queue.push(rootSpan); + + exporter.publish(queue); + assert.ok(true); + }); + }); +}); + +describe('ConsoleLogExporter', () => { + /** Should end a span */ + describe('onEndSpan()', () => { + it('should end a span', () => { + const exporter = new ConsoleExporter(defaultBufferConfig); + tracer.registerEndSpanListener(exporter); + // const rootSpan = new RootSpan(tracer); + const rootSpans = createRootSpans(); + for (const rootSpan of rootSpans) { + rootSpan.end(); + } + assert.ok(true); + }); + }); + + /** Should publish the rootspan in queue */ + describe('publish()', () => { + it('should publish the rootspans in queue', () => { + const exporter = new ConsoleExporter(defaultBufferConfig); + const rootSpan = new RootSpan(tracer); + rootSpan.startChildSpan('name', 'type', rootSpan.traceId); + const queue: RootSpan[] = []; + queue.push(rootSpan); + + exporter.publish(queue); + assert.ok(true); + }); + }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts new file mode 100644 index 000000000..7f28435d3 --- /dev/null +++ b/packages/opencensus-core/test/test-console-logger.ts @@ -0,0 +1,154 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import * as logger from '../src/common/console-logger'; +import {ConsoleLogger} from '../src/common/console-logger'; +import {Logger} from '../src/common/types'; + + +const LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; +let consoleTxt = ''; + +// TODO: Review test cases: Maybe testing the info log level is sufficient +// because it already shows that lower levels will log, and higher levels won't. + +describe('ConsoleLogger', () => { + const intercept = require('intercept-stdout'); + const unhookIntercept = intercept((txt) => { + consoleTxt = txt; + return txt; + }); + + /** Should create a new ConsoleLogger */ + describe('new ConsoleLogger()', () => { + it('should log with default levels', () => { + const consoleLogger = logger.logger(); + assert.equal(LEVELS.length, ConsoleLogger.LEVELS.length); + }); + + it('should log with error', () => { + const consoleLogger = logger.logger(1); + assert.strictEqual(LEVELS[1], consoleLogger.level); + }); + }); + + /** Should logger only error log */ + describe('error logger', () => { + const consoleLogger = logger.logger(LEVELS[1]); + + it('should log error', () => { + consoleTxt = ''; + consoleLogger.error('error test logger'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('error'); + + assert.ok(validateString >= 0); + }); + + it('should not log warn', () => { + consoleTxt = ''; + consoleLogger.warn('warn test logger'); + unhookIntercept(); + + const validateString = consoleTxt.indexOf('warn'); + + assert.equal(validateString, -1); + }); + + it('should not log info', () => { + consoleTxt = ''; + consoleLogger.info('info test logger'); + unhookIntercept(); + + const validateString = consoleTxt.indexOf('info'); + + assert.equal(validateString, -1); + }); + + it('should not log debug', () => { + consoleTxt = ''; + consoleLogger.debug('debug test logger'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('debug'); + + assert.equal(validateString, -1); + }); + + it('should not log silly', () => { + consoleTxt = ''; + consoleLogger.silly('silly test logger'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('silly'); + + assert.equal(validateString, -1); + }); + }); + + /** Should disable logger */ + describe('silent logger', () => { + const consoleLogger = logger.logger(0); + + it('should not log error', () => { + consoleTxt = ''; + consoleLogger.error('error test logger'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('error'); + + assert.equal(validateString, -1); + }); + + it('should not log warn', () => { + consoleTxt = ''; + consoleLogger.warn('warn test logger'); + unhookIntercept(); + + const validateString = consoleTxt.indexOf('warn'); + + assert.equal(validateString, -1); + }); + + it('should not log info', () => { + consoleTxt = ''; + consoleLogger.info('info test logger'); + unhookIntercept(); + + const validateString = consoleTxt.indexOf('info'); + + assert.equal(validateString, -1); + }); + + it('should not log debug', () => { + consoleTxt = ''; + consoleLogger.debug('debug test logger'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('debug'); + + assert.equal(validateString, -1); + }); + + it('should not log silly', () => { + consoleTxt = ''; + consoleLogger.silly('silly test logger'); + unhookIntercept(); + const validateString = consoleTxt.indexOf('silly'); + + assert.equal(validateString, -1); + }); + }); +}); diff --git a/packages/opencensus-core/test/test-exporter-buffer.ts b/packages/opencensus-core/test/test-exporter-buffer.ts new file mode 100644 index 000000000..bf0fb68ed --- /dev/null +++ b/packages/opencensus-core/test/test-exporter-buffer.ts @@ -0,0 +1,117 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import * as logger from '../src/common/console-logger'; +import {NoopExporter} from '../src/exporters/console-exporter'; +import {ExporterBuffer} from '../src/exporters/exporter-buffer'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; + + +const exporter = new NoopExporter(); +const DEFAULT_BUFFER_SIZE = 3; +const DEFAULT_BUFFER_TIMEOUT = 2000; // time in milliseconds +const tracer = new Tracer().start({}); + +const defaultBufferConfig = { + bufferSize: DEFAULT_BUFFER_SIZE, + bufferTimeout: DEFAULT_BUFFER_TIMEOUT, + logger: logger.logger() +}; + + +const createRootSpans = (num: number): RootSpan[] => { + const rootSpans = []; + for (let i = 0; i < num; i++) { + const rootSpan = new RootSpan(tracer, {name: `rootSpan.${i}`}); + rootSpan.start(); + for (let j = 0; j < 10; j++) { + rootSpan.startChildSpan(`childSpan.${i}.${j}`, 'client'); + } + rootSpans.push(rootSpan); + } + return rootSpans; +}; + +describe('ExporterBuffer', () => { + /** + * Should create a Buffer with exporter, DEFAULT_BUFFER_SIZE and + * DEFAULT_BUFFER_TIMEOUT + */ + describe('new ExporterBuffer()', () => { + it('should create a Buffer instance', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + assert.ok(buffer instanceof ExporterBuffer); + }); + }); + + /** + * Should return the Buffer + */ + describe('setBufferSize', () => { + it('should set BufferSize', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + const newBufferSize = DEFAULT_BUFFER_SIZE + 10; + const bufferResize = buffer.setBufferSize(newBufferSize); + assert.ok(bufferResize instanceof ExporterBuffer); + assert.strictEqual(bufferResize.getBufferSize(), newBufferSize); + }); + }); + + /** + * Should add one item to the Buffer + */ + describe('addToBuffer', () => { + it('should add one item to the Buffer', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + buffer.addToBuffer(new RootSpan(tracer)); + assert.strictEqual(buffer.getQueue().length, 1); + }); + }); + + /** + * Should force flush + */ + describe('addToBuffer force flush ', () => { + it('should force flush', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + const rootSpans = createRootSpans(DEFAULT_BUFFER_SIZE); + for (const rootSpan of rootSpans) { + buffer.addToBuffer(rootSpan); + } + assert.strictEqual(buffer.getQueue().length, buffer.getBufferSize()); + buffer.addToBuffer(new RootSpan(tracer)); + assert.strictEqual(buffer.getQueue().length, 0); + }); + }); + + /** + * Should flush by timeout + */ + describe('addToBuffer force flush by timeout ', () => { + it('should flush by timeout', () => { + const buffer = new ExporterBuffer(exporter, defaultBufferConfig); + buffer.addToBuffer(new RootSpan(tracer)); + assert.strictEqual(buffer.getQueue().length, 1); + setTimeout(() => { + assert.strictEqual(buffer.getQueue().length, 0); + }, DEFAULT_BUFFER_TIMEOUT + 100); + }); + }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts new file mode 100644 index 000000000..2a4112224 --- /dev/null +++ b/packages/opencensus-core/test/test-root-span.ts @@ -0,0 +1,256 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {RootSpan} from '../src/trace/model/root-span'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import {Annotation, Attributes, Link, MessageEvent, TraceOptions} from '../src/trace/model/types'; + +const tracer = new Tracer(); + +describe('RootSpan', () => { + /** + * Should create a RootSpan instance + */ + describe('new RootSpan()', () => { + it('should create a RootSpan instance', () => { + const root = new RootSpan(tracer); + assert.ok(root instanceof RootSpan); + }); + }); + + /** + * Should create a RootSpan instance with options + */ + describe('new RootSpan() with options', () => { + it('should create a RootSpan instance with options', () => { + const trace = new RootSpan(tracer); + const options = {name: 'test', spanContext: trace.spanContext} as + TraceOptions; + const root = new RootSpan(tracer, options); + assert.ok(root instanceof RootSpan); + }); + }); + + /** + * Should get span list from rootspan instance + */ + describe('get spans()', () => { + it('should get span list from rootspan instance', () => { + const root = new RootSpan(tracer); + // TODO: Suggetion: make sure that root.spans.length is 1, + // and that it's the same as the earlier (shadowed) span object + root.start(); + const span = root.startChildSpan('spanName', 'spanType'); + assert.strictEqual(root.spans.length, 1); + assert.strictEqual(span, root.spans[0]); + + for (const span of root.spans) { + assert.ok(span instanceof Span); + } + }); + }); + + /** + * Should get trace id from rootspan instance + */ + describe('new traceId()', () => { + it('should get trace id from rootspan instance', () => { + const root = new RootSpan(tracer); + assert.equal(root.traceId, root.spanContext.traceId); + }); + }); + + /** + * Should create and start a RootSpan instance + */ + describe('start()', () => { + it('should start a RootSpan instance', () => { + const root = new RootSpan(tracer); + root.start(); + assert.ok(root.started); + }); + }); + + /** + * Should create and start a new span instance + */ + describe('startSpan()', () => { + let root, span; + + before(() => { + root = new RootSpan(tracer); + root.start(); + span = root.startChildSpan('spanName', 'spanType'); + }); + + it('should create span instance', () => { + assert.ok(span instanceof Span); + }); + + it('should start a span instance', () => { + assert.ok(span.started); + }); + }); + + /** + * Should not start a span from a not started rootspan + */ + describe('startSpan() before start rootspan', () => { + it('should not create span', () => { + const root = new RootSpan(tracer); + const span = root.startChildSpan('spanName', 'spanType'); + assert.strictEqual(span, null); + }); + }); + + /** + * Should not create a span from a ended rootspan + */ + describe('startSpan() after rootspan ended', () => { + it('should not create span', () => { + const root = new RootSpan(tracer); + root.start(); + root.end(); + const span = root.startChildSpan('spanName', 'spanType'); + assert.strictEqual(span, null); + }); + }); + + /** + * Should end a rootspan instance + */ + describe('end()', () => { + it('should end the rootspan instance', () => { + const root = new RootSpan(tracer); + root.start(); + root.end(); + assert.ok(root.ended); + }); + }); + + /** + * Should not end a rootspan which was not started + */ + describe('end() before start rootspan', () => { + it('should not end rootspan', () => { + const root = new RootSpan(tracer); + root.end(); + assert.ok(!root.ended); + }); + }); + + /** + * Should end all spans inside rootspan + */ + describe('end() before end all spans', () => { + it('should end all spans inside rootspan', () => { + const root = new RootSpan(tracer); + root.start(); + const span = root.startChildSpan('spanName', 'spanType'); + root.end(); + + for (const span of root.spans) { + assert.ok(span.ended); + } + }); + }); + + + /** + * Should add an attrinbutes + */ + describe('addAtribute()', () => { + it('should add an attribute', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + ['String', 'Number', 'Boolean'].map(attType => { + rootSpan.addAttribute('testKey' + attType, 'testValue' + attType); + assert.equal( + rootSpan.attributes['testKey' + attType], 'testValue' + attType); + }); + }); + }); + + /** + * Should add an annotation + */ + describe('addAnnotation()', () => { + it('should add an annotation', () => { + // tslint:disable:no-any + function instanceOfAnnotation(object: any): object is Annotation { + return 'description' in object && 'timestamp' in object && + 'attributes' in object; + } + + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + rootSpan.addAnnotation('description test', Date.now(), {} as Attributes); + + assert.ok(rootSpan.annotations.length > 0); + assert.ok(instanceOfAnnotation(rootSpan.annotations[0])); + }); + }); + + /** + * Should add a Link. + */ + describe('addLink()', () => { + it('should add a Link', () => { + // tslint:disable:no-any + function instanceOfLink(object: any): object is Link { + return 'traceId' in object && 'spanId' in object && 'type' in object; + } + + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.start(); + + const LINK_TYPE = 'CHILD_LINKED_SPAN'; + rootSpan.addLink(rootSpan.traceId, span.id, LINK_TYPE); + + assert.ok(rootSpan.links.length > 0); + assert.ok(instanceOfLink(rootSpan.links[0])); + }); + }); + + /** + * Should add a Message Event. + */ + describe('addMessageEvent()', () => { + it('should add a Message Event', () => { + // tslint:disable:no-any + function instanceOfLink(object: any): object is Link { + return 'type' in object && 'id' in object; + } + + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + rootSpan.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); + + assert.ok(rootSpan.messageEvents.length > 0); + assert.ok(instanceOfLink(rootSpan.messageEvents[0])); + }); + }); +}); diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts new file mode 100644 index 000000000..d7dc1195c --- /dev/null +++ b/packages/opencensus-core/test/test-sampler.ts @@ -0,0 +1,87 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {RootSpan} from '../src/trace/model/root-span'; +import {Tracer} from '../src/trace/model/tracer'; +import {Sampler} from '../src/trace/sampler/sampler'; + +const tracer = new Tracer(); + +describe('Sampler', () => { + /** + * Should return true + */ + describe('shouldSample() always', () => { + it('should return true', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler(); + sampler.always(); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.ok(samplerShouldSampler); + }); + it('should return a always sampler for 1', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(1); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'always'); + assert.ok(samplerShouldSampler); + }); + it('should return a always sampler for >1', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(100); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'always'); + assert.ok(samplerShouldSampler); + }); + }); + /** + * Should return false + */ + describe('shouldSample() never', () => { + it('should return false', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler(); + sampler.never(); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.ok(!samplerShouldSampler); + }); + it('should return a never sampler for 0', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(0); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'never'); + assert.ok(!samplerShouldSampler); + }); + it('should return a never sampler for negative value', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(-1); + const samplerShouldSampler = sampler.shouldSample(root.traceId); + assert.strictEqual(sampler.description, 'never'); + assert.ok(!samplerShouldSampler); + }); + }); + + describe('shouldSample() never', () => { + it('should return a probability sampler', () => { + const root = new RootSpan(tracer); + const sampler = new Sampler().probability(0.7); + assert.ok(sampler.description.indexOf('probability') >= 0); + }); + }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts new file mode 100644 index 000000000..0e987ca39 --- /dev/null +++ b/packages/opencensus-core/test/test-span.ts @@ -0,0 +1,262 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import * as mocha from 'mocha'; + +import {RootSpan} from '../src/trace/model/root-span'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import {Annotation, Attributes, Link, MessageEvent} from '../src/trace/model/types'; + + +// TODO: we should evaluate a way to merge similar test cases between span and +// rootspan + +const tracer = new Tracer(); + +describe('Span', () => { + /** + * Should create a span + */ + describe('new Span()', () => { + it('should create a Span instance', () => { + const rootSpan = new RootSpan(tracer); + const span = new Span(rootSpan); + assert.ok(span instanceof Span); + }); + }); + + /** + * Should return the Trace ID + */ + describe('get traceId()', () => { + it('should return the trace id', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + const span = new Span(rootSpan); + assert.equal(span.traceId, rootSpan.traceId); + }); + }); + + /** + * Should the span context of span + */ + describe('get spanContext', () => { + it('should the span context of span', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + const context = span.spanContext; + + assert.equal(context.traceId, rootSpan.traceId); + assert.equal(context.spanId, span.id); + assert.equal(context.options, 1); + }); + }); + + /** + * startTime, endTime and durantion proprieties called before start() - no + * clock instance created + */ + describe('get time properties before start()', () => { + let span; + before(() => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + span = new Span(rootSpan); + }); + it('should get startTime() return null', () => { + assert.strictEqual(span.startTime, null); + }); + it('should get endTime() return null', () => { + assert.strictEqual(span.endTime, null); + }); + it('should get duration() return null', () => { + assert.strictEqual(span.duration, null); + }); + }); + + /** + * Should start a span instance + */ + describe('start()', () => { + it('should start a span instance', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.start(); + + assert.ok(span.started); + }); + }); + + /** + * Should not change the initial startTime + */ + describe('start() an already started span', () => { + it('should not change the initial startTime', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + const span = new Span(rootSpan); + span.start(); + const initialStartTime = span.startTime; + span.start(); + + assert.equal(span.startTime, initialStartTime); + }); + }); + + /** + * Should end a span instance + */ + describe('end()', () => { + it('should end a span instance', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.start(); + span.end(); + + assert.ok(span.ended); + }); + }); + + /** + * Should not end a span instance + */ + describe('end() before start()', () => { + it('should not end a span instance', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.end(); + + assert.ok(!span.ended); + }); + }); + + /** + * Should not change the endTime + */ + describe('end() an already ended span', () => { + it('should not change the endTime', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + const span = new Span(rootSpan); + span.start(); + span.end(); + const initialEndTime = span.endTime; + span.end(); + + assert.equal(span.endTime.getTime(), initialEndTime.getTime()); + }); + }); + + /** + * Should add an attrinbutes + */ + describe('addAtribute()', () => { + it('should add an attribute', () => { + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.start(); + + ['String', 'Number', 'Boolean'].map(attType => { + span.addAttribute('testKey' + attType, 'testValue' + attType); + assert.equal( + span.attributes['testKey' + attType], 'testValue' + attType); + }); + }); + }); + + /** + * Should add an annotation + */ + describe('addAnnotation()', () => { + it('should add an annotation', () => { + // tslint:disable:no-any + function instanceOfAnnotation(object: any): object is Annotation { + return 'description' in object && 'timestamp' in object && + 'attributes' in object; + } + + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.start(); + + span.addAnnotation('description test', Date.now(), {} as Attributes); + + assert.ok(span.annotations.length > 0); + assert.ok(instanceOfAnnotation(span.annotations[0])); + }); + }); + + /** + * Should add a Link. + */ + describe('addLink()', () => { + it('should add a Link', () => { + // tslint:disable:no-any + function instanceOfLink(object: any): object is Link { + return 'traceId' in object && 'spanId' in object && 'type' in object; + } + + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.start(); + + const LINK_TYPE = 'PARENT_LINKED_SPAN'; + span.addLink(span.traceId, rootSpan.id, LINK_TYPE); + + assert.ok(span.links.length > 0); + assert.ok(instanceOfLink(span.links[0])); + }); + }); + + /** + * Should add a Message Event. + */ + describe('addMessageEvent()', () => { + it('should add a Message Event', () => { + // tslint:disable:no-any + function instanceOfLink(object: any): object is Link { + return 'type' in object && 'id' in object; + } + + const rootSpan = new RootSpan(tracer); + rootSpan.start(); + + const span = new Span(rootSpan); + span.start(); + + span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); + + assert.ok(span.messageEvents.length > 0); + assert.ok(instanceOfLink(span.messageEvents[0])); + }); + }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts new file mode 100644 index 000000000..a5d486ed2 --- /dev/null +++ b/packages/opencensus-core/test/test-tracer.ts @@ -0,0 +1,287 @@ +/** + * Copyright 2018, OpenCensus Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import {EventEmitter} from 'events'; +import * as uuid from 'uuid'; + +import {randomSpanId} from '../src/internal/util'; +import {TracerConfig} from '../src/trace/config/types'; +import {RootSpan} from '../src/trace/model/root-span'; +import {Span} from '../src/trace/model/span'; +import {Tracer} from '../src/trace/model/tracer'; +import * as types from '../src/trace/model/types'; +import {OnEndSpanEventListener} from '../src/trace/model/types'; + +class OnEndSpanClass implements OnEndSpanEventListener { + /** Counter for test use */ + testCount = 0; + /** Happens when a span is ended */ + onEndSpan(span: RootSpan): void { + this.testCount++; + } +} + +const defaultConfig: TracerConfig = { + samplingRate: 1.0 // always sampler +}; + +describe('Tracer', () => { + const options = {name: 'test'}; + + /** Should create a Tracer instance */ + describe('new Tracer()', () => { + it('should create a Tracer instance', () => { + const tracer = new Tracer(); + assert.ok(tracer instanceof Tracer); + }); + }); + + /** Should get/set the current RootSpan from tracer instance */ + describe('get/set currentRootSpan()', () => { + let tracer, rootSpan; + before(() => { + tracer = new Tracer(); + rootSpan = new RootSpan(tracer); + tracer.currentRootSpan = rootSpan; + }); + it('should get the current RootSpan from tracer instance', () => { + assert.ok(tracer.currentRootSpan instanceof RootSpan); + }); + it('should set the current RootSpan from tracer instance', () => { + assert.strictEqual(tracer.currentRootSpan, rootSpan); + }); + }); + + /** Should return a started tracer instance */ + describe('start()', () => { + let tracerStarted; + before(() => { + const tracer = new Tracer(); + assert.strictEqual(tracer.active, false); + tracerStarted = tracer.start(defaultConfig); + }); + it('should return a tracer instance', () => { + assert.ok(tracerStarted instanceof Tracer); + }); + + it('the trace was started', () => { + assert.strictEqual(tracerStarted.active, true); + }); + }); + + /** Should return an OnEndSpanEventListener list */ + describe('registerEndSpanListener() / get eventListeners()', () => { + let tracer, onEndSpan; + before(() => { + tracer = new Tracer(); + onEndSpan = new OnEndSpanClass(); + tracer.registerEndSpanListener(onEndSpan); + }); + + it('should register a new OnEndSpanEventListener on listners list', () => { + const listner = tracer.eventListeners[0]; + assert.strictEqual(tracer.eventListeners.length, 1); + assert.strictEqual(listner, onEndSpan); + }); + + it('should return an OnEndSpanEventListener list', () => { + for (const listner of tracer.eventListeners) { + assert.ok(listner instanceof OnEndSpanClass); + } + }); + }); + + /** Should stop the trace instance */ + describe('stop()', () => { + it('should stop the trace instance', () => { + const tracer = new Tracer(); + assert.strictEqual(tracer.active, false); + tracer.start(defaultConfig); + assert.strictEqual(tracer.active, true); + tracer.stop(); + assert.strictEqual(tracer.active, false); + }); + }); + + + /** Should create and start a new RootSpan instance */ + describe('startRootSpan()', () => { + let rootSpanLocal; + before(() => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + tracer.startRootSpan(null, (rootSpan) => { + rootSpanLocal = rootSpan; + }); + }); + it('should create a new RootSpan instance', () => { + assert.ok(rootSpanLocal instanceof RootSpan); + }); + it('should start the rootSpan', () => { + assert.ok(rootSpanLocal.started); + }); + }); + + /** Should create and start a new RootSpan instance with options */ + describe('startRootSpan() with options', () => { + let rootSpanLocal; + before(() => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (rootSpan) => { + rootSpanLocal = rootSpan; + }); + }); + it('should create a new RootSpan instance', () => { + assert.ok(rootSpanLocal instanceof RootSpan); + }); + it('should start the rootSpan', () => { + assert.ok(rootSpanLocal.started); + }); + }); + + /** Should not start the new RootSpan instance */ + describe('startRootSpan() with sampler never', () => { + it('should not start the new RootSpan instance', () => { + const tracer = new Tracer(); + const config = {samplingRate: 0} as TracerConfig; + tracer.start(config); + tracer.startRootSpan(options, (rootSpan) => { + assert.strictEqual(rootSpan, null); + }); + }); + }); + + /** Should not create the new RootSpan instance */ + describe('startRootSpan() before start()', () => { + it('should not create the new RootSpan instance, tracer not started', + () => { + const tracer = new Tracer(); + assert.strictEqual(tracer.active, false); + tracer.startRootSpan(options, (rootSpan) => { + assert.equal(rootSpan, null); + }); + }); + }); + + describe('startRootSpan() with context propagation', () => { + const traceOptions = {name: 'rootName', type: 'spanType'} as + types.TraceOptions; + + it('should create new RootSpan instance, no propagation', () => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + tracer.startRootSpan(traceOptions, (rootSpan) => { + assert.ok(rootSpan); + assert.strictEqual(rootSpan.name, traceOptions.name); + assert.strictEqual(rootSpan.type, traceOptions.type); + }); + }); + + const spanContextPropagated = { + traceId: uuid.v4().split('-').join(''), + spanId: randomSpanId(), + options: 0x1 + } as types.SpanContext; + + + it('should create the new RootSpan with propagation', () => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + traceOptions.spanContext = spanContextPropagated; + tracer.startRootSpan(traceOptions, (rootSpan) => { + assert.ok(rootSpan); + assert.strictEqual(rootSpan.name, traceOptions.name); + assert.strictEqual(rootSpan.type, traceOptions.type); + assert.strictEqual(rootSpan.traceId, spanContextPropagated.traceId); + assert.strictEqual(rootSpan.parentSpanId, spanContextPropagated.spanId); + }); + }); + + it('should create the new RootSpan with no propagation', () => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + traceOptions.spanContext.options = 0x0; + tracer.startRootSpan(traceOptions, (rootSpan) => { + assert.ok(rootSpan); + assert.strictEqual(rootSpan.name, traceOptions.name); + assert.strictEqual(rootSpan.type, traceOptions.type); + assert.notEqual(rootSpan.traceId, spanContextPropagated.traceId); + assert.notEqual(rootSpan.parentSpanId, spanContextPropagated.spanId); + }); + }); + }); + + + /** Should set the current root span to null */ + describe('clearCurrentRootSpan()', () => { + it('should set the current root span to null', () => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (rootSpan) => { + tracer.clearCurrentTrace(); + assert.strictEqual(tracer.currentRootSpan, null); + }); + }); + }); + + + /** Should create and start a Span instance into a rootSpan */ + describe('startChildSpan()', () => { + let span: types.Span; + before(() => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + tracer.startRootSpan(options, (rootSpan) => { + span = tracer.startChildSpan('spanName', 'spanType'); + }); + }); + it('should create a Span instance', () => { + assert.ok(span instanceof Span); + }); + it('should start a span', () => { + assert.ok(span.started); + assert.strictEqual(span.name, 'spanName'); + assert.strictEqual(span.type, 'spanType'); + }); + }); + + /** Should not create a Span instance */ + describe('startChildSpan() before startRootSpan()', () => { + it('should not create a Span instance, without a rootspan', () => { + const tracer = new Tracer(); + tracer.start(defaultConfig); + const span = tracer.startChildSpan('spanName', 'spanType'); + assert.equal(span, null); + }); + }); + + /** Should run eventListeners when the rootSpan ends */ + describe('onEndSpan()', () => { + it('should run eventListeners when the rootSpan ends', () => { + const tracer = new Tracer(); + const eventListener = new OnEndSpanClass(); + tracer.registerEndSpanListener(eventListener); + tracer.start(defaultConfig); + + tracer.startRootSpan(options, (rootSpan) => { + rootSpan.end(); + assert.equal(eventListener.testCount, tracer.eventListeners.length); + }); + }); + }); +}); \ No newline at end of file diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json new file mode 100644 index 000000000..fc69b49c7 --- /dev/null +++ b/packages/opencensus-core/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "./node_modules/gts/tsconfig-google.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "build", + "allowUnreachableCode": true, + "noUnusedParameters": false, + "noImplicitAny": false, + "noImplicitThis": false, + "noEmitOnError": false, + "pretty": true, + "strict": false, + "module": "commonjs", + "target": "es6", + "sourceMap": false + }, + "include": [ + "src/**/*.ts", + "test/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} From 824aba9b6087440bcc2c1ac70b49419323ccd23c Mon Sep 17 00:00:00 2001 From: Gopi Palaniappan Date: Tue, 1 May 2018 16:02:56 -0700 Subject: [PATCH 2/2] Revert "feat: add opencensus-core package (#2)" This reverts commit 67860ba213a389eb1d5f1961d358a422ba81bc17. --- .gitignore | 20 - .npmignore | 4 - AUTHORS | 7 +- README.md | 14 +- .../design/opencensus.nodejs.first.design.pdf | Bin 253990 -> 0 bytes lerna.json | 7 - package-lock.json | 2917 ------------ package.json | 42 - packages/opencensus-core/.npmignore | 4 - packages/opencensus-core/AUTHORS | 6 - packages/opencensus-core/LICENSE | 202 - packages/opencensus-core/README.md | 16 - packages/opencensus-core/package-lock.json | 4094 ----------------- packages/opencensus-core/package.json | 65 - packages/opencensus-core/scripts/compile.ts | 22 - .../opencensus-core/scripts/tsconfig.json | 10 - .../src/common/console-logger.ts | 124 - packages/opencensus-core/src/common/types.ts | 30 - .../src/exporters/console-exporter.ts | 73 - .../src/exporters/exporter-buffer.ts | 124 - .../opencensus-core/src/exporters/types.ts | 31 - packages/opencensus-core/src/index-classes.ts | 32 - packages/opencensus-core/src/index-types.ts | 24 - packages/opencensus-core/src/index.ts | 22 - .../opencensus-core/src/internal/clock.ts | 77 - .../opencensus-core/src/internal/cls-ah.ts | 148 - packages/opencensus-core/src/internal/cls.ts | 59 - packages/opencensus-core/src/internal/util.ts | 40 - .../opencensus-core/src/trace/config/types.ts | 72 - .../src/trace/instrumentation/base-plugin.ts | 69 - .../src/trace/instrumentation/types.ts | 41 - .../src/trace/model/root-span.ts | 122 - .../src/trace/model/span-base.ts | 218 - .../opencensus-core/src/trace/model/span.ts | 73 - .../opencensus-core/src/trace/model/tracer.ts | 223 - .../opencensus-core/src/trace/model/types.ts | 277 -- .../src/trace/sampler/sampler.ts | 90 - .../src/trace/sampler/types.ts | 55 - packages/opencensus-core/src/trace/types.ts | 47 - .../test/test-console-exporter.ts | 100 - .../test/test-console-logger.ts | 154 - .../test/test-exporter-buffer.ts | 117 - .../opencensus-core/test/test-root-span.ts | 256 -- packages/opencensus-core/test/test-sampler.ts | 87 - packages/opencensus-core/test/test-span.ts | 262 -- packages/opencensus-core/test/test-tracer.ts | 287 -- packages/opencensus-core/tsconfig.json | 24 - 47 files changed, 6 insertions(+), 10782 deletions(-) delete mode 100644 .npmignore delete mode 100644 docs/design/opencensus.nodejs.first.design.pdf delete mode 100644 lerna.json delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 packages/opencensus-core/.npmignore delete mode 100644 packages/opencensus-core/AUTHORS delete mode 100644 packages/opencensus-core/LICENSE delete mode 100644 packages/opencensus-core/README.md delete mode 100644 packages/opencensus-core/package-lock.json delete mode 100644 packages/opencensus-core/package.json delete mode 100644 packages/opencensus-core/scripts/compile.ts delete mode 100644 packages/opencensus-core/scripts/tsconfig.json delete mode 100644 packages/opencensus-core/src/common/console-logger.ts delete mode 100644 packages/opencensus-core/src/common/types.ts delete mode 100644 packages/opencensus-core/src/exporters/console-exporter.ts delete mode 100644 packages/opencensus-core/src/exporters/exporter-buffer.ts delete mode 100644 packages/opencensus-core/src/exporters/types.ts delete mode 100644 packages/opencensus-core/src/index-classes.ts delete mode 100644 packages/opencensus-core/src/index-types.ts delete mode 100644 packages/opencensus-core/src/index.ts delete mode 100644 packages/opencensus-core/src/internal/clock.ts delete mode 100644 packages/opencensus-core/src/internal/cls-ah.ts delete mode 100644 packages/opencensus-core/src/internal/cls.ts delete mode 100644 packages/opencensus-core/src/internal/util.ts delete mode 100644 packages/opencensus-core/src/trace/config/types.ts delete mode 100644 packages/opencensus-core/src/trace/instrumentation/base-plugin.ts delete mode 100644 packages/opencensus-core/src/trace/instrumentation/types.ts delete mode 100644 packages/opencensus-core/src/trace/model/root-span.ts delete mode 100644 packages/opencensus-core/src/trace/model/span-base.ts delete mode 100644 packages/opencensus-core/src/trace/model/span.ts delete mode 100644 packages/opencensus-core/src/trace/model/tracer.ts delete mode 100644 packages/opencensus-core/src/trace/model/types.ts delete mode 100644 packages/opencensus-core/src/trace/sampler/sampler.ts delete mode 100644 packages/opencensus-core/src/trace/sampler/types.ts delete mode 100644 packages/opencensus-core/src/trace/types.ts delete mode 100644 packages/opencensus-core/test/test-console-exporter.ts delete mode 100644 packages/opencensus-core/test/test-console-logger.ts delete mode 100644 packages/opencensus-core/test/test-exporter-buffer.ts delete mode 100644 packages/opencensus-core/test/test-root-span.ts delete mode 100644 packages/opencensus-core/test/test-sampler.ts delete mode 100644 packages/opencensus-core/test/test-span.ts delete mode 100644 packages/opencensus-core/test/test-tracer.ts delete mode 100644 packages/opencensus-core/tsconfig.json diff --git a/.gitignore b/.gitignore index 558cddceb..7b0ff1e7e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,25 +18,5 @@ bin # Vim .swp -#VScode -.vscode/ - # Other TAGS - -# nodejs -node_modules/ -npm-debug.log -.nyc_output/ -build/ - -#backup files -*-- -*_backup - -#log files -*.log - -#istanbul files -coverage/ - diff --git a/.npmignore b/.npmignore deleted file mode 100644 index 9505ba945..000000000 --- a/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin -/coverage -/doc -/test diff --git a/AUTHORS b/AUTHORS index 3aa6d434a..e068e731e 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1 @@ -#CESAR's team (www.cesar.org.br): -Fabio Silva -Djonathas Cardoso -Luana Martins dos Santos -Eduardo Emery -Eldrey Seolin Galindo +Google Inc. \ No newline at end of file diff --git a/README.md b/README.md index 1983dec59..b2808a59d 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,13 @@ -# OpenCensus Core Node.js +# OpenCensus - A stats collection and distributed tracing framework [![Gitter chat][gitter-image]][gitter-url] -OpenCensus for Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. +OpenCensus is a toolkit for collecting application performance and behavior data. It currently +includes 3 apis: stats, tracing and tags. The library is in alpha stage and the API is subject to change. -Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. - -## Useful links -- For more information on OpenCensus, visit: -- To checkout the OpenCensus for Node.js, visit: -- For help or feedback on this project, join us on [gitter](https://gitter.im/census-instrumentation/Lobby) +Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this +project. [gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg [gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge - diff --git a/docs/design/opencensus.nodejs.first.design.pdf b/docs/design/opencensus.nodejs.first.design.pdf deleted file mode 100644 index c2117c5c3f2bf1f229f74d3779d4e59972a707b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 253990 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 JUKJh6{0ANeuf+fW diff --git a/lerna.json b/lerna.json deleted file mode 100644 index 9fef7c549..000000000 --- a/lerna.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "lerna": "2.10.1", - "packages": [ - "packages/*" - ], - "version": "0.0.0" -} diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index a8980391a..000000000 --- a/package-lock.json +++ /dev/null @@ -1,2917 +0,0 @@ -{ - "name": "@opencensus/opencensus-base", - "version": "0.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/node": { - "version": "9.6.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.4.tgz", - "integrity": "sha512-Awg4BcUYiZtNKoveGOu654JVPt11V/KIC77iBz8NweyoOAZpz5rUJfPDwwD+ajfTs2HndbTCEB8IuLfX9m/mmw==", - "dev": true - }, - "JSONStream": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", - "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", - "dev": true, - "requires": { - "jsonparse": "1.3.1", - "through": "2.3.8" - } - }, - "add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-escapes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", - "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" - } - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", - "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", - "dev": true - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "dev": true, - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "ci-info": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.3.tgz", - "integrity": "sha512-SK/846h/Rcy8q9Z9CAwGBLfCJ6EkjJWdpelWDufQpqVDYq2Wnnv8zlSO6AMQap02jvhVruKKpEtQOufo3pFhLg==", - "dev": true - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "cmd-shim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", - "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "mkdirp": "0.5.1" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "columnify": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", - "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", - "dev": true, - "requires": { - "strip-ansi": "3.0.1", - "wcwidth": "1.0.1" - } - }, - "command-join": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/command-join/-/command-join-2.0.0.tgz", - "integrity": "sha1-Uui5hPSHLZUv8b3IuYOX0nxxRM8=", - "dev": true - }, - "compare-func": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", - "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", - "dev": true, - "requires": { - "array-ify": "1.0.0", - "dot-prop": "3.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "1.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true - }, - "conventional-changelog": { - "version": "1.1.23", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.23.tgz", - "integrity": "sha512-yCPXU/OXJmxgbvTQfIKXKwKa4KQTvlO0a4T/371Raz3bdxcHIGhQtHtdrNee4Z8nGLNfe54njHDblVG2JNFyjg==", - "dev": true, - "requires": { - "conventional-changelog-angular": "1.6.6", - "conventional-changelog-atom": "0.2.8", - "conventional-changelog-codemirror": "0.3.8", - "conventional-changelog-core": "2.0.10", - "conventional-changelog-ember": "0.3.11", - "conventional-changelog-eslint": "1.0.9", - "conventional-changelog-express": "0.3.6", - "conventional-changelog-jquery": "0.1.0", - "conventional-changelog-jscs": "0.1.0", - "conventional-changelog-jshint": "0.3.8", - "conventional-changelog-preset-loader": "1.1.8" - } - }, - "conventional-changelog-angular": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", - "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" - } - }, - "conventional-changelog-atom": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", - "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-cli": { - "version": "1.3.21", - "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.21.tgz", - "integrity": "sha512-K9VBljxzuATZCLTVnI83PN7WdeRJRPPB5FumuLk4ES3E+m2YJvX07DRbdJlINk6C2DeAjj4ioS5JvsvJaaCRbA==", - "dev": true, - "requires": { - "add-stream": "1.0.0", - "conventional-changelog": "1.1.23", - "lodash": "4.17.5", - "meow": "4.0.0", - "tempfile": "1.1.1" - } - }, - "conventional-changelog-codemirror": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", - "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-core": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.10.tgz", - "integrity": "sha512-FP0NHXIbpvU+f5jk/qZdnodhFmlzKW8ENRHQIWT69oe7ffur9nFRVJZlnXnFBOzwHM9WIRbC15ZWh9HZN6t9Uw==", - "dev": true, - "requires": { - "conventional-changelog-writer": "3.0.9", - "conventional-commits-parser": "2.1.7", - "dateformat": "3.0.3", - "get-pkg-repo": "1.4.0", - "git-raw-commits": "1.3.6", - "git-remote-origin-url": "2.0.0", - "git-semver-tags": "1.3.6", - "lodash": "4.17.5", - "normalize-package-data": "2.4.0", - "q": "1.5.1", - "read-pkg": "1.1.0", - "read-pkg-up": "1.0.1", - "through2": "2.0.3" - }, - "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "conventional-changelog-ember": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.11.tgz", - "integrity": "sha512-ErjPPiDmTd/WPgj2bSp+CGsLtJiv7FbdPKjZXH2Cd5P7j44Rqf0V9SIAAYFTQNoPqmvcp+sIcr/vH52WzPJUbw==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-eslint": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", - "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-express": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", - "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-jquery": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", - "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-jscs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", - "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", - "dev": true, - "requires": { - "q": "1.5.1" - } - }, - "conventional-changelog-jshint": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", - "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "q": "1.5.1" - } - }, - "conventional-changelog-preset-loader": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", - "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", - "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", - "dev": true, - "requires": { - "compare-func": "1.3.2", - "conventional-commits-filter": "1.1.6", - "dateformat": "3.0.3", - "handlebars": "4.0.11", - "json-stringify-safe": "5.0.1", - "lodash": "4.17.5", - "meow": "4.0.0", - "semver": "5.5.0", - "split": "1.0.1", - "through2": "2.0.3" - } - }, - "conventional-commits-filter": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", - "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", - "dev": true, - "requires": { - "is-subset": "0.1.1", - "modify-values": "1.0.1" - } - }, - "conventional-commits-parser": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", - "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", - "dev": true, - "requires": { - "JSONStream": "1.3.2", - "is-text-path": "1.0.1", - "lodash": "4.17.5", - "meow": "4.0.0", - "split2": "2.2.0", - "through2": "2.0.3", - "trim-off-newlines": "1.0.1" - } - }, - "conventional-recommended-bump": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz", - "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "conventional-commits-filter": "1.1.6", - "conventional-commits-parser": "2.1.7", - "git-raw-commits": "1.3.6", - "git-semver-tags": "1.3.6", - "meow": "3.7.0", - "object-assign": "4.1.1" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "dev": true, - "requires": { - "capture-stack-trace": "1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "1.0.2" - } - }, - "dargs": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", - "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "1.2.0", - "map-obj": "1.0.1" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", - "dev": true - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true, - "requires": { - "clone": "1.0.4" - } - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true - }, - "detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", - "dev": true - }, - "dot-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", - "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", - "dev": true, - "requires": { - "is-obj": "1.0.1" - } - }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", - "dev": true - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.21", - "tmp": "0.0.33" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "4.0.0", - "universalify": "0.1.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-pkg-repo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", - "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", - "dev": true, - "requires": { - "hosted-git-info": "2.6.0", - "meow": "3.7.0", - "normalize-package-data": "2.4.0", - "parse-github-repo-url": "1.4.1", - "through2": "2.0.3" - }, - "dependencies": { - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" - } - }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" - } - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - } - } - }, - "get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", - "dev": true - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "git-raw-commits": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", - "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", - "dev": true, - "requires": { - "dargs": "4.1.0", - "lodash.template": "4.4.0", - "meow": "4.0.0", - "split2": "2.2.0", - "through2": "2.0.3" - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", - "dev": true, - "requires": { - "gitconfiglocal": "1.0.0", - "pify": "2.3.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "git-semver-tags": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", - "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", - "dev": true, - "requires": { - "meow": "4.0.0", - "semver": "5.5.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", - "dev": true, - "requires": { - "ini": "1.3.5" - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, - "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } - } - }, - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "dev": true, - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.1", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", - "dev": true, - "requires": { - "safer-buffer": "2.1.2" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.1.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.2.0", - "figures": "2.0.0", - "lodash": "4.17.5", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-ci": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.1.0.tgz", - "integrity": "sha512-c7TnwxLePuqIlxHgr7xtxzycJPegNHFuIrBkwbf8hc58//+Op1CqFkyS+xnIMkwn9UsJIwc174BIjkyBmSpjKg==", - "dev": true, - "requires": { - "ci-info": "1.1.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "2.1.1" - } - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", - "dev": true - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", - "dev": true, - "requires": { - "text-extensions": "1.7.0" - } - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "lerna": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/lerna/-/lerna-2.10.1.tgz", - "integrity": "sha512-p0Rmew8TEa/4wKDuaOYfTFx1VtNeMqjSJgjUkmIqqIdnFeEMDuL0gTY3JFRjnjfmWT9BEHaObC+orHlgN9orfA==", - "dev": true, - "requires": { - "async": "1.5.2", - "chalk": "2.3.2", - "cmd-shim": "2.0.2", - "columnify": "1.5.4", - "command-join": "2.0.0", - "conventional-changelog-cli": "1.3.21", - "conventional-recommended-bump": "1.2.1", - "dedent": "0.7.0", - "execa": "0.8.0", - "find-up": "2.1.0", - "fs-extra": "4.0.3", - "get-port": "3.2.0", - "glob": "7.1.2", - "glob-parent": "3.1.0", - "globby": "6.1.0", - "graceful-fs": "4.1.11", - "hosted-git-info": "2.6.0", - "inquirer": "3.3.0", - "is-ci": "1.1.0", - "load-json-file": "4.0.0", - "lodash": "4.17.5", - "minimatch": "3.0.4", - "npmlog": "4.1.2", - "p-finally": "1.0.0", - "package-json": "4.0.1", - "path-exists": "3.0.0", - "read-cmd-shim": "1.0.1", - "read-pkg": "3.0.0", - "rimraf": "2.6.2", - "safe-buffer": "5.1.1", - "semver": "5.5.0", - "signal-exit": "3.0.2", - "slash": "1.0.0", - "strong-log-transformer": "1.0.6", - "temp-write": "3.4.0", - "write-file-atomic": "2.3.0", - "write-json-file": "2.3.0", - "write-pkg": "3.1.0", - "yargs": "8.0.2" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0", - "lodash.templatesettings": "4.1.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", - "dev": true, - "requires": { - "lodash._reinterpolate": "3.0.0" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, - "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", - "dev": true - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "meow": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", - "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "dev": true, - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.4.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "dev": true, - "requires": { - "arrify": "1.0.1", - "is-plain-obj": "1.1.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "moment": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz", - "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - } - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "dev": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "dev": true, - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" - } - }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.2" - } - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", - "dev": true - }, - "rc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", - "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "dev": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "read-cmd-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", - "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11" - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "0.2.1" - } - } - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.1", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "dev": true, - "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dev": true, - "requires": { - "rc": "1.2.6", - "safe-buffer": "5.1.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "dev": true, - "requires": { - "rc": "1.2.6" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slash": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "1.0.1" - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "dev": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2.3.8" - } - }, - "split2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", - "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", - "dev": true, - "requires": { - "through2": "2.0.3" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "strong-log-transformer": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz", - "integrity": "sha1-9/uTdYpppXEUAYEnfuoMLrEwH6M=", - "dev": true, - "requires": { - "byline": "5.0.0", - "duplexer": "0.1.1", - "minimist": "0.1.0", - "moment": "2.22.0", - "through": "2.3.8" - }, - "dependencies": { - "minimist": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", - "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", - "dev": true - } - } - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "dev": true, - "requires": { - "has-flag": "3.0.0" - } - }, - "temp-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", - "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", - "dev": true - }, - "temp-write": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", - "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "is-stream": "1.1.0", - "make-dir": "1.2.0", - "pify": "3.0.0", - "temp-dir": "1.0.0", - "uuid": "3.2.1" - }, - "dependencies": { - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", - "dev": true - } - } - }, - "tempfile": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", - "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2", - "uuid": "2.0.3" - } - }, - "text-extensions": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", - "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", - "dev": true, - "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.1" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", - "dev": true - }, - "trim-off-newlines": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", - "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "typescript": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", - "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "universalify": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", - "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", - "dev": true - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", - "dev": true - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "dev": true, - "requires": { - "prepend-http": "1.0.4" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "dev": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "1.0.3" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "requires": { - "string-width": "1.0.2" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "write-json-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", - "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", - "dev": true, - "requires": { - "detect-indent": "5.0.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "pify": "3.0.0", - "sort-keys": "2.0.0", - "write-file-atomic": "2.3.0" - } - }, - "write-pkg": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.1.0.tgz", - "integrity": "sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk=", - "dev": true, - "requires": { - "sort-keys": "2.0.0", - "write-json-file": "2.3.0" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index 1a80d1e21..000000000 --- a/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "@opencensus/opencensus-base", - "version": "0.0.1", - "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", - "main": "build/src/index.js", - "types": "build/src/index.d.ts", - "repository": "census-instrumentation/opencensus-node", - "scripts": { - "postinstall": "npm run bootstrap;npm run build;", - "build": "node_modules/.bin/lerna run build", - "test": "node_modules/.bin/lerna run test", - "bootstrap": "node_modules/.bin/lerna bootstrap", - "bump": "node_modules/.bin/lerna publish" - }, - "keywords": [ - "opencensus", - "nodejs", - "tracing", - "profiling" - ], - "author": "Google Inc.", - "license": "Apache-2.0", - "engines": { - "node": ">=6.0" - }, - "files": [ - "build/src/**/*.js", - "build/src/**/*.d.ts", - "doc", - "CHANGELOG.md", - "LICENSE", - "README.md" - ], - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@types/node": "^9.4.7", - "lerna": "^2.10.1", - "typescript": "^2.7.2" - } -} diff --git a/packages/opencensus-core/.npmignore b/packages/opencensus-core/.npmignore deleted file mode 100644 index 9505ba945..000000000 --- a/packages/opencensus-core/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -/bin -/coverage -/doc -/test diff --git a/packages/opencensus-core/AUTHORS b/packages/opencensus-core/AUTHORS deleted file mode 100644 index 3aa6d434a..000000000 --- a/packages/opencensus-core/AUTHORS +++ /dev/null @@ -1,6 +0,0 @@ -#CESAR's team (www.cesar.org.br): -Fabio Silva -Djonathas Cardoso -Luana Martins dos Santos -Eduardo Emery -Eldrey Seolin Galindo diff --git a/packages/opencensus-core/LICENSE b/packages/opencensus-core/LICENSE deleted file mode 100644 index d64569567..000000000 --- a/packages/opencensus-core/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/packages/opencensus-core/README.md b/packages/opencensus-core/README.md deleted file mode 100644 index 675f7e1bf..000000000 --- a/packages/opencensus-core/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# OpenCensus Core Node.js -[![Gitter chat][gitter-image]][gitter-url] - -OpenCensus for Node.js is an implementation of OpenCensus, a toolkit for collecting application performance and behavior monitoring data. - -The library is in alpha stage and the API is subject to change. - -Please join [gitter](https://gitter.im/census-instrumentation/Lobby) for help or feedback on this project. - -## Useful links -- For more information on OpenCensus, visit: -- To checkout the OpenCensus for Node.js, visit: -- For help or feedback on this project, join us on [gitter](https://gitter.im/census-instrumentation/Lobby) - -[gitter-image]: https://badges.gitter.im/census-instrumentation/lobby.svg -[gitter-url]: https://gitter.im/census-instrumentation/lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge diff --git a/packages/opencensus-core/package-lock.json b/packages/opencensus-core/package-lock.json deleted file mode 100644 index 91a86ae4c..000000000 --- a/packages/opencensus-core/package-lock.json +++ /dev/null @@ -1,4094 +0,0 @@ -{ - "requires": true, - "lockfileVersion": 1, - "dependencies": { - "@types/continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha1-oz4N+dzptCTRyY/E/evYV43O7H4=", - "requires": { - "@types/node": "9.4.7" - } - }, - "@types/debug": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.30.tgz", - "integrity": "sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==" - }, - "@types/mocha": { - "version": "2.2.48", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==" - }, - "@types/node": { - "version": "9.4.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.7.tgz", - "integrity": "sha512-4Ba90mWNx8ddbafuyGGwjkZMigi+AWfYLSDCpovwsE63ia8w93r3oJ8PIAQc3y8U+XHcnMOHPIzNe3o438Ywcw==" - }, - "@types/semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-41qEJgBH/TWgo5NFSvBCJ1qkoi3Q6ONSF2avrHq1LVEZfYpdHmj0y9SuTK+u9ZhG1sYQKBL1AWXKyLWP4RaUoQ==" - }, - "@types/shimmer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.0.1.tgz", - "integrity": "sha512-I9ouuzrWLcjM1wre7f0i780W3KHk5PxFAC5KOpvpOGNaTsaKLN8p7sqRh9THwV9cpdOA/YJC+yMhG1jonQFdRQ==" - }, - "@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-FKjsOVbC6B7bdSB5CuzyHCkK69I=" - }, - "@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==" - }, - "@types/uuid": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", - "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", - "requires": { - "@types/node": "9.4.7" - } - }, - "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", - "requires": { - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "1.9.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "1.0.3" - } - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" - }, - "async-listener": { - "version": "0.6.9", - "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", - "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", - "requires": { - "semver": "5.5.0", - "shimmer": "1.2.0" - } - }, - "async_hooks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async_hooks/-/async_hooks-1.0.0.tgz", - "integrity": "sha1-gV9ehh/nP2TrKf2ULDLpXIBkBS8=" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.2", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" - }, - "camelcase-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", - "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", - "requires": { - "camelcase": "4.1.0", - "map-obj": "2.0.0", - "quick-lru": "1.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" - } - } - }, - "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" - }, - "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", - "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" - }, - "dependencies": { - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", - "requires": { - "has-flag": "3.0.0" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" - }, - "clang-format": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/clang-format/-/clang-format-1.2.2.tgz", - "integrity": "sha512-6X9u1JBMak/9VbC0IZajEDvp19/PbjCanbRO3Z2xsluypQtbPPAGDvGGovLOWoUpXIvJH9vJExmzlqWvwItZxA==", - "requires": { - "async": "1.5.2", - "glob": "7.1.2", - "resolve": "1.5.0" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - } - } - }, - "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "requires": { - "restore-cursor": "2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" - }, - "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "configstore": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", - "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", - "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.2.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" - }, - "dependencies": { - "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "requires": { - "is-obj": "1.0.1" - } - } - } - }, - "continuation-local-storage": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", - "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", - "requires": { - "async-listener": "0.6.9", - "emitter-listener": "1.1.1" - } - }, - "create-error-class": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", - "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", - "requires": { - "capture-stack-trace": "1.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "crypto-random-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", - "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" - }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "1.0.2" - } - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "requires": { - "decamelize": "1.2.0", - "map-obj": "1.0.1" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - } - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" - }, - "emitter-listener": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", - "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", - "requires": { - "shimmer": "1.2.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", - "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "requires": { - "escape-string-regexp": "1.0.5" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "requires": { - "locate-path": "2.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", - "requires": { - "ini": "1.3.5" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" - }, - "gts": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/gts/-/gts-0.5.4.tgz", - "integrity": "sha512-bDxE/NvHu+v0uW0qbUMYClrGCi81Ug4Wa7BsV/yUtdEh67C3K56BiqAk8yBOttLH1k4XYks+7QSJy7XOf3vaQw==", - "requires": { - "chalk": "2.3.2", - "clang-format": "1.2.2", - "inquirer": "3.3.0", - "meow": "4.0.0", - "pify": "3.0.0", - "rimraf": "2.6.2", - "tslint": "5.9.1", - "update-notifier": "2.3.0", - "write-file-atomic": "2.3.0" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", - "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.2", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.5", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "intercept-stdout": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", - "integrity": "sha1-Emq/H65sUJpCipjGGmMVWQQq6f0=", - "requires": { - "lodash.toarray": "3.0.2" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", - "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.1" - } - }, - "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "1.0.2" - } - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" - }, - "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" - }, - "js-yaml": { - "version": "3.11.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", - "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", - "requires": { - "argparse": "1.0.10", - "esprima": "4.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" - }, - "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", - "requires": { - "package-json": "4.0.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.1" - } - } - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" - }, - "lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=" - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" - } - }, - "lodash.toarray": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", - "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", - "requires": { - "lodash._arraycopy": "3.0.0", - "lodash._basevalues": "3.0.0", - "lodash.keys": "3.1.2" - } - }, - "log-driver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", - "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" - } - }, - "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" - }, - "lru-cache": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", - "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-dir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.2.0.tgz", - "integrity": "sha512-aNUAa4UMg/UougV25bbrU4ZaaKNjJ/3/xnvg/twpmKROPdKZPZ9wGgI0opdZzO8q/zUFawoUuixuOv33eZ61Iw==", - "requires": { - "pify": "3.0.0" - } - }, - "make-error": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.4.tgz", - "integrity": "sha512-0Dab5btKVPhibSalc9QGXb559ED7G7iLjFXBaj9Wq8O3vorueR5K5jaE3hkG6ZQINyhA/JgG6Qk4qdFQjsYV6g==" - }, - "map-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", - "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" - }, - "meow": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.0.tgz", - "integrity": "sha512-Me/kel335m6vMKmEmA6c87Z6DUFW3JqkINRnxkbC+A/PUm0D5Fl2dEBQrPKnqCL9Te/CIa1MUt/0InMJhuC/sw==", - "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.4.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", - "requires": { - "arrify": "1.0.1", - "is-plain-obj": "1.1.0" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.4.tgz", - "integrity": "sha512-nMOpAPFosU1B4Ix1jdhx5e3q7XO55ic5a8cgYvW27CequcEY+BabS0kUVL1Cw1V5PuVHZWeNRWFLmEPexo79VA==", - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" - }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "2.0.1" - } - }, - "nyc": { - "version": "11.6.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.6.0.tgz", - "integrity": "sha512-ZaXCh0wmbk2aSBH2B5hZGGvK2s9aM8DIm2rVY+BG3Fx8tUS+bpJSswUVZqOD1YfCmnYRFSqgYJSr7UeeUcW0jg==", - "requires": { - "archy": "1.0.0", - "arrify": "1.0.1", - "caching-transform": "1.0.1", - "convert-source-map": "1.5.1", - "debug-log": "1.0.1", - "default-require-extensions": "1.0.0", - "find-cache-dir": "0.1.1", - "find-up": "2.1.0", - "foreground-child": "1.5.6", - "glob": "7.1.2", - "istanbul-lib-coverage": "1.2.0", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.10.1", - "istanbul-lib-report": "1.1.3", - "istanbul-lib-source-maps": "1.2.3", - "istanbul-reports": "1.3.0", - "md5-hex": "1.3.0", - "merge-source-map": "1.1.0", - "micromatch": "2.3.11", - "mkdirp": "0.5.1", - "resolve-from": "2.0.0", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "spawn-wrap": "1.4.2", - "test-exclude": "4.2.1", - "yargs": "11.1.0", - "yargs-parser": "8.1.0" - }, - "dependencies": { - "align-text": { - "version": "0.1.4", - "bundled": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "amdefine": { - "version": "1.0.1", - "bundled": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "ansi-styles": { - "version": "2.2.1", - "bundled": true - }, - "append-transform": { - "version": "0.4.0", - "bundled": true, - "requires": { - "default-require-extensions": "1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true - }, - "arr-diff": { - "version": "2.0.0", - "bundled": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "bundled": true - }, - "arr-union": { - "version": "3.1.0", - "bundled": true - }, - "array-unique": { - "version": "0.2.1", - "bundled": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true - }, - "assign-symbols": { - "version": "1.0.0", - "bundled": true - }, - "async": { - "version": "1.5.2", - "bundled": true - }, - "atob": { - "version": "2.0.3", - "bundled": true - }, - "babel-code-frame": { - "version": "6.26.0", - "bundled": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "babel-generator": { - "version": "6.26.1", - "bundled": true, - "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.5", - "source-map": "0.5.7", - "trim-right": "1.0.1" - } - }, - "babel-messages": { - "version": "6.23.0", - "bundled": true, - "requires": { - "babel-runtime": "6.26.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "bundled": true, - "requires": { - "core-js": "2.5.3", - "regenerator-runtime": "0.11.1" - } - }, - "babel-template": { - "version": "6.26.0", - "bundled": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.5" - } - }, - "babel-traverse": { - "version": "6.26.0", - "bundled": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.3", - "lodash": "4.17.5" - } - }, - "babel-types": { - "version": "6.26.0", - "bundled": true, - "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.5", - "to-fast-properties": "1.0.3" - } - }, - "babylon": { - "version": "6.18.0", - "bundled": true - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "base": { - "version": "0.11.2", - "bundled": true, - "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.2.1", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.1", - "pascalcase": "0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "bundled": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "builtin-modules": { - "version": "1.1.1", - "bundled": true - }, - "cache-base": { - "version": "1.0.1", - "bundled": true, - "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.2.1", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.0", - "to-object-path": "0.3.0", - "union-value": "1.0.0", - "unset-value": "1.0.0" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "caching-transform": { - "version": "1.0.1", - "bundled": true, - "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" - } - }, - "camelcase": { - "version": "1.2.1", - "bundled": true, - "optional": true - }, - "center-align": { - "version": "0.1.3", - "bundled": true, - "optional": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chalk": { - "version": "1.1.3", - "bundled": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - } - }, - "class-utils": { - "version": "0.3.6", - "bundled": true, - "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true - }, - "kind-of": { - "version": "5.1.0", - "bundled": true - } - } - }, - "cliui": { - "version": "2.1.0", - "bundled": true, - "optional": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "bundled": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "collection-visit": { - "version": "1.0.0", - "bundled": true, - "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" - } - }, - "commondir": { - "version": "1.0.1", - "bundled": true - }, - "component-emitter": { - "version": "1.2.1", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "convert-source-map": { - "version": "1.5.1", - "bundled": true - }, - "copy-descriptor": { - "version": "0.1.1", - "bundled": true - }, - "core-js": { - "version": "2.5.3", - "bundled": true - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "requires": { - "lru-cache": "4.1.2", - "which": "1.3.0" - } - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - } - }, - "debug-log": { - "version": "1.0.1", - "bundled": true - }, - "decamelize": { - "version": "1.2.0", - "bundled": true - }, - "decode-uri-component": { - "version": "0.2.0", - "bundled": true - }, - "default-require-extensions": { - "version": "1.0.0", - "bundled": true, - "requires": { - "strip-bom": "2.0.0" - } - }, - "define-property": { - "version": "2.0.2", - "bundled": true, - "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "detect-indent": { - "version": "4.0.0", - "bundled": true, - "requires": { - "repeating": "2.0.1" - } - }, - "error-ex": { - "version": "1.3.1", - "bundled": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "bundled": true - }, - "esutils": { - "version": "2.0.2", - "bundled": true - }, - "execa": { - "version": "0.7.0", - "bundled": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "bundled": true, - "requires": { - "lru-cache": "4.1.2", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - } - } - }, - "expand-brackets": { - "version": "0.1.5", - "bundled": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "bundled": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extend-shallow": { - "version": "3.0.2", - "bundled": true, - "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "extglob": { - "version": "0.3.2", - "bundled": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "filename-regex": { - "version": "2.0.1", - "bundled": true - }, - "fill-range": { - "version": "2.2.3", - "bundled": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-cache-dir": { - "version": "0.1.1", - "bundled": true, - "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" - } - }, - "find-up": { - "version": "2.1.0", - "bundled": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "bundled": true - }, - "for-own": { - "version": "0.1.5", - "bundled": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "requires": { - "cross-spawn": "4.0.2", - "signal-exit": "3.0.2" - } - }, - "fragment-cache": { - "version": "0.2.1", - "bundled": true, - "requires": { - "map-cache": "0.2.2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "get-caller-file": { - "version": "1.0.2", - "bundled": true - }, - "get-stream": { - "version": "3.0.0", - "bundled": true - }, - "get-value": { - "version": "2.0.6", - "bundled": true - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "bundled": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "bundled": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "globals": { - "version": "9.18.0", - "bundled": true - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true - }, - "handlebars": { - "version": "4.0.11", - "bundled": true, - "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" - }, - "dependencies": { - "source-map": { - "version": "0.4.4", - "bundled": true, - "requires": { - "amdefine": "1.0.1" - } - } - } - }, - "has-ansi": { - "version": "2.0.0", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "1.0.0", - "bundled": true - }, - "has-value": { - "version": "1.0.0", - "bundled": true, - "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "has-values": { - "version": "1.0.0", - "bundled": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "hosted-git-info": { - "version": "2.6.0", - "bundled": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "invariant": { - "version": "2.2.3", - "bundled": true, - "requires": { - "loose-envify": "1.3.1" - } - }, - "invert-kv": { - "version": "1.0.0", - "bundled": true - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "bundled": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true - }, - "is-buffer": { - "version": "1.1.6", - "bundled": true - }, - "is-builtin-module": { - "version": "1.0.0", - "bundled": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "bundled": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true - } - } - }, - "is-descriptor": { - "version": "1.0.2", - "bundled": true, - "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true - } - } - }, - "is-dotfile": { - "version": "1.0.3", - "bundled": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "bundled": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "bundled": true - }, - "is-extglob": { - "version": "1.0.0", - "bundled": true - }, - "is-finite": { - "version": "1.0.2", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true - }, - "is-glob": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-odd": { - "version": "2.0.0", - "bundled": true, - "requires": { - "is-number": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "bundled": true - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "bundled": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "bundled": true - }, - "is-primitive": { - "version": "2.0.0", - "bundled": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true - }, - "is-utf8": { - "version": "0.2.1", - "bundled": true - }, - "is-windows": { - "version": "1.0.2", - "bundled": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true - }, - "isobject": { - "version": "2.1.0", - "bundled": true, - "requires": { - "isarray": "1.0.0" - } - }, - "istanbul-lib-coverage": { - "version": "1.2.0", - "bundled": true - }, - "istanbul-lib-hook": { - "version": "1.1.0", - "bundled": true, - "requires": { - "append-transform": "0.4.0" - } - }, - "istanbul-lib-instrument": { - "version": "1.10.1", - "bundled": true, - "requires": { - "babel-generator": "6.26.1", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.2.0", - "semver": "5.5.0" - } - }, - "istanbul-lib-report": { - "version": "1.1.3", - "bundled": true, - "requires": { - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" - }, - "dependencies": { - "supports-color": { - "version": "3.2.3", - "bundled": true, - "requires": { - "has-flag": "1.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "1.2.3", - "bundled": true, - "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.2.0", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "bundled": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "istanbul-reports": { - "version": "1.3.0", - "bundled": true, - "requires": { - "handlebars": "4.0.11" - } - }, - "js-tokens": { - "version": "3.0.2", - "bundled": true - }, - "jsesc": { - "version": "1.3.0", - "bundled": true - }, - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - }, - "lazy-cache": { - "version": "1.0.4", - "bundled": true, - "optional": true - }, - "lcid": { - "version": "1.0.0", - "bundled": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "bundled": true - } - } - }, - "lodash": { - "version": "4.17.5", - "bundled": true - }, - "longest": { - "version": "1.0.1", - "bundled": true - }, - "loose-envify": { - "version": "1.3.1", - "bundled": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lru-cache": { - "version": "4.1.2", - "bundled": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "map-cache": { - "version": "0.2.2", - "bundled": true - }, - "map-visit": { - "version": "1.0.0", - "bundled": true, - "requires": { - "object-visit": "1.0.1" - } - }, - "md5-hex": { - "version": "1.3.0", - "bundled": true, - "requires": { - "md5-o-matic": "0.1.1" - } - }, - "md5-o-matic": { - "version": "0.1.1", - "bundled": true - }, - "mem": { - "version": "1.1.0", - "bundled": true, - "requires": { - "mimic-fn": "1.2.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "requires": { - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true - } - } - }, - "micromatch": { - "version": "2.3.11", - "bundled": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "1.1.11" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true - }, - "mixin-deep": { - "version": "1.3.1", - "bundled": true, - "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "bundled": true, - "requires": { - "is-plain-object": "2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true - }, - "nanomatch": { - "version": "1.2.9", - "bundled": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-odd": "2.0.0", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true - } - } - }, - "normalize-package-data": { - "version": "2.4.0", - "bundled": true, - "requires": { - "hosted-git-info": "2.6.0", - "is-builtin-module": "1.0.0", - "semver": "5.5.0", - "validate-npm-package-license": "3.0.3" - } - }, - "normalize-path": { - "version": "2.1.1", - "bundled": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "requires": { - "path-key": "2.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "object-copy": { - "version": "0.1.0", - "bundled": true, - "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "bundled": true - } - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "bundled": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "object.omit": { - "version": "2.0.1", - "bundled": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.pick": { - "version": "1.3.0", - "bundled": true, - "requires": { - "isobject": "3.0.1" - }, - "dependencies": { - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-locale": { - "version": "2.1.0", - "bundled": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "bundled": true - }, - "p-limit": { - "version": "1.2.0", - "bundled": true, - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "bundled": true, - "requires": { - "p-limit": "1.2.0" - } - }, - "p-try": { - "version": "1.0.0", - "bundled": true - }, - "parse-glob": { - "version": "3.0.4", - "bundled": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "bundled": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "pascalcase": { - "version": "0.1.1", - "bundled": true - }, - "path-exists": { - "version": "2.1.0", - "bundled": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true - }, - "path-parse": { - "version": "1.0.5", - "bundled": true - }, - "path-type": { - "version": "1.1.0", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "bundled": true - }, - "pinkie": { - "version": "2.0.4", - "bundled": true - }, - "pinkie-promise": { - "version": "2.0.1", - "bundled": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "1.0.0", - "bundled": true, - "requires": { - "find-up": "1.1.2" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - } - } - }, - "posix-character-classes": { - "version": "0.1.1", - "bundled": true - }, - "preserve": { - "version": "0.2.0", - "bundled": true - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true - }, - "randomatic": { - "version": "1.1.7", - "bundled": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "read-pkg": { - "version": "1.1.0", - "bundled": true, - "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "bundled": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "bundled": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - } - } - }, - "regenerator-runtime": { - "version": "0.11.1", - "bundled": true - }, - "regex-cache": { - "version": "0.4.4", - "bundled": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "regex-not": { - "version": "1.0.2", - "bundled": true, - "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "bundled": true - }, - "repeat-element": { - "version": "1.1.2", - "bundled": true - }, - "repeat-string": { - "version": "1.6.1", - "bundled": true - }, - "repeating": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-finite": "1.0.2" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true - }, - "resolve-from": { - "version": "2.0.0", - "bundled": true - }, - "resolve-url": { - "version": "0.2.1", - "bundled": true - }, - "ret": { - "version": "0.1.15", - "bundled": true - }, - "right-align": { - "version": "0.1.3", - "bundled": true, - "optional": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-regex": { - "version": "1.1.0", - "bundled": true, - "requires": { - "ret": "0.1.15" - } - }, - "semver": { - "version": "5.5.0", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "set-value": { - "version": "2.0.0", - "bundled": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true - }, - "slide": { - "version": "1.1.6", - "bundled": true - }, - "snapdragon": { - "version": "0.8.2", - "bundled": true, - "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.1", - "use": "3.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "bundled": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "bundled": true, - "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "source-map": { - "version": "0.5.7", - "bundled": true - }, - "source-map-resolve": { - "version": "0.5.1", - "bundled": true, - "requires": { - "atob": "2.0.3", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "bundled": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "requires": { - "foreground-child": "1.5.6", - "mkdirp": "0.5.1", - "os-homedir": "1.0.2", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "which": "1.3.0" - } - }, - "spdx-correct": { - "version": "3.0.0", - "bundled": true, - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "bundled": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "bundled": true - }, - "split-string": { - "version": "3.1.0", - "bundled": true, - "requires": { - "extend-shallow": "3.0.2" - } - }, - "static-extend": { - "version": "0.1.2", - "bundled": true, - "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "bundled": true - } - } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "2.0.0", - "bundled": true, - "requires": { - "is-utf8": "0.2.1" - } - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true - }, - "supports-color": { - "version": "2.0.0", - "bundled": true - }, - "test-exclude": { - "version": "4.2.1", - "bundled": true, - "requires": { - "arrify": "1.0.1", - "micromatch": "3.1.9", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" - }, - "dependencies": { - "arr-diff": { - "version": "4.0.0", - "bundled": true - }, - "array-unique": { - "version": "0.3.2", - "bundled": true - }, - "braces": { - "version": "2.3.1", - "bundled": true, - "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "define-property": "1.0.0", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "kind-of": "6.0.2", - "repeat-element": "1.1.2", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "expand-brackets": { - "version": "2.1.4", - "bundled": true, - "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "bundled": true, - "requires": { - "is-descriptor": "0.1.6" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "is-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" - } - }, - "kind-of": { - "version": "5.1.0", - "bundled": true - } - } - }, - "extglob": { - "version": "2.0.4", - "bundled": true, - "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "bundled": true, - "requires": { - "is-descriptor": "1.0.2" - } - }, - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "bundled": true, - "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extendable": "0.1.1" - } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "bundled": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "isobject": { - "version": "3.0.1", - "bundled": true - }, - "kind-of": { - "version": "6.0.2", - "bundled": true - }, - "micromatch": { - "version": "3.1.9", - "bundled": true, - "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.1", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.9", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" - } - } - } - }, - "to-fast-properties": { - "version": "1.0.3", - "bundled": true - }, - "to-object-path": { - "version": "0.3.0", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "to-regex": { - "version": "3.0.2", - "bundled": true, - "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "bundled": true, - "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "bundled": true, - "requires": { - "kind-of": "3.2.2" - } - } - } - }, - "trim-right": { - "version": "1.0.1", - "bundled": true - }, - "uglify-js": { - "version": "2.8.29", - "bundled": true, - "optional": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - }, - "dependencies": { - "yargs": { - "version": "3.10.0", - "bundled": true, - "optional": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "bundled": true, - "optional": true - }, - "union-value": { - "version": "1.0.0", - "bundled": true, - "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "bundled": true, - "requires": { - "is-extendable": "0.1.1" - } - }, - "set-value": { - "version": "0.4.3", - "bundled": true, - "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "to-object-path": "0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "bundled": true, - "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "bundled": true, - "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "bundled": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "bundled": true - }, - "isobject": { - "version": "3.0.1", - "bundled": true - } - } - }, - "urix": { - "version": "0.1.0", - "bundled": true - }, - "use": { - "version": "3.1.0", - "bundled": true, - "requires": { - "kind-of": "6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "bundled": true - } - } - }, - "validate-npm-package-license": { - "version": "3.0.3", - "bundled": true, - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "which": { - "version": "1.3.0", - "bundled": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true - }, - "window-size": { - "version": "0.1.0", - "bundled": true, - "optional": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "write-file-atomic": { - "version": "1.3.4", - "bundled": true, - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" - } - }, - "y18n": { - "version": "3.2.1", - "bundled": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true - }, - "yargs": { - "version": "11.1.0", - "bundled": true, - "requires": { - "cliui": "4.0.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "9.0.2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true - }, - "camelcase": { - "version": "4.1.0", - "bundled": true - }, - "cliui": { - "version": "4.0.0", - "bundled": true, - "requires": { - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "wrap-ansi": "2.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "requires": { - "ansi-regex": "3.0.0" - } - }, - "yargs-parser": { - "version": "9.0.2", - "bundled": true, - "requires": { - "camelcase": "4.1.0" - } - } - } - }, - "yargs-parser": { - "version": "8.1.0", - "bundled": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "bundled": true - } - } - } - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "requires": { - "mimic-fn": "1.2.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-limit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", - "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", - "requires": { - "p-try": "1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "requires": { - "p-limit": "1.2.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" - }, - "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0", - "semver": "5.5.0" - }, - "dependencies": { - "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", - "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" - } - }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" - }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" - } - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "requires": { - "pify": "3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" - }, - "rc": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.6.tgz", - "integrity": "sha1-6xiYnG1PTxYsOZ953dKfODVWgJI=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", - "requires": { - "find-up": "2.1.0", - "read-pkg": "3.0.0" - } - }, - "redent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", - "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", - "requires": { - "indent-string": "3.2.0", - "strip-indent": "2.0.0" - } - }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "requires": { - "rc": "1.2.6", - "safe-buffer": "5.1.1" - } - }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", - "requires": { - "rc": "1.2.6" - } - }, - "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", - "requires": { - "path-parse": "1.0.5" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "requires": { - "is-promise": "2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "requires": { - "rx-lite": "4.0.8" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" - }, - "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", - "requires": { - "semver": "5.5.0" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, - "shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "source-map-support": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.4.tgz", - "integrity": "sha512-PETSPG6BjY1AHs2t64vS2aqAgu6dMIMXJULWFBGbh2Gr8nVLbCFDo6i/RMMvviIQ2h1Z8+5gQhVKSn2je9nmdg==", - "requires": { - "source-map": "0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" - } - } - }, - "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", - "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "requires": { - "spdx-exceptions": "2.1.0", - "spdx-license-ids": "3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, - "strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "requires": { - "has-flag": "2.0.0" - } - }, - "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "0.7.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "requires": { - "os-tmpdir": "1.0.2" - } - }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", - "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" - }, - "ts-node": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-4.1.0.tgz", - "integrity": "sha512-xcZH12oVg9PShKhy3UHyDmuDLV3y7iKwX25aMVPt1SIXSuAfWkFiGPEkg+th8R4YKW/QCxDoW7lJdb15lx6QWg==", - "requires": { - "arrify": "1.0.1", - "chalk": "2.3.2", - "diff": "3.5.0", - "make-error": "1.3.4", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.5.4", - "tsconfig": "7.0.0", - "v8flags": "3.0.2", - "yn": "2.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "requires": { - "@types/strip-bom": "3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - } - }, - "tslib": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", - "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" - }, - "tslint": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", - "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", - "requires": { - "babel-code-frame": "6.26.0", - "builtin-modules": "1.1.1", - "chalk": "2.3.2", - "commander": "2.15.1", - "diff": "3.5.0", - "glob": "7.1.2", - "js-yaml": "3.11.0", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.5.0", - "tslib": "1.9.0", - "tsutils": "2.22.2" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" - } - } - }, - "tsutils": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", - "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", - "requires": { - "tslib": "1.9.0" - } - }, - "typescript": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", - "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=" - }, - "unique-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", - "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", - "requires": { - "crypto-random-string": "1.0.0" - } - }, - "update-notifier": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", - "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", - "requires": { - "boxen": "1.3.0", - "chalk": "2.3.2", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" - } - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", - "requires": { - "prepend-http": "1.0.4" - } - }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "v8flags": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz", - "integrity": "sha512-6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==", - "requires": { - "homedir-polyfill": "1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", - "requires": { - "spdx-correct": "3.0.0", - "spdx-expression-parse": "3.0.0" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "requires": { - "isexe": "2.0.0" - } - }, - "widest-line": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.0.tgz", - "integrity": "sha1-AUKk6KJD+IgsAjOqDgKBqnYVInM=", - "requires": { - "string-width": "2.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "requires": { - "ansi-regex": "3.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "write-file-atomic": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", - "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", - "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" - } - }, - "xdg-basedir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", - "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=" - } - } -} diff --git a/packages/opencensus-core/package.json b/packages/opencensus-core/package.json deleted file mode 100644 index 70c610928..000000000 --- a/packages/opencensus-core/package.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "name": "@opencensus/opencensus-core", - "version": "0.0.1", - "description": "OpenCensus is a toolkit for collecting application performance and behavior data.", - "main": "build/src/index.js", - "types": "build/src/index.d.ts", - "repository": "census-instrumentation/opencensus-node", - "scripts": { - "build": "node_modules/.bin/tsc --declaration", - "test": "nyc -x '**/test/**' --reporter=html --reporter=text mocha 'build/test/**/*.js'", - "clean": "rimraf build/*", - "check": "gts check", - "compile": "tsc -p .", - "fix": "gts fix", - "prepare": "npm run compile", - "pretest": "npm run compile", - "posttest": "npm run check" - }, - "keywords": [ - "opencensus", - "nodejs", - "tracing", - "profiling" - ], - "author": "Google Inc.", - "license": "Apache-2.0", - "engines": { - "node": ">=6.0" - }, - "files": [ - "build/src/**/*.js", - "build/src/**/*.d.ts", - "doc", - "CHANGELOG.md", - "LICENSE", - "README.md" - ], - "publishConfig": { - "access": "public" - }, - "devDependencies": { - "@types/continuation-local-storage": "^3.2.1", - "@types/debug": "0.0.30", - "@types/mocha": "^2.2.48", - "@types/node": "^9.4.7", - "@types/semver": "^5.5.0", - "@types/shimmer": "^1.0.1", - "@types/uuid": "^3.4.3", - "gts": "^0.5.4", - "mocha": "^5.0.4", - "ncp": "^2.0.0", - "ts-node": "^4.0.0", - "typescript": "~2.6.1", - "nyc": "11.6.0" - }, - "dependencies": { - "continuation-local-storage": "^3.2.1", - "debug": "^3.1.0", - "intercept-stdout": "^0.1.2", - "log-driver": "^1.2.7", - "semver": "^5.5.0", - "shimmer": "^1.2.0", - "uuid": "^3.2.1" - } -} diff --git a/packages/opencensus-core/scripts/compile.ts b/packages/opencensus-core/scripts/compile.ts deleted file mode 100644 index da139552f..000000000 --- a/packages/opencensus-core/scripts/compile.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as path from 'path'; -import { forkP } from './utils'; -import * as ts from 'typescript'; -import * as semver from 'semver'; - -export interface CompileOptions { - strict: boolean; - languageLevel: string; -} - -export async function compile(options: CompileOptions) { - let { strict, languageLevel } = options; - if (languageLevel === 'auto') { - languageLevel = semver.satisfies(process.version, '>=7.5') ? 'es2017' : 'es2015'; - } - await forkP(`node_modules/.bin/tsc`, [ - '-p', - strict ? '.' : './tsconfig.full.json', - '--target', - languageLevel - ]); -} diff --git a/packages/opencensus-core/scripts/tsconfig.json b/packages/opencensus-core/scripts/tsconfig.json deleted file mode 100644 index e4b33561a..000000000 --- a/packages/opencensus-core/scripts/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "../node_modules/gts/tsconfig-google.json", - "compilerOptions": { - "rootDir": "..", - "outDir": "../build" - }, - "include": [ - "*.ts" - ] -} \ No newline at end of file diff --git a/packages/opencensus-core/src/common/console-logger.ts b/packages/opencensus-core/src/common/console-logger.ts deleted file mode 100644 index decd19bfb..000000000 --- a/packages/opencensus-core/src/common/console-logger.ts +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as util from 'util'; - -import * as types from './types'; - -const logDriver = require('log-driver'); - - -/** - * This class implements a console logger. - */ -export class ConsoleLogger implements types.Logger { - // tslint:disable:no-any - private logger: any; - static LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; - level: string; - - - // TODO: reevaluate options to accept numbers as a parameter - - /** - * Constructs a new ConsoleLogger instance - * @param options A logger configuration object. - */ - constructor(options?: types.LoggerOptions|string|number) { - let opt: types.LoggerOptions = {}; - if (typeof options === 'number') { - if (options < 0) { - options = 0; - } else if (options > ConsoleLogger.LEVELS.length) { - options = ConsoleLogger.LEVELS.length - 1; - } - opt = {level: ConsoleLogger.LEVELS[options]}; - } else if (typeof options === 'string') { - opt = {level: options}; - } else { - opt = options || {}; - } - this.level = opt.level; - this.logger = - logDriver({levels: ConsoleLogger.LEVELS, level: opt.level || 'silent'}); - } - - /** - * Logger error function. - * @param message menssage erro to log in console - * @param args arguments to log in console - */ - // tslint:disable:no-any - error(message: any, ...args: any[]): void { - this.logger.error(util.format(message, ...args)); - } - - /** - * Logger warning function. - * @param message menssage warning to log in console - * @param args arguments to log in console - */ - // tslint:disable:no-any - warn(message: any, ...args: any[]): void { - this.logger.warn(util.format(message, ...args)); - } - - /** - * Logger info function. - * @param message menssage info to log in console - * @param args arguments to log in console - */ - // tslint:disable:no-any - info(message: any, ...args: any[]): void { - this.logger.info(util.format(message, ...args)); - } - - /** - * Logger debug function. - * @param message menssage debug to log in console - * @param args arguments to log in console - */ - // tslint:disable:no-any - debug(message: any, ...args: any[]): void { - this.logger.debug(util.format(message, ...args)); - } - - /** - * Logger silly function. - * @param message menssage silly to log in console - * @param args arguments to log in console - */ - // tslint:disable:no-any - silly(message: any, ...args: any[]): void { - this.logger.silly(util.format(message, ...args)); - } -} - - -// TODO: reevaluate the need to create a new logger instance on every call to -// logger(); - -/** - * Function logger exported to others classes. - * @param options A logger options or strig to logger in console - */ -const logger = (options?: types.LoggerOptions|string|number) => { - const aLogger = new ConsoleLogger(options); - logger['logger'] = aLogger; - return aLogger; -}; - -export {logger}; diff --git a/packages/opencensus-core/src/common/types.ts b/packages/opencensus-core/src/common/types.ts deleted file mode 100644 index 5eb987e04..000000000 --- a/packages/opencensus-core/src/common/types.ts +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// tslint:disable:no-any -export type LogFunction = (message: any, ...args: any[]) => void; - -/** Defines an logger interface. */ -export interface Logger { - error: LogFunction; - warn: LogFunction; - info: LogFunction; - debug: LogFunction; - silly: LogFunction; -} - -/** Defines an logger options interface. */ -export interface LoggerOptions { level?: string; } diff --git a/packages/opencensus-core/src/exporters/console-exporter.ts b/packages/opencensus-core/src/exporters/console-exporter.ts deleted file mode 100644 index 9c1f17f5c..000000000 --- a/packages/opencensus-core/src/exporters/console-exporter.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as loggerTypes from '../common/types'; -import * as modelTypes from '../trace/model/types'; - -import {ExporterBuffer} from './exporter-buffer'; -import * as types from './types'; - -/** Do not send span data */ -export class NoopExporter implements types.Exporter { - logger: loggerTypes.Logger; - onEndSpan(root: modelTypes.RootSpan) {} - publish(rootSpans: modelTypes.RootSpan[]) {} -} - -/** Format and sends span data to the console. */ -export class ConsoleExporter implements types.Exporter { - /** Buffer object to store the spans. */ - private buffer: ExporterBuffer; - private logger: loggerTypes.Logger; - - /** - * Constructs a new ConsoleLogExporter instance. - * @param config Exporter configuration object to create a console log - * exporter. - */ - constructor(config: types.ExporterConfig) { - this.buffer = new ExporterBuffer(this, config); - this.logger = config.logger; - } - - /** - * Event called when a span is ended. - * @param root Ended span. - */ - onEndSpan(root: modelTypes.RootSpan) { - this.buffer.addToBuffer(root); - } - - /** - * Sends the spans information to the console. - * @param rootSpans - */ - publish(rootSpans: modelTypes.RootSpan[]) { - rootSpans.map((root) => { - const ROOT_STR = `RootSpan: {traceId: ${root.traceId}, spanId: ${ - root.id}, name: ${root.name} }`; - const SPANS_STR: string[] = root.spans.map( - (span) => [`\t\t{spanId: ${span.id}, name: ${span.name}}`].join( - '\n')); - const result: string[] = []; - - result.push( - ROOT_STR + '\n\tChildSpans:\n' + - `${SPANS_STR.join('\n')}`); - console.log(`${result}`); - }); - } -} diff --git a/packages/opencensus-core/src/exporters/exporter-buffer.ts b/packages/opencensus-core/src/exporters/exporter-buffer.ts deleted file mode 100644 index 42e081ba8..000000000 --- a/packages/opencensus-core/src/exporters/exporter-buffer.ts +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as uuidv4 from 'uuid/v4'; -import * as logger from '../common/console-logger'; -import * as loggerTypes from '../common/types'; -import * as configTypes from '../trace/config/types'; -import * as modelTypes from '../trace/model/types'; -import * as types from './types'; - - -/** Controls the sending of traces to exporters. */ -export class ExporterBuffer { - /** The service to send the collected spans. */ - private exporter: types.Exporter; - /** Maximum size of a buffer. */ - private bufferSize: number; - /** Max time for a buffer can wait before being sent */ - private bufferTimeout: number; - /** Manage when the buffer timeout needs to be reseted */ - private resetTimeout = false; - /** Indicates when the buffer timeout is running */ - private bufferTimeoutInProgress = false; - /** An object to log information to */ - private logger: loggerTypes.Logger; - /** Trace queue of a buffer */ - private queue: modelTypes.RootSpan[] = []; - - /** - * Constructs a new Buffer instance. - * @param exporter The service to send the collected spans. - * @param config A buffer configuration object to create a buffer. - */ - constructor(exporter: types.Exporter, config: configTypes.BufferConfig) { - this.exporter = exporter; - this.logger = config.logger || logger.logger(); - this.bufferSize = config.bufferSize; - this.bufferTimeout = config.bufferTimeout; - return this; - } - - /** - * Set the buffer size value. - * @param bufferSize The new buffer size. - */ - setBufferSize(bufferSize: number) { - this.bufferSize = bufferSize; - return this; - } - - getBufferSize(): number { - return this.bufferSize; - } - - getQueue(): modelTypes.RootSpan[] { - return this.queue; - } - /** - * Add a rootSpan in the buffer. - * @param root RootSpan to be added in the buffer. - */ - addToBuffer(root: modelTypes.RootSpan) { - this.queue.push(root); - this.logger.debug('ExporterBuffer: added new rootspan'); - - if (this.queue.length > this.bufferSize) { - this.flush(); - } - - if (this.bufferTimeoutInProgress) { - this.resetBufferTimeout(); - } else { - this.setBufferTimeout(); - } - - return this; - } - - /** Reset the buffer timeout */ - private resetBufferTimeout() { - this.logger.debug('ExporterBuffer: reset timeout'); - this.resetTimeout = true; - } - - /** Start the buffer timeout, when finished calls flush method */ - private setBufferTimeout() { - this.logger.debug('ExporterBuffer: set timeout'); - this.bufferTimeoutInProgress = true; - - setTimeout(() => { - if (this.queue.length === 0) { - return; - } - - if (this.resetTimeout) { - this.resetTimeout = false; - this.setBufferTimeout(); - } else { - this.bufferTimeoutInProgress = false; - this.flush(); - } - }, this.bufferTimeout); - } - - /** Send the trace queue to all exporters */ - private flush() { - this.exporter.publish(this.queue); - this.queue = []; - return this; - } -} diff --git a/packages/opencensus-core/src/exporters/types.ts b/packages/opencensus-core/src/exporters/types.ts deleted file mode 100644 index 7974402ce..000000000 --- a/packages/opencensus-core/src/exporters/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -import * as loggerTypes from '../common/types'; -import * as configTypes from '../trace/config/types'; -import * as modelTypes from '../trace/model/types'; - -/** Defines an exporter interface. */ -export interface Exporter extends modelTypes.OnEndSpanEventListener { - /** - * Sends a list of root spans to the service. - * @param rootSpans A list of root spans to publish. - */ - publish(rootSpans: modelTypes.RootSpan[]): void; -} - -export type ExporterConfig = configTypes.BufferConfig; diff --git a/packages/opencensus-core/src/index-classes.ts b/packages/opencensus-core/src/index-classes.ts deleted file mode 100644 index c072bc87f..000000000 --- a/packages/opencensus-core/src/index-classes.ts +++ /dev/null @@ -1,32 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// all classes - -// domain models impls -export * from './trace/model/root-span'; -export * from './trace/model/span'; -export * from './trace/model/tracer'; - -// sampler impl -export * from './trace/sampler/sampler'; - -// base instrumetation class -export * from './trace/instrumentation/base-plugin'; - -// console exporter and buffer impls -export * from './exporters/exporter-buffer'; -export * from './exporters/console-exporter'; diff --git a/packages/opencensus-core/src/index-types.ts b/packages/opencensus-core/src/index-types.ts deleted file mode 100644 index d09fa413a..000000000 --- a/packages/opencensus-core/src/index-types.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// all types -export * from './trace/types'; -export * from './trace/model/types'; -export * from './trace/config/types'; -export * from './trace/sampler/types'; -export * from './trace/instrumentation/types'; -export * from './exporters/types'; -export * from './common/types'; diff --git a/packages/opencensus-core/src/index.ts b/packages/opencensus-core/src/index.ts deleted file mode 100644 index 5d9e34ff0..000000000 --- a/packages/opencensus-core/src/index.ts +++ /dev/null @@ -1,22 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -import * as logger from './common/console-logger'; -import * as classes from './index-classes'; -import * as types from './index-types'; - -export {classes, logger, types}; diff --git a/packages/opencensus-core/src/internal/clock.ts b/packages/opencensus-core/src/internal/clock.ts deleted file mode 100644 index 3e80f7270..000000000 --- a/packages/opencensus-core/src/internal/clock.ts +++ /dev/null @@ -1,77 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/** - * The Clock class is used to record the duration and endTime for spans. - */ -export class Clock { - /** Indicates if the clock is endend. */ - private endedLocal = false; - /** Indicates the clock's start time. */ - private startTimeLocal: Date; - /** The time in high resolution in a [seconds, nanoseconds]. */ - private hrtimeLocal: [number, number]; - /** The duration between start and end of the clock. */ - private diff: [number, number] = null; - - /** Constructs a new SamplerImpl instance. */ - constructor() { - this.startTimeLocal = new Date(); - this.hrtimeLocal = process.hrtime(); - } - - /** Ends the clock. */ - end(): void { - if (this.endedLocal) { - return; - } - this.diff = process.hrtime(this.hrtimeLocal); - this.endedLocal = true; - } - - /** Gets the duration of the clock. */ - get duration(): number { - if (!this.endedLocal) { - return null; - } - const ns = this.diff[0] * 1e9 + this.diff[1]; - return ns / 1e6; - } - - - /** Starts the clock. */ - get startTime(): Date { - return this.startTimeLocal; - } - - /** - * Gets the time so far. - * @returns A Date object with the current duration. - */ - get endTime(): Date { - let result: Date = null; - if (this.ended) { - result = new Date(this.startTime.getTime() + this.duration); - } - return result; - } - - /** Indicates if the clock was ended. */ - get ended(): boolean { - return this.endedLocal; - } -} diff --git a/packages/opencensus-core/src/internal/cls-ah.ts b/packages/opencensus-core/src/internal/cls-ah.ts deleted file mode 100644 index 8e273454c..000000000 --- a/packages/opencensus-core/src/internal/cls-ah.ts +++ /dev/null @@ -1,148 +0,0 @@ -/** - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Original file from Stackdriver Trace Agent for Node.js -// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs - -import * as asyncHook from 'async_hooks'; -import {Context, Func, Namespace as CLSNamespace} from 'continuation-local-storage'; -import {EventEmitter} from 'events'; -import * as shimmer from 'shimmer'; - -const wrappedSymbol = Symbol('context_wrapped'); -let contexts: {[asyncId: number]: Context;} = {}; -let current: Context = {}; - -asyncHook.createHook({init, before, destroy}).enable(); - -const EVENT_EMITTER_METHODS: Array = - ['addListener', 'on', 'once', 'prependListener', 'prependOnceListener']; - -class AsyncHooksNamespace implements CLSNamespace { - get name(): string { - throw new Error('Not implemented'); - } - - get active(): Context { - throw new Error('Not implemented'); - } - - createContext(): Context { - throw new Error('Not implemented'); - } - - get(k: string) { - return current[k]; - } - - set(k: string, v: T): T { - current[k] = v; - return v; - } - - run(fn: Func): Context { - this.runAndReturn(fn); - return current; - } - - runAndReturn(fn: Func): T { - const oldContext = current; - current = {}; - const res = fn(); - current = oldContext; - return res; - } - - bind(cb: Func): Func { - // TODO(kjin): Monitor https://github.com/Microsoft/TypeScript/pull/15473. - // When it's landed and released, we can remove these `any` casts. - // tslint:disable-next-line:no-any - if ((cb as any)[wrappedSymbol] as boolean || !current) { - return cb; - } - const boundContext = current; - const contextWrapper = function(this: {}) { - const oldContext = current; - current = boundContext; - const res = cb.apply(this, arguments) as T; - current = oldContext; - return res; - }; - // tslint:disable-next-line:no-any - (contextWrapper as any)[wrappedSymbol] = true; - Object.defineProperty(contextWrapper, 'length', { - enumerable: false, - configurable: true, - writable: false, - value: cb.length - }); - return contextWrapper; - } - - // This function is not technically needed and all tests currently pass - // without it (after removing call sites). While it is not a complete - // solution, restoring correct context before running every request/response - // event handler reduces the number of situations in which userspace queuing - // will cause us to lose context. - bindEmitter(ee: NodeJS.EventEmitter): void { - const ns = this; - EVENT_EMITTER_METHODS.forEach((method) => { - if (ee[method]) { - shimmer.wrap(ee, method, (oldMethod) => { - return function(this: {}, event: string, cb: Func) { - return oldMethod.call(this, event, ns.bind(cb)); - }; - }); - } - }); - } -} - -const namespace = new AsyncHooksNamespace(); - -// AsyncWrap Hooks - -function init( - uid: number, provider: string, parentUid: number, parentHandle: {}) { - contexts[uid] = current; -} - -function before(uid: number) { - if (contexts[uid]) { - current = contexts[uid]; - } -} - -function destroy(uid: number) { - delete contexts[uid]; -} - -export function createNamespace(): CLSNamespace { - return namespace; -} - -export function destroyNamespace(): void { - current = {}; - contexts = {}; -} - -export function getNamespace(): CLSNamespace { - return namespace; -} - -export function reset(): void { - throw new Error('Not implemented'); -} diff --git a/packages/opencensus-core/src/internal/cls.ts b/packages/opencensus-core/src/internal/cls.ts deleted file mode 100644 index 15384f2bc..000000000 --- a/packages/opencensus-core/src/internal/cls.ts +++ /dev/null @@ -1,59 +0,0 @@ -/** - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Original file from Stackdriver Trace Agent for Node.js -// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs - -import * as CLS from 'continuation-local-storage'; -import * as semver from 'semver'; - -import * as cls_ah from './cls-ah'; - -export type Namespace = CLS.Namespace; -export type Func = CLS.Func; - -const useAsyncHooks: boolean = semver.satisfies( - process.version, '>=8'); //&& - // !!process.env.GCLOUD_TRACE_NEW_CONTEXT; - -import * as Debug from 'debug'; -const debug = Debug('opencensus'); -debug('useAsyncHooks = %s', useAsyncHooks); - -const cls: typeof CLS = useAsyncHooks ? cls_ah : CLS; - - -const TRACE_NAMESPACE = 'opencensus.io'; - -/** - * Stack traces are captured when a root span is started. Because the stack - * trace height varies on the context propagation mechanism, to keep published - * stack traces uniform we need to remove the top-most frames when using the - * c-l-s module. Keep track of this number here. - */ -export const ROOT_SPAN_STACK_OFFSET = useAsyncHooks ? 0 : 2; - -export function createNamespace(): CLS.Namespace { - return cls.createNamespace(TRACE_NAMESPACE); -} - -export function destroyNamespace(): void { - cls.destroyNamespace(TRACE_NAMESPACE); -} - -export function getNamespace(): CLS.Namespace { - return cls.getNamespace(TRACE_NAMESPACE); -} diff --git a/packages/opencensus-core/src/internal/util.ts b/packages/opencensus-core/src/internal/util.ts deleted file mode 100644 index 358727af1..000000000 --- a/packages/opencensus-core/src/internal/util.ts +++ /dev/null @@ -1,40 +0,0 @@ -/** - * Copyright 2018 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Code snippets from Stackdriver Trace Agent -// https://github.com/GoogleCloudPlatform/cloud-trace-nodejs - -import * as crypto from 'crypto'; - - -// TODO: rethink this snippet aproach - -// Use 6 bytes of randomness only as JS numbers are doubles not 64-bit ints. -const SPAN_ID_RANDOM_BYTES = 6; - -// Use the faster crypto.randomFillSync when available (Node 7+) falling back to -// using crypto.randomBytes. -const spanIdBuffer = Buffer.alloc(SPAN_ID_RANDOM_BYTES); -const randomFillSync = crypto.randomFillSync; -const randomBytes = crypto.randomBytes; -const spanRandomBuffer = randomFillSync ? - () => randomFillSync(spanIdBuffer) : - () => randomBytes(SPAN_ID_RANDOM_BYTES); - -export function randomSpanId() { - // tslint:disable-next-line:ban Needed to parse hexadecimal. - return parseInt(spanRandomBuffer().toString('hex'), 16).toString(); -} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/config/types.ts b/packages/opencensus-core/src/trace/config/types.ts deleted file mode 100644 index 12947ebdd..000000000 --- a/packages/opencensus-core/src/trace/config/types.ts +++ /dev/null @@ -1,72 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Logger} from '../../common/types'; -import {Exporter} from '../../exporters/types'; -import {PluginNames} from '../instrumentation/types'; - -/** Interface configuration for a buffer. */ -export interface BufferConfig { - /** Maximum size of a buffer. */ - bufferSize?: number; - /** Max time for a buffer can wait before being sent */ - bufferTimeout?: number; - /** A logger object */ - logger?: Logger; -} - -/** Defines tracer configuration parameters */ -export interface TracerConfig { - /** Determines the samplin rate. Ranges from 0.0 to 1.0 */ - samplingRate?: number; - /** Determines the ignored (or blacklisted) URLs */ - ignoreUrls?: Array; - /** A logger object */ - logger?: Logger; -} - -/** Available configuration options. */ -export interface TracingConfig { - /** level of logger - 0:disable, 1: error, 2: warn, 3: info, 4: debug */ - logLevel?: number; - - /** - * The maximum number of characters reported on a label value. - */ - maximumLabelValueSize?: number; - - /** - * A list of trace instrumentations plugins to load. - * Each key is the name of the module to trace, and its - * value is the name of the package which has the plugin - * implementation. - * Ex.: - * plugins: { - * 'http': '@opencensus/opencensus-instrumentation-http', - * 'mongodb-core': '@opencensus/opencensus-instrumentation-mongodb-core', - * ... - * } - * Any user-provided value will be added to the default list. - * It will override any default plugin for the same key. - */ - plugins?: PluginNames; - /** An exporter object */ - exporter?: Exporter; - /** An instance of a logger */ - logger?: Logger; -} - -export type Config = TracingConfig&TracerConfig&BufferConfig; diff --git a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts b/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts deleted file mode 100644 index 9021aface..000000000 --- a/packages/opencensus-core/src/trace/instrumentation/base-plugin.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import * as shimmer from 'shimmer'; -import * as modelTypes from '../model/types'; -import * as types from './types'; - -// TODO: improve Jsdoc comments - -/** This class represent the base to patch plugin. */ -export abstract class BasePlugin implements types.Plugin { - /** Exporters from the nodejs module to be instrumented */ - // tslint:disable:no-any - protected moduleExporters: any; - /** The module name */ - protected moduleName: string; - /** A tracer object. */ - protected tracer: modelTypes.Tracer; - /** The module version. */ - protected version: string; - - /** - * Constructs a new BasePlugin instance. - * @param moduleName The module name. - */ - constructor(moduleName: string) { - this.moduleName = moduleName; - } - - /** - * Sets modified plugin to the context. - * @param moduleExporters object moduleExporters to set as context - * @param tracer tracer relating to context - * @param version module version description - */ - // tslint:disable:no-any - protected setPluginContext( - moduleExporters: any, tracer: modelTypes.Tracer, version: string) { - this.moduleExporters = moduleExporters; - this.tracer = tracer; - this.version = version; - } - - - // TODO: review this implementation - // From the perspective of an instrumentation module author, - // that applyUnpatch is abstract makes it seem like patching is optional, - // while unpatching is not. It should be the other way around - - // tslint:disable:no-any - applyPatch(moduleExporters: any, tracer: modelTypes.Tracer, version: string): - any { - this.setPluginContext(moduleExporters, tracer, version); - } - - abstract applyUnpatch(): void; -} diff --git a/packages/opencensus-core/src/trace/instrumentation/types.ts b/packages/opencensus-core/src/trace/instrumentation/types.ts deleted file mode 100644 index b81fe70be..000000000 --- a/packages/opencensus-core/src/trace/instrumentation/types.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Tracer} from '../model/types'; - -/** Interface Plugin to apply patch. */ -export interface Plugin { - /** - * Method to apply the instrumentation patch - * @param moduleExporters exporters from the module to patch - * @param tracer a tracer instance - * @param version version of the current instaled module to patch - */ - // tslint:disable:no-any - applyPatch(moduleExporters: any, tracer: Tracer, version: string): any; - /** Method to unpatch the instrumentation */ - applyUnpatch(): void; -} - - -/** - * Type PluginNames: each key should be the name of the module to trace, - * and its value should be the name of the package which has the - * plugin implementation. - */ -export type PluginNames = { - [pluginName: string]: string; -}; diff --git a/packages/opencensus-core/src/trace/model/root-span.ts b/packages/opencensus-core/src/trace/model/root-span.ts deleted file mode 100644 index 4c73e7e06..000000000 --- a/packages/opencensus-core/src/trace/model/root-span.ts +++ /dev/null @@ -1,122 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as uuid from 'uuid'; - -import * as logger from '../../common/console-logger'; -import {Clock} from '../../internal/clock'; - -import {Span} from './span'; -import {SpanBase} from './span-base'; -import * as types from './types'; - - -/** Defines a root span */ -export class RootSpan extends SpanBase implements types.RootSpan { - /** A tracer object */ - private tracer: types.Tracer; - /** A list of child spans. */ - private spansLocal: types.Span[]; - /** It's trace ID. */ - private traceIdLocal: string; - - /** - * Constructs a new RootSpanImpl instance. - * @param tracer A tracer object. - * @param context A trace options object to build the root span. - */ - constructor(tracer: types.Tracer, context?: types.TraceOptions) { - super(); - this.tracer = tracer; - this.traceIdLocal = - context && context.spanContext && context.spanContext.traceId ? - context.spanContext.traceId : - (uuid.v4().split('-').join('')); - this.name = context && context.name ? context.name : 'undefined'; - if (context && context.spanContext) { - this.parentSpanId = context.spanContext.spanId || ''; - } - this.spansLocal = []; - this.type = context && context.type ? context.type : null; - this.logger = tracer.logger || logger.logger(); - } - - /** Gets span list from rootspan instance. */ - get spans(): types.Span[] { - return this.spansLocal; - } - - /** Gets trace id from rootspan instance. */ - get traceId(): string { - return this.traceIdLocal; - } - - /** Starts a rootspan instance. */ - start() { - super.start(); - this.logger.debug( - 'starting %s %o', this.className, - {traceId: this.traceId, id: this.id, parentSpanId: this.parentSpanId}); - } - - // TODO: review end() behavior if it should throw an error when it is called - // before start() - /** Ends a rootspan instance. */ - end() { - super.end(); - - for (const span of this.spansLocal) { - if (!span.ended && span.started) { - span.truncate(); - } - } - - this.tracer.onEndSpan(this); - } - - - /** - * Starts a new child span in the root span. - * @param name Span name. - * @param type Span type. - * @param parentSpanId Span parent ID. - */ - startChildSpan(name: string, type: string, parentSpanId?: string): - types.Span { - if (this.ended) { - this.logger.debug( - 'calling %s.startSpan() on ended %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return null; - } - if (!this.started) { - this.logger.debug( - 'calling %s.startSpan() on un-started %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return null; - } - const newSpan = new Span(this); - if (name) { - newSpan.name = name; - } - if (type) { - newSpan.type = type; - } - newSpan.start(); - this.spansLocal.push(newSpan); - return newSpan; - } -} diff --git a/packages/opencensus-core/src/trace/model/span-base.ts b/packages/opencensus-core/src/trace/model/span-base.ts deleted file mode 100644 index 2e0fcb83e..000000000 --- a/packages/opencensus-core/src/trace/model/span-base.ts +++ /dev/null @@ -1,218 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import {Logger} from '../../common/types'; -import {Clock} from '../../internal/clock'; -import {randomSpanId} from '../../internal/util'; - -import * as types from './types'; - - -/** Defines a base model for spans. */ -export abstract class SpanBase implements types.Span { - protected className: string; - /** The clock used to mesure the beginning and ending of a span */ - private clock: Clock = null; - /** Indicates if this span was started */ - private startedLocal = false; - /** Indicates if this span was ended */ - private endedLocal = false; - /** Indicates if this span was forced to end */ - private truncated = false; - /** The Span ID of this span */ - readonly id: string; - /** An object to log information to */ - logger: Logger; - /** A set of attributes, each in the format [KEY]:[VALUE] */ - attributes: types.Attributes = {}; - /** A text annotation with a set of attributes. */ - annotations: types.Annotation[] = []; - /** An event describing a message sent/received between Spans */ - messageEvents: types.MessageEvent[] = []; - /** Pointers from the current span to another span */ - links: types.Link[] = []; - /** If the parent span is in another process. */ - remoteParent: boolean; - /** The span ID of this span's parent. If it's a root span, must be empty */ - parentSpanId: string = null; - /** The resource name of the span */ - name: string = null; - /** Type of span. Used to specify additional relationships between spans */ - type: string = null; - /** A final status for this span */ - status: number; - - /** Constructs a new SpanBaseModel instance. */ - constructor() { - this.className = this.constructor.name; - this.id = randomSpanId(); - } - - /** Gets the trace ID. */ - abstract get traceId(): string; - - - /** Indicates if span was started. */ - get started(): boolean { - return this.startedLocal; - } - - /** Indicates if span was ended. */ - get ended(): boolean { - return this.endedLocal; - } - - /** - * Gives a timestamp that indicates the span's start time in RFC3339 UTC - * "Zulu" format. - */ - get startTime(): Date { - if (!this.clock) { - this.logger.debug('calling startTime() on null clock'); - return null; - } - - return this.clock.startTime; - } - - /** - * Gives a timestap that indicates the span's end time in RFC3339 UTC - * "Zulu" format. - */ - get endTime(): Date { - if (!this.clock) { - this.logger.debug('calling endTime() on null clock'); - return null; - } - - return this.clock.endTime; - } - - /** - * Gives a timestap that indicates the span's duration in RFC3339 UTC - * "Zulu" format. - */ - get duration(): number { - if (!this.clock) { - this.logger.debug('calling duration() on null clock'); - return null; - } - - return this.clock.duration; - } - - /** Gives the TraceContext of the span. */ - get spanContext(): types.SpanContext { - return { - traceId: this.traceId.toString(), - spanId: this.id.toString(), - parentSpanId: this.parentSpanId - } as types.SpanContext; - } - - /** - * Adds an atribute to the span. - * @param key Describes the value added. - * @param value The result of an operation. - */ - addAttribute(key: string, value: string|number|boolean) { - this.attributes[key] = value; - } - - /** - * Adds an annotation to the span. - * @param description Describes the event. - * @param timestamp A timestamp that maks the event. - * @param attributes A set of attributes on the annotation. - */ - addAnnotation( - description: string, timestamp: number, attributes?: types.Attributes) { - this.annotations.push({ - 'description': description, - 'timestamp': timestamp, - 'attributes': attributes, - } as types.Annotation); - } - - /** - * Adds a link to the span. - * @param traceId The trace ID for a trace within a project. - * @param spanId The span ID for a span within a trace. - * @param type The relationship of the current span relative to the linked. - * @param attributes A set of attributes on the link. - */ - addLink( - traceId: string, spanId: string, type: string, - attributes?: types.Attributes) { - this.links.push({ - 'traceId': traceId, - 'spanId': spanId, - 'type': type, - 'attributes': attributes - } as types.Link); - } - - /** - * Adds a message event to the span. - * @param type The type of message event. - * @param id An identifier for the message event. - */ - addMessageEvent(type: string, id: string) { - this.messageEvents.push({ - 'type': type, - 'id': id, - } as types.MessageEvent); - } - - /** Starts the span. */ - start() { - if (this.started) { - this.logger.debug( - 'calling %s.start() on already started %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return; - } - this.clock = new Clock(); - this.startedLocal = true; - } - - /** Ends the span. */ - end(): void { - if (this.ended) { - this.logger.debug( - 'calling %s.end() on already ended %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return; - } - if (!this.started) { - this.logger.debug( - 'calling %s.end() on un-started %s %o', this.className, - this.className, {id: this.id, name: this.name, type: this.type}); - return; - } - this.startedLocal = false; - this.endedLocal = true; - this.clock.end(); - } - - - /** Forces the span to end. */ - truncate() { - this.truncated = true; - this.end(); - this.logger.debug( - 'truncating %s %o', this.className, {id: this.id, name: this.name}); - } -} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/model/span.ts b/packages/opencensus-core/src/trace/model/span.ts deleted file mode 100644 index 9842b199a..000000000 --- a/packages/opencensus-core/src/trace/model/span.ts +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as logger from '../../common/console-logger'; - -import {SpanBase} from './span-base'; -import * as types from './types'; - - -/** Defines a Span. */ -export class Span extends SpanBase implements types.Span { - private root: types.RootSpan; - - /** - * Constructs a new SpanImpl instance. - * @param root - */ - constructor(root: types.RootSpan) { - super(); - this.root = root; - this.logger = this.root.logger || logger.logger(); - } - - /** Gets trace id of span. */ - get traceId(): string { - return this.root.traceId; - } - - /** Gets trace context of span. */ - get spanContext(): types.SpanContext { - return { - traceId: this.traceId.toString(), - spanId: this.id.toString(), - options: 1 // always traced - }; - } - - /** Starts the span instance. */ - start() { - super.start(); - this.logger.debug( - 'starting span %o', - {traceId: this.traceId, spanId: this.id, name: this.name}); - } - - - - /** Ends the span. */ - end(): void { - super.end(); - this.logger.debug('ending span %o', { - spanId: this.id, - traceId: this.traceId, - name: this.name, - startTime: this.startTime, - endTime: this.endTime, - duration: this.duration - }); - } -} diff --git a/packages/opencensus-core/src/trace/model/tracer.ts b/packages/opencensus-core/src/trace/model/tracer.ts deleted file mode 100644 index 4d5267e15..000000000 --- a/packages/opencensus-core/src/trace/model/tracer.ts +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as logger from '../../common/console-logger'; -import * as loggerTypes from '../../common/types'; -import * as cls from '../../internal/cls'; -import * as configTypes from '../config/types'; -import {Sampler} from '../sampler/sampler'; -import * as samplerTypes from '../sampler/types'; - -import {RootSpan} from './root-span'; -import {Span} from './span'; -import * as types from './types'; - - -/** - * This class represent a tracer. - */ -export class Tracer implements types.Tracer { - /** Indicates if the tracer is active */ - private activeLocal: boolean; - /** Manage context automatic propagation */ - private contextManager: cls.Namespace; - /** A configuration for starting the tracer */ - private config: configTypes.TracerConfig; - /** A list of end span event listeners */ - private eventListenersLocal: types.OnEndSpanEventListener[] = []; - /** A list of ended root spans */ - private endedTraces: types.RootSpan[] = []; - /** Bit to represent whether trace is sampled or not. */ - private readonly IS_SAMPLED = 0x1; - /** A sampler used to make sample decisions */ - sampler: samplerTypes.Sampler; - /** A configuration for starting the tracer */ - logger: loggerTypes.Logger = logger.logger(); - - - /** Constructs a new TraceImpl instance. */ - constructor() { - this.activeLocal = false; - this.contextManager = cls.createNamespace(); - this.clearCurrentTrace(); - } - - /** Gets the current root span. */ - get currentRootSpan(): types.RootSpan { - return this.contextManager.get('rootspan'); - } - - /** Sets the current root span. */ - set currentRootSpan(root: types.RootSpan) { - this.contextManager.set('rootspan', root); - } - - /** - * Starts a tracer. - * @param config A tracer configuration object to start a tracer. - */ - start(config: configTypes.TracerConfig): types.Tracer { - this.activeLocal = true; - this.config = config; - this.logger = this.config.logger || logger.logger(); - this.sampler = new Sampler().probability(config.samplingRate); - return this; - } - - /** Stops the tracer. */ - stop(): types.Tracer { - this.activeLocal = false; - return this; - } - - /** Gets the list of event listners. */ - get eventListeners(): types.OnEndSpanEventListener[] { - return this.eventListenersLocal; - } - - /** Indicates if the tracer is active or not. */ - get active(): boolean { - return this.activeLocal; - } - - /** - * Starts a root span. - * @param options A TraceOptions object to start a root span. - * @param fn A callback function to run after starting a root span. - */ - startRootSpan( - options: types.TraceOptions, fn: (root: types.RootSpan) => T): T { - return this.contextManager.runAndReturn((root) => { - let newRoot = null; - if (this.active) { - let propagatedSample = null; - - // if there is a context propagation, keep the decistion - if (options && options.spanContext) { - if (options.spanContext.options) { - propagatedSample = - ((options.spanContext.options & this.IS_SAMPLED) !== 0); - } - if (!propagatedSample) { - options.spanContext = null; - } - } - const aRoot = new RootSpan(this, options); - const sampleDecision: boolean = propagatedSample ? - propagatedSample : - this.sampler.shouldSample(aRoot.traceId); - - if (sampleDecision) { - aRoot.start(); - this.currentRootSpan = aRoot; - newRoot = aRoot; - } - } else { - this.logger.debug('Tracer is inactive, can\'t start new RootSpan'); - } - return fn(newRoot); - }); - } - - /** - * Is called when a span is ended. - * @param root The ended span. - */ - onEndSpan(root: types.RootSpan): void { - if (this.active) { - if (!root) { - return this.logger.debug('cannot end trace - no active trace found'); - } - if (this.currentRootSpan !== root) { - this.logger.debug( - 'currentRootSpan != root on notifyEnd. Need more investigation.'); - } - this.notifyEndSpan(root); - } - } - - /** - * Registers an end span event listener. - * @param listener The listener to register. - */ - registerEndSpanListener(listner: types.OnEndSpanEventListener) { - this.eventListenersLocal.push(listner); - } - - private notifyEndSpan(root: types.RootSpan) { - if (this.active) { - this.logger.debug('starting to notify listeners the end of rootspans'); - if (this.eventListenersLocal && this.eventListenersLocal.length > 0) { - for (const listener of this.eventListenersLocal) { - listener.onEndSpan(root); - } - } - } else { - this.logger.debug('this tracer is inactivate cant notify endspan'); - } - } - - /** Clears the current root span. */ - clearCurrentTrace() { - this.currentRootSpan = null; - } - - /** - * Starts a span. - * @param name The span name. - * @param type The span type. - */ - startChildSpan(name?: string, type?: string): types.Span { - let newSpan: types.Span = null; - if (!this.currentRootSpan) { - this.logger.debug( - 'no current trace found - must start a new root span first'); - } else { - newSpan = this.currentRootSpan.startChildSpan(name, type); - } - return newSpan; - } - - /** - * Binds the trace context to the given function. - * This is necessary in order to create child spans correctly in functions - * that are called asynchronously (for example, in a network response - * handler). - * @param fn A function to which to bind the trace context. - */ - wrap(fn: types.Func): types.Func { - if (!this.active) { - return fn; - } - const namespace = this.contextManager; - return namespace.bind(fn); - } - - /** - * Binds the trace context to the given event emitter. - * This is necessary in order to create child spans correctly in event - * handlers. - * @param emitter An event emitter whose handlers should have - * the trace context binded to them. - */ - wrapEmitter(emitter: NodeJS.EventEmitter): void { - if (!this.active) { - return; - } - const namespace = this.contextManager; - namespace.bindEmitter(emitter); - } -} diff --git a/packages/opencensus-core/src/trace/model/types.ts b/packages/opencensus-core/src/trace/model/types.ts deleted file mode 100644 index 5bf8e3509..000000000 --- a/packages/opencensus-core/src/trace/model/types.ts +++ /dev/null @@ -1,277 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as loggerTypes from '../../common/types'; -import * as configTypes from '../config/types'; -import * as samplerTypes from '../sampler/types'; - - - -/** Default type for functions */ -// tslint:disable:no-any -export type Func = (...args: any[]) => T; - -/** Maps a label to a string, number or boolean. */ -export interface Attributes { [attributeKey: string]: string|number|boolean; } - -/** A text annotation with a set of attributes. */ -export interface Annotation { - /** A user-supplied message describing the event. */ - description: string; - /** A timestamp that maks the event. */ - timestamp: number; - /** A set of attributes on the annotation. */ - attributes: Attributes; -} - -/** An event describing a message sent/received between Spans. */ -export interface MessageEvent { - /** Indicates whether the message was sent or received. */ - type: string; - /** An identifier for the MessageEvent's message. */ - id: string; -} - -/** - * A pointer from the current span to another span in the same trace or in a - * different trace. - */ -export interface Link { - /** The trace ID for a trace within a project. */ - traceId: string; - /** The span ID for a span within a trace. */ - spanId: string; - /** The relationship of the current span relative to the linked. */ - type: string; - /** A set of attributes on the link. */ - attributes: Attributes; -} - -/** Defines the trace options */ -export interface TraceOptions { - /** Root span name */ - name: string; - /** Trace context */ - spanContext?: SpanContext; - /** Span type */ - type?: string; -} - -/** Defines the span context */ -export interface SpanContext { - /** Trace ID */ - traceId: string; - /** Span ID */ - spanId: string; - /** Options */ - options?: number; -} - -/** Defines an end span event listener */ -export interface OnEndSpanEventListener { - /** Happens when a span is ended */ - onEndSpan(span: RootSpan): void; -} - -/** Interface for Span */ -export interface Span { - /** The Span ID of this span */ - readonly id: string; - - /** If the parent span is in another process. */ - remoteParent: boolean; - - /** The span ID of this span's parent. If it's a root span, must be empty */ - parentSpanId: string; - - /** The resource name of the span */ - name: string; - - /** Type of span. Used to specify additional relationships between spans */ - type: string; - - /** An object to log information to */ - logger: loggerTypes.Logger; - - /** A final status for this span */ - status: number; - - /** A set of attributes, each in the format [KEY]:[VALUE] */ - attributes: Attributes; - - /** A text annotation with a set of attributes. */ - annotations: Annotation[]; - - /** An event describing a message sent/received between Spans. */ - messageEvents: MessageEvent[]; - - /** Pointers from the current span to another span */ - links: Link[]; - - /** Constructs a new SpanBaseModel instance. */ - readonly traceId: string; - - /** Indicates if span was started. */ - readonly started: boolean; - - /** Indicates if span was ended. */ - readonly ended: boolean; - - /** - * Gives a timestap that indicates the span's start time in RFC3339 UTC - * "Zulu" format. - */ - readonly startTime: Date; - - /** - * Gives a timestap that indicates the span's end time in RFC3339 UTC - * "Zulu" format. - */ - readonly endTime: Date; - - /** - * Gives a timestap that indicates the span's duration in RFC3339 UTC - * "Zulu" format. - */ - readonly duration: number; - - /** Gives the TraceContext of the span. */ - readonly spanContext: SpanContext; - - /** - * Adds an atribute to the span. - * @param key Describes the value added. - * @param value The result of an operation. - */ - addAttribute(key: string, value: string): void; - - /** - * Adds an annotation to the span. - * @param description Describes the event. - * @param timestamp A timestamp that maks the event. - * @param attributes A set of attributes on the annotation. - */ - addAnnotation( - description: string, timestamp: number, attributes?: Attributes): void; - - /** - * Adds a link to the span. - * @param traceId The trace ID for a trace within a project. - * @param spanId The span ID for a span within a trace. - * @param type The relationship of the current span relative to the linked. - * @param attributes A set of attributes on the link. - */ - addLink( - traceId: string, spanId: string, type: string, - attributes?: Attributes): void; - - /** - * Adds a message event to the span. - * @param type The type of message event. - * @param id An identifier for the message event. - */ - addMessageEvent(type: string, id: string): void; - - /** Starts a span. */ - start(): void; - - /** Ends a span. */ - end(): void; - - /** Forces to end a span. */ - truncate(): void; -} - -/** Interface for RootSpan */ -export interface RootSpan extends Span { - /** Get the span list from RootSpan instance */ - readonly spans: Span[]; - - /** Starts a new Span instance in the RootSpan instance */ - startChildSpan(name: string, type: string): Span; -} - - -/** Interface for Tracer */ -export interface Tracer extends OnEndSpanEventListener { - /** Get and set the currentRootSpan to tracer instance */ - currentRootSpan: RootSpan; - - /** A sampler that will decide if the span will be sampled or not */ - sampler: samplerTypes.Sampler; - - /** A configuration for starting the tracer */ - logger: loggerTypes.Logger; - - /** Get the eventListeners from tracer instance */ - readonly eventListeners: OnEndSpanEventListener[]; - - /** Get the active status from tracer instance */ - readonly active: boolean; - - /** - * Start a tracer instance - * @param config Configuration for tracer instace - * @returns A tracer instance started - */ - start(config: configTypes.TracerConfig): Tracer; - - /** Stop the tracer instance */ - stop(): Tracer; - - /** - * Start a new RootSpan to currentRootSpan - * @param options Options for tracer instance - * @param fn Callback function - * @returns The callback return - */ - startRootSpan(options: TraceOptions, fn: (root: RootSpan) => T): T; - - /** - * Start a new Span instance to the currentRootSpan - * @param name Span name - * @param type Span type - * @returns The new Span instance started - */ - startChildSpan(name?: string, type?: string): Span; - - /** - * Register a OnEndSpanEventListener on the tracer instance - * @param listener An OnEndSpanEventListener instance - */ - registerEndSpanListener(listener: OnEndSpanEventListener): void; - - /** Clear the currentRootSpan from tracer instance */ - clearCurrentTrace(): void; - - /** - * Binds the trace context to the given function. - * This is necessary in order to create child spans correctly in functions - * that are called asynchronously (for example, in a network response - * handler). - * @param fn A function to which to bind the trace context. - */ - wrap(fn: Func): Func; - - /** - * Binds the trace context to the given event emitter. - * This is necessary in order to create child spans correctly in event - * handlers. - * @param emitter An event emitter whose handlers should have - * the trace context binded to them. - */ - wrapEmitter(emitter: NodeJS.EventEmitter): void; -} diff --git a/packages/opencensus-core/src/trace/sampler/sampler.ts b/packages/opencensus-core/src/trace/sampler/sampler.ts deleted file mode 100644 index 91ed245c4..000000000 --- a/packages/opencensus-core/src/trace/sampler/sampler.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {randomSpanId} from '../../internal/util'; -import * as types from './types'; - - -const MIN_NUMBER = Number.MIN_VALUE; -const MAX_NUMBER = Number.MAX_VALUE; - - -/** This class represent the probability of a tracer. */ -export class Sampler implements types.Sampler { - private idUpperBound: number; - description: string; - - /** - * Constructs a new Sampler instance. - */ - constructor() {} - - /** - * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1 - * @returns a Sampler object - */ - always(): Sampler { - this.description = 'always'; - this.idUpperBound = MAX_NUMBER; - return this; - } - - /** - * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0 - * @returns a Sampler object - */ - never(): Sampler { - this.description = 'never'; - this.idUpperBound = MIN_NUMBER; - return this; - } - - /** - * Sets idUpperBound with the probability. If probability - * parameter is bigger then 1 set always. If probability parameter less - * than 0, set never. - * @param probability probability between 0 and 1 - * @returns a Sampler object - */ - probability(probability: number): Sampler { - if (probability >= 1.0) { - return this.always(); - } else if (probability <= 0) { - return this.never(); - } - this.description = `probability.(${probability})`; - this.idUpperBound = probability * MAX_NUMBER; - return this; - } - - /** - * Checks if trace belong the sample. - * @param traceId Used to check the probability - * @returns a boolean. True if the traceId is in probability - * False if the traceId is not in probability. - */ - shouldSample(traceId: string): boolean { - const LOWER_BYTES = traceId ? traceId.substring(16) : '0'; - // tslint:disable-next-line:ban Needed to parse hexadecimal. - const LOWER_LONG = parseInt(LOWER_BYTES, 16); - - if (LOWER_LONG <= this.idUpperBound) { - return true; - } else { - return false; - } - } -} \ No newline at end of file diff --git a/packages/opencensus-core/src/trace/sampler/types.ts b/packages/opencensus-core/src/trace/sampler/types.ts deleted file mode 100644 index 4942aa4dc..000000000 --- a/packages/opencensus-core/src/trace/sampler/types.ts +++ /dev/null @@ -1,55 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import {Logger} from '../../common/types'; -import {Exporter} from '../../exporters/types'; -import {PluginNames} from '../instrumentation/types'; - -/** This interface represent the probability of a tracer. */ -export interface Sampler { - /** - * A Sampler description name - */ - description: string; - /** - * Sets idUpperBound with MAX_NUMBER that is equivalent the probability be 1. - * @returns a Sampler object. - */ - always(): Sampler; - - /** - * Sets idUpperBound with MIN_NUMBER that is equivalent the probability be 0. - * @returns a Sampler object. - */ - never(): Sampler; - - /** - * Sets idUpperBound with the probability. If probability - * parameter is bigger then 1 set always. If probability parameter less - * than 0, set never. - * @param probability probability between 0 and 1. - * @returns a Sampler object. - */ - probability(probability: number): Sampler; - - /** - * Checks if trace belong the sample. - * @param traceId Used to check the probability. - * @returns a boolean. True if the traceId is in probability - * False if the traceId is not in probability. - */ - shouldSample(traceId: string): boolean; -} diff --git a/packages/opencensus-core/src/trace/types.ts b/packages/opencensus-core/src/trace/types.ts deleted file mode 100644 index 77f1bb864..000000000 --- a/packages/opencensus-core/src/trace/types.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as exportersTypes from '../exporters/types'; - -import * as configTypes from './config/types'; -import * as modelTypes from './model/types'; -import * as samplerTypes from './sampler/types'; - -/** Main interface for tracing. */ -export interface Tracing { - /** Object responsible for managing a trace. */ - readonly tracer: modelTypes.Tracer; - - /** Service to send collected traces to. */ - readonly exporter: exportersTypes.Exporter; - - /** - * Enables the tracing process. - * @param userConfig A configuration object. - * @returns The tracing object. - */ - start(userConfig?: configTypes.Config): Tracing; - - /** Stops tracing. */ - stop(): void; - - /** - * Registers an exporter to send the collected traces to. - * @param exporter The exporter to send the traces to. - * @returns The tracing object. - */ - registerExporter(exporter: exportersTypes.Exporter): Tracing; -} diff --git a/packages/opencensus-core/test/test-console-exporter.ts b/packages/opencensus-core/test/test-console-exporter.ts deleted file mode 100644 index 82bc79a2e..000000000 --- a/packages/opencensus-core/test/test-console-exporter.ts +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the 'License'); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an 'AS IS' BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as mocha from 'mocha'; - -import {ConsoleExporter, NoopExporter} from '../src/exporters/console-exporter'; -import {ExporterBuffer} from '../src/exporters/exporter-buffer'; -import {RootSpan} from '../src/trace/model/root-span'; -import {Tracer} from '../src/trace/model/tracer'; - -const tracer = new Tracer().start({}); -const DEFAULT_BUFFER_SIZE = 3; -const DEFAULT_BUFFER_TIMEOUT = 20000; // time in milliseconds -const defaultBufferConfig = { - bufferSize: DEFAULT_BUFFER_SIZE, - bufferTimeout: DEFAULT_BUFFER_TIMEOUT -}; - -const createRootSpans = (): RootSpan[] => { - const rootSpans = []; - for (let i = 0; i < DEFAULT_BUFFER_SIZE + 1; i++) { - const rootSpan = new RootSpan(tracer, {name: `rootSpan.${i}`}); - rootSpan.start(); - for (let j = 0; j < 10; j++) { - rootSpan.startChildSpan(`childSpan.${i}.${j}`, 'client'); - } - rootSpans.push(rootSpan); - } - return rootSpans; -}; - - -describe('NoopExporter', () => { - /** Should do nothing when calling onEndSpan() */ - describe('onEndSpan()', () => { - it('should do anything', () => { - const exporter = new NoopExporter(); - const rootSpan = new RootSpan(tracer); - exporter.onEndSpan(rootSpan); - assert.ok(true); - }); - }); - - /** Should do anything when calling publish() */ - describe('publish()', () => { - it('should do anything', () => { - const exporter = new NoopExporter(); - const rootSpan = new RootSpan(tracer); - const queue: RootSpan[] = []; - queue.push(rootSpan); - - exporter.publish(queue); - assert.ok(true); - }); - }); -}); - -describe('ConsoleLogExporter', () => { - /** Should end a span */ - describe('onEndSpan()', () => { - it('should end a span', () => { - const exporter = new ConsoleExporter(defaultBufferConfig); - tracer.registerEndSpanListener(exporter); - // const rootSpan = new RootSpan(tracer); - const rootSpans = createRootSpans(); - for (const rootSpan of rootSpans) { - rootSpan.end(); - } - assert.ok(true); - }); - }); - - /** Should publish the rootspan in queue */ - describe('publish()', () => { - it('should publish the rootspans in queue', () => { - const exporter = new ConsoleExporter(defaultBufferConfig); - const rootSpan = new RootSpan(tracer); - rootSpan.startChildSpan('name', 'type', rootSpan.traceId); - const queue: RootSpan[] = []; - queue.push(rootSpan); - - exporter.publish(queue); - assert.ok(true); - }); - }); -}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-console-logger.ts b/packages/opencensus-core/test/test-console-logger.ts deleted file mode 100644 index 7f28435d3..000000000 --- a/packages/opencensus-core/test/test-console-logger.ts +++ /dev/null @@ -1,154 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the 'License'); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an 'AS IS' BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as mocha from 'mocha'; - -import * as logger from '../src/common/console-logger'; -import {ConsoleLogger} from '../src/common/console-logger'; -import {Logger} from '../src/common/types'; - - -const LEVELS = ['silent', 'error', 'warn', 'info', 'debug', 'silly']; -let consoleTxt = ''; - -// TODO: Review test cases: Maybe testing the info log level is sufficient -// because it already shows that lower levels will log, and higher levels won't. - -describe('ConsoleLogger', () => { - const intercept = require('intercept-stdout'); - const unhookIntercept = intercept((txt) => { - consoleTxt = txt; - return txt; - }); - - /** Should create a new ConsoleLogger */ - describe('new ConsoleLogger()', () => { - it('should log with default levels', () => { - const consoleLogger = logger.logger(); - assert.equal(LEVELS.length, ConsoleLogger.LEVELS.length); - }); - - it('should log with error', () => { - const consoleLogger = logger.logger(1); - assert.strictEqual(LEVELS[1], consoleLogger.level); - }); - }); - - /** Should logger only error log */ - describe('error logger', () => { - const consoleLogger = logger.logger(LEVELS[1]); - - it('should log error', () => { - consoleTxt = ''; - consoleLogger.error('error test logger'); - unhookIntercept(); - const validateString = consoleTxt.indexOf('error'); - - assert.ok(validateString >= 0); - }); - - it('should not log warn', () => { - consoleTxt = ''; - consoleLogger.warn('warn test logger'); - unhookIntercept(); - - const validateString = consoleTxt.indexOf('warn'); - - assert.equal(validateString, -1); - }); - - it('should not log info', () => { - consoleTxt = ''; - consoleLogger.info('info test logger'); - unhookIntercept(); - - const validateString = consoleTxt.indexOf('info'); - - assert.equal(validateString, -1); - }); - - it('should not log debug', () => { - consoleTxt = ''; - consoleLogger.debug('debug test logger'); - unhookIntercept(); - const validateString = consoleTxt.indexOf('debug'); - - assert.equal(validateString, -1); - }); - - it('should not log silly', () => { - consoleTxt = ''; - consoleLogger.silly('silly test logger'); - unhookIntercept(); - const validateString = consoleTxt.indexOf('silly'); - - assert.equal(validateString, -1); - }); - }); - - /** Should disable logger */ - describe('silent logger', () => { - const consoleLogger = logger.logger(0); - - it('should not log error', () => { - consoleTxt = ''; - consoleLogger.error('error test logger'); - unhookIntercept(); - const validateString = consoleTxt.indexOf('error'); - - assert.equal(validateString, -1); - }); - - it('should not log warn', () => { - consoleTxt = ''; - consoleLogger.warn('warn test logger'); - unhookIntercept(); - - const validateString = consoleTxt.indexOf('warn'); - - assert.equal(validateString, -1); - }); - - it('should not log info', () => { - consoleTxt = ''; - consoleLogger.info('info test logger'); - unhookIntercept(); - - const validateString = consoleTxt.indexOf('info'); - - assert.equal(validateString, -1); - }); - - it('should not log debug', () => { - consoleTxt = ''; - consoleLogger.debug('debug test logger'); - unhookIntercept(); - const validateString = consoleTxt.indexOf('debug'); - - assert.equal(validateString, -1); - }); - - it('should not log silly', () => { - consoleTxt = ''; - consoleLogger.silly('silly test logger'); - unhookIntercept(); - const validateString = consoleTxt.indexOf('silly'); - - assert.equal(validateString, -1); - }); - }); -}); diff --git a/packages/opencensus-core/test/test-exporter-buffer.ts b/packages/opencensus-core/test/test-exporter-buffer.ts deleted file mode 100644 index bf0fb68ed..000000000 --- a/packages/opencensus-core/test/test-exporter-buffer.ts +++ /dev/null @@ -1,117 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as mocha from 'mocha'; - -import * as logger from '../src/common/console-logger'; -import {NoopExporter} from '../src/exporters/console-exporter'; -import {ExporterBuffer} from '../src/exporters/exporter-buffer'; -import {RootSpan} from '../src/trace/model/root-span'; -import {Tracer} from '../src/trace/model/tracer'; - - -const exporter = new NoopExporter(); -const DEFAULT_BUFFER_SIZE = 3; -const DEFAULT_BUFFER_TIMEOUT = 2000; // time in milliseconds -const tracer = new Tracer().start({}); - -const defaultBufferConfig = { - bufferSize: DEFAULT_BUFFER_SIZE, - bufferTimeout: DEFAULT_BUFFER_TIMEOUT, - logger: logger.logger() -}; - - -const createRootSpans = (num: number): RootSpan[] => { - const rootSpans = []; - for (let i = 0; i < num; i++) { - const rootSpan = new RootSpan(tracer, {name: `rootSpan.${i}`}); - rootSpan.start(); - for (let j = 0; j < 10; j++) { - rootSpan.startChildSpan(`childSpan.${i}.${j}`, 'client'); - } - rootSpans.push(rootSpan); - } - return rootSpans; -}; - -describe('ExporterBuffer', () => { - /** - * Should create a Buffer with exporter, DEFAULT_BUFFER_SIZE and - * DEFAULT_BUFFER_TIMEOUT - */ - describe('new ExporterBuffer()', () => { - it('should create a Buffer instance', () => { - const buffer = new ExporterBuffer(exporter, defaultBufferConfig); - assert.ok(buffer instanceof ExporterBuffer); - }); - }); - - /** - * Should return the Buffer - */ - describe('setBufferSize', () => { - it('should set BufferSize', () => { - const buffer = new ExporterBuffer(exporter, defaultBufferConfig); - const newBufferSize = DEFAULT_BUFFER_SIZE + 10; - const bufferResize = buffer.setBufferSize(newBufferSize); - assert.ok(bufferResize instanceof ExporterBuffer); - assert.strictEqual(bufferResize.getBufferSize(), newBufferSize); - }); - }); - - /** - * Should add one item to the Buffer - */ - describe('addToBuffer', () => { - it('should add one item to the Buffer', () => { - const buffer = new ExporterBuffer(exporter, defaultBufferConfig); - buffer.addToBuffer(new RootSpan(tracer)); - assert.strictEqual(buffer.getQueue().length, 1); - }); - }); - - /** - * Should force flush - */ - describe('addToBuffer force flush ', () => { - it('should force flush', () => { - const buffer = new ExporterBuffer(exporter, defaultBufferConfig); - const rootSpans = createRootSpans(DEFAULT_BUFFER_SIZE); - for (const rootSpan of rootSpans) { - buffer.addToBuffer(rootSpan); - } - assert.strictEqual(buffer.getQueue().length, buffer.getBufferSize()); - buffer.addToBuffer(new RootSpan(tracer)); - assert.strictEqual(buffer.getQueue().length, 0); - }); - }); - - /** - * Should flush by timeout - */ - describe('addToBuffer force flush by timeout ', () => { - it('should flush by timeout', () => { - const buffer = new ExporterBuffer(exporter, defaultBufferConfig); - buffer.addToBuffer(new RootSpan(tracer)); - assert.strictEqual(buffer.getQueue().length, 1); - setTimeout(() => { - assert.strictEqual(buffer.getQueue().length, 0); - }, DEFAULT_BUFFER_TIMEOUT + 100); - }); - }); -}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-root-span.ts b/packages/opencensus-core/test/test-root-span.ts deleted file mode 100644 index 2a4112224..000000000 --- a/packages/opencensus-core/test/test-root-span.ts +++ /dev/null @@ -1,256 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the 'License'); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an 'AS IS' BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as mocha from 'mocha'; - -import {RootSpan} from '../src/trace/model/root-span'; -import {Span} from '../src/trace/model/span'; -import {Tracer} from '../src/trace/model/tracer'; -import {Annotation, Attributes, Link, MessageEvent, TraceOptions} from '../src/trace/model/types'; - -const tracer = new Tracer(); - -describe('RootSpan', () => { - /** - * Should create a RootSpan instance - */ - describe('new RootSpan()', () => { - it('should create a RootSpan instance', () => { - const root = new RootSpan(tracer); - assert.ok(root instanceof RootSpan); - }); - }); - - /** - * Should create a RootSpan instance with options - */ - describe('new RootSpan() with options', () => { - it('should create a RootSpan instance with options', () => { - const trace = new RootSpan(tracer); - const options = {name: 'test', spanContext: trace.spanContext} as - TraceOptions; - const root = new RootSpan(tracer, options); - assert.ok(root instanceof RootSpan); - }); - }); - - /** - * Should get span list from rootspan instance - */ - describe('get spans()', () => { - it('should get span list from rootspan instance', () => { - const root = new RootSpan(tracer); - // TODO: Suggetion: make sure that root.spans.length is 1, - // and that it's the same as the earlier (shadowed) span object - root.start(); - const span = root.startChildSpan('spanName', 'spanType'); - assert.strictEqual(root.spans.length, 1); - assert.strictEqual(span, root.spans[0]); - - for (const span of root.spans) { - assert.ok(span instanceof Span); - } - }); - }); - - /** - * Should get trace id from rootspan instance - */ - describe('new traceId()', () => { - it('should get trace id from rootspan instance', () => { - const root = new RootSpan(tracer); - assert.equal(root.traceId, root.spanContext.traceId); - }); - }); - - /** - * Should create and start a RootSpan instance - */ - describe('start()', () => { - it('should start a RootSpan instance', () => { - const root = new RootSpan(tracer); - root.start(); - assert.ok(root.started); - }); - }); - - /** - * Should create and start a new span instance - */ - describe('startSpan()', () => { - let root, span; - - before(() => { - root = new RootSpan(tracer); - root.start(); - span = root.startChildSpan('spanName', 'spanType'); - }); - - it('should create span instance', () => { - assert.ok(span instanceof Span); - }); - - it('should start a span instance', () => { - assert.ok(span.started); - }); - }); - - /** - * Should not start a span from a not started rootspan - */ - describe('startSpan() before start rootspan', () => { - it('should not create span', () => { - const root = new RootSpan(tracer); - const span = root.startChildSpan('spanName', 'spanType'); - assert.strictEqual(span, null); - }); - }); - - /** - * Should not create a span from a ended rootspan - */ - describe('startSpan() after rootspan ended', () => { - it('should not create span', () => { - const root = new RootSpan(tracer); - root.start(); - root.end(); - const span = root.startChildSpan('spanName', 'spanType'); - assert.strictEqual(span, null); - }); - }); - - /** - * Should end a rootspan instance - */ - describe('end()', () => { - it('should end the rootspan instance', () => { - const root = new RootSpan(tracer); - root.start(); - root.end(); - assert.ok(root.ended); - }); - }); - - /** - * Should not end a rootspan which was not started - */ - describe('end() before start rootspan', () => { - it('should not end rootspan', () => { - const root = new RootSpan(tracer); - root.end(); - assert.ok(!root.ended); - }); - }); - - /** - * Should end all spans inside rootspan - */ - describe('end() before end all spans', () => { - it('should end all spans inside rootspan', () => { - const root = new RootSpan(tracer); - root.start(); - const span = root.startChildSpan('spanName', 'spanType'); - root.end(); - - for (const span of root.spans) { - assert.ok(span.ended); - } - }); - }); - - - /** - * Should add an attrinbutes - */ - describe('addAtribute()', () => { - it('should add an attribute', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - ['String', 'Number', 'Boolean'].map(attType => { - rootSpan.addAttribute('testKey' + attType, 'testValue' + attType); - assert.equal( - rootSpan.attributes['testKey' + attType], 'testValue' + attType); - }); - }); - }); - - /** - * Should add an annotation - */ - describe('addAnnotation()', () => { - it('should add an annotation', () => { - // tslint:disable:no-any - function instanceOfAnnotation(object: any): object is Annotation { - return 'description' in object && 'timestamp' in object && - 'attributes' in object; - } - - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - rootSpan.addAnnotation('description test', Date.now(), {} as Attributes); - - assert.ok(rootSpan.annotations.length > 0); - assert.ok(instanceOfAnnotation(rootSpan.annotations[0])); - }); - }); - - /** - * Should add a Link. - */ - describe('addLink()', () => { - it('should add a Link', () => { - // tslint:disable:no-any - function instanceOfLink(object: any): object is Link { - return 'traceId' in object && 'spanId' in object && 'type' in object; - } - - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.start(); - - const LINK_TYPE = 'CHILD_LINKED_SPAN'; - rootSpan.addLink(rootSpan.traceId, span.id, LINK_TYPE); - - assert.ok(rootSpan.links.length > 0); - assert.ok(instanceOfLink(rootSpan.links[0])); - }); - }); - - /** - * Should add a Message Event. - */ - describe('addMessageEvent()', () => { - it('should add a Message Event', () => { - // tslint:disable:no-any - function instanceOfLink(object: any): object is Link { - return 'type' in object && 'id' in object; - } - - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - rootSpan.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); - - assert.ok(rootSpan.messageEvents.length > 0); - assert.ok(instanceOfLink(rootSpan.messageEvents[0])); - }); - }); -}); diff --git a/packages/opencensus-core/test/test-sampler.ts b/packages/opencensus-core/test/test-sampler.ts deleted file mode 100644 index d7dc1195c..000000000 --- a/packages/opencensus-core/test/test-sampler.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as mocha from 'mocha'; - -import {RootSpan} from '../src/trace/model/root-span'; -import {Tracer} from '../src/trace/model/tracer'; -import {Sampler} from '../src/trace/sampler/sampler'; - -const tracer = new Tracer(); - -describe('Sampler', () => { - /** - * Should return true - */ - describe('shouldSample() always', () => { - it('should return true', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler(); - sampler.always(); - const samplerShouldSampler = sampler.shouldSample(root.traceId); - assert.ok(samplerShouldSampler); - }); - it('should return a always sampler for 1', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler().probability(1); - const samplerShouldSampler = sampler.shouldSample(root.traceId); - assert.strictEqual(sampler.description, 'always'); - assert.ok(samplerShouldSampler); - }); - it('should return a always sampler for >1', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler().probability(100); - const samplerShouldSampler = sampler.shouldSample(root.traceId); - assert.strictEqual(sampler.description, 'always'); - assert.ok(samplerShouldSampler); - }); - }); - /** - * Should return false - */ - describe('shouldSample() never', () => { - it('should return false', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler(); - sampler.never(); - const samplerShouldSampler = sampler.shouldSample(root.traceId); - assert.ok(!samplerShouldSampler); - }); - it('should return a never sampler for 0', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler().probability(0); - const samplerShouldSampler = sampler.shouldSample(root.traceId); - assert.strictEqual(sampler.description, 'never'); - assert.ok(!samplerShouldSampler); - }); - it('should return a never sampler for negative value', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler().probability(-1); - const samplerShouldSampler = sampler.shouldSample(root.traceId); - assert.strictEqual(sampler.description, 'never'); - assert.ok(!samplerShouldSampler); - }); - }); - - describe('shouldSample() never', () => { - it('should return a probability sampler', () => { - const root = new RootSpan(tracer); - const sampler = new Sampler().probability(0.7); - assert.ok(sampler.description.indexOf('probability') >= 0); - }); - }); -}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-span.ts b/packages/opencensus-core/test/test-span.ts deleted file mode 100644 index 0e987ca39..000000000 --- a/packages/opencensus-core/test/test-span.ts +++ /dev/null @@ -1,262 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as mocha from 'mocha'; - -import {RootSpan} from '../src/trace/model/root-span'; -import {Span} from '../src/trace/model/span'; -import {Tracer} from '../src/trace/model/tracer'; -import {Annotation, Attributes, Link, MessageEvent} from '../src/trace/model/types'; - - -// TODO: we should evaluate a way to merge similar test cases between span and -// rootspan - -const tracer = new Tracer(); - -describe('Span', () => { - /** - * Should create a span - */ - describe('new Span()', () => { - it('should create a Span instance', () => { - const rootSpan = new RootSpan(tracer); - const span = new Span(rootSpan); - assert.ok(span instanceof Span); - }); - }); - - /** - * Should return the Trace ID - */ - describe('get traceId()', () => { - it('should return the trace id', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - const span = new Span(rootSpan); - assert.equal(span.traceId, rootSpan.traceId); - }); - }); - - /** - * Should the span context of span - */ - describe('get spanContext', () => { - it('should the span context of span', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - const context = span.spanContext; - - assert.equal(context.traceId, rootSpan.traceId); - assert.equal(context.spanId, span.id); - assert.equal(context.options, 1); - }); - }); - - /** - * startTime, endTime and durantion proprieties called before start() - no - * clock instance created - */ - describe('get time properties before start()', () => { - let span; - before(() => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - span = new Span(rootSpan); - }); - it('should get startTime() return null', () => { - assert.strictEqual(span.startTime, null); - }); - it('should get endTime() return null', () => { - assert.strictEqual(span.endTime, null); - }); - it('should get duration() return null', () => { - assert.strictEqual(span.duration, null); - }); - }); - - /** - * Should start a span instance - */ - describe('start()', () => { - it('should start a span instance', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.start(); - - assert.ok(span.started); - }); - }); - - /** - * Should not change the initial startTime - */ - describe('start() an already started span', () => { - it('should not change the initial startTime', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - const span = new Span(rootSpan); - span.start(); - const initialStartTime = span.startTime; - span.start(); - - assert.equal(span.startTime, initialStartTime); - }); - }); - - /** - * Should end a span instance - */ - describe('end()', () => { - it('should end a span instance', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.start(); - span.end(); - - assert.ok(span.ended); - }); - }); - - /** - * Should not end a span instance - */ - describe('end() before start()', () => { - it('should not end a span instance', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.end(); - - assert.ok(!span.ended); - }); - }); - - /** - * Should not change the endTime - */ - describe('end() an already ended span', () => { - it('should not change the endTime', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - const span = new Span(rootSpan); - span.start(); - span.end(); - const initialEndTime = span.endTime; - span.end(); - - assert.equal(span.endTime.getTime(), initialEndTime.getTime()); - }); - }); - - /** - * Should add an attrinbutes - */ - describe('addAtribute()', () => { - it('should add an attribute', () => { - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.start(); - - ['String', 'Number', 'Boolean'].map(attType => { - span.addAttribute('testKey' + attType, 'testValue' + attType); - assert.equal( - span.attributes['testKey' + attType], 'testValue' + attType); - }); - }); - }); - - /** - * Should add an annotation - */ - describe('addAnnotation()', () => { - it('should add an annotation', () => { - // tslint:disable:no-any - function instanceOfAnnotation(object: any): object is Annotation { - return 'description' in object && 'timestamp' in object && - 'attributes' in object; - } - - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.start(); - - span.addAnnotation('description test', Date.now(), {} as Attributes); - - assert.ok(span.annotations.length > 0); - assert.ok(instanceOfAnnotation(span.annotations[0])); - }); - }); - - /** - * Should add a Link. - */ - describe('addLink()', () => { - it('should add a Link', () => { - // tslint:disable:no-any - function instanceOfLink(object: any): object is Link { - return 'traceId' in object && 'spanId' in object && 'type' in object; - } - - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.start(); - - const LINK_TYPE = 'PARENT_LINKED_SPAN'; - span.addLink(span.traceId, rootSpan.id, LINK_TYPE); - - assert.ok(span.links.length > 0); - assert.ok(instanceOfLink(span.links[0])); - }); - }); - - /** - * Should add a Message Event. - */ - describe('addMessageEvent()', () => { - it('should add a Message Event', () => { - // tslint:disable:no-any - function instanceOfLink(object: any): object is Link { - return 'type' in object && 'id' in object; - } - - const rootSpan = new RootSpan(tracer); - rootSpan.start(); - - const span = new Span(rootSpan); - span.start(); - - span.addMessageEvent('TYPE_UNSPECIFIED', 'message_event_test_id'); - - assert.ok(span.messageEvents.length > 0); - assert.ok(instanceOfLink(span.messageEvents[0])); - }); - }); -}); \ No newline at end of file diff --git a/packages/opencensus-core/test/test-tracer.ts b/packages/opencensus-core/test/test-tracer.ts deleted file mode 100644 index a5d486ed2..000000000 --- a/packages/opencensus-core/test/test-tracer.ts +++ /dev/null @@ -1,287 +0,0 @@ -/** - * Copyright 2018, OpenCensus Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import {EventEmitter} from 'events'; -import * as uuid from 'uuid'; - -import {randomSpanId} from '../src/internal/util'; -import {TracerConfig} from '../src/trace/config/types'; -import {RootSpan} from '../src/trace/model/root-span'; -import {Span} from '../src/trace/model/span'; -import {Tracer} from '../src/trace/model/tracer'; -import * as types from '../src/trace/model/types'; -import {OnEndSpanEventListener} from '../src/trace/model/types'; - -class OnEndSpanClass implements OnEndSpanEventListener { - /** Counter for test use */ - testCount = 0; - /** Happens when a span is ended */ - onEndSpan(span: RootSpan): void { - this.testCount++; - } -} - -const defaultConfig: TracerConfig = { - samplingRate: 1.0 // always sampler -}; - -describe('Tracer', () => { - const options = {name: 'test'}; - - /** Should create a Tracer instance */ - describe('new Tracer()', () => { - it('should create a Tracer instance', () => { - const tracer = new Tracer(); - assert.ok(tracer instanceof Tracer); - }); - }); - - /** Should get/set the current RootSpan from tracer instance */ - describe('get/set currentRootSpan()', () => { - let tracer, rootSpan; - before(() => { - tracer = new Tracer(); - rootSpan = new RootSpan(tracer); - tracer.currentRootSpan = rootSpan; - }); - it('should get the current RootSpan from tracer instance', () => { - assert.ok(tracer.currentRootSpan instanceof RootSpan); - }); - it('should set the current RootSpan from tracer instance', () => { - assert.strictEqual(tracer.currentRootSpan, rootSpan); - }); - }); - - /** Should return a started tracer instance */ - describe('start()', () => { - let tracerStarted; - before(() => { - const tracer = new Tracer(); - assert.strictEqual(tracer.active, false); - tracerStarted = tracer.start(defaultConfig); - }); - it('should return a tracer instance', () => { - assert.ok(tracerStarted instanceof Tracer); - }); - - it('the trace was started', () => { - assert.strictEqual(tracerStarted.active, true); - }); - }); - - /** Should return an OnEndSpanEventListener list */ - describe('registerEndSpanListener() / get eventListeners()', () => { - let tracer, onEndSpan; - before(() => { - tracer = new Tracer(); - onEndSpan = new OnEndSpanClass(); - tracer.registerEndSpanListener(onEndSpan); - }); - - it('should register a new OnEndSpanEventListener on listners list', () => { - const listner = tracer.eventListeners[0]; - assert.strictEqual(tracer.eventListeners.length, 1); - assert.strictEqual(listner, onEndSpan); - }); - - it('should return an OnEndSpanEventListener list', () => { - for (const listner of tracer.eventListeners) { - assert.ok(listner instanceof OnEndSpanClass); - } - }); - }); - - /** Should stop the trace instance */ - describe('stop()', () => { - it('should stop the trace instance', () => { - const tracer = new Tracer(); - assert.strictEqual(tracer.active, false); - tracer.start(defaultConfig); - assert.strictEqual(tracer.active, true); - tracer.stop(); - assert.strictEqual(tracer.active, false); - }); - }); - - - /** Should create and start a new RootSpan instance */ - describe('startRootSpan()', () => { - let rootSpanLocal; - before(() => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - tracer.startRootSpan(null, (rootSpan) => { - rootSpanLocal = rootSpan; - }); - }); - it('should create a new RootSpan instance', () => { - assert.ok(rootSpanLocal instanceof RootSpan); - }); - it('should start the rootSpan', () => { - assert.ok(rootSpanLocal.started); - }); - }); - - /** Should create and start a new RootSpan instance with options */ - describe('startRootSpan() with options', () => { - let rootSpanLocal; - before(() => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - tracer.startRootSpan(options, (rootSpan) => { - rootSpanLocal = rootSpan; - }); - }); - it('should create a new RootSpan instance', () => { - assert.ok(rootSpanLocal instanceof RootSpan); - }); - it('should start the rootSpan', () => { - assert.ok(rootSpanLocal.started); - }); - }); - - /** Should not start the new RootSpan instance */ - describe('startRootSpan() with sampler never', () => { - it('should not start the new RootSpan instance', () => { - const tracer = new Tracer(); - const config = {samplingRate: 0} as TracerConfig; - tracer.start(config); - tracer.startRootSpan(options, (rootSpan) => { - assert.strictEqual(rootSpan, null); - }); - }); - }); - - /** Should not create the new RootSpan instance */ - describe('startRootSpan() before start()', () => { - it('should not create the new RootSpan instance, tracer not started', - () => { - const tracer = new Tracer(); - assert.strictEqual(tracer.active, false); - tracer.startRootSpan(options, (rootSpan) => { - assert.equal(rootSpan, null); - }); - }); - }); - - describe('startRootSpan() with context propagation', () => { - const traceOptions = {name: 'rootName', type: 'spanType'} as - types.TraceOptions; - - it('should create new RootSpan instance, no propagation', () => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - tracer.startRootSpan(traceOptions, (rootSpan) => { - assert.ok(rootSpan); - assert.strictEqual(rootSpan.name, traceOptions.name); - assert.strictEqual(rootSpan.type, traceOptions.type); - }); - }); - - const spanContextPropagated = { - traceId: uuid.v4().split('-').join(''), - spanId: randomSpanId(), - options: 0x1 - } as types.SpanContext; - - - it('should create the new RootSpan with propagation', () => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - traceOptions.spanContext = spanContextPropagated; - tracer.startRootSpan(traceOptions, (rootSpan) => { - assert.ok(rootSpan); - assert.strictEqual(rootSpan.name, traceOptions.name); - assert.strictEqual(rootSpan.type, traceOptions.type); - assert.strictEqual(rootSpan.traceId, spanContextPropagated.traceId); - assert.strictEqual(rootSpan.parentSpanId, spanContextPropagated.spanId); - }); - }); - - it('should create the new RootSpan with no propagation', () => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - traceOptions.spanContext.options = 0x0; - tracer.startRootSpan(traceOptions, (rootSpan) => { - assert.ok(rootSpan); - assert.strictEqual(rootSpan.name, traceOptions.name); - assert.strictEqual(rootSpan.type, traceOptions.type); - assert.notEqual(rootSpan.traceId, spanContextPropagated.traceId); - assert.notEqual(rootSpan.parentSpanId, spanContextPropagated.spanId); - }); - }); - }); - - - /** Should set the current root span to null */ - describe('clearCurrentRootSpan()', () => { - it('should set the current root span to null', () => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - tracer.startRootSpan(options, (rootSpan) => { - tracer.clearCurrentTrace(); - assert.strictEqual(tracer.currentRootSpan, null); - }); - }); - }); - - - /** Should create and start a Span instance into a rootSpan */ - describe('startChildSpan()', () => { - let span: types.Span; - before(() => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - tracer.startRootSpan(options, (rootSpan) => { - span = tracer.startChildSpan('spanName', 'spanType'); - }); - }); - it('should create a Span instance', () => { - assert.ok(span instanceof Span); - }); - it('should start a span', () => { - assert.ok(span.started); - assert.strictEqual(span.name, 'spanName'); - assert.strictEqual(span.type, 'spanType'); - }); - }); - - /** Should not create a Span instance */ - describe('startChildSpan() before startRootSpan()', () => { - it('should not create a Span instance, without a rootspan', () => { - const tracer = new Tracer(); - tracer.start(defaultConfig); - const span = tracer.startChildSpan('spanName', 'spanType'); - assert.equal(span, null); - }); - }); - - /** Should run eventListeners when the rootSpan ends */ - describe('onEndSpan()', () => { - it('should run eventListeners when the rootSpan ends', () => { - const tracer = new Tracer(); - const eventListener = new OnEndSpanClass(); - tracer.registerEndSpanListener(eventListener); - tracer.start(defaultConfig); - - tracer.startRootSpan(options, (rootSpan) => { - rootSpan.end(); - assert.equal(eventListener.testCount, tracer.eventListeners.length); - }); - }); - }); -}); \ No newline at end of file diff --git a/packages/opencensus-core/tsconfig.json b/packages/opencensus-core/tsconfig.json deleted file mode 100644 index fc69b49c7..000000000 --- a/packages/opencensus-core/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": "./node_modules/gts/tsconfig-google.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "build", - "allowUnreachableCode": true, - "noUnusedParameters": false, - "noImplicitAny": false, - "noImplicitThis": false, - "noEmitOnError": false, - "pretty": true, - "strict": false, - "module": "commonjs", - "target": "es6", - "sourceMap": false - }, - "include": [ - "src/**/*.ts", - "test/**/*.ts" - ], - "exclude": [ - "node_modules" - ] -}