From e8e5cea2baad9e3d7368e646c15afb15c4869e9d Mon Sep 17 00:00:00 2001
From: George Cook
Date: Tue, 18 May 2021 10:29:59 +0200
Subject: [PATCH] Beta (#121)
* first stab at moving over to ropm
* rewrite for rooibos v4
* groups are back
* refactoring to reflect new plugin-driven pattenr
* rename get all method
* tweaks running
* imports plugin code into main repo - the framework and plugin sitting in a tree t e s t i n g
* moves stub project to plugin tests
* more moving stuff about; fixing runtime problems after overhaul
* adds linting and testing setup. Thanks Bronley Plumb
* fixes annotation issues caused by reflection
* adds a bunch of tests for basic annotation, suite, group parsing
* fixes remaining group tag tests
* adds param parsing tests
* various fixes - expects can now do 15 args
* feat(logs): Adds settings for controlling log ouput width
* chore(build):Use correct bsc
* fix(assertions): Fix missing message
* feat(mocks): Can now include 15 params
* chore(tests): misc changes to tests project
* minor fixes
* minor fixes
* fixes various compiler issues
* updated documentation
* updateds to use sync api in bs
* fixes runtime crash
* tidies up project, and adds plugin tests
* finally fixes linting issue
* fixes missing roku-deploy
* adds missing nyc package
* add github workflow
* updated to latest bsc
* updated to latest bsc
* adds ability to inject main when none is present (to make it easier to test ropm modules)
* remove erroneous duplicate files that got in via a merge
* fix linting error
* linting fixes
* can filter the files to process for unit test searching
* imrpoves log output with better file links
* minor tweak to line numbers
* no longer have to type method names for tests - the annotation name is automatically used:
* fixes @ignore not working, and improves tag behaviour
* fixes tests
* some project tidying
* tidy up package, remove test project
* add support for catching crashes
* update package version
* fixes @nocatch annottation
* fixes @nocatch annottation again
* feat:adds crash resistence to suite functions like beforeEach and after, etc
* feat: improves handling of errors in assertions
* fix couple of minor issues in reporting
* version bounce
* version bounce
* fix: fixes crash in console report
* version bounce
* bunch of fixes
* bump to 4.1.1
* adds scripts for easy remote/local npm switching
* compile against latest bsc
* doc improvements
* update docs
* update docs
* adds setFields to mockNode
* doc update
* adds info on missing tags and options
* fixes issue that caused strange breakpoint behaviour on assertions
* more doc improvements
* fix(plugin): Update to bsc 37.4
* feat(TestSuite): Adds @noearlyexit annotation, to allow unit tests to run against the framework
* fix(plugin): Fixes node class generation
* fix(framework): Fixes framework tests
* fix(ConsoleTestReporter): Fixes issue that showed success/fail messages in reverse
* docs: Adds docs for @noEarlyExit
* version bump
* show crash count in output
* chore: indentation fix
* chore: ignore dist folder
* chore(build): adds launch tasks for tests in base project
* try to fix bsc-yml
* try to fix bsc-yml
* try to fix bsc-yml
* try to fix bsc-yml
* try to fix bsc-yml
* improves default config, ensures times are printed on tests
---
.gitignore | 8 +
.vscode/launch.json | 6 +-
.vscode/settings.json | 20 +-
.vscode/tasks.json | 18 -
CHANGELOG.md | 456 +-
README.md | 25 +-
ROADMAP.md | 26 -
VERSION | 1 -
app.mk | 237 -
bsc-plugin/.eslintrc.js | 205 +
bsc-plugin/.github/workflows/build.yml | 61 +
bsc-plugin/.gitignore | 64 +
bsc-plugin/.travis.yml | 7 +
bsc-plugin/.vscode/extensions.json | 5 +
bsc-plugin/.vscode/launch.json | 25 +
bsc-plugin/.vscode/settings.json | 22 +
bsc-plugin/.vscode/tasks.json | 23 +
bsc-plugin/LICENSE | 21 +
bsc-plugin/README.md | 30 +
bsc-plugin/package.json | 106 +
bsc-plugin/scripts/install-local.js | 33 +
bsc-plugin/scripts/install-npm.js | 21 +
bsc-plugin/src/lib/rooibos/Annotation.ts | 194 +
.../lib/rooibos/CodeCoverageProcessor.spec.ts | 74 +
.../src/lib/rooibos/CodeCoverageProcessor.ts | 128 +
.../src/lib/rooibos/CodeCoverageType.ts | 6 +
bsc-plugin/src/lib/rooibos/FileFactory.ts | 103 +
.../src/lib/rooibos/RawCodeStatement.ts | 30 +
bsc-plugin/src/lib/rooibos/RooibosConfig.ts | 22 +
bsc-plugin/src/lib/rooibos/RooibosSession.ts | 177 +
.../src/lib/rooibos/RooibosSessionInfo.ts | 177 +
bsc-plugin/src/lib/rooibos/TestCase.ts | 88 +
bsc-plugin/src/lib/rooibos/TestGroup.ts | 96 +
bsc-plugin/src/lib/rooibos/TestSuite.ts | 145 +
.../src/lib/rooibos/TestSuiteBuilder.spec.ts | 1171 ++
.../src/lib/rooibos/TestSuiteBuilder.ts | 228 +
bsc-plugin/src/lib/rooibos/Utils.ts | 180 +
bsc-plugin/src/lib/utils/Diagnostics.ts | 256 +
bsc-plugin/src/lib/utils/testHelpers.spec.ts | 22 +
bsc-plugin/src/plugin.spec.ts | 628 ++
bsc-plugin/src/plugin.ts | 147 +
bsc-plugin/tsconfig.json | 20 +
bsconfig.json | 33 +-
devScripts/buildTests.sh | 7 -
docs/index.md | 853 +-
{src => framework/src}/manifest | 0
framework/src/source/BaseTestReporter.bs | 27 +
framework/src/source/BaseTestSuite.bs | 2089 ++++
{src => framework/src}/source/CommonUtils.bs | 32 +-
framework/src/source/ConsoleTestReporter.bs | 198 +
framework/src/source/Coverage.bs | 51 +
{src => framework/src}/source/Matchers.bs | 2 +-
framework/src/source/Rooibos.bs | 83 +
framework/src/source/RooibosScene.xml | 50 +
framework/src/source/RuntimeConfig.bs | 20 +
framework/src/source/Stats.bs | 46 +
framework/src/source/Test.bs | 108 +
framework/src/source/TestGroup.bs | 100 +
framework/src/source/TestResult.bs | 74 +
framework/src/source/TestRunner.bs | 182 +
framework/src/source/Utils.bs | 63 +
framework/src/source/scratch.bs | 1611 +++
framework/src/source/unused/CodeCoverage.brs | 35 +
framework/src/source/unused/CodeCoverage.xml | 13 +
.../src/source/unused/CodeCoverageSupport.brs | 56 +
frameworkTests/.vscode/launch.json | 38 -
frameworkTests/.vscode/tasks.json | 41 -
frameworkTests/bsConfig.json | 18 -
frameworkTests/gulpfile.ts | 182 -
frameworkTests/package-lock.json | 8826 ----------------
frameworkTests/package.json | 42 -
frameworkTests/source/tests/CommonTests.bs | 28 -
.../source/tests/NodeExampleTests.bs | 39 -
frameworkTests/src/components/NodeExample.bs | 15 -
frameworkTests/src/components/NodeExample.xml | 26 -
frameworkTests/src/components/TestsScene.xml | 20 -
.../src/components/tests/NodeExampleTests.xml | 12 -
frameworkTests/src/manifest | 4 -
frameworkTests/src/source/main.bs | 57 -
.../src/source/tests/AssertionTests.bs | 637 --
frameworkTests/src/source/tests/BasicTests.bs | 82 -
.../src/source/tests/ExpectTests.bs | 55 -
.../src/source/tests/MatcherTests.bs | 211 -
.../src/source/tests/NodeExampleTests.bs | 37 -
.../src/source/tests/ParamsTests.bs | 35 -
.../src/source/tests/VersionTests.bs | 26 -
.../tests/issue_13_afterEach_not_running.bs | 51 -
.../tests/issue_15_tests_only_on_groups.bs | 31 -
.../tests/issue_5_duplicateGroupNames.bs | 32 -
.../src/source/tests/testConfig.json | 5 -
frameworkTests/src/source/tests/testUtils.bs | 8 -
.../source/tests/verifyBeforeEachAfterEach.bs | 102 -
gulpfile.ts | 112 -
.../components/TestsScene.xml | 8 -
outRun/.roku-deploy-staging/manifest | 4 -
outRun/.roku-deploy-staging/source/main.brs | 57 -
.../source/tests/AssertionTests.brs | 660 --
.../source/tests/ExpectTests.brs | 28 -
.../source/tests/ParamsTests.brs | 32 -
.../tests/issue_13_afterEach_not_running.brs | 48 -
.../tests/issue_15_tests_only_on_groups.brs | 30 -
.../tests/issue_5_duplicateGroupNames.brs | 28 -
.../source/tests/testConfig.json | 5 -
.../source/tests/testUtils.brs | 8 -
.../tests/verifyBeforeEachAfterEach.brs | 100 -
package-lock.json | 9376 ++++++-----------
package.json | 97 +-
rooibos.code-workspace | 29 +
src/source/BaseTestSuite.bs | 1929 ----
src/source/Coverage.bs | 51 -
src/source/ItGroup.bs | 39 -
src/source/ItemGenerator.bs | 211 -
src/source/NodeMixin.bs | 41 -
src/source/Rooibos.bs | 151 -
src/source/RuntimeConfig.bs | 39 -
src/source/Stats.bs | 162 -
src/source/TestCase.bs | 38 -
src/source/TestLogger.bs | 230 -
src/source/TestRunner.bs | 360 -
src/source/UnitTestResult.bs | 54 -
tests/.vscode/launch.json | 31 +
tests/.vscode/settings.json | 49 +
tests/.vscode/tasks.json | 25 +
tests/bsconfig.coverage.json | 14 +
tests/bsconfig.json | 28 +
tests/package.json | 43 +
tests/src/components/NodeExample.bs | 37 +
tests/src/components/NodeExample.xml | 5 +
tests/src/manifest | 4 +
tests/src/source/Assertion.spec.bs | 612 ++
tests/src/source/Basic.spec.bs | 68 +
tests/src/source/Common.spec.bs | 30 +
tests/src/source/Expect.spec.bs | 59 +
tests/src/source/Main.bs | 6 +
tests/src/source/Matcher.spec.bs | 214 +
tests/src/source/NodeExample.spec.bs | 37 +
tests/src/source/Params.spec.bs | 36 +
.../issue_13_afterEach_not_running.spec.bs | 60 +
.../issue_15_tests_only_on_groups.spec.bs | 33 +
.../issue_5_duplicateGroupNames.spec.bs | 34 +
tests/src/source/testUtils.bs | 8 +
.../source/verifyBeforeEachAfterEach.spec.bs | 103 +
tsconfig.json | 11 -
143 files changed, 14694 insertions(+), 22485 deletions(-)
delete mode 100644 ROADMAP.md
delete mode 100644 VERSION
delete mode 100755 app.mk
create mode 100644 bsc-plugin/.eslintrc.js
create mode 100644 bsc-plugin/.github/workflows/build.yml
create mode 100644 bsc-plugin/.gitignore
create mode 100644 bsc-plugin/.travis.yml
create mode 100644 bsc-plugin/.vscode/extensions.json
create mode 100644 bsc-plugin/.vscode/launch.json
create mode 100644 bsc-plugin/.vscode/settings.json
create mode 100644 bsc-plugin/.vscode/tasks.json
create mode 100644 bsc-plugin/LICENSE
create mode 100644 bsc-plugin/README.md
create mode 100644 bsc-plugin/package.json
create mode 100644 bsc-plugin/scripts/install-local.js
create mode 100644 bsc-plugin/scripts/install-npm.js
create mode 100644 bsc-plugin/src/lib/rooibos/Annotation.ts
create mode 100644 bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.spec.ts
create mode 100644 bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.ts
create mode 100644 bsc-plugin/src/lib/rooibos/CodeCoverageType.ts
create mode 100644 bsc-plugin/src/lib/rooibos/FileFactory.ts
create mode 100644 bsc-plugin/src/lib/rooibos/RawCodeStatement.ts
create mode 100644 bsc-plugin/src/lib/rooibos/RooibosConfig.ts
create mode 100644 bsc-plugin/src/lib/rooibos/RooibosSession.ts
create mode 100644 bsc-plugin/src/lib/rooibos/RooibosSessionInfo.ts
create mode 100644 bsc-plugin/src/lib/rooibos/TestCase.ts
create mode 100644 bsc-plugin/src/lib/rooibos/TestGroup.ts
create mode 100644 bsc-plugin/src/lib/rooibos/TestSuite.ts
create mode 100644 bsc-plugin/src/lib/rooibos/TestSuiteBuilder.spec.ts
create mode 100644 bsc-plugin/src/lib/rooibos/TestSuiteBuilder.ts
create mode 100644 bsc-plugin/src/lib/rooibos/Utils.ts
create mode 100644 bsc-plugin/src/lib/utils/Diagnostics.ts
create mode 100644 bsc-plugin/src/lib/utils/testHelpers.spec.ts
create mode 100644 bsc-plugin/src/plugin.spec.ts
create mode 100644 bsc-plugin/src/plugin.ts
create mode 100644 bsc-plugin/tsconfig.json
delete mode 100755 devScripts/buildTests.sh
rename {src => framework/src}/manifest (100%)
create mode 100644 framework/src/source/BaseTestReporter.bs
create mode 100644 framework/src/source/BaseTestSuite.bs
rename {src => framework/src}/source/CommonUtils.bs (95%)
create mode 100644 framework/src/source/ConsoleTestReporter.bs
create mode 100644 framework/src/source/Coverage.bs
rename {src => framework/src}/source/Matchers.bs (95%)
create mode 100644 framework/src/source/Rooibos.bs
create mode 100644 framework/src/source/RooibosScene.xml
create mode 100644 framework/src/source/RuntimeConfig.bs
create mode 100644 framework/src/source/Stats.bs
create mode 100644 framework/src/source/Test.bs
create mode 100644 framework/src/source/TestGroup.bs
create mode 100644 framework/src/source/TestResult.bs
create mode 100644 framework/src/source/TestRunner.bs
create mode 100644 framework/src/source/Utils.bs
create mode 100644 framework/src/source/scratch.bs
create mode 100644 framework/src/source/unused/CodeCoverage.brs
create mode 100644 framework/src/source/unused/CodeCoverage.xml
create mode 100644 framework/src/source/unused/CodeCoverageSupport.brs
delete mode 100755 frameworkTests/.vscode/launch.json
delete mode 100755 frameworkTests/.vscode/tasks.json
delete mode 100644 frameworkTests/bsConfig.json
delete mode 100755 frameworkTests/gulpfile.ts
delete mode 100644 frameworkTests/package-lock.json
delete mode 100644 frameworkTests/package.json
delete mode 100644 frameworkTests/source/tests/CommonTests.bs
delete mode 100644 frameworkTests/source/tests/NodeExampleTests.bs
delete mode 100644 frameworkTests/src/components/NodeExample.bs
delete mode 100644 frameworkTests/src/components/NodeExample.xml
delete mode 100644 frameworkTests/src/components/TestsScene.xml
delete mode 100644 frameworkTests/src/components/tests/NodeExampleTests.xml
delete mode 100644 frameworkTests/src/manifest
delete mode 100644 frameworkTests/src/source/main.bs
delete mode 100644 frameworkTests/src/source/tests/AssertionTests.bs
delete mode 100644 frameworkTests/src/source/tests/BasicTests.bs
delete mode 100644 frameworkTests/src/source/tests/ExpectTests.bs
delete mode 100644 frameworkTests/src/source/tests/MatcherTests.bs
delete mode 100644 frameworkTests/src/source/tests/NodeExampleTests.bs
delete mode 100644 frameworkTests/src/source/tests/ParamsTests.bs
delete mode 100644 frameworkTests/src/source/tests/VersionTests.bs
delete mode 100644 frameworkTests/src/source/tests/issue_13_afterEach_not_running.bs
delete mode 100644 frameworkTests/src/source/tests/issue_15_tests_only_on_groups.bs
delete mode 100644 frameworkTests/src/source/tests/issue_5_duplicateGroupNames.bs
delete mode 100644 frameworkTests/src/source/tests/testConfig.json
delete mode 100644 frameworkTests/src/source/tests/testUtils.bs
delete mode 100644 frameworkTests/src/source/tests/verifyBeforeEachAfterEach.bs
delete mode 100644 gulpfile.ts
delete mode 100644 outRun/.roku-deploy-staging/components/TestsScene.xml
delete mode 100644 outRun/.roku-deploy-staging/manifest
delete mode 100644 outRun/.roku-deploy-staging/source/main.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/AssertionTests.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/ExpectTests.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/ParamsTests.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/issue_13_afterEach_not_running.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/issue_15_tests_only_on_groups.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/issue_5_duplicateGroupNames.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/testConfig.json
delete mode 100644 outRun/.roku-deploy-staging/source/tests/testUtils.brs
delete mode 100644 outRun/.roku-deploy-staging/source/tests/verifyBeforeEachAfterEach.brs
create mode 100644 rooibos.code-workspace
delete mode 100644 src/source/BaseTestSuite.bs
delete mode 100644 src/source/Coverage.bs
delete mode 100644 src/source/ItGroup.bs
delete mode 100644 src/source/ItemGenerator.bs
delete mode 100644 src/source/NodeMixin.bs
delete mode 100644 src/source/Rooibos.bs
delete mode 100644 src/source/RuntimeConfig.bs
delete mode 100644 src/source/Stats.bs
delete mode 100644 src/source/TestCase.bs
delete mode 100644 src/source/TestLogger.bs
delete mode 100644 src/source/TestRunner.bs
delete mode 100644 src/source/UnitTestResult.bs
create mode 100644 tests/.vscode/launch.json
create mode 100644 tests/.vscode/settings.json
create mode 100644 tests/.vscode/tasks.json
create mode 100644 tests/bsconfig.coverage.json
create mode 100644 tests/bsconfig.json
create mode 100644 tests/package.json
create mode 100644 tests/src/components/NodeExample.bs
create mode 100644 tests/src/components/NodeExample.xml
create mode 100644 tests/src/manifest
create mode 100644 tests/src/source/Assertion.spec.bs
create mode 100644 tests/src/source/Basic.spec.bs
create mode 100644 tests/src/source/Common.spec.bs
create mode 100644 tests/src/source/Expect.spec.bs
create mode 100644 tests/src/source/Main.bs
create mode 100644 tests/src/source/Matcher.spec.bs
create mode 100644 tests/src/source/NodeExample.spec.bs
create mode 100644 tests/src/source/Params.spec.bs
create mode 100644 tests/src/source/issue_13_afterEach_not_running.spec.bs
create mode 100644 tests/src/source/issue_15_tests_only_on_groups.spec.bs
create mode 100644 tests/src/source/issue_5_duplicateGroupNames.spec.bs
create mode 100644 tests/src/source/testUtils.bs
create mode 100644 tests/src/source/verifyBeforeEachAfterEach.spec.bs
delete mode 100644 tsconfig.json
diff --git a/.gitignore b/.gitignore
index da5d3c0e..0ff86319 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,11 @@ rooibosDist.brs
yarn.lock
yarn-error.log
/outRun/
+node_modules/
+out
+**/roku_modules/
+package-lock.json
+
+!.vscode
+.vscode/.env
+dist/
diff --git a/.vscode/launch.json b/.vscode/launch.json
index f1ef0db1..47127ff0 100755
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -8,7 +8,7 @@
"consoleOutput": "full",
"internalConsoleOptions": "neverOpen",
"preLaunchTask": "build-tests",
- "envFile": "${workspaceFolder}/frameworkTests/.vscode/.env",
+ "envFile": "${workspaceFolder}/tests/.vscode/.env",
"host": "${env:ROKU_DEV_TARGET}",
"password": "${env:ROKU_DEVPASSWORD}",
"retainStagingFolder": true,
@@ -24,9 +24,9 @@
"!*.zip",
"!**/*.zip"
],
- "rootDir": "${workspaceFolder}/frameworkTests/build",
+ "rootDir": "${workspaceFolder}/tests/build",
"sourceDirs": [
- "${workspaceFolder}/frameworkTests/src",
+ "${workspaceFolder}/tests/src",
],
"enableDebuggerAutoRecovery": true,
"stopDebuggerOnAppExit": true,
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 9610d5f0..81d31881 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,11 +1,11 @@
-{
- "jira-plugin.workingProject": "",
- "workbench.colorCustomizations": {
- "statusBar.background": "#551A8B",
- "statusBar.debuggingBackground": "#551A8B",
- "panelTitle.activeBorder": "#ff0000",
- "activityBar.background": "#452613",
- "titleBar.activeBackground": "#61351A",
- "titleBar.activeForeground": "#FDFAF9"
- }
+{
+ "jira-plugin.workingProject": "",
+ "workbench.colorCustomizations": {
+ "statusBar.background": "#551A8B",
+ "statusBar.debuggingBackground": "#551A8B",
+ "panelTitle.activeBorder": "#ff0000",
+ "activityBar.background": "#143141",
+ "titleBar.activeBackground": "#1D445B",
+ "titleBar.activeForeground": "#F7FBFD"
+ }
}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 3592df41..eeba10d5 100755
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -18,24 +18,6 @@
"kind": "test",
"isDefault": true
}
- },
- {
- "label": "build-tests-with-coverage",
- "type": "shell",
- "command": "gulp build && cd frameworkTests && export TS_NODE_COMPILER_OPTIONS='{\"incremental\":true, \"allowJs\":false}' && export TS_NODE_TRANSPILE_ONLY=true && gulp prepareCodeCoverageTests",
- "problemMatcher": [],
- "presentation": {
- "echo": true,
- "reveal": "silent",
- "focus": false,
- "panel": "shared",
- "showReuseMessage": false,
- "clear": true
- },
- "group": {
- "kind": "test",
- "isDefault": true
- }
}
]
}
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index da44584e..a36bb860 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,364 +1,290 @@
-#### 4.0.0 (2020-06-12)
+### Changelog
-This is a BREAKING RELEASE.
+All notable changes to this project will be documented in this file. Dates are displayed in UTC.
-You will have to change how you initialize rooibos. In your main.brs, you will now put:
+Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
-```
- if (type(Rooibos_init) = "Function") then
- 'bs:disable-next-line
- if (type(Rooibos_init) = "Function") then Rooibos_init()
- end if
-```
+#### [v4.2.1](https://github.com/georgejecook/rooibos/compare/4.1.1...v4.2.1)
-refer to the [documentation](file:///home/george/hope/open-source/rooibos/docs/module-rooibos.html#.Rooibos_init) for more info.
+- fix(framework): Fixes framework tests [`7008e9d`](https://github.com/georgejecook/rooibos/commit/7008e9de1f21c78948a58eafdf3c7a799f0b454c)
+- version bump [`a5dc306`](https://github.com/georgejecook/rooibos/commit/a5dc30636e911744c57912619603fc641c33ea90)
+- doc improvements [`58d3c7a`](https://github.com/georgejecook/rooibos/commit/58d3c7a1d957a82788fb9ea09202ba6a7765464c)
-#### Chores
+#### [4.1.1](https://github.com/georgejecook/rooibos/compare/4.1.0...4.1.1)
-* **core:**
- * Upgrades to use the official brighterscript compiler
- * Better partitions code into namespaces and classes
- * Adds bs:disable-next-line directives to dynamically resovled function calls
+> 1 March 2021
-##### Bug Fixes
+- adds scripts for easy remote/local npm switching [`c033761`](https://github.com/georgejecook/rooibos/commit/c033761afcf5958228b16fe62cfd6cbc05e3b1a5)
+- compile against latest bsc [`7d2c187`](https://github.com/georgejecook/rooibos/commit/7d2c187b61fec2da6fc4618018c570cbc1a29f93)
-* **Core:**
- * Fixes several small bugs, including wrong params sent for nodeContains and crashes on lcov reporting and test reporting
-
-#### 3.6.1 (2020-05-21)
+#### [4.1.0](https://github.com/georgejecook/rooibos/compare/4.0.6...4.1.0)
-##### Chores
+> 23 February 2021
-* **tests:** Adds node test to framework suite, and also improves the file structure to include placeholder files, so as to better conform with brighterscript compiler ([f23b81d8](https://github.com/georgejecook/rooibos/commit/f23b81d8e34a6e0e86af84dc2441d0755bb5eba2))
+- feat: improves handling of errors in assertions [`f80d19b`](https://github.com/georgejecook/rooibos/commit/f80d19b405477f7fc46005b42eb49969818c6087)
+- bump to 4.1.1 [`f349941`](https://github.com/georgejecook/rooibos/commit/f349941c4934f9f430670ccb65990e0bfa2b09de)
+- bunch of fixes [`d95a506`](https://github.com/georgejecook/rooibos/commit/d95a50601520a33286123d1c837fe8102e9dcbb1)
-##### Bug Fixes
+#### [4.0.6](https://github.com/georgejecook/rooibos/compare/4.0.0...4.0.6)
-* **TestRunner:**
- * Do not crash if node tests do not return stat object, and instead provide useful links to documentation to help devs out ([a643df7a](https://github.com/georgejecook/rooibos/commit/a643df7ac3ec2245c972ad05f2adc65441fade22))
- * Adds more logoutput when a node test does not complete ([c4277d66](https://github.com/georgejecook/rooibos/commit/c4277d66779b7b6c9f77cbc71c74d60e7668dfb1))
+> 11 February 2021
-#### 3.6.0 (2020-05-21)
+- feat(framework-tests): Improve framework tests by making it a bsc compiled app, so that it servers of an example of how to use rooibos with bsc [`#114`](https://github.com/georgejecook/rooibos/pull/114)
+- first stab at moving over to ropm [`81b9e8f`](https://github.com/georgejecook/rooibos/commit/81b9e8f18c5005405ee7e303890e12735b3c05b7)
+- refactoring to reflect new plugin-driven pattenr [`32faa19`](https://github.com/georgejecook/rooibos/commit/32faa192158081b8c2f325236dfc9592b377c610)
+- adds linting and testing setup. Thanks Bronley Plumb [`cab1266`](https://github.com/georgejecook/rooibos/commit/cab12663620fabddf11c6e84632d0afb400e9ff8)
-##### Chores
+### [4.0.0](https://github.com/georgejecook/rooibos/compare/3.6.1...4.0.0)
-* **docs:** add async assert docs ([6261e551](https://github.com/georgejecook/rooibos/commit/6261e551f1e6a3ad92eef07d2236c203141fa0ec))
+> 12 June 2020
-##### New Features
+- Chore/move to new bs compiler [`#106`](https://github.com/georgejecook/rooibos/pull/106)
+- bump to 4.0.0 [`a8eb8ac`](https://github.com/georgejecook/rooibos/commit/a8eb8acaede9a40d1a97733e73666bfd176bbbd7)
+- chore(docs): adds missing logo [`2101474`](https://github.com/georgejecook/rooibos/commit/2101474ebc5106bd0c74be3bcfac2110e75c4d71)
+- Update logos [`ea3200f`](https://github.com/georgejecook/rooibos/commit/ea3200f78b9d8bd1c7ceed01588e47111bbfa48c)
-* **assertions:** adds support for async fields ([28f32754](https://github.com/georgejecook/rooibos/commit/28f32754daee7d4adef7a4e18baa0d6af07653f9))
+#### [3.6.1](https://github.com/georgejecook/rooibos/compare/3.6.0...3.6.1)
-#### 3.5.1 (2020-05-20)
+> 21 May 2020
-##### Bug Fixes
+- chore(tests): Adds node test to framework suite, and also improves the file structure to include placeholder files, so as to better conform with brighterscript compiler [`f23b81d`](https://github.com/georgejecook/rooibos/commit/f23b81d8e34a6e0e86af84dc2441d0755bb5eba2)
+- chore(core): bump to 3.6.1 [`167fab1`](https://github.com/georgejecook/rooibos/commit/167fab1bca39a381201664ffb4ca3d6132bfc4b3)
+- fix(TestRunner): Adds more logoutput when a node test does not complete [`c4277d6`](https://github.com/georgejecook/rooibos/commit/c4277d66779b7b6c9f77cbc71c74d60e7668dfb1)
-* **TestRunner:** Addresses issue that prevented node tests from correctly running ([c6aec599](https://github.com/georgejecook/rooibos/commit/c6aec599edd1e61cf90634a5bf718af1f02560d1))
+#### [3.6.0](https://github.com/georgejecook/rooibos/compare/3.5.1...3.6.0)
-#### 3.5.0 (2020-05-20)
+> 21 May 2020
-##### New Features
+- feat(assertions): adds support for async fields [`28f3275`](https://github.com/georgejecook/rooibos/commit/28f32754daee7d4adef7a4e18baa0d6af07653f9)
+- chore(docs): add async assert docs [`6261e55`](https://github.com/georgejecook/rooibos/commit/6261e551f1e6a3ad92eef07d2236c203141fa0ec)
+- chore(core): bump to 3.6.0 [`660926b`](https://github.com/georgejecook/rooibos/commit/660926bb0d72997916863877d51c3e5b61da44c5)
-* **runner:** adds ability to wait on scene.isReadyToStartTests, if present before starting the tests ([c1b71a9a](https://github.com/georgejecook/rooibos/commit/c1b71a9a6f7b8e4e974ecf33d4928d3b249b2532))
+#### [3.5.1](https://github.com/georgejecook/rooibos/compare/3.5.0...3.5.1)
-##### Bug Fixes
+> 20 May 2020
-* **mocks:** Better handling for mock creation failures ([df74e3b5](https://github.com/georgejecook/rooibos/commit/df74e3b52caf42ae9f8439a92694c7c36a7a827c))
+- fix(TestRunner): Addresses issue that prevented node tests from correctly running [`c6aec59`](https://github.com/georgejecook/rooibos/commit/c6aec599edd1e61cf90634a5bf718af1f02560d1)
+- bump to 3.5.1 [`a08fff6`](https://github.com/georgejecook/rooibos/commit/a08fff6d25cc1d4a783dce15eac4d7f402adf676)
-#### 3.4.3 (2020-05-10)
+#### [3.5.0](https://github.com/georgejecook/rooibos/compare/3.4.3...3.5.0)
-##### Bug Fixes
+> 20 May 2020
-* **mocks:** Fixes crash on multi expect ([e02f96ca](https://github.com/georgejecook/rooibos/commit/e02f96cab091fc6a0d622f85b7302d7c48480aca))
+- feat(runner): adds ability to wait on scene.isReadyToStartTests, if present before starting the tests [`c1b71a9`](https://github.com/georgejecook/rooibos/commit/c1b71a9a6f7b8e4e974ecf33d4928d3b249b2532)
+- fix(mocks): Better handling for mock creation failures [`df74e3b`](https://github.com/georgejecook/rooibos/commit/df74e3b52caf42ae9f8439a92694c7c36a7a827c)
+- bump to 3.5.0 [`6246d42`](https://github.com/georgejecook/rooibos/commit/6246d420a0fa0a8e67f0e826487cb047bc99316d)
-#### 3.4.2 (2020-05-07)
+#### [3.4.3](https://github.com/georgejecook/rooibos/compare/3.4.2...3.4.3)
-##### New Features
+> 10 May 2020
-* **mocks:** adds shadow methods to facilitate mock failure line number reporting ([d1e652cc](https://github.com/georgejecook/rooibos/commit/d1e652cc9a622b7c3ee7bd86937d5b826ea08dc3))
+- bound to 3.4.3 [`c217996`](https://github.com/georgejecook/rooibos/commit/c2179965364b0d85e5ba0af97c7d88d891656abe)
+- hotfix for wln error [`b30d44e`](https://github.com/georgejecook/rooibos/commit/b30d44e55e0b18e5842747562af06a584f0cb8af)
+- fix(mocks): Fixes crash on multi expect [`e02f96c`](https://github.com/georgejecook/rooibos/commit/e02f96cab091fc6a0d622f85b7302d7c48480aca)
-#### 3.4.1 (2020-05-06)
+#### [3.4.2](https://github.com/georgejecook/rooibos/compare/3.4.1...3.4.2)
-##### Bug Fixes
+> 7 May 2020
-* **core:** minor logger fix ([61ee8113](https://github.com/georgejecook/rooibos/commit/61ee81136a609586c96e553ea49ab7828c7424fa))
+- feat(mocks):adds shadow methods to facilitate mock failure line number reporting [`d1e652c`](https://github.com/georgejecook/rooibos/commit/d1e652cc9a622b7c3ee7bd86937d5b826ea08dc3)
+- chore: bounce to 3.4.2 [`cc2c559`](https://github.com/georgejecook/rooibos/commit/cc2c5598ab88def1d2dd93f35b8459b542959329)
-#### 3.4.0 (2020-05-05)
+#### [3.4.1](https://github.com/georgejecook/rooibos/compare/3.4.0...3.4.1)
-##### Chores
+> 5 May 2020
-* update version txt ([6066fd0b](https://github.com/georgejecook/rooibos/commit/6066fd0b344c4efc9aa559a8597007d794350d79))
+- bounce to 3.4.1 [`f9c4935`](https://github.com/georgejecook/rooibos/commit/f9c4935b4337b41d3fb69a666c95f6be40e1735c)
+- updates version.txt [`ae130f3`](https://github.com/georgejecook/rooibos/commit/ae130f393a9df1014b8683c233f5f20603ff0e6f)
+- fix(core): minor logger fix [`61ee811`](https://github.com/georgejecook/rooibos/commit/61ee81136a609586c96e553ea49ab7828c7424fa)
-##### New Features
+#### [3.4.0](https://github.com/georgejecook/rooibos/compare/3.3.0...3.4.0)
-* **core:** Adds lcov report, and moves test files to brighterscript ([99b8d50a](https://github.com/georgejecook/rooibos/commit/99b8d50a7c0668c0bca29eedfdc190ebe10ff7e7))
-* lcov support ([0cfb9181](https://github.com/georgejecook/rooibos/commit/0cfb91813587fb26a7be1e3f64ad798be2e86b83))
-* **runner:** allows for up to 12 params on parameterized tests ([e9e9dfd7](https://github.com/georgejecook/rooibos/commit/e9e9dfd773abd64116d175e38a11eb731dab3e0a))
+> 4 May 2020
-#### 3.3.0 (2019-09-26)
+- Feature/option to remove test times [`#82`](https://github.com/georgejecook/rooibos/pull/82)
+- add option to not print test times [`#80`](https://github.com/georgejecook/rooibos/pull/80)
+- Regenerates package-lock.json [`bf210cd`](https://github.com/georgejecook/rooibos/commit/bf210cd60062f04e807735dc8f2f772f786273ce)
+- feat(core): Adds lcov report, and moves test files to brighterscript [`99b8d50`](https://github.com/georgejecook/rooibos/commit/99b8d50a7c0668c0bca29eedfdc190ebe10ff7e7)
+- feat: lcov support [`0cfb918`](https://github.com/georgejecook/rooibos/commit/0cfb91813587fb26a7be1e3f64ad798be2e86b83)
-##### Chores
+#### [3.3.0](https://github.com/georgejecook/rooibos/compare/3.2.1...3.3.0)
-* adds changelog generator to dependencies ([22a25308](https://github.com/georgejecook/rooibos/commit/22a25308cd4d448c4cdd01087dc43cda74ca82d5))
+> 26 September 2019
-##### New Features
+- feat: Increase mocks limit to 25 - it is now possible to create up to 25 mocks for a given test suite. [`#73`](https://github.com/georgejecook/rooibos/pull/73)
+- chore:adds changelog generator to dependencies [`22a2530`](https://github.com/georgejecook/rooibos/commit/22a25308cd4d448c4cdd01087dc43cda74ca82d5)
+- version bounce, remove file that should not be scm [`0e60d54`](https://github.com/georgejecook/rooibos/commit/0e60d549504dda61ed53b3cb55aa005c20b123ca)
+- fix: fixes incorrect reporting of version numbers during test run [`e820831`](https://github.com/georgejecook/rooibos/commit/e820831823993e33a6581926701d8263f7826fc4)
-* Increase mocks limit to 25 - it is now possible to create up to 25 mocks for a given test suite. ([#73](https://github.com/georgejecook/rooibos/pull/73)) ([92369c3c](https://github.com/georgejecook/rooibos/commit/92369c3cc12e38065d6b4faaedf5a5c46995774b))
+#### [3.2.1](https://github.com/georgejecook/rooibos/compare/3.2.0...3.2.1)
-##### Bug Fixes
+> 22 September 2019
-* fixes incorrect reporting of version numbers during test run ([e8208318](https://github.com/georgejecook/rooibos/commit/e820831823993e33a6581926701d8263f7826fc4))
+- fix: fixes regression in node tests [`7b63c69`](https://github.com/georgejecook/rooibos/commit/7b63c69ecacdd26d6d9b067b46eb56908ae869e7)
+- bounce to 3.2.1 [`07067e4`](https://github.com/georgejecook/rooibos/commit/07067e4ea3f3ddc74afe72fa46c89231f2521154)
+- chore: add bash task to run gulp, coz vscode ide keeps opening a gulp tab [`c7a45ad`](https://github.com/georgejecook/rooibos/commit/c7a45ad2160fd3c7c31a7ccf692440ad7ec7391b)
-#### 3.2.2 (2019-09-23)
+#### [3.2.0](https://github.com/georgejecook/rooibos/compare/3.1.1...3.2.0)
-#### 3.2.1 (2019-09-23)
+> 22 September 2019
-##### Chores
+- feat: migrate to using brighterscript, via maestro project's compiler [`391b902`](https://github.com/georgejecook/rooibos/commit/391b902c82b63a261a73f452879fbde72eb57ae0)
+- chore: adds documentation for matchers [`ef79171`](https://github.com/georgejecook/rooibos/commit/ef791711abe87a02ee5c935aa5ac34f178cdf6e3)
+- feat: adds matchers for mocks, you can now use built in anyXXXMatchers, or roll your own as function pointers, or inline functions [`f87609e`](https://github.com/georgejecook/rooibos/commit/f87609e5c1e0dc0b532333be4d6971755d3af229)
-* add bash task to run gulp, coz vscode ide keeps opening a gulp tab ([c7a45ad2](https://github.com/georgejecook/rooibos/commit/c7a45ad2160fd3c7c31a7ccf692440ad7ec7391b))
+#### [3.1.1](https://github.com/georgejecook/rooibos/compare/3.1.0...3.1.1)
-##### Bug Fixes
+> 10 August 2019
-* fixes regression in node tests ([7b63c69e](https://github.com/georgejecook/rooibos/commit/7b63c69ecacdd26d6d9b067b46eb56908ae869e7))
+- fixes compatability issues with rooibos cli [`#68`](https://github.com/georgejecook/rooibos/pull/68)
+- adds version task to gulp file and fixes docs [`815a61f`](https://github.com/georgejecook/rooibos/commit/815a61f39033d85b33d55fbba4b986008a30c7f4)
+- updates version to 3.1.1 [`0a11e3d`](https://github.com/georgejecook/rooibos/commit/0a11e3dbd4339983763a40ced892afc6bd1d92a5)
+- updates docs [`f2d9a1a`](https://github.com/georgejecook/rooibos/commit/f2d9a1ab112e6aa0f54758d880b3125b224b0c9b)
-#### 3.2.0 (2019-09-22)
+#### [3.1.0](https://github.com/georgejecook/rooibos/compare/3.0.4...3.1.0)
-##### Chores
+> 18 July 2019
-* adds documentation for matchers ([ef791711](https://github.com/georgejecook/rooibos/commit/ef791711abe87a02ee5c935aa5ac34f178cdf6e3))
+- Feature/check version [`#66`](https://github.com/georgejecook/rooibos/pull/66)
+- adds legacy support [`#61`](https://github.com/georgejecook/rooibos/pull/61)
+- adds checks for version [`17b9d83`](https://github.com/georgejecook/rooibos/commit/17b9d83ba717911672ba8adc6ae83c58f01d6c60)
+- some format fixes [`745af9c`](https://github.com/georgejecook/rooibos/commit/745af9c9ae0170d1db5f15f79ae78e7f451b907a)
+- some format fixes [`dba439c`](https://github.com/georgejecook/rooibos/commit/dba439c7fc26721d434322aea4f2e19abb460cf2)
-##### New Features
+#### [3.0.4](https://github.com/georgejecook/rooibos/compare/3.0.3...3.0.4)
-* adds matchers for mocks, you can now use built in anyXXXMatchers, or roll your own as function pointers, or inline functions ([f87609e5](https://github.com/georgejecook/rooibos/commit/f87609e5c1e0dc0b532333be4d6971755d3af229))
-* migrate to using brighterscript, via maestro project's compiler ([391b902c](https://github.com/georgejecook/rooibos/commit/391b902c82b63a261a73f452879fbde72eb57ae0))
+> 23 June 2019
-##### Bug Fixes
+- adds legacy support documentation [`a1fc451`](https://github.com/georgejecook/rooibos/commit/a1fc4515d7abc542f834d53f4260903c69b2ff74)
+- fix borked formatting on rooibosC args table in the docs [`464b9cf`](https://github.com/georgejecook/rooibos/commit/464b9cf71da4915d62b821f16d9f6d325dc204fc)
-* fixes versoin number mismatch errors - the framework now correctly ascertains if it has a version greater than the minimum required version, instead of requiring a direct match ([c6baa2dc](https://github.com/georgejecook/rooibos/commit/c6baa2dc33ef689b49ffc68310bb6f95f0919549))
+#### [3.0.3](https://github.com/georgejecook/rooibos/compare/3.0.2-beta...3.0.3)
-# Rooibos CHANGELOG
+> 4 June 2019
-## 3.0.4 - legacy support!
+- Feature/move json config [`#54`](https://github.com/georgejecook/rooibos/pull/54)
+- bounce to 3.0.3 [`3c81064`](https://github.com/georgejecook/rooibos/commit/3c8106406baaff619ad216ff8a062e8407256709)
+- runtime config is now provided by rooibosC [`774ade1`](https://github.com/georgejecook/rooibos/commit/774ade1ec8740fbb15d4025cd607674224bebab6)
+- fix for box crash on asString when used on an aa with mock methods [`8367146`](https://github.com/georgejecook/rooibos/commit/8367146f8f6a13e1183fb23aa6da92cc8253a14b)
-### Added
+#### [3.0.2-beta](https://github.com/georgejecook/rooibos/compare/3.0.1-beta...3.0.2-beta)
- - legacy support with rooibosC 3.0.9 or later
+> 28 May 2019
-### Changed
+- adds path to test suite output [`73f0d17`](https://github.com/georgejecook/rooibos/commit/73f0d17a673d0ebd9f28e9e8ffb5be7721b6d4e7)
-### Deprecated
+#### [3.0.1-beta](https://github.com/georgejecook/rooibos/compare/3.0.0-beta...3.0.1-beta)
-### Removed
+> 27 May 2019
-### Fixed
+- improves docs for code coverage [`f388804`](https://github.com/georgejecook/rooibos/commit/f388804f410b069b7a99d9fd6d7ee3a9fec07a55)
- - ignored tests are now reported
+#### [3.0.0-beta](https://github.com/georgejecook/rooibos/compare/2.3.0...3.0.0-beta)
-## 3.0.3 - out of beta - yay!
+> 25 May 2019
-### Added
+- Feature/code coverage [`#46`](https://github.com/georgejecook/rooibos/pull/46)
+- fix #45 [`#45`](https://github.com/georgejecook/rooibos/issues/45)
+- Revert "remove files that should not be checked in" [`9c2ece6`](https://github.com/georgejecook/rooibos/commit/9c2ece66a88976cee6e4abbd908f6755083cad89)
+- remove files that should not be checked in [`3e4ecdb`](https://github.com/georgejecook/rooibos/commit/3e4ecdb7127c487a949b268dedb1a0bf7b53c431)
+- remove folder which should not be added [`ba257a5`](https://github.com/georgejecook/rooibos/commit/ba257a588a369592e360df58b8a4dbb1bf399c16)
- - loads runtime config from a rooibosC generated function which
- - enables fail fast mode
- - enables show only failures mode.
+#### [2.3.0](https://github.com/georgejecook/rooibos/compare/2.2.0...2.3.0)
-### Changed
+> 27 April 2019
-### Deprecated
+- doc update [`e9d7a40`](https://github.com/georgejecook/rooibos/commit/e9d7a40aaf9ab21d9eef42de77100ccd60774ea2)
+- 2.3.0 - adds ms time for each test in the test output [`f960e52`](https://github.com/georgejecook/rooibos/commit/f960e521b39d07543d987dd7e247a4b6e45638a6)
-### Removed
+#### [2.2.0](https://github.com/georgejecook/rooibos/compare/2.1.4...2.2.0)
- - testConfig.json file - we now use rooibosC flags for everything
+> 26 April 2019
-### Fixed
+- 2.2.0 - adds ability to pass node scope into the test runner, for non-node tests so node-scoped functions/vars can be accessed [`67527eb`](https://github.com/georgejecook/rooibos/commit/67527eb009feeff109979146c81d177ea7ce8b14)
- - crash when any function calls asString on an aa that has mocked functions
+#### [2.1.4](https://github.com/georgejecook/rooibos/compare/2.1.3...2.1.4)
-## 3.0.2-beta
+> 26 April 2019
-### Added
+- 2.1.4 adds paramter directive to allow creation of nodes [`189b1be`](https://github.com/georgejecook/rooibos/commit/189b1be7425455b6d55afe09e81dd267102f0f12)
+- minor doc update [`b22363d`](https://github.com/georgejecook/rooibos/commit/b22363d93e08eb1aa4e951c835138543650340c7)
- - adds path to code coverage
+#### [2.1.3](https://github.com/georgejecook/rooibos/compare/2.1.2...2.1.3)
-### Changed
+> 25 April 2019
-### Deprecated
+- Feature/update to use latest rooibos c [`#41`](https://github.com/georgejecook/rooibos/pull/41)
+- improved docs for updated rooibos preprocessor [`fd48ffe`](https://github.com/georgejecook/rooibos/commit/fd48ffee19c67c0519157e994d88b0e891959217)
+- fix typo [`0fc3fc0`](https://github.com/georgejecook/rooibos/commit/0fc3fc0265bd041bcba96bd3fea6aedb75f7fe9b)
+- update changelog [`1e9f8f4`](https://github.com/georgejecook/rooibos/commit/1e9f8f4d03a24fcb40c26b7ad75928065e20fb90)
-### Removed
+#### [2.1.2](https://github.com/georgejecook/rooibos/compare/2.1.1...2.1.2)
-### Fixed
+> 21 March 2019
-## 3.0.1-beta
+- Bugfix/overloaded expects collide on same method name on different objects [`#39`](https://github.com/georgejecook/rooibos/pull/39)
+- formats base test suite, and addresses issue of overriding mocks colliding on method name across different objects [`297fcfa`](https://github.com/georgejecook/rooibos/commit/297fcfa6ebb586be784fa045e14cee8d9d9cdfc5)
+- doc update [`01e4df0`](https://github.com/georgejecook/rooibos/commit/01e4df04d154d7eec7d62ad474be61f7550066fa)
+- adds additinoaly testing to ensure that there were no regressions on non-overloaded expects mixed with overloaded ones [`9d0015c`](https://github.com/georgejecook/rooibos/commit/9d0015c85facf0381341b0c75329bc9ac519b92a)
-### Added
+#### [2.1.1](https://github.com/georgejecook/rooibos/compare/2.1.0...2.1.1)
- - More documentation for code coverage
+> 21 March 2019
-### Changed
+- Bugfix/minor issues [`#35`](https://github.com/georgejecook/rooibos/pull/35)
+- adds dist to repo to make life easier [`c5c364b`](https://github.com/georgejecook/rooibos/commit/c5c364bc0d2ecd18d499509c8fb7bdbacd973a48)
+- fix incorrect docs on stub method [`18581b8`](https://github.com/georgejecook/rooibos/commit/18581b8f99f92893ccce4184d5d242e11f3f44e0)
+- doc updates [`3b4e06e`](https://github.com/georgejecook/rooibos/commit/3b4e06e8e8016f4fee5dd0e283ba8f4afd660f42)
-### Deprecated
+#### [2.1.0](https://github.com/georgejecook/rooibos/compare/2.0.0...2.1.0)
-### Removed
+> 21 March 2019
-### Fixed
- - crash on metaTestcase.time
+- Feature/multi expect [`#34`](https://github.com/georgejecook/rooibos/pull/34)
+- Bugfix/documentation samples restructuring [`#32`](https://github.com/georgejecook/rooibos/pull/32)
+- Add multi overloads for expectOnce [`fac8adc`](https://github.com/georgejecook/rooibos/commit/fac8adc6831e992751d58509baa0269181d0d9d4)
+- Bounce to 2.1.0 [`ee85712`](https://github.com/georgejecook/rooibos/commit/ee85712ba3b9534d1b1c12f35021fde1aa3cffac)
+- updates travis ci and readme [`e849134`](https://github.com/georgejecook/rooibos/commit/e849134ddc7b492a1ff7f011edfc1a064adc518c)
-## 3.0.0-beta
+### [2.0.0](https://github.com/georgejecook/rooibos/compare/0.4.1...2.0.0)
-### Added
+> 18 February 2019
- - Code coverage support!
+#### [0.4.1](https://github.com/georgejecook/rooibos/compare/v0.2...0.4.1)
-### Changed
+> 9 February 2021
- - there are breaking changes in rooibos-preprocessor which, are required for code coverage. I'm keeping the major versions of rooibos and rooibos-preprocessor in sync, due to documentation, and everyone's sanity
+- feat(framework-tests): Improve framework tests by making it a bsc compiled app, so that it servers of an example of how to use rooibos with bsc [`#114`](https://github.com/georgejecook/rooibos/pull/114)
+- Chore/move to new bs compiler [`#106`](https://github.com/georgejecook/rooibos/pull/106)
+- Feature/option to remove test times [`#82`](https://github.com/georgejecook/rooibos/pull/82)
+- add option to not print test times [`#80`](https://github.com/georgejecook/rooibos/pull/80)
+- feat: Increase mocks limit to 25 - it is now possible to create up to 25 mocks for a given test suite. [`#73`](https://github.com/georgejecook/rooibos/pull/73)
+- fixes compatability issues with rooibos cli [`#68`](https://github.com/georgejecook/rooibos/pull/68)
+- Feature/check version [`#66`](https://github.com/georgejecook/rooibos/pull/66)
+- adds legacy support [`#61`](https://github.com/georgejecook/rooibos/pull/61)
+- Feature/move json config [`#54`](https://github.com/georgejecook/rooibos/pull/54)
+- Feature/code coverage [`#46`](https://github.com/georgejecook/rooibos/pull/46)
+- Feature/update to use latest rooibos c [`#41`](https://github.com/georgejecook/rooibos/pull/41)
+- Bugfix/overloaded expects collide on same method name on different objects [`#39`](https://github.com/georgejecook/rooibos/pull/39)
+- Bugfix/minor issues [`#35`](https://github.com/georgejecook/rooibos/pull/35)
+- Feature/multi expect [`#34`](https://github.com/georgejecook/rooibos/pull/34)
+- Bugfix/documentation samples restructuring [`#32`](https://github.com/georgejecook/rooibos/pull/32)
+- Rooibos 2.0.0 [`#26`](https://github.com/georgejecook/rooibos/pull/26)
+- fix #45 [`#45`](https://github.com/georgejecook/rooibos/issues/45)
+- doc update [`2a562ce`](https://github.com/georgejecook/rooibos/commit/2a562cea0e965b54f492c5dff09d10554e88a745)
+- removes rooibosPreprocessor - it now is in it's own repo [`1477b1e`](https://github.com/georgejecook/rooibos/commit/1477b1e3ee9ae8ec3a9ec9de9167a51308b945b0)
+- bunch of fixes for solo test and solo param filtering, introduces more stub test data to work with (mainly just looking at output right now - needs more asserts) and also better handling of params (deals with bright scripts loose json parser and invalid type, by having direct control of the suite, group and test via asText, as opposed to simply doing asJson and stringily) [`26e1f09`](https://github.com/georgejecook/rooibos/commit/26e1f092b2c4c6050fe3d329af424597b643e35c)
-### Deprecated
+#### v0.2
-### Removed
+> 1 October 2018
-### Fixed
- - #45 - crash when checking an expect param, and one of the params is a mock/stub
- - #40 - can now use / in the params - much better parsing, too
-
-## 2.3.0
-
-### Added
-
- - prints ms duration of each test in the output
-
-### Changed
-
-### Deprecated
-
-### Removed
-
-### Fixed
-
-## 2.2.0
-
-### Added
-
- - sets the node property on non-node test suites. This allows you to access the global namespace, in case you are testing mixin methods, or other non-scoped code (i.e. the equivalent of accessing `method` as opposed to `m.method` or `myObject.method`)
-
-### Changed
-
-### Deprecated
-
-### Removed
-
-### Fixed
-
-## 2.1.4
-
-### Added
-
- - adds new Parameter arg directive #RBSNode, to allow creation of nodes in the parameterized args
-
-### Changed
-
-### Deprecated
-
-### Removed
-
-### Fixed
-
-## 2.1.3
-
-### Added
-
-### Changed
-
- - improves documentation, explaining how to use rooibos-preprocessor from gulp/js toolchains
-
-### Deprecated
-
-### Removed
-
-### Fixed
-
-
-## 2.1.2
-
-### Added
-
-### Changed
-
-### Deprecated
-
-### Removed
-
-### Fixed
-
- - collision on overloaded expect calls that on same method name on different objects
- - https://github.com/georgejecook/rooibos/issues/36
-
-## 2.1.1
-
-### Added
-
-### Changed
-
-### Deprecated
-
-### Removed
-
-### Fixed
-
- - removes debug logging for fake calls
- - https://github.com/georgejecook/rooibos/issues/25
- - https://github.com/georgejecook/rooibos/issues/30
- - https://github.com/georgejecook/rooibos/issues/29
-
-## 2.1.0
-
-### Added
- - Multiple overloads for expectOnce, allowing for easy definition of multi params and return values from the same method invocation
-
-### Changed
-
-### Deprecated
-
-### Removed
-
-### Fixed
-
- - Potential crash when passing wrong type of arg value into a fake
-
-## 2.0.0
-
-### Added
-
- - Leverage rooibosC preprocessor
- - Better examples
- - Faster parsing
-
-### Changed
-
- - Now requires rooibosC to create the test metadata structures
-
-### Deprecated
-
-### Removed
-
- - Legacy framework support
-
-### Fixed
-
- - various runtime error scenarios
-
-## 0.2.0 Initial feedback release
- - Compatability with Roku unit test framework
- - Fix issues submitted by initial users
- - Add `'@OnlyParams` tag
- - Add `AssertArrayContainsOnlyValuesOfType` assertion
- - Documentation tweaks
- - Improvements to various assertions
- - Adds more unit testing of assertions
- - Improves test report to show ignored tests
- - Annotations are more flexible, allowing spaces/blank lines and comments between `'@Test`, `'@Only`, `'@Ignore` and function definitions
-
-
-## 0.1.0 Initial release
- - Core framework
- - Documentation
- - API documentation
- - Build scripts
+- fixes #5 checking for test naming collisions needs improvements with Params tests - can lead to vague error messages for params [`#5`](https://github.com/georgejecook/rooibos/issues/5)
+- fixes #13 aftereach not running [`#13`](https://github.com/georgejecook/rooibos/issues/13)
+- fixes #15 [`#15`](https://github.com/georgejecook/rooibos/issues/15)
+- fixes #8 Accept whitespace (carriage return) between annotations and test functions [`#8`](https://github.com/georgejecook/rooibos/issues/8)
+- - fixes #7 - all annotations are now case insensitive [`#7`](https://github.com/georgejecook/rooibos/issues/7)
+- fixes #9 Typo [`#9`](https://github.com/georgejecook/rooibos/issues/9)
+- -remove unused api docs folder [`6af014d`](https://github.com/georgejecook/rooibos/commit/6af014d8d9352158739d36232e874ca26100b04d)
+- - api docs in docs folder now [`66f50b9`](https://github.com/georgejecook/rooibos/commit/66f50b9e8cf0c7804ae3befe09c0880c8bf9c1da)
+- Initial commit [`39969ee`](https://github.com/georgejecook/rooibos/commit/39969ee6760a610bf35b150b5f5b2eacb6be84c0)
diff --git a/README.md b/README.md
index b6a0508f..c353d578 100644
--- a/README.md
+++ b/README.md
@@ -2,17 +2,16 @@
-Simple, mocha-inspired, flexible, fun Brightscript test framework for ROKU apps
+Simple, mocha-and junit inspired, flexible, fun Brightscript test framework for ROKU apps
[![Build Status](https://travis-ci.org/georgejecook/rooibos.svg?branch=master)](https://travis-ci.org/georgejecook/rooibos)
-[![GitHub](https://img.shields.io/github/release/georgejecook/rooibos.svg?style=flat-square)](https://github.com/georgejecook/rooibos/releases)
+[![GitHub](https://img.shields.io/github/release/georgejecook/rooibos.svg?style=flat-square)](https://github.com/georgejecook/rooibos/releases)
## Links
- - **[Youtube training videos](https://www.youtube.com/playlist?list=PLJRLV4QDx83vsYMD9bIs-cjoDXmNmO8Jv)**
- **[Documentation](docs/index.md)**
- **[API Documentaiton](https://georgejecook.github.io/rooibos)**
- **[CHANGELOG](CHANGELOG.md)**
@@ -37,25 +36,13 @@ Also thanks to the guys who made and maintain [mochaJs](https://mochajs.org/), o
## FAQ
### Is Rooibos ready for production use?
-Rooibos is the test framework used by several of my clients, running CI with over 3000 tests between them. It started life as rewrite of the official roku unit testing framework, which has been in circulation for several years.
+Yes, it's been used in production by quite a few folks, I'll provide a list in due-course; but there are 1000's of tests in production in some very respectable companies.
### Is Rooibos actively maintained?
-I am actively invovled in Rooibos's development, and add more features and fixes on a weekly basis. You can expect rapid responses to issues.
+I love rooibos, and always keep it up to date. I use it all the time.
-### Why did you not just merge back your changes to roku's unit testing framework
+### Why 4.0.0?
-1. It does rewrite quite a lot of the original unit test framework code, so I doubt that roku would've merged it all back any time soon
-2. It's conceptually entirely different: e.g. using annotations instead of naming conventions and boiler-plate code, completely different test reporting output, assertions and test cases maintain their own state, runs in a scenegraph scene, to name but a few
-3. It has many more features than the original framework, not limited to : node specific assertions, exact assertion line failure reporting, better error messaging, easier setup, groupings, only and ignore for tests, mocks and stubs, etc, etc
-4. Being completely frank, I enjoy roku work and want to do more of it, so it's useful to me to own this project, rather than lose control and wait on other's to merge my changes. On that note, email me at george[AT]tantawowa.com, or pm me (georgejecook) on the roku slack group to discuss any roku development requirements
-5. I poured a _lot_ of work into the project (> 100 hours and counting), and expect to continue to do so. If I own the project, then I can do what I want, when I want. That goes for you guys as well, so get in touch with feature requests and PR's :)
-
-### Is Rooibos itself unit tested?
-
-At this point, it's WIP. I keep adding tests as bugs come up, and will continue to improve the test coverage.
-
-### Why 2.0.0?
-
-The latest version of Rooibos introduces a preprocessor which is a requirement for running all tests. I thought that was a significant enough departure to warrant a whole version bump.
\ No newline at end of file
+Rooibos now uses the excellent bsc compiler plugin mechanism to seamlessly integrate with the compiler and the vscode IDE extension. This is a breaking change - projects will require updates to work.
\ No newline at end of file
diff --git a/ROADMAP.md b/ROADMAP.md
deleted file mode 100644
index 8f3dd8f3..00000000
--- a/ROADMAP.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Rooibos Roadmap
-
-## ShortTerm
-
-### Unit tests for the framework and general framework improvements
-
-Unit tests will be written which test the following:
-
- - Assertions
- - Ignore
- - Only
- - Mocks
- - Stubs
- - Expect
-
-# MidTerm
-
-### Add additional reporting options
-
-Will add the ability to specify a unit test reporting class, to facilitate custom unit test reporting
-
-# LongTerm
-
-### Integrate with vscode ide
-
-Support test execution from and output to Visual Studio Code ide, as per mocha test runner extension
diff --git a/VERSION b/VERSION
deleted file mode 100644
index 276cbf9e..00000000
--- a/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-2.3.0
diff --git a/app.mk b/app.mk
deleted file mode 100755
index 9f24a294..00000000
--- a/app.mk
+++ /dev/null
@@ -1,237 +0,0 @@
-#########################################################################
-# common include file for application Makefiles
-#
-# Makefile Common Usage:
-# > make
-# > make install
-# > make remove
-#
-# Makefile Less Common Usage:
-# > make art-opt
-# > make pkg
-# > make install_native
-# > make remove_native
-# > make tr
-#
-# By default, ZIP_EXCLUDE will exclude -x \*.pkg -x storeassets\* -x keys\* -x .\*
-# If you define ZIP_EXCLUDE in your Makefile, it will override the default setting.
-#
-# To exclude different files from being added to the zipfile during packaging
-# include a line like this:ZIP_EXCLUDE= -x keys\*
-# that will exclude any file who's name begins with 'keys'
-# to exclude using more than one pattern use additional '-x ' arguments
-# ZIP_EXCLUDE= -x \*.pkg -x storeassets\*
-#
-# Important Notes:
-# To use the "install" and "remove" targets to install your
-# application directly from the shell, you must do the following:
-#
-# 1) Make sure that you have the curl command line executable in your path
-# 2) Set the variable ROKU_DEV_TARGET in your environment to the IP
-# address of your Roku box. (e.g. export ROKU_DEV_TARGET=192.168.1.1.
-# Set in your this variable in your shell startup (e.g. .bashrc)
-##########################################################################
-DISTREL = ../dist
-COMMONREL ?= ../common
-SOURCEREL = .
-
-ZIPREL = $(DISTREL)/apps
-PKGREL = $(DISTREL)/packages
-
-APPSOURCEDIR = source
-IMPORTFILES = $(foreach f,$(IMPORTS),$(COMMONREL)/$f.brs)
-IMPORTCLEANUP = $(foreach f,$(IMPORTS),$(APPSOURCEDIR)/$f.brs)
-
-NATIVEDEVREL = $(DISTREL)/rootfs/Linux86_dev.OBJ/root/nvram/incoming
-NATIVEDEVPKG = $(NATIVEDEVREL)/dev.zip
-NATIVETICKLER = $(DISTREL)/application/Linux86_dev.OBJ/root/bin/plethora tickle-plugin-installer
-
-APPGENKEY = ./GENKEY
-APPDEVID = $(shell grep DevID $(APPGENKEY) | sed "s/DevID: //")
-GITCOMMIT = $(shell git rev-parse --short HEAD)
-BUILDDATE = $(shell date -u | awk '{ print $$2,$$3,$$6,$$4 }')
-
-ifdef DEVPASSWORD
- USERPASS = rokudev:$(DEVPASSWORD)
-else
- USERPASS = rokudev
-endif
-
-ifndef ZIP_EXCLUDE
- ZIP_EXCLUDE= -x \*.pkg -x storeassets\* -x keys\* -x \*/.\*
-endif
-
-HTTPSTATUS = $(shell curl --silent --write-out "\n%{http_code}\n" $(ROKU_DEV_TARGET))
-
-ifeq "$(HTTPSTATUS)" " 401"
- CURLCMD = curl -S --connect-timeout 2 --max-time 30 --retry 5
-else
- CURLCMD = curl -S --connect-timeout 2 --max-time 30 --retry 5 --user $(USERPASS) --digest
-endif
-
-.PHONY: all $(APPNAME) verify-keys home
-
-home:
- @echo "Forcing roku to main menu screen $(ROKU_DEV_TARGET)..."
- curl -s -S -d '' http://$(ROKU_DEV_TARGET):8060/keypress/home
- sleep 2
-
-$(APPNAME): manifest
- @echo "*** Creating $(APPNAME).zip ***"
-
- @echo " >> removing old application zip $(ZIPREL)/$(APPNAME).zip"
- @if [ -e "$(ZIPREL)/$(APPNAME).zip" ]; \
- then \
- rm $(ZIPREL)/$(APPNAME).zip; \
- fi
-
- @echo " >> creating destination directory $(ZIPREL)"
- @if [ ! -d $(ZIPREL) ]; \
- then \
- mkdir -p $(ZIPREL); \
- fi
-
- @echo " >> setting directory permissions for $(ZIPREL)"
- @if [ ! -w $(ZIPREL) ]; \
- then \
- chmod 755 $(ZIPREL); \
- fi
-
- @echo " >> copying imports"
- @if [ "$(IMPORTFILES)" ]; \
- then \
- mkdir $(APPSOURCEDIR)/common; \
- cp -f -p -v $(IMPORTFILES) $(APPSOURCEDIR)/common/; \
- fi \
-
- @echo " >> generating build info file"
- @if [ -e "$(APPSOURCEDIR)/buildinfo.brs" ]; \
- then \
- rm $(APPSOURCEDIR)/buildinfo.brs; \
- fi
- echo "Function BuildDate()" >> $(APPSOURCEDIR)/buildinfo.brs
- echo " return \"${BUILDDATE}\"" >> $(APPSOURCEDIR)/buildinfo.brs
- echo "End Function" >> $(APPSOURCEDIR)/buildinfo.brs
- echo "Function BuildCommit()" >> $(APPSOURCEDIR)/buildinfo.brs
- echo " return \"${GITCOMMIT}\"" >> $(APPSOURCEDIR)/buildinfo.brs
- echo "End Function" >> $(APPSOURCEDIR)/buildinfo.brs
-
-# zip .png files without compression
-# do not zip up Makefiles, or any files ending with '~'
- @echo " >> creating application zip $(ZIPREL)/$(APPNAME).zip"
- @if [ -d $(SOURCEREL) ]; \
- then \
- (zip -0 -r "$(ZIPREL)/$(APPNAME).zip" . -i \*.png $(ZIP_EXCLUDE)); \
- (zip -9 -r "$(ZIPREL)/$(APPNAME).zip" . -x \*~ -x \*.png -x Makefile $(ZIP_EXCLUDE)); \
- else \
- echo "Source for $(APPNAME) not found at $(SOURCEREL)"; \
- fi
-
- @if [ "$(IMPORTCLEANUP)" ]; \
- then \
- echo " >> deleting imports";\
- rm -r -f $(APPSOURCEDIR)/common; \
- fi \
-
- @echo "*** packaging $(APPNAME) complete ***"
-
-install: $(APPNAME) home
- @echo "Installing $(APPNAME) to host $(ROKU_DEV_TARGET)"
- @$(CURLCMD) --user $(USERPASS) --digest -F "mysubmit=Install" -F "archive=@$(ZIPREL)/$(APPNAME).zip" -F "passwd=" http://$(ROKU_DEV_TARGET)/plugin_install | grep "//" | sed "s[[["
-
-# Make certain that the Roku is packaging with the correct key/DevID
-verify-keys: $(APPGENKEY)
- @echo "Verifying developer key is $(APPDEVID)"
- @if [ "$(HTTPSTATUS)" == " 401" ]; \
- then \
- ROKU_DEV_ID=`$(CURLCMD) --user $(USERPASS) --digest http://$(ROKU_DEV_TARGET)/plugin_package | grep $(APPDEVID)`; \
- if [ "$$ROKU_DEV_IDx" == "x" ]; then echo "ROKU_DEV_ID doesn't match $(APPDEVID)"; exit 1; fi \
- else \
- ROKU_DEV_ID=`$(CURLCMD) http://$(ROKU_DEV_TARGET)/plugin_package | grep $(APPDEVID)`; \
- if [ "$$ROKU_DEV_IDx" == "x" ]; then echo "ROKU_DEV_ID doesn't match $(APPDEVID)"; exit 1; fi \
- fi
-
-pkg: install verify-keys
- @echo "*** Creating Package ***"
-
- @echo " >> creating destination directory $(PKGREL)"
- @if [ ! -d $(PKGREL) ]; \
- then \
- mkdir -p $(PKGREL); \
- fi
-
- @echo " >> setting directory permissions for $(PKGREL)"
- @if [ ! -w $(PKGREL) ]; \
- then \
- chmod 755 $(PKGREL); \
- fi
-
- @echo "Packaging $(APPSRC)/$(APPNAME) on host $(ROKU_DEV_TARGET)"
- @if [ "$(HTTPSTATUS)" == " 401" ]; \
- then \
- read -p "Password: " REPLY ; echo $$REPLY | xargs -I{} $(CURLCMD) --user $(USERPASS) --digest -Fmysubmit=Package -Fapp_name=$(APPNAME)/$(VERSION) -Fpasswd={} -Fpkg_time=`expr \`date +%s\` \* 1000` "http://$(ROKU_DEV_TARGET)/plugin_package" | grep '^
//" | sed "s[[[" ; \
- else \
- curl -s -S -F "mysubmit=Delete" -F "archive=" -F "passwd=" http://$(ROKU_DEV_TARGET)/plugin_install | grep "//" | sed "s[[[" ; \
- fi
-
-install_native: $(APPNAME)
- @echo "Installing $(APPNAME) to native."
- @mkdir -p $(NATIVEDEVREL)
- @cp $(ZIPREL)/$(APPNAME).zip $(NATIVEDEVPKG)
- @$(NATIVETICKLER)
-
-remove_native:
- @echo "Removing $(APPNAME) from native."
- @rm $(NATIVEDEVPKG)
- @$(NATIVETICKLER)
-
-APPS_JPG_ART=`\find . -name "*.jpg"`
-
-art-jpg-opt:
- p4 edit $(APPS_JPG_ART)
- for i in $(APPS_JPG_ART); \
- do \
- TMPJ=`mktemp` || return 1; \
- echo "optimizing $$i"; \
- (jpegtran -copy none -optimize -outfile $$TMPJ $$i && mv -f $$TMPJ $$i &); \
- done
- wait
- p4 revert -a $(APPS_JPG_ART)
-
-APPS_PNG_ART=`\find . -name "*.png"`
-
-art-png-opt:
- p4 edit $(APPS_PNG_ART)
- for i in $(APPS_PNG_ART); \
- do \
- (optipng -o7 $$i &); \
- done
- wait
- p4 revert -a $(APPS_PNG_ART)
-
-art-opt: art-png-opt art-jpg-opt
-
-tr:
- p4 edit locale/.../translations.xml
- ../../rdk/rokudev/utilities/linux/bin/maketr
- rm locale/en_US/translations.xml
- p4 revert -a locale/.../translations.xml
-
-screenshot:
- SCREENSHOT_TIME=`date "+%s"`; \
- curl -m 1 -o screenshot.jpg --user $(USERPASS) --digest "http://$(ROKU_DEV_TARGET)/pkgs/dev.jpg?time=$$SCREENSHOT_TIME" -H 'Accept: image/png,image/*;q=0.8,*/*;q=0.5' -H 'Accept-Language: en-US,en;q=0.5' -H 'Accept-Encoding: gzip, deflate'
-
-
-
-
diff --git a/bsc-plugin/.eslintrc.js b/bsc-plugin/.eslintrc.js
new file mode 100644
index 00000000..7b2ff567
--- /dev/null
+++ b/bsc-plugin/.eslintrc.js
@@ -0,0 +1,205 @@
+module.exports = {
+ root: true,
+ parser: '@typescript-eslint/parser',
+ env: {
+ node: true,
+ mocha: true,
+ es6: true
+ },
+ parserOptions: {
+ project: ['./tsconfig.json'],
+ createDefaultProgram: true
+ },
+ plugins: [
+ '@typescript-eslint',
+ 'no-only-tests',
+ 'github'
+ ],
+ extends: [
+ 'eslint:all',
+ 'plugin:@typescript-eslint/all'
+ ],
+ rules: {
+ '@typescript-eslint/object-curly-spacing': ['off'],
+ '@typescript-eslint/array-type': 'off',
+ '@typescript-eslint/consistent-type-assertions': 'off',
+ '@typescript-eslint/explicit-function-return-type': 'off',
+ '@typescript-eslint/explicit-member-accessibility': 'off',
+ '@typescript-eslint/explicit-module-boundary-types': 'off',
+ '@typescript-eslint/init-declarations': 'off',
+ '@typescript-eslint/lines-between-class-members': 'off',
+ '@typescript-eslint/member-ordering': 'off',
+ '@typescript-eslint/method-signature-style': 'off',
+ '@typescript-eslint/naming-convention': 'off',
+ '@typescript-eslint/no-base-to-string': 'off',
+ '@typescript-eslint/no-dynamic-delete': 'off',
+ '@typescript-eslint/no-empty-function': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ '@typescript-eslint/no-extra-parens': 'off',
+ '@typescript-eslint/no-floating-promises': 'error',
+ '@typescript-eslint/no-implicit-any-catch': 'off',
+ '@typescript-eslint/no-invalid-this': 'off',
+ '@typescript-eslint/no-magic-numbers': 'off',
+ '@typescript-eslint/no-parameter-properties': 'off',
+ '@typescript-eslint/no-shadow': 'off',
+ '@typescript-eslint/no-this-alias': 'off',
+ //possibly disable this once we have converted all throw statements to actual errors
+ '@typescript-eslint/no-throw-literal': 'off',
+ '@typescript-eslint/no-invalid-void': 'off',
+ '@typescript-eslint/no-invalid-void-type': 'off',
+ '@typescript-eslint/no-type-alias': 'off',
+ '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'off',
+ '@typescript-eslint/no-unnecessary-condition': 'off',
+ '@typescript-eslint/no-unsafe-assignment': 'off',
+ '@typescript-eslint/no-unsafe-call': 'off',
+ '@typescript-eslint/no-unsafe-member-access': 'off',
+ '@typescript-eslint/no-unsafe-return': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars-experimental': 'off',
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/prefer-for-of': 'off',
+ '@typescript-eslint/prefer-readonly': 'off',
+ '@typescript-eslint/prefer-readonly-parameter-types': 'off',
+ '@typescript-eslint/promise-function-async': 'off',
+ '@typescript-eslint/quotes': [
+ 'error',
+ 'single',
+ {
+ 'allowTemplateLiterals': true
+ }
+ ],
+ '@typescript-eslint/require-array-sort-compare': 'off',
+ '@typescript-eslint/restrict-plus-operands': 'off',
+ '@typescript-eslint/restrict-template-expressions': 'off',
+ '@typescript-eslint/space-before-function-paren': 'off',
+ '@typescript-eslint/strict-boolean-expressions': 'off',
+ '@typescript-eslint/typedef': 'off',
+ '@typescript-eslint/unbound-method': 'off',
+ '@typescript-eslint/unified-signatures': 'off',
+ 'array-bracket-newline': 'off',
+ 'array-element-newline': 'off',
+ 'array-type': 'off',
+ 'arrow-body-style': 'off',
+ 'arrow-parens': 'off',
+ 'callback-return': 'off',
+ 'capitalized-comments': 'off',
+ 'class-methods-use-this': 'off',
+ 'complexity': 'off',
+ 'consistent-return': 'off',
+ 'consistent-this': 'off',
+ 'curly': 'error',
+ 'default-case': 'off',
+ 'dot-location': 'off',
+ 'dot-notation': 'off',
+ 'func-style': 'off',
+ 'function-call-argument-newline': 'off',
+ 'function-paren-newline': 'off',
+ 'getter-return': 'off',
+ 'github/array-foreach': 'error',
+ 'guard-for-in': 'off',
+ 'id-length': 'off',
+ 'indent': 'off',
+ 'init-declarations': 'off',
+ 'line-comment-position': 'off',
+ 'linebreak-style': 'off',
+ 'lines-around-comment': 'off',
+ 'lines-between-class-members': 'off',
+ 'max-classes-per-file': 'off',
+ 'max-depth': 'off',
+ 'max-len': 'off',
+ 'max-lines': 'off',
+ 'max-lines-per-function': 'off',
+ 'max-params': 'off',
+ 'max-statements': 'off',
+ 'no-only-tests/no-only-tests': 'error',
+ 'multiline-comment-style': 'off',
+ 'multiline-ternary': 'off',
+ 'new-cap': 'off',
+ 'newline-per-chained-call': 'off',
+ 'no-await-in-loop': 'off',
+ 'no-case-declarations': 'off',
+ 'no-constant-condition': 'off',
+ 'no-console': 'off',
+ 'no-continue': 'off',
+ 'no-else-return': 'off',
+ 'no-empty': 'off',
+ 'no-implicit-coercion': 'off',
+ 'no-inline-comments': 'off',
+ 'no-invalid-this': 'off',
+ 'no-labels': 'off',
+ 'no-lonely-if': 'off',
+ 'no-negated-condition': 'off',
+ 'no-param-reassign': 'off',
+ 'no-plusplus': 'off',
+ 'no-process-exit': 'off',
+ 'no-prototype-builtins': 'off',
+ 'no-shadow': 'off',
+ 'no-sync': 'off',
+ 'no-ternary': 'off',
+ 'no-undefined': 'off',
+ 'no-underscore-dangle': 'off',
+ 'no-unneeded-ternary': 'off',
+ 'no-useless-escape': 'off',
+ 'no-warning-comments': 'off',
+ 'object-curly-spacing': [
+ 'error',
+ 'always'
+ ],
+ 'object-property-newline': 'off',
+ 'object-shorthand': [
+ 'error',
+ 'never'
+ ],
+ 'one-var': [
+ 'error',
+ 'never'
+ ],
+ 'padded-blocks': 'off',
+ 'prefer-const': 'off',
+ 'prefer-destructuring': 'off',
+ 'prefer-named-capture-group': 'off',
+ 'prefer-template': 'off',
+ 'quote-props': 'off',
+ 'radix': 'off',
+ 'require-atomic-updates': 'off',
+ 'require-unicode-regexp': 'off',
+ 'sort-imports': 'off',
+ 'sort-keys': 'off',
+ 'spaced-comment': 'off',
+ 'vars-on-top': 'off',
+ 'wrap-regex': 'off'
+ },
+ //disable some rules for certain files
+ overrides: [{
+ //these files are getting deleted soon, so ingore the eslint warnings for now
+ files: ['src/brsTypes/**/*.ts'],
+ rules: {
+ '@typescript-eslint/no-invalid-this': 'off',
+ '@typescript-eslint/method-signature-style': 'off',
+ '@typescript-eslint/no-unsafe-assignment': 'off',
+ '@typescript-eslint/prefer-enum-initializers': 'off'
+ }
+ },
+ {
+ files: ['*.spec.ts'],
+ rules: {
+ '@typescript-eslint/no-unsafe-assignment': 'off',
+ '@typescript-eslint/no-unsafe-call': 'off',
+ '@typescript-eslint/no-unsafe-member-access': 'off',
+ '@typescript-eslint/no-unsafe-return': 'off',
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/no-unused-vars': 'off',
+ '@typescript-eslint/no-unused-vars-experimental': 'off',
+ '@typescript-eslint/dot-notation': 'off',
+ 'github/array-foreach': 'off',
+ 'new-cap': 'off',
+ 'no-shadow': 'off'
+ }
+ }, {
+ files: ['benchmarks/**/*'],
+ rules: {
+ '@typescript-eslint/no-require-imports': 'off',
+ '@typescript-eslint/no-var-requires': 'off'
+ }
+ }]
+};
diff --git a/bsc-plugin/.github/workflows/build.yml b/bsc-plugin/.github/workflows/build.yml
new file mode 100644
index 00000000..e21d2505
--- /dev/null
+++ b/bsc-plugin/.github/workflows/build.yml
@@ -0,0 +1,61 @@
+name: build
+on: [push, pull_request]
+
+jobs:
+ ci:
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-18.04, macos-10.15, windows-2019]
+ steps:
+ - uses: actions/checkout@master
+ - uses: actions/setup-node@master
+ with:
+ node-version: "10.19.0"
+ # - run: npm run build
+ # - run: cd bsc-plugin && npm i
+ # - run: cd bsc-plugin && npm ci
+ # - run: cd bsc-plugin && npm run build
+ # - run: cd bsc-plugin && npm run lint
+ # - run: cd bsc-plugin && npm run test
+ # - run: cd bsc-plugin && npm run publish-coverage
+ npm-release:
+ #only run this task if a tag starting with 'v' was used to trigger this (i.e. a tagged release)
+ if: startsWith(github.ref, 'refs/tags/v')
+ needs: ci
+ runs-on: ubuntu-18.04
+ env:
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+ steps:
+ - uses: actions/checkout@master
+ - uses: actions/setup-node@master
+ with:
+ node-version: "10.19.0"
+ - run: echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" > ./.npmrc
+ - run: npm ci
+ - run: npm run build
+ #create npm package
+ - run: npm pack
+
+ #create GitHub release
+ - name: Create GitHub Release
+ id: create_release
+ uses: actions/create-release@latest
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ tag_name: ${{ github.ref }}
+ release_name: ${{ github.ref }}
+ draft: false
+ prerelease: false #contains(github.ref, '-beta.') == true
+
+ #upload package to GitHub release
+ - name: Upload GitHub Release Assets
+ uses: alexellis/upload-assets@0.2.3
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ asset_paths: '["./*.tgz"]'
+
+ #upload to npm
+ - run: npm publish
diff --git a/bsc-plugin/.gitignore b/bsc-plugin/.gitignore
new file mode 100644
index 00000000..3082c3a5
--- /dev/null
+++ b/bsc-plugin/.gitignore
@@ -0,0 +1,64 @@
+tmp
+
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# next.js build output
+.next
+package-lock.json
diff --git a/bsc-plugin/.travis.yml b/bsc-plugin/.travis.yml
new file mode 100644
index 00000000..a44b898e
--- /dev/null
+++ b/bsc-plugin/.travis.yml
@@ -0,0 +1,7 @@
+language : node_js
+node_js :
+ - stable
+install:
+ - npm install
+script:
+ - npm test
\ No newline at end of file
diff --git a/bsc-plugin/.vscode/extensions.json b/bsc-plugin/.vscode/extensions.json
new file mode 100644
index 00000000..897af65d
--- /dev/null
+++ b/bsc-plugin/.vscode/extensions.json
@@ -0,0 +1,5 @@
+{
+ "recommendations": [
+ "dbaeumer.vscode-eslint"
+ ]
+}
\ No newline at end of file
diff --git a/bsc-plugin/.vscode/launch.json b/bsc-plugin/.vscode/launch.json
new file mode 100644
index 00000000..3f4d2d25
--- /dev/null
+++ b/bsc-plugin/.vscode/launch.json
@@ -0,0 +1,25 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run tests (current file)",
+ "type": "node",
+ "request": "launch",
+ "smartStep": false,
+ "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
+ "sourceMaps": true,
+ "args": [
+ "${relativeFile}",
+ "--timeout",
+ "0"
+ ],
+ "skipFiles": [
+ "${workspaceFolder}/node_modules/**/*.js",
+ "/**/*.js"
+ ],
+ "cwd": "${workspaceRoot}",
+ "protocol": "inspector",
+ "internalConsoleOptions": "openOnSessionStart"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/bsc-plugin/.vscode/settings.json b/bsc-plugin/.vscode/settings.json
new file mode 100644
index 00000000..5ed2f0fa
--- /dev/null
+++ b/bsc-plugin/.vscode/settings.json
@@ -0,0 +1,22 @@
+{
+ "files.exclude": {
+ "**/.git": true,
+ "**/.svn": true,
+ "**/.hg": true,
+ "**/CVS": true,
+ "**/.DS_Store": true,
+ "**/node_modules": true,
+ "**/.nyc_output": true,
+ "**/coverage": true,
+ "**/dist": true
+ },
+ "search.exclude": {
+ "**/node_modules": true,
+ "**/bower_components": true,
+ "**/dist": true
+ },
+ "editor.tabSize": 4,
+ "editor.insertSpaces": true,
+ "typescript.format.insertSpaceAfterFunctionKeywordForAnonymousFunctions": true,
+ "files.trimTrailingWhitespace": true
+}
\ No newline at end of file
diff --git a/bsc-plugin/.vscode/tasks.json b/bsc-plugin/.vscode/tasks.json
new file mode 100644
index 00000000..a97e1285
--- /dev/null
+++ b/bsc-plugin/.vscode/tasks.json
@@ -0,0 +1,23 @@
+{
+ "version": "0.2.0",
+ "tasks": [
+ {
+ "type": "shell",
+ "label": "build-tests",
+ "command": "tsc -p .",
+ "presentation": {
+ "echo": true,
+ "reveal": "silent",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": false,
+ "clear": true,
+ },
+ "options": {
+ "env": {
+ "TS_NODE_TRANSPILE_ONLY": "true"
+ }
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/bsc-plugin/LICENSE b/bsc-plugin/LICENSE
new file mode 100644
index 00000000..2b8b92c1
--- /dev/null
+++ b/bsc-plugin/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2019 George Cook
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/bsc-plugin/README.md b/bsc-plugin/README.md
new file mode 100644
index 00000000..80a7680c
--- /dev/null
+++ b/bsc-plugin/README.md
@@ -0,0 +1,30 @@
+
+
+
+
+VSCode ide plugin for [maestro](https://github.com/georgejecook/maestro) projects
+
+
+[![Build Status](https://travis-ci.org/georgejecook/maestro-vsc-extension-plugin.svg?branch=master)](https://travis-ci.org/georgejecook/maestro-vsc-extension-plugin)
+[![codecov](https://codecov.io/gh/georgejecook/maestro-vsc-extension-plugin/branch/master/graph/badge.svg)](https://codecov.io/gh/georgejecook/maestro-vsc-extension-plugin)
+[![GitHub](https://img.shields.io/github/release/georgejecook/maestro-vsc-extension-plugin.svg?style=flat-square)](https://github.com/georgejecook/maestro-vsc-extension-plugin/releases)
+[![NPM](https://nodei.co/npmmaestro-vsc-extension-plugin.png)](https://npmjs.org/packagemaestro-vsc-extension-plugin)
+
+## Links
+ - [maestro](https://github.com/georgejecook/maestro)
+ - [Issue tracker](https://github.com/georgejecook/maestro-vsc-extension-plugin/issues)
+ - [CHANGELOG](CHANGELOG.md)
+
+# About
+
+This repo contains the source for `maestro-vsc-extension-plugin`, which is used by the - [maestro framework](https://github.com/georgejecook/maestro).
+
+Use this plugin with vscode to use advanced features of maestro such as:
+
+ - XML binding support
+ - Reflection
+ - Dynamic imports
+
+## Get help
+
+Read how to use these features and the maestro framework [here](https://github.com/georgejecook/maestro:
\ No newline at end of file
diff --git a/bsc-plugin/package.json b/bsc-plugin/package.json
new file mode 100644
index 00000000..7876223c
--- /dev/null
+++ b/bsc-plugin/package.json
@@ -0,0 +1,106 @@
+{
+ "name": "rooibos-roku",
+ "version": "4.2.1",
+ "description": "simple, flexible, fun brightscript test framework for roku scenegraph apps - roku brighterscript plugin",
+ "files": [
+ "dist/**/!(*.spec.*)*"
+ ],
+ "main": "dist/plugin.js",
+ "directories": {
+ "test": "test"
+ },
+ "dependencies": {
+ "@types/node": "^14.14.16",
+ "source-map": "^0.7.3",
+ "stringify-object": "^3.3.0",
+ "vscode-languageserver": "~6.1.1",
+ "vscode-languageserver-protocol": "~3.15.3"
+ },
+ "devDependencies": {
+ "@types/chai": "^4.1.2",
+ "@types/expect": "^24.3.0",
+ "@types/mocha": "^5.2.7",
+ "@types/sinon": "^9.0.4",
+ "@typescript-eslint/eslint-plugin": "^4.4.1",
+ "@typescript-eslint/parser": "^4.4.1",
+ "brighterscript": "^0.37.4",
+ "chai": "^4.2.0",
+ "chai-files": "^1.4.0",
+ "chai-subset": "^1.6.0",
+ "eslint": "^7.11.0",
+ "eslint-plugin-github": "^4.1.1",
+ "eslint-plugin-no-only-tests": "^2.4.0",
+ "fs-extra": "^9.1.0",
+ "minimatch": "^3.0.4",
+ "mocha": "^7.1.1",
+ "nyc": "^15.1.0",
+ "roku-deploy": "^3.2.4",
+ "sinon": "^9.0.2",
+ "source-map-support": "^0.5.13",
+ "ts-node": "^9.0.0",
+ "typescript": "^3.8.3",
+ "typescript-formatter": "^7.2.2"
+ },
+ "scripts": {
+ "clean": "rm -rf ./dist && mkdir dist",
+ "compile": "npm run clean && tsc -p .",
+ "prepublishOnly": "npm run build",
+ "lint": "eslint \"src/**\"",
+ "build": "npm run compile && cp -r ../framework/src/source ./dist/lib/framework",
+ "test": "TS_NODE_TRANSPILE_ONLY=true mocha --full-trace --bail",
+ "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov",
+ "publish-npm": "npm run test && npm publish",
+ "publish-npm:beta": "npm run test && npm publish --tag=beta",
+ "local": "ts-node scripts/install-local.js",
+ "remote": "ts-node scripts/install-npm.js"
+ },
+ "preferGlobal": true,
+ "keywords": [
+ "brightscript",
+ "scenegraph",
+ "roku",
+ "rooibos",
+ "britherscript"
+ ],
+ "author": "George Cook",
+ "license": "ISC",
+ "watch": {
+ "test": {
+ "extensions": "ts",
+ "patterns": [
+ "src"
+ ]
+ }
+ },
+ "nyc": {
+ "include": [
+ "src/**/!(*.spec).ts"
+ ],
+ "extension": [
+ ".ts"
+ ],
+ "require": [
+ "ts-node/register",
+ "source-map-support/register"
+ ],
+ "reporter": [
+ "text-summary",
+ "html"
+ ],
+ "sourceMap": true,
+ "instrument": true,
+ "check-coverage": true,
+ "lines": 5,
+ "statements": 5,
+ "functions": 5,
+ "branches": 5
+ },
+ "mocha": {
+ "spec": "src/**/*.spec.ts",
+ "fullTrace": true,
+ "require": [
+ "source-map-support/register",
+ "ts-node/register"
+ ]
+ }
+}
diff --git a/bsc-plugin/scripts/install-local.js b/bsc-plugin/scripts/install-local.js
new file mode 100644
index 00000000..96eb9600
--- /dev/null
+++ b/bsc-plugin/scripts/install-local.js
@@ -0,0 +1,33 @@
+/**
+ * Installs a local version of all the rokucommunity dependent packages into this project
+ */
+
+import * as fsExtra from 'fs-extra';
+import * as path from 'path';
+import * as childProcess from 'child_process';
+import * as rimraf from 'rimraf';
+
+//set the cwd to the root of this project
+let thisProjectRootPath = path.join(__dirname, '..');
+process.chdir(thisProjectRootPath);
+let packageJson = JSON.parse(fsExtra.readFileSync('package.json').toString());
+
+let devPackages = {
+ 'brighterscript': '/home/george/hope/open-source/vsc/brighterscript'
+};
+
+for (let packageName in devPackages) {
+ console.log(`adding dev package: '${packageName}' to package.json`);
+ packageJson.devDependencies[packageName] = `${devPackages[packageName]}`;
+ rimraf.sync(path.join('node_modules', packageName));
+}
+
+console.log('saving package.json changes');
+fsExtra.writeFileSync('package.json', JSON.stringify(packageJson, null, 4));
+if (fsExtra.existsSync('package-lock.json')) {
+ fsExtra.rmSync('package-lock.json');
+}
+console.log('install packages');
+childProcess.execSync('npm i', {
+ stdio: 'inherit'
+});
diff --git a/bsc-plugin/scripts/install-npm.js b/bsc-plugin/scripts/install-npm.js
new file mode 100644
index 00000000..5b867448
--- /dev/null
+++ b/bsc-plugin/scripts/install-npm.js
@@ -0,0 +1,21 @@
+/**
+ * Installs a local version of all the rokucommunity dependent packages into this project
+ */
+
+import * as fsExtra from 'fs-extra';
+import * as path from 'path';
+import * as childProcess from 'child_process';
+import * as rimraf from 'rimraf';
+
+//set the cwd to the root of this project
+let thisProjectRootPath = path.join(__dirname, '..');
+process.chdir(thisProjectRootPath);
+
+rimraf.sync(path.join('node_modules/brighterscript'));
+if (fsExtra.existsSync('package-lock.json')) {
+ fsExtra.rmSync('package-lock.json');
+}
+console.log('install packages');
+childProcess.execSync('npm i brighterscript@latest --save-dev', {
+ stdio: 'inherit'
+});
diff --git a/bsc-plugin/src/lib/rooibos/Annotation.ts b/bsc-plugin/src/lib/rooibos/Annotation.ts
new file mode 100644
index 00000000..e2d248fa
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/Annotation.ts
@@ -0,0 +1,194 @@
+import type { BrsFile, Statement, AnnotationExpression } from 'brighterscript';
+import { diagnosticIllegalParams, diagnosticNoTestNameDefined, diagnosticMultipleDescribeAnnotations, diagnosticMultipleTestOnFunctionDefined } from '../utils/Diagnostics';
+
+export enum AnnotationType {
+ None = 'none',
+ TestSuite = 'suite',
+ Describe = 'describe',
+ It = 'it',
+ Ignore = 'ignore',
+ Solo = 'only',
+ NodeTest = 'sgnode',
+ Setup = 'setup',
+ TearDown = 'teardown',
+ BeforeEach = 'beforeeach',
+ AfterEach = 'aftereach',
+ Params = 'params',
+ IgnoreParams = 'ignoreparams',
+ SoloParams = 'onlyparams',
+ Tags = 'tags',
+ NoCatch = 'nocatch',
+ NoEarlyExit = 'noearlyexit'
+}
+
+let annotationLookup = {
+ suite: AnnotationType.TestSuite,
+ describe: AnnotationType.Describe,
+ it: AnnotationType.It,
+ ignore: AnnotationType.Ignore,
+ only: AnnotationType.Solo,
+ sgnode: AnnotationType.NodeTest,
+ setup: AnnotationType.Setup,
+ teardown: AnnotationType.TearDown,
+ beforeeach: AnnotationType.BeforeEach,
+ aftereach: AnnotationType.AfterEach,
+ params: AnnotationType.Params,
+ ignoreparams: AnnotationType.IgnoreParams,
+ onlyparams: AnnotationType.SoloParams,
+ tags: AnnotationType.Tags,
+ nocatch: AnnotationType.NoCatch,
+ noearlyexit: AnnotationType.NoEarlyExit
+};
+
+interface ParsedComment {
+ blockAnnotation?: RooibosAnnotation;
+ testAnnotation?: RooibosAnnotation;
+}
+
+export class AnnotationParams {
+
+ constructor(
+ public annotation: AnnotationExpression,
+ public text: string,
+ public lineNumber: number,
+ public params: any[],
+ public isIgnore = false,
+ public isSolo = false,
+ public noCatch = false,
+ public noearlyexit = false
+ ) {
+
+ }
+}
+export class RooibosAnnotation {
+ /**
+ * Represents a group of comments which contain tags such as @only, @suite, @describe, @it etc
+ * @param statement block of comments that contain annotations to apply to the next statement
+ */
+ constructor(
+ public file: BrsFile,
+ public annotation: AnnotationExpression,
+ public annotationType: AnnotationType,
+ public text: string,
+ public name: string,
+ public isIgnore = false,
+ public isSolo = false,
+ public params: AnnotationParams[] = [],
+ public nodeName?: string,
+ rawTags: string[] = [],
+ public noCatch = false,
+ public noEarlyExit = false
+ ) {
+ this.tags = new Set(rawTags);
+ }
+ public tags;
+ public hasSoloParams = false;
+
+ public static getAnnotation(file: BrsFile, statement: Statement): ParsedComment | null {
+
+ //split annotations in case they include an it group..
+ let blockAnnotation: RooibosAnnotation;
+ let testAnnotation: RooibosAnnotation;
+ let isSolo = false;
+ let isIgnore = false;
+ let noCatch = false;
+ let noEarlyExit = false;
+ let nodeName = null;
+ let tags = [];
+ if (statement.annotations?.length) {
+ let describeAnnotations = statement.annotations.filter((a) => getAnnotationType(a.name) === AnnotationType.Describe);
+ if (describeAnnotations.length > 1) {
+ for (let a of describeAnnotations) {
+ diagnosticMultipleDescribeAnnotations(file, a);
+ }
+ }
+ for (let annotation of statement.annotations) {
+ const annotationType = getAnnotationType(annotation.name);
+ switch (annotationType) {
+ case AnnotationType.NoEarlyExit:
+ noEarlyExit = true;
+ break;
+ case AnnotationType.NoCatch:
+ noCatch = true;
+ break;
+ case AnnotationType.Solo:
+ isSolo = true;
+ break;
+ case AnnotationType.NodeTest:
+ nodeName = annotation.getArguments()[0] as string;
+ break;
+ case AnnotationType.Tags:
+ tags = annotation.getArguments().map((a) => a.toString());
+ break;
+ case AnnotationType.Ignore:
+ isIgnore = true;
+ break;
+ case AnnotationType.BeforeEach:
+ case AnnotationType.AfterEach:
+ case AnnotationType.Setup:
+ case AnnotationType.TearDown:
+ testAnnotation = new RooibosAnnotation(file, annotation, annotationType, annotation.name, annotation.name);
+ break;
+ case AnnotationType.Describe:
+ case AnnotationType.TestSuite:
+ const groupName = annotation.getArguments()[0] as string;
+ blockAnnotation = new RooibosAnnotation(file, annotation, annotationType, annotation.name, groupName, isIgnore, isSolo, null, nodeName, tags, noCatch, noEarlyExit);
+ nodeName = null;
+ isSolo = false;
+ isIgnore = false;
+ break;
+ case AnnotationType.It:
+ const testName = annotation.getArguments()[0] as string;
+ if (!testName || testName.trim() === '') {
+ diagnosticNoTestNameDefined(file, annotation);
+ }
+ let newAnnotation = new RooibosAnnotation(file, annotation, annotationType, annotation.name, testName, isIgnore, isSolo, undefined, undefined, tags, noCatch);
+ if (testAnnotation) {
+ diagnosticMultipleTestOnFunctionDefined(file, newAnnotation.annotation);
+ } else {
+ testAnnotation = newAnnotation;
+ }
+ isSolo = false;
+ isIgnore = false;
+ break;
+ case AnnotationType.Params:
+ case AnnotationType.SoloParams:
+ case AnnotationType.IgnoreParams:
+ if (testAnnotation) {
+ testAnnotation.parseParams(file, annotation, annotationType, noCatch);
+ } else {
+ //error
+ }
+ break;
+ case AnnotationType.None:
+ default:
+ continue;
+ }
+ }
+ }
+ return { blockAnnotation: blockAnnotation, testAnnotation: testAnnotation };
+ }
+
+ public parseParams(file: BrsFile, annotation: AnnotationExpression, annotationType: AnnotationType, noCatch: boolean) {
+ let rawParams = JSON.stringify(annotation.getArguments());
+ let isSolo = annotationType === AnnotationType.SoloParams;
+ let isIgnore = annotationType === AnnotationType.IgnoreParams;
+ if (isSolo) {
+ this.hasSoloParams = true;
+ }
+ try {
+ if (rawParams) {
+ this.params.push(new AnnotationParams(annotation, rawParams, annotation.range.start.line, annotation.getArguments() as any, isIgnore, isSolo, noCatch));
+ } else {
+ diagnosticIllegalParams(file, annotation);
+ }
+ } catch (e) {
+ diagnosticIllegalParams(file, annotation);
+ }
+ }
+
+}
+
+export function getAnnotationType(text: string): AnnotationType {
+ return annotationLookup[text.toLowerCase()] || AnnotationType.None;
+}
diff --git a/bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.spec.ts b/bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.spec.ts
new file mode 100644
index 00000000..c43cccb7
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.spec.ts
@@ -0,0 +1,74 @@
+// import * as chai from 'chai';
+// import * as fs from 'fs-extra';
+
+// import { Program, ProgramBuilder } from 'brighterscript';
+
+// import { expect } from 'chai';
+
+// import * as path from 'path';
+
+// import { CodeCoverageProcessor } from './CodeCoverageProcessor';
+// import { ProcessorConfig } from './ProcessorConfig';
+
+// import File from './File';
+
+// const chaiSubset = require('chai-subset');
+
+// chai.use(chaiSubset);
+// let processor: CodeCoverageProcessor;
+// let sourcePath = 'src/test/stubProject';
+// let targetPath = 'build';
+
+// let bsConfig = require('/home/george/hope/open-source/rooibos/rooibos-roku-vsc-extension-plugin/src/test/stubProject/bsconfig.json'
+// );
+// function clearFiles() {
+// fs.removeSync(targetPath);
+// }
+
+// function copyFiles() {
+// try {
+// fs.copySync(sourcePath, targetPath);
+// } catch (err) {
+// console.error(err);
+// }
+// }
+
+// describe('CodeCoverageProcessor tests', function() {
+// beforeEach(() => {
+// clearFiles();
+// copyFiles();
+// let _programBuilder = new ProgramBuilder();
+// bsConfig.rootDir = path.resolve('src/test/stubProject/src');
+
+// processor = new CodeCoverageProcessor(_programBuilder.program);
+// });
+
+// describe('Process files valid test', function() {
+// it('tests processor runs', async () => {
+// let f: File;
+// await processor.processFile(f);
+// });
+// it('tests creates CodeCoverageSupport file', async () => {
+// let f: File;
+// await processor.processFile(f);
+// let filePath = path.resolve(path.join(targetPath, 'source', 'CodeCoverageSupport.brs'));
+// expect(fs.existsSync(filePath)).to.be.true;
+// });
+// it('tests creates coverage component', async () => {
+// let f: File;
+// await processor.processFile(f);
+// let filePath = path.resolve(path.join(targetPath, 'components', 'CodeCoverage.xml'));
+// expect(fs.existsSync(filePath)).to.be.true;
+// filePath = path.resolve(path.join(targetPath, 'components', 'CodeCoverage.brs'));
+// expect(fs.existsSync(filePath)).to.be.true;
+// });
+// });
+
+// describe('specific file with lots of code use cases in it', function() {
+// it('tests processor runs', async () => {
+// let f: File;
+// await processor.processFile(f);
+// console.log('TODO - write tests - currently manually validating!!');
+// });
+// });
+// });
diff --git a/bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.ts b/bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.ts
new file mode 100644
index 00000000..53922771
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/CodeCoverageProcessor.ts
@@ -0,0 +1,128 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
+/* eslint-disable @typescript-eslint/no-unsafe-assignment */
+import type { BrsFile, ProgramBuilder } from 'brighterscript';
+import type { RooibosConfig } from './RooibosConfig';
+
+export class CodeCoverageProcessor {
+
+ constructor(builder: ProgramBuilder) {
+ this._config = (builder.options as any).rooibos as RooibosConfig || {};
+ this._fileId = 0;
+ try {
+ // this._coverageBrsTemplate = fs.readFileSync(path.join(__dirname, './CodeCoverageTemplate.brs'), 'utf8');
+ // this._coverageComponentBrsTemplate = fs.readFileSync(path.join(__dirname, './CodeCoverage.brs'), 'utf8');
+ // this._coverageComponentXmlTemplate = fs.readFileSync(path.join(__dirname, './CodeCoverage.xml'), 'utf8');
+ // this._coverageSupportTemplate = fs.readFileSync(path.join(__dirname, './CodeCoverageSupport.brs'), 'utf8');
+ } catch (e) {
+ // console.log('Error:', e.stack);
+ }
+ }
+
+ private _config: RooibosConfig;
+ private _fileId: number;
+ private _coverageBrsTemplate: string;
+
+ public generateMetadata() {
+ //DO when everythin is ran
+ this.createCoverageComponent();
+ this.createCoverageSupport();
+ }
+
+ public addCodeCoverage(file: BrsFile) {
+ //not yet supported
+ if (false && this._config.isRecordingCodeCoverage) {
+ this._processFile();
+ }
+ //if matches glob
+ // this._processFile(file);
+ //
+ }
+
+ public _processFile() {
+ // this._fileId++;
+ // let fileContents = '';
+ // let lines = file.getFileContents().split(/\r?\n/);
+ // let coverageMap: Map = new Map();
+ // this.visitableLines = new Map();
+ // this.getVisitableLinesForStatements(file.ast);
+ // //TODO - walks the ast
+ // for (let lineNumber = 0; lineNumber < lines.length; lineNumber++) {
+ // let line = lines[lineNumber];
+ // let statement = this.visitableLines.get(lineNumber);
+ // let coverageType = CodeCoverageLineType.noCode;
+ // if (statement) {
+ // if (statement instanceof IfStatement) {
+ // let conditionStartPos = statement.condition.range.start.character;
+ // let conditionEndPos = statement.condition.range.end.character;
+ // let funcCall = this.getFuncCallText(lineNumber, CodeCoverageLineType.condition);
+ // let conditionText = line.substr(conditionStartPos, conditionEndPos - conditionStartPos);
+ // let restofLineText = line.substring(conditionEndPos);
+ // line = `${line.substr(0, conditionStartPos)} ${funcCall} and (${conditionText}) ${restofLineText}`;
+ // coverageType = CodeCoverageLineType.condition;
+ // } else if (statement instanceof IfStatement) {
+ // // let conditionStartPos = statement.condition.location.start.column;
+ // // let conditionEndPos = statement.condition.location.end.column;
+ // // let funcCall = this.getFuncCallText(lineNumber, CodeCoverageLineType.condition);
+ // // let conditionText = line.substr(conditionStartPos, conditionEndPos - conditionStartPos);
+ // // let restofLineText = line.substring(conditionEndPos);
+ // // line = `${line.substr(0, conditionStartPos)} ${funcCall} and (${conditionText}) ${restofLineText}`;
+ // // coverageType = CodeCoverageLineType.condition;
+ // } else {
+ // //all types that can be prefixed with the funcall and a colon (i.e for, while, return foreach, assign)
+ // let funcCall = this.getFuncCallText(lineNumber, CodeCoverageLineType.code);
+ // line = `${funcCall}: ${line}`;
+ // coverageType = CodeCoverageLineType.code;
+ // }
+ // } else {
+ // `could not ascertain symbol type for line "${line} - ignoring`);
+ // }
+
+ // if (!line.endsWith('\n')) {
+ // line += '\n';
+ // }
+ // fileContents += line;
+ // if (coverageType > CodeCoverageLineType.noCode) {
+ // coverageMap.set(lineNumber, coverageType);
+ // }
+ // }
+ // this._expectedCoverageMap[this._fileId.toString().trim()] = Array.from(coverageMap);
+ // this._filePathMap[this._fileId] = file.pkgUri;
+ // fileContents += this.getBrsAPIText();
+ // file.setFileContents(fileContents);
+ //`Writing to ${file.fullPath}`);
+ // file.saveFileContents();
+ }
+
+ public getBrsAPIText(): string {
+ let template = this._coverageBrsTemplate.replace(/\#ID\#/g, this._fileId.toString().trim());
+ return template;
+ }
+
+ public createCoverageComponent() {
+ // //Write this out via program
+ // let targetPath = path.resolve(this._program.options.rootDir);
+ // let file = new File(path.resolve(path.join(targetPath), 'components'), 'components', 'CodeCoverage.xml', '.xml');
+ // file.setFileContents(this._coverageComponentXmlTemplate);
+ //`Writing to ${file.fullPath}`);
+ // file.saveFileContents();
+
+ // file = new File(path.resolve(path.join(targetPath, 'components')), 'components', 'CodeCoverage.brs', '.brs');
+ // let template = this._coverageComponentBrsTemplate;
+ // template = template.replace(/\#EXPECTED_MAP\#/g, JSON.stringify(this._expectedCoverageMap));
+ // template = template.replace(/\#FILE_PATH_MAP\#/g, JSON.stringify(this._filePathMap));
+ // file.setFileContents(template);
+ //`Writing to ${file.fullPath}`);
+ // file.saveFileContents();
+ }
+
+ public createCoverageSupport() {
+ // //write this out via program
+ // let targetPath = path.resolve(this._program.options.rootDir);
+ // let file = new File(path.resolve(path.join(targetPath), 'source'), 'source', 'CodeCoverageSupport.brs', '.brs');
+ // file.setFileContents(this._coverageSupportTemplate);
+ //`Writing to ${file.fullPath}`);
+ // file.saveFileContents();
+ }
+
+
+}
diff --git a/bsc-plugin/src/lib/rooibos/CodeCoverageType.ts b/bsc-plugin/src/lib/rooibos/CodeCoverageType.ts
new file mode 100644
index 00000000..88f8372c
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/CodeCoverageType.ts
@@ -0,0 +1,6 @@
+export enum CodeCoverageLineType {
+ noCode = 0,
+ code = 1,
+ condition = 2,
+ branch = 3
+}
diff --git a/bsc-plugin/src/lib/rooibos/FileFactory.ts b/bsc-plugin/src/lib/rooibos/FileFactory.ts
new file mode 100644
index 00000000..32cff548
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/FileFactory.ts
@@ -0,0 +1,103 @@
+import type { BrsFile, FileObj, Program, XmlFile } from 'brighterscript';
+
+import * as path from 'path';
+import * as fs from 'fs';
+
+export class FileFactory {
+
+ constructor(options: any) {
+ if (options.frameworkSourcePath) {
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
+ this.sourcePath = options.frameworkSourcePath;
+ }
+ }
+
+ private frameworkFileNames = [
+ 'BaseTestSuite',
+ 'CommonUtils',
+ 'Coverage',
+ 'Matchers',
+ 'Rooibos',
+ 'RuntimeConfig',
+ 'Stats',
+ 'Test',
+ 'TestGroup',
+ 'BaseTestReporter',
+ 'ConsoleTestReporter',
+ 'TestResult',
+ 'TestRunner',
+ 'Utils'
+ ];
+
+ public sourcePath = path.join(__dirname, '../framework');
+ private targetPath = 'source/rooibos/';
+ private targetCompsPath = 'components/rooibos/';
+
+ public getFrameworkFiles(): FileObj[] {
+ let files: FileObj[] = [];
+
+ for (let fileName of this.frameworkFileNames) {
+ files.push({ src: path.resolve(path.join(this.sourcePath, `${fileName}.bs`)), dest: path.join(this.targetPath, `${fileName}.bs`) });
+ }
+ files.push({ src: path.resolve(path.join(this.sourcePath, `RooibosScene.xml`)), dest: path.join(this.targetCompsPath, `RooibosScene.xml`) });
+ return files;
+ }
+
+ public addFrameworkFiles(program: Program) {
+ for (let fileName of this.frameworkFileNames) {
+ let sourcePath = path.resolve(path.join(this.sourcePath, `${fileName}.bs`));
+ let fileContents = fs.readFileSync(sourcePath, 'utf8');
+ let destPath = path.join(this.targetPath, `${fileName}.bs`);
+ let entry = { src: sourcePath, dest: destPath };
+
+ program.addOrReplaceFile(entry, fileContents);
+ }
+
+ let sourcePath = path.resolve(path.join(this.sourcePath, `RooibosScene.xml`));
+ let destPath = path.join(this.targetCompsPath, `RooibosScene.xml`);
+ let entry = { src: sourcePath, dest: destPath };
+ program.addOrReplaceFile(entry, this.createTestXML('TestsScene', 'Scene'));
+ }
+
+ public createTestXML(name: string, baseName: string, useBs = true): string {
+ let scriptImports = [];
+ for (let fileName of this.frameworkFileNames) {
+ scriptImports.push(``);
+ }
+
+ let contents = `
+
+${scriptImports.join('\n')}
+
+
+
+
+
+
+
+
+
+ `;
+ return contents;
+ }
+
+ public isIgnoredFile(file: BrsFile | XmlFile): boolean {
+ let name = file.pkgPath.toLowerCase();
+ let result = this.frameworkFileNames.find((f) => {
+ return name === path.join(this.targetPath, `${f}.bs`).toLowerCase();
+ }
+ );
+ return result !== undefined;
+ }
+
+ public addFile(program, projectPath: string, contents: string) {
+ try {
+ return program.addOrReplaceFile({ src: path.resolve(projectPath), dest: projectPath }, contents);
+ } catch (error) {
+ console.error(`Error adding framework file: ${projectPath} : ${error.message}`);
+ }
+ }
+
+}
diff --git a/bsc-plugin/src/lib/rooibos/RawCodeStatement.ts b/bsc-plugin/src/lib/rooibos/RawCodeStatement.ts
new file mode 100644
index 00000000..8424316c
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/RawCodeStatement.ts
@@ -0,0 +1,30 @@
+import type { BscFile,
+ WalkOptions,
+ WalkVisitor } from 'brighterscript';
+import { Range,
+ Statement } from 'brighterscript';
+import type { BrsTranspileState } from 'brighterscript/dist/parser/BrsTranspileState';
+
+import { SourceNode } from 'source-map';
+
+export class RawCodeStatement extends Statement {
+ constructor(
+ public source: string,
+ public sourceFile?: BscFile,
+ public range: Range = Range.create(1, 1, 1, 99999)
+ ) {
+ super();
+ }
+
+ public transpile(state: BrsTranspileState) {
+ return [new SourceNode(
+ this.range.start.line + 1,
+ this.range.start.character,
+ this.sourceFile ? this.sourceFile.pathAbsolute : state.srcPath,
+ this.source
+ )];
+ }
+ public walk(visitor: WalkVisitor, options: WalkOptions) {
+ //nothing to walk
+ }
+}
diff --git a/bsc-plugin/src/lib/rooibos/RooibosConfig.ts b/bsc-plugin/src/lib/rooibos/RooibosConfig.ts
new file mode 100644
index 00000000..4b9acd06
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/RooibosConfig.ts
@@ -0,0 +1,22 @@
+
+export enum RooibosLogLevel {
+ error = 0,
+ warning = 1,
+ info = 2,
+ verbose = 3
+}
+
+export interface RooibosConfig {
+ coverageSourceFilePattern?: string[];
+ isRecordingCodeCoverage?: boolean;
+ logLevel?: RooibosLogLevel;
+ showOnlyFailures?: boolean;
+ failFast?: boolean;
+ printTestTimes?: boolean;
+ printLcov?: boolean;
+ port?: number;
+ lineWidth?: number;
+ includeFilters?: string[];
+ tags?: string[];
+ catchCrashes?: boolean;
+}
diff --git a/bsc-plugin/src/lib/rooibos/RooibosSession.ts b/bsc-plugin/src/lib/rooibos/RooibosSession.ts
new file mode 100644
index 00000000..26a59690
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/RooibosSession.ts
@@ -0,0 +1,177 @@
+import * as path from 'path';
+
+import type { BrsFile, ClassStatement, NamespaceStatement, Program, ProgramBuilder } from 'brighterscript';
+import { ParseMode } from 'brighterscript';
+
+import type { RooibosConfig } from './RooibosConfig';
+import { SessionInfo } from './RooibosSessionInfo';
+import { TestSuiteBuilder } from './TestSuiteBuilder';
+import { RawCodeStatement } from './RawCodeStatement';
+import type { FileFactory } from './FileFactory';
+import type { TestSuite } from './TestSuite';
+import { diagnosticErrorNoMainFound as diagnosticWarnNoMainFound } from '../utils/Diagnostics';
+
+// eslint-disable-next-line
+const pkg = require('../../../package.json');
+
+export class RooibosSession {
+ constructor(builder: ProgramBuilder, fileFactory: FileFactory) {
+ this.fileFactory = fileFactory;
+ this.config = builder.options ? (builder.options as any).rooibos as RooibosConfig || {} : {};
+ this._builder = builder;
+ this._suiteBuilder = new TestSuiteBuilder(this);
+ this.reset();
+ }
+
+ private fileFactory: FileFactory;
+ private _builder: ProgramBuilder;
+ public config: RooibosConfig;
+ private _suiteBuilder: TestSuiteBuilder;
+
+ public sessionInfo: SessionInfo;
+
+ public reset() {
+ this.sessionInfo = new SessionInfo(this.config);
+ }
+
+ public updateSessionStats() {
+ this.sessionInfo.updateInfo();
+ }
+
+ public processFile(file: BrsFile): boolean {
+ let testSuites = this._suiteBuilder.processFile(file);
+ return testSuites.length > 0;
+ }
+
+ public addLaunchHook() {
+ let mainFunc = null;
+ let files = this._builder.program.getScopeByName('source').getOwnFiles();
+ for (let file of files) {
+ mainFunc = (file as BrsFile).parser.references.functionStatements.find((f) => f.name.text.toLowerCase() === 'main');
+ if (mainFunc) {
+ mainFunc.func.body.statements.splice(0, 0, new RawCodeStatement(`
+ Rooibos_init()
+ `));
+ break;
+ }
+ }
+ if (!mainFunc) {
+ diagnosticWarnNoMainFound(files[0]);
+ this._builder.program.addOrReplaceFile('source/rooibosMain.brs', `function main()
+ Rooibos_init()
+end function`);
+ }
+ }
+
+ public addTestRunnerMetadata() {
+ let runtimeConfig = this._builder.program.getFileByPkgPath('source/rooibos/RuntimeConfig.bs');
+ if (runtimeConfig) {
+ let classStatement = ((runtimeConfig as BrsFile).ast.statements[0] as NamespaceStatement).body.statements[0] as ClassStatement;
+ this.updateRunTimeConfigFunction(classStatement);
+ this.updateVersionTextFunction(classStatement);
+ this.updateClassLookupFunction(classStatement);
+ this.updateGetAllTestSuitesNames(classStatement);
+ this.createIgnoredTestsInfoFunction(classStatement);
+ }
+ }
+
+ public updateRunTimeConfigFunction(classStatement: ClassStatement) {
+ let method = classStatement.methods.find((m) => m.name.text === 'getRuntimeConfig');
+ if (method) {
+ method.func.body.statements.push(new RawCodeStatement(`
+ return {
+ "failFast": ${this.config.failFast ? 'true' : 'false'}
+ "logLevel": ${this.config.logLevel ?? 0}
+ "showOnlyFailures": ${this.config.showOnlyFailures ? 'true' : 'false'}
+ "printTestTimes": ${this.config.printTestTimes ? 'true' : 'false'}
+ "lineWidth": ${this.config.lineWidth || 60}
+ "printLcov": ${this.config.printLcov ? 'true' : 'false'}
+ "port": "${this.config.port || 'invalid'}"
+ "catchCrashes": ${this.config.catchCrashes ? 'true' : 'false'}
+ }`));
+ }
+ }
+
+ public updateVersionTextFunction(classStatement: ClassStatement) {
+ let method = classStatement.methods.find((m) => m.name.text === 'getVersionText');
+ if (method) {
+ method.func.body.statements.push(new RawCodeStatement(`return "${pkg.version}"`));
+ }
+ }
+
+ public updateClassLookupFunction(classStatement: ClassStatement) {
+ let method = classStatement.methods.find((m) => m.name.text === 'getTestSuiteClassWithName');
+ if (method) {
+ let text = `
+ if false
+ ? "noop"
+ `;
+ for (let suite of this.sessionInfo.testSuitesToRun) {
+ text += `
+ else if name = "${suite.name}"
+ return ${suite.classStatement.getName(ParseMode.BrightScript)}
+ `;
+ }
+ text += `
+ end if`;
+ method.func.body.statements.push(new RawCodeStatement(text));
+ }
+ }
+
+ public updateGetAllTestSuitesNames(classStatement: ClassStatement) {
+ let method = classStatement.methods.find((m) => m.name.text === 'getAllTestSuitesNames');
+ if (method) {
+ let text = `return [
+ ${this.sessionInfo.testSuitesToRun.filter((s) => !s.isNodeTest)
+ .map((s) => `"${s.name}"`).join('\n')
+}
+ ]`;
+ method.func.body.statements.push(new RawCodeStatement(text));
+ }
+ }
+
+ public createNodeFiles(program: Program) {
+
+ let p = path.join('components', 'rooibos', 'generated');
+
+ for (let suite of this.sessionInfo.testSuitesToRun.filter((s) => s.isNodeTest)) {
+ let xmlText = this.getNodeTestXmlText(suite);
+ let bsPath = path.join(p, `${suite.generatedNodeName}.bs`);
+ this.fileFactory.addFile(program, path.join(p, `${suite.generatedNodeName}.xml`), xmlText);
+ let bsFile = program.getFileByPkgPath(bsPath);
+ if (bsFile) {
+ (bsFile as BrsFile).parser.statements.push();
+ bsFile.needsTranspiled = true;
+ }
+ let brsFile = this.fileFactory.addFile(program, bsPath, this.getNodeTestBsBody(suite));
+ brsFile.parser.invalidateReferences();
+ }
+ }
+
+ private getNodeTestXmlText(suite: TestSuite) {
+ return this.fileFactory.createTestXML(suite.generatedNodeName, suite.nodeName);
+ }
+
+ private getNodeTestBsBody(testSuite: TestSuite): string {
+ return `import "pkg:/${testSuite.file.pkgPath}"
+ function init()
+ nodeRunner = Rooibos_TestRunner(m.top.getScene(), m)
+ m.top.rooibosTestResult = nodeRunner.runInNodeMode("${testSuite.name}")
+ end function
+ `;
+ }
+
+ public createIgnoredTestsInfoFunction(cs: ClassStatement) {
+ let method = cs.methods.find((m) => m.name.text === 'getIgnoredTestInfo');
+ if (method) {
+ let text = `return {
+ "count": ${this.sessionInfo.ignoredCount}
+ "items":[
+ ${this.sessionInfo.ignoredTestNames.map((name) => `"${name}",`).join('\n')}
+ ]}
+ `;
+
+ method.func.body.statements.push(new RawCodeStatement(text));
+ }
+ }
+}
diff --git a/bsc-plugin/src/lib/rooibos/RooibosSessionInfo.ts b/bsc-plugin/src/lib/rooibos/RooibosSessionInfo.ts
new file mode 100644
index 00000000..8208c900
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/RooibosSessionInfo.ts
@@ -0,0 +1,177 @@
+
+import type { RooibosConfig } from './RooibosConfig';
+import type { TestSuite } from './TestSuite';
+import type { TestGroup } from './TestGroup';
+import type { TestCase } from './TestCase';
+
+export class SessionInfo {
+
+ public ignoredCount = 0;
+ public ignoredTestNames: string[] = [];
+ public allTestSuites = new Set();
+ public testSuites = new Map();
+ public testSuitesByPath = new Map();
+ public testSuitesToRun: TestSuite[] = [];
+ public hasSoloSuites = false;
+ public hasSoloGroups = false;
+ public hasSoloTests = false;
+ public testsCount = 0;
+ public suitesCount = 0;
+ public groupsCount = 0;
+ public includeTags = [];
+ public excludeTags = [];
+ constructor(public config: RooibosConfig) {
+ for (let tag of config.tags || []) {
+ if (tag.startsWith('!')) {
+ this.excludeTags.push(tag.substr(1));
+ } else {
+ this.includeTags.push(tag);
+ }
+ }
+ }
+
+ public updateTestSuites(testSuites: TestSuite[]) {
+ //we can assume at this point that all suites coming in belong to same file
+ //incase that is useful in future
+ for (let testSuite of testSuites) {
+ if (testSuite.isValid && !this.isExcludedByTag(testSuite, false)) {
+ this.testSuites.set(testSuite.name, testSuite);
+
+ this.addTestSuiteToPath(testSuite);
+ if (testSuite.isSolo) {
+ this.hasSoloSuites = !this.hasSoloGroups && !this.hasSoloTests;
+ }
+ if (testSuite.hasSoloGroups) {
+ this.hasSoloGroups = !this.hasSoloTests;
+ }
+ if (testSuite.hasSoloTests) {
+ this.hasSoloTests = true;
+ this.hasSoloGroups = false;
+ this.hasSoloSuites = false;
+ }
+ } else {
+ this.allTestSuites.add(testSuite);
+ }
+ }
+ this.suitesCount = this.testSuites.size;
+ }
+
+ public addTestSuiteToPath(testSuite: TestSuite) {
+ let suites = this.testSuitesByPath.get(testSuite.file.pkgPath) || [];
+ //TODO - I think we could end up with duplicate suites in this case..
+ suites.push(testSuite);
+ this.testSuitesByPath.set(testSuite.file.pkgPath, suites);
+ }
+
+ /**
+ * Once we know what's ignored/solo/etc, we can ascertain if we're going
+ * to include it in the final json payload
+ */
+ public updateInfo() {
+ for (let testSuite of [...this.testSuites.values()]) {
+ if (this.isExcludedByTag(testSuite, false)) {
+ testSuite.isIncluded = false;
+ } else if (this.hasSoloTests && !testSuite.hasSoloTests) {
+ testSuite.isIncluded = false;
+ } else if (this.hasSoloSuites && !testSuite.isSolo) {
+ testSuite.isIncluded = false;
+ } else if (testSuite.isIgnored) {
+ testSuite.isIncluded = false;
+ this.ignoredTestNames.push(testSuite.name + ' [WHOLE SUITE]');
+ this.ignoredCount++;
+ } else {
+ testSuite.isIncluded = true;
+ }
+ if (!testSuite.isIncluded) {
+ continue;
+ }
+ //'testSuite ' + testSuite.name);
+ for (let testGroup of testSuite.getTestGroups()) {
+
+ //'GROUP ' + testGroup.name);
+ if (testGroup.isIgnored) {
+ this.ignoredCount += testGroup.ignoredTestCases.length;
+ this.ignoredTestNames.push(testGroup.name + ' [WHOLE GROUP]');
+ testGroup.isIncluded = false;
+ } else {
+ if (testGroup.ignoredTestCases.length > 0) {
+ this.ignoredTestNames.push(testGroup.name);
+ this.ignoredCount += testGroup.ignoredTestCases.length;
+ for (let ignoredTestCase of testGroup.ignoredTestCases) {
+ if (!ignoredTestCase.isParamTest) {
+ this.ignoredTestNames.push(ignoredTestCase.name);
+ } else if (ignoredTestCase.paramTestIndex === 0) {
+ let testCaseName = ignoredTestCase.name;
+ if (testCaseName.length > 1 && testCaseName.substr(testCaseName.length - 1) === '0') {
+ testCaseName = testCaseName.substr(0, testCaseName.length - 1);
+ }
+ this.ignoredTestNames.push(testCaseName);
+ }
+ }
+ }
+ if (this.isExcludedByTag(testGroup, true)) {
+ testGroup.isIncluded = false;
+ } else if (this.hasSoloTests && !testGroup.hasSoloTests) {
+ testGroup.isIncluded = false;
+ } else if (this.hasSoloGroups && !testGroup.isSolo) {
+ testGroup.isIncluded = false;
+ } else {
+ testGroup.isIncluded = true;
+ }
+
+ if (testGroup.isIncluded) {
+ this.groupsCount++;
+ let testCases = [...testGroup.testCases.values()];
+
+ for (let testCase of testCases) {
+ if (this.isExcludedByTag(testCase, true)) {
+ testCase.isIncluded = false;
+ } else if (testCase.isIgnored) {
+ testCase.isIncluded = false;
+ } else if (this.hasSoloTests && !testCase.isSolo) {
+ testCase.isIncluded = false;
+ } else {
+ testCase.isIncluded = testGroup.isIncluded || testCase.isSolo;
+ this.testsCount++;
+ }
+ }
+
+ for (let testCase of testGroup.soloTestCases) {
+ if (this.isExcludedByTag(testCase, true)) {
+ testCase.isIncluded = false;
+ } else {
+ testCase.isIncluded = true;
+ this.testsCount++;
+ }
+ }
+ }
+ }
+ }
+ }
+ this.testSuitesToRun = [...this.testSuites.values()].filter((s) => s.isIncluded);
+ }
+
+ isExcludedByTag(item: TestCase | TestGroup | TestSuite, isParentIncluded) {
+ if (this.excludeTags.length > 0) {
+ for (let tag of this.excludeTags) {
+ if (item.annotation.tags.has(tag)) {
+ return true;
+ }
+ }
+ }
+ if (this.includeTags.length > 0 && (item.annotation.tags.size > 0 || !isParentIncluded)) {
+ for (let tag of this.includeTags) {
+ if (!item.annotation.tags.has(tag)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
+
+let _sessionInfo: SessionInfo;
+
+export function getSessionInfo(): SessionInfo {
+ return _sessionInfo;
+}
diff --git a/bsc-plugin/src/lib/rooibos/TestCase.ts b/bsc-plugin/src/lib/rooibos/TestCase.ts
new file mode 100644
index 00000000..6ec6e48f
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/TestCase.ts
@@ -0,0 +1,88 @@
+import type { RooibosAnnotation } from './Annotation';
+import { sanitizeBsJsonString } from './Utils';
+
+export class TestCase {
+ constructor(annotation: RooibosAnnotation, name: string, funcName: string, isSolo: boolean, isIgnored: boolean, lineNumber: number,
+ params: any[] = null, paramTestIndex = 0, paramLineNumber = 0, expectedNumberOfParams = 0) {
+ this.annotation = annotation;
+ this.isSolo = isSolo;
+ this.funcName = funcName;
+ this.isIgnored = isIgnored;
+ this.name = name;
+ this.lineNumber = lineNumber;
+ this.paramLineNumber = paramLineNumber;
+ this.assertIndex = 0;
+ this.assertLineNumberMap = {};
+ this.rawParams = params;
+ this.expectedNumberOfParams = expectedNumberOfParams;
+ this.paramTestIndex = paramTestIndex;
+ this.isParamTest = this.expectedNumberOfParams > 0;
+
+ }
+
+ public annotation: RooibosAnnotation;
+ public isIncluded: boolean;
+ public isSolo: boolean;
+ public funcName: string;
+ public isIgnored: boolean;
+ public isParamTest: boolean;
+ public name: string;
+ public lineNumber: number;
+ public paramLineNumber: number;
+ public assertIndex: number;
+ public expectedNumberOfParams: number;
+ public assertLineNumberMap: any;
+ public rawParams: any[];
+ public paramTestIndex: number;
+
+ public asText(): string {
+ let rawParamsText = this.fixBadJson(this.rawParams).replace(/null/g, 'invalid');
+
+ return `
+ {
+ isSolo: ${this.isSolo}
+ noCatch: ${this.annotation.noCatch}
+ funcName: "${this.funcName || ''}"
+ isIgnored: ${this.isIgnored}
+ isParamTest: ${this.isParamTest}
+ name: ${sanitizeBsJsonString(this.name)}
+ lineNumber: ${this.lineNumber + 2}
+ paramLineNumber: ${this.paramLineNumber}
+ assertIndex: ${this.assertIndex}
+ assertLineNumberMap: ${JSON.stringify(this.assertLineNumberMap)}
+ rawParams: ${rawParamsText}
+ paramTestIndex: ${this.paramTestIndex}
+ expectedNumberOfParams: ${this.expectedNumberOfParams}
+ isParamsValid: ${(this.rawParams || []).length === this.expectedNumberOfParams}
+ }`;
+ }
+
+ public addAssertLine(lineNumber: number) {
+ this.assertLineNumberMap[this.assertIndex.toString().trim()] = lineNumber;
+ this.assertIndex++;
+ }
+
+ fixBadJson(o) {
+ // In case of an array we'll stringify all objects.
+ if (Array.isArray(o)) {
+ return `[${
+ o
+ .map(obj => `${this.fixBadJson(obj)}`)
+ .join(',')
+ }]`;
+ }
+ // not an object, stringify using native function
+ if (typeof o !== 'object' || o === null) {
+ return JSON.stringify(o);
+ }
+ return `{${
+ Object
+ .keys(o)
+ .map(key => {
+ return `"${key.replace(/"/g, '')}":${this.fixBadJson(o[key])}`;
+ })
+ .join(',')
+ }}`;
+ }
+
+}
diff --git a/bsc-plugin/src/lib/rooibos/TestGroup.ts b/bsc-plugin/src/lib/rooibos/TestGroup.ts
new file mode 100644
index 00000000..a636e553
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/TestGroup.ts
@@ -0,0 +1,96 @@
+import type { CallExpression } from 'brighterscript';
+import { createVisitor, WalkMode, isDottedGetExpression, isCallExpression } from 'brighterscript';
+import { BrsTranspileState } from 'brighterscript/dist/parser/BrsTranspileState';
+import { TranspileState } from 'brighterscript/dist/parser/TranspileState';
+import { diagnosticErrorProcessingFile } from '../utils/Diagnostics';
+import type { RooibosAnnotation } from './Annotation';
+import { RawCodeStatement } from './RawCodeStatement';
+import type { TestCase } from './TestCase';
+import type { TestSuite } from './TestSuite';
+import { TestBlock } from './TestSuite';
+import { sanitizeBsJsonString } from './Utils';
+
+export class TestGroup extends TestBlock {
+
+ constructor(testSuite: TestSuite, annotation: RooibosAnnotation) {
+ super(annotation);
+ this.testSuite = testSuite;
+ this.setupFunctionName = this.setupFunctionName || this.testSuite.setupFunctionName;
+ this.tearDownFunctionName = this.tearDownFunctionName || this.testSuite.tearDownFunctionName;
+ this.beforeEachFunctionName = this.beforeEachFunctionName || this.testSuite.beforeEachFunctionName;
+ this.afterEachFunctionName = this.afterEachFunctionName || this.testSuite.afterEachFunctionName;
+ }
+
+ public testSuite: TestSuite;
+ public testCases = new Map();
+ public ignoredTestCases: TestCase[] = [];
+ public soloTestCases: TestCase[] = [];
+
+ public addTestCase(testCase: TestCase) {
+
+ this.testCases.set(testCase.name + (testCase.isParamTest ? testCase.paramTestIndex.toString() : ''), testCase);
+
+ if (testCase.isIgnored) {
+ this.ignoredTestCases.push(testCase);
+ this.hasIgnoredTests = true;
+ } else if (testCase.isSolo) {
+ this.hasSoloTests = true;
+ this.soloTestCases.push(testCase);
+ }
+ }
+
+ public getTestCases(): TestCase[] {
+ return [...this.testCases.values()];
+ }
+
+ public modifyAssertions(testCase: TestCase, noEarlyExit: boolean) {
+ //for each method
+ //if assertion
+ //wrap with if is not fail
+ //add line number as last param
+ const transpileState = new BrsTranspileState(this.file);
+ try {
+ let func = this.testSuite.classStatement.methods.find((m) => m.name.text.toLowerCase() === testCase.funcName.toLowerCase());
+ func.walk(createVisitor({
+ ExpressionStatement: (es) => {
+ let ce = es.expression as CallExpression;
+ if (isCallExpression(ce) && isDottedGetExpression(ce.callee)) {
+ let dge = ce.callee;
+ let assertRegex = /(?:fail|assert(?:[a-z0-9]*)|expect(?:[a-z0-9]*))/i;
+ if (dge && assertRegex.test(dge.name.text)) {
+ return new RawCodeStatement(`
+ m.currentAssertLineNumber = ${ce.range.start.line}
+ ${ce.transpile(transpileState).join('')}
+ ${noEarlyExit ? '' : 'if m.currentResult.isFail then return invalid'}
+ `, this.file, ce.range);
+ }
+ }
+ }
+ }), {
+ walkMode: WalkMode.visitStatementsRecursive
+ });
+ } catch (e) {
+ // console.log(e);
+ diagnosticErrorProcessingFile(this.testSuite.file, e.message);
+ }
+ }
+
+ public asText(): string {
+ let testCaseText = [...this.testCases.values()].filter((tc) => tc.isIncluded).map((tc) => tc.asText());
+
+ return `
+ {
+ name: ${sanitizeBsJsonString(this.name)}
+ isSolo: ${this.isSolo}
+ isIgnored: ${this.isIgnored}
+ filename: "${this.pkgPath}"
+ lineNumber: "${this.annotation.annotation.range.start.line}"
+ setupFunctionName: "${this.setupFunctionName || ''}"
+ tearDownFunctionName: "${this.tearDownFunctionName || ''}"
+ beforeEachFunctionName: "${this.beforeEachFunctionName || ''}"
+ afterEachFunctionName: "${this.afterEachFunctionName || ''}"
+ testCases: [${testCaseText.join(',\n')}]
+ }`;
+ }
+
+}
diff --git a/bsc-plugin/src/lib/rooibos/TestSuite.ts b/bsc-plugin/src/lib/rooibos/TestSuite.ts
new file mode 100644
index 00000000..c97c4ed5
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/TestSuite.ts
@@ -0,0 +1,145 @@
+import type { BrsFile, ClassStatement } from 'brighterscript';
+
+import { diagnosticNodeTestIllegalNode, diagnosticNodeTestRequiresNode } from '../utils/Diagnostics';
+
+import type { RooibosAnnotation } from './Annotation';
+
+import type { TestGroup } from './TestGroup';
+import { addOverriddenMethod, sanitizeBsJsonString } from './Utils';
+
+/**
+ * base of test suites and blocks..
+ */
+export class TestBlock {
+ constructor(
+ public annotation: RooibosAnnotation
+ ) {
+ }
+
+ public get file(): BrsFile {
+ return this.annotation.file;
+ }
+ public get pkgPath(): string {
+ return this.file.pkgPath;
+ }
+
+ public get filePath(): string {
+ return this.file.pathAbsolute;
+ }
+
+ public get name(): string {
+ return this.annotation.name;
+ }
+
+ public get isSolo(): boolean {
+ return this.annotation.isSolo;
+ }
+
+ public get isIgnored(): boolean {
+ return this.annotation.isIgnore;
+ }
+
+ public isValid = false;
+ public isIncluded = false;
+
+ public hasFailures = false;
+ public hasSoloTests = false;
+ public hasIgnoredTests = false;
+
+ public setupFunctionName: string;
+ public tearDownFunctionName: string;
+ public beforeEachFunctionName: string;
+ public afterEachFunctionName: string;
+
+}
+
+export class TestSuite extends TestBlock {
+ constructor(annotation: RooibosAnnotation, classStatement: ClassStatement) {
+ super(annotation);
+ this.classStatement = classStatement;
+ this.isNodeTest = annotation.nodeName && annotation.nodeName.trim() !== '';
+ this.nodeName = annotation.nodeName?.trim();
+ if (!this.name) {
+ this.annotation.name = classStatement.name.text;
+ }
+ this.generatedNodeName = (this.name || 'ERROR').replace(/[^a-zA-Z0-9]/g, '_');
+
+ }
+
+ //state
+ public classStatement: ClassStatement;
+ public testGroups = new Map();
+ public nodeName: string;
+ public generatedNodeName: string;
+ public hasSoloGroups = false;
+ public isNodeTest = false;
+
+ public addGroup(group: TestGroup) {
+ this.testGroups.set(group.name, group);
+ if (group.ignoredTestCases.length > 0) {
+ this.hasIgnoredTests = true;
+ }
+ if (group.hasSoloTests) {
+ this.hasSoloTests = true;
+ }
+ if (group.isSolo) {
+ this.hasSoloGroups = true;
+ }
+ this.isValid = true;
+ }
+
+ public addDataFunctions() {
+ if (this.isIncluded) {
+ addOverriddenMethod(this.file, this.annotation.annotation, this.classStatement, 'getTestSuiteData', `return ${this.asText()}`);
+ }
+ }
+
+ public removeCode() {
+ this.classStatement.fields = [];
+ this.classStatement.methods = [];
+ this.classStatement.body = [];
+ this.classStatement.memberMap = {};
+ }
+
+ public getTestGroups(): TestGroup[] {
+ return [...this.testGroups.values()];
+ }
+
+
+ public validate() {
+ if (this.isNodeTest) {
+ if (!this.nodeName) {
+ diagnosticNodeTestRequiresNode(this.file, this.annotation.annotation);
+ } else if (!this.file.program.getComponent(this.nodeName)) {
+ diagnosticNodeTestIllegalNode(this.file, this.annotation.annotation, this.nodeName);
+ }
+ }
+ }
+
+ public asText(): string {
+ let testGroups = this.isIncluded ? [...this.testGroups.values()].filter((testGroup) => testGroup.isIncluded)
+ .map((testGroup) => testGroup.asText()) : '';
+ return `{
+ name: ${sanitizeBsJsonString(this.name)}
+ isSolo: ${this.isSolo}
+ noCatch: ${this.annotation.noCatch}
+ isIgnored: ${this.isIgnored}
+ pkgPath: "${this.pkgPath}"
+ filePath: "${this.filePath}"
+ lineNumber: ${this.classStatement.range.start.line + 1}
+ valid: ${this.isValid}
+ hasFailures: ${this.hasFailures}
+ hasSoloTests: ${this.hasSoloTests}
+ hasIgnoredTests: ${this.hasIgnoredTests}
+ hasSoloGroups: ${this.hasSoloGroups}
+ setupFunctionName: "${this.setupFunctionName || ''}"
+ tearDownFunctionName: "${this.tearDownFunctionName || ''}"
+ beforeEachFunctionName: "${this.beforeEachFunctionName || ''}"
+ afterEachFunctionName: "${this.afterEachFunctionName || ''}"
+ isNodeTest: ${this.isNodeTest || false}
+ nodeName: "${this.nodeName || ''}"
+ generatedNodeName: "${this.generatedNodeName || ''}"
+ testGroups: [${testGroups}]
+ }`;
+ }
+}
diff --git a/bsc-plugin/src/lib/rooibos/TestSuiteBuilder.spec.ts b/bsc-plugin/src/lib/rooibos/TestSuiteBuilder.spec.ts
new file mode 100644
index 00000000..45835b72
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/TestSuiteBuilder.spec.ts
@@ -0,0 +1,1171 @@
+import * as chai from 'chai';
+
+// eslint-disable-next-line
+import { expect } from 'chai';
+
+import { TestSuiteBuilder } from './TestSuiteBuilder';
+import type { TestSuite } from './TestSuite';
+import type { TestCase } from './TestCase';
+import { BrsFile, Program, ProgramBuilder } from 'brighterscript';
+import { RooibosSession } from './RooibosSession';
+import { FileFactory } from './FileFactory';
+import type { TestGroup } from './TestGroup';
+
+// eslint-disable-next-line
+const chaiSubset = require('chai-subset');
+
+chai.use(chaiSubset);
+
+let program: Program;
+let fileFactory: FileFactory;
+let programBuilder: ProgramBuilder;
+let session: RooibosSession;
+let testSuiteBuilder: TestSuiteBuilder;
+
+describe('TestSuiteBuilder tests ', () => {
+
+ beforeEach(() => {
+ program = new Program({});
+ fileFactory = new FileFactory({});
+ programBuilder = new ProgramBuilder();
+ session = new RooibosSession(programBuilder, fileFactory);
+ testSuiteBuilder = new TestSuiteBuilder(session);
+
+ });
+
+ describe('No suites', () => {
+ it('no suite', () => {
+ let testSuite = createTestSuite('test1.bs', `
+ `);
+ expect(testSuite).to.be.null;
+ });
+
+ it('no suite - namespace', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace empty
+ end namespace
+ `);
+ expect(testSuite).to.be.null;
+ });
+
+ it('no suite - namespace with funcs', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace empty
+ function foo()
+ end function
+ end namespace
+ `);
+ expect(testSuite).to.be.null;
+ });
+
+ it('no suite - namespace with class', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace empty
+ class fooClass
+ end class
+ end namespace
+ `);
+ expect(testSuite).to.be.null;
+ });
+
+ it('no suite - class', () => {
+ let testSuite = createTestSuite('test1.bs', `class fooClass
+ end class
+ `);
+ expect(testSuite).to.be.null;
+ });
+ });
+
+ describe('Suite issues', () => {
+
+ it('duplicate suite name - different files', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ let testSuite2 = createTestSuite('test2.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuiteError(testSuite2);
+ expect(ts.isValid).to.be.false;
+ });
+
+ it('duplicate suite name - same file', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+ end class
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuiteError(ts);
+ });
+
+ it('duplicate group', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @describe("group1")
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuiteError(ts);
+ });
+
+ it('duplicate test', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @it("one")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuiteError(ts);
+ });
+
+ });
+
+ describe('Has valid suites', () => {
+ it('class with 1 group, 1 test', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace Tests
+
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group1")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("one")
+ function test_one()
+ end function
+ end class
+end namespace
+ `);
+ assertSuite(testSuite, 1);
+ assertGroupCount(testSuite, 0, 1);
+ });
+ });
+
+ it('class with 1 group 2 tests', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace Tests
+
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group1")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("one")
+ function test_one()
+ end function
+
+ @it("two")
+ function test_two()
+ end function
+end class
+end namespace
+ `);
+ assertSuite(testSuite, 1);
+ assertGroupCount(testSuite, 0, 2);
+ });
+
+ it('class with 2 group, 1 test each', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace Tests
+
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group1")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("one")
+ function test_one()
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group2")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("two")
+ function test_two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(testSuite, 2);
+ assertGroupCount(testSuite, 0, 1);
+ assertGroupCount(testSuite, 1, 1);
+
+ });
+
+ it('class with 2 group, 1 test each - concise syntax', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace Tests
+
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @describe("group2")
+
+ @it("two")
+ function test_two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(testSuite, 2);
+ assertGroupCount(testSuite, 0, 1);
+ assertGroupCount(testSuite, 1, 1);
+
+ });
+
+ it('Valid params', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace Tests
+
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ @describe("group1")
+
+ @it("one")
+ @params(true, "one")
+ function test_one(v1, v2)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(testSuite, 1);
+ assertGroupCount(testSuite, 0, 1);
+ assertParamTestCase(testSuite, 0, 0, 0);
+ });
+
+ it('Valid params 2 params', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace Tests
+
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ @describe("group1")
+
+ @it("one")
+ @params(true, "one")
+ @params(true, "one")
+ function test_one(v1, v2)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(testSuite, 1);
+ assertGroupCount(testSuite, 0, 2);
+ assertParamTestCase(testSuite, 0, 0, 0);
+ assertParamTestCase(testSuite, 0, 1, 1);
+ });
+
+ it('Valid params 5 params', () => {
+ let testSuite = createTestSuite('test1.bs', `namespace Tests
+
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ @describe("group1")
+
+ @it("one")
+ @params(true, "1")
+ @params(true, "2")
+ @params(true, "3")
+ @params(true, "4")
+ @params(true, "5")
+ function test_one(v1, v2)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(testSuite, 1);
+ assertGroupCount(testSuite, 0, 5);
+ assertParamTestCase(testSuite, 0, 0, 0);
+ assertParamTestCase(testSuite, 0, 1, 1);
+ assertParamTestCase(testSuite, 0, 2, 2);
+ assertParamTestCase(testSuite, 0, 3, 3);
+ assertParamTestCase(testSuite, 0, 4, 4);
+ });
+ describe('only tags', () => {
+ it('only suite', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @only
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.true;
+ expect(getGroup(ts, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.false;
+ expect(ts.hasSoloTests).to.be.false;
+ expect(ts.hasSoloGroups).to.be.false;
+
+ });
+ it('only group', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @only
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.false;
+ expect(getGroup(ts, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.false;
+ expect(ts.hasSoloTests).to.be.false;
+ expect(ts.hasSoloGroups).to.be.true;
+
+ });
+ it('only test', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @only
+ @it("one")
+ function test_one()
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.false;
+ expect(getGroup(ts, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.false;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.false;
+
+ });
+ it('two tests', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @only
+ @it("one")
+ function test_one()
+ end function
+
+ @only
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.false;
+ expect(getGroup(ts, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.true;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.false;
+ });
+ it('two tests and group', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @only
+ @describe("group1")
+
+ @only
+ @it("one")
+ function test_one()
+ end function
+
+ @only
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.false;
+ expect(getGroup(ts, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.true;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.true;
+ });
+ it('all', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @only
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @only
+ @describe("group1")
+
+ @only
+ @it("one")
+ function test_one()
+ end function
+
+ @only
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.true;
+ expect(getGroup(ts, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.true;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.true;
+ });
+ it('two groups', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @only
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @only
+ @describe("group1")
+
+ @only
+ @it("one")
+ function test_one()
+ end function
+
+ @only
+ @it("two")
+ function test_Two()
+ end function
+ @describe("group2")
+
+ @it("one")
+ function test_g2_one()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 2);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.true;
+ expect(getGroup(ts, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.true;
+ assertGroupCount(ts, 1, 1);
+ expect(getGroup(ts, 1).isSolo).to.be.false;
+ expect(getTestCase(ts, 1, 0).isSolo).to.be.false;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.true;
+ });
+ it('mixup', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @only
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @only
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @only
+ @it("two")
+ function test_Two()
+ end function
+ @describe("group2")
+
+ @only
+ @it("one")
+ function test_g2_one()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 2);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isSolo).to.be.true;
+ expect(getGroup(ts, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.true;
+ assertGroupCount(ts, 1, 1);
+ expect(getGroup(ts, 1).isSolo).to.be.false;
+ expect(getTestCase(ts, 1, 0).isSolo).to.be.true;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.true;
+ });
+ it('only on param block', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @Only
+ @it("one")
+ @params("1")
+ @params("2")
+ @params("3")
+ function test_one(value)
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 4);
+ expect(ts.isSolo).to.be.false;
+ expect(getGroup(ts, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 2).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 3).isSolo).to.be.false;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.false;
+
+ });
+
+ it('onlyparams', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("1")
+ @onlyParams("2")
+ @params("3")
+ function test_one(value)
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 4);
+ expect(ts.isSolo).to.be.false;
+ expect(getGroup(ts, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 2).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 3).isSolo).to.be.false;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.false;
+
+ });
+
+ it('onlyparams 2', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @onlyParams("1")
+ @params("2")
+ @onlyParams("3")
+ function test_one(value)
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 4);
+ expect(ts.isSolo).to.be.false;
+ expect(getGroup(ts, 0).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 0).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 1).isSolo).to.be.false;
+ expect(getTestCase(ts, 0, 2).isSolo).to.be.true;
+ expect(getTestCase(ts, 0, 3).isSolo).to.be.false;
+ expect(ts.hasSoloTests).to.be.true;
+ expect(ts.hasSoloGroups).to.be.false;
+
+ });
+
+ });
+
+ describe('ignore tags', () => {
+ it('ignore suite', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @ignore
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.true;
+ expect(getGroup(ts, 0).isIgnored).to.be.false;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.false;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.false;
+ expect(ts.hasIgnoredTests).to.be.false;
+
+ });
+ it('ignore group', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @ignore
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.false;
+ expect(getGroup(ts, 0).isIgnored).to.be.true;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.false;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.false;
+ expect(ts.hasIgnoredTests).to.be.false;
+ });
+ it('ignore test', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @ignore
+ @it("one")
+ function test_one()
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.false;
+ expect(getGroup(ts, 0).isIgnored).to.be.false;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.false;
+ expect(ts.hasIgnoredTests).to.be.true;
+
+ });
+ it('two tests', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @ignore
+ @it("one")
+ function test_one()
+ end function
+
+ @ignore
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.false;
+ expect(getGroup(ts, 0).isIgnored).to.be.false;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.true;
+ expect(ts.hasIgnoredTests).to.be.true;
+ });
+ it('two tests and group', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @ignore
+ @describe("group1")
+
+ @ignore
+ @it("one")
+ function test_one()
+ end function
+
+ @ignore
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.false;
+ expect(getGroup(ts, 0).isIgnored).to.be.true;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.true;
+ expect(ts.hasIgnoredTests).to.be.true;
+ });
+ it('all', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @ignore
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @ignore
+ @describe("group1")
+
+ @ignore
+ @it("one")
+ function test_one()
+ end function
+
+ @ignore
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.true;
+ expect(getGroup(ts, 0).isIgnored).to.be.true;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.true;
+ expect(ts.hasIgnoredTests).to.be.true;
+ expect(ts.hasIgnoredTests).to.be.true;
+ });
+ it('two groups', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @ignore
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @ignore
+ @describe("group1")
+
+ @ignore
+ @it("one")
+ function test_one()
+ end function
+
+ @ignore
+ @it("two")
+ function test_Two()
+ end function
+ @describe("group2")
+
+ @it("one")
+ function test_g2_one()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 2);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.true;
+ expect(getGroup(ts, 0).isIgnored).to.be.true;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.true;
+ assertGroupCount(ts, 1, 1);
+ expect(getGroup(ts, 1).isIgnored).to.be.false;
+ expect(getGroup(ts, 1).hasIgnoredTests).to.be.false;
+ expect(getTestCase(ts, 1, 0).isIgnored).to.be.false;
+ expect(ts.hasIgnoredTests).to.be.true;
+ expect(ts.hasIgnoredTests).to.be.true;
+ });
+ it('mixup', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @ignore
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @ignore
+ @describe("group1")
+
+ @it("one")
+ function test_one()
+ end function
+
+ @ignore
+ @it("two")
+ function test_Two()
+ end function
+ @describe("group2")
+
+ @ignore
+ @it("one")
+ function test_g2_one()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 2);
+ assertGroupCount(ts, 0, 2);
+ expect(ts.isIgnored).to.be.true;
+ expect(getGroup(ts, 0).isIgnored).to.be.true;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.false;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.true;
+ assertGroupCount(ts, 1, 1);
+ expect(getGroup(ts, 1).hasIgnoredTests).to.be.true;
+ expect(getGroup(ts, 1).isIgnored).to.be.false;
+ expect(getTestCase(ts, 1, 0).isIgnored).to.be.true;
+ expect(ts.hasIgnoredTests).to.be.true;
+ expect(ts.hasIgnoredTests).to.be.true;
+ });
+ it('ignore on param block', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @ignore
+ @it("one")
+ @params("1")
+ @params("2")
+ @params("3")
+ function test_one(value)
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 4);
+ expect(ts.isIgnored).to.be.false;
+ expect(getGroup(ts, 0).isIgnored).to.be.false;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 2).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 3).isIgnored).to.be.false;
+ expect(ts.hasIgnoredTests).to.be.true;
+
+ });
+
+ it('ignoreParams', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("1")
+ @ignoreParams("2")
+ @params("3")
+ function test_one(value)
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 4);
+ expect(ts.isIgnored).to.be.false;
+ expect(getGroup(ts, 0).isIgnored).to.be.false;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.false;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 2).isIgnored).to.be.false;
+ expect(getTestCase(ts, 0, 3).isIgnored).to.be.false;
+ expect(ts.hasIgnoredTests).to.be.true;
+
+ });
+
+ it('ignoreParams 2', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @ignoreParams("1")
+ @params("2")
+ @ignoreParams("3")
+ function test_one(value)
+ end function
+
+ @it("two")
+ function test_Two()
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 4);
+ expect(ts.isIgnored).to.be.false;
+ expect(getGroup(ts, 0).isIgnored).to.be.false;
+ expect(getGroup(ts, 0).hasIgnoredTests).to.be.true;
+ expect(getTestCase(ts, 0, 0).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 1).isIgnored).to.be.false;
+ expect(getTestCase(ts, 0, 2).isIgnored).to.be.true;
+ expect(getTestCase(ts, 0, 3).isIgnored).to.be.false;
+ expect(ts.hasIgnoredTests).to.be.true;
+
+ });
+ });
+
+ describe('params', () => {
+
+ it('simple params', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("1")
+ @params("2")
+ @params("3")
+ function test_one(value)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 3);
+ });
+
+ it('2 params', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("1", true)
+ @params("2", false)
+ @params("3", true)
+ function test_one(value, arg2)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 3);
+ });
+ });
+
+ it('2 with url and chars', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("http://google.com/thing", true)
+ @params("#'_!!@#%", false)
+ @params("3", true)
+ function test_one(value, arg2)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuite(ts, 1);
+ assertGroupCount(ts, 0, 3);
+ });
+
+ it('param mismatch -one', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("http://google.com/thing")
+ @params("#'_!!@#%", false)
+ @params("3", true)
+ function test_one(value, arg2)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuiteError(ts);
+ });
+
+ it('param mismatch -all', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("http://google.com/thing", true)
+ @params("#'_!!@#%", false)
+ @params("3", true)
+ function test_one(value)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuiteError(ts);
+ });
+
+ it('cannot parse', () => {
+ let ts = createTestSuite('test1.bs', `namespace Tests
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+ @describe("group1")
+
+ @it("one")
+ @params("http://google.com/thing", true ")
+ @params("#'_!!@#%", false)
+ @params("3", true)
+ function test_one(value, value)
+ end function
+ end class
+ end namespace
+ `);
+ assertSuiteError(ts);
+ });
+});
+
+function assertSuite(testSuite: TestSuite, expectedGroups: number) {
+ expect(testSuite).to.not.be.null;
+ expect(testSuite.isValid).to.be.true;
+ expect(testSuite.getTestGroups()).to.have.lengthOf(expectedGroups);
+}
+
+function assertSuiteError(testSuite: TestSuite) {
+ expect(testSuite).to.not.be.null;
+ expect(testSuite.isValid).to.be.false;
+}
+
+function assertGroupCount(testSuite: TestSuite, groupIndex: number, expectedTests: number) {
+ expect(testSuite.getTestGroups()[groupIndex].getTestCases()).to.have.lengthOf(expectedTests);
+}
+
+function getTestCase(testSuite: TestSuite, groupIndex: number, testIndex: number): TestCase {
+ let group = testSuite.getTestGroups()[groupIndex];
+ return group.getTestCases()[testIndex];
+}
+
+function getGroup(testSuite: TestSuite, groupIndex: number): TestGroup {
+ return testSuite.getTestGroups()[groupIndex];
+}
+
+function assertParamTestCase(testSuite: TestSuite, groupIndex: number, testIndex: number, paramIndex = 0) {
+ let testCase = getTestCase(testSuite, groupIndex, testIndex);
+ expect(testCase.isParamTest).to.be.true;
+ expect(testCase.paramTestIndex).to.equal(paramIndex);
+}
+
+function createTestSuite(path: string, text: string): TestSuite {
+ let file = new BrsFile(path, path, program);
+ file.parse(text);
+ let testSuites = testSuiteBuilder.processFile(file);
+ return testSuites.length > 0 ? testSuites[0] : null;
+}
diff --git a/bsc-plugin/src/lib/rooibos/TestSuiteBuilder.ts b/bsc-plugin/src/lib/rooibos/TestSuiteBuilder.ts
new file mode 100644
index 00000000..36581c8d
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/TestSuiteBuilder.ts
@@ -0,0 +1,228 @@
+
+import type { BrsFile,
+ ClassMethodStatement,
+ ClassStatement } from 'brighterscript';
+import {
+ isClassMethodStatement
+} from 'brighterscript';
+
+import { TestGroup } from './TestGroup';
+
+import { RooibosAnnotation, AnnotationType } from './Annotation';
+
+import { TestCase } from './TestCase';
+import { TestSuite } from './TestSuite';
+
+import {
+ diagnosticDuplicateSuite,
+ diagnosticErrorProcessingFile,
+ diagnosticGroupWithNameAlreadyDefined,
+ // diagnosticIncompatibleAnnotation,
+ diagnosticNoGroup,
+ diagnosticTestWithNameAlreadyDefined,
+ diagnosticWrongAnnotation,
+ diagnosticWrongParameterCount,
+ diagnosticWrongTestParameterCount,
+ diagnosticEmptyGroup,
+ diagnosticTestWithArgsButNoParams
+} from '../utils/Diagnostics';
+import type { RooibosSession } from './RooibosSession';
+
+export class TestSuiteBuilder {
+ constructor(public session: RooibosSession) {
+ }
+
+ //state
+ private currentGroup?: TestGroup;
+ private annotation?: RooibosAnnotation;
+ private testSuite: TestSuite;
+ private file: BrsFile;
+
+ public processFile(file: BrsFile): TestSuite[] {
+ this.file = file;
+ let suites = [];
+ try {
+ for (let cs of file.parser.references.classStatements) {
+
+ //a test is comprised of a comment block; followed by a class
+ let annotation = RooibosAnnotation.getAnnotation(file, cs)?.blockAnnotation;
+
+ if (annotation) {
+ if (annotation.annotationType === AnnotationType.TestSuite) {
+ this.addSuiteIfValid(file, annotation, cs, suites);
+ } else {
+ diagnosticWrongAnnotation(file, cs, 'Expected a TestSuite annotation, got: ' + annotation.annotationType);
+ throw new Error('bad test suite');
+ }
+ }
+ }
+ } catch (e) {
+ // console.log(e);
+ diagnosticErrorProcessingFile(file, e.message);
+ }
+ this.session.sessionInfo.updateTestSuites(suites);
+ return suites;
+ }
+
+ public addSuiteIfValid(file: BrsFile, annotation: RooibosAnnotation, s: ClassStatement, suites: TestSuite[]) {
+ let oldSuite = this.session.sessionInfo.testSuites.get(annotation.name);
+ let suite = this.processClass(annotation, s);
+ let isDuplicate = false;
+ if ((oldSuite && oldSuite.file.pathAbsolute !==
+ file.pathAbsolute)) {
+ oldSuite.isValid = false;
+ suite.isValid = false;
+ diagnosticDuplicateSuite(file, oldSuite.classStatement, oldSuite.annotation);
+ isDuplicate = true;
+ }
+
+ let duplicateSuites = suites.filter((s) => s.name === suite.name);
+ if (duplicateSuites.length > 0) {
+ for (let duplicateSuite of duplicateSuites) {
+ duplicateSuite.isValid = false;
+ diagnosticDuplicateSuite(file, duplicateSuite.classStatement, duplicateSuite.annotation);
+ }
+ suite.isValid = false;
+ isDuplicate = true;
+ }
+
+ suites.push(suite);
+ if (isDuplicate) {
+ diagnosticDuplicateSuite(file, suite.classStatement, suite.annotation);
+ }
+ }
+
+ public processClass(annotation: RooibosAnnotation, classStatement: ClassStatement): TestSuite {
+ this.testSuite = new TestSuite(annotation, classStatement);
+ this.currentGroup = null;
+ this.annotation = null;
+ for (let s of classStatement.body) {
+ let { blockAnnotation, testAnnotation } = RooibosAnnotation.getAnnotation(this.file, s);
+ if (blockAnnotation) {
+ if (this.annotation) {
+ diagnosticNoGroup(this.file, s, this.annotation.annotationType);
+ }
+ if (this.currentGroup) {
+ this.testSuite.addGroup(this.currentGroup);
+ if (this.currentGroup.testCases.size === 0) {
+ diagnosticEmptyGroup(this.file, this.currentGroup.annotation);
+ }
+ }
+ if (!this.createGroup(blockAnnotation)) {
+ this.currentGroup = null;
+ break;
+ }
+ }
+ this.annotation = testAnnotation;
+
+ if (isClassMethodStatement(s)) {
+ this.processClassMethod(s);
+ }
+ this.annotation = null;
+ }
+
+ if (this.currentGroup) {
+ this.testSuite.addGroup(this.currentGroup);
+ }
+ this.testSuite.isValid = this.testSuite.file.getDiagnostics().length === 0;
+ return this.testSuite;
+ }
+
+ public createGroup(blockAnnotation: RooibosAnnotation): boolean {
+ if (!this.testSuite.testGroups.has(blockAnnotation.name)) {
+ this.currentGroup = new TestGroup(this.testSuite, blockAnnotation);
+ return true;
+ } else {
+ diagnosticGroupWithNameAlreadyDefined(this.file, blockAnnotation);
+ diagnosticGroupWithNameAlreadyDefined(this.file, this.testSuite.testGroups.get(blockAnnotation.name).annotation);
+ return false;
+ }
+ }
+
+ public processClassMethod(statement: ClassMethodStatement) {
+
+ if (this.annotation) {
+ if (!this.currentGroup) {
+ diagnosticNoGroup(this.file, statement, this.annotation.annotationType);
+ }
+ switch (this.annotation.annotationType) {
+ case AnnotationType.It:
+ this.createTestCases(statement, this.annotation);
+ break;
+ case AnnotationType.Setup:
+ this.currentGroup.setupFunctionName = statement.name.text;
+ if (statement.func.parameters.length > 0) {
+ diagnosticWrongParameterCount(this.file, statement, 0);
+ }
+ break;
+ case AnnotationType.TearDown:
+ this.currentGroup.tearDownFunctionName = statement.name.text;
+ if (statement.func.parameters.length > 0) {
+ diagnosticWrongParameterCount(this.file, statement, 0);
+ }
+ break;
+ case AnnotationType.BeforeEach:
+ this.currentGroup.beforeEachFunctionName = statement.name.text;
+ if (statement.func.parameters.length > 0) {
+ diagnosticWrongParameterCount(this.file, statement, 0);
+ }
+ break;
+ case AnnotationType.AfterEach:
+ this.currentGroup.afterEachFunctionName = statement.name.text;
+ if (statement.func.parameters.length > 0) {
+ diagnosticWrongParameterCount(this.file, statement, 0);
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ private sanitizeFunctionName(name: string) {
+ return name.replace(/[^0-9_a-z]/ig, '_');
+ }
+ public createTestCases(statement: ClassMethodStatement, annotation: RooibosAnnotation): boolean {
+ const lineNumber = statement.func.range.start.line;
+ const numberOfArgs = statement.func.parameters.length;
+ const numberOfParams = annotation.params.length;
+ if (this.currentGroup.testCases.has(annotation.name) || this.currentGroup.testCases.get(annotation.name + '0')?.paramLineNumber) {
+ diagnosticTestWithNameAlreadyDefined(annotation);
+
+ return false;
+ }
+
+ let sanitizedTestName = this.sanitizeFunctionName(this.currentGroup.name) + '_' + this.sanitizeFunctionName(annotation.name);
+ statement.name.text = sanitizedTestName;
+ statement.func.functionStatement.name.text = sanitizedTestName;
+
+ if (numberOfParams > 0) {
+ let index = 0;
+ for (const param of annotation.params) {
+ if (param.params.length === numberOfArgs) {
+ let isSolo = annotation.hasSoloParams ? param.isSolo : annotation.isSolo;
+ let isIgnore = annotation.isIgnore ? true : param.isIgnore;
+ this.currentGroup.addTestCase(
+ new TestCase(annotation, annotation.name, statement.name.text, isSolo, isIgnore, lineNumber, param.params, index, param.lineNumber, numberOfArgs)
+ );
+ } else {
+ diagnosticWrongTestParameterCount(this.file, param.annotation, param.params.length, numberOfArgs);
+ }
+ index++;
+ }
+ return true;
+
+ } else if (numberOfParams === 0) {
+ if (numberOfArgs === 0) {
+ this.currentGroup.addTestCase(
+ new TestCase(annotation, annotation.name, statement.name.text, annotation.isSolo, annotation.isIgnore, lineNumber)
+ );
+ } else {
+ diagnosticTestWithArgsButNoParams(this.file, annotation.annotation, numberOfArgs);
+ }
+ return true;
+ } else {
+ diagnosticWrongParameterCount(this.file, statement, 0);
+ }
+ }
+}
diff --git a/bsc-plugin/src/lib/rooibos/Utils.ts b/bsc-plugin/src/lib/rooibos/Utils.ts
new file mode 100644
index 00000000..4dd24e77
--- /dev/null
+++ b/bsc-plugin/src/lib/rooibos/Utils.ts
@@ -0,0 +1,180 @@
+import type { BrsFile, ClassStatement, Expression, FunctionStatement, Statement, AnnotationExpression } from 'brighterscript';
+import { BinaryExpression, Block, createIdentifier, createStringLiteral, createToken, isClassMethodStatement, Lexer, ParseMode, Parser, TokenKind, Range, IfStatement, ClassMethodStatement } from 'brighterscript';
+
+import * as rokuDeploy from 'roku-deploy';
+import { diagnosticCorruptTestProduced } from '../utils/Diagnostics';
+
+export function spliceString(str: string, index: number, count: number, add: string): string {
+ // We cannot pass negative indexes directly to the 2nd slicing operation.
+ if (index < 0) {
+ index = str.length + index;
+ if (index < 0) {
+ index = 0;
+ }
+ }
+
+ return str.slice(0, index) + (add || '') + str.slice(index + count);
+}
+
+export function getRegexMatchesValues(input, regex, groupIndex): any[] {
+ let values = [];
+ let matches: any[];
+ // eslint-disable-next-line
+ while (matches = regex.exec(input)) {
+ values.push(matches[groupIndex]);
+ }
+ return values;
+}
+export function getRegexMatchValue(input, regex, groupIndex): string {
+ let matches: any[];
+ // eslint-disable-next-line
+ while (matches = regex.exec(input)) {
+ if (matches.length > groupIndex) {
+ return matches[groupIndex];
+ }
+ }
+ return null;
+}
+
+export function addSetItems(setA, setB) {
+ for (const elem of setB) {
+ setA.add(elem);
+ }
+}
+
+export function pad(pad: string, str: string, padLeft: number): string {
+ if (typeof str === 'undefined') {
+ return pad;
+ }
+ if (padLeft) {
+ return (pad + str).slice(-pad.length);
+ } else {
+ return (str + pad).substring(0, pad.length);
+ }
+}
+
+export function makeASTFunction(source: string): FunctionStatement | undefined {
+ let tokens = Lexer.scan(source).tokens;
+ let { statements } = Parser.parse(tokens, { mode: ParseMode.BrighterScript });
+ if (statements && statements.length > 0) {
+ return statements[0] as FunctionStatement;
+ }
+ return undefined;
+}
+
+export function getFunctionBody(source: string): Statement[] {
+ let funcStatement = makeASTFunction(source);
+ return funcStatement ? funcStatement.func.body.statements : [];
+}
+
+export function changeFunctionBody(statement: ClassMethodStatement | FunctionStatement, source: Statement[] | string) {
+ let statements = statement.func.body.statements;
+ statements.splice(0, statements.length);
+ let newStatements = (typeof source === 'string') ? getFunctionBody(source) : source;
+ for (let newStatement of newStatements) {
+ statements.push(newStatement);
+ }
+}
+
+export function addOverriddenMethod(file: BrsFile, annotation: AnnotationExpression, target: ClassStatement, name: string, source: string): boolean {
+ let funcSource = `
+ function ${name}()
+ ${source}
+ end function
+ `;
+
+ let tokens = Lexer.scan(funcSource).tokens;
+ let { statements, diagnostics } = Parser.parse(tokens, { mode: ParseMode.BrighterScript });
+ let error = '';
+ if (statements && statements.length > 0) {
+ let statement = statements[0] as FunctionStatement;
+ if (statement.func.body.statements.length > 0) {
+ let p = createToken(TokenKind.Public, 'public', target.range);
+ let o = createToken(TokenKind.Override, 'override', target.range);
+ let n = createIdentifier(name, target.range).name;
+ let cms = new ClassMethodStatement(p, n, statement.func, o);
+ target.body.push(cms);
+ return true;
+ }
+
+ }
+ error = diagnostics?.length > 0 ? diagnostics[0].message : 'unknown error';
+ diagnosticCorruptTestProduced(file, annotation, error, funcSource);
+ return false;
+}
+
+export function changeClassMethodBody(target: ClassStatement, name: string, source: Statement[] | string): boolean {
+ let method = target.methods.find((m) => m.name.text === name);
+ if (isClassMethodStatement(method)) {
+ changeFunctionBody(method, source);
+ return true;
+ }
+ return false;
+}
+
+export function sanitizeBsJsonString(text: string) {
+ return `"${text ? text.replace(/"/g, '\'') : ''}"`;
+}
+
+export function createIfStatement(condition: Expression, statements: Statement[]): IfStatement {
+ let ifToken = createToken(TokenKind.If, 'if', Range.create(1, 1, 1, 999999));
+ let thenBranch = new Block(statements, Range.create(1, 1, 1, 1));
+ return new IfStatement({ if: ifToken, then: createToken(TokenKind.Then, '', Range.create(1, 1, 1, 999999)) }, condition, thenBranch);
+}
+
+export function createVarExpression(varName: string, operator: TokenKind, value: string): BinaryExpression {
+ let variable = createIdentifier(varName, Range.create(1, 1, 1, 999999));
+ let v = createStringLiteral(value, Range.create(1, 1, 1, 999999));
+
+ let t = createToken(operator, getTokenText(operator), Range.create(1, 1, 1, 999999));
+ return new BinaryExpression(variable, t, v);
+}
+
+export function getTokenText(operator: TokenKind): string {
+ switch (operator) {
+ case TokenKind.Equal:
+ return '=';
+ case TokenKind.Plus:
+ return '+';
+ case TokenKind.Minus:
+ return '-';
+ case TokenKind.Less:
+ return '<';
+ case TokenKind.Greater:
+ return '>';
+ default:
+ return '';
+ }
+}
+
+/**
+ * A tagged template literal function for standardizing the path. This has to be defined as standalone function since it's a tagged template literal function,
+ * we can't use `object.tag` syntax.
+ */
+export function standardizePath(stringParts, ...expressions: any[]) {
+ let result = [];
+ for (let i = 0; i < stringParts.length; i++) {
+ result.push(stringParts[i], expressions[i]);
+ }
+ return driveLetterToLower(
+ rokuDeploy.standardizePath(
+ result.join('')
+ )
+ );
+}
+
+function driveLetterToLower(fullPath: string) {
+ if (fullPath) {
+ let firstCharCode = fullPath.charCodeAt(0);
+ if (
+ //is upper case A-Z
+ firstCharCode >= 65 && firstCharCode <= 90 &&
+ //next char is colon
+ fullPath[1] === ':'
+ ) {
+ fullPath = fullPath[0].toLowerCase() + fullPath.substring(1);
+ }
+ }
+ return fullPath;
+
+}
diff --git a/bsc-plugin/src/lib/utils/Diagnostics.ts b/bsc-plugin/src/lib/utils/Diagnostics.ts
new file mode 100644
index 00000000..f51e718b
--- /dev/null
+++ b/bsc-plugin/src/lib/utils/Diagnostics.ts
@@ -0,0 +1,256 @@
+import type { BrsFile, ClassStatement, FunctionStatement, Statement, BscFile, AnnotationExpression } from 'brighterscript';
+import { DiagnosticSeverity, Range } from 'brighterscript';
+
+import type { AnnotationType, RooibosAnnotation } from '../rooibos/Annotation';
+
+function addDiagnostic(
+ file: BscFile,
+ code: number,
+ message: string,
+ startLine = 0,
+ startCol = 0,
+ endLine = -1,
+ endCol = 99999,
+ severity: DiagnosticSeverity = DiagnosticSeverity.Error
+) {
+ endLine = endLine === -1 ? startLine : endLine;
+ file.addDiagnostics([createDiagnostic(file, code, message, startLine, startCol, endLine, endCol, severity)]);
+}
+
+function addDiagnosticForStatement(
+ file: BrsFile,
+ code: number,
+ message: string,
+ statement: Statement,
+ severity: DiagnosticSeverity = DiagnosticSeverity.Error
+) {
+ let line = statement.range.start.line;
+ let col = statement.range.start.character;
+ file.addDiagnostics([createDiagnostic(file, code, message, line, col, line, 999999, severity)]);
+}
+
+function addDiagnosticForAnnotation(
+ file: BscFile,
+ code: number,
+ message: string,
+ annotation: AnnotationExpression,
+ severity: DiagnosticSeverity = DiagnosticSeverity.Error,
+ endChar?: number
+) {
+ let line = annotation.range.start.line;
+ let col = annotation.range.start.character;
+
+ file.addDiagnostics([createDiagnostic(file, code, message, line, col, annotation.range.end.line, annotation.range.end.character + 9999, severity)]);
+}
+
+function createDiagnostic(
+ bscFile: BscFile,
+ code: number,
+ message: string,
+ startLine = 0,
+ startCol = 99999,
+ endLine = 0,
+ endCol = 99999,
+ severity: DiagnosticSeverity = DiagnosticSeverity.Error
+) {
+ const diagnostic = {
+ code: `RBS${code}`,
+ message: message,
+ range: Range.create(startLine, startCol, endLine, endCol),
+ file: bscFile,
+ severity: severity
+ };
+ return diagnostic;
+}
+
+/**
+ * Public methods
+ */
+
+export function diagnosticWrongAnnotation(file: BrsFile, statement: Statement, message: string) {
+ addDiagnosticForStatement(
+ file,
+ 2200,
+ 'Wrong kind of annotation.' + message,
+ statement
+ );
+}
+
+export function diagnosticNoGroup(file: BrsFile, statement: Statement, annotationType: AnnotationType) {
+ addDiagnosticForStatement(
+ file,
+ 2201,
+ `Cannot process ${annotationType} of a test group`,
+ statement
+ );
+}
+
+export function diagnosticWrongParameterCount(file: BrsFile, statement: FunctionStatement, expectedParamCount = 0) {
+ addDiagnosticForStatement(
+ file,
+ 2202,
+ `Function ${statement.name} defined with wrong number of params: expected ${expectedParamCount}`,
+ statement
+ );
+}
+
+export function diagnosticDuplicateSuite(file: BrsFile, statement: ClassStatement, annotation: RooibosAnnotation) {
+ addDiagnosticForStatement(
+ file,
+ 2203,
+ `Test suite already declared with name: ${annotation.name}. This test suite will be skipped.`,
+ statement
+ );
+}
+
+export function diagnosticTestAnnotationOutsideOfGroup(file: BrsFile, statement: ClassStatement, annotation: RooibosAnnotation) {
+ addDiagnosticForStatement(
+ file,
+ 2204,
+ `Found Group, when a test function was expected`,
+ statement
+ );
+}
+
+export function diagnosticIllegalParams(file: BrsFile, annotation: AnnotationExpression) {
+ addDiagnosticForAnnotation(
+ file,
+ 2205,
+ `Could not parse params for test.`,
+ annotation
+ );
+}
+
+export function diagnosticWrongTestParameterCount(file: BrsFile, annotation: AnnotationExpression, gotCount = 0, expectedParamCount = 0) {
+ addDiagnosticForAnnotation(
+ file,
+ 2206,
+ `Params for test do not match arg count on method. Got ${gotCount} expected ${expectedParamCount}`,
+ annotation
+ );
+}
+
+export function diagnosticNodeTestRequiresNode(file: BrsFile, annotation: AnnotationExpression) {
+ addDiagnosticForAnnotation(
+ file,
+ 2207,
+ `Node name must be declared for a node test. This is the component that the generated test will extend.`,
+ annotation
+ );
+}
+
+export function diagnosticNodeTestIllegalNode(file: BrsFile, annotation: AnnotationExpression, nodeName: string) {
+ addDiagnosticForAnnotation(
+ file,
+ 2208,
+ `Component ${nodeName}, is not found in this project. Node tests generate a new component that extends the component you wish to test. Please make sure that component exists and compiles.`,
+ annotation
+ );
+}
+
+export function diagnosticGroupWithNameAlreadyDefined(file: BrsFile, annotation: RooibosAnnotation) {
+ addDiagnosticForAnnotation(
+ file,
+ 2209,
+ `Test group with name ${annotation.name}, is already declared in this suite. Ignoring`,
+ annotation.annotation
+ );
+}
+
+export function diagnosticTestWithNameAlreadyDefined(annotation: RooibosAnnotation) {
+ addDiagnosticForAnnotation(
+ annotation.file,
+ 2210,
+ `Test with name ${annotation.name}, is already declared in this group. Ignoring`,
+ annotation.annotation
+ );
+}
+
+export function diagnosticIncompatibleAnnotation(annotation: RooibosAnnotation) {
+ addDiagnosticForAnnotation(
+ annotation.file,
+ 2211,
+ `Was expecting a function, got a test annotation`,
+ annotation.annotation
+ );
+}
+
+export function diagnosticErrorProcessingFile(file: BrsFile, message: string) {
+ addDiagnostic(
+ file,
+ 2212,
+ `General error : ` + message
+ );
+}
+
+export function diagnosticErrorNoMainFound(file: BscFile) {
+ addDiagnostic(
+ file,
+ 2213,
+ `Could not find main function to inject rooibos launch code. Rooibos has added one for you`, 1, 1, 1, 1, DiagnosticSeverity.Warning
+ );
+}
+
+export function diagnosticEmptyGroup(file: BrsFile, annotation: RooibosAnnotation) {
+ addDiagnosticForAnnotation(
+ file,
+ 2214,
+ `Test group with name ${annotation.name}, empty.`,
+ annotation.annotation
+ );
+}
+
+export function diagnosticNoTestFunctionDefined(file: BrsFile, annotation: RooibosAnnotation) {
+ addDiagnosticForAnnotation(
+ file,
+ 2215,
+ `Multiple test annotations per function are not allowed. ${annotation.name || ''}`,
+ annotation.annotation
+ );
+}
+
+export function diagnosticTestWithArgsButNoParams(file: BrsFile, annotation: AnnotationExpression, gotCount = 0) {
+ addDiagnosticForAnnotation(
+ file,
+ 2216,
+ `Test method signature has arguments; but test has no paremeters. Got ${gotCount} args: expected 0. Did you forget your @params annotations?`,
+ annotation
+ );
+}
+
+
+export function diagnosticNoTestNameDefined(file: BrsFile, annotation: AnnotationExpression) {
+ addDiagnosticForAnnotation(
+ file,
+ 2217,
+ `It annotation requires a name `,
+ annotation
+ );
+}
+
+export function diagnosticMultipleDescribeAnnotations(file: BrsFile, annotation: AnnotationExpression) {
+ addDiagnosticForAnnotation(
+ file,
+ 2218,
+ `Found multiple @describe annotations. Did you forget to write some tests?`,
+ annotation
+ );
+}
+
+export function diagnosticMultipleTestOnFunctionDefined(file: BrsFile, annotation: AnnotationExpression) {
+ addDiagnosticForAnnotation(
+ file,
+ 2219,
+ `Found multiple @it annotations. Did you forget to write some tests?`,
+ annotation
+ );
+}
+
+export function diagnosticCorruptTestProduced(file: BrsFile, annotation: AnnotationExpression, error: string, source: string) {
+ addDiagnosticForAnnotation(
+ file,
+ 2220,
+ `The test resulted in a corrupt data file. This is typically because one of the param tests resulted in a failed transpilation. Please raise an issue with as much of your test file as possible to reproduce the issue.\n ${error} \n ${source} `,
+ annotation
+ );
+}
diff --git a/bsc-plugin/src/lib/utils/testHelpers.spec.ts b/bsc-plugin/src/lib/utils/testHelpers.spec.ts
new file mode 100644
index 00000000..09571af8
--- /dev/null
+++ b/bsc-plugin/src/lib/utils/testHelpers.spec.ts
@@ -0,0 +1,22 @@
+
+/**
+ * Trim leading whitespace for every line (to make test writing cleaner
+ */
+export function trimLeading(text: string) {
+ if (!text) {
+ return text;
+ }
+ const lines = text.split(/\r?\n/);
+
+ //skip leading empty lines
+ while (lines[0]?.trim().length === 0) {
+ lines.splice(0, 1);
+ }
+
+ for (let i = 0; i < lines.length; i++) {
+ lines[i] = lines[i].trimLeft();
+ }
+
+ //apply the trim to each line
+ return lines.join('\n');
+}
diff --git a/bsc-plugin/src/plugin.spec.ts b/bsc-plugin/src/plugin.spec.ts
new file mode 100644
index 00000000..9138719a
--- /dev/null
+++ b/bsc-plugin/src/plugin.spec.ts
@@ -0,0 +1,628 @@
+/* eslint-disable @typescript-eslint/no-confusing-void-expression */
+import { DiagnosticSeverity, Program, ProgramBuilder, util } from 'brighterscript';
+import { expect } from 'chai';
+import { standardizePath as s } from './lib/rooibos/Utils';
+import { RooibosPlugin } from './plugin';
+import PluginInterface from 'brighterscript/dist/PluginInterface';
+import * as fsExtra from 'fs-extra';
+import * as path from 'path';
+let tmpPath = s`${process.cwd()}/tmp`;
+let _rootDir = s`${tmpPath}/rootDir`;
+let _stagingFolderPath = s`${tmpPath}/staging`;
+
+import { trimLeading } from './lib/utils/testHelpers.spec';
+
+describe('RooibosPlugin', () => {
+ let program: Program;
+ let builder: ProgramBuilder;
+ let plugin: RooibosPlugin;
+ let options;
+ beforeEach(() => {
+ plugin = new RooibosPlugin();
+ options = {
+ rootDir: _rootDir,
+ stagingFolderPath: _stagingFolderPath
+ };
+ fsExtra.ensureDirSync(_stagingFolderPath);
+ fsExtra.ensureDirSync(_rootDir);
+ fsExtra.ensureDirSync(tmpPath);
+
+ builder = new ProgramBuilder();
+ builder.options = util.normalizeAndResolveConfig(options);
+ builder.program = new Program(builder.options);
+ program = builder.program;
+ builder.plugins = new PluginInterface([plugin], undefined);
+ program.plugins = new PluginInterface([plugin], undefined);
+ program.createSourceScope(); //ensure source scope is created
+ plugin.beforeProgramCreate(builder);
+ plugin.fileFactory.sourcePath = path.resolve(path.join('../framework/src/source'));
+
+
+ });
+ afterEach(() => {
+ fsExtra.ensureDirSync(tmpPath);
+ fsExtra.emptyDirSync(tmpPath);
+ builder.dispose();
+ program.dispose();
+ });
+
+ describe('basic tests', () => {
+
+ it('does not find tests with no annotations', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ class notATest
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.be.empty;
+ });
+ it('finds a basic suite', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+
+ @it("is test1")
+ function Test()
+ end function
+
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ });
+ it('finds a suite name, only', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @only
+ @suite("named")
+ class ATest
+ @describe("groupA")
+
+ @it("is test1")
+ function Test()
+ end function
+
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ let suite = plugin.session.sessionInfo.testSuitesToRun[0];
+ expect(suite.name).to.equal('named');
+ expect(suite.isSolo).to.be.true;
+ });
+ it('ignores a suite', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @ignore
+ @suite
+ class ATest
+ @describe("groupA")
+
+ @it("is test1")
+ function Test()
+ end function
+
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.be.empty;
+ });
+ it('ignores a group', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @ignore
+ @describe("groupA")
+
+ @it("is test1")
+ function Test()
+ end function
+
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.groupsCount).to.equal(0);
+ expect(plugin.session.sessionInfo.testsCount).to.equal(0);
+ });
+ it('ignores a test', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+
+ @ignore
+ @it("is test1")
+ function Test()
+ end function
+
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.groupsCount).to.equal(1);
+ expect(plugin.session.sessionInfo.testsCount).to.equal(0);
+ });
+ it('multiple groups', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+
+ @it("is test1")
+ function Test_1()
+ end function
+
+ @describe("groupB")
+
+ @it("is test1")
+ function Test_2()
+ end function
+
+ @it("is test2")
+ function Test_3()
+ end function
+
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ let suite = plugin.session.sessionInfo.testSuitesToRun[0];
+ expect(suite.getTestGroups()[0].testCases).to.have.length(1);
+ });
+ it('duplicate test name', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+
+ @it("is test1")
+ function Test_1()
+ end function
+
+ @describe("groupB")
+
+ @it("is test1")
+ function Test_2()
+ end function
+
+ @it("is test1")
+ function Test_3()
+ end function
+
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.be.empty;
+ });
+ it('empty test group', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.be.empty;
+ });
+ it('multiple test group annotations - same name', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+ @describe("groupA")
+ @it("is test1")
+ function Test_3()
+ end function
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.be.empty;
+ });
+ it('params test with negative numbers', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+ @it("is test1")
+ @params(100,100)
+ @params(100,-100)
+ @params(-100,100)
+ @params(-100,-100)
+ function Test_3(a, b)
+ end function
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ });
+ it('updates test name to match name of annotation', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+ @it("is test1")
+ function test()
+ end function
+ @it("is test2")
+ function test()
+ end function
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ });
+ it('updates test name to match name of annotation - with params', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+ @it("is test1")
+ function test()
+ end function
+ @it("is test2")
+ @params(1)
+ @params(2)
+ function test(arg)
+ end function
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ });
+ it('multiple test group annotations - different name', () => {
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest
+ @describe("groupA")
+ @describe("groupB")
+ @it("is test1")
+ function Test_3()
+ end function
+ end class
+ `);
+ program.validate();
+ expect(program.getDiagnostics()).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.be.empty;
+ });
+
+ it('test full transpile', async () => {
+ plugin.afterProgramCreate(program);
+ // program.validate();
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest extends rooibos.BaseTestSuite
+ @describe("groupA")
+ @it("is test1")
+ function Test_3()
+ end function
+ end class
+ `);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ expect(plugin.session.sessionInfo.suitesCount).to.equal(1);
+ expect(plugin.session.sessionInfo.groupsCount).to.equal(1);
+ expect(plugin.session.sessionInfo.testsCount).to.equal(1);
+
+ expect(getContents('rooibosMain.brs')).to.eql(trimLeading(`function main()
+ Rooibos_init()
+end function`).trim());
+ let a = getContents('test.spec.brs');
+ let b = trimLeading(`function __ATest_builder()
+ instance = __rooibos_BaseTestSuite_builder()
+ instance.super0_new = instance.new
+ instance.new = sub()
+ m.super0_new()
+ end sub
+ instance.groupA_is_test1 = function()
+ end function
+ instance.super0_getTestSuiteData = instance.getTestSuiteData
+ instance.getTestSuiteData = function()
+ return {
+ name: "ATest",
+ isSolo: false,
+ isIgnored: false,
+ pkgPath: "source/test.spec.bs",
+ filePath: "/home/george/hope/open-source/rooibos/bsc-plugin/tmp/rootDir/source/test.spec.bs",
+ lineNumber: 3,
+ valid: true,
+ hasFailures: false,
+ hasSoloTests: false,
+ hasIgnoredTests: false,
+ hasSoloGroups: false,
+ setupFunctionName: "",
+ tearDownFunctionName: "",
+ beforeEachFunctionName: "",
+ afterEachFunctionName: "",
+ isNodeTest: false,
+ nodeName: "",
+ generatedNodeName: "ATest",
+ testGroups: [
+ {
+ name: "groupA",
+ isSolo: false,
+ isIgnored: false,
+ filename: "source/test.spec.bs",
+ lineNumber: "3",
+ setupFunctionName: "",
+ tearDownFunctionName: "",
+ beforeEachFunctionName: "",
+ afterEachFunctionName: "",
+ testCases: [
+ {
+ isSolo: false,
+ funcName: "groupA_is_test1",
+ isIgnored: false,
+ isParamTest: false,
+ name: "is test1",
+ lineNumber: 7,
+ paramLineNumber: 0,
+ assertIndex: 0,
+ assertLineNumberMap: {},
+ rawParams: invalid,
+ paramTestIndex: 0,
+ expectedNumberOfParams: 0,
+ isParamsValid: true
+ }
+ ]
+ }
+ ]
+ }
+ end function
+ return instance
+ end function
+ function ATest()
+ instance = __ATest_builder()
+ instance.new()
+ return instance
+ end function`);
+ expect(a).to.eql(b);
+ });
+ it('test full transpile with complex params', async () => {
+ plugin.afterProgramCreate(program);
+ // program.validate();
+ program.addOrReplaceFile('source/test.spec.bs', `
+ @suite
+ class ATest extends rooibos.BaseTestSuite
+ @describe("groupA")
+ @it("is test1")
+ @params({"unknown_value": "color"})
+ function Test_3(arg)
+ end function
+ end class
+ `);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ expect(plugin.session.sessionInfo.suitesCount).to.equal(1);
+ expect(plugin.session.sessionInfo.groupsCount).to.equal(1);
+ expect(plugin.session.sessionInfo.testsCount).to.equal(1);
+
+ expect(getContents('rooibosMain.brs')).to.eql(trimLeading(`function main()
+ Rooibos_init()
+end function`).trim());
+ });
+ });
+
+ describe('honours tags - simple tests', () => {
+ let testSource = `
+ @tags("one", "two", "exclude")
+ @suite("a")
+ class ATest extends rooibos.BaseTestSuite
+ @describe("groupA")
+ @it("is test1")
+ function t1()
+ end function
+ end class
+ @tags("one", "three")
+ @suite("b")
+ class BTest extends rooibos.BaseTestSuite
+ @describe("groupB")
+ @it("is test2")
+ function t2()
+ end function
+ end class
+ `;
+
+ beforeEach(() => {
+ plugin = new RooibosPlugin();
+ options = {
+ rootDir: _rootDir,
+ stagingFolderPath: _stagingFolderPath
+ };
+ fsExtra.ensureDirSync(_stagingFolderPath);
+ fsExtra.ensureDirSync(_rootDir);
+ fsExtra.ensureDirSync(tmpPath);
+
+ builder = new ProgramBuilder();
+ builder.options = util.normalizeAndResolveConfig(options);
+ builder.program = new Program(builder.options);
+ program = builder.program;
+ builder.plugins = new PluginInterface([plugin], undefined);
+ program.plugins = new PluginInterface([plugin], undefined);
+ program.createSourceScope(); //ensure source scope is created
+ plugin.beforeProgramCreate(builder);
+ plugin.fileFactory.sourcePath = path.resolve(path.join('../framework/src/source'));
+ plugin.afterProgramCreate(program);
+ // program.validate();
+ });
+ afterEach(() => {
+ fsExtra.ensureDirSync(tmpPath);
+ fsExtra.emptyDirSync(tmpPath);
+ builder.dispose();
+ program.dispose();
+ });
+ it('tag one', async () => {
+ plugin.session.sessionInfo.includeTags = ['one'];
+ program.addOrReplaceFile('source/test.spec.bs', testSource);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun[0].name).to.equal('a');
+ expect(plugin.session.sessionInfo.testSuitesToRun[1].name).to.equal('b');
+ });
+ it('tag two', async () => {
+ plugin.session.sessionInfo.includeTags = ['two'];
+ program.addOrReplaceFile('source/test.spec.bs', testSource);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun[0].name).to.equal('a');
+ });
+ it('tag three', async () => {
+ plugin.session.sessionInfo.includeTags = ['three'];
+ program.addOrReplaceFile('source/test.spec.bs', testSource);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun[0].name).to.equal('b');
+ });
+ it('tag exclude', async () => {
+ plugin.session.sessionInfo.excludeTags = ['exclude'];
+ program.addOrReplaceFile('source/test.spec.bs', testSource);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun[0].name).to.equal('b');
+ });
+ it('inlcude and exclude tags', async () => {
+ plugin.session.sessionInfo.includeTags = ['one', 'two'];
+ plugin.session.sessionInfo.excludeTags = ['exclude'];
+ program.addOrReplaceFile('source/test.spec.bs', testSource);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.be.empty;
+ });
+ it('Need all tags', async () => {
+ plugin.session.sessionInfo.includeTags = ['one', 'two'];
+ program.addOrReplaceFile('source/test.spec.bs', testSource);
+ program.validate();
+ await builder.transpile();
+ console.log(builder.getDiagnostics());
+ expect(builder.getDiagnostics()).to.have.length(1);
+ expect(builder.getDiagnostics()[0].severity).to.equal(DiagnosticSeverity.Warning);
+ expect(plugin.session.sessionInfo.testSuitesToRun).to.not.be.empty;
+ expect(plugin.session.sessionInfo.testSuitesToRun[0].name).to.equal('a');
+ });
+ });
+
+
+});
+
+describe.skip('run a local project', () => {
+ it('sanity checks on parsing - only run this outside of ci', () => {
+ let programBuilder = new ProgramBuilder();
+ let swv = {
+ 'stagingFolderPath': 'build',
+ 'rootDir': '/home/george/hope/open-source/maestro/swerve-app/src',
+ 'files': [
+ 'manifest',
+ 'source/**/*.*',
+ 'images/**/*.*',
+ 'sounds/**/*.*',
+ 'sounds/*.*',
+ 'fonts/**/*.*',
+ 'components/**/*.*'
+ ],
+ 'autoImportComponentScript': true,
+ 'createPackage': false,
+ 'diagnosticFilters': [
+ {
+ 'src': '**/roku_modules/**/*.*'
+ },
+ {
+ 'src': '**/Whitelist.xml',
+ 'codes': [
+ 1067
+ ]
+ },
+ {
+ 'src': 'components/maestro/generated/**/*.*'
+ },
+ 1013,
+ {
+ 'src': '**/RALETrackerTask.*'
+ }
+ ],
+ 'maestro': {
+ 'nodeFileDelay': 0,
+ 'excludeFilters': [
+ '**/roku_modules/**/*',
+ '**/*BaseTestSuite*.bs'
+ ]
+ },
+ 'sourceMap': true,
+ 'extends': 'bsconfig.json',
+ 'plugins': [
+ '/home/george/hope/open-source/maestro/maestro-roku-bsc-plugin/dist/plugin.js',
+ '/home/george/hope/open-source/rooibos/bsc-plugin/dist/plugin.js'
+ ],
+ 'exclude': {
+ 'id': '/home/george/hope/open-source/maestro/roku-log-bsc-plugin/dist/plugin.js'
+ },
+ 'rooibos': {
+ 'isRecordingCodeCoverage': false,
+ 'testsFilePattern': null,
+ 'tags': [
+ '!integration',
+ '!deprecated',
+ '!fixme'
+ ],
+ 'showOnlyFailures': true,
+ 'catchCrashes': true,
+ 'lineWidth': 70
+ },
+ 'rokuLog': {
+ 'strip': false,
+ 'insertPkgPath': true
+ }
+ };
+
+ programBuilder.run(
+ swv
+ // {
+ // project: '/home/george/hope/applicaster/zapp-roku-app/bsconfig-test.json'
+ // project: '/home/george/hope/open-source/maestro/swerve-app/bsconfig-test.json'
+ // }
+ ).catch(e => {
+ console.error(e);
+ });
+ console.log('done');
+ });
+});
+
+function getContents(filename: string) {
+ return trimLeading(fsExtra.readFileSync(s`${_stagingFolderPath}/source/${filename}`).toString());
+}
diff --git a/bsc-plugin/src/plugin.ts b/bsc-plugin/src/plugin.ts
new file mode 100644
index 00000000..386987a9
--- /dev/null
+++ b/bsc-plugin/src/plugin.ts
@@ -0,0 +1,147 @@
+import type {
+ BrsFile,
+ BscFile,
+ Program,
+ ProgramBuilder,
+ XmlFile
+} from 'brighterscript';
+
+import { isBrsFile } from 'brighterscript/dist/astUtils';
+
+import { RooibosSession } from './lib/rooibos/RooibosSession';
+
+import { CodeCoverageProcessor } from './lib/rooibos/CodeCoverageProcessor';
+import { FileFactory } from './lib/rooibos/FileFactory';
+import type { RooibosConfig } from './lib/rooibos/RooibosConfig';
+
+
+import * as minimatch from 'minimatch';
+
+export class RooibosPlugin {
+
+ name: 'rooibosPlugin';
+ public session: RooibosSession;
+ public codeCoverageProcessor: CodeCoverageProcessor;
+ public fileFactory: FileFactory;
+ public isFrameworkAdded = false;
+ public _builder: ProgramBuilder;
+ public config: RooibosConfig;
+
+ beforeProgramCreate(builder: ProgramBuilder): void {
+ this._builder = builder;
+
+ this.config = this.getConfig((builder.options as any).rooibos || {});
+
+ this.fileFactory = new FileFactory(this.config);
+ if (!this.session) {
+ this.session = new RooibosSession(builder, this.fileFactory);
+ this.codeCoverageProcessor = new CodeCoverageProcessor(builder);
+ }
+ }
+ private getConfig(options: any) {
+ let config: RooibosConfig = options;
+ if (config.printTestTimes === undefined) {
+ config.printTestTimes = true;
+ }
+ if (config.catchCrashes === undefined) {
+ config.catchCrashes = true;
+ }
+ if (config.failFast === undefined) {
+ config.failFast = true;
+ }
+ if (config.showOnlyFailures === undefined) {
+ config.showOnlyFailures = true;
+ }
+ if (config.isRecordingCodeCoverage === undefined) {
+ config.isRecordingCodeCoverage = true;
+ }
+ //ignore roku modules by default
+ if (config.includeFilters === undefined) {
+ config.includeFilters = [
+ '**/*.spec.bs',
+ '!**/BaseTestSuite.spec.bs',
+ '!**/roku_modules/**/*'];
+ }
+
+ return config
+ }
+
+ afterProgramCreate(program: Program) {
+ if (!this.isFrameworkAdded) {
+ this.fileFactory.addFrameworkFiles(program);
+ }
+ }
+
+ afterScopeCreate() {
+ }
+
+ beforeFileParse(): void {
+ }
+
+ afterFileParse(file: (BrsFile | XmlFile)): void {
+ // console.log('afp', file.pkgPath);
+ if (this.fileFactory.isIgnoredFile(file) || !this.shouldSearchInFileForTests(file)) {
+ return;
+ }
+
+ // console.log('processing ', file.pkgPath);
+ if (isBrsFile(file)) {
+ if (this.session.processFile(file)) {
+ //
+ } else {
+ this.codeCoverageProcessor.addCodeCoverage(file);
+ }
+ }
+ }
+
+ beforePublish() {
+ // console.log('bp');
+ for (let testSuite of [...this.session.sessionInfo.testSuitesToRun.values()]) {
+ let noEarlyExit = testSuite.annotation.noEarlyExit;
+ if (noEarlyExit) {
+ console.warn(`WARNING: testSuite "${testSuite.name}" is marked as noEarlyExit`);
+ }
+
+ testSuite.addDataFunctions();
+ for (let group of [...testSuite.testGroups.values()].filter((tg) => tg.isIncluded)) {
+ for (let testCase of [...group.testCases.values()].filter((tc) => tc.isIncluded)) {
+ group.modifyAssertions(testCase, noEarlyExit);
+ }
+ }
+ }
+
+ for (let testSuite of [...this.session.sessionInfo.allTestSuites.values()].filter((ts) => !ts.isIncluded)) {
+ testSuite.removeCode();
+ }
+
+ this.session.addTestRunnerMetadata();
+ this.session.addLaunchHook();
+ this.session.createNodeFiles(this._builder.program);
+ }
+
+ beforeProgramValidate() {
+ // console.log('bpv');
+ this.session.updateSessionStats();
+ for (let testSuite of [...this.session.sessionInfo.testSuites.values()]) {
+ testSuite.validate();
+ }
+ }
+
+ shouldSearchInFileForTests(file: BscFile) {
+ if (!this.config.includeFilters || this.config.includeFilters.length === 0) {
+ return true;
+ } else {
+ for (let filter of this.config.includeFilters) {
+ if (!minimatch(file.pathAbsolute, filter)) {
+ return false;
+ }
+ }
+ }
+ // console.log('including ', file.pkgPath);
+ return true;
+ }
+}
+
+export default () => {
+ return new RooibosPlugin();
+};
diff --git a/bsc-plugin/tsconfig.json b/bsc-plugin/tsconfig.json
new file mode 100644
index 00000000..13a63622
--- /dev/null
+++ b/bsc-plugin/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "compilerOptions": {
+ "noImplicitAny": false,
+ "module": "commonjs",
+ "sourceMap": true,
+ "rootDir": "src",
+ "outDir": "./dist",
+ "strictNullChecks": false,
+ "forceConsistentCasingInFileNames": true,
+ "preserveConstEnums": true,
+ "allowJs": true,
+ "target": "ES2017",
+ "downlevelIteration": true
+ },
+ "allowSyntheticDefaultImports": true,
+ "lib": ["es2017", "es2019.array", "esnext", "dom"],
+ "outDir": "./dist",
+ "exclude": ["node_modules/**/*"],
+ "include": ["./src/**/*"]
+}
diff --git a/bsconfig.json b/bsconfig.json
index df7b9795..5ba0a1fd 100644
--- a/bsconfig.json
+++ b/bsconfig.json
@@ -1,15 +1,20 @@
-//framework tests
{
- "rootDir": "frameworkTests",
- "autoImportComponentScript": false
-}
-// framework
-// {
-// "rootDir": "src",
-// "files": [
-// {
-// "src": "**/*.*",
-// "dest": "source"
-// }
-// ]
-// }
\ No newline at end of file
+ "rootDir": "framework/src",
+ "files": [
+ "manifest",
+ "source/**/*.*",
+ "components/**/*.*"
+ ],
+ "autoImportComponentScript": true,
+ "createPackage": false,
+ "stagingFolderPath": "dist",
+ "diagnosticFilters": [
+ {
+ "src": "**/roku_modules/**/*.*",
+ "codes": [
+ 1107,
+ 1009
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/devScripts/buildTests.sh b/devScripts/buildTests.sh
deleted file mode 100755
index 7abd9fdd..00000000
--- a/devScripts/buildTests.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/bash
-# note - I use these scripts, as I can't stop vscode ides gulp runner from changing the debug console window, which is annoying.
-
-parent_path=$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )
-cd "$parent_path"/..
-
-gulp prePublishFrameworkTests
diff --git a/docs/index.md b/docs/index.md
index f3a515ce..e1c85414 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -18,6 +18,7 @@ Simple, mocha-inspired, flexible, fun Brightscript test framework for ROKU apps
- [Node specific assertions](#node-specific-assertions)
- [Parameterized testing](#parameterized-testing)
- [Mocks and stubs](#mocks-and-stubs)
+ - [Mocks node](#mocks-node)
- [Execute tests on scenegraph nodes](#execute-tests-on-scenegraph-nodes)
- [Incorporate your own util methods](#incorporate-your-own-util-methods)
- [Hook into your global setup mechanisms](#hook-into-your-global-setup-mechanisms)
@@ -35,266 +36,175 @@ Simple, mocha-inspired, flexible, fun Brightscript test framework for ROKU apps
- [Integrating with your app setup and util methods](#integrating-with-your-app-and-utils)
- [Using mocks and stubs](#using-mocks-and-stubs)
- [API reference](https://georgejecook.github.io/rooibos)
- - [Assertion reference](https://georgejecook.github.io/rooibos/module-BaseTestSuite.html)
+ - [assertion reference](https://georgejecook.github.io/rooibos/module-BaseTestSuite.html)
- [Integrating with your CI](#integrating-with-your-ci)
- [Advanced Setup](#advanced-setup)
- [Code coverage](#generate-code-coverage)
## Getting started
-Rooibos is intentionally simple to work with. Simply install the `rooibos-cli` npm package and use that to install the framework files, and run your tests.
+Rooibos is a brighterscript compiler and Visual Studio Extension plugin. That does not mean you need to write in brighterscript; the bsc compiler also parses regular brightscript projects.
-You can even use `rooibos-cli` from your npm-compatible build tools, such as gulp.
+The advantages of this are:
+ - you get warnings and errors for your tests as you write them in the ide.
+ - you do not have to install any thing in your projects, or maintain the rooibos libraries; it just works
+ - it is very easy to integrate into your CI toolchain.
+
+## Your project MUST use Vscode and the brighterscript compiler
+
+Rooibos will not work if you do not use the brighterscript compiler. I have no plans to support any other toolchains.
### Installation
-1. Either:
- - use the `rooibos-cli` tool (preferred way)
-
- ```
- npm install rooibos-cli -g
- rooibos-cli i myProject/source/tests
- ```
-
- - download the [latest relases's] (https://github.com/georgejecook/rooibos/releases/latest) `rooibosDist.brs` to a location in your `source` folder. The suggested folder structure to keep things clear is `source/tests/rooibos`.
- - clone or download this repo and copy `dist/rooibosDist.brs` to a location in your `source` folder. The suggested folder structure to keep things clear is `source/tests/rooibos`.
-
-3. Add the following line to your main method, in your `main.brs` file It should be placed before you initialize your scenegraph screens
-
-**(.brs)**
-
-```
- 'bs:disable-next-line
- if (type(Rooibos_init) = "Function") then Rooibos_init()
-```
+1. ensure you have a bsconfig.json, as per: https://github.com/rokucommunity/brighterscript
+1. `npm install rooibos-roku --save-dev`
+1. Add the rooibos plugin to your `bsconfig.json` file as follows:
-**(.bs)**
```
- 'bs:disable-next-line
- if (type(Rooibos.init) = "Function") then Rooibos.init()
+ "plugins": [
+ "rooibos-roku"
+ ]
```
-
- Note - rooibos will run if it is present. *You should be filtering out your tests folder, containing rooibosDist.brs, and your tests as part of your non-test build/release process*, which is the preferred mechanism to disable/enable rooibos.
-
-4. Create a Scene named `TestsScene.xml`, in your `components` folder. Again, we'd suggest following an easy to understand structure like `components/test/rooibos`. Rooibos will use this when running tests. This Scene must have a function definition for the `Rooibos_CreateTestNode` method, and include the rooibos library (which mixes in the method body for `Rooibos_CreateTestNode`.
-5. Create a folder for your test specs. We'd suggest `source/tests/specs` to keep things simple. Write your `.brs` test files here.
- If you are testing RSG components you will also need to create a folder to hold the test components, such as `components/tests/specs`.
- __See the example app to get a clearer understanding of the directory structures__ [Example app](../samples/example)
-
-6. Integrate [rooibos-cli](#rooibos-cli) into your tool-chain.
-7. Run your tests
+Rooibos will automatically inject the necessary source files into your project, at build time, and inject the hooks to run.
+Note - you will likely use a seprate `bsconfig.json` file for your tests, e.g. `bsconfig-test.json`, which will be used by your CI/testing vscode launch target.
-#### Delaying start so you can set things up
+#### Delaying start so you can set things up - CURRENTLY UNSUPPORTED
If you need to do some setup, like load some data from a service, before starting your tests:
- add a field `isReadyToStartTests` to your tests scene
- set the value to true, when the tests are ready to start.
-
-**For an example of how to use rooibos with gulp, see the gulpfile.ts in this project, which is used to run the framework unit tests.**
-
-### rooibos-cli
-To get the best performance and test flexibility, rooibos leverages a typescript preprocessor, named [rooibos-cli](https://github.com/georgejecook/rooibosPreprocessor), which prepares some files which get sideloaded with your tests.
+ NOTE: this is not yet supported in rooibos 4! I will add it again soon.
-### From javascript/typescript/node
-
-#### Gulp typescript example
-
-See `gulpfile.ts`, in this project, for a robust typescript-based gulp example demonstrating how to seamlessly integrate rooibos with gulp. However, the process is as follows:
-
- - `npm install rooibos-cli --save-dev`
- - Add the following to the top of gulpfile.ts/js `import { RooibosProcessor, createProcessorConfig, ProcessorConfig } from 'rooibos-cli';`
- - Create a task to process your test files, such as:
-
- ```
-export async function prepareTests() {
- await rokuDeploy.prepublishToStaging(args);
- let config = createProcessorConfig({
- "projectPath": "build"
- "testsFilePattern": [
- "**/tests/**/*.brs",
- "!**/rooibosDist.brs",
- "!**/rooibosFunctionMap.brs",
- "!**/TestsScene.brs"
- ]
-});
- let processor = new RooibosProcessor(config);
- await processor.processFiles();
-}
-```
-
-#### Gulp javascript example
-
-For those who are not using typescript, the usage is as follows:
-
-```
-var rooibos = require('rooibos-cli');
+### Configuring Rooibos's runtime behaviour
+Rooibos's configuration is controlled via the configuration passed into the `bsconfig.json` via flags on the `rooibos` json blob
-gulp.task('prepareTests', ['collect'], async function() {
- let config = rooibos.createProcessorConfig({
- "projectPath": "build/test",
- "testsFilePattern": [
- "**/tests/**/*.brs",
- "!**/rooibosDist.brs",
- "!**/rooibosFunctionMap.brs",
- "!**/TestsScene.brs"
- ]
- });
- let processor = new rooibos.RooibosProcessor(config);
- await processor.processFiles();
-});
+e.g.
```
+ "rooibos": {
+ "isRecordingCodeCoverage": false,
+ "printTestTimes": true,
+ "testsFilePattern": null,
+ "tags": ["!integration", "!deprecated", "!fixme"],
+ "showOnlyFailures": true,
+ "catchCrashes": true,
+ "lineWidth": 70
+ },
+ ```
-#### Installing or updating the testing framework with rooibos-cli
-
-To install latest
-
- ```
- rooibos-cli i myProject/source/tests
- ```
-
-To install a specific release
-
- ```
- rooibos-cli i myProject/source/tests -r 3.0.2
- ```
-
-
-#### Running tests with rooibos-cli
-
-You can also use rooibos-cli from the command line, by installing it globally. i.e `npm install -g rooibos-cli`. The CLI app is vcalled `rooibos-cli`
-
-Then call `rooibos-cli -h` to check the install worked and see the help menu.
-
-There are two ways to invoke rooibos-cli:
-
-1. Define a config file that returns a JSON object and tell rooibos-cli to use that via the `-c` flag:
-
- ```
- rooibos-cli r path/to/config.json
- ```
-
- _To see an example config file take a look at the [Example app](../samples/example)_
-
-
-2. Alternately, use the following flags to configure test behaviour, like so:
-
- ```
- rooibos-cli r -p ./ -t source/tests
- ```
-
-### Description of rooibos-cli commands
-
-
-
-| flag | argument | Fescription |
-|------|-----------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| `-p` | `--projectPath` | the path to the root of your project. This is used to fix the `pkg:/locations` in rooibos's output. |
-| `-t` | `--testsFilePattern` | array of globs, specifying which test files (i.e. your test _.brs_ files) to include. Relative to projectPath, relative to _"projectPath"_ |
-| `-o` | `--outputPath` | you can also specity the _"outputPath"_. This is where rooibos-cli will write the map file, and other files it needs which informs rooibos about your tests. It is relative to |
-| `-v` | `--isRecordingCodeCoverage` | indicates that we want to generate coverage |
-| `-s` | `--sourceFilePattern` | array of globs, specifying which files to include/exclude in code coverage. Relative to projectPath. Required if `-v` is set. |
-| `-f` | `--showFailuresOnly` | Show results for failed tests, if any. If none fail, then all results are shown |
-| `-F` | `--failFast` | Test execution will stop at the first failure |
-| `-l` | `--legacySupport` | Flag indicating that rooibos should try to inlcude legacy roku unit tests |
-| `-l` | `--printLCov` | Flag indicating that rooibos should wil print lcov results to the log, so you can populate your lcov file with them|
-
-### Configuring Rooibos's runtime behaviour
-
-Rooibos's configuration is controlled via the configuration passed into the `rooibos-cli` via flags on the `rooibos-cli` command, or values in the json used to initialize `rooibos-cli` via the command line, or via javacript code.
-
+The following options are supported:
-_Deprecation warning: This behaviour is going to change - in future, these json settings will be merged with the preprocessor config._
+- logLevel?: RooibosLogLevel - 0-4 (error, warn, info, debug)
+- showOnlyFailures?: boolean - if true, then only failed tests are shown; but everything is show if no failures occurred
+- printTestTimes?: boolean - if true then the time each test took is output
+- lineWidth?: number - width of test output lines in columns
+- catchCrashes? : boolean - if true, then any crashes will report CRASH statement, and note halt test execuction - very useful for running a whole suite
+- testsFilePattern?: string - the pattern to use to find tests, this is a glob, the defawult is "**/*.spec.bs"
+- tags?: string[] - the tags listed here control what is run - you can use !tagname to indicated any tests/suites that are skipped, all other tags are ANDed. This is very useful for having a bsconfig to run, say tests including long, and slow integration tests, or just running a certain subset of your suite.
## Creating test suites
Rooibos has a hiearchy of tests as follows:
- - TestSuite
- - It Group
- - TestCase
- - Parameterized TestCase
+ - Suite
+ - Describe block
+ - it test
+ - Parameterized it test
-A file is considered a test suite if it contains a `@TestSuite` annotation. No special naming is required.
+Test suites are defined by:
+ - declaring a class _inside_ a namespace
+ - which extends `Rooibos.BaseTestSuite`
+ - and has a `@suite` annotation
+No special file naming is required. I recommend you call your files `thing.spec.bs`
-### Simple example
-The following is a minimum working example of a Rooibos TestSuite, named `Simple.brs`
-
+Please note that rooibos tests are _brighterscript_ only. You can test regular brs files; but all your tests must be brightersript files.
-```
-'@TestSuite [Simp] Simple Tests
+### Some advice
-'@Setup
-function Simp_SetUp() as void
- m.modelLocator = m.testUtils.GetStubModelLocator()
- m.vm = BVM_CreateVM("testVM", m.modelLocator)
-end function
+I find it really handy to have my own BaseTestSuite, that extends `Rooibos.BaseTestSuite` and I use that as the base of all my tests. In this way I can easily use common utilities and use common beforeEach/setup for setting things up.
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests initializaiton of vm
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+### Simple example
+The following is a minimum working example of a Rooibos test suite, named `Simple.brs`
+
-'@Test can instantiate with invalid modelLocator
-function Simp_Init_invalid() as void
- m.vm = BVM_CreateVM("testVM", invalid)
- m.AssertNotInvalid(m.vm)
-end function
```
+namespace tests
-#### Simple example Notes
+ @suite("basic tests")
+ class BasicTests extends Rooibos.BaseTestSuite
-1. The `++++++++++++`'s around the `@It` declaration are not required; but I find it makes the file much easier to read, and recommend it (or something similar, such as `'*****` as a best practice.
-2. In the above example, `Simp` is the namespace, used to stop collisions between our tests and/or other source files
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests the node context is available for a Node scope function")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @it("does something in node scope")
+ function _()
+ m.assertNotInvalid(m.node)
+ Tests.doSomethingInNodeScope(true)
+ m.assertInvalid(m._isNodeScopeVarSet)
+ m.assertTrue(m.node._isNodeScopeVarSet)
+ end function
-This results in the following test output:
+ end class
-![Simple test output](images/simpleReportOutput.png)
+end namespace
+```
-Note the hierarchical display of the Testsuite _[Simp] Simple Tests_, the group _tests initialization of vm_ and the test itself _can instantiate with invalid modelLocator_.
+#### Simple example Notes
+
+1. The `++++++++++++`'s around the `@describe` declaration are not required; but I find it makes the file much easier to read, and recommend it (or something similar, such as `'*****` as a best practice.
+2. If you do not provide names for the `@suite` it will use the class name
+3. The function name is not required. Rooibos will rename your function to whatever your describe group is (so you can easily navigate in the ide), and as such, the function name cann be anything you like. I like calling all tests functions `_`. Don't worry - the plugin will rename it before you get any duplicate function errors!
### Rooibos annotations
-Rooibos provides a library of annotations which can be used to define TestSuites, It groups, Test Cases, Parameterized tests, and more. All annotations are of the following form
+Rooibos provides a library of annotations which can be used to define test suites, describe groups, tests cases, Parameterized tests, and more. All annotations are of the following form
+
+NOTE - these are official bsc compiler annotations; not like comments in the previous version of rooibos _do not_ put a `'` in front of the, and use `@brighterscript("argument1", 2, "argument3", ["syntax])`
```
-'@ANNOTATION DATA
+@annotation(args...)
```
-Where `ANNOTATION`, is the roku annotation and DATA is the data passed to it. e.g. `'@Test that it handles an empty collection`, defines a test case, with the title `that it handles an empty collection`
+Where `ANNOTATION`, is the roku annotation and DATA is the data passed to it. e.g. `@it("that it handles an empty collection")`, defines a test case, with the title `that it handles an empty collection`
-Some annotations act as modifiers. In these cases, they will affect some other annotation. For example `@Only`, and `@Ignore` will affect the following `@TestSuite`, `@It` or `@Test` annotation.
+Some annotations act as modifiers. In these cases, they will affect some other annotation. For example `@only`, and `@ignore` will affect the following `@suite`, `@it` or `@it` annotation.
The following annotations are supported.
| Annotation | Description | Data |
|-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
-| @TestSuite | Indicates a file is a test suite | Name of the test suite. Used in test output |
-| @Setup | Run once when the suite, or it group is executed | |
-| @TearDown | Run once when the suite or it group is finished | |
-| @BeforeEach | Run before each test. Can be specified for the `@TestSuite`, or for each `@It` group | |
-| @AfterEach | Run after each test. Can be specified for the `@TestSuite`, or for each `@It` group | |
-| @It | Indicates a group of tests. Groupings improve readability. A group might denote various tests for a given method, or even an aspect of functionality | Name of the it group, which is used in the test output |
-| @Test | Indicates a `TestCase`. Must directly precede a function definition | The name of the test acse, which will be reported in the test output |
-| @Only | Precedes a TestSuite, It group, or TestCase, to indicate that _only that item_ should be executed. This can be used to rapidly filter out tests. Only other `@Only` items will be run. | |
-| @Ignore | Preceds a TestSuite, It group or TestCase, to indicate that that item should be ignored. If an `@Ignore` tag is found before an item, then it will not be executed as part of the test run | |
-| @Params[p1,p2,...,p6] | Indicates a Paremeterized test. Must come _after_ a `@Test` annotation. Can accept up to 6 arguments, which are comma separated. When using paremeterized tests, the test function signature _must_ accept the same number of arguments, and each of Params statemens, must also have the same number of params | Up to 6 arguments can be any valid brightscript code, which can be parsed with an `eval` function |
-| @IgnoreParams[p1,p2,...,p6] | A Convenience tag, which makes it easy to temporarily _comment out_ params tests we do not want to run. | As per `@Params` |
-| @OnlyParams[p1,p2,...,p6] | A Convenience tag, which makes it easy to temporarily _solor_ params, so you can run one or more of the params in a params block. Very useful for focusing on a failing test case | As per `@Params` |
+| @suite | Indicates a file is a test suite. Required. | Name of the test suite. Used in test output |
+| @SGNode | Indicates that a test will run in a node. Rooibos plugin will automatically generate the test node and inject all the test code | Name of the component to extend to run tests |
+| @setup | Run once when the suite, or describe group is executed . | |
+| @tearDown | Run once when the suite or describe group is finished | |
+| @beforeEach | Run before each test. Can be specified for the `@suite`, or for each `@it` group | |
+| @afterEach | Run after each test. Can be specified for the `@suite`, or for each `@it` group | |
+| @describe | Indicates a group of tests. Groupings improve readability. A group might denote various tests for a given method, or even an aspect of functionality | Name of the describe group, which is used in the test output |
+| @it | Indicates a test. Must directly precede a function definition | The name of the test acse, which will be reported in the test output |
+| @only | Precedes a Suite, Describe group, or it test, to indicate that _only that item_ should be executed. This can be used to rapidly filter out tests. Only other `@only` items will be run. | |
+| @ignore | Precedes a suite, Describe group or it test, to indicate that that item should be ignored. If an `@ignore` tag is found before an item, then it will not be executed as part of the test run | |
+| @params[p1,p2,...,p6] | Indicates a Paremeterized test. Must come _after_ a `@it` annotation. Can accept up to 6 arguments, which are comma separated. When using paremeterized tests, the test function signature _must_ accept the same number of arguments, and each of params statemens, must also have the same number of params | Up to 6 arguments can be any valid brightscript code, which can be parsed with an `eval` function |
+| @ignoreParams[p1,p2,...,p6] | A Convenience tag, which makes it easy to temporarily _comment out_ params tests we do not want to run. | As per `@params` |
+| @onlyParams[p1,p2,...,p6] | A Convenience tag, which makes it easy to temporarily _solor_ params, so you can run one or more of the params in a params block. Very useful for focusing on a failing test case | As per `@params` |
+| @tags("one","two"..."n") | Allows indicating the tags to apply to the group,test or suite. This is a really effective way to categorise your test suite. These tags can be used to filter tests in your rooibos bsconfig options.| List of tag names to apply |
+| @noatch | If present, will not catch errors for the test or suite it is placed on. This is handy when developing, and you want to debug the exact line on which an error occurred. | none|
+| @noearlyexit | If present, will not exit a test on an assertion failure, which prevents crashes/skwewed results. This annotation is mainly used for testing, such as testing rooibos framework itself. It is recommend that you _do not_ use this annotation. | none|
+
## Writing tests
-Rooibos tests must be placed within a group, which in turn must be placed inside a TestSuite.
+Rooibos tests must be placed within a group, which in turn must be placed inside a suite.
Tests then comprise assertions, which can test if values are equal, like (using fuzzy logic), contain values, etc.
@@ -302,16 +212,16 @@ Tests then comprise assertions, which can test if values are equal, like (using
An assertion looks like this:
```
-m.AssertTrue(myValue)
+m.assertTrue(myValue)
```
-A (contrived) test, might look like this:
+An example test is as follows.
```
-'@Test can instantiate with invalid modelLocator
-function Simpl_Basic_true() as void
+@it("an instantiate with invalid modelLocator")
+function Simpl_Basic_true()
myValue = false
- m.AssertTrue(myValue)
+ m.assertTrue(myValue)
end function
```
@@ -321,15 +231,53 @@ In this case, the test will fail
Observe how the test output indicates in which file the test suite resides, and the line of the failed assert, plus the reason for the failure. If your IDE has integrated brightscript support, such as eclipse, you will find that the locations are clickable. In this example, clicking on the Location link will navigate the IDE to the exact line of code of the assertion.
+Rooibos provids many assertions to test your code with:
+
+ - assertFalse
+ - assertTrue
+ - assertEqual
+ - assertLike
+ - assertNotEqual
+ - assertInvalid
+ - assertNotInvalid
+ - assertAAHasKey
+ - assertAANotHasKey
+ - assertAAHasKeys
+ - assertAANotHasKeys
+ - assertArrayContains
+ - assertArrayNotContains
+ - assertArrayContainsSubset
+ - assertArrayContainsAAs
+ - assertArrayNotContainsSubset
+ - assertArrayCount
+ - assertArrayNotCount
+ - assertEmpty
+ - assertNotEmpty
+ - assertArrayContainsOnlyValuesOfType
+ - assertType
+ - assertSubType
+ - assertNodeCount
+ - assertNodeNotCount
+ - assertNodeEmpty
+ - assertNodeNotEmpty
+ - assertNodeContains
+ - assertNodeNotContains
+ - assertNodeContainsFields
+ - assertNodeNotContainsFields
+ - assertAAContainsSubset
+ - assertMocks
+
+If an assertion fails, then the next assertions will not run.
+
### Async tests
-Rooibos runs in sync mode. Due to scenegraph limitations, we can't use observefield. We can workaround this though, using `AssertAsyncField`
+Rooibos runs in sync mode. Due to scenegraph limitations, we can't use observefield. We can workaround this though, using `assertAsyncField`
This assert allows you to wait on a field set on a task, or some other async manipulated object. Use as such:
```
netTask = createObject("roSGNode", "NetworkTask")
- m.AssertAsyncField(netTask, "output")
+ m.assertAsyncField(netTask, "output")
```
the framework will then check if the output field has changed, every 500 ms for 10 tries
@@ -339,164 +287,118 @@ You can control the timeout behaviour by passing delay and maxAttempts, as follo
```
'2 second time out, 3 tries
netTask = createObject("roSGNode", "NetworkTask", 2000, 3)
- m.AssertAsyncField(netTask, "output")
+ m.assertAsyncField(netTask, "output")
```
If the field does not change during the retry period, the assertion will fail.
-### Laying out tests
-I suggest the following layout when writing your tests
-
-```
-'@Test that the correct index is found
-function Simpl_DataStore_index() as void
- '1. setup your test data objects and values
- values = [{index:1,name:"one"},{index:4, name:"four"},{index:12, name:"twelve"}]
- ds = CreateDataStore(values)
-
- '2. Execute the method you wish to test
- item = ds.GetDataItemWithIndex(55)
-
- '3. Do your assertions
- m.AssertNotInvald(item)
- m.AssertEqual(item.name,"twelve")
-end function
-```
-
-So the final test would look like:
-
-```
-'@Test that the correct index is found
-function Simpl_DataStore_index() as void
- values = [{index:1,name:"one"},{index:4, name:"four"},{index:12, name:"twelve"}]
- ds = CreateDataStore(values)
-
- item = ds.GetDataItemWithIndex(12)
-
- m.AssertNotInvald(item)
- m.AssertEqual(item.name,"twelve")
-end function
-```
-
-### More Assertions
-The previous example can be written more succinctly using Rooibos's library of assertions
-
-```
-'@Test that the correct index is found
-function Simpl_DataStore_index() as void
- values = [{index:1,name:"one"},{index:4, name:"four"},{index:12, name:"twelve"}]
- ds = CreateDataStore(values)
-
- item = ds.GetDataItemWithIndex(12)
-
- m.AssertAAContainsSubset(item, values[2])
-end function
-```
-
-
### Setting up and tearing down
-You may find that you have data which is common to all of your tests in a suite. In this case you can desginate functions to run, before and after **all** tests are executed in your suite. To achieve this, simply add a `'@Setup` or `'@TearDown` annotation before the appropriate method. In our example above, we could do the following:
+You may find that you have data which is common to all of your tests in a suite. In this case you can desginate functions to run, before and after **all** tests are executed in your suite. To achieve this, simply override the `setup` and `tearDown` functions. In our example above, we could do the following:
```
-'@Setup
-function Simpl_Setup() as void
+override function setup()
m.values = [{index:1,name:"one"},{index:4, name:"four"},{index:12, name:"twelve"}]
m.ds = CreateDataStore(m.values)
end function
-'@Test that the correct index is found
-function Simpl_DataStore_index() as void
+@it("finds the correct index")
+function _()
item = m.ds.GetDataItemWithIndex(12)
- m.AssertAAContainsSubset(item, m.values[2])
+ m.assertAAContainsSubset(item, m.values[2])
end function
```
-### Setup and TeardDown Scoping
-Setup and Teardown, can also be scoped to an it group. If the annotations appear _after_ an `'@It` group annotation, then the setup and teardown will apply only to that group. If the annotations appear _before the first it group annotation_ then they will be applied to all groups, _which do not have Setup and Teardown group-level-annotations_
+### Setup tearDown, beforeEach and afterEach Scoping
+Setup and Teardown, can also be scoped to an describe group. If the annotations appear _after_ an `@describe` group annotation, then the setup and teardown will apply only to that group. If the annotations appear _before the first describe group annotation_ then they will be applied to all groups, _which do not have Setup and Teardown group-level-annotations_")
+
+Like `setup` and `tearDown`, `beforeEach` and `afterEach` can be applied to the whole test by overriding the `beforeEach` and `afterEach` functions. You can scope them to `@describe` blocks, by using the `@setUp`, `@tearDown`, `@beforeEach` and `@afterEach` annotation above the relevant function. Note you can call back your test suite class's overall setup, tearDown, beforeEach and afterEach.
### Using BeforeEach and AfterEach
In addition, we can also use beforeEach and afterEach to run before **each and every** test.
```
-'@Setup
-function Simpl_Setup() as void
- m.values = [{index:1,name:"one"},{index:4, name:"four"},{index:12, name:"twelve"}]
- m.ds = CreateDataStore(m.values)
-end function
+namespace Tests
+ class SampleTest extends Rooibos.BaseTestSuite
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests alternate data
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ override function setup()
+ m.values = [{index:1,name:"one"},{index:4, name:"four"},{index:12, name:"twelve"}]
+ m.ds = CreateDataStore(m.values)
+ end function
-'@BeforeEach
-function MST_OnConfigLoaded_BeforeEach() as void
- m.alternateValues = [{index:2,name:"two"},{index:3, name:"three"},{index:20, name:"twenty"}]
- m.alternateDS = CreateDataStore(m.alternateValues)
-end function
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests alternate data")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@Test that the correct index is NOT found
-function Simpl_Datastore_alternate_failures() as void
- item = m.alternateDS.GetDataItemWithIndex(12)
+ @beforeEach
+ function alternateData_beforeEach()
+ m.alternateValues = [{index:2,name:"two"},{index:3, name:"three"},{index:20, name:"twenty"}]
+ m.alternateDS = CreateDataStore(m.alternateValues)
+ end function
- m.AssertInvalid(item)
-end function
+ @it("does not find correct index")
+ function _()
+ item = m.alternateDS.GetDataItemWithIndex(12)
+ m.assertInvalid(item)
+ end function
-'@Test that the correct index is found
-function Simpl_Datastore_alternate_success() as void
- item = m.alternateDS.GetDataItemWithIndex(3)
- m.AssertAAContainsSubset(item, m.alternateValues[1])
-end function
+ @it("finds correct index")
+ function _()
+ item = m.alternateDS.GetDataItemWithIndex(3)
+ m.assertAAContainsSubset(item, m.alternateValues[1])
+ end function
+ end class
+end namespace
```
Note that in the example above, each of the tests in the `tests alternate data` group, can be run with different values; but we do not need to set the up in each test, or mutate the values used by other tests, which were defined in the `Setup` method.
#### BeforeEach and AfterEach Scoping
-BeforeEach and AfterEach, can also be scoped to an it group. If the annotations appear _after_ an `'@It` group annotation, then they will only apply to that group. If the annotations appear _before the first it group annotation_ then they will be applied to all groups, _which do not have BeforeEach and AfterEach group-level-annotations_
+BeforeEach and AfterEach, can also be scoped to an describe group. If the annotations appear _after_ an `@describe(" group annotation, then they will only apply to that group. If the annotations appear _before the first describe group annotation_ then they will be applied to all groups, _which do not have BeforeEach and AfterEach group-level-annotations_")
### Paremeterized tests
-Many times, we want to test a broad range of values. Writing identical tests with different values is tedious and unneccessary, using Rooibos's `'@Params` mechanism
+Many times, we want to test a broad range of values. Writing identical tests with different values is tedious and unneccessary, using Rooibos's `@params` mechanism
-You can run the same test several times, by adding one or more `'@Params[...]` annotations after the test annotation and before the method declaration, as follows:
+You can run the same test several times, by adding one or more `@params(...)` annotations after the test annotation and before the method declaration, as follows:
```
-'@Test AssertTrue
-'@Params[true, true]
-'@Params[false, false]
-'@Params[invalid, false]
-'@Params[0, false]
-'@Params[1, false]
-'@Params["test", false]
-function Simp__basic_AssertTrue(value, expectedAssertResult) as void
+@it("tests assertTrue")
+@params(true, true)
+@params(false, false)
+@params(invalid, false)
+@params(0, false)
+@params(1, false)
+@params("test", false)
+function _(value, expectedassertResult)
...
```
-In this case, the test will be run once for each of the `'@Params` annotations. Note that the method signature takes parameters which correspond to the arguments in the params arrays.
+In this case, the test will be run once for each of the `@params` annotations. Note that the method signature takes parameters which correspond to the arguments in the params arrays. Rooibos will give you a build time error, and diagnostic in the ide if you screw this up to save you scratching your head later.
This makes it easy for us to pass in values to our tests, and expected output values, e.g.
```
-'@Test schedule shows correct index for now
-'@Params["04","10","15",0, 6]
-'@Params["04","11","00",0, 7]
-'@Params["05","15","20",1, 15]
-'@Params["05","16","05",1, 17]
-'@Params["05","18","00",1, 19]
-function SUT__Update_realData_success(dayOfMonth, hour, minute, expectedDayIndex, expectedShowIndex) as void
+@it("schedule shows correct index for now")
+@params("04","10","15",0, 6)
+@params("04","11","00",0, 7)
+@params("05","15","20",1, 15)
+@params("05","16","05",1, 17)
+@params("05","18","00",1, 19)
+function _(dayOfMonth, hour, minute, expectedDayIndex, expectedShowIndex)
nowDate = SUT.CreateTestDate(dayOfMonth, hour, minute)
m.scheduleContent.callFunc("UpdateTime", nowDate.asSeconds())
- m.AssertEqual(m.scheduleContent.nowDayIndex, expectedDayIndex)
- m.AssertEqual(m.scheduleContent.nowShowIndex, expectedShowIndex)
+ m.assertEqual(m.scheduleContent.nowDayIndex, expectedDayIndex)
+ m.assertEqual(m.scheduleContent.nowShowIndex, expectedShowIndex)
end function
```
-Paremeterized tests accept any valid json. However, the number of top level items in the params array must match the amount of arguments for your test method. If they don't the TestCase will fail.
+Paremeterized tests accept any valid json. However, the number of top level items in the params array must match the amount of arguments for your test method. If they don't the test will fail.
#### Advanced paramter directives
@@ -505,11 +407,11 @@ Paremeterized tests accept any valid json. However, the number of top level item
You can instruct rooibos to create nodes as your parameter arguments. To do so, use the special value `"#RBSNode"`, which will create a ContentNode for that value. You can also specify the nod type you wish to create. See the following example for guidance:
```
-'@Test
-'@Params["#RBSNode", "ContentNode"]
-'@Params["#RBSNode|Group", "Group"]
-'@Params["#RBSNode|Label", "Label"]
-function PT_RBSNodeDirective(node, expectedNodeType) as void
+@it
+@params("#RBSNode", "ContentNode")
+@params("#RBSNode|Group", "Group")
+@params("#RBSNode|Label", "Label")
+function _(node, expectedNodeType)
m.assertSubType(node, expectedNodeType)
end function
```
@@ -521,35 +423,35 @@ The output from paremeterized tests shows the test name, and all of param config
![Simple test output](images/paramTest.png)
#### Ignoring parameterized test configs
-If you have a couple of failing param tests, it can assist debugging to ignore the param configs you are not interested in. In this case, you can place the `'@Params` annotation with `'@IgnoreParams`, and that config will not execute.
+If you have a couple of failing param tests, it can assist debugging to ignore the param configs you are not interested in. In this case, you can place the `@params` annotation with `@ignoreParams`, and that config will not execute.
-Rooibos 0.2.0, will include an `@OnlyParams` annotation for further convenience.
+Rooibos 0.2.0, will include an `@onlyParams` annotation for further convenience.
#### Paremeterized tests and other annotations
-If a test case has a `'@Only` or `'@Ignore` annotation, the _params_ will execute in accordance with their parent test case.
+If a test case has a `@only` or `@ignore` annotation, the _params_ will execute in accordance with their parent test case.
### Node specficic asserts
-Rooibos adds some node specifc asserts, which are fully described in the [Assertion reference](https://georgejecook.github.io/rooibos/module-BaseTestSuite.html). These are:
+Rooibos adds some node specifc asserts, which are fully described in the [assertion reference](https://georgejecook.github.io/rooibos/module-BaseTestSuite.html). These are:
- - AssertNodeCount
- - AssertNodeNotCount
- - AssertNodeEmpty
- - AssertNodeNotEmpty
- - AssertNodeContains
- - AssertNodeNotContains
- - AssertNodeContainsFields
- - AssertNodeNotContainsFields
+ - assertNodeCount
+ - assertNodeNotCount
+ - assertNodeEmpty
+ - assertNodeNotEmpty
+ - assertNodeContains
+ - assertNodeNotContains
+ - assertNodeContainsFields
+ - assertNodeNotContainsFields
### Full list of asserts
-The full list of asserts can be found in the documentation - [Assertion reference](https://georgejecook.github.io/rooibos/module-BaseTestSuite.html)
+The full list of asserts can be found in the documentation - [assertion reference](https://georgejecook.github.io/rooibos/module-BaseTestSuite.html)
## Understanding test output
Rooibos reports test output in an easy to read hiearhchical manner.
-Each test suite has it's own tree structure in the output, and in turn has branches for each group, then each testcase that was run.
+Each test suite has it's own tree structure in the output, and in turn has branches for each group, then each test that was run.
### Success and Failure output
When a test passes, it is indicated by the presence of `Success` at the end of the line
@@ -574,33 +476,33 @@ In addition, you get a simple to parse result as the last line of output, which
Rooibos is built to facilitate TDD, and other test-based developer workflows. For this reason, I made it _very easy_ to specify which tests run, so you can simply execute 1 or a few tests while developing, then more as you finish the method you are currently working with.
### Ignore annotation
-If you place `'@Ignore` above a test suite, it group, or test case, it will ignore it. i.e. it will not be executed.
+If you place `@ignore` above a test suite, describe group, or test case, it will ignore it. i.e. it will not be executed.
You can give a reason for ignoring a test, as part of the annotation's data. e.g.
```
-'@Ignore DataStore is being refactored
-'@Test that the correct index is NOT found
-function Simpl_Datastore_alternate_failures() as void
+@ignore DataStore is being refactored
+@it("that the correct index is NOT found")
+function Simpl_Datastore_alternate_failures()
item = m.alternateDS.GetDataItemWithIndex(12)
- m.AssertInvalid(item)
+ m.assertInvalid(item)
end function
```
The log reporter will indicate which tests are ignored, if you have log verbosity set to 2 or greater
### Only annotation
-If you place `'@Only` above a test suite, it group, or test case, it will run that test in solo mode. In solo mode, execution is limited to those suites, groups or test cases, which also have a `'@Only' annotation.
+If you place `@only` above a test suite, describe group, or test case, it will run that test in solo mode. In solo mode, execution is limited to those suites, groups or test cases, which also have a `@only' annotation.
-A good working practice is to put a `'@Only` annotaiton on the suite for the class you are working on, then the group, then the individual test. You can tehn simply remove the annotation from the test when you have finished, and run the tests again, to see if you caused regression in any of the group's tests, then remove from the group and run the suite, then finally remove the `'@Only` annotation from the suite. This will allow you to run the least amount of tests at any time, while you work, giving you the fastest testing turnaround time.
+A good working practice is to put a `@only` annotaiton on the suite for the class you are working on, then the group, then the individual test. You can tehn simply remove the annotation from the test when you have finished, and run the tests again, to see if you caused regression in any of the group's tests, then remove from the group and run the suite, then finally remove the `@only` annotation from the suite. This will allow you to run the least amount of tests at any time, while you work, giving you the fastest testing turnaround time.
### Only show output for failures
-In addition to the the `'@Only` and `'@Ignore` annotations, Rooibos has another mechanism for aiding the TDD process. You are able to execute Rooibos in `showOnblyFailures` mode. In this mode, all tests are executed (according to the `'@Only` and `'@Ignore` annotations); but if any failures are encountered, then only the failures are displayed. If all tests pass, then the stanard test output is shown.
+In addition to the the `@only` and `@ignore` annotations, Rooibos has another mechanism for aiding the TDD process. You are able to execute Rooibos in `showOnblyFailures` mode. In this mode, all tests are executed (according to the `@only` and `@ignore` annotations); but if any failures are encountered, then only the failures are displayed. If all tests pass, then the stanard test output is shown.
-This makes it easy to quickly dive into the test suite and see what regressions have been introduced, then you can simply navigate to the failed tests and annotate them with `'@Only` annotations (so that subsequent runs are much quicker)
+This makes it easy to quickly dive into the test suite and see what regressions have been introduced, then you can simply navigate to the failed tests and annotate them with `@only` annotations (so that subsequent runs are much quicker)
This can be achieved by setting `showOnlyFailures` to true in the config, or, more conveniently, passing `showOnlyFailures=true` when launching the tests. An example make file target, might look like this:
@@ -609,81 +511,9 @@ testFailures:
curl -d '' "http://${ROKU_DEV_TARGET}:8060/launch/dev?RunTests=true&showOnlyFailures=true&logLevel=4"
```
-## Integrating with your app setup and util methods
-
-### Hooking into your global setup
-
-It is likely that your app will have some degree of setup (like loading config files, setting global properties, etc), that will be required to occur before starting your unit tests. You can have Rooibos invoke your setup methods, at the correct time during it's setup, by passing a function pointer into the `Rooibos__Init` method, as such:
-
-```
-if (type(Rooibos__Init) = "Function") then Rooibos__Init(SetupGlobals)
-
-....
-
-sub SetupGlobals()
-'some setup stuff that is pertinent to your app and unit tests
-end sub
-
-```
-
-### Adding your own util functions to the unit tests
-
-If you wish, you can provide a third function pointer to the `Rooibos_Init` method, which will receive a _TestCase_ paremeter. You can decorate this TestCase with util methods you want to make accessible to your unit tests at runtime. e.g.
-
-
-```
-if (type(Rooibos__Init) = "Function") then Rooibos__Init(SetupGlobals, "DecorateTestUtils")
-
-....
-
-sub DecorateTestUtils(testCase)
- 'add rodash
- testCase.r = rodash()
- 'add some test utils specific to my project
- testCase.testUtils = TestUtils()
-end sub
-
-```
-
-These utility objects/methods/values, will then be available when the test is executed. e.g.
-
-```
-'@Test DataReceived
-function MyNS_DataReceived() as void
- 'using rodash to get the data value for the insert
- m.AssertNotInvalid(m.r.get(result,"data.row[0]",invalid))
-end function
-```
-
-Note: The test utils decorator and all of it's dependencies must be visible to the current exeucting test. That means if you have a node test you must include the script file containing the `testCase.testUtils` method, and all other methods it invokes. The sample app contains an example.
-
### Accessing global scope
-Non-node tests should find all methods are automatically in scope; however, if you need to access the node scope to test anonymous, or mixin methods, this is also supported. You can make your global scope available by calling `Rooibos__Init` and passing in a reference to your scope, as such
-
-```
-sub Main(args as dynamic)
- if (type(Rooibos__Init) = "Function") then Rooibos__Init(SetupGlobals, "AddTestUtils", invalid, m)
-end sub
-
-```
-
-You can then access a node scoped method (i.e. one that is not on m, or on any other object) in the following way:
-
-```
-
-'@Test
-function BT_globalScope() as void
- m.assertNotInvalid(m.node)
- BT_doSomethingInNodeScope(true)
- m.assertInvalid(m._isNodeScopeVarSet)
- m.assertTrue(m.node. _isNodeScopeVarSet)
-end function
-
-function BT_doSomethingInNodeScope(value)
- m._isNodeScopeVarSet = value
-end function
-```
+Note that all test suites contain the param `nodeContext`, which contains a reference to the node, global object and scene.
## Using mocks and stubs
@@ -717,7 +547,7 @@ function Stub(target, methodName, expectedInvocations = 1, expectedArgs = invali
##### A simple example
Given a ViewModel, named DetailsVM, which has a method LoadDetails, as such:
```
-function LoadDetails() as void
+function LoadDetails()
isNetworkRequestExecuted = m.ExecuteNetRequest("http://my.data.com/get")
m.isLoading = isNetworkRequestExecuted
m.isShowingError = not isNetworkRequestExecuted
@@ -733,8 +563,8 @@ m.Stub(detailsVM,"ExecuteNetRequest", invalid, returnJson)
detailsVM.LoadDetails()
-m.AssertFalse(detailsVM.isLoading)
-m.AssertTure(detailsVM.isShowingError)
+m.assertFalse(detailsVM.isLoading)
+m.assertTure(detailsVM.isShowingError)
```
In this case, our detailsVM object, will not actually call ExecuteNetRequests's source code; but will instead call a _fake_ (i.e fake method body), which can return predtermined values, or be later checked for invocation arg conformance.
@@ -748,8 +578,8 @@ We create mocks by using the methods:
- ExpectOnce - Creates a mock, which we expect to be called once _or can created individual overloaded calls to the same method_
- ExpectNone - Creates a mock, which we _never_ expect to be invoked
-### Asserting mocks
-Mocks are asserted by invoking `m.AssertMocks()`
+### asserting mocks
+Mocks are asserted by invoking `m.assertMocks()`
***As a convenience, Rooibos will automatically assert any mocks for you when your test finishes executing***. This saves you from having to manually add this line at the end of your code.
When a mock fails, Rooibos will report to you what caused the failure. The possible reasons are:
@@ -767,8 +597,8 @@ m.ExpectOnce(detailsVM,"ExecuteNetRequest", invalid, returnJson)
detailsVM.LoadDetails()
-m.AssertFalse(detailsVM.isLoading)
-m.AssertTure(detailsVM.isShowingError)
+m.assertFalse(detailsVM.isLoading)
+m.assertTrue(detailsVM.isShowingError)
```
In addition to the other asserts, Rooibos will autoamtically check that ExecuteNetRequest was executed exactly once
@@ -788,9 +618,12 @@ detailsVM.LoadDetails()
```
#### Specifying expected invocation arguments
-You can save yourself a lot of time, and really think about and kick the tyres of your code, by defining the arguments you expect a function to be invoked with. This is done by passing in an array of the expected invocation arguments via the expectedArgs param. You may also really not care about the args, in which case you can set that value to `invalid` and the call to `m.AssertMocks()` will skip checking the invoked args.
+You can save yourself a lot of time, and really think about and kick the tyres of your code, by defining the arguments you expect a function to be invoked with. This is done by passing in an array of the expected invocation arguments via the expectedArgs param. You may also really not care about the args, in which case you can set that value to `invalid` and the call to `m.assertMocks()` will skip checking the invoked args.
+
+#### assertin limitations.
-Up to 9 arguments are supported.
+ - Up to 15 arguments are supported on mocked methods
+ - You can have up to 24 mocks.
#### Expecting several calls to the same method, with verified invocation params
@@ -891,11 +724,11 @@ You can also specify multiple return values, if you expect your mock to be execu
```
m.expect(obj, "mockMethod", 5, invalid, {"multiResult": ["one", 2, invalid, "last"]}, true)
- m.AssertEqual(obj.mockMethod(), "one")
- m.AssertEqual(obj.mockMethod(), 2)
- m.AssertEqual(obj.mockMethod(), invalid)
- m.AssertEqual(obj.mockMethod(), "last")
- m.AssertEqual(obj.mockMethod(), "last")
+ m.assertEqual(obj.mockMethod(), "one")
+ m.assertEqual(obj.mockMethod(), 2)
+ m.assertEqual(obj.mockMethod(), invalid)
+ m.assertEqual(obj.mockMethod(), "last")
+ m.assertEqual(obj.mockMethod(), "last")
```
@@ -946,125 +779,50 @@ continuousIntegration: build install
In the above example, we pipe the output of the telnet session to `dist/test.log`, wait for the test execution to finish, and finally, parse the line of test output to check for the SUCCESS flag.
-### Coming soon: Gulp example
-
-The frameworkTests project is currently run using gulp with typescript. See `gulpfile.ts` for an example, until I get time to add specifics here.
-
-## Advanced setup
-
-### Advanced use of TestsScene.xml
-To use Rooibos, you need to provide a scene (default name `TestsScene.xml`). This scene should be empty; but may well contain code in the init method to setup global values, which you need to execute your runtime code. Consider an application which uses `ModelLocator` pattern, or some other _IOC_ pattern. In this case it would make sense to initiate the pattern in the `TestsScene.xml`, rather than have to set it up in every single test `Setup`.
-
-#### Example TestsScene.xml
-```
-
-
->
-
-
-
-
-
-
-
-
-
-```
+## Coming soon.
-#### Example TestsScene.brs
-```
-sub Init()
- 'Example of an application using ModelLocator pattern
- 'many of the codefiles will expect to have access to a global ModelLocator
- 'so setting it on the `TestsScene`, makes sense.
+I am currently toying with integrating with : https://github.com/georgejecook/roku-test-automation/ - when that work is complete, roobis will be easy to run from CI, as we'll have a socket connection.
- m.global.addFields({"modelLocator": createObject("roSGNode", "ModelLocator")})
-end sub
-```
-
-### Using a different TestsScene.xml
-The scene name can be overriden by passing in the desired scene name as the third `Rooibos__Init` parameter. e.g.
-
-
-```
-if (type(Rooibos__Init) = "Function") then Rooibos__Init(args, SetupGlobals, "DecorateTestUtils", "MyOtherTestsScene")
-```
-
-
-### Make from source
-You can rebuild by running the following command from the terminal:
-
-```make dist```
-
-Which will compress all of the source files in the `src` folder into `dist/rooibosDist.brs`, which can then be copied to your project
+## Advanced setup
-## Testing scenegraph nodes
-
-I prefer to use [MVVM](https://medium.com/flawless-app-stories/how-to-use-a-model-view-viewmodel-architecture-for-ios-46963c67be1b) (link is for iOS pattern, so I don't personally run tests on my scene graph nodes (I have a preprocessor that does all the glueing for me, so I really have very little logic to test), however, I know not everyone works with that practice, so I went to considerable effort to make sure you can run unit tests on your scene graph nodes :)
+### Global test setup
-### Steps to test scenegraph nodes
-SceneGraph nodes are essentially _islands_ they cannot see any other code in your app, which is why they are not subject to name collisions. The only way to access methods in a node file, is to make an interface method and use `callFunc`. This is impractical for testing. We therefore need to create a _wrapper node_ which _extends_ the node we wish to test, and allows us to inject our tests into it.
+I find it really handy to have my own BaseTestSuite, that extends `Rooibos.BaseTestSuite` and I use that as the base of all my tests. In this way I can easily use common utilities and use common beforeEach/setup for setting things up.
-It's a simple process; but I'm fully documenting it to facilitate a deep understanding. Once you do it once, you'll just be copy and pasting a node file, adding an annotation and changing a filename reference.
+You can always call the super beforeEach/setup/teardown/etc from your other tests, making it trivial to do global setup functions.
-For now, here are the complete steps:
-1. For each SceneGraph node you want to test, you need to create a corresponding xml file. Example
- - The name is not important; but I suggest `[NODE_NAME]TestProxy.xml`, so if you were testing `NetworkLayer.xml`, you would create a `NetworkLayerTestProxy.xml` file.
- - This file should be located somewhere in your `components` folder, placing it under `components/tests` is a good idea, as you can easily exclude it from production builds.
- - The file must extend the node you wish to test, e.g. `extends="NetworkLayer.xml"`
- - You must also include an interface function definition for a function named `Rooibos_RunNodeTests`. You _must not_ implement it, it is mixed in for you automatically.
- - You must import your unit test suite (e.g. `NetworkLayerTests.brs`) as well as the rooibos framework (i.e. `rooibosDist.brs`) and the rooibos map file generated by `rooibos-cli` (i.e. `rooibosFunctionMap.brs`)
-2. In your unit test suite, before the ``@TestSuite` delcaration you _must_ place a `'@SGNode` Annotation, with the name of the node that will be used to test this suite. e.g. `'@SGNode NodeExampleTests.brs `
+#### Example Node test file
-#### Example test suite: NetworkLayerTests.brs
+In the following example, the tests will be run in a new (auto-generated) component that extends `NodeExample` component.
```
-'@SGNode NodeExampleTests
-'@TestSuite [NET] Node Example Tests
+namespace Tests
+ @SGNode NodeExample
+ @suite [NET] Node Example Tests
+ class NodeExampleTests extends Rooibos.BaseTestSuite
+ override function setup()
+ m.setupThing = "something created during setup"
+ end function
-'@Setup
-function NET_setup() as void
- m.setupThing = "something created during setup"
-end function
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests methods present on the node")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests methods present on the node
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ override function beforeEach()
+ m.beforeEachThing = "something created beforeEach"
+ end function
+ @it("HelloFromNode")
+ function helloFromNode_simple()
+ 'bs:disable-next-line
+ text = HelloFromNode("georgejecook", 12)
+ m.assertEqual(text, "HELLO georgejecook" + " age:" + stri(12))
+ end function
...
```
-
-#### Example node test wrapper: NetworkLayerTestProxy.xml
-
-This file is located in `components/tests`
-
-```
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
### Nuances of testing nodes
The behaviour of your unit tests is identical to unit testing any other class, with 2 caveates:
@@ -1096,58 +854,27 @@ E.g.
![Simple test output](images/TestingExample.png)
-I slap an `@Only` annotation on the suite, group and test I'm currently working on, and have a hotkey to run my tests.
+I slap an `@only` annotation on the suite, group and test I'm currently working on, and have a hotkey to run my tests.
Once my test passes, I test for regression, then run the whole suite, then run the app and test out in the UI.
-I also have templates for creating groups and test cases, which you are free to copy : they are for eclipse ide.
-
-Configured as name `test`
-
-```
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests ${itDescription}
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test ${testDescription}
-function ${prefix}__${itDescription}_${testName}() as void
- m.AssertFail("implement me!")
- ${cursor}
-end function
-```
-
-Configured as name `it`
-
-```
-'@Test ${testDescription}
-function ${prefix}__${testName}_${testCase}() as void
- m.AssertFail("implementMe")
- ${cursor}
-end function
-```
-
## Backward compatibility
-
-
-Rooibos is backward compatible with the [legacy framework](https://github.com/rokudev/unit-testing-framework/), Use the `-l --legacySupport` flag with rooibos-cli to use this feature.
+Rooibos is NOT backward compatible with pre version 4 versions of rooibos; and not compatible with any other unit test framework.
-`'@Only`, `'@Ingore`, `'@Setup`, `'@TearDown` are all supported. Only and Ignore can be applied to a whole test suite, or individual test cases.
-
-Your files required to follow the convention as laid out [here](https://github.com/rokudev/unit-testing-framework/blob/master/samples/SimpleTestApp/source/tests/Test__Main.brs)
+## Generate code coverage
+**THIS FEATURE IS NOT YET AVAILBALE - I WILL REENABLE THIS IN ROOIBOS 4.2** : If you want it sooner, I can tell you how to implement it - it's a cpl hours of work, I don't have time for right now.
-It is recommended that you upgrade your legacy tests to the new syntax for maximum flexibility, functionality and comfort.
-## Generate code coverage
Rooibos can measure and report the test coverage your unit tests are producing.
-### Code coverage recording is desctructive!
+### Code coverage recording is desctructive!
#### WARNING - DO NOT run code coverage against your source folder!
-Recording coverage means modifying your sources! you should only run the coverage on a project path pointing to a build folder _not_ your source.
+Recording coverage means modifying your sources! you should only run the coverage on a project path pointing to a build folder _not_ your source.
These files should be cleaned and recopied _every time you run coverage_ or you will get compile errors/other undetermined behaviour.
@@ -1162,7 +889,7 @@ An example, using a json config file is :
```
{
- "projectPath": "build",
+ TBD
"sourceFilePattern": [
"**/*.brs",
"**/*.xml",
@@ -1189,17 +916,9 @@ An example, using a json config file is :
This can be done, from the command line also, with the following command:
-```rooibos-cli -p stubProject -t source/tests/**/*.brs -v -s '**/*.brs,**/*.xml,!**/tests/**/*.*,!**/tests,!**/rLog,!**/rLog/**/*.*,!**/rLogComponents,!**/rLogComponents/**/*.*,!**/rooibosDist.brs,!**/rooibosFunctionMap.brs,!**/TestsScene.brs,!**/ThreadaUtils.brs'```
-
### How coverage works
-rooibos-cli, via `rooibos-cli` command line tool, or the npm package will run against a root project folder, and using the `sourceFilePattern` globs your provide, will ascertain which files require coverage.
-
-It then buils an Abstract Syntax Tree, using Sean Barag's wonderful [brs interpreter](https://github.com/sjbarag/brs), to ascertain which lines of the identified files can have their coverage tracked.
-
-The preprocessor then injects function calls for all trackable lines, which update tracking variables at runtime.
-
-Rooibos framework will then collate the stats and display them at the end of the run.
+TODO
#### Statement support
diff --git a/src/manifest b/framework/src/manifest
similarity index 100%
rename from src/manifest
rename to framework/src/manifest
diff --git a/framework/src/source/BaseTestReporter.bs b/framework/src/source/BaseTestReporter.bs
new file mode 100644
index 00000000..49461f75
--- /dev/null
+++ b/framework/src/source/BaseTestReporter.bs
@@ -0,0 +1,27 @@
+namespace rooibos
+ class BaseTestReporter
+
+ public testRunner = invalid
+ public config = invalid
+ public allStats = invalid
+
+ function new(testRunner)
+ m.testRunner = testRunner
+ m.config = testRunner.config
+ m.allStats = testRunner.stats
+ end function
+
+ function reportResults(allStats)
+ 'override me
+ end function
+
+ function testLogInfo(text)
+ 'override me
+ end function
+
+ function testLogError(text)
+ 'override me
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/BaseTestSuite.bs b/framework/src/source/BaseTestSuite.bs
new file mode 100644
index 00000000..913bb0f7
--- /dev/null
+++ b/framework/src/source/BaseTestSuite.bs
@@ -0,0 +1,2089 @@
+namespace rooibos
+ ' /**
+ ' * @module TestSuite
+ ' * @description All brs files that include `'@TestSuite` annotations automatically extend the TestSuite.
+ ' * The base test suite contains all of the assertions, and utility methods required to writey our tests, as well as being responsible for tracking the state of the tests and groups.
+ ' */
+ class BaseTestSuite
+
+ 'test state
+ name = "BaseTestSuite" 'set the name to the name of your test
+
+ filePath = invalid
+ pkgPath = invalid
+ isValid = false
+ hasSoloTests = false
+ hasIgnoredTests = false
+ isSolo = false
+ isIgnored = false
+ noCatch = false
+ isNodeTest = false
+ nodeName = invalid
+ lineNumber = 1
+ groups = []
+ groupsData = []
+ stats = invalid
+ currentAssertLineNumber = -1
+
+ 'special values
+ invalidValue = "#ROIBOS#INVALID_VALUE" ' special value used in mock arguments
+ ignoreValue = "#ROIBOS#IGNORE_VALUE" ' special value used in mock arguments
+
+ 'built in any matchers
+ anyStringMatcher = { "matcher": Rooibos_Matcher_anyString }
+ anyBoolMatcher = { "matcher": Rooibos_Matcher_anyBool }
+ anyNumberMatcher = { "matcher": Rooibos_Matcher_anyNumber }
+ anyAAMatcher = { "matcher": Rooibos_Matcher_anyAA }
+ anyArrayMatcher = { "matcher": Rooibos_Matcher_anyArray }
+ anyNodeMatcher = { "matcher": Rooibos_Matcher_anyNode }
+ allowNonExistingMethodsOnMocks = true
+ isAutoAssertingMocks = true
+
+ currentResult = invalid
+
+ protected global = invalid
+ public catchCrashes = false
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ base methods to override
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ function new()
+ data = m.getTestSuitedata()
+ if data = invalid
+ ? "ERROR RETRIEVING TEST SUITE DATA!! this is a rooibos BUG - please report the suite that resulted in a corrupt test. Thanks"
+ else
+ m.name = data.name
+ m.filePath = data.filePath
+ m.pkgPath = data.pkgPath
+ m.valid = data.valid
+ m.hasFailures = data.hasFailures
+ m.hasSoloTests = data.hasSoloTests
+ m.hasIgnoredTests = data.hasIgnoredTests
+ m.hasSoloGroups = data.hasSoloGroups
+ m.isSolo = data.isSolo
+ m.isIgnored = data.isIgnored
+ m.noCatch = data.noCatch
+ m.groupsData = data.testGroups
+ m.lineNumber = data.lineNumber
+ m.isNodeTest = data.isNodeTest
+ m.nodeName = data.nodeName
+ m.isFailingFast = false
+ m.stats = new Stats()
+ end if
+ end function
+
+ function getTestSuiteData()
+ 'this will be injected by the plugin
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ used for entire suite - use annotations to use elsewhere
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ protected function setup()
+ end function
+
+ protected function tearDown()
+ end function
+
+ protected function beforeEach()
+ end function
+
+ protected function afterEach()
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ running
+ '++++++++++++++++++++++++++++++++++++?+++++++++++++++++++++++++
+
+ function run()
+ for each groupData in m.groupsData
+ 'bs:disable-next-line
+
+ group = new TestGroup(m, groupData)
+ ? ""
+ ? rooibos.common.fillText(">>>> Describe: " + group.name, ">", 80)
+ ? ` Location: file://${group.testSuite.filePath.trim()}:${group.lineNumber}`
+ ? ""
+
+ m.groups.push(group)
+ group.run()
+
+ m.stats.merge(group.stats)
+
+ if m.stats.hasFailures and m.isFailingFast = true
+ ? "Terminating suite due to failed group"
+ exit for
+ end if
+
+ end for
+ end function
+
+ function runTest(test)
+ ? ""
+ ? rooibos.common.fillText(">>>>>> It: " + test.name, ">", 80)
+ ? ` Location: file://${test.testSuite.filePath.trim()}:${test.lineNumber}`
+ ? ""
+
+ m.currentResult = test.result
+ if m.catchCrashes and not test.noCatch and not m.noCatch
+ try
+ test.run()
+ if m.isAutoAssertingMocks = true
+ m.AssertMocks()
+ m.CleanMocks()
+ m.CleanStubs()
+ end if
+ catch error
+ m.currentResult.crash("test crashed!", error)
+ end try
+ else
+ test.run()
+ if m.isAutoAssertingMocks = true
+ m.AssertMocks()
+ m.CleanMocks()
+ m.CleanStubs()
+ end if
+ end if
+
+ ? rooibos.common.fillText("<<<< END It: " + test.name + " (" + m.currentResult.getStatusText() + ") ", "<", 80)
+
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ Assertions
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name fail
+ ' * @function
+ ' * @instance
+ ' * @description Fail immediately, with the given message
+ ' * @param {Dynamic} [msg=""] - message to display in the test report
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function fail(msg = "Error") as dynamic
+ if m.currentResult.isFail then return false
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertFalse
+ ' * @function
+ ' * @instance
+ ' * @description Fail the test if the expression is true.
+ ' * @param {Dynamic} expr - An expression to evaluate.
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' Default value: "Expression evaluates to true"' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertFalse(expr, msg = "Expression evaluates to true") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isBoolean(expr)
+ if expr
+ return m.fail(msg)
+ end if
+ else
+ return m.fail("value was not a boolean")
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertTrue
+ ' * @function
+ ' * @instance
+ ' * @description Fail the test unless the expression is true.
+ ' * @param {Dynamic} expr - An expression to evaluate.
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertTrue(expr, msg = "Expression evaluates to false")
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isBoolean(expr)
+ if not expr
+ return m.fail(msg)
+ end if
+ else
+ return m.fail("value was not a boolean")
+ end if
+
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertEqual
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the two objects are unequal as determined by the '<>' operator.
+ ' * @param {Dynamic} first - first object to compare
+ ' * @param {Dynamic} second - second object to compare
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertEqual(first, second, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if not Rooibos.Common.eqValues(first, second)
+ if msg = ""
+ first_as_string = Rooibos.Common.asString(first)
+ second_as_string = Rooibos.Common.asString(second)
+ msg = first_as_string + " != " + second_as_string
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertLike
+ ' * @function
+ ' * @instance
+ ' * @description does a fuzzy comparison
+ ' * @param {Dynamic} first - first object to compare
+ ' * @param {Dynamic} second - second object to compare
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertLike(first, second, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if first <> second
+ if msg = ""
+ first_as_string = Rooibos.Common.asString(first)
+ second_as_string = Rooibos.Common.asString(second)
+ msg = first_as_string + " != " + second_as_string
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNotEqual
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the two objects are equal as determined by the '=' operator.
+ ' * @param {Dynamic} first - first object to compare
+ ' * @param {Dynamic} second - second object to compare
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNotEqual(first, second, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.eqValues(first, second)
+ if msg = ""
+ first_as_string = Rooibos.Common.asString(first)
+ second_as_string = Rooibos.Common.asString(second)
+ msg = first_as_string + " == " + second_as_string
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertInvalid
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the value is not invalid.
+ ' * @param {Dynamic} value - value to check - value to check for
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertInvalid(value, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+
+ try
+ if value <> invalid
+ if msg = ""
+ expr_as_string = Rooibos.Common.asString(value)
+ msg = expr_as_string + " <> Invalid"
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNotInvalid
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the value is invalid.
+ ' * @param {Dynamic} value - value to check - value to check for
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNotInvalid(value, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if value = invalid
+ if msg = ""
+ expr_as_string = Rooibos.Common.asString(value)
+ msg = expr_as_string + " = Invalid"
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertAAHasKey
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array doesn't have the key.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} key - key name
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertAAHasKey(array, key, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(array)
+ if not array.DoesExist(key)
+ if msg = ""
+ msg = "Array doesn't have the '" + key + "' key."
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Associative Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertAANotHasKey
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array has the key.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} key - key name
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertAANotHasKey(array, key, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+
+ try
+ if Rooibos.Common.isAssociativeArray(array)
+ if array.DoesExist(key)
+ if msg = ""
+ msg = "Array has the '" + key + "' key."
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Associative Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertAAHasKeys
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array doesn't have the keys list.
+ ' * @param {Dynamic} array - A target associative array.
+ ' * @param {Dynamic} keys - Array of key names.
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertAAHasKeys(array, keys, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+
+ try
+ if Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isArray(keys)
+ for each key in keys
+ if not array.DoesExist(key)
+ if msg = ""
+ msg = "Array doesn't have the '" + key + "' key."
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end for
+ else
+ msg = "Input value is not an Associative Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertAANotHasKeys
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array has the keys list.
+ ' * @param {Dynamic} array - A target associative array.
+ ' * @param {Dynamic} keys - Array of key names.
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertAANotHasKeys(array, keys, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isArray(keys)
+ for each key in keys
+ if array.DoesExist(key)
+ if msg = ""
+ msg = "Array has the '" + key + "' key."
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end for
+ else
+ msg = "Input value is not an Associative Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayContains
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array doesn't have the item.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} value - value to check - value to check for
+ ' * @param {Dynamic} key - key name in associative array
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayContains(array, value, key = invalid, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
+ if not Rooibos.Common.arrayContains(array, value, key)
+ msg = "Array doesn't have the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayContainsAAs
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array does not contain all of the aa's in the values array.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} values - array of aas to look for in target array
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayContainsAAs(array, values, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if not Rooibos.Common.isArray(values)
+ msg = "values to search for are not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+
+ if Rooibos.Common.isArray(array)
+ for each value in values
+ isMatched = false
+ if not Rooibos.Common.isAssociativeArray(value)
+ msg = "Value to search for was not associativeArray " + Rooibos.Common.asString(value)
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ for each item in array
+ if Rooibos.Common.IsAssociativeArray(item)
+ isValueMatched = true
+ for each key in value
+ fieldValue = value[key]
+ itemValue = item[key]
+ if not Rooibos.Common.eqValues(fieldValue, itemValue)
+ isValueMatched = false
+ exit for
+ end if
+ end for
+ if isValueMatched
+ isMatched = true
+ exit for
+ end if
+ end if
+ end for ' items in array
+
+ if not isMatched
+ msg = "array missing value: " + Rooibos.Common.asString(value)
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+
+ end for 'values to match
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayNotContains
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array has the item.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} value - value to check - Value to check for
+ ' * @param {Dynamic} key - A key name for associative array.
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayNotContains(array, value, key = invalid, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
+ if Rooibos.Common.arrayContains(array, value, key)
+ msg = "Array has the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayContainsSubset
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array doesn't have the item subset.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} subset - items to check presnece of
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayContainsSubset(array, subset, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if (Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isAssociativeArray(subset)) or (Rooibos.Common.isArray(array) and Rooibos.Common.isArray(subset))
+ isAA = Rooibos.Common.isAssociativeArray(subset)
+ for each item in subset
+ key = invalid
+ value = item
+ if isAA
+ key = item
+ value = subset[key]
+ end if
+ if not Rooibos.Common.arrayContains(array, value, key)
+ msg = "Array doesn't have the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end for
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayNotContainsSubset
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array have the item from subset.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} subset - items to check presnece of
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayNotContainsSubset(array, subset, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if (Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isAssociativeArray(subset)) or (Rooibos.Common.isArray(array) and Rooibos.Common.isArray(subset))
+ isAA = Rooibos.Common.isAssociativeArray(subset)
+ for each item in subset
+ key = invalid
+ value = item
+ if isAA
+ key = item
+ value = item[key]
+ end if
+ if Rooibos.Common.arrayContains(array, value, key)
+ msg = "Array has the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end for
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayCount
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array items count <> expected count
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} count - An expected array items count
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayCount(array, count, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
+ if array.Count() <> count
+ msg = "Array items count " + Rooibos.Common.asString(array.Count()) + " <> " + Rooibos.Common.asString(count) + "."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayNotCount
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array items count = expected count.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} count - An expected array items count.
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayNotCount(array, count, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
+ if array.Count() = count
+ msg = "Array items count = " + Rooibos.Common.asString(count) + "."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertEmpty
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the item is not empty array or string.
+ ' * @param {Dynamic} item - item to check
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertEmpty(item, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(item) or Rooibos.Common.isArray(item)
+ if item.count() > 0
+ msg = "Array is not empty."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else if Rooibos.Common.isString(item)
+ if Rooibos.Common.asString(item) <> ""
+ msg = "Input value is not empty."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "AssertEmpty: Input value was not an array or a string"
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNotEmpty
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the item is empty array or string.
+ ' * @param {Dynamic} item - item to check
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNotEmpty(item, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(item) or Rooibos.Common.isArray(item)
+ if item.count() = 0
+ msg = "Array is empty."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else if Rooibos.Common.isString(item)
+ if item = ""
+ msg = "Input value is empty."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not a string or array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertArrayContainsOnlyValuesOfType
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the array doesn't contains items of specific type only.
+ ' * @param {Dynamic} array - target array
+ ' * @param {Dynamic} typeStr - type name - must be String, Array, Boolean, or AssociativeArray
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertArrayContainsOnlyValuesOfType(array, typeStr, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+
+ if typeStr <> "String" and typeStr <> "Integer" and typeStr <> "Boolean" and typeStr <> "Array" and typeStr <> "AssociativeArray"
+ msg = "Type must be Boolean, String, Array, Integer, or AssociativeArray"
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+
+ if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
+ methodName = "Rooibos_Common_Is" + typeStr
+ typeCheckFunction = m.getIsTypeFunction(methodName)
+ if typeCheckFunction <> invalid
+ for each item in array
+ if not typeCheckFunction(item)
+ msg = Rooibos.Common.asString(item) + "is not a '" + typeStr + "' type."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end for
+ else
+ msg = "could not find comparator for type '" + typeStr + "' type."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Array."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ function getIsTypeFunction(name)
+ if name = "Rooibos_Common_IsFunction"
+ return Rooibos.Common.isFunction
+ else if name = "Rooibos_Common_IsXmlElement"
+ return Rooibos.Common.isXmlElement
+ else if name = "Rooibos_Common_IsInteger"
+ return Rooibos.Common.isInteger
+ else if name = "Rooibos_Common_IsBoolean"
+ return Rooibos.Common.isBoolean
+ else if name = "Rooibos_Common_IsFloat"
+ return Rooibos.Common.isFloat
+ else if name = "Rooibos_Common_IsDouble"
+ return Rooibos.Common.isDouble
+ else if name = "Rooibos_Common_IsLongInteger"
+ return Rooibos.Common.isLongInteger
+ else if name = "Rooibos_Common_IsNumber"
+ return Rooibos.Common.isNumber
+ else if name = "Rooibos_Common_IsList"
+ return Rooibos.Common.isList
+ else if name = "Rooibos_Common_IsArray"
+ return Rooibos.Common.isArray
+ else if name = "Rooibos_Common_IsAssociativeArray"
+ return Rooibos.Common.isAssociativeArray
+ else if name = "Rooibos_Common_IsSGNode"
+ return Rooibos.Common.isSGNode
+ else if name = "Rooibos_Common_IsString"
+ return Rooibos.Common.isString
+ else if name = "Rooibos_Common_IsDateTime"
+ return Rooibos.Common.isDateTime
+ else if name = "Rooibos_Common_IsUndefined"
+ return Rooibos.Common.isUndefined
+ else
+ return invalid
+ end if
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertType
+ ' * @function
+ ' * @instance
+ ' * @description Asserts that the value is a node of designated type
+ ' * @param {Dynamic} value - value to check - target node
+ ' * @param {Dynamic} typeStr - type name
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertType(value, typeStr, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(value) <> typeStr
+ if msg = ""
+ expr_as_string = Rooibos.Common.asString(value)
+ msg = expr_as_string + " was not expected type " + typeStr
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertSubType
+ ' * @function
+ ' * @instance
+ ' * @description Asserts that the value is a node of designated subtype
+ ' * @param {Dynamic} value - value to check - target node
+ ' * @param {Dynamic} typeStr - type name
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertSubType(value, typeStr, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(value) <> "roSGNode"
+ if msg = ""
+ expr_as_string = Rooibos.Common.asString(value)
+ msg = expr_as_string + " was not a node, so could not match subtype " + typeStr
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ else if value.subType() <> typeStr
+ if msg = ""
+ expr_as_string = Rooibos.Common.asString(value)
+ msg = expr_as_string + "( type : " + value.subType() + ") was not of subType " + typeStr
+ end if
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ NEW NODE ASSERTS
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeCount
+ ' * @function
+ ' * @instance
+ ' * @description Asserts that the node contains the desginated number of children
+ ' * @param {Dynamic} node - target node
+ ' * @param {Dynamic} count - expected number of child items
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert w, false otherwise
+ ' */
+ function assertNodeCount(node, count, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(node) = "roSGNode"
+ if node.getChildCount() <> count
+ msg = "node items count <> " + Rooibos.Common.asString(count) + ". Received " + Rooibos.Common.asString(node.getChildCount())
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an node."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeNotCount
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the node items count = expected count.
+ ' * @param {Dynamic} node - A target node
+ ' * @param {Dynamic} count - Expected item count
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNodeNotCount(node, count, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(node) = "roSGNode"
+ if node.getChildCount() = count
+ msg = "node items count = " + Rooibos.Common.asString(count) + "."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an node."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeEmpty
+ ' * @function
+ ' * @instance
+ ' * @description Asserts the node has no children
+ ' * @param {Dynamic} node - a node to check
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNodeEmpty(node, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(node) = "roSGNode"
+ if node.getChildCount() > 0
+ msg = "node is not empty."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeNotEmpty
+ ' * @function
+ ' * @instance
+ ' * @description Asserts the node has children
+ ' * @param {Dynamic} node - a node to check
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNodeNotEmpty(node, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(node) = "roSGNode"
+ if node.Count() = 0
+ msg = "Array is empty."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeContains
+ ' * @function
+ ' * @instance
+ ' * @description Asserts the node contains the child _value_
+ ' * @param {Dynamic} node - a node to check
+ ' * @param {Dynamic} value - value to check - value to look for
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNodeContains(node, value, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(node) = "roSGNode"
+ if not Rooibos.Common.nodeContains(node, value)
+ msg = "Node doesn't have the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Node."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeContainsOnly
+ ' * @function
+ ' * @instance
+ ' * @description Asserts the node contains only the child _value_
+ ' * @param {Dynamic} node - a node to check
+ ' * @param {Dynamic} value - value to check - value to look for
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNodeContainsOnly(node, value, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(node) = "roSGNode"
+ if not Rooibos.Common.nodeContains(node, value)
+ msg = "Node doesn't have the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ else if node.getChildCount() <> 1
+ msg = "Node Contains speicified value; but other values as well"
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Node."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeNotContains
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the node h item.
+ ' * @param {Dynamic} node - A target node
+ ' * @param {Dynamic} value - value to check - a node child
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNodeNotContains(node, value, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if type(node) = "roSGNode"
+ if Rooibos.Common.nodeContains(node, value)
+ msg = "Node has the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ else
+ msg = "Input value is not an Node."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeContainsFields
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the node doesn't have the item subset.
+ ' * @param {Dynamic} node - A target node
+ ' * @param {Dynamic} subset - items to check
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertNodeContainsFields(node, subset, ignoredFields = invalid, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if (type(node) = "roSGNode" and Rooibos.Common.isAssociativeArray(subset)) or (type(node) = "roSGNode" and Rooibos.Common.isArray(subset))
+ isAA = Rooibos.Common.isAssociativeArray(subset)
+ isIgnoredFields = Rooibos.Common.isArray(ignoredFields)
+ for each key in subset
+ if key <> ""
+ if not isIgnoredFields or not Rooibos.Common.arrayContains(ignoredFields, key)
+ subsetValue = subset[key]
+ nodeValue = node[key]
+ if not Rooibos.Common.eqValues(nodeValue, subsetValue)
+ msg = key + ": Expected '" + Rooibos.Common.asString(subsetValue) + "', got '" + Rooibos.Common.asString(nodeValue) + "'"
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end if
+ else
+ ? "Found empty key!"
+ end if
+ end for
+ else
+ msg = "Input value is not an Node."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertNodeNotContainsFields
+ ' * @function
+ ' * @instance
+ ' * @description Fail if the node have the item from subset.
+ ' * @param {Dynamic} node - A target node
+ ' * @param {Dynamic} subset - the items to check for
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert w, false otherwise
+ ' */
+ function assertNodeNotContainsFields(node, subset, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if (type(node) = "roSGNode" and Rooibos.Common.isAssociativeArray(subset)) or (type(node) = "roSGNode" and Rooibos.Common.isArray(subset))
+ isAA = Rooibos.Common.isAssociativeArray(subset)
+ for each item in subset
+ key = invalid
+ value = item
+ if isAA
+ key = item
+ value = item[key]
+ end if
+ if Rooibos.Common.nodeContains(node, value)
+ msg = "Node has the '" + Rooibos.Common.asString(value) + "' value."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end for
+ else
+ msg = "Input value is not an Node."
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ END NODE ASSERTS
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertAAContainsSubset
+ ' * @function
+ ' * @instance
+ ' * @description Asserts the associative array contains the fields contained in subset; while ignoring the fields in the ignoredFields array
+ ' * @param {Dynamic} array - associative array to check
+ ' * @param {Dynamic} subset - associative array of values to check for
+ ' * @param {Dynamic} ignoredFields - array of fieldnames to ignore while comparing
+ ' * @param {Dynamic} [msg=""] - alternate error message
+ ' * @returns {boolean} - true if the assert was satisfied, false otherwise
+ ' */
+ function assertAAContainsSubset(array, subset, ignoredFields = invalid, msg = "") as dynamic
+ if m.currentResult.isFail then return false
+ try
+ if Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isAssociativeArray(subset)
+ isAA = Rooibos.Common.isAssociativeArray(subset)
+ isIgnoredFields = Rooibos.Common.isArray(ignoredFields)
+ for each key in subset
+ if key <> ""
+ if not isIgnoredFields or not Rooibos.Common.arrayContains(ignoredFields, key)
+ subsetValue = subset[key]
+ arrayValue = array[key]
+ if not Rooibos.Common.eqValues(arrayValue, subsetValue)
+ msg = key + ": Expected '" + Rooibos.Common.asString(subsetValue) + "', got '" + Rooibos.Common.asString(arrayValue) + "'"
+ m.currentResult.fail(msg, m.currentAssertLineNumber)
+ return false
+ end if
+ end if
+ else
+ ? "Found empty key!"
+ end if
+ end for
+ else
+ msg = "Input values are not an Associative Array."
+
+ return false
+ end if
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Assert failed: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ Stubbing helpers
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name stub
+ ' * @function
+ ' * @instance
+ ' * @description Creates a stub to replace a real method with
+ ' * @param {Dynamic} target - object on which the method to be stubbed is found
+ ' * @param {Dynamic} methodName - name of method to stub
+ ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
+ ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
+ ' * @returns {Object} - stub that was wired into the real method
+ ' */
+ function stub(target, methodName, returnValue = invalid, allowNonExistingMethods = false) as object
+ if type(target) <> "roAssociativeArray"
+ m.fail("could not create Stub provided target was null")
+ return {}
+ end if
+
+ if m.stubs = invalid
+ m.__stubId = -1
+ m.stubs = {}
+ end if
+ m.__stubId++
+
+ if m.__stubId > 5
+ ? "ERROR ONLY 6 STUBS PER TEST ARE SUPPORTED!!"
+ return invalid
+ end if
+
+ id = stri(m.__stubId).trim()
+
+ fake = m.createFake(id, target, methodName, 1, invalid, returnValue)
+ m.stubs[id] = fake
+ allowNonExisting = m.allowNonExistingMethodsOnMocks = true or allowNonExistingMethods
+ isMethodPresent = type(target[methodName]) = "Function" or type(target[methodName]) = "roFunction"
+ if isMethodPresent or allowNonExisting
+ target[methodName] = m["StubCallback" + id]
+ target.__stubs = m.stubs
+
+ if not isMethodPresent
+ ? "WARNING - stubbing call " ; methodName; " which did not exist on target object"
+ end if
+ else
+ ? "ERROR - could not create Stub : method not found "; target ; "." ; methodName
+ end if
+
+ return fake
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name expectOnce
+ ' * @function
+ ' * @instance
+ ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked the wrong number of times, or with wrong arguments, it will result in test failure
+ ' * @param {Dynamic} target - object on which the method to be stubbed is found
+ ' * @param {Dynamic} methodName - name of method to stub
+ ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
+ ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
+ ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
+ ' * @returns {Object} - mock that was wired into the real method
+ ' */
+ function expectOnce(target, methodName, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
+ try
+ return m.mock(target, methodName, 1, expectedArgs, returnValue, allowNonExistingMethods)
+ catch error
+ m.currentResult.fail("Setting up mock failed: " + error.message, m.currentAssertLineNumber)
+ return invalid
+ end try
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name expectOnceOrNone
+ ' * @function
+ ' * @instance
+ ' * @description Toggles between expectOnce and expectNone, to allow for easy paremeterized expect behaviour
+ ' * @param {Dynamic} target - object on which the method to be stubbed is found
+ ' * @param {Dynamic} methodName - name of method to stub
+ ' * @param {Dynamic} isExpected - if true, then this is the same as expectOnce, if false, then this is the same as expectNone
+ ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
+ ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
+ ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
+ ' * @returns {Object} - mock that was wired into the real method
+ ' */
+ function expectOnceOrNone(target, methodName, isExpected, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
+ try
+ if isExpected
+ return m.expectOnce(target, methodName, expectedArgs, returnValue, allowNonExistingMethods)
+ else
+ return m.expectNone(target, methodName, allowNonExistingMethods)
+ end if
+ catch error
+ m.currentResult.fail("Setting up mock failed: " + error.message, m.currentAssertLineNumber)
+ return invalid
+ end try
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name expectNone
+ ' * @function
+ ' * @instance
+ ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked, it will result in test failure
+ ' * @param {Dynamic} target - object on which the method to be stubbed is found
+ ' * @param {Dynamic} methodName - name of method to stub
+ ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
+ ' * @returns {Object} - mock that was wired into the real method
+ ' */
+ function expectNone(target, methodName, allowNonExistingMethods = false) as object
+ try
+ return m.mock(target, methodName, 0, invalid, invalid, allowNonExistingMethods)
+ catch error
+ m.currentResult.fail("Setting up mock failed: " + error.message, m.currentAssertLineNumber)
+ return invalid
+ end try
+
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name expect
+ ' * @function
+ ' * @instance
+ ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked the wrong number of times, or with wrong arguments, it will result in test failure
+ ' * @param {Dynamic} target - object on which the method to be stubbed is found
+ ' * @param {Dynamic} methodName - name of method to stub
+ ' * @param {Dynamic} [expectedInvocations=1] - number of invocations we expect
+ ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
+ ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
+ ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
+ ' * @returns {Object} - mock that was wired into the real method
+ ' */
+ function expect(target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
+ try
+ return m.mock(target, methodName, expectedInvocations, expectedArgs, returnValue, allowNonExistingMethods)
+ catch error
+ m.currentResult.fail("Setting up mock failed: " + error.message, m.currentAssertLineNumber)
+ return invalid
+ end try
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name mock
+ ' * @function
+ ' * @instance
+ ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked the wrong number of times, or with wrong arguments, it will result in test failure
+ ' * @param {Dynamic} target - object on which the method to be stubbed is found
+ ' * @param {Dynamic} methodName - name of method to stub
+ ' * @param {Dynamic} expectedInvocations - number of invocations we expect
+ ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
+ ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
+ ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
+ ' * @returns {Object} - mock that was wired into the real method
+ ' */
+ function mock(target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
+ lineNumber = m.currentAssertLineNumber
+ 'check params
+ if not Rooibos.Common.isAssociativeArray(target)
+ methodName = ""
+ m.mockFail(lineNumber, "", "mock args: target was not an AA")
+ else if not Rooibos.Common.isString(methodName)
+ methodName = ""
+ m.mockFail(lineNumber, "", "mock args: methodName was not a string")
+ else if not Rooibos.Common.isNumber(expectedInvocations)
+ m.mockFail(lineNumber, methodName, "mock args: expectedInvocations was not an int")
+ else if not Rooibos.Common.isArray(expectedArgs) and Rooibos.Common.isValid(expectedArgs)
+ m.mockFail(lineNumber, methodName, "mock args: expectedArgs was not invalid or an array of args")
+ else if Rooibos.Common.isUndefined(expectedArgs)
+ m.mockFail(lineNumber, methodName, "mock args: expectedArgs undefined")
+ else if Rooibos.Common.isUndefined(returnValue)
+ m.mockFail(lineNumber, methodName, "mock args: returnValue undefined")
+ end if
+
+ if m.currentResult.isFail
+ ? "ERROR! Cannot create MOCK. method " ; methodName ;" " str(lineNumber) ; " "; m.currentResult.message
+ return {}
+ end if
+
+ if m.mocks = invalid
+ m.__mockId = -1
+ m.__mockTargetId = -1
+ m.mocks = {}
+ end if
+
+ fake = invalid
+ if not target.doesExist("__rooibosTargetId")
+ m.__mockTargetId++
+ target["__rooibosTargetId"] = m.__mockTargetId
+ end if
+ 'ascertain if mock already exists
+ for i = 0 to m.__mockId
+ id = stri(i).trim()
+ mock = m.mocks[id]
+ if mock <> invalid and mock.methodName = methodName and mock.target.__rooibosTargetId = target.__rooibosTargetId
+ fake = mock
+ fake.lineNumbers.push(lineNumber)
+ exit for
+ end if
+ end for
+ if fake = invalid
+ m.__mockId++
+ id = stri(m.__mockId).trim()
+ if m.__mockId > 25
+ ? "ERROR ONLY 25 MOCKS PER TEST ARE SUPPORTED!! you're on # " ; m.__mockId
+ ? " Method was " ; methodName
+ return invalid
+ end if
+
+ fake = m.createFake(id, target, methodName, expectedInvocations, expectedArgs, returnValue)
+ m.mocks[id] = fake 'this will bind it to m
+ allowNonExisting = m.allowNonExistingMethodsOnMocks = true or allowNonExistingMethods
+ isMethodPresent = type(target[methodName]) = "Function" or type(target[methodName]) = "roFunction"
+ if isMethodPresent or allowNonExisting
+ target[methodName] = m["MockCallback" + id]
+ target.__mocks = m.mocks
+
+ if not isMethodPresent
+ ' ? "WARNING - mocking call " ; methodName; " which did not exist on target object"
+ end if
+ else
+ ? "ERROR - could not create Mock : method not found "; target ; "." ; methodName
+ end if
+ else
+ m.combineFakes(fake, m.createFake(id, target, methodName, expectedInvocations, expectedArgs, returnValue))
+ end if
+ return fake
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name createFake
+ ' * @function
+ ' * @instance
+ ' * @description Creates a stub to replace a real method with. This is used internally.
+ ' * @param {Dynamic} target - object on which the method to be stubbed is found
+ ' * @param {Dynamic} methodName - name of method to stub
+ ' * @param {Dynamic} [expectedInvocations=1] - number of invocations we expect
+ ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
+ ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
+ ' * @returns {Object} - stub that was wired into the real method
+ ' */
+ function createFake(id, target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid) as object
+ expectedArgsValues = []
+ lineNumber = m.currentAssertLineNumber
+ hasArgs = Rooibos.Common.isArray(expectedArgs)
+ if hasArgs
+ defaultValue = m.invalidValue
+ else
+ defaultValue = m.ignoreValue
+ expectedArgs = []
+ end if
+ lineNumbers = [lineNumber]
+
+ for i = 0 to 9
+ if hasArgs and expectedArgs.count() > i
+ 'guard against bad values
+ value = expectedArgs[i]
+ if not Rooibos.Common.isUndefined(value)
+ if Rooibos.Common.isAssociativeArray(value) and Rooibos.Common.isValid(value.matcher)
+ if not Rooibos.Common.isFunction(value.matcher)
+ ? "[ERROR] you have specified a matching function; but it is not in scope!"
+ expectedArgsValues.push("#ERR-OUT_OF_SCOPE_MATCHER!")
+ else
+ expectedArgsValues.push(expectedArgs[i])
+ end if
+ else
+ expectedArgsValues.push(expectedArgs[i])
+ end if
+ else
+ expectedArgsValues.push("#ERR-UNDEFINED!")
+ end if
+ else
+ expectedArgsValues.push(defaultValue)
+ end if
+ end for
+ fake = {
+ id: id,
+ target: target,
+ methodName: methodName,
+ returnValue: returnValue,
+ lineNumbers: lineNumbers,
+ isCalled: false,
+ invocations: 0,
+ invokedArgs: [invalid, invalid, invalid, invalid, invalid, invalid, invalid, invalid, invalid],
+ expectedArgs: expectedArgsValues,
+ expectedInvocations: expectedInvocations,
+ callback: function(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ ' ? "FAKE CALLBACK CALLED FOR " ; m.methodName
+ if m.allInvokedArgs = invalid
+ m.allInvokedArgs = []
+ end if
+ m.invokedArgs = [arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15]
+ m.allInvokedArgs.push ([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15])
+ m.isCalled = true
+ m.invocations++
+
+ if type(m.returnValue) = "roAssociativeArray" and m.returnValue.doesExist("multiResult")
+ returnValues = m.returnValue["multiResult"]
+ returnIndex = m.invocations - 1
+
+ if type(returnValues) = "roArray" and returnValues.count() > 0
+
+ if returnValues.count() <= m.invocations
+ returnIndex = returnValues.count() - 1
+ print "Multi return values all used up - repeating last value"
+ end if
+ return returnValues[returnIndex]
+ else
+ ? "Multi return value was specified; but no array of results were found"
+ return invalid
+ end if
+ else
+ return m.returnValue
+ end if
+ end function
+ }
+ return fake
+ end function
+
+ function combineFakes(fake, otherFake)
+ 'add on the expected invoked args
+ lineNumber = m.currentAssertLineNumber
+ if type(fake.expectedArgs) <> "roAssociativeArray" or not fake.expectedArgs.doesExist("multiInvoke")
+ currentExpectedArgsArgs = fake.expectedArgs
+ fake.expectedArgs = {
+ "multiInvoke": [currentExpectedArgsArgs]
+ }
+ end if
+ fake.expectedArgs.multiInvoke.push(otherFake.expectedArgs)
+
+ 'add on the expected return values
+ if type(fake.returnValue) <> "roAssociativeArray" or not fake.returnValue.doesExist("multiResult")
+ currentReturnValue = fake.returnValue
+ fake.returnValue = {
+ "multiResult": [currentReturnValue]
+ }
+ end if
+ fake.returnValue.multiResult.push(otherFake.returnValue)
+ fake.lineNumbers.push(lineNumber)
+ fake.expectedInvocations++
+ end function
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name assertMocks
+ ' * @function
+ ' * @instance
+ ' * @description Will check all mocks that have been created to ensure they were invoked the expected amount of times, with the expected args.
+ ' */
+ function assertMocks() as void
+ if m.__mockId = invalid or not Rooibos.Common.isAssociativeArray(m.mocks)
+ return
+ end if
+
+ lastId = int(m.__mockId)
+ for each id in m.mocks
+ mock = m.mocks[id]
+ methodName = mock.methodName
+ if mock.expectedInvocations <> mock.invocations
+ m.mockFail(mock.lineNumbers[0], methodName, "Wrong number of calls. (" + stri(mock.invocations).trim() + " / " + stri(mock.expectedInvocations).trim() + ")")
+ m.cleanMocks()
+ return
+ else if mock.expectedInvocations > 0 and (Rooibos.Common.isArray(mock.expectedArgs) or (type(mock.expectedArgs) = "roAssociativeArray" and Rooibos.Common.isArray(mock.expectedArgs.multiInvoke)))
+ isMultiArgsSupported = type(mock.expectedArgs) = "roAssociativeArray" and Rooibos.Common.isArray(mock.expectedArgs.multiInvoke)
+
+ for invocationIndex = 0 to mock.invocations - 1
+ invokedArgs = mock.allInvokedArgs[invocationIndex]
+ if isMultiArgsSupported
+ expectedArgs = mock.expectedArgs.multiInvoke[invocationIndex]
+ else
+ expectedArgs = mock.expectedArgs
+ end if
+ for i = 0 to expectedArgs.count() - 1
+ value = invokedArgs[i]
+ expected = expectedArgs[i]
+ didNotExpectArg = Rooibos.Common.isString(expected) and expected = m.invalidValue
+ if didNotExpectArg
+ expected = invalid
+ end if
+
+ isUsingMatcher = Rooibos.Common.isAssociativeArray(expected) and Rooibos.Common.isFunction(expected.matcher)
+
+ if isUsingMatcher
+ if not expected.matcher(value)
+ m.mockFail(mock.lineNumbers[invocationIndex], methodName, "on Invocation #" + stri(invocationIndex).trim() + ", expected arg #" + stri(i).trim() + " to match matching function '" + Rooibos.Common.asString(expected.matcher) + "' got '" + Rooibos.Common.asString(value) + "')")
+ m.cleanMocks()
+ end if
+ else
+ if not (Rooibos.Common.isString(expected) and expected = m.ignoreValue) and not Rooibos.Common.eqValues(value, expected)
+ if expected = invalid
+ expected = "[INVALID]"
+ end if
+
+ m.mockFail(mock.lineNumbers[invocationIndex], methodName, "on Invocation #" + stri(invocationIndex).trim() + ", expected arg #" + stri(i).trim() + " to be '" + Rooibos.Common.asString(expected) + "' got '" + Rooibos.Common.asString(value) + "')")
+ m.cleanMocks()
+ return
+ end if
+ end if
+ end for
+ end for
+ end if
+ end for
+
+ m.cleanMocks()
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name cleanMocks
+ ' * @function
+ ' * @instance
+ ' * @description Cleans up all tracking data associated with mocks
+ ' */
+ function cleanMocks() as void
+ if m.mocks = invalid then return
+ for each id in m.mocks
+ mock = m.mocks[id]
+ mock.target.__mocks = invalid
+ end for
+ m.mocks = invalid
+ end function
+
+ ' /**
+ ' * @memberof module:BaseTestSuite
+ ' * @name cleanStubs
+ ' * @function
+ ' * @instance
+ ' * @description Cleans up all tracking data associated with stubs
+ ' */
+ function cleanStubs() as void
+ if m.stubs = invalid then return
+ for each id in m.stubs
+ stub = m.stubs[id]
+ stub.target.__stubs = invalid
+ end for
+ m.stubs = invalid
+ end function
+
+
+ function mockFail(lineNumber, methodName, message) as dynamic
+ if m.currentResult.isFail then return false
+ m.currentResult.fail("mock failure on '" + methodName + "' : " + message, lineNumber)
+ return false
+ end function
+
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ Fake Stub callback functions - this is required to get scope
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ function stubCallback0(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__Stubs["0"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function stubCallback1(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__Stubs["1"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function stubCallback2(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__Stubs["2"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+
+ function stubCallback3(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__Stubs["3"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+
+ function stubCallback4(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__Stubs["4"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+
+ function stubCallback5(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__Stubs["5"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ Fake Mock callback functions - this is required to get scope
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ function mockCallback0(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["0"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback1(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["1"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback2(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["2"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback3(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["3"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback4(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["4"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback5(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["5"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback6(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["6"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback7(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["7"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback8(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["8"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback9(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["9"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback10(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["10"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback11(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["11"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback12(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["12"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback13(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["13"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback14(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["14"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback15(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["15"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback16(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["16"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback17(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["17"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback18(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["18"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback19(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["19"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback20(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["20"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback21(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["21"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback22(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["22"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback23(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["23"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ function mockCallback24(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid, arg10 = invalid, arg11 = invalid, arg12 = invalid, arg13 = invalid, arg14 = invalid, arg15 = invalid)as dynamic
+ fake = m.__mocks["24"]
+ return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ crude async support
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ ' /**
+ ' * @member waitForField
+ ' * @memberof module:TestUtils
+ ' * @instance
+ ' * @function
+ ' * @description observeField doesn't work in regular unit tests, so we have to wait for the result. We can use this to wait for a network task, foe example, and pass the result directly to a handler. Note - we wait for the value TO CHANGE - so make sure that will be the case, or you'll get stuck forever :)
+ ' * @param {any} target to observe
+ ' * @param {string} field to observe
+ ' * @param {int} delay for each wait
+ ' * @param {int} max attempts
+ ' */
+ function waitForField(target, fieldName, delay = 500, maxAttempts = 10)
+ attempts = 0
+ if target = invalid
+ return false
+ end if
+
+ initialValue = target[fieldName]
+ while target[fieldName] = initialValue
+ port = CreateObject("roMessagePort")
+ wait(delay, port)
+ attempts++
+ if attempts = maxAttempts
+ return false
+ end if
+ ? "waiting for signal field '" ; fieldName "' - " ; attempts
+ end while
+
+ return true
+ end function
+
+ function wait(delay = 1)
+ port = CreateObject("roMessagePort")
+ wait(delay, port)
+ end function
+
+ function assertAsyncField(target, fieldName, delay = 500, maxAttempts = 10)
+ try
+ if m.currentResult.isFail then return false
+ if target = invalid
+ m.fail("Target was invalid")
+ end if
+
+ result = m.waitForField(target, fieldName, delay, maxAttempts)
+ if not result
+ return m.fail("Timeout waiting for targetField " + fieldName + " to be set on target")
+ end if
+
+ m.currentResult.fail("", m.currentAssertLineNumber)
+ return true
+ catch error
+ m.currentResult.fail("Error while waiting: " + error.message, m.currentAssertLineNumber)
+ end try
+
+ end function
+
+ end class
+
+end namespace
\ No newline at end of file
diff --git a/src/source/CommonUtils.bs b/framework/src/source/CommonUtils.bs
similarity index 95%
rename from src/source/CommonUtils.bs
rename to framework/src/source/CommonUtils.bs
index 5e426ec8..da9ae4fb 100755
--- a/src/source/CommonUtils.bs
+++ b/framework/src/source/CommonUtils.bs
@@ -1,4 +1,4 @@
-namespace Rooibos.Common
+namespace rooibos.Common
' /**
' * @module CommonUtils
' */
@@ -41,13 +41,13 @@ namespace Rooibos.Common
' * @returns {Function} - function pointer or invalid
' */
function getFunction(filename, functionName) as object
- if (not Rooibos.Common.isNotEmptyString(functionName)) then return invalid
- if (not Rooibos.Common.isNotEmptyString(filename)) then return invalid
+ if not Rooibos.Common.isNotEmptyString(functionName) then return invalid
+ if not Rooibos.Common.isNotEmptyString(filename) then return invalid
'bs:disable-next-line
mapFunction = RBSFM_getFunctionsForFile(filename)
if mapFunction <> invalid
map = mapFunction()
- if (type(map) = "roAssociativeArray")
+ if type(map) = "roAssociativeArray"
functionPointer = map[functionName]
return functionPointer
else
@@ -69,7 +69,7 @@ namespace Rooibos.Common
' * @returns {Function} - function pointer or invalid
' */
function getFunctionBruteForce(functionName) as object
- if (not Rooibos.Common.isNotEmptyString(functionName)) then return invalid
+ if not Rooibos.Common.isNotEmptyString(functionName) then return invalid
'bs:disable-next-line
filenames = RBSFM_getFilenames()
for i = 0 to filenames.count() - 1
@@ -78,7 +78,7 @@ namespace Rooibos.Common
mapFunction = RBSFM_getFunctionsForFile(filename)
if mapFunction <> invalid
map = mapFunction()
- if (type(map) = "roAssociativeArray")
+ if type(map) = "roAssociativeArray"
functionPointer = map[functionName]
if functionPointer <> invalid
return functionPointer
@@ -300,7 +300,7 @@ namespace Rooibos.Common
else if type(input) = "roAssociativeArray"
isFirst = true
text = "{"
- if (not isFirst)
+ if not isFirst
text = text + ","
isFirst = false
end if
@@ -603,8 +603,8 @@ namespace Rooibos.Common
return Rooibos.Common.eqAssocArray(Value1, Value2)
else if valtype = "roArray"
return Rooibos.Common.eqArray(Value1, Value2)
- else if (valtype = "roSGNode")
- if (val2Type <> "roSGNode")
+ else if valtype = "roSGNode"
+ if val2Type <> "roSGNode"
return false
else
return Value1.isSameNode(Value2)
@@ -693,7 +693,7 @@ namespace Rooibos.Common
' * @returns {string} filled string
' */
function fillText(text as string, fillChar = " ", numChars = 40) as string
- if (len(text) >= numChars)
+ if len(text) >= numChars
text = left(text, numChars - 5) + "..." + fillChar + fillChar
else
numToFill = numChars - len(text) - 1
@@ -704,16 +704,4 @@ namespace Rooibos.Common
return text
end function
-
- 'Static, becuase the result might be created across node boundaries, therefore stripping methods
- function getAssertLine(testCase, index)
- if (testCase.assertLineNumberMap.doesExist(stri(index).trim()))
- return testCase.assertLineNumberMap[stri(index).trim()]
- else if (testCase.assertLineNumberMap.doesExist(stri(index + 1000).trim()))
- 'this is where we store line numbers for our
- return testCase.assertLineNumberMap[stri(index + 1000).trim()]
-
- return testCase.lineNumber
- end if
- end function
end namespace
\ No newline at end of file
diff --git a/framework/src/source/ConsoleTestReporter.bs b/framework/src/source/ConsoleTestReporter.bs
new file mode 100644
index 00000000..d4f39302
--- /dev/null
+++ b/framework/src/source/ConsoleTestReporter.bs
@@ -0,0 +1,198 @@
+namespace rooibos
+ class ConsoleTestReporter extends BaseTestReporter
+
+ function new(testRunner)
+ super(testRunner)
+ if m.config.lineWidth <> invalid
+ m.lineWidth = m.config.lineWidth
+ else
+ m.lineWidth = 60
+ end if
+ end function
+
+ override function reportResults(allStats)
+ m.allStats = allStats
+ m.startReport()
+
+ for each testSuite in m.testRunner.testSuites
+ if not m.allStats.hasFailures or ((not m.config.showOnlyFailures) or testSuite.stats.failedCount > 0 or testSuite.stats.crashedCount > 0)
+ m.printSuiteStart(testSuite)
+
+ for each testGroup in testSuite.groups
+ m.printGroup(testGroup)
+ end for
+ end if
+ end for
+
+ m.printLine()
+
+ 'bs:disable-next-line
+ ignoredInfo = m.testRunner.runtimeConfig.getIgnoredTestInfo()
+ m.printLine(0, "Total: " + Rooibos.Common.AsString(m.allStats.ranCount))
+ m.printLine(0, " Passed: " + Rooibos.Common.AsString(m.allStats.passedCount))
+ m.printLine(0, " Crashed: " + Rooibos.Common.AsString(m.allStats.crashedCount))
+ m.printLine(0, " Failed: " + Rooibos.Common.AsString(m.allStats.failedCount))
+ m.printLine(0, " Ignored: " + Rooibos.Common.AsString(ignoredInfo.count))
+ m.printLine(0, " Time: " + Rooibos.Common.AsString(m.allStats.time) + "ms")
+ m.printLine()
+ m.printLine()
+
+ if ignoredInfo.count > 0
+ m.printLine(0, "IGNORED TESTS:")
+ for each ignoredItemName in ignoredInfo.items
+ m.printLine(1, ignoredItemName)
+ end for
+ m.printLine()
+ m.printLine()
+ end if
+
+ if m.allStats.hasFailures
+ overrallResult = "Fail"
+ else
+ overrallResult = "Success"
+ end if
+ m.printLine(0, "RESULT: " + overrallResult)
+ m.endReport()
+ end function
+
+ function printGroup(testGroup)
+ isGroupPrinted = false
+
+ for each test in testGroup.tests
+ if not m.allStats.hasFailures or ((not m.config.showOnlyFailures) or test.result.isFail)
+ if not isGroupPrinted
+ m.printGroupStart(testGroup)
+ isGroupPrinted = true
+ end if
+
+ m.printTest(test)
+ end if
+ end for
+
+ if isGroupPrinted
+ m.printLine(0, " |")
+ end if
+ end function
+
+ function printTest(test)
+
+ testLocationLine = StrI(test.lineNumber).trim()
+
+ locationLine = invalid
+ if test.result.isCrash
+ testChar = "|"
+ locationLine = StrI(test.lineNumber).trim()
+ else if test.result.isFail
+ testChar = "-"
+ locationLine = StrI(test.result.lineNumber + 1).trim()
+ else
+ testChar = "|"
+ locationLine = StrI(test.lineNumber).trim()
+ end if
+
+ testLocationText = "file://" + test.testSuite.filePath.trim() + ":" + testLocationLine
+
+ if m.config.printTestTimes = true
+ timeText = " (" + stri(test.result.time).trim() + "ms)"
+ else
+ timeText = ""
+ end if
+
+ insetText = ""
+ if test.isParamTest <> true
+ messageLine = Rooibos.Common.fillText(" " + testChar + " |--" + test.name + " : ", ".", m.lineWidth)
+ m.printLine(0, messageLine + test.result.getStatusText() + timeText)
+ m.printLine(0, " | " + insettext + " |--Test : " + testLocationText)
+ else if test.paramTestIndex = 0
+ name = test.name
+ if len(name) > 1 and right(name, 1) = "0"
+ name = left(name, len(name) - 1)
+ end if
+ m.printLine(0, " " + testChar + " |--" + name + " : ")
+ m.printLine(0, " | " + insettext + " |--Test : " + testLocationText)
+ end if
+
+ locationText = "file://" + test.testSuite.filePath.trim() + ":" + locationLine
+ if test.isParamTest = true
+ insetText = " "
+
+ if type(test.rawParams) = "roAssociativeArray"
+ rawParams = {}
+ for each key in test.rawParams
+ if type(test.rawParams[key]) <> "Function" and type(test.rawParams[key]) <> "roFunction"
+ rawParams[key] = test.rawParams[key]
+ end if
+ end for
+ else
+ rawParams = test.rawParams
+ end if
+ messageLine = Rooibos.Common.fillText(" " + testChar + insetText + " |--" + formatJson(rawParams) + " : ", ".", m.lineWidth)
+ m.printLine(0, messageLine + test.result.getStatusText() + timeText)
+ end if
+
+ if test.result.isCrash
+ m.printLine(0, " | " + insettext + " |--Crashed at: " + locationText)
+ m.printStackTrace(insettext, test.result.error)
+ m.printLine(0, " | ")
+ else if test.result.isFail
+ m.printLine(0, " | " + insettext + " |--Failed at: " + locationText)
+ if test.isParamTest = true
+ m.printLine(0, " | " + insettext + " |--Param Line: " + StrI(test.paramlineNumber -1).trim())
+ end if
+ m.printLine(0, " | " + insettext + " |--Error Message: " + test.result.message)
+ m.printLine(0, " | ")
+ end if
+ end function
+
+ function printStackTrace(insettext, error)
+ m.printLine(0, " | " + insettext + " |")
+ m.printLine(0, " | " + insettext + " |--Message: " + error.message)
+ m.printLine(0, " | " + insettext + " |--Stack trace: ")
+
+ for i = error.backTrace.count() - 1 to 0 step -1
+ e = error.backTrace[i]
+ if e.filename.instr("pkg:/source/rooibos") = -1
+ m.printLine(0, " | " + insettext + " " + e.filename + "(" + stri(e.line_number).trim() + ")")
+ end if
+ end for
+ end function
+
+ function startReport()
+ m.printLine()
+ m.printLine(0, "[START TEST REPORT]")
+ m.printLine()
+ end function
+
+ function endReport()
+ m.printLine()
+ m.printLine(0, "[END TEST REPORT]")
+ m.printLine()
+ end function
+
+ function printSuiteStart(testSuite)
+ m.printLine(0, " " + testSuite.name + " file://" + testSuite.filePath.trim() + ":" + str(testSuite.lineNumber).trim())
+
+ end function
+
+ function printGroupStart(testGroup)
+ m.printLine(0, " |-" + testGroup.name)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ printing
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ override function testLogInfo(text)
+ ? "INFO " ; text
+ end function
+
+ override function testLogError(text)
+ ? "ERROR " ; text
+ end function
+
+ function printLine(depth = 0, text = "")
+ ? " " ; text
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/Coverage.bs b/framework/src/source/Coverage.bs
new file mode 100644
index 00000000..d9e89a2f
--- /dev/null
+++ b/framework/src/source/Coverage.bs
@@ -0,0 +1,51 @@
+namespace rooibos.Coverage
+
+' function createLCovOutput()
+' ? "Generating lcov.info file..."
+
+' cc = m.global._rbs_ccn
+' expectedMap = cc.expectedMap
+' filePathMap = cc.filePathMap
+' resolvedMap = cc.resolvedMap
+
+' buffer = ""
+
+' for each module in filePathMap.items()
+' moduleNumber = module.key
+' filePath = module.value
+' packageName = "."
+
+' relativePath = filePath.replace("pkg:", packageName)
+' sanitizedPath = relativePath.replace("\\", "/")
+
+' buffer = buffer + "TN:" + chr(10)
+' buffer = buffer + "SF:" + sanitizedPath + chr(10)
+
+' for each expected in expectedMap[moduleNumber]
+' lineNumber = expected[0]
+' SHIFT = 1
+
+' if resolvedMap[moduleNumber] <> invalid and resolvedMap[moduleNumber].doesExist(str(lineNumber)) then
+' buffer = buffer + "DA:" + str(lineNumber + SHIFT) + ",1" + chr(10)
+' else
+' buffer = buffer + "DA:" + str(lineNumber + SHIFT) + ",0" + chr(10)
+' end if
+' end for
+
+' buffer = buffer + "end_of_record" + chr(10)
+' end for
+' return buffer
+' end function
+
+' function printLCovInfo()
+' ?
+' ? "+++++++++++++++++++++++++++++++++++++++++++"
+' ? "LCOV.INFO FILE"
+' ? "+++++++++++++++++++++++++++++++++++++++++++"
+' ?
+' ? "+-=-coverage:start"
+' ? Coverage.createLCovOutput()
+' ? "+-=-coverage:end"
+' end function
+
+end namespace
\ No newline at end of file
diff --git a/src/source/Matchers.bs b/framework/src/source/Matchers.bs
similarity index 95%
rename from src/source/Matchers.bs
rename to framework/src/source/Matchers.bs
index e2c86ba4..193056a5 100644
--- a/src/source/Matchers.bs
+++ b/framework/src/source/Matchers.bs
@@ -1,4 +1,4 @@
-namespace Rooibos.Matcher
+namespace rooibos.Matcher
function anyString(value)
return Rooibos.Common.isString(value)
diff --git a/framework/src/source/Rooibos.bs b/framework/src/source/Rooibos.bs
new file mode 100644
index 00000000..aa3c1c44
--- /dev/null
+++ b/framework/src/source/Rooibos.bs
@@ -0,0 +1,83 @@
+namespace rooibos
+ function init() as void
+ args = {}
+ if createObject("roAPPInfo").IsDev() <> true then
+ ? " not running in dev mode! - rooibos tests only support sideloaded builds - aborting"
+ return
+ end if
+
+ screen = CreateObject("roSGScreen")
+ m.port = CreateObject("roMessagePort")
+ screen.setMessagePort(m.port)
+ testSceneName = "TestsScene"
+
+ ? "Starting test using test scene with name TestsScene" ; testSceneName
+ scene = screen.CreateScene(testSceneName)
+ scene.id = "ROOT"
+ screen.show()
+
+ m.global = screen.getGlobalNode()
+ m.global.addFields({ "testsScene": scene })
+
+ if scene.hasField("isReadyToStartTests") and scene.isReadyToStartTests = false
+ ? "The scene is not ready yet - waiting for it to set isReadyToStartTests to true"
+ scene.observeField("isReadyToStartTests", m.port)
+
+ else
+ ? "scene is ready; running tests now"
+ runner = new TestRunner(scene, m)
+ runner.Run()
+ end if
+
+ while(true)
+ msg = wait(0, m.port)
+ msgType = type(msg)
+ if msgType = "roSGScreenEvent"
+ if msg.isScreenClosed()
+ return
+ end if
+ else if msgType = "roSGNodeEvent"
+
+ if msg.getField() = "isReadyToStartTests" and msg.getData() = true
+ ? "scene is ready; running tests now"
+ runner = new TestRunner(scene, m)
+ runner.Run()
+ end if
+ end if
+ end while
+ end function
+
+ function versionCompare(v1, v2)
+ v1parts = v1.split(".")
+ v2parts = v2.split(".")
+
+ while v1parts.count() < v2parts.count()
+ v1parts.push("0")
+ end while
+
+ while v2parts.count() < v1parts.count()
+ v2parts.push("0")
+ end while
+
+ for i = 0 to v1parts.count() - 1
+ if v2parts.count() = i
+ return 1
+ end if
+
+ if v1parts[i] <> v2parts[i]
+ if v1parts[i] > v2parts[i]
+ return 1
+ else
+ return -1
+ end if
+ end if
+ end for
+
+ if v1parts.count() <> v2parts.count()
+ return -1
+ end if
+
+ return 0
+
+ end function
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/RooibosScene.xml b/framework/src/source/RooibosScene.xml
new file mode 100644
index 00000000..9af58cb8
--- /dev/null
+++ b/framework/src/source/RooibosScene.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/framework/src/source/RuntimeConfig.bs b/framework/src/source/RuntimeConfig.bs
new file mode 100644
index 00000000..e0bcc3a6
--- /dev/null
+++ b/framework/src/source/RuntimeConfig.bs
@@ -0,0 +1,20 @@
+namespace rooibos
+ class RuntimeConfig
+
+ function getVersionText()
+ end function
+
+ function getRuntimeConfig()
+ end function
+
+ function getTestSuiteClassWithName(name)
+ end function
+
+ function getAllTestSuitesNames()
+ end function
+
+ function getIgnoredTestInfo()
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/Stats.bs b/framework/src/source/Stats.bs
new file mode 100644
index 00000000..3d940926
--- /dev/null
+++ b/framework/src/source/Stats.bs
@@ -0,0 +1,46 @@
+namespace rooibos
+ class Stats
+ public time = 0
+ public ranCount = 0
+ public passedCount = 0
+ public failedCount = 0
+ public crashedCount = 0
+ public ignoredCount = 0
+ public ignoredTestNames = []
+ public hasFailures = false
+ public testResult = invalid
+
+ function new()
+ end function
+
+ function merge(other) as void
+ m.time += other.time
+ m.ranCount += other.ranCount
+ m.passedCount += other.passedCount
+ m.failedCount += other.failedCount
+ m.crashedCount += other.crashedCount
+ m.ignoredCount += other.ignoredCount
+ m.ignoredTestNames.append(other.IgnoredTestNames)
+ m.onUpdate()
+ end function
+
+ function appendTestResult(result)
+ m.time += result.time
+ m.ranCount++
+ if result.isCrash
+ m.crashedCount++
+ else if result.isFail
+ m.failedCount++
+ else
+ m.passedCount++
+ end if
+
+ m.onUpdate()
+ end function
+
+ function onUpdate()
+ m.hasFailures = m.failedCount > 0 or m.crashedCount > 0
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/Test.bs b/framework/src/source/Test.bs
new file mode 100644
index 00000000..b9ebc81e
--- /dev/null
+++ b/framework/src/source/Test.bs
@@ -0,0 +1,108 @@
+namespace rooibos
+ class Test
+
+ public name
+ public isSolo
+ public noCatch = false
+ public funcName
+ public isIgnored
+ public lineNumber
+ public paramLineNumber
+ public testSuite = invalid
+ public testGroup = invalid
+
+ public rawParams
+ public paramTestIndex
+ public isParamTest = false
+ public isParamsValid = false
+
+ public result = invalid
+
+ function new(testGroup, data)
+ m.testGroup = testGroup
+ m.testSuite = testGroup.testSuite
+ m.isSolo = data.isSolo
+ m.noCatch = data.noCatch
+ m.funcName = data.funcName
+ m.isIgnored = data.isIgnored
+ m.name = data.name
+ m.lineNumber = data.lineNumber
+ m.paramLineNumber = data.paramLineNumber
+ m.rawParams = data.rawParams
+ m.paramTestIndex = data.paramTestIndex
+ m.isParamTest = data.isParamTest
+ m.expectedNumberOfParams = data.expectedNumberOfParams
+
+ if m.isParamTest
+ m.name = m.name + stri(m.paramTestIndex)
+ end if
+
+ m.result = new TestResult(m)
+ return this
+ end function
+
+ function run()
+ timer = createObject("roTimespan")
+ timer.mark()
+
+ if m.isParamTest
+ m.runParamsTest()
+ else
+ m.testSuite[m.funcName]()
+ end if
+
+ m.result.time = timer.totalMilliseconds()
+
+ end function
+
+ function runParamsTest()
+ testParams = m.getTestParams()
+
+ if m.expectedNumberOfParams = 1
+ m.testSuite[m.funcName](testParams[0])
+ else if m.expectedNumberOfParams = 2
+ m.testSuite[m.funcName](testParams[0], testParams[1])
+ else if m.expectedNumberOfParams = 3
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2])
+ else if m.expectedNumberOfParams = 4
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3])
+ else if m.expectedNumberOfParams = 5
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4])
+ else if m.expectedNumberOfParams = 6
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4], testParams[5])
+ else if m.expectedNumberOfParams = 7
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4], testParams[5], testParams[6])
+ else if m.expectedNumberOfParams = 8
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4], testParams[5], testParams[6], testParams[7])
+ else if m.expectedNumberOfParams = 9
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4], testParams[5], testParams[6], testParams[7], testParams[8])
+ else if m.expectedNumberOfParams = 10
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4], testParams[5], testParams[6], testParams[7], testParams[8], testParams[9])
+ else if m.expectedNumberOfParams = 11
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4], testParams[5], testParams[6], testParams[7], testParams[8], testParams[9], testParams[10])
+ else if m.expectedNumberOfParams = 12
+ m.testSuite[m.funcName](testParams[0], testParams[1], testParams[2], testParams[3], testParams[4], testParams[5], testParams[6], testParams[7], testParams[8], testParams[9], testParams[10], testParams[11])
+ else if m.expectedNumberOfParams > 12
+ m.testSuite.fail("Test case had more than 12 params. Max of 12 params is supported")
+ end if
+ end function
+
+ function getTestParams()
+ params = []
+ for paramIndex = 0 to m.rawParams.count()
+ paramValue = m.rawParams[paramIndex]
+ if type(paramValue) = "roString" and len(paramValue) >= 8 and left(paramValue, 8) = "#RBSNode"
+ nodeType = "ContentNode"
+ paramDirectiveArgs = paramValue.split("|")
+ if paramDirectiveArgs.count() > 1
+ nodeType = paramDirectiveArgs[1]
+ end if
+ paramValue = createObject("roSGNode", nodeType)
+ end if
+ params.push(paramValue)
+ end for
+ return params
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/TestGroup.bs b/framework/src/source/TestGroup.bs
new file mode 100644
index 00000000..86cd00c9
--- /dev/null
+++ b/framework/src/source/TestGroup.bs
@@ -0,0 +1,100 @@
+namespace rooibos
+ ' /**
+ ' * @module TestSuite
+ ' * @description All brs files that include `'@TestSuite` annotations automatically extend the TestSuite.
+ ' * The base test suite contains all of the assertions, and utility methods required to writey our tests, as well as being responsible for tracking the state of the tests and groups.
+ ' */
+ class TestGroup
+ 'test state
+ name = "Unnamed Suite"
+
+ testSuite = invalid
+ setupFunctionName = invalid
+ tearDownFunctionName = invalid
+ beforeEachFunctionName = invalid
+ afterEachFunctionName = invalid
+ isSolo = false
+ isLegacy = false
+ isIgnored = false
+ stats = invalid
+ tests = []
+
+ function new(testSuite, data)
+ m.testSuite = testSuite
+ m.name = data.name
+ m.valid = data.valid
+ m.hasFailures = testSuite.hasFailures
+ m.isSolo = data.isSolo
+ m.isIgnored = data.isIgnored
+ m.testsData = data.testCases
+ m.isNodeTest = false
+ m.nodeName = invalid
+ m.setupFunctionName = data.setupFunctionName
+ m.tearDownFunctionName = data.tearDownFunctionName
+ m.beforeEachFunctionName = data.beforeEachFunctionName
+ m.afterEachFunctionName = data.afterEachFunctionName
+ m.lineNumber = data.lineNumber
+
+ m.global = testSuite.global
+ m.top = testSuite.top
+ m.scene = testSuite.scene
+ m.stats = new Stats()
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ running
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ function run()
+ isOk = m.runSuiteFunction(m.setupFunctionName, "setup")
+
+ if isOk
+ for each testData in m.testsData
+ test = new Test(m, testData)
+ m.tests.push(test)
+
+ isOk = m.runSuiteFunction(m.beforeEachFunctionName, "beforeEach", test)
+
+ if isOk
+ m.testSuite.runTest(test)
+ end if
+
+ m.runSuiteFunction(m.afterEachFunctionName, "afterEach", test)
+
+ m.stats.appendTestResult(test.result)
+
+ if m.stats.hasFailures and m.testSuite.isFailingFast
+ ? "Terminating group due to failed test"
+ exit for
+ end if
+ end for
+ else
+ ? "ERROR running test setup function"
+ end if
+ m.runSuiteFunction(m.tearDownFunctionName, "tearDown")
+ end function
+
+ private function runSuiteFunction(methodName, defaultMethodName, test = invalid)
+
+ if methodName = invalid or methodName = ""
+ methodName = defaultMethodName
+ end if
+ if m.testSuite.catchCrashes and not m.testSuite.noCatch and not (test <> invalid and test.noCatch)
+ try
+ m.testSuite[methodName]()
+ return true
+ catch error
+ if test <> invalid
+ test.result.crash("function " + methodName + "crashed!", error)
+ end if
+ end try
+ else
+ m.testSuite[methodName]()
+ return true
+ end if
+
+ return false
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/TestResult.bs b/framework/src/source/TestResult.bs
new file mode 100644
index 00000000..e814261c
--- /dev/null
+++ b/framework/src/source/TestResult.bs
@@ -0,0 +1,74 @@
+namespace rooibos
+ class TestResult
+
+ public isFail = false
+ public isCrash = false
+ public message = ""
+ public lineNumber = -1
+ public test = invalid
+ public time = 0
+ public error = invalid
+
+ function new(test)
+ m.test = test
+ end function
+
+ function reset() as void
+ m.isFail = false
+ m.isCrash = false
+ m.time = 0
+ m.message = ""
+ m.lineNumber = -1
+ end function
+
+ function fail(message as string, lineNumber = -1)
+ if message <> "" and not m.isFail
+ if not m.isFail
+ m.lineNumber = lineNumber
+ m.isFail = true
+ m.message = message
+ end if
+ end if
+ end function
+
+ function crash(message as string, error)
+ if message <> "" and not m.isCrash
+ if not m.isCrash
+ m.error = error
+ m.message = "test crashed!"
+ m.isFail = true
+ m.isCrash = true
+ end if
+ end if
+ end function
+
+ function getMessage() as string
+ if m.isFail
+ if m.message <> invalid
+ return m.message
+ else
+ return "unknown test failure"
+ end if
+ else if m.isCrash
+ if m.message <> invalid
+ return m.message
+ else
+ return "unknown test crash"
+ end if
+ else
+ return ""
+ end if
+ end function
+
+ function getStatusText()
+ if m.isCrash
+ return "CRASH"
+ else if m.isFail
+ return "FAIL"
+ else
+ return "PASS"
+ end if
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/TestRunner.bs b/framework/src/source/TestRunner.bs
new file mode 100644
index 00000000..7e49590b
--- /dev/null
+++ b/framework/src/source/TestRunner.bs
@@ -0,0 +1,182 @@
+namespace rooibos
+ ' /**
+ ' * @module TestRunner
+ ' */
+
+ ' /**
+ ' * @memberof module:TestRunner
+ ' * @name Rooibos_TestRunner
+ ' * @function
+ ' * @description Creates an instance of the test runner
+ ' */
+ class TestRunner
+ public testScene = invalid
+ public testReporter = invalid
+ public nodeContext = invalid
+ public config = invalid
+ public testSuites = []
+
+ public function new(testScene, nodeContext)
+ m.testScene = testScene
+ if nodeContext.top = invalid
+ nodeContext.top = testScene
+ end if
+ nodeContext.scene = testScene
+
+ m.nodeContext = nodeContext
+
+ m.stats = new Stats()
+ m.runtimeConfig = new RuntimeConfig()
+ m.config = m.runtimeConfig.getRuntimeConfig()
+ 'TODO - allow providing different reporters via config
+ m.testReporter = new Rooibos.ConsoleTestReporter(m)
+ end function
+
+ ' /**
+ ' * @memberof module:TestRunner
+ ' * @name Run
+ ' * @function
+ ' * @instance
+ ' * @description Executes all tests for a project, as per the config
+ ' */
+ public function run()
+
+ timer = createObject("roTimespan")
+ timer.mark()
+ suiteNames = m.runtimeConfig.getAllTestSuitesNames()
+ includedSuites = []
+ for each name in suiteNames
+ suiteClass = m.runtimeConfig.getTestSuiteClassWithName(name)
+ testSuite = invalid
+ if suiteClass <> invalid
+ testSuite = suiteClass()
+ testSuite.global = m.nodeContext.global
+ testSuite.context = m.nodeContext
+ testSuite.top = m.nodeContext.top
+ testSuite.scene = m.nodeContext.global.testsScene
+ testSuite.catchCrashes = m.config.catchCrashes
+ m.runTestSuite(testSuite)
+ if m.stats.hasFailures = true and m.config.failFast = true
+ exit for
+ end if
+ else
+ ? "ERROR! coudl not create test for suite : "; name
+ end if
+ end for
+
+ m.stats.time = timer.totalMilliseconds()
+
+ m.testReporter.reportResults(m.stats)
+
+ 'code coverage is not enabled in rooibos 4.0.0 - will get added again in future
+ ' if Rooibos.Common.isFunction(RBS_reportCodeCoverage)
+ ' 'bs:disable-next-line
+ ' RBS_reportCodeCoverage()
+
+ ' if m.config.printLcov = true
+ ' Coverage.printLCovInfo()
+ ' end if
+ ' end if
+ m.sendHomeKeypress()
+ end function
+
+ public function runInNodeMode(nodeTestName)
+ suiteClass = m.getTestSuiteClassWithName(nodeTestName)
+ testSuite = invalid
+
+ if suiteClass <> invalid
+ testSuite = suiteClass(m.top)
+ end if
+
+ if testSuite <> invalid
+ testSuite.run()
+ return {
+ stats: testSuite.stats
+ tests: testSuite.tests
+ }
+ else
+ ? "[ERROR] could not create test suite " ; nodeTestName
+ end if
+
+ ? "ERROR! executing node test " + nodeTestName + " was unsuccesful."
+
+ return invalid
+ end function
+
+ private function runTestSuite(testSuite) as void
+ if testSuite.groupsData <> invalid and testSuite.groupsData.count() > 0
+ ? ""
+ ? Rooibos.Common.fillText("> SUITE: " + testSuite.name, ">", 80)
+ m.testSuites.push(testSuite)
+
+ if testSuite.isNodeTest
+ m.runNodeTest(testSuite)
+ else
+ testSuite.run()
+ end if
+
+ m.stats.merge(testSuite.stats)
+ end if
+ end function
+
+ private function runNodeTest(testSuite) as void
+ if testSuite.generatedNodeName <> ""
+ ? " +++++RUNNING NODE TEST"
+ ? " node type is " ; testSuite.generatedNodeName
+
+ node = m.testScene.createChild(testSuite.generatedNodeName)
+
+ if type(node) = "roSGNode"
+ nodeResults = node.rooibosTestResult
+ if nodeResults <> invalid
+ testSuite.stats = nodeResults.stats
+ testSuite.testCases = nodeResults.testCases
+ else
+ ? " ERROR! The node test"; testSuite.name; " did not return a result from from the rooibos_runNodeTestSuite method. This usually means you are not importing rooibos.brs and the required test file. Please refer to : https://github.com/georgejecook/rooibos/blob/master/docs/index.md#testing-scenegraph-nodes"
+ end if
+ m.testScene.removeChild(node)
+ return
+
+ else
+ ? " ERROR!! - could not create node required to execute tests for " ; testSuite.name
+ ? " Node of type " ; testSuite.generatedNodeName ; " was not found/could not be instantiated"
+ end if
+
+ else
+ ? " ERROR!! - could not create node required to execute tests for " ; testSuite.name
+ ? " No node type was provided"
+ end if
+
+ testSuite.stats.hasFailures = true
+ testSuite.failedCount += testSuite.testsData.count()
+ end function
+
+ private function sendHomeKeypress()
+ ut = createObject("roUrlTransfer")
+ ut.SetUrl("http://localhost:8060/keypress/Home")
+ ut.PostFromString("")
+ end function
+
+ end class
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ This code is called inside of the node
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ function createTestNode(nodeType) as object
+ node = createObject("roSGNode", nodeType)
+
+ if type(node) = "roSGNode" and node.subType() = nodeType
+ m.top.AppendChild(node)
+ return node
+ else
+ ? " Error creating test node of type " ; nodeType
+ return invalid
+ end if
+ end function
+
+ function runNodeTestSuite(name)
+ nodeRunner = new TestRunner(m.top.getScene(), m)
+ return nodeRunner.runInNodeMode(name)
+ end function
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/Utils.bs b/framework/src/source/Utils.bs
new file mode 100644
index 00000000..beefae93
--- /dev/null
+++ b/framework/src/source/Utils.bs
@@ -0,0 +1,63 @@
+namespace rooibos.utils
+ class MockNode
+ public id
+ public name
+
+ public createdNodes = []
+ public createdChildren = []
+ public children = []
+ public _subType = "Node"
+ public _parent
+
+ function new(id = "", subType = "Node")
+ m.id = id
+ m._subType = subType
+ end function
+
+ function subType()
+ return m._subType
+ end function
+
+ function createObject(nodeType)
+ node = new rooibos.utils.MockNode("", nodeType)
+ m.createdNodes.push(node)
+ return node
+ end function
+
+ function createChild(nodeType)
+ node = new rooibos.utils.MockNode("", nodeType)
+ m.createdChildren.push(node)
+ return node
+ end function
+
+ function appendChild(child)
+ m.children.push(child)
+ end function
+ function getParent()
+ if m._parent = invalid
+ m._parent = new rooibos.utils.MockNode("_generated_parent")
+ end if
+ return m._parent
+ end function
+
+ function addFields(fields)
+ m.append(fields)
+ end function
+ function setField(field, value)
+ m[field] = value
+ end function
+ function setFields(fields)
+ m.append(fields)
+ end function
+ function observeField(field, callback)
+ end function
+ function getChildren(offset, count)
+ return m.children
+ end function
+ function removeChildren(children)
+
+ end function
+ function observeFieldScoped(field, callback)
+ end function
+ end class
+end namespace
\ No newline at end of file
diff --git a/framework/src/source/scratch.bs b/framework/src/source/scratch.bs
new file mode 100644
index 00000000..d4b4cf2d
--- /dev/null
+++ b/framework/src/source/scratch.bs
@@ -0,0 +1,1611 @@
+class wrapper
+ override function getTestSuiteData()
+ return {
+ name: "Rooibos assertion tests"
+ isSolo: false
+ isIgnored: false
+ filePath: "source/Assertion.spec.bs"
+ valid: true
+ hasFailures: undefined
+ hasSoloTests: undefined
+ hasIgnoredTests: false
+ hasSoloGroups: undefined
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ isNodeTest: undefined
+ nodeName: ""
+ testGroups: [
+ {
+ name: "tests basic assertions"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "Fail"
+ lineNumber: 10
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertTrue"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 28
+ paramLineNumber: 22
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [true, true]
+ paramTestIndex: 0
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertTrue"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 28
+ paramLineNumber: 23
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [false, false]
+ paramTestIndex: 1
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertTrue"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 28
+ paramLineNumber: 24
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [invalid, false]
+ paramTestIndex: 2
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertTrue"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 28
+ paramLineNumber: 25
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [0, false]
+ paramTestIndex: 3
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertTrue"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 28
+ paramLineNumber: 26
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [1, false]
+ paramTestIndex: 4
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertTrue"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 28
+ paramLineNumber: 27
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["test", false]
+ paramTestIndex: 5
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertFalse"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 45
+ paramLineNumber: 39
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [false, true]
+ paramTestIndex: 0
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertFalse"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 45
+ paramLineNumber: 40
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [true, false]
+ paramTestIndex: 1
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertFalse"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 45
+ paramLineNumber: 41
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [invalid, false]
+ paramTestIndex: 2
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertFalse"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 45
+ paramLineNumber: 42
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [0, false]
+ paramTestIndex: 3
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertFalse"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 45
+ paramLineNumber: 43
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [1, false]
+ paramTestIndex: 4
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertFalse"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 45
+ paramLineNumber: 44
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["test", false]
+ paramTestIndex: 5
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests AssertArrayContainsAAs"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 77
+ paramLineNumber: 61
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], [{ "one": 2 }]]
+ paramTestIndex: 0
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 77
+ paramLineNumber: 62
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], [{ "one": "a" }]]
+ paramTestIndex: 1
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 77
+ paramLineNumber: 63
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], [{}]]
+ paramTestIndex: 2
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 77
+ paramLineNumber: 64
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], [invalid]]
+ paramTestIndex: 3
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 77
+ paramLineNumber: 65
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], []]
+ paramTestIndex: 4
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 77
+ paramLineNumber: 66
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], invalid]
+ paramTestIndex: 5
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text6"
+ lineNumber: 77
+ paramLineNumber: 67
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], [[]]]
+ paramTestIndex: 6
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text7"
+ lineNumber: 77
+ paramLineNumber: 68
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], ["wrong"]]
+ paramTestIndex: 7
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text8"
+ lineNumber: 77
+ paramLineNumber: 69
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], [2]]
+ paramTestIndex: 8
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text9"
+ lineNumber: 77
+ paramLineNumber: 70
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": "a" }], [{ "one": 1 }]]
+ paramTestIndex: 9
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text10"
+ lineNumber: 77
+ paramLineNumber: 71
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "two": 1 }], [{ "one": 1 }]]
+ paramTestIndex: 10
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text11"
+ lineNumber: 77
+ paramLineNumber: 72
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[invalid], [{ "one": 1 }]]
+ paramTestIndex: 11
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text12"
+ lineNumber: 77
+ paramLineNumber: 73
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [invalid, [{ "one": 1 }]]
+ paramTestIndex: 12
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text13"
+ lineNumber: 77
+ paramLineNumber: 74
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1, "two": 2 }], [{ "one": "1" }]]
+ paramTestIndex: 13
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text14"
+ lineNumber: 77
+ paramLineNumber: 75
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }, { "two": 2 }], [{ "one": "1" }, { "two": "a" }]]
+ paramTestIndex: 14
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text15"
+ lineNumber: 77
+ paramLineNumber: 76
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }, { "two": 2 }], [{ "a": 1 }, { "a": 1 }, { "a": 1 }]]
+ paramTestIndex: 15
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 97
+ paramLineNumber: 90
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[], []]
+ paramTestIndex: 0
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 97
+ paramLineNumber: 91
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{}], [{}]]
+ paramTestIndex: 1
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 97
+ paramLineNumber: 92
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1 }], [{ "one": 1 }]]
+ paramTestIndex: 2
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 97
+ paramLineNumber: 93
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1, "two": 2 }], [{ "one": 1, "two": 2 }]]
+ paramTestIndex: 3
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 97
+ paramLineNumber: 94
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1, "two": 2 }], [{ "two": 2, "one": 1 }]]
+ paramTestIndex: 4
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 97
+ paramLineNumber: 95
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1, "two": 2 }, { "one": 1 }], [{ "one": 1 }, { "two": 2, "one": 1 }]]
+ paramTestIndex: 5
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsAAs_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text6"
+ lineNumber: 97
+ paramLineNumber: 96
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "one": 1, "two": 2 }, { "one": 1 }, { "three": 3 }], [{ "one": 1 }, { "three": 3 }, { "two": 2, "one": 1 }]]
+ paramTestIndex: 6
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests global is present on testSuite"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_assertGlobalIsPassedIntoTest"
+ isIgnored: false
+ isParamTest: false
+ name: "global is in test"
+ lineNumber: 123
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertGlobalIsPassedInto_beforeEach_and_afterEach"
+ isIgnored: false
+ isParamTest: false
+ name: "global is in before each and after each"
+ lineNumber: 128
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests AssertArrayContainsOnlyValuesOfType"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 144
+ paramLineNumber: 139
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [["one", "two", "three"], "String"]
+ paramTestIndex: 0
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 144
+ paramLineNumber: 140
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[1, 2, 3], "Integer"]
+ paramTestIndex: 1
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 144
+ paramLineNumber: 141
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[true, true, false], "Boolean"]
+ paramTestIndex: 2
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 144
+ paramLineNumber: 142
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[[true, true], [false, false]], "Array"]
+ paramTestIndex: 3
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 144
+ paramLineNumber: 143
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "test": 1 }, { "test": 1 }], "AssociativeArray"]
+ paramTestIndex: 4
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 167
+ paramLineNumber: 156
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [["one", 2, "three"], "String"]
+ paramTestIndex: 0
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 167
+ paramLineNumber: 157
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[1, "two", 3], "Integer"]
+ paramTestIndex: 1
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 167
+ paramLineNumber: 158
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[true, "true", false], "Boolean"]
+ paramTestIndex: 2
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 167
+ paramLineNumber: 159
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[[true, true], false, false], "Array"]
+ paramTestIndex: 3
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 167
+ paramLineNumber: 160
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "test": 1 }, "notAA"], "AssociativeArray"]
+ paramTestIndex: 4
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 167
+ paramLineNumber: 161
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [["one", "two", "three"], "UnknownType"]
+ paramTestIndex: 5
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text6"
+ lineNumber: 167
+ paramLineNumber: 162
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [["one", "two", "three"], "Integer"]
+ paramTestIndex: 6
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text7"
+ lineNumber: 167
+ paramLineNumber: 163
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[1, 2, 3], "String"]
+ paramTestIndex: 7
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text8"
+ lineNumber: 167
+ paramLineNumber: 164
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[true, true, false], "String"]
+ paramTestIndex: 8
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text9"
+ lineNumber: 167
+ paramLineNumber: 165
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[[true, true], [false, false]], "AssociativeArray"]
+ paramTestIndex: 9
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertArrayContainsOnlyValuesOfType_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text10"
+ lineNumber: 167
+ paramLineNumber: 166
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "test": 1 }, { "test": 1 }], "Array"]
+ paramTestIndex: 10
+ expectedNumberOfParams: 2
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests white spaces work with annotations"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_whiteSpacing"
+ isIgnored: false
+ isParamTest: false
+ name: "comments between tests"
+ lineNumber: 190
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests AssertNotEmpty"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 221
+ paramLineNumber: 214
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [["one", "two", "three"]]
+ paramTestIndex: 0
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 221
+ paramLineNumber: 215
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[1, 2, 3]]
+ paramTestIndex: 1
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 221
+ paramLineNumber: 216
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[true]]
+ paramTestIndex: 2
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 221
+ paramLineNumber: 217
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[[true, true], [false, false]]]
+ paramTestIndex: 3
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 221
+ paramLineNumber: 218
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "test": 1 }]]
+ paramTestIndex: 4
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 221
+ paramLineNumber: 219
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["not empty"]
+ paramTestIndex: 5
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text6"
+ lineNumber: 221
+ paramLineNumber: 220
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[invalid]]
+ paramTestIndex: 6
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 238
+ paramLineNumber: 233
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [invalid]
+ paramTestIndex: 0
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 238
+ paramLineNumber: 234
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[]]
+ paramTestIndex: 1
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 238
+ paramLineNumber: 235
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [{}]
+ paramTestIndex: 2
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 238
+ paramLineNumber: 236
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [1]
+ paramTestIndex: 3
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertNotEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 238
+ paramLineNumber: 237
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [""]
+ paramTestIndex: 4
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests AssertEmpty"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 257
+ paramLineNumber: 254
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[]]
+ paramTestIndex: 0
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 257
+ paramLineNumber: 255
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [{}]
+ paramTestIndex: 1
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Pass"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 257
+ paramLineNumber: 256
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [""]
+ paramTestIndex: 2
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 278
+ paramLineNumber: 269
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [1]
+ paramTestIndex: 0
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 278
+ paramLineNumber: 270
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [invalid]
+ paramTestIndex: 1
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 278
+ paramLineNumber: 271
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [["one", "two", "three"]]
+ paramTestIndex: 2
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 278
+ paramLineNumber: 272
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[1, 2, 3]]
+ paramTestIndex: 3
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 278
+ paramLineNumber: 273
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[true]]
+ paramTestIndex: 4
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 278
+ paramLineNumber: 274
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[[true, true], [false, false]]]
+ paramTestIndex: 5
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text6"
+ lineNumber: 278
+ paramLineNumber: 275
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[{ "test": 1 }]]
+ paramTestIndex: 6
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text7"
+ lineNumber: 278
+ paramLineNumber: 276
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["not empty"]
+ paramTestIndex: 7
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_assertEmpty_Fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text8"
+ lineNumber: 278
+ paramLineNumber: 277
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: [[invalid]]
+ paramTestIndex: 8
+ expectedNumberOfParams: 1
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests expect"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_expect_multiValues"
+ isIgnored: false
+ isParamTest: false
+ name: "multi return values"
+ lineNumber: 294
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests expect with overloaded expectOnce"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_success"
+ isIgnored: false
+ isParamTest: false
+ name: "simple test"
+ lineNumber: 326
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_success_oneCallsArgsNotTracked"
+ isIgnored: false
+ isParamTest: false
+ name: "can set up multi expects on same method - one invocation with any args"
+ lineNumber: 357
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_multi_args_success"
+ isIgnored: false
+ isParamTest: false
+ name: "can set up multi expects on same method - multi params"
+ lineNumber: 388
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_multi_args_others_success"
+ isIgnored: false
+ isParamTest: false
+ name: "multi test, multi params with other expects"
+ lineNumber: 419
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_multi_args_others_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "multi test, multi params with other expects - fail others"
+ lineNumber: 458
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text0"
+ lineNumber: 503
+ paramLineNumber: 497
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["arg1_", "arg2", "arg3"]
+ paramTestIndex: 0
+ expectedNumberOfParams: 3
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text1"
+ lineNumber: 503
+ paramLineNumber: 498
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["arg1", "arg2", "arg3_"]
+ paramTestIndex: 1
+ expectedNumberOfParams: 3
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text2"
+ lineNumber: 503
+ paramLineNumber: 499
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["arg1", "arg2_", "arg3"]
+ paramTestIndex: 2
+ expectedNumberOfParams: 3
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text3"
+ lineNumber: 503
+ paramLineNumber: 500
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["arg1", "arg2_", "arg3"]
+ paramTestIndex: 3
+ expectedNumberOfParams: 3
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text4"
+ lineNumber: 503
+ paramLineNumber: 501
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["arg1_", "arg2_", "arg3"]
+ paramTestIndex: 4
+ expectedNumberOfParams: 3
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "param.text5"
+ lineNumber: 503
+ paramLineNumber: 502
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: ["arg1_", invalid, "arg3"]
+ paramTestIndex: 5
+ expectedNumberOfParams: 3
+ isParamsValid: true
+ }]
+ },
+ {
+ name: "tests overloaded expectOnce on different objects"
+ isSolo: false
+ isIgnored: false
+ filename: "source/Assertion.spec.bs"
+ setupFunctionName: ""
+ tearDownFunctionName: ""
+ beforeEachFunctionName: ""
+ afterEachFunctionName: ""
+ testCases: [
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_differentOnj_success"
+ isIgnored: false
+ isParamTest: false
+ name: "success"
+ lineNumber: 537
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ },
+
+ {
+ isSolo: false
+ funcName: "test_expect_multiExpect_differentOnj_fail"
+ isIgnored: false
+ isParamTest: false
+ name: "fail to match"
+ lineNumber: 569
+ paramLineNumber: 0
+ assertIndex: 0
+ assertLineNumberMap: {}
+ rawParams: []
+ paramTestIndex: 0
+ expectedNumberOfParams: 0
+ isParamsValid: true
+ }]
+ }]
+ }
+ end function
+ end class
+
\ No newline at end of file
diff --git a/framework/src/source/unused/CodeCoverage.brs b/framework/src/source/unused/CodeCoverage.brs
new file mode 100644
index 00000000..63a1f839
--- /dev/null
+++ b/framework/src/source/unused/CodeCoverage.brs
@@ -0,0 +1,35 @@
+function init()
+ m.resolvedMap = {}
+ m.top.observeField("entry", "onEntryChange")
+ m.top.observeField("save", "onSave")
+
+end function
+
+function setExpectedMap()
+ m.top.expectedMap = "#EXPECTED_MAP#"
+end function
+
+function setFilePathMap()
+ m.top.filePathMap = "#FILE_PATH_MAP#"
+end function
+
+function onEntryChange()
+entry = m.top.entry
+ if entry <> invalid
+ lineMap = m.resolvedMap[entry.f]
+
+ if lineMap = invalid
+ lineMap = {}
+ end if
+ lineMap[entry.l] = entry.r
+
+ m.resolvedMap[entry.f] = lineMap
+ end if
+end function
+
+function onSave()
+ ? "saving data"
+ m.top.resolvedMap = m.resolvedMap
+ setExpectedMap()
+ setFilePathMap()
+end function
\ No newline at end of file
diff --git a/framework/src/source/unused/CodeCoverage.xml b/framework/src/source/unused/CodeCoverage.xml
new file mode 100644
index 00000000..e948d05f
--- /dev/null
+++ b/framework/src/source/unused/CodeCoverage.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/framework/src/source/unused/CodeCoverageSupport.brs b/framework/src/source/unused/CodeCoverageSupport.brs
new file mode 100644
index 00000000..58bb656b
--- /dev/null
+++ b/framework/src/source/unused/CodeCoverageSupport.brs
@@ -0,0 +1,56 @@
+function RBS_ReportCodeCoverage() as void
+
+ if m.global._rbs_ccn = invalid
+ ? "There was no rooibos code coverage component - not generating coverage report"
+ return
+ end if
+ ? ""
+ ? "...Generating code coverage report"
+ ? ""
+ m.global._rbs_ccn.save = true
+ cc = m.global._rbs_ccn
+ hitFiles = []
+ missFiles = []
+ allLinesCount = 0
+ allLinesHit = 0
+ for each key in cc.expectedMap
+ filename = cc.filePathMap[key]
+ expectedCount = cc.expectedMap[key].count()
+ allLinesCount += expectedCount
+ if expectedCount > 0
+ if cc.resolvedMap[key] <> invalid
+ resolvedCount = cc.resolvedMap[key].count()
+ allLinesHit += resolvedCount
+ resolvedPercent = (resolvedCount / expectedCount) * 100
+ hitFiles.push({percent:resolvedPercent, text:filename + ": " +str(resolvedPercent).trim() + "% (" + stri(resolvedCount).trim() + "/" + stri(expectedCount).trim() + ")"})
+ else
+ resolvedCount = 0
+ resolvedPercent = 0
+ missFiles.push(filename + ": MISS!")
+ end if
+ end if
+ end for
+ allLinesPercent = (allLinesHit / allLinesCount) * 100
+ ? ""
+ ? ""
+ ? "+++++++++++++++++++++++++++++++++++++++++++"
+ ? "Code Coverage Report"
+ ? "+++++++++++++++++++++++++++++++++++++++++++"
+ ? ""
+ ? "Total Coverage: " ; str(allLinesPercent).trim() ; "% (" ; stri(allLinesHit).trim() ; "/" + stri(allLinesCount).trim() ; ")"
+ ? "Files: " ; cc.resolvedMap.count(); "/" ; cc.expectedMap.count()
+ ? ""
+ ? "HIT FILES"
+ ? "---------"
+ hitFiles.SortBy("percent")
+ for i = 0 to hitFiles.count() -1
+ ? hitFiles[i].text
+ end for
+ ? ""
+ ? "MISSED FILES"
+ ? "------------"
+ for i = 0 to missFiles.count() -1
+ ? missFiles[i]
+ end for
+
+end function
\ No newline at end of file
diff --git a/frameworkTests/.vscode/launch.json b/frameworkTests/.vscode/launch.json
deleted file mode 100755
index 3ee7592e..00000000
--- a/frameworkTests/.vscode/launch.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "version": "0.2.0",
- "configurations": [
- {
- "name": "test",
- "type": "brightscript",
- "request": "launch",
- "consoleOutput": "full",
- "internalConsoleOptions": "neverOpen",
- "preLaunchTask": "build-tests",
- "envFile": "${workspaceFolder}/.vscode/.env",
- "host": "${env:ROKU_DEV_TARGET}",
- "password": "${env:ROKU_DEVPASSWORD}",
- "retainStagingFolder": true,
- "stopOnEntry": false,
- "files": [
- "!**/images/*.*",
- "!**/fonts/*.*",
- "!*.jpg",
- "!*.png",
- "*",
- "*.*",
- "**/*.*",
- "!*.zip",
- "!**/*.zip"
- ],
- "rootDir": "${workspaceFolder}/build",
- "sourceDirs": [
- "${workspaceFolder}/src",
- ],
- "enableDebuggerAutoRecovery": true,
- "stopDebuggerOnAppExit": true,
- "enableVariablesPanel": false,
- "injectRaleTrackerTask": false,
- "enableDebugProtocol": false
- }
- ]
-}
\ No newline at end of file
diff --git a/frameworkTests/.vscode/tasks.json b/frameworkTests/.vscode/tasks.json
deleted file mode 100755
index c6973ff8..00000000
--- a/frameworkTests/.vscode/tasks.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "version": "2.0.0",
- "tasks": [
- {
- "label": "build-tests",
- "type": "shell",
- "command": "export TS_NODE_COMPILER_OPTIONS='{\"incremental\":true, \"allowJs\":false}' && export TS_NODE_TRANSPILE_ONLY=true && gulp prePublishTests",
- "problemMatcher": [],
- "presentation": {
- "echo": true,
- "reveal": "silent",
- "focus": false,
- "panel": "shared",
- "showReuseMessage": false,
- "clear": true
- },
- "group": {
- "kind": "test",
- "isDefault": true
- }
- },
- {
- "label": "build-tests-with-coverage",
- "type": "shell",
- "command": "export TS_NODE_COMPILER_OPTIONS='{\"incremental\":true, \"allowJs\":false}' && export TS_NODE_TRANSPILE_ONLY=true && gulp prepareCodeCoverageTests",
- "problemMatcher": [],
- "presentation": {
- "echo": true,
- "reveal": "silent",
- "focus": false,
- "panel": "shared",
- "showReuseMessage": false,
- "clear": true
- },
- "group": {
- "kind": "test",
- "isDefault": true
- }
- }
- ]
-}
\ No newline at end of file
diff --git a/frameworkTests/bsConfig.json b/frameworkTests/bsConfig.json
deleted file mode 100644
index 44771e1d..00000000
--- a/frameworkTests/bsConfig.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "rootDir": "src",
- "autoImportComponentScript": true,
- "files": [
- "manifest",
- "source/**/*.*",
- "components/**/*.*",
- "images/**/*.*",
- "font/**/*.*"
- ],
- "diagnosticFilters": [
- "source/tests/rooibosFunctionMap.brs",
- "source/tests/rooibosDist.brs",
- "**/RALETrackerTask.*",
- "**/TestGlobalInitializer.*"
- ],
- "logLevel": "warn"
-}
\ No newline at end of file
diff --git a/frameworkTests/gulpfile.ts b/frameworkTests/gulpfile.ts
deleted file mode 100755
index 52ee19ec..00000000
--- a/frameworkTests/gulpfile.ts
+++ /dev/null
@@ -1,182 +0,0 @@
-import { series } from 'gulp';
-import { FileProcessor } from 'burp-brightscript';
-import { RooibosProcessor, createProcessorConfig } from 'rooibos-cli';
-import { ProgramBuilder } from 'brighterscript';
-
-import { inspect } from 'util';
-import { BsConfig } from 'brighterscript/dist/BsConfig';
-
-const gulp = require('gulp');
-const gulpClean = require('gulp-clean');
-
-let burpFileProcessor: FileProcessor;
-
-export function createDirectories() {
- return gulp
- .src('*.*', { read: false })
- .pipe(gulp.dest('build'))
- .pipe(gulp.dest('out'));
-}
-
-export async function compile(cb) {
- let builder = new ProgramBuilder();
- burpFileProcessor = createBurpProcessor();
- builder.addFileResolver(projectFileResolver);
-
- let configFiles: any[] = [
- "manifest",
- "source/**/*.*",
- "components/**/*.*",
- "images/**/*.*",
- "font/**/*.*"
- ];
-
- let sourceDir = 'src';
- let config: BsConfig = {
- stagingFolderPath: 'build',
- createPackage: false,
- "rootDir": sourceDir,
- "autoImportComponentScript": true,
- "files": configFiles,
- "diagnosticFilters": [
- "source/rooibosFunctionMap.brs",
- "**/RALETrackerTask.*",
- 1107,
- 1001
- ],
- "showDiagnosticsInConsole": true
- }
-
- console.log(`using config ${inspect(config)}`);
- await builder.run(config);
- cb();
-}
-
-function projectFileResolver(pathAbsolute: string): string | undefined | Thenable {
- let updated = burpFileProcessor.processFileWithPath(pathAbsolute, pathAbsolute.toLowerCase().endsWith('.brs'));
- return updated;
-}
-
-/*******************************************************************
- * testing
- *******************************************************************/
-
-export async function prepareTests(cb) {
- let testFiles = [];
- testFiles = [
- '**/tests/**/*.bs',
- '**/tests/**/*.brs',
- '!**/rooibosDist.brs',
- '!**/rooibosFunctionMap.brs',
- '!**/TestsScene.brs'
- ];
- let config = createProcessorConfig({
- projectPath: 'build',
- outputPath: "source/tests",
- showFailuresOnly: true,
- testsFilePattern: testFiles
- });
- let processor = new RooibosProcessor(config);
- await processor.processFiles();
- cb();
-}
-
-export async function prepareCodeCoverageTests(cb) {
- let config = createProcessorConfig({
- projectPath: "build",
- outputPath: "source/tests",
- showFailuresOnly: true,
- testsFilePattern: [
- "**/tests/**/*.brs",
- "!**/rooibosDist.brs",
- "!**/rooibosFunctionMap.brs",
- "!**/TestsScene.brs"
- ],
- sourceFilePattern: [
- "**/*.brs",
- "**/*.xml",
- "!**/tests",
- "!**/rLog",
- "!**/rLogComponents",
- "!**/rooibosDist.brs",
- "!**/rooibosFunctionMap.brs",
- "!**/TestsScene.brs",
- "!**/ThreadUtils.brs"
- ],
- isRecordingCodeCoverage: true
- });
- let processor = new RooibosProcessor(config);
- processor.processFiles();
-
- cb();
-}
-
-/*******************************************************************
- * logging
- *******************************************************************/
-
-export function createBurpProcessor(): FileProcessor {
- //NB - this will be replaced entirely with bsconfig settings, so the bsc compiler
- //will do this for us -this is a temporary solution
- let replacements = getBsLogReplacements();
- console.log('Adding crash resilience to unit tests, by skipping assertions after a failure');
- replacements.push({
- regex: '(^( *\\t*)m\\.assert)',
- replacement: ' if not m.currentResult.isFail then $1'
- });
-
- return new FileProcessor({ replacements: replacements });
-}
-
-function getBsLogReplacements(): any[] {
- let replacements = [];
- const isLogDisabled = false;
- if (isLogDisabled) {
- console.log('stripping logs');
- replacements = [
- {
- regex: '(^\\s*(m\\.)*(log_method|log_info|log_error|log_verbose|log_debug|log_warn)\\(\\[)',
- replacement: '\'$1'
- },
- {
- regex: '(^\\s*(m\\.)*(registerLogger)\\((\\s*"))',
- replacement: '\'$1'
- },
- {
- regex: '(^\\s*(m\\.)*(logMethod|logInfo|logError|logVerbose|logDebug|logWarn|log_debug)\\()',
- replacement: '\'$1'
- }
- ];
- } else {
- console.log('Adding line numbers and package paths to log output');
- replacements = [
- {
- regex: '(^\\s*(?:m\\.)*(log_method|log_info|log_error|log_verbose)\\s*\\(\\s*\\[\\s*)m\\.className',
- replacement: '$1source_location'
- },
- {
- regex: '(^\\s*(?:m\\.)*(log_debug)\\s*\\(\\s*[0-9]*\\s*,\\s*\\[)\\s*m\\.className',
- replacement: '$1source_location'
- },
- {
- regex: '(^\\s*(m\\.)*(logInfo|logError|logVerbose|logDebug|logWarn|logMethod)\\((\\s*))',
- replacement: '$1source_location, '
- }
- ];
- }
- return replacements;
-}
-
-export function clean() {
- let dirs = ['build', 'out'];
-
- return gulp
- .src(dirs, {
- allowEmpty: true
- })
- .pipe(gulpClean({ force: true }));
-};
-
-/* Default task */
-exports.prePublishTests = series(clean, createDirectories, compile, prepareTests);
-exports.prePublishTests = series(clean, createDirectories, compile, prepareTests);
diff --git a/frameworkTests/package-lock.json b/frameworkTests/package-lock.json
deleted file mode 100644
index 6d114016..00000000
--- a/frameworkTests/package-lock.json
+++ /dev/null
@@ -1,8826 +0,0 @@
-{
- "name": "smc",
- "version": "1.0.0",
- "lockfileVersion": 1,
- "requires": true,
- "dependencies": {
- "@babel/code-frame": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
- "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
- "dev": true,
- "requires": {
- "@babel/highlight": "^7.10.4"
- }
- },
- "@babel/helper-validator-identifier": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
- "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
- "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.10.4",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "@nodelib/fs.scandir": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
- "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.3",
- "run-parallel": "^1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
- "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.3",
- "fastq": "^1.6.0"
- }
- },
- "@roku-road/bright": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/@roku-road/bright/-/bright-1.2.13.tgz",
- "integrity": "sha512-uBcBlqNhq3jRpk+iG801EfrWopL4r1sqy2bxJIGG2OyAYEAULDP21QeEHyv6ePmXA/Iny8V297TC+nt98HCkMQ==",
- "dev": true,
- "requires": {
- "chevrotain": "3.7.2",
- "lodash": "4.17.12"
- },
- "dependencies": {
- "lodash": {
- "version": "4.17.12",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.12.tgz",
- "integrity": "sha512-+CiwtLnsJhX03p20mwXuvhoebatoh5B3tt+VvYlrPgZC1g36y+RRbkufX95Xa+X4I59aWEacDFYwnJZiyBh9gA==",
- "dev": true
- }
- }
- },
- "@types/color-name": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
- "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
- "dev": true
- },
- "@types/fs-extra": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.1.0.tgz",
- "integrity": "sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==",
- "dev": true,
- "requires": {
- "@types/node": "*"
- }
- },
- "@types/node": {
- "version": "13.13.15",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.15.tgz",
- "integrity": "sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw==",
- "dev": true
- },
- "@types/yargs": {
- "version": "15.0.5",
- "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz",
- "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==",
- "dev": true,
- "requires": {
- "@types/yargs-parser": "*"
- }
- },
- "@types/yargs-parser": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz",
- "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==",
- "dev": true
- },
- "accepts": {
- "version": "1.3.7",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
- "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
- "dev": true,
- "requires": {
- "mime-types": "~2.1.24",
- "negotiator": "0.6.2"
- }
- },
- "acorn": {
- "version": "6.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
- "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
- "dev": true
- },
- "acorn-jsx": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
- "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
- "dev": true
- },
- "ajv": {
- "version": "6.12.3",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
- "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
- "dev": true,
- "requires": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- }
- },
- "ansi-colors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
- "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
- "dev": true,
- "requires": {
- "ansi-wrap": "^0.1.0"
- }
- },
- "ansi-cyan": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
- "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
- "dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-escapes": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz",
- "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==",
- "dev": true
- },
- "ansi-gray": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
- "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
- "dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-green": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz",
- "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=",
- "dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-red": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
- "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
- "dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
- }
- },
- "ansi-regex": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
- "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
- "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.0"
- }
- },
- "ansi-wrap": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
- "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
- "dev": true
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "dev": true,
- "requires": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- }
- },
- "append-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
- "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
- "dev": true,
- "requires": {
- "buffer-equal": "^1.0.0"
- }
- },
- "archiver": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz",
- "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==",
- "dev": true,
- "requires": {
- "archiver-utils": "^2.1.0",
- "async": "^2.6.3",
- "buffer-crc32": "^0.2.1",
- "glob": "^7.1.4",
- "readable-stream": "^3.4.0",
- "tar-stream": "^2.1.0",
- "zip-stream": "^2.1.2"
- }
- },
- "archiver-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
- "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
- "dev": true,
- "requires": {
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.5.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.union": "^4.6.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^2.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
- "dev": true
- },
- "arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "requires": {
- "sprintf-js": "~1.0.2"
- }
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "arr-filter": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
- "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
- "dev": true,
- "requires": {
- "make-iterator": "^1.0.0"
- }
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
- },
- "arr-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
- "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
- "dev": true,
- "requires": {
- "make-iterator": "^1.0.0"
- }
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
- },
- "array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
- "dev": true
- },
- "array-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
- "dev": true
- },
- "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-flat-polyfill": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz",
- "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==",
- "dev": true
- },
- "array-initial": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
- "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
- "dev": true,
- "requires": {
- "array-slice": "^1.0.0",
- "is-number": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
- }
- }
- },
- "array-last": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
- "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
- "dev": true,
- "requires": {
- "is-number": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
- }
- }
- },
- "array-slice": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
- "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
- "dev": true
- },
- "array-sort": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
- "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
- "dev": true,
- "requires": {
- "default-compare": "^1.0.0",
- "get-value": "^2.0.6",
- "kind-of": "^5.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "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.1"
- }
- },
- "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
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
- "dev": true,
- "requires": {
- "safer-buffer": "~2.1.0"
- }
- },
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
- },
- "astral-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
- "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
- "dev": true
- },
- "async": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
- "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.14"
- }
- },
- "async-done": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
- "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.2",
- "process-nextick-args": "^2.0.0",
- "stream-exhaust": "^1.0.1"
- }
- },
- "async-each": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
- "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
- "dev": true
- },
- "async-settle": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
- "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
- "dev": true,
- "requires": {
- "async-done": "^1.2.2"
- }
- },
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "dev": true
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
- },
- "aws4": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz",
- "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==",
- "dev": true
- },
- "babel-cli": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
- "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
- "dev": true,
- "requires": {
- "babel-core": "^6.26.0",
- "babel-polyfill": "^6.26.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "chokidar": "^1.6.1",
- "commander": "^2.11.0",
- "convert-source-map": "^1.5.0",
- "fs-readdir-recursive": "^1.0.0",
- "glob": "^7.1.2",
- "lodash": "^4.17.4",
- "output-file-sync": "^1.1.2",
- "path-is-absolute": "^1.0.1",
- "slash": "^1.0.0",
- "source-map": "^0.5.6",
- "v8flags": "^2.1.1"
- },
- "dependencies": {
- "anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
- "dev": true,
- "optional": true,
- "requires": {
- "micromatch": "^2.1.5",
- "normalize-path": "^2.0.0"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "dev": true,
- "optional": true,
- "requires": {
- "arr-flatten": "^1.0.1"
- }
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "dev": true,
- "optional": true
- },
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
- "dev": true,
- "optional": true
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "dev": true,
- "optional": true,
- "requires": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
- }
- },
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
- "dev": true,
- "optional": true,
- "requires": {
- "anymatch": "^1.3.0",
- "async-each": "^1.0.0",
- "fsevents": "^1.0.0",
- "glob-parent": "^2.0.0",
- "inherits": "^2.0.1",
- "is-binary-path": "^1.0.0",
- "is-glob": "^2.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.0.0"
- }
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "optional": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-posix-bracket": "^0.1.0"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "optional": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fsevents": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
- "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
- "dev": true,
- "optional": true,
- "requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-glob": "^2.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "kind-of": "^6.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "optional": true
- }
- }
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "dev": true,
- "optional": true,
- "requires": {
- "binary-extensions": "^1.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "kind-of": "^6.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "optional": true
- }
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "optional": 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.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "optional": true
- }
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true,
- "optional": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "optional": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true,
- "optional": true,
- "requires": {
- "arr-diff": "^2.0.0",
- "array-unique": "^0.2.1",
- "braces": "^1.8.2",
- "expand-brackets": "^0.1.4",
- "extglob": "^0.3.1",
- "filename-regex": "^2.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.1",
- "kind-of": "^3.0.2",
- "normalize-path": "^2.0.1",
- "object.omit": "^2.0.0",
- "parse-glob": "^3.0.4",
- "regex-cache": "^0.4.2"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true,
- "optional": true
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "optional": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "optional": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- },
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- },
- "dependencies": {
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true,
- "optional": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true,
- "optional": true
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "optional": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "optional": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "optional": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- }
- },
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true,
- "optional": true
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "optional": 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.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "optional": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "optional": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "optional": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "optional": 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.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- }
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- },
- "v8flags": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
- "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
- "dev": true,
- "requires": {
- "user-home": "^1.1.1"
- }
- }
- }
- },
- "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=",
- "dev": true,
- "requires": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- },
- "dependencies": {
- "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": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
- "dev": true
- },
- "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.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=",
- "dev": true
- }
- }
- },
- "babel-core": {
- "version": "6.26.3",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.26.0",
- "babel-generator": "^6.26.0",
- "babel-helpers": "^6.24.1",
- "babel-messages": "^6.23.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "babel-template": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "convert-source-map": "^1.5.1",
- "debug": "^2.6.9",
- "json5": "^0.5.1",
- "lodash": "^4.17.4",
- "minimatch": "^3.0.4",
- "path-is-absolute": "^1.0.1",
- "private": "^0.1.8",
- "slash": "^1.0.0",
- "source-map": "^0.5.7"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
- }
- },
- "babel-generator": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
- "dev": 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.4",
- "source-map": "^0.5.7",
- "trim-right": "^1.0.1"
- },
- "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
- }
- }
- },
- "babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.22.0"
- }
- },
- "babel-polyfill": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
- "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "regenerator-runtime": "^0.10.5"
- },
- "dependencies": {
- "regenerator-runtime": {
- "version": "0.10.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
- "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
- "dev": true
- }
- }
- },
- "babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
- "dev": true,
- "requires": {
- "babel-core": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "home-or-tmp": "^2.0.0",
- "lodash": "^4.17.4",
- "mkdirp": "^0.5.1",
- "source-map-support": "^0.4.15"
- }
- },
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
- "dev": true,
- "requires": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- }
- },
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "lodash": "^4.17.4"
- }
- },
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
- "dev": 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.8",
- "globals": "^9.18.0",
- "invariant": "^2.2.2",
- "lodash": "^4.17.4"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
- "dev": true,
- "requires": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- }
- },
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- },
- "bach": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
- "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
- "dev": true,
- "requires": {
- "arr-filter": "^1.1.1",
- "arr-flatten": "^1.0.1",
- "arr-map": "^2.0.0",
- "array-each": "^1.0.0",
- "array-initial": "^1.0.0",
- "array-last": "^1.1.1",
- "async-done": "^1.2.2",
- "async-settle": "^1.0.0",
- "now-and-later": "^2.0.0"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
- "requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "base64-js": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
- "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
- "dev": true
- },
- "batch": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
- "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
- "dev": true
- },
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
- "dev": true,
- "requires": {
- "tweetnacl": "^0.14.3"
- }
- },
- "beeper": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
- "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
- "dev": true
- },
- "binary-extensions": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
- "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
- "dev": true
- },
- "bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "bl": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz",
- "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==",
- "dev": true,
- "requires": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "dev": true
- },
- "body-parser": {
- "version": "1.8.4",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.8.4.tgz",
- "integrity": "sha1-1JfgS8E7P5qL2McLsM3Bby4CiJg=",
- "dev": true,
- "requires": {
- "bytes": "1.0.0",
- "depd": "0.4.5",
- "iconv-lite": "0.4.4",
- "media-typer": "0.3.0",
- "on-finished": "2.1.0",
- "qs": "2.2.4",
- "raw-body": "1.3.0",
- "type-is": "~1.5.1"
- },
- "dependencies": {
- "depd": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/depd/-/depd-0.4.5.tgz",
- "integrity": "sha1-GmZLUziLSmVz6K5ntfdnxpPKl/E=",
- "dev": true
- },
- "ee-first": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.5.tgz",
- "integrity": "sha1-jJshKJjYzZ8alDZlDOe+ICyen/A=",
- "dev": true
- },
- "iconv-lite": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz",
- "integrity": "sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g=",
- "dev": true
- },
- "on-finished": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.1.0.tgz",
- "integrity": "sha1-DFOfCSkej/rd4MiiWFD7LO3HAi0=",
- "dev": true,
- "requires": {
- "ee-first": "1.0.5"
- }
- },
- "qs": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.4.tgz",
- "integrity": "sha1-Lp+800tUDjQhySTs0B6QqpdTGcg=",
- "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"
- }
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "^7.0.1"
- }
- },
- "brighterscript": {
- "version": "0.12.4",
- "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.12.4.tgz",
- "integrity": "sha512-eLQ66IiNaQOfPiV/Y5cusjLTPDZKv3Jut+o/0wBpBKIaujpKZlsBZ/r50bok0VDlR+O3YlZD2ZFs4QZrWvIksQ==",
- "dev": true,
- "requires": {
- "@types/yargs": "^15.0.5",
- "array-flat-polyfill": "^1.0.1",
- "chalk": "^2.4.2",
- "chokidar": "^3.0.2",
- "clear": "^0.1.0",
- "cross-platform-clear-console": "^2.3.0",
- "debounce-promise": "^3.1.0",
- "eventemitter3": "^4.0.0",
- "file-url": "^3.0.0",
- "fs-extra": "^7.0.1",
- "glob": "^7.1.6",
- "jsonc-parser": "^2.3.0",
- "long": "^3.2.0",
- "luxon": "^1.8.3",
- "minimatch": "^3.0.4",
- "moment": "^2.23.0",
- "p-settle": "^2.1.0",
- "parse-ms": "^2.1.0",
- "roku-deploy": "^3.2.2",
- "serialize-error": "^7.0.1",
- "source-map": "^0.7.3",
- "vscode-languageserver": "^6.1.1",
- "vscode-languageserver-textdocument": "^1.0.1",
- "vscode-uri": "^2.1.1",
- "xml2js": "^0.4.19",
- "yargs": "^15.4.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "roku-deploy": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.2.2.tgz",
- "integrity": "sha512-16JQbyUsFkLqEwU4k1zWMUP/TsEVIhG7lH1FuMZu56qUmZ3wTFx2HPxyaKCd8K0jGnKlPXj79yyyZiKf4iOr9w==",
- "dev": true,
- "requires": {
- "archiver": "^3.0.0",
- "dateformat": "^3.0.3",
- "fs-extra": "^7.0.1",
- "glob": "^7.1.6",
- "jsonc-parser": "^2.3.0",
- "minimatch": "^3.0.4",
- "path": "^0.12.7",
- "request": "^2.88.0",
- "xml2js": "^0.4.23"
- }
- }
- }
- },
- "brs": {
- "version": "0.25.1",
- "resolved": "https://registry.npmjs.org/brs/-/brs-0.25.1.tgz",
- "integrity": "sha512-26lbQxMdbl7afmAJLxOxoEeCWsPR3VcxwX6twW5ZMUrIBYgQvlY95zCjVzegBH3deC27OCkl5E7ezEe2hC3jdQ==",
- "dev": true,
- "requires": {
- "commander": "^2.12.2",
- "fast-glob": "^3.0.1",
- "long": "^3.2.0",
- "luxon": "^1.8.3",
- "memory-fs": "^0.4.1",
- "nanomatch": "^1.2.13",
- "p-settle": "^2.1.0",
- "xmldoc": "^1.1.2"
- }
- },
- "buffer": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
- "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
- "dev": true,
- "requires": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4"
- }
- },
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
- },
- "buffer-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
- "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
- "dev": true
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
- "dev": true
- },
- "burp-brightscript": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/burp-brightscript/-/burp-brightscript-0.4.2.tgz",
- "integrity": "sha512-AWVcXFeF3k0Qc32WtyWHNkC/uM5/m8/nyibQgUnXfuYWd1A2a1dNQWNMZOfeuTOfHVn+txRCXHwnqoFnx9U1hQ==",
- "dev": true,
- "requires": {
- "commander": "^2.20.0",
- "debug": "^4.1.1",
- "fs-extra": "^5.0.0",
- "glob-all": "^3.1.0",
- "lodash": "^4.17.19",
- "os": "^0.1.1",
- "replace-ext": "^1.0.0",
- "splice-string": "^2.0.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- }
- }
- },
- "bytes": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz",
- "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=",
- "dev": true
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dev": 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"
- }
- },
- "callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true
- },
- "camelcase": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
- "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
- "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.0.0",
- "map-obj": "^1.0.0"
- },
- "dependencies": {
- "camelcase": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
- "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
- "dev": true
- }
- }
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
- "dev": true
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "chardet": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
- "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true
- },
- "chevrotain": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-3.7.2.tgz",
- "integrity": "sha512-K+DuQSKRulV2UvXgqEuioiKBpzUHEgwodEmeBV0ebiO6gb07UiC5H3FLRsG/3ZYmlI6oCZu1QF5NbHkd5l7fig==",
- "dev": true,
- "requires": {
- "regexp-to-ast": "0.3.5"
- }
- },
- "chokidar": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
- "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
- "dev": true,
- "requires": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "fsevents": "~2.1.2",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.4.0"
- }
- },
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "clear": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz",
- "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==",
- "dev": true
- },
- "cli-columns": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/cli-columns/-/cli-columns-3.1.2.tgz",
- "integrity": "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=",
- "dev": true,
- "requires": {
- "string-width": "^2.0.0",
- "strip-ansi": "^3.0.1"
- },
- "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
- },
- "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
- },
- "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": {
- "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"
- }
- }
- }
- },
- "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.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "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.1",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
- "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
- "dev": true
- },
- "cliui": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
- "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^6.2.0"
- }
- },
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- },
- "clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
- "dev": true
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
- },
- "cloneable-readable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
- "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "process-nextick-args": "^2.0.0",
- "readable-stream": "^2.3.5"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.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
- },
- "collection-map": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
- "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
- "dev": true,
- "requires": {
- "arr-map": "^2.0.2",
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- }
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "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
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "dev": true
- },
- "colors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
- "dev": true
- },
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "requires": {
- "delayed-stream": "~1.0.0"
- }
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
- },
- "compress-commons": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz",
- "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==",
- "dev": true,
- "requires": {
- "buffer-crc32": "^0.2.13",
- "crc32-stream": "^3.0.1",
- "normalize-path": "^3.0.0",
- "readable-stream": "^2.3.6"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "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.2.2",
- "typedarray": "^0.0.6"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "connect": {
- "version": "3.7.0",
- "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
- "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "finalhandler": "1.1.2",
- "parseurl": "~1.3.3",
- "utils-merge": "1.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "connect-livereload": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.4.1.tgz",
- "integrity": "sha1-D4oagWvJuv+uRjfM6pF0Yv41kXo=",
- "dev": true
- },
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
- },
- "copy-props": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
- "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
- "dev": true,
- "requires": {
- "each-props": "^1.3.0",
- "is-plain-object": "^2.0.1"
- }
- },
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
- "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
- },
- "crc": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
- "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
- "dev": true,
- "requires": {
- "buffer": "^5.1.0"
- }
- },
- "crc32-stream": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
- "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
- "dev": true,
- "requires": {
- "crc": "^3.4.4",
- "readable-stream": "^3.4.0"
- }
- },
- "cross-platform-clear-console": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz",
- "integrity": "sha512-To+sJ6plHHC6k5DfdvSVn6F1GRGJh/R6p76bCpLbyMyHEmbqFyuMAeGwDcz/nGDWH3HUcjFTTX9iUSCzCg9Eiw==",
- "dev": true
- },
- "cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
- "dev": true,
- "requires": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "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.1"
- }
- },
- "d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "dev": true,
- "requires": {
- "es5-ext": "^0.10.50",
- "type": "^1.0.1"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
- "dev": true
- },
- "debounce-promise": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
- "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==",
- "dev": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "default-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
- "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
- "dev": true,
- "requires": {
- "kind-of": "^5.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "default-resolution": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
- "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "depd": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
- "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
- "dev": true
- },
- "destroy": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
- "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
- "dev": true
- },
- "detect-file": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
- },
- "detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true,
- "requires": {
- "repeating": "^2.0.0"
- }
- },
- "diff": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.8.tgz",
- "integrity": "sha1-NDJ2MI7Jkbe8giZ+1VvBQR+XFmY=",
- "dev": true
- },
- "doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "requires": {
- "esutils": "^2.0.2"
- }
- },
- "duplexer2": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
- "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
- "dev": true,
- "requires": {
- "readable-stream": "~1.1.9"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
- }
- },
- "duplexify": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
- "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0",
- "stream-shift": "^1.0.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "each-props": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
- "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.1",
- "object.defaults": "^1.1.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "dev": true,
- "requires": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
- "dev": true
- },
- "emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
- "dev": true
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- },
- "errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "dev": true,
- "requires": {
- "prr": "~1.0.1"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "^0.2.1"
- }
- },
- "es2015": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/es2015/-/es2015-0.0.0.tgz",
- "integrity": "sha1-hO7kw1yCd2WLaOfkY42zB0GCKxQ=",
- "dev": true
- },
- "es5-ext": {
- "version": "0.10.53",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
- "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
- "dev": true,
- "requires": {
- "es6-iterator": "~2.0.3",
- "es6-symbol": "~3.1.3",
- "next-tick": "~1.0.0"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "dev": true,
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.35",
- "es6-symbol": "^3.1.1"
- }
- },
- "es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "dev": true,
- "requires": {
- "d": "^1.0.1",
- "ext": "^1.1.2"
- }
- },
- "es6-weak-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
- "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
- "dev": true,
- "requires": {
- "d": "1",
- "es5-ext": "^0.10.46",
- "es6-iterator": "^2.0.3",
- "es6-symbol": "^3.1.1"
- }
- },
- "escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
- "dev": true
- },
- "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
- },
- "eslint": {
- "version": "5.16.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz",
- "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "ajv": "^6.9.1",
- "chalk": "^2.1.0",
- "cross-spawn": "^6.0.5",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "eslint-scope": "^4.0.3",
- "eslint-utils": "^1.3.1",
- "eslint-visitor-keys": "^1.0.0",
- "espree": "^5.0.1",
- "esquery": "^1.0.1",
- "esutils": "^2.0.2",
- "file-entry-cache": "^5.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob": "^7.1.2",
- "globals": "^11.7.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "inquirer": "^6.2.2",
- "js-yaml": "^3.13.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.3.0",
- "lodash": "^4.17.11",
- "minimatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "natural-compare": "^1.4.0",
- "optionator": "^0.8.2",
- "path-is-inside": "^1.0.2",
- "progress": "^2.0.0",
- "regexpp": "^2.0.1",
- "semver": "^5.5.1",
- "strip-ansi": "^4.0.0",
- "strip-json-comments": "^2.0.1",
- "table": "^5.2.3",
- "text-table": "^0.2.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"
- }
- }
- }
- },
- "eslint-plugin-roku": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-roku/-/eslint-plugin-roku-1.4.1.tgz",
- "integrity": "sha512-Ucpl2w3sA/+sZceyh2E6eqykP/BM1T1t3UFVK63FRWZovNFBNuVIfj4KOd5wVI4/XczJG4EaN183cI8wbArIFw==",
- "dev": true,
- "requires": {
- "@roku-road/bright": "^1.2.13"
- }
- },
- "eslint-scope": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz",
- "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
- "dev": true,
- "requires": {
- "esrecurse": "^4.1.0",
- "estraverse": "^4.1.1"
- }
- },
- "eslint-utils": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
- "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
- "dev": true,
- "requires": {
- "eslint-visitor-keys": "^1.1.0"
- }
- },
- "eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true
- },
- "espree": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz",
- "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==",
- "dev": true,
- "requires": {
- "acorn": "^6.0.7",
- "acorn-jsx": "^5.0.0",
- "eslint-visitor-keys": "^1.0.0"
- }
- },
- "esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true
- },
- "esquery": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
- "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
- "dev": true,
- "requires": {
- "estraverse": "^5.1.0"
- },
- "dependencies": {
- "estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
- "dev": true
- }
- }
- },
- "esrecurse": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
- "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
- "dev": true,
- "requires": {
- "estraverse": "^4.1.0"
- }
- },
- "estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
- "dev": true
- },
- "eventemitter3": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
- "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
- "dev": true
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "dev": true,
- "optional": true,
- "requires": {
- "fill-range": "^2.1.0"
- },
- "dependencies": {
- "fill-range": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
- "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
- "dev": true,
- "optional": true,
- "requires": {
- "is-number": "^2.1.0",
- "isobject": "^2.0.0",
- "randomatic": "^3.0.0",
- "repeat-element": "^1.1.2",
- "repeat-string": "^1.5.2"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "dev": true,
- "optional": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "optional": true,
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "ext": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
- "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
- "dev": true,
- "requires": {
- "type": "^2.0.0"
- },
- "dependencies": {
- "type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
- "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==",
- "dev": true
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "external-editor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
- "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
- "dev": true,
- "requires": {
- "chardet": "^0.7.0",
- "iconv-lite": "^0.4.24",
- "tmp": "^0.0.33"
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": 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.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fancy-log": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
- "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
- "dev": true,
- "requires": {
- "ansi-gray": "^0.1.1",
- "color-support": "^1.1.3",
- "parse-node-version": "^1.0.0",
- "time-stamp": "^1.0.0"
- }
- },
- "fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
- "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
- },
- "dependencies": {
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "^3.0.1",
- "picomatch": "^2.0.5"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fastq": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
- "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
- "dev": true,
- "requires": {
- "reusify": "^1.0.4"
- }
- },
- "faye-websocket": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.7.3.tgz",
- "integrity": "sha1-zEB0x/Sk39A69U3WXDVLE1EyzhE=",
- "dev": true,
- "requires": {
- "websocket-driver": ">=0.3.6"
- }
- },
- "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"
- }
- },
- "file-entry-cache": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
- "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
- "dev": true,
- "requires": {
- "flat-cache": "^2.0.1"
- }
- },
- "file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
- "dev": true,
- "optional": true
- },
- "file-url": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz",
- "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==",
- "dev": true
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "dev": true,
- "optional": true
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "^5.0.1"
- }
- },
- "finalhandler": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
- "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "~2.3.0",
- "parseurl": "~1.3.3",
- "statuses": "~1.5.0",
- "unpipe": "~1.0.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "requires": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- }
- },
- "findup-sync": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
- "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
- "dev": true,
- "requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^4.0.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
- }
- },
- "fined": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
- "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "is-plain-object": "^2.0.3",
- "object.defaults": "^1.1.0",
- "object.pick": "^1.2.0",
- "parse-filepath": "^1.0.1"
- }
- },
- "flagged-respawn": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
- "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
- "dev": true
- },
- "flat-cache": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
- "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
- "dev": true,
- "requires": {
- "flatted": "^2.0.0",
- "rimraf": "2.6.3",
- "write": "1.0.3"
- }
- },
- "flatted": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
- "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
- "dev": true
- },
- "flush-write-stream": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
- "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "readable-stream": "^2.3.6"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
- "dev": true,
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "fork-stream": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
- "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
- "dev": true
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
- "dev": true
- },
- "fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true
- },
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "fs-mkdirp-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
- "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "through2": "^2.0.3"
- }
- },
- "fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
- "dev": true,
- "optional": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true
- },
- "get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "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
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0"
- }
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-all": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz",
- "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==",
- "dev": true,
- "requires": {
- "glob": "^7.1.2",
- "yargs": "^15.3.1"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "dev": true,
- "optional": true,
- "requires": {
- "glob-parent": "^2.0.0",
- "is-glob": "^2.0.0"
- },
- "dependencies": {
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-glob": "^2.0.0"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true,
- "optional": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extglob": "^1.0.0"
- }
- }
- }
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "dev": true,
- "requires": {
- "is-glob": "^4.0.1"
- }
- },
- "glob-stream": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
- "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
- "dev": true,
- "requires": {
- "extend": "^3.0.0",
- "glob": "^7.1.1",
- "glob-parent": "^3.1.0",
- "is-negated-glob": "^1.0.0",
- "ordered-read-streams": "^1.0.0",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.1.5",
- "remove-trailing-separator": "^1.0.1",
- "to-absolute-glob": "^2.0.0",
- "unique-stream": "^2.0.2"
- },
- "dependencies": {
- "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.0"
- }
- },
- "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.0"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "glob-watcher": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz",
- "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==",
- "dev": true,
- "requires": {
- "anymatch": "^2.0.0",
- "async-done": "^1.2.0",
- "chokidar": "^2.0.0",
- "is-negated-glob": "^1.0.0",
- "just-debounce": "^1.0.0",
- "normalize-path": "^3.0.0",
- "object.defaults": "^1.1.0"
- },
- "dependencies": {
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
- "dev": true,
- "requires": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
- },
- "dependencies": {
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- }
- }
- },
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
- "dev": true
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- }
- },
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "dev": true,
- "requires": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "fsevents": "^1.2.7",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- }
- },
- "fsevents": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
- "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
- "dev": true,
- "optional": true,
- "requires": {
- "bindings": "^1.5.0",
- "nan": "^2.12.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.0"
- },
- "dependencies": {
- "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.0"
- }
- }
- }
- },
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
- "dev": true,
- "requires": {
- "binary-extensions": "^1.0.0"
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- },
- "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.5"
- }
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- },
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "dev": true,
- "requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- }
- },
- "globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true
- },
- "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.1",
- "glob": "^7.0.3",
- "object-assign": "^4.0.1",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "glogg": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
- "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
- "dev": true,
- "requires": {
- "sparkles": "^1.0.0"
- }
- },
- "graceful-fs": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
- "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
- "dev": true
- },
- "gulp": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
- "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
- "dev": true,
- "requires": {
- "glob-watcher": "^5.0.3",
- "gulp-cli": "^2.2.0",
- "undertaker": "^1.2.1",
- "vinyl-fs": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "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.1",
- "strip-ansi": "^3.0.1",
- "wrap-ansi": "^2.0.0"
- }
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
- "dev": true
- },
- "gulp-cli": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz",
- "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==",
- "dev": true,
- "requires": {
- "ansi-colors": "^1.0.1",
- "archy": "^1.0.0",
- "array-sort": "^1.0.0",
- "color-support": "^1.1.3",
- "concat-stream": "^1.6.0",
- "copy-props": "^2.0.1",
- "fancy-log": "^1.3.2",
- "gulplog": "^1.0.0",
- "interpret": "^1.4.0",
- "isobject": "^3.0.1",
- "liftoff": "^3.1.0",
- "matchdep": "^2.0.0",
- "mute-stdout": "^1.0.0",
- "pretty-hrtime": "^1.0.0",
- "replace-homedir": "^1.0.0",
- "semver-greatest-satisfied-range": "^1.1.0",
- "v8flags": "^3.2.0",
- "yargs": "^7.1.0"
- }
- },
- "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.0"
- }
- },
- "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
- },
- "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.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
- },
- "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.0.0"
- }
- },
- "which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
- "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.1",
- "strip-ansi": "^3.0.1"
- }
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
- "dev": true
- },
- "yargs": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz",
- "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==",
- "dev": true,
- "requires": {
- "camelcase": "^3.0.0",
- "cliui": "^3.2.0",
- "decamelize": "^1.1.1",
- "get-caller-file": "^1.0.1",
- "os-locale": "^1.4.0",
- "read-pkg-up": "^1.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^1.0.2",
- "which-module": "^1.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "5.0.0-security.0"
- }
- },
- "yargs-parser": {
- "version": "5.0.0-security.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0-security.0.tgz",
- "integrity": "sha512-T69y4Ps64LNesYxeYGYPvfoMTt/7y1XtfpIslUeK4um+9Hu7hlGoRtaDLvdXb7+/tfq4opVa2HRY5xGip022rQ==",
- "dev": true,
- "requires": {
- "camelcase": "^3.0.0",
- "object.assign": "^4.1.0"
- }
- }
- }
- },
- "gulp-clean": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/gulp-clean/-/gulp-clean-0.4.0.tgz",
- "integrity": "sha512-DARK8rNMo4lHOFLGTiHEJdf19GuoBDHqGUaypz+fOhrvOs3iFO7ntdYtdpNxv+AzSJBx/JfypF0yEj9ks1IStQ==",
- "dev": true,
- "requires": {
- "fancy-log": "^1.3.2",
- "plugin-error": "^0.1.2",
- "rimraf": "^2.6.2",
- "through2": "^2.0.3",
- "vinyl": "^2.1.0"
- }
- },
- "gulp-debug-streams": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/gulp-debug-streams/-/gulp-debug-streams-3.0.0.tgz",
- "integrity": "sha1-bUP6FgGe1Y50wqVgWRoNF0iVJRw=",
- "dev": true,
- "requires": {
- "chalk": "^1.0.0",
- "gulp-util": "^3.0.0",
- "object-assign": "^4.0.1",
- "plur": "^2.0.0",
- "through2": "^2.0.0",
- "tildify": "^1.1.2"
- },
- "dependencies": {
- "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": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "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.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=",
- "dev": true
- }
- }
- },
- "gulp-dedupe": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/gulp-dedupe/-/gulp-dedupe-0.0.2.tgz",
- "integrity": "sha1-Nu+Srff89T4vCW++lmXZiPnhyn4=",
- "dev": true,
- "requires": {
- "colors": "~1.0.2",
- "diff": "~1.0.8",
- "gulp-util": "~3.0.1",
- "lodash.defaults": "~2.4.1",
- "through": "~2.3.6"
- },
- "dependencies": {
- "lodash.defaults": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz",
- "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=",
- "dev": true,
- "requires": {
- "lodash._objecttypes": "~2.4.1",
- "lodash.keys": "~2.4.1"
- }
- },
- "lodash.keys": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz",
- "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
- "dev": true,
- "requires": {
- "lodash._isnative": "~2.4.1",
- "lodash._shimkeys": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- }
- }
- },
- "gulp-file": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/gulp-file/-/gulp-file-0.4.0.tgz",
- "integrity": "sha1-RRNWoqxQicbbkaBEQlKgVDZXAGs=",
- "dev": true,
- "requires": {
- "through2": "^0.4.1",
- "vinyl": "^2.1.0"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "object-keys": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz",
- "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "through2": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.4.2.tgz",
- "integrity": "sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=",
- "dev": true,
- "requires": {
- "readable-stream": "~1.0.17",
- "xtend": "~2.1.1"
- }
- },
- "xtend": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz",
- "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=",
- "dev": true,
- "requires": {
- "object-keys": "~0.4.0"
- }
- }
- }
- },
- "gulp-hb": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/gulp-hb/-/gulp-hb-7.1.0.tgz",
- "integrity": "sha512-dhxeT6UBHXnLB94jyDLXG10PTG0aeZzJCY5FWC0zr9KcOwwvu6uE5Eg0HFGWiSPK8qpMH1NWsWLrVk0F0KtEQA==",
- "dev": true,
- "requires": {
- "ansi-gray": "^0.1.1",
- "ansi-green": "^0.1.1",
- "cli-columns": "^3.1.2",
- "handlebars": "^4.1.0",
- "handlebars-wax": "^6.1.0",
- "plugin-error": "^0.1.2",
- "through2": "^2.0.3"
- }
- },
- "gulp-if": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
- "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
- "dev": true,
- "requires": {
- "gulp-match": "^1.0.3",
- "ternary-stream": "^2.0.1",
- "through2": "^2.0.1"
- }
- },
- "gulp-match": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz",
- "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==",
- "dev": true,
- "requires": {
- "minimatch": "^3.0.3"
- }
- },
- "gulp-task-listing": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/gulp-task-listing/-/gulp-task-listing-1.1.0.tgz",
- "integrity": "sha512-CP2SeHu/GQnuLS0UFWwRW/LX6XIZU4mzNZGNXcAP4z3kgMpvBg0B1tm2OIKI7n+vM5XrP+s99Ms+TCZONWEQyQ==",
- "dev": true,
- "requires": {
- "chalk": "*"
- }
- },
- "gulp-util": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
- "dev": true,
- "requires": {
- "array-differ": "^1.0.0",
- "array-uniq": "^1.0.2",
- "beeper": "^1.0.0",
- "chalk": "^1.0.0",
- "dateformat": "^2.0.0",
- "fancy-log": "^1.1.0",
- "gulplog": "^1.0.0",
- "has-gulplog": "^0.1.0",
- "lodash._reescape": "^3.0.0",
- "lodash._reevaluate": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.template": "^3.0.0",
- "minimist": "^1.1.0",
- "multipipe": "^0.1.2",
- "object-assign": "^3.0.0",
- "replace-ext": "0.0.1",
- "through2": "^2.0.0",
- "vinyl": "^0.5.0"
- },
- "dependencies": {
- "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": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "dev": true
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
- "dev": true
- },
- "dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
- "dev": true
- },
- "object-assign": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
- "dev": true
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
- "dev": true
- },
- "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.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=",
- "dev": true
- },
- "vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
- "dev": true,
- "requires": {
- "clone": "^1.0.0",
- "clone-stats": "^0.0.1",
- "replace-ext": "0.0.1"
- }
- }
- }
- },
- "gulp-webserver": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/gulp-webserver/-/gulp-webserver-0.9.1.tgz",
- "integrity": "sha1-4JmSFl2XxYZWFtZCoWAVKbA2cGQ=",
- "dev": true,
- "requires": {
- "connect": "^3.0.1",
- "connect-livereload": "^0.4.0",
- "gulp-util": "^2.2.19",
- "isarray": "0.0.1",
- "node.extend": "^1.0.10",
- "open": "^0.0.5",
- "proxy-middleware": "^0.5.0",
- "serve-index": "^1.1.4",
- "serve-static": "^1.3.0",
- "through2": "^0.5.1",
- "tiny-lr": "0.1.4",
- "watch": "^0.11.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
- "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=",
- "dev": true
- },
- "ansi-styles": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
- "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
- "dev": true
- },
- "chalk": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
- "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
- "dev": true,
- "requires": {
- "ansi-styles": "^1.1.0",
- "escape-string-regexp": "^1.0.0",
- "has-ansi": "^0.1.0",
- "strip-ansi": "^0.3.0",
- "supports-color": "^0.2.0"
- }
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
- "dev": true
- },
- "dateformat": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz",
- "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=",
- "dev": true,
- "requires": {
- "get-stdin": "^4.0.1",
- "meow": "^3.3.0"
- }
- },
- "gulp-util": {
- "version": "2.2.20",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-2.2.20.tgz",
- "integrity": "sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=",
- "dev": true,
- "requires": {
- "chalk": "^0.5.0",
- "dateformat": "^1.0.7-1.2.3",
- "lodash._reinterpolate": "^2.4.1",
- "lodash.template": "^2.4.1",
- "minimist": "^0.2.0",
- "multipipe": "^0.1.0",
- "through2": "^0.5.0",
- "vinyl": "^0.2.1"
- }
- },
- "has-ansi": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
- "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
- "dev": true,
- "requires": {
- "ansi-regex": "^0.2.0"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "lodash._reinterpolate": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz",
- "integrity": "sha1-TxInqlqHEfxjL1sHofRgequLMiI=",
- "dev": true
- },
- "lodash.defaults": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-2.4.1.tgz",
- "integrity": "sha1-p+iIXwXmiFEUS24SqPNngCa8TFQ=",
- "dev": true,
- "requires": {
- "lodash._objecttypes": "~2.4.1",
- "lodash.keys": "~2.4.1"
- }
- },
- "lodash.escape": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-2.4.1.tgz",
- "integrity": "sha1-LOEsXghNsKV92l5dHu659dF1o7Q=",
- "dev": true,
- "requires": {
- "lodash._escapehtmlchar": "~2.4.1",
- "lodash._reunescapedhtml": "~2.4.1",
- "lodash.keys": "~2.4.1"
- }
- },
- "lodash.keys": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz",
- "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
- "dev": true,
- "requires": {
- "lodash._isnative": "~2.4.1",
- "lodash._shimkeys": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- },
- "lodash.template": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-2.4.1.tgz",
- "integrity": "sha1-nmEQB+32KRKal0qzxIuBez4c8g0=",
- "dev": true,
- "requires": {
- "lodash._escapestringchar": "~2.4.1",
- "lodash._reinterpolate": "~2.4.1",
- "lodash.defaults": "~2.4.1",
- "lodash.escape": "~2.4.1",
- "lodash.keys": "~2.4.1",
- "lodash.templatesettings": "~2.4.1",
- "lodash.values": "~2.4.1"
- }
- },
- "lodash.templatesettings": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz",
- "integrity": "sha1-6nbHXRHrhtTb6JqDiTu4YZKaxpk=",
- "dev": true,
- "requires": {
- "lodash._reinterpolate": "~2.4.1",
- "lodash.escape": "~2.4.1"
- }
- },
- "minimist": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.1.tgz",
- "integrity": "sha512-GY8fANSrTMfBVfInqJAY41QkOM+upUTytK1jZ0c8+3HdHrJxBJ3rF5i9moClXTE8uUSnUo8cAsCoxDXvSY4DHg==",
- "dev": true
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "strip-ansi": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
- "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
- "dev": true,
- "requires": {
- "ansi-regex": "^0.2.1"
- }
- },
- "supports-color": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
- "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=",
- "dev": true
- },
- "through2": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.5.1.tgz",
- "integrity": "sha1-390BLrnHAOIyP9M084rGIqs3Lac=",
- "dev": true,
- "requires": {
- "readable-stream": "~1.0.17",
- "xtend": "~3.0.0"
- }
- },
- "vinyl": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.2.3.tgz",
- "integrity": "sha1-vKk4IJWC7FpJrVOKAPofEl5RMlI=",
- "dev": true,
- "requires": {
- "clone-stats": "~0.0.1"
- }
- },
- "xtend": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz",
- "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=",
- "dev": true
- }
- }
- },
- "gulp-zip": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/gulp-zip/-/gulp-zip-4.2.0.tgz",
- "integrity": "sha512-I+697f6jf+PncdTrqfuwoauxgnLG1yHRg3vlmvDgmJuEnlEHy4meBktJ/oHgfyg4tp6X25wuZqUOraVeVg97wQ==",
- "dev": true,
- "requires": {
- "get-stream": "^3.0.0",
- "plugin-error": "^0.1.2",
- "through2": "^2.0.1",
- "vinyl": "^2.1.0",
- "yazl": "^2.1.0"
- }
- },
- "gulplog": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
- "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
- "dev": true,
- "requires": {
- "glogg": "^1.0.0"
- }
- },
- "handlebars": {
- "version": "4.7.6",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
- "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5",
- "neo-async": "^2.6.0",
- "source-map": "^0.6.1",
- "uglify-js": "^3.1.4",
- "wordwrap": "^1.0.0"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "handlebars-wax": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/handlebars-wax/-/handlebars-wax-6.1.0.tgz",
- "integrity": "sha1-nZqJnmxnuUbHdCzht9G/WPK6FyI=",
- "dev": true,
- "requires": {
- "object-assign": "^4.1.1",
- "require-glob": "^3.2.0"
- }
- },
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
- "dev": true
- },
- "har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "dev": true,
- "requires": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- }
- }
- },
- "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-gulplog": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
- "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
- "dev": true,
- "requires": {
- "sparkles": "^1.0.0"
- }
- },
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
- "dev": true
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "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.5"
- }
- }
- }
- },
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "home-or-tmp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.1"
- }
- },
- "homedir-polyfill": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
- "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
- "dev": true,
- "requires": {
- "parse-passwd": "^1.0.0"
- }
- },
- "hosted-git-info": {
- "version": "2.8.8",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
- "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
- "dev": true
- },
- "http-errors": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
- "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.3",
- "setprototypeof": "1.1.0",
- "statuses": ">= 1.4.0 < 2"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
- }
- },
- "http-parser-js": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
- "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==",
- "dev": true
- },
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
- }
- },
- "iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
- "requires": {
- "safer-buffer": ">= 2.1.2 < 3"
- }
- },
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
- "dev": true
- },
- "ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true
- },
- "import-fresh": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
- "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
- "dev": true,
- "requires": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- }
- },
- "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": "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.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "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": "6.5.2",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz",
- "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==",
- "dev": true,
- "requires": {
- "ansi-escapes": "^3.2.0",
- "chalk": "^2.4.2",
- "cli-cursor": "^2.1.0",
- "cli-width": "^2.0.0",
- "external-editor": "^3.0.3",
- "figures": "^2.0.0",
- "lodash": "^4.17.12",
- "mute-stream": "0.0.7",
- "run-async": "^2.2.0",
- "rxjs": "^6.4.0",
- "string-width": "^2.1.0",
- "strip-ansi": "^5.1.0",
- "through": "^2.3.6"
- },
- "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
- },
- "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
- },
- "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": {
- "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"
- }
- }
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- }
- }
- }
- }
- },
- "interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "dev": true
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.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
- },
- "ip": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
- "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
- "dev": true
- },
- "irregular-plurals": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz",
- "integrity": "sha1-LKmwM2UREYVUEvFr5dd8YqRYp2Y=",
- "dev": true
- },
- "is": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz",
- "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==",
- "dev": true
- },
- "is-absolute": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
- "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
- "dev": true,
- "requires": {
- "is-relative": "^1.0.0",
- "is-windows": "^1.0.1"
- }
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "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.5"
- }
- }
- }
- },
- "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-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "^2.0.0"
- }
- },
- "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-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "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.5"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
- "dev": true,
- "optional": true
- },
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-primitive": "^2.0.0"
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "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.1.0",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
- "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true
- },
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.1"
- }
- },
- "is-negated-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
- "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
- "dev": true
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
- "dev": true,
- "optional": true
- },
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
- "dev": true,
- "optional": true
- },
- "is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
- "dev": true,
- "requires": {
- "is-unc-path": "^1.0.0"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
- "dev": true
- },
- "is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "dev": true,
- "requires": {
- "unc-path-regex": "^0.1.2"
- }
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "is-valid-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
- "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "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
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
- "dev": true
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "js-yaml": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
- "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
- "dev": true,
- "requires": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- }
- },
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true
- },
- "jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "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
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
- },
- "jsonc-parser": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.0.tgz",
- "integrity": "sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==",
- "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.6"
- }
- },
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
- }
- },
- "just-debounce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
- "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
- "dev": true
- },
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
- },
- "last-run": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
- "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
- "dev": true,
- "requires": {
- "default-resolution": "^2.0.0",
- "es6-weak-map": "^2.0.1"
- }
- },
- "lazystream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
- "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.5"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "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"
- }
- },
- "lead": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
- "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
- "dev": true,
- "requires": {
- "flush-write-stream": "^1.0.2"
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "liftoff": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
- "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
- "dev": true,
- "requires": {
- "extend": "^3.0.0",
- "findup-sync": "^3.0.0",
- "fined": "^1.0.1",
- "flagged-respawn": "^1.0.0",
- "is-plain-object": "^2.0.4",
- "object.map": "^1.0.0",
- "rechoir": "^0.6.2",
- "resolve": "^1.1.7"
- }
- },
- "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.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0",
- "strip-bom": "^2.0.0"
- }
- },
- "locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "requires": {
- "p-locate": "^4.1.0"
- }
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- },
- "lodash._basecopy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
- "dev": true
- },
- "lodash._basetostring": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
- "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
- "dev": true
- },
- "lodash._basevalues": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
- "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
- "dev": true
- },
- "lodash._escapehtmlchar": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz",
- "integrity": "sha1-32fDu2t+jh6DGrSL+geVuSr+iZ0=",
- "dev": true,
- "requires": {
- "lodash._htmlescapes": "~2.4.1"
- }
- },
- "lodash._escapestringchar": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz",
- "integrity": "sha1-7P4iYYoq3lC/7qQ5N+Ud9m8O23I=",
- "dev": true
- },
- "lodash._getnative": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
- "dev": true
- },
- "lodash._htmlescapes": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz",
- "integrity": "sha1-MtFL8IRLbeb4tioFG09nwii2JMs=",
- "dev": true
- },
- "lodash._isiterateecall": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
- "dev": true
- },
- "lodash._isnative": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz",
- "integrity": "sha1-PqZAS3hKe+g2x7V1gOHN95sUgyw=",
- "dev": true
- },
- "lodash._objecttypes": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz",
- "integrity": "sha1-fAt/admKH3ZSn4kLDNsbTf7BHBE=",
- "dev": true
- },
- "lodash._reescape": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
- "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
- "dev": true
- },
- "lodash._reevaluate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
- "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
- "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._reunescapedhtml": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz",
- "integrity": "sha1-dHxPxAED6zu4oJduVx96JlnpO6c=",
- "dev": true,
- "requires": {
- "lodash._htmlescapes": "~2.4.1",
- "lodash.keys": "~2.4.1"
- },
- "dependencies": {
- "lodash.keys": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz",
- "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
- "dev": true,
- "requires": {
- "lodash._isnative": "~2.4.1",
- "lodash._shimkeys": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- }
- }
- },
- "lodash._root": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
- "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
- "dev": true
- },
- "lodash._shimkeys": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz",
- "integrity": "sha1-bpzJZm/wgfC1psl4uD4kLmlJ0gM=",
- "dev": true,
- "requires": {
- "lodash._objecttypes": "~2.4.1"
- }
- },
- "lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
- "dev": true
- },
- "lodash.difference": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
- "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
- "dev": true
- },
- "lodash.escape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
- "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
- "dev": true,
- "requires": {
- "lodash._root": "^3.0.0"
- }
- },
- "lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
- "dev": true
- },
- "lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
- "dev": true
- },
- "lodash.isarray": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
- "dev": true
- },
- "lodash.isobject": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz",
- "integrity": "sha1-Wi5H/mmVPx7mMafrof5k0tBlWPU=",
- "dev": true,
- "requires": {
- "lodash._objecttypes": "~2.4.1"
- }
- },
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
- "dev": true
- },
- "lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
- "dev": true,
- "requires": {
- "lodash._getnative": "^3.0.0",
- "lodash.isarguments": "^3.0.0",
- "lodash.isarray": "^3.0.0"
- }
- },
- "lodash.restparam": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
- "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
- "dev": true
- },
- "lodash.template": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
- "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
- "dev": true,
- "requires": {
- "lodash._basecopy": "^3.0.0",
- "lodash._basetostring": "^3.0.0",
- "lodash._basevalues": "^3.0.0",
- "lodash._isiterateecall": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0",
- "lodash.keys": "^3.0.0",
- "lodash.restparam": "^3.0.0",
- "lodash.templatesettings": "^3.0.0"
- }
- },
- "lodash.templatesettings": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
- "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
- "dev": true,
- "requires": {
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0"
- }
- },
- "lodash.toarray": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
- "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=",
- "dev": true
- },
- "lodash.union": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
- "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
- "dev": true
- },
- "lodash.values": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz",
- "integrity": "sha1-q/UUQ2s8twUAFieXjLzzCxKA7qQ=",
- "dev": true,
- "requires": {
- "lodash.keys": "~2.4.1"
- },
- "dependencies": {
- "lodash.keys": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-2.4.1.tgz",
- "integrity": "sha1-SN6kbfj/djKxDXBrissmWR4rNyc=",
- "dev": true,
- "requires": {
- "lodash._isnative": "~2.4.1",
- "lodash._shimkeys": "~2.4.1",
- "lodash.isobject": "~2.4.1"
- }
- }
- }
- },
- "long": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
- "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=",
- "dev": true
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dev": true,
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "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.0"
- }
- },
- "luxon": {
- "version": "1.24.1",
- "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.24.1.tgz",
- "integrity": "sha512-CgnIMKAWT0ghcuWFfCWBnWGOddM0zu6c4wZAWmD0NN7MZTnro0+833DF6tJep+xlxRPg4KtsYEHYLfTMBQKwYg==",
- "dev": true
- },
- "make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "make-iterator": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
- "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
- },
- "map-obj": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
- "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
- "dev": true
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "matchdep": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
- "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
- "dev": true,
- "requires": {
- "findup-sync": "^2.0.0",
- "micromatch": "^3.0.4",
- "resolve": "^1.4.0",
- "stack-trace": "0.0.10"
- },
- "dependencies": {
- "findup-sync": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
- "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
- "dev": true,
- "requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^3.1.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
- }
- },
- "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.0"
- }
- }
- }
- },
- "math-random": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
- "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
- "dev": true,
- "optional": true
- },
- "media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
- "dev": true
- },
- "memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
- "dev": true,
- "requires": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "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.0.0",
- "decamelize": "^1.1.2",
- "loud-rejection": "^1.0.0",
- "map-obj": "^1.0.1",
- "minimist": "^1.1.3",
- "normalize-package-data": "^2.3.4",
- "object-assign": "^4.0.1",
- "read-pkg-up": "^1.0.1",
- "redent": "^1.0.0",
- "trim-newlines": "^1.0.0"
- }
- },
- "merge-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
- "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": 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.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- },
- "dependencies": {
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "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.5"
- }
- }
- }
- },
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- }
- }
- }
- },
- "mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
- "dev": true
- },
- "mime-db": {
- "version": "1.44.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
- "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.27",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
- "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
- "dev": true,
- "requires": {
- "mime-db": "1.44.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.7"
- }
- },
- "minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
- "dev": true
- },
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
- "dev": true,
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
- "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.5"
- }
- },
- "moment": {
- "version": "2.27.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz",
- "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "multipipe": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
- "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
- "dev": true,
- "requires": {
- "duplexer2": "0.0.2"
- }
- },
- "mute-stdout": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
- "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
- "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
- },
- "nan": {
- "version": "2.14.1",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
- "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
- "dev": true,
- "optional": true
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dev": 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-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "natives": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz",
- "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA=="
- },
- "natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true
- },
- "negotiator": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
- "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
- "dev": true
- },
- "neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
- },
- "next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
- "dev": true
- },
- "nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
- "node.extend": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz",
- "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==",
- "dev": true,
- "requires": {
- "has": "^1.0.3",
- "is": "^3.2.1"
- }
- },
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "now-and-later": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
- "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
- "dev": true,
- "requires": {
- "once": "^1.3.2"
- }
- },
- "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
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "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
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "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.5"
- }
- }
- }
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "object.defaults": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
- "dev": true,
- "requires": {
- "array-each": "^1.0.1",
- "array-slice": "^1.0.0",
- "for-own": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "object.map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
- "dev": true,
- "requires": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- }
- },
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
- "dev": true,
- "optional": true,
- "requires": {
- "for-own": "^0.1.4",
- "is-extendable": "^0.1.1"
- },
- "dependencies": {
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "dev": true,
- "optional": true,
- "requires": {
- "for-in": "^1.0.1"
- }
- }
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "object.reduce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
- "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
- "dev": true,
- "requires": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- }
- },
- "on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
- "dev": true,
- "requires": {
- "ee-first": "1.1.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "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.0.0"
- }
- },
- "open": {
- "version": "0.0.5",
- "resolved": "https://registry.npmjs.org/open/-/open-0.0.5.tgz",
- "integrity": "sha1-QsPhjslUZra/DcQvOilFw/DK2Pw=",
- "dev": true
- },
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- }
- },
- "ordered-read-streams": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
- "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "os": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz",
- "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=",
- "dev": true
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
- },
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "dev": true,
- "requires": {
- "lcid": "^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
- },
- "output-file-sync": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
- "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.4",
- "mkdirp": "^0.5.1",
- "object-assign": "^4.1.0"
- }
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "requires": {
- "p-limit": "^2.2.0"
- },
- "dependencies": {
- "p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "requires": {
- "p-try": "^2.0.0"
- }
- },
- "p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true
- }
- }
- },
- "p-reflect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-1.0.0.tgz",
- "integrity": "sha1-9Poe4btUbY6z7AMhFI3+CnkTe7g=",
- "dev": true
- },
- "p-settle": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-2.1.0.tgz",
- "integrity": "sha512-NHFIUYc+fQTFRrzzAugq0l1drwi57PB522smetcY8C/EoTYs6cU/fC6TJj0N3rq5NhhJJbhf0VGWziL3jZDnjA==",
- "dev": true,
- "requires": {
- "p-limit": "^1.2.0",
- "p-reflect": "^1.0.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
- },
- "parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "requires": {
- "callsites": "^3.0.0"
- }
- },
- "parse-filepath": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
- "dev": true,
- "requires": {
- "is-absolute": "^1.0.0",
- "map-cache": "^0.2.0",
- "path-root": "^0.1.1"
- }
- },
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
- "dev": true,
- "optional": true,
- "requires": {
- "glob-base": "^0.3.0",
- "is-dotfile": "^1.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.0"
- },
- "dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true,
- "optional": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extglob": "^1.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.2.0"
- }
- },
- "parse-ms": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
- "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==",
- "dev": true
- },
- "parse-node-version": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
- "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
- "dev": true
- },
- "parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "dev": true
- },
- "parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
- "dev": true
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
- },
- "path": {
- "version": "0.12.7",
- "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
- "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
- "dev": true,
- "requires": {
- "process": "^0.11.1",
- "util": "^0.10.3"
- }
- },
- "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": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "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-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=",
- "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-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "path-root": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
- "dev": true,
- "requires": {
- "path-root-regex": "^0.1.0"
- }
- },
- "path-root-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
- "dev": true
- },
- "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.2",
- "pify": "^2.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
- "dev": true
- },
- "picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
- "dev": true
- },
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "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.0"
- }
- },
- "plugin-error": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
- "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
- "dev": true,
- "requires": {
- "ansi-cyan": "^0.1.1",
- "ansi-red": "^0.1.1",
- "arr-diff": "^1.0.1",
- "arr-union": "^2.0.1",
- "extend-shallow": "^1.1.2"
- },
- "dependencies": {
- "arr-diff": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
- "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.0.1",
- "array-slice": "^0.2.3"
- }
- },
- "arr-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
- "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
- "dev": true
- },
- "array-slice": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
- "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
- "dev": true
- },
- "extend-shallow": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
- "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
- "dev": true,
- "requires": {
- "kind-of": "^1.1.0"
- }
- },
- "kind-of": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
- "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
- "dev": true
- }
- }
- },
- "plur": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz",
- "integrity": "sha1-dIJFLBoPUI4+NE6uwxLJHCncZVo=",
- "dev": true,
- "requires": {
- "irregular-plurals": "^1.0.0"
- }
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true,
- "optional": true
- },
- "pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
- "dev": true
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
- "dev": true
- },
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true
- },
- "proxy-middleware": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/proxy-middleware/-/proxy-middleware-0.5.1.tgz",
- "integrity": "sha1-2iTV1Ywd3xPa0jfH7KUDhJ6uqQM=",
- "dev": true
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
- "dev": true
- },
- "psl": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
- "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
- "dev": true
- },
- "pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- }
- },
- "pumpify": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
- "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
- "dev": true,
- "requires": {
- "duplexify": "^3.6.0",
- "inherits": "^2.0.3",
- "pump": "^2.0.0"
- }
- },
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true
- },
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
- "dev": true
- },
- "randomatic": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
- "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
- "dev": true,
- "optional": true,
- "requires": {
- "is-number": "^4.0.0",
- "kind-of": "^6.0.0",
- "math-random": "^1.0.1"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true,
- "optional": true
- }
- }
- },
- "range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
- "dev": true
- },
- "raw-body": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.3.0.tgz",
- "integrity": "sha1-l4IwoValVI9C7vFN4i0PT2EAg9E=",
- "dev": true,
- "requires": {
- "bytes": "1",
- "iconv-lite": "0.4.4"
- },
- "dependencies": {
- "iconv-lite": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.4.tgz",
- "integrity": "sha1-6V8uQdsHNfwhZS94J6XuMuY8g6g=",
- "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.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^1.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.0.0",
- "read-pkg": "^1.0.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.0.0",
- "pinkie-promise": "^2.0.0"
- }
- },
- "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.0"
- }
- }
- }
- },
- "readable-stream": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
- "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- }
- },
- "readdirp": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
- "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "dev": true,
- "requires": {
- "resolve": "^1.1.6"
- }
- },
- "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"
- }
- },
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "dev": true
- },
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "is-equal-shallow": "^0.1.3"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexp-to-ast": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.3.5.tgz",
- "integrity": "sha512-1CJygtdvsfNFwiyjaMLBWtg2tfEqx/jSZ8S6TV+GlNL8kiH8rb4cm5Pb7A/C2BpyM/fA8ZJEudlCwi/jvAY+Ow==",
- "dev": true
- },
- "regexpp": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
- "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
- "dev": true
- },
- "remove-bom-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
- "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5",
- "is-utf8": "^0.2.1"
- }
- },
- "remove-bom-stream": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
- "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
- "dev": true,
- "requires": {
- "remove-bom-buffer": "^3.0.0",
- "safe-buffer": "^5.1.0",
- "through2": "^2.0.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "dev": true
- },
- "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.0"
- }
- },
- "replace-ext": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz",
- "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==",
- "dev": true
- },
- "replace-homedir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
- "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1",
- "is-absolute": "^1.0.0",
- "remove-trailing-separator": "^1.1.0"
- }
- },
- "request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "dev": true,
- "requires": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- }
- },
- "request-debug": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/request-debug/-/request-debug-0.2.0.tgz",
- "integrity": "sha1-/AVOyBcYGwTKQaBSwTb2HEirr3g=",
- "dev": true,
- "requires": {
- "stringify-clone": "^1.0.0"
- }
- },
- "request-promise": {
- "version": "4.2.6",
- "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.6.tgz",
- "integrity": "sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==",
- "dev": true,
- "requires": {
- "bluebird": "^3.5.0",
- "request-promise-core": "1.1.4",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
- }
- },
- "request-promise-core": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
- "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.19"
- }
- },
- "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-glob": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/require-glob/-/require-glob-3.2.0.tgz",
- "integrity": "sha1-kL/iyO+0ufly65o/XlgIMuBPZNM=",
- "dev": true,
- "requires": {
- "glob-parent": "^3.0.0",
- "globby": "^6.0.0",
- "parent-module": "^0.1.0"
- },
- "dependencies": {
- "callsites": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-1.0.1.tgz",
- "integrity": "sha1-wUwkGIzo4dagMLTDyULmuolbaho=",
- "dev": true
- },
- "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.0"
- }
- },
- "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.0"
- }
- },
- "parent-module": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-0.1.0.tgz",
- "integrity": "sha1-tSkoY6HoxHbs+Ffn11yYkgskuKY=",
- "dev": true,
- "requires": {
- "callsites": "^1.0.0"
- }
- }
- }
- },
- "require-main-filename": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
- "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
- "dev": true
- },
- "resolve": {
- "version": "1.17.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
- "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
- "dev": true,
- "requires": {
- "path-parse": "^1.0.6"
- }
- },
- "resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.0",
- "global-modules": "^1.0.0"
- }
- },
- "resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true
- },
- "resolve-options": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
- "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
- "dev": true,
- "requires": {
- "value-or-function": "^3.0.0"
- }
- },
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "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.0",
- "signal-exit": "^3.0.2"
- }
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "dev": true
- },
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
- },
- "rimraf": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
- "dev": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "roku-deploy": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.1.1.tgz",
- "integrity": "sha512-mdcnlC4T4NlA/BW1FJ9VV1UGt5OF87F8efieso2BZNQ/LO7LgzWA8dPS69hmtout1aMbXvkSy1ksEiDdJOKiIQ==",
- "dev": true,
- "requires": {
- "archiver": "^3.0.0",
- "dateformat": "^3.0.3",
- "fs-extra": "^7.0.1",
- "glob": "^7.1.6",
- "minimatch": "^3.0.4",
- "path": "^0.12.7",
- "request": "^2.88.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- }
- }
- },
- "rooibos-cli": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/rooibos-cli/-/rooibos-cli-1.4.0.tgz",
- "integrity": "sha512-IdVAP0LyRXREDdtAi0acg3rolPrGLT2epwRbmy+XgxPQh+ut15Ji6h3vplfKHF864YN/Mz54RSi4FoKGsrSdrA==",
- "dev": true,
- "requires": {
- "babel-cli": "^6.26.0",
- "brs": "^0.25.1",
- "commander": "^6.0.0",
- "debug": "^4.1.1",
- "es2015": "0.0.0",
- "fs-extra": "^5.0.0",
- "glob-all": "^3.1.0",
- "lodash": "^4.17.19",
- "replace-ext": "^1.0.0",
- "request": "^2.88.0",
- "request-promise": "^4.2.4",
- "splice-string": "^2.0.0",
- "typescript": "3.7.4"
- },
- "dependencies": {
- "commander": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.0.0.tgz",
- "integrity": "sha512-s7EA+hDtTYNhuXkTlhqew4txMZVdszBmKWSPEMxGr8ru8JXR7bLUFIAtPhcSuFdJQ0ILMxnJi8GkQL0yvDy/YA==",
- "dev": true
- },
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "lodash": {
- "version": "4.17.19",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
- "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
- "dev": true
- },
- "typescript": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz",
- "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==",
- "dev": true
- }
- }
- },
- "run-async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
- "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
- "dev": true
- },
- "run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
- "dev": true
- },
- "rxjs": {
- "version": "6.6.2",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
- "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
- "dev": true,
- "requires": {
- "tslib": "^1.9.0"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
- "requires": {
- "ret": "~0.1.10"
- }
- },
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
- },
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true
- },
- "semver-greatest-satisfied-range": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
- "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
- "dev": true,
- "requires": {
- "sver-compat": "^1.5.0"
- }
- },
- "send": {
- "version": "0.17.1",
- "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
- "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
- "dev": true,
- "requires": {
- "debug": "2.6.9",
- "depd": "~1.1.2",
- "destroy": "~1.0.4",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "~1.7.2",
- "mime": "1.6.0",
- "ms": "2.1.1",
- "on-finished": "~2.3.0",
- "range-parser": "~1.2.1",
- "statuses": "~1.5.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- },
- "dependencies": {
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "http-errors": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
- "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
- "dev": true,
- "requires": {
- "depd": "~1.1.2",
- "inherits": "2.0.4",
- "setprototypeof": "1.1.1",
- "statuses": ">= 1.5.0 < 2",
- "toidentifier": "1.0.0"
- }
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- },
- "setprototypeof": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
- "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
- "dev": true
- }
- }
- },
- "serialize-error": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
- "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
- "dev": true,
- "requires": {
- "type-fest": "^0.13.1"
- }
- },
- "serve-index": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
- "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
- "dev": true,
- "requires": {
- "accepts": "~1.3.4",
- "batch": "0.6.1",
- "debug": "2.6.9",
- "escape-html": "~1.0.3",
- "http-errors": "~1.6.2",
- "mime-types": "~2.1.17",
- "parseurl": "~1.3.2"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "serve-static": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
- "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
- "dev": true,
- "requires": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.17.1"
- }
- },
- "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
- },
- "set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "setprototypeof": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
- "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
- "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.3",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
- "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
- "dev": true
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true
- },
- "slice-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
- "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.0",
- "astral-regex": "^1.0.0",
- "is-fullwidth-code-point": "^2.0.0"
- },
- "dependencies": {
- "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
- }
- }
- },
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
- }
- },
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
- "dev": true,
- "requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
- "requires": {
- "kind-of": "^3.2.0"
- },
- "dependencies": {
- "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.5"
- }
- }
- }
- },
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
- "dev": true
- },
- "source-map-resolve": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
- "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
- "dev": true,
- "requires": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
- "dev": true,
- "requires": {
- "source-map": "^0.5.6"
- },
- "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
- }
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
- "dev": true
- },
- "sparkles": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
- "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
- "dev": true
- },
- "spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "dev": true,
- "requires": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "requires": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
- "dev": true
- },
- "splice-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/splice-string/-/splice-string-2.0.0.tgz",
- "integrity": "sha1-HpCypb6O0luBA2UlVZrIEqjB8wU=",
- "dev": true,
- "requires": {
- "lodash.toarray": "^4.4.0"
- }
- },
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true
- },
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "dev": true,
- "requires": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- }
- },
- "stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
- "dev": true
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
- "requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
- }
- },
- "statuses": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
- "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
- "dev": true
- },
- "stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
- "dev": true
- },
- "stream-exhaust": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
- "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
- "dev": true
- },
- "stream-shift": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
- "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
- "dev": true
- },
- "string-width": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
- "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
- "dev": true,
- "requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.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.0"
- }
- },
- "stringify-clone": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stringify-clone/-/stringify-clone-1.1.1.tgz",
- "integrity": "sha1-MJojX7Ts/M19OI2+GLqQT6yvQzs=",
- "dev": true
- },
- "strip-ansi": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
- "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
- "dev": true,
- "requires": {
- "ansi-regex": "^5.0.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.0"
- }
- },
- "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"
- }
- },
- "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
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- },
- "sver-compat": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
- "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
- "dev": true,
- "requires": {
- "es6-iterator": "^2.0.1",
- "es6-symbol": "^3.1.1"
- }
- },
- "table": {
- "version": "5.4.6",
- "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
- "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
- "dev": true,
- "requires": {
- "ajv": "^6.10.2",
- "lodash": "^4.17.14",
- "slice-ansi": "^2.1.0",
- "string-width": "^3.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
- "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
- "dev": true
- },
- "emoji-regex": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
- "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
- "dev": true
- },
- "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
- },
- "string-width": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
- "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
- "dev": true,
- "requires": {
- "emoji-regex": "^7.0.1",
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^5.1.0"
- }
- },
- "strip-ansi": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
- "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
- "dev": true,
- "requires": {
- "ansi-regex": "^4.1.0"
- }
- }
- }
- },
- "tar-stream": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz",
- "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==",
- "dev": true,
- "requires": {
- "bl": "^4.0.1",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- }
- },
- "ternary-stream": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.1.1.tgz",
- "integrity": "sha512-j6ei9hxSoyGlqTmoMjOm+QNvUKDOIY6bNl4Uh1lhBvl6yjPW2iLqxDUYyfDPZknQ4KdRziFl+ec99iT4l7g0cw==",
- "dev": true,
- "requires": {
- "duplexify": "^3.5.0",
- "fork-stream": "^0.0.4",
- "merge-stream": "^1.0.0",
- "through2": "^2.0.1"
- }
- },
- "text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
- "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.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "through2-filter": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
- "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
- "dev": true,
- "requires": {
- "through2": "~2.0.0",
- "xtend": "~4.0.0"
- }
- },
- "tildify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
- "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0"
- }
- },
- "time-stamp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
- "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
- "dev": true
- },
- "tiny-lr": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.1.4.tgz",
- "integrity": "sha1-bkHX5n39CHjl4LN+N6BtZ+MJ/00=",
- "dev": true,
- "requires": {
- "body-parser": "~1.8.0",
- "debug": "~0.8.1",
- "faye-websocket": "~0.7.2",
- "parseurl": "~1.3.0",
- "qs": "~2.2.3"
- },
- "dependencies": {
- "debug": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz",
- "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=",
- "dev": true
- },
- "qs": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/qs/-/qs-2.2.5.tgz",
- "integrity": "sha1-EIirr53MCuWuRbcJ5sa1iIsjkjw=",
- "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"
- }
- },
- "to-absolute-glob": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
- "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
- "dev": true,
- "requires": {
- "is-absolute": "^1.0.0",
- "is-negated-glob": "^1.0.0"
- }
- },
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
- "dev": true
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "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.5"
- }
- }
- }
- },
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
- "dev": 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": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "^7.0.0"
- }
- },
- "to-through": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
- "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
- "dev": true,
- "requires": {
- "through2": "^2.0.3"
- }
- },
- "toidentifier": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
- "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
- "dev": true
- },
- "tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
- "requires": {
- "psl": "^1.1.28",
- "punycode": "^2.1.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
- },
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
- "dev": true
- },
- "ts-node": {
- "version": "8.10.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz",
- "integrity": "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==",
- "dev": true,
- "requires": {
- "arg": "^4.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- },
- "dependencies": {
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
- "dev": true
- },
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- },
- "source-map-support": {
- "version": "0.5.19",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
- "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- }
- }
- },
- "tslib": {
- "version": "1.13.0",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
- "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
- "dev": true
- },
- "tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
- "dev": true,
- "requires": {
- "safe-buffer": "^5.0.1"
- }
- },
- "tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
- "dev": true
- },
- "type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
- "dev": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
- "type-fest": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
- "dev": true
- },
- "type-is": {
- "version": "1.5.7",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.5.7.tgz",
- "integrity": "sha1-uTaKWTzG730GReeLL0xky+zQXpA=",
- "dev": true,
- "requires": {
- "media-typer": "0.3.0",
- "mime-types": "~2.0.9"
- },
- "dependencies": {
- "mime-db": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz",
- "integrity": "sha1-PQxjGA9FjrENMlqqN9fFiuMS6dc=",
- "dev": true
- },
- "mime-types": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz",
- "integrity": "sha1-MQ4VnbI+B3+Lsit0jav6SVcUCqY=",
- "dev": true,
- "requires": {
- "mime-db": "~1.12.0"
- }
- }
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
- "dev": true
- },
- "typescript": {
- "version": "3.9.7",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
- "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
- "dev": true
- },
- "uglify-js": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.1.tgz",
- "integrity": "sha512-RjxApKkrPJB6kjJxQS3iZlf///REXWYxYJxO/MpmlQzVkDWVI3PSnCBWezMecmTU/TRkNxrl8bmsfFQCp+LO+Q==",
- "dev": true,
- "optional": true
- },
- "unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
- "dev": true
- },
- "undertaker": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz",
- "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.0.1",
- "arr-map": "^2.0.0",
- "bach": "^1.0.0",
- "collection-map": "^1.0.0",
- "es6-weak-map": "^2.0.1",
- "last-run": "^1.1.0",
- "object.defaults": "^1.0.0",
- "object.reduce": "^1.0.0",
- "undertaker-registry": "^1.0.0"
- }
- },
- "undertaker-registry": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
- "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
- "dev": true
- },
- "union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "dev": true,
- "requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- }
- },
- "unique-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
- "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
- "dev": true,
- "requires": {
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "through2-filter": "^3.0.0"
- }
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true
- },
- "unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
- "dev": true
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
- "requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
- }
- }
- },
- "upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
- "dev": true
- },
- "uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
- "dev": true,
- "requires": {
- "punycode": "^2.1.0"
- }
- },
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
- "dev": true
- },
- "user-home": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
- "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
- "dev": true
- },
- "util": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
- "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
- "dev": true,
- "requires": {
- "inherits": "2.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
- "dev": true
- },
- "uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "dev": true
- },
- "v8flags": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz",
- "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "value-or-function": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
- "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
- "dev": true
- },
- "verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
- "dev": true,
- "requires": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
- }
- },
- "vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dev": true,
- "requires": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- }
- },
- "vinyl-fs": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
- "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
- "dev": true,
- "requires": {
- "fs-mkdirp-stream": "^1.0.0",
- "glob-stream": "^6.1.0",
- "graceful-fs": "^4.0.0",
- "is-valid-glob": "^1.0.0",
- "lazystream": "^1.0.0",
- "lead": "^1.0.0",
- "object.assign": "^4.0.4",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.3.3",
- "remove-bom-buffer": "^3.0.0",
- "remove-bom-stream": "^1.2.0",
- "resolve-options": "^1.1.0",
- "through2": "^2.0.0",
- "to-through": "^2.0.0",
- "value-or-function": "^3.0.0",
- "vinyl": "^2.0.0",
- "vinyl-sourcemap": "^1.1.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "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.1"
- }
- }
- }
- },
- "vinyl-sourcemap": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
- "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
- "dev": true,
- "requires": {
- "append-buffer": "^1.0.2",
- "convert-source-map": "^1.5.0",
- "graceful-fs": "^4.1.6",
- "normalize-path": "^2.1.1",
- "now-and-later": "^2.0.0",
- "remove-bom-buffer": "^3.0.0",
- "vinyl": "^2.0.0"
- },
- "dependencies": {
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- }
- }
- },
- "vscode-jsonrpc": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz",
- "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==",
- "dev": true
- },
- "vscode-languageserver": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz",
- "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==",
- "dev": true,
- "requires": {
- "vscode-languageserver-protocol": "^3.15.3"
- }
- },
- "vscode-languageserver-protocol": {
- "version": "3.15.3",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz",
- "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==",
- "dev": true,
- "requires": {
- "vscode-jsonrpc": "^5.0.1",
- "vscode-languageserver-types": "3.15.1"
- }
- },
- "vscode-languageserver-textdocument": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
- "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
- "dev": true
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
- "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
- "dev": true
- },
- "watch": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/watch/-/watch-0.11.0.tgz",
- "integrity": "sha1-6NugkbdFZ5mjr1eXi5hud+EyBAY=",
- "dev": true
- },
- "websocket-driver": {
- "version": "0.7.4",
- "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
- "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
- "dev": true,
- "requires": {
- "http-parser-js": ">=0.5.1",
- "safe-buffer": ">=5.1.0",
- "websocket-extensions": ">=0.1.1"
- }
- },
- "websocket-extensions": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
- "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
- "dev": true
- },
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "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
- },
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
- "dev": true
- },
- "wrap-ansi": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
- "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
- "dev": true,
- "requires": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
- "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
- "dev": true,
- "requires": {
- "@types/color-name": "^1.1.1",
- "color-convert": "^2.0.1"
- }
- },
- "color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "requires": {
- "color-name": "~1.1.4"
- }
- },
- "color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- }
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true
- },
- "write": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
- "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
- "dev": true,
- "requires": {
- "mkdirp": "^0.5.1"
- }
- },
- "xml2js": {
- "version": "0.4.23",
- "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
- "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
- "dev": true,
- "requires": {
- "sax": ">=0.6.0",
- "xmlbuilder": "~11.0.0"
- }
- },
- "xmlbuilder": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
- "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
- "dev": true
- },
- "xmldoc": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz",
- "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==",
- "dev": true,
- "requires": {
- "sax": "^1.2.1"
- }
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true
- },
- "y18n": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
- "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
- "dev": true
- },
- "yargs": {
- "version": "15.4.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
- "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
- "dev": true,
- "requires": {
- "cliui": "^6.0.0",
- "decamelize": "^1.2.0",
- "find-up": "^4.1.0",
- "get-caller-file": "^2.0.1",
- "require-directory": "^2.1.1",
- "require-main-filename": "^2.0.0",
- "set-blocking": "^2.0.0",
- "string-width": "^4.2.0",
- "which-module": "^2.0.0",
- "y18n": "^4.0.0",
- "yargs-parser": "^18.1.2"
- }
- },
- "yargs-parser": {
- "version": "18.1.3",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
- "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
- "dev": true,
- "requires": {
- "camelcase": "^5.0.0",
- "decamelize": "^1.2.0"
- }
- },
- "yazl": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
- "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
- "dev": true,
- "requires": {
- "buffer-crc32": "~0.2.3"
- }
- },
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true
- },
- "zip-stream": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz",
- "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==",
- "dev": true,
- "requires": {
- "archiver-utils": "^2.1.0",
- "compress-commons": "^2.1.1",
- "readable-stream": "^3.4.0"
- }
- }
- }
-}
diff --git a/frameworkTests/package.json b/frameworkTests/package.json
deleted file mode 100644
index 4316973b..00000000
--- a/frameworkTests/package.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "title": "Rooibos framework tests",
- "name": "smc",
- "version": "1.0.0",
- "description": "Rooibos framework tests",
- "author": "George Cook",
- "scripts": {
- "gulp": "node_modules/.bin/gulp"
- },
- "devDependencies": {
- "@types/fs-extra": "^5.0.4",
- "@types/node": "^13.13.9",
- "brighterscript": "^0.12.0",
- "burp-brightscript": "^0.4.2",
- "eslint": "^5.16.0",
- "eslint-plugin-roku": "^1.4.1",
- "fs-extra": "^8.1.0",
- "gulp": "^4.0.2",
- "gulp-clean": "^0.4.0",
- "gulp-debug-streams": "^3.0.0",
- "gulp-dedupe": "^0.0.2",
- "gulp-file": "^0.4.0",
- "gulp-hb": "^7.1.0",
- "gulp-if": "^2.0.2",
- "gulp-task-listing": "^1.1.0",
- "gulp-webserver": "^0.9.1",
- "gulp-zip": "^4.1.0",
- "handlebars": "^4.7.6",
- "ip": "^1.1.5",
- "merge-stream": "^1.0.1",
- "minimist": "^1.2.5",
- "request": "^2.88.2",
- "request-debug": "^0.2.0",
- "roku-deploy": "3.1.1",
- "rooibos-cli": "^1.3.0",
- "ts-node": "^8.10.2",
- "typescript": "^3.9.5"
- },
- "dependencies": {
- "natives": "^1.1.6"
- }
-}
diff --git a/frameworkTests/source/tests/CommonTests.bs b/frameworkTests/source/tests/CommonTests.bs
deleted file mode 100644
index 68c5dbbc..00000000
--- a/frameworkTests/source/tests/CommonTests.bs
+++ /dev/null
@@ -1,28 +0,0 @@
-'@TestSuite RCMT Common tests
-
-namespace Rooibos.Common
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests EqArray
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test
- '@Params[invalid, [], false]
- '@Params[[], invalid, false]
- '@Params[invalid, invalid, false]
- '@Params[["one", "three"], [], false]
- '@Params[[], ["one", "three"], false]
- '@Params[[], [], true]
- '@Params[["one", "two", "three"], ["one", "three"], false]
- '@Params[["one", "two", "three"], ["one", "two", "three"], true]
- '@Params[[1, 2, 3], ["one", "two", "three"], false]
- '@Params[[1, 2, 3], [1, 2, 3], true]
- '@Params[[1, invalid, "3"], [1, invalid, "3"], true]
- '@Params[[3, 2, 1], [1, 2, 3], false]
- function eqArray_Pass(values, values2, expected) as void
-
- result = Rooibos.Common.eqArray(values, values2)
- m.assertEqual(result, expected)
-
- end function
-
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/source/tests/NodeExampleTests.bs b/frameworkTests/source/tests/NodeExampleTests.bs
deleted file mode 100644
index 111671da..00000000
--- a/frameworkTests/source/tests/NodeExampleTests.bs
+++ /dev/null
@@ -1,39 +0,0 @@
-'@SGNode NodeExampleTests
-'@TestSuite [NET] Node Example Tests
-namespace Rooibos.Tests.NodeExampleTests
-
- '@Setup
- function setup() as void
- m.setupThing = "something created during setup"
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests methods present on the node
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@BeforeEach
- function beforeEach() as void
- m.beforeEachThing = "something created beforeEach"
- end function
-
- '@Test HelloFromNode
- function helloFromNode_simple() as void
- 'bs:disable-next-line
- text = HelloFromNode("georgejecook", 12)
- m.AssertEqual(text, "HELLO georgejecook" + " age:" + stri(12))
- end function
-
- '@Test HelloFromNode with params
- '@Params["jon", 40]
- '@Params["ringo", 23]
- '@Params["ringo", 50]
- '@Params["ringo", 24]
- '@Params["george", 40]
- '@Params["paul", 50]
- function helloFromNode_params(name, age) as void
- 'bs:disable-next-line
- text = HelloFromNode(name, age)
- m.AssertEqual(text, "HELLO " + name + " age:" + stri(age))
- end function
-
-end namespace
diff --git a/frameworkTests/src/components/NodeExample.bs b/frameworkTests/src/components/NodeExample.bs
deleted file mode 100644
index be82d92f..00000000
--- a/frameworkTests/src/components/NodeExample.bs
+++ /dev/null
@@ -1,15 +0,0 @@
-function Init() as void
- m.nameText = m.top.findNode("nameText")
-end function
-
-function HelloFromNode(name, age) as string
- return "HELLO " + name + " age:" + stri(age)
-end function
-
-function UpdateState(newState) as void
- m.top.state = newState
-end function
-
-function SetLabelText(newText) as void
- m.nameText.text = newText
-end function
\ No newline at end of file
diff --git a/frameworkTests/src/components/NodeExample.xml b/frameworkTests/src/components/NodeExample.xml
deleted file mode 100644
index 94e518ba..00000000
--- a/frameworkTests/src/components/NodeExample.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/frameworkTests/src/components/TestsScene.xml b/frameworkTests/src/components/TestsScene.xml
deleted file mode 100644
index d56b6dd9..00000000
--- a/frameworkTests/src/components/TestsScene.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/frameworkTests/src/components/tests/NodeExampleTests.xml b/frameworkTests/src/components/tests/NodeExampleTests.xml
deleted file mode 100644
index d292fbe6..00000000
--- a/frameworkTests/src/components/tests/NodeExampleTests.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/frameworkTests/src/manifest b/frameworkTests/src/manifest
deleted file mode 100644
index 9a12c564..00000000
--- a/frameworkTests/src/manifest
+++ /dev/null
@@ -1,4 +0,0 @@
-title=Rooibos
-major_version=0
-minor_version=2
-build_version=0
diff --git a/frameworkTests/src/source/main.bs b/frameworkTests/src/source/main.bs
deleted file mode 100644
index 205f55a5..00000000
--- a/frameworkTests/src/source/main.bs
+++ /dev/null
@@ -1,57 +0,0 @@
-sub main(args as dynamic)
- 'bs:disable-next-line
- if (type(Rooibos_Init) = "Function") then Rooibos_Init(setupGlobals, "AddTestUtils", invalid, m)
-
- InitScreen()
-end sub
-
-function initScreen() as void
- 'this will be where you setup your typical roku app
- 'it will not be launched when running unit tests
- screen = CreateObject("roSGScreen")
- m.port = CreateObject("roMessagePort")
- screen.setMessagePort(m.port)
-
- rootScene = screen.CreateScene("TestsScene")
- rootScene.id = "ROOT"
-
- screen.show()
-
- SetupGlobals(screen)
-
- while(true)
- msg = wait(0, m.port)
- msgType = type(msg)
-
- if msgType = "roSGScreenEvent"
- if msg.isScreenClosed()
- return
- end if
- end if
- end while
-end function
-
-'*************************************************************
-'** SetupGlobals
-'** @param screen as roScreen - screen to set globals on
-'*************************************************************
-function setupGlobals(screen) as void
- ? "SETTTING UP GLOBALS - do your standard setup stuff here"
-
- m.global = screen.getGlobalNode()
-
- m.roDeviceInfo = CreateObject("roDeviceInfo")
-
- m.displayInfo = {
- resolution: m.roDeviceInfo.GetUIResolution()
- displayType: m.roDeviceInfo.GetDisplayType()
- width: m.roDeviceInfo.GetDisplaySize().w
- height: m.roDeviceInfo.GetDisplaySize().h
- wFactor: m.roDeviceInfo.GetDisplaySize().w/1920
- hFactor: m.roDeviceInfo.GetDisplaySize().h/1080
- }
-
- m.modelLocator = {"displayInfo":m.displayInfo} ' contrived example : this would be a specifc modelLocator node/other setup thing
-
- m.global.addFields({"modelLocator": m.modelLocator})
-end function
diff --git a/frameworkTests/src/source/tests/AssertionTests.bs b/frameworkTests/src/source/tests/AssertionTests.bs
deleted file mode 100644
index 5186e6c9..00000000
--- a/frameworkTests/src/source/tests/AssertionTests.bs
+++ /dev/null
@@ -1,637 +0,0 @@
-'@TestSuite [RBSA] Rooibos assertion tests
-
-namespace Rooibos.Tests.Assertions
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests basic assertions
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test Fail
-function fail() as void
-
- assertResult = m.Fail("reason")
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.assertFalse(assertResult)
- m.assertTrue(isFail)
-end function
-
-'@Test AssertTrue
-'@Params[true, true]
-'@Params[false, false]
-'@Params[invalid, false]
-'@Params[0, false]
-'@Params[1, false]
-'@Params["test", false]
-function assertTrue(value, expectedAssertResult) as void
-
- assertResult = m.assertTrue(value)
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.assertEqual(assertResult, expectedAssertResult)
- m.assertEqual(isFail, not expectedAssertResult)
-end function
-
-'@Test AssertFalse
-'@Params[false, true]
-'@Params[true, false]
-'@Params[invalid, false]
-'@Params[0, false]
-'@Params[1, false]
-'@Params["test", false]
-function assertFalse(value, expectedAssertResult) as void
-
- assertResult = m.assertFalse(value)
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.assertEqual(assertResult, expectedAssertResult)
- m.assertEqual(isFail, not expectedAssertResult)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertArrayContainsAAs
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test Fail
-'@Params[[{"one":1}], [{"one":2}]]
-'@Params[[{"one":1}], [{"one":"a"}]]
-'@Params[[{"one":1}], [{}]]
-'@Params[[{"one":1}], [invalid]]
-'@Params[[{"one":1}], []]
-'@Params[[{"one":1}], invalid]
-'@Params[[{"one":1}], [[]] ]
-'@Params[[{"one":1}], ["wrong"] ]
-'@Params[[{"one":1}], [2] ]
-'@Params[[{"one":"a"}], [{"one":1}] ]
-'@Params[[{"two":1}], [{"one":1}] ]
-'@Params[[invalid], [{"one":1}] ]
-'@Params[invalid, [{"one":1}] ]
-'@Params[[{"one":1, "two":2}], [{"one":"1"}] ]
-'@Params[[{"one":1}, {"two":2}], [{"one":"1"}, {"two":"a"}] ]
-'@Params[[{"one":1}, {"two":2}], [{"a":1}, {"a":1}, {"a":1}] ]
-function assertArrayContainsAAs_Fail(expectedAAs, items) as void
-
- assertResult = m.assertArrayContainsAAs(items, expectedAAs)
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.assertFalse(assertResult)
- m.assertTrue(isFail)
-end function
-
-
-'@Test pass
-'@Params[[], []]
-'@Params[[{}], [{}]]
-'@Params[[{"one":1}], [{"one":1}]]
-'@Params[[{"one":1, "two":2}], [{"one":1, "two":2}]]
-'@Params[[{"one":1, "two":2}], [{ "two":2, "one":1}]]
-'@Params[[{"one":1, "two":2}, {"one":1}], [{"one":1}, { "two":2, "one":1}]]
-'@Params[[{"one":1, "two":2}, {"one":1}, {"three":3}], [{"one":1}, {"three":3}, { "two":2, "one":1}]]
-function assertArrayContainsAAs_Pass(expectedAAs, items) as void
-
- assertResult = m.assertArrayContainsAAs(items, expectedAAs)
-
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertTrue(assertResult)
- m.assertFalse(isFail)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests global is present on testSuite
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@BeforeEach
-function assertGlobal_beforeEach() as void
- m.beforeEachGlobal = m.global
-end function
-
-'@AfterEach
-function assertGlobal_afterEach() as void
- m.afterEachGlobal = m.global
-end function
-
-'@Test global is in test
-function assertGlobalIsPassedIntoTest() as void
- m.assertNotInvalid(m.global)
-end function
-
-'@Test global is in before each and after each
-function assertGlobalIsPassedInto_beforeEach_and_afterEach() as void
- m.assertNotInvalid(m.global)
- m.assertNotInvalid(m.beforeEachGlobal)
- m.assertNotInvalid(m.afterEachGlobal)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertArrayContainsOnlyValuesOfType
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test pass
-'@Params[["one", "two", "three"], "String"]
-'@Params[[1, 2, 3], "Integer"]
-'@Params[[true, true, false], "Boolean"]
-'@Params[[[true, true], [false, false]], "Array"]
-'@Params[[{"test":1}, {"test":1}], "AssociativeArray"]
-function assertArrayContainsOnlyValuesOfType_Pass(values, typeName) as void
-
- assertResult = m.assertArrayContainsOnlyValuesOfType(values, typeName)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertTrue(assertResult)
- m.assertFalse(isFail)
-
-end function
-
-'@Test fail
-'@Params[["one", 2, "three"], "String"]
-'@Params[[1, "two", 3], "Integer"]
-'@Params[[true, "true", false], "Boolean"]
-'@Params[[[true, true], false, false], "Array"]
-'@Params[[{"test":1}, "notAA"], "AssociativeArray"]
-'@Params[["one", "two", "three"], "UnknownType"]
-'@Params[["one", "two", "three"], "Integer"]
-'@Params[[1, 2, 3], "String"]
-'@Params[[true, true, false], "String"]
-'@Params[[[true, true], [false, false]], "AssociativeArray"]
-'@Params[[{"test":1}, {"test":1}], "Array"]
-function assertArrayContainsOnlyValuesOfType_Fail(values, typeName) as void
-
- assertResult = m.assertArrayContainsOnlyValuesOfType(values, typeName)
- isFail = m.currentResult.isFail
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.assertFalse(assertResult)
- m.assertTrue(isFail)
-
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests white spaces work with annotations
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'some comments to
-'demonstrate
-'@Test comments between tests
-'that we can have comments
-'between functions and tags
-function whiteSpacing() as void
- m.assertTrue(true)
-end function
-
-'some comments to
-'demonstrate
-'@Test comments between tests with params
-'@Params[1]
-
-'@Params[2]
-'that we can have comments
-'@Params[3]
-'between functions and tags
-'@Params[4]
-
-function whiteSpacing_params(value) as void
- m.assertTrue(true)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertNotEmpty
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test pass
-'@Params[["one", "two", "three"]]
-'@Params[[1, 2, 3]]
-'@Params[[true]]
-'@Params[[[true, true], [false, false]]]
-'@Params[[{"test":1}]]
-'@Params["not empty"]
-'@Params[[invalid]]
-function assertNotEmpty_Pass(values) as void
-
- assertResult = m.assertNotEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertTrue(assertResult)
- m.assertFalse(isFail)
-
-end function
-
-'@Test fail
-'@Params[invalid]
-'@Params[[]]
-'@Params[{}]
-'@Params[1]
-'@Params[""]
-function assertNotEmpty_Fail(values) as void
-
- assertResult = m.assertNotEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(assertResult)
- m.assertTrue(isFail)
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertEmpty
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test pass
-'@Params[[]]
-'@Params[{}]
-'@Params[""]
-function assertEmpty_Pass(values) as void
-
- assertResult = m.assertEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertTrue(assertResult)
- m.assertFalse(isFail)
-
-end function
-
-'@Test fail
-'@Params[1]
-'@Params[invalid]
-'@Params[["one", "two", "three"]]
-'@Params[[1, 2, 3]]
-'@Params[[true]]
-'@Params[[[true, true], [false, false]]]
-'@Params[[{"test":1}]]
-'@Params["not empty"]
-'@Params[[invalid]]
-function assertEmpty_Fail(values) as void
-
- assertResult = m.assertEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(assertResult)
- m.assertTrue(isFail)
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests expect
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test multi return values
-function expect_multiValues()
- obj = {}
- m.expect(obj, "mockMethod", 5, invalid, { "multiResult": ["one", 2, invalid, "last"] }, true)
-
- result = obj.mockMethod()
- m.assertEqual(result, "one")
-
- result = obj.mockMethod()
- m.assertEqual(result, 2)
-
- result = obj.mockMethod()
- m.assertEqual(result, invalid)
-
- result = obj.mockMethod()
- m.assertEqual(result, "last")
-
- result = obj.mockMethod()
- m.assertEqual(result, "last")
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(isFail)
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests expect with overloaded expectOnce
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test simple test
-function expect_multiExpect_success()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.assertEqual(result, result1)
-
- result = obj.mockMethod(arg2)
- m.assertEqual(result, result2)
-
- result = obj.mockMethod(arg3)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(isFail)
-end function
-
-
-'@Test can set up multi expects on same method - one invocation with any args
-function expect_multiExpect_success_oneCallsArgsNotTracked()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", invalid, result2, true)
- m.expectOnce(obj, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.assertEqual(result, result1)
-
- result = obj.mockMethod("do not care about args", "used in invocation", 2)
- m.assertEqual(result, result2)
-
- result = obj.mockMethod(arg3)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(isFail)
-
-end function
-
-'@Test can set up multi expects on same method - multi params
-function expect_multiExpect_multi_args_success()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
-
- result = obj.mockMethod(arg1, arg2, arg3)
- m.assertEqual(result, result1)
-
- result = obj.mockMethod(arg2, arg3, arg1)
- m.assertEqual(result, result2)
-
- result = obj.mockMethod(arg3, arg2, arg1)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(isFail)
-
-end function
-
-'@Test multi test, multi params with other expects
-function expect_multiExpect_multi_args_others_success()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "anotherMockMethod", invalid, "another", true)
- m.expectOnce(obj, "anotherMockMethod2", [1, 2, 3], "another2", true)
- m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
-
- result = obj.anotherMockMethod()
- m.assertEqual(result, "another")
-
- result = obj.anotherMockMethod2(1, 2, 3)
- m.assertEqual(result, "another2")
-
- result = obj.mockMethod(arg1, arg2, arg3)
- m.assertEqual(result, result)
-
- result = obj.mockMethod(arg2, arg3, arg1)
- m.assertEqual(result, result2)
-
- result = obj.mockMethod(arg3, arg2, arg1)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(isFail)
-
-end function
-
-'@Test multi test, multi params with other expects - fail others
-function expect_multiExpect_multi_args_others_fail()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "anotherMockMethod", ["not passed"], "another", true)
- m.expectOnce(obj, "anotherMockMethod2", [1, 2, 3], "another2", true)
- m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
-
- result = obj.anotherMockMethod()
- m.assertEqual(result, "another")
-
- result = obj.anotherMockMethod2(1, 2, 3)
- m.assertEqual(result, "another2")
-
- result = obj.mockMethod(arg1, arg2, arg3)
- m.assertEqual(result, result)
-
- result = obj.mockMethod(arg2, arg3, arg1)
- m.assertEqual(result, result2)
-
- result = obj.mockMethod(arg3, arg2, arg1)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertTrue(isFail)
-
-end function
-
-'@Test can set up multi expects on same method
-'@Params["arg1_", "arg2", "arg3"]
-'@Params["arg1", "arg2", "arg3_"]
-'@Params["arg1", "arg2_", "arg3"]
-'@Params["arg1", "arg2_", "arg3"]
-'@Params["arg1_", "arg2_", "arg3"]
-'@Params["arg1_", invalid, "arg3"]
-function expect_multiExpect_fail(call1, call2, call3)
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(call1)
- m.assertEqual(result, result1)
-
- result = obj.mockMethod(call2)
- m.assertEqual(result, result2)
-
- result = obj.mockMethod(call2)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertTrue(isFail)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests overloaded expectOnce on different objects
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test success
-function expect_multiExpect_differentOnj_success()
- obj = {}
- obj2 = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj2, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.assertEqual(result, result1)
-
- result = obj.mockMethod(arg2)
- m.assertEqual(result, result2)
-
- result = obj2.mockMethod(arg3)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(isFail)
-
-end function
-
-'@Test fail to match
-function expect_multiExpect_differentOnj_fail()
- obj = {}
- obj2 = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj2, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.assertEqual(result, result1)
-
- result = obj.mockMethod(arg2)
- m.assertEqual(result, result2)
-
- result = obj2.mockMethod(arg3)
- m.assertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertFalse(isFail)
-
-end function
-
-'ASSERTIONS TO WRITE TESTS FOR!
-
-'This is coming soon!
-
-' AssertEqual
-' AssertLike
-' AssertNotEqual
-' AssertInvalid
-' AssertNotInvalid
-' AssertAAHasKey
-' AssertAANotHasKey
-' AssertAAHasKeys
-' AssertAANotHasKeys
-' AssertArrayNotContains
-' AssertArrayContainsSubset
-' AssertArrayNotContainsSubsetet
-' AssertArrayCount
-' AssertArrayNotCount
-' AssertArrayContainsOnly
-' AssertType
-' AssertSubType
-'
-' 'Node extensions
-' AssertNodeCount
-' AssertNodeNotCount
-' AssertNodeEmpty
-' AssertNodeNotEmpty
-' AssertNodeContains
-' AssertNodeNotContains
-' AssertNodeContainsFields
-' AssertNodeNotContainsFields
-
-' AssertArray
-' AssertAAContainsSubset
-'
-' 'Mocking and stubbing
-' AssertMocks
-' MockFail
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/BasicTests.bs b/frameworkTests/src/source/tests/BasicTests.bs
deleted file mode 100644
index 726a4ed9..00000000
--- a/frameworkTests/src/source/tests/BasicTests.bs
+++ /dev/null
@@ -1,82 +0,0 @@
-'@TestSuite [BT] Basic tests
-namespace Rooibos.Tests.BasicTests
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests the node context is available for a Node scope function
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Only
- '@Test
- function NodeScope() as void
- m.assertNotInvalid(m.node)
- Rooibos.Tests.BasicTests.doSomethingInNodeScope(true)
- m.assertInvalid(m._isNodeScopeVarSet)
- m.assertFalse(m.node._isNodeScopeVarSet)
- end function
-
- function doSomethingInNodeScope(value)
- m._isNodeScopeVarSet = value
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests aa's with a mock will not crash the box!
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test
- function EqualsFixForStubbedAAs() as void
- aa = { "test": "value" }
- m.expectOnce(aa, "getStubbedObject", [aa])
-
- aa.getStubbedObject(aa)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests aa's that get printed as failures don't crash box
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Ignore - this doesn't crash; but the test reports failure. need to investigate.
- function PrintResultsFixForStubbedAAs() as void
- aa = { "test": "value" }
- bb = { "other": "value" }
- m.expectOnce(bb, "getStubbedObject", [aa])
- m.assertEqual(aa, bb)
- 'not crashing on printing the wrong output is a pass
- m.assertMocks()
- m.currentResult.Reset()
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It url in params
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test simple
- '@Params["http://101.rooibos.com"]
- function urlParams(url) as void
- m.assertEqual(url, "http://101.rooibos.com")
- end function
-
- '@Test on objects
- '@Params[{"url":"http://101.rooibos.com", "othervalue":2}]
- '@Params[{url:"http://101.rooibos.com", "othervalue":2}]
- '@Params[{url:"http://101.rooibos.com", othervalue:2}]
- function urlParams_objects(aa) as void
- m.assertEqual(aa.url, "http://101.rooibos.com")
- m.assertEqual(aa.othervalue, 2)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests async tests
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test times out
- function async_timeout()
- item = { "id": "item" }
-
- m.assertAsyncField(item, "id")
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
- m.assertTrue(isFail)
-
- end function
-
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/ExpectTests.bs b/frameworkTests/src/source/tests/ExpectTests.bs
deleted file mode 100644
index 0005ad0f..00000000
--- a/frameworkTests/src/source/tests/ExpectTests.bs
+++ /dev/null
@@ -1,55 +0,0 @@
-'@TestSuite ET ExpectTests
-
-namespace ET
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests bug with expectOnce not matching values
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test reported case
- '@Params[[52], true]
- '@Params[invalid, false]
- '@Params[[invalid], true]
- '@Params[["42"], true]
- '@Params[[42], false]
- function expectOnce_valuesBug_reported(expectedValue, expectMockFail) as void
- obj = {
- foo: function(arg0) : return arg0 : end function
- }
-
- m.ExpectOnce(obj, "foo", expectedValue)
- obj.foo(42)
- m.isAutoAssertingMocks = false
- m.AssertMocks()
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
- m.CleanMocks()
- m.AssertEqual(isFail, expectMockFail)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests mock count limit
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test mock count limit at least 25
- function expect_mockCountLimitToBeAtLeast25() as void
-
- interface = {}
-
- mockCountLimit = 25
- for i = 1 to mockCountLimit step 1
- keyName = StrI(i).trim()
- interface[keyName] = function(arg0) : return arg0 : end function
-
- expectedArg = "a"
- expectedReturnValue = "b"
- m.ExpectOnce(interface, keyName, [expectedArg], [expectedReturnValue])
-
- interface[keyName](expectedArg)
- end for
-
- end function
-
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/MatcherTests.bs b/frameworkTests/src/source/tests/MatcherTests.bs
deleted file mode 100644
index ad0bd65d..00000000
--- a/frameworkTests/src/source/tests/MatcherTests.bs
+++ /dev/null
@@ -1,211 +0,0 @@
-'@TestSuite [MT] Matcher Tests
-namespace Rooibos.Tests.MatcherTests
-
- '@BeforeEach
- function beforeEach()
- 'make a mock class
- m.myClass = {}
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests a custom matcher
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test couple of custom matchers
- '@Params[true, false, false]
- '@Params[false, true, true]
- '@Params[false, false, true]
- '@Params[true, true, true]
- function matcher_boolean(v1, v2, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [{ "matcher": match_true }, { "matcher": match_false }], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1, v2), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests a custom inline matcher
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test
- '@Params[true, false, false]
- '@Params[false, true, true]
- '@Params[false, false, true]
- '@Params[true, true, true]
- function inline_matcher_boolean(v1, v2, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [{ "matcher": function(value)
- return value = true
- end function }, { "matcher": function(value)
- return value = false
- end function }], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1, v2), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ built in matchers
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test anyBoolMatcher
- '@Params[invalid, true]
- '@Params["false", true]
- '@Params["true", true]
- '@Params[23, true]
- '@Params[{}, true]
- '@Params[[], true]
- '@Params[false, false]
- '@Params[true, false]
- function matcher_built_in_anyBoolean(v1, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [m.anyBoolMatcher], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
- '@Test anyStringMatcher
- '@Params[invalid, true]
- '@Params["false", false]
- '@Params["true", false]
- '@Params[23, true]
- '@Params[{}, true]
- '@Params[[], true]
- '@Params[false, true]
- '@Params[true, true]
- function matcher_built_in_anyString(v1, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [m.anyStringMatcher], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
- '@Test anyNumberMatcher
- '@Params[invalid, true]
- '@Params["false", true]
- '@Params["true", true]
- '@Params[23, false]
- '@Params[9, false]
- '@Params[0, false]
- '@Params[0.2, false]
- '@Params[{}, true]
- '@Params[[], true]
- '@Params[false, true]
- '@Params[true, true]
- function matcher_built_in_anyNumber(v1, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [m.anyNumberMatcher], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
- '@Test anyAAMatcher
- '@Params[invalid, true]
- '@Params["false", true]
- '@Params["true", true]
- '@Params[23, true]
- '@Params[{}, false]
- '@Params[[], true]
- '@Params[false, true]
- '@Params[true, true]
- function matcher_built_in_anyAA(v1, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [m.anyAAMatcher], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
- '@Test anyArrayMatcher
- '@Params[invalid, true]
- '@Params["false", true]
- '@Params["true", true]
- '@Params[23, true]
- '@Params[{}, true]
- '@Params[[], false]
- '@Params[false, true]
- '@Params[true, true]
- function matcher_built_in_anyArray(v1, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [m.anyArrayMatcher], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
- '@Test anyNodeMatcher
- '@Params[invalid, true]
- '@Params["false", true]
- '@Params["true", true]
- '@Params[23, true]
- '@Params[{}, true]
- '@Params["#RBSNode", false]
- '@Params[[], true]
- '@Params[false, true]
- '@Params[true, true]
- function matcher_built_in_anyNode(v1, expectedFail)
- returnValue = "notBroken"
- m.expectOnce(m.myClass, "doWork", [m.anyNodeMatcher], returnValue)
-
- m.assertEqual(m.myClass.doWork(v1), returnValue)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.assertEqual(isFail, expectedFail)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ matchers
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- function match_true(value)
- return value = true
- end function
-
- function match_false(value)
- return value = false
- end function
-
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/NodeExampleTests.bs b/frameworkTests/src/source/tests/NodeExampleTests.bs
deleted file mode 100644
index f5196986..00000000
--- a/frameworkTests/src/source/tests/NodeExampleTests.bs
+++ /dev/null
@@ -1,37 +0,0 @@
-'@SGNode NodeExampleTests
-'@TestSuite [NET] Node Example Tests
-
-'@Setup
-function NET_setup() as void
- m.setupThing = "something created during setup"
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests methods present on the node
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@BeforeEach
-function NET_BeforeEach() as void
- m.beforeEachThing = "something created beforeEach"
-end function
-
-'@Test HelloFromNode
-function NET__HelloFromNode_simple() as void
- 'bs:disable-next-line
- text = HelloFromNode("georgejecook", 12)
- m.AssertEqual(text, "HELLO georgejecook" + " age:" + stri(12))
-end function
-
-'@Test HelloFromNode with params
-'@Params["jon", 40]
-'@Params["ringo", 23]
-'@Params["ringo", 50]
-'@Params["ringo", 24]
-'@Params["george", 40]
-'@Params["paul", 50]
-function NET__HelloFromNode_params(name, age) as void
- 'bs:disable-next-line
- text = HelloFromNode(name, age)
- m.AssertEqual(text, "HELLO " + name + " age:" + stri(age))
-end function
-
diff --git a/frameworkTests/src/source/tests/ParamsTests.bs b/frameworkTests/src/source/tests/ParamsTests.bs
deleted file mode 100644
index 8df85fe8..00000000
--- a/frameworkTests/src/source/tests/ParamsTests.bs
+++ /dev/null
@@ -1,35 +0,0 @@
-'@TestSuite PT ParamsTests
-namespace Rooibos.Tests.ParamsTest
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests that nodes are created with RBSNode
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test
- '@Params["#RBSNode", "ContentNode"]
- '@Params["#RBSNode|Group", "Group"]
- '@Params["#RBSNode|Label", "Label"]
- function nodeDirective(node, expectedNodeType) as void
- m.assertSubType(node, expectedNodeType)
- end function
-
- '@Test node parsed as other arg index
- '@Params[1, 2, 3, "#RBSNode", "ContentNode"]
- '@Params[1, 2, 3, "#RBSNode|Group", "Group"]
- '@Params[1, 2, 3, "#RBSNode|Label", "Label"]
- function nodeDirective_otherArgs(arg1, arg2, arg3, node, expectedNodeType) as void
- m.assertSubType(node, expectedNodeType)
- m.assertEqual(arg1, 1)
- m.assertEqual(arg2, 2)
- m.assertEqual(arg3, 3)
- end function
-
- '@Test does not affect regular params
- '@Params["#someValue", "#someValue"]
- '@Params[22, 22]
- '@Params[[1,2,3], [1,2,3]]
- function nodeDirective_noSideEffect(arg1, expectedValue) as void
- m.assertEqual(arg1, expectedValue)
- end function
-
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/VersionTests.bs b/frameworkTests/src/source/tests/VersionTests.bs
deleted file mode 100644
index 1c7f1397..00000000
--- a/frameworkTests/src/source/tests/VersionTests.bs
+++ /dev/null
@@ -1,26 +0,0 @@
-'@TestSuite [VT] Version tests
-
-namespace Rooibos.Tests.VersionTests
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests versionCompare
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test
- '@Params["0.1", "0.1", 0]
- '@Params["1.0", "1.0", 0]
- '@Params["1.0.0", "1.0.0", 0]
- '@Params["1.0.1", "1.0.1", 0]
- '@Params["0.1", "0.2", -1]
- '@Params["1.0", "2.0", -1]
- '@Params["1.0.0", "2.0.0", -1]
- '@Params["2.0.0", "2.0.1", -1]
- '@Params["0.2", "0.1", 1]
- '@Params["2.0", "1.0", 1]
- '@Params["2.0.0", "1.0.0", 1]
- '@Params["2.0.1", "2.0.0", 1]
- function versionCompare(v1, v2, expected) as void
- m.assertEqual(Rooibos.versionCompare(v1, v2), expected)
- end function
-
-end namespace
diff --git a/frameworkTests/src/source/tests/issue_13_afterEach_not_running.bs b/frameworkTests/src/source/tests/issue_13_afterEach_not_running.bs
deleted file mode 100644
index 156424a8..00000000
--- a/frameworkTests/src/source/tests/issue_13_afterEach_not_running.bs
+++ /dev/null
@@ -1,51 +0,0 @@
-'@Ignore - only unignore to test compiler works
-'@TestSuite [DGNT] Duplicate Group Name Tests
-
-namespace Rooibos.Tests.AfterEachNotRunning
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It group1
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test simple
- function group1_test()
- m.assertTrue(true)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It group2
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test simple
- function group2_test()
- m.assertTrue(true)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It group2
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test simple
- function group2_dupe_test()
- m.assertTrue(true)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It group3
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test simple
- function group3_test()
- m.assertTrue(true)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It group1
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test simple
- function group1_dupe_test()
- m.assertTrue(true)
- end function
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/issue_15_tests_only_on_groups.bs b/frameworkTests/src/source/tests/issue_15_tests_only_on_groups.bs
deleted file mode 100644
index ea096863..00000000
--- a/frameworkTests/src/source/tests/issue_15_tests_only_on_groups.bs
+++ /dev/null
@@ -1,31 +0,0 @@
-'ADD '@Only ON NEXT LINE TO TEST
-'@TestSuite [RBSA] Rooibos before after tests
-namespace Rooibos.Tests.OnlyOnGroups
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests one
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test it one
- function it_test_one() as void
- m.assertTrue(true)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests two
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test it two
- function it_test_two() as void
- m.assertTrue(true)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- 'ADD '@Only ON NEXT LINE TO TEST
- '@It tests three
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test it three
- function it_test_three() as void
- m.assertTrue(true)
- end function
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/issue_5_duplicateGroupNames.bs b/frameworkTests/src/source/tests/issue_5_duplicateGroupNames.bs
deleted file mode 100644
index ce06925b..00000000
--- a/frameworkTests/src/source/tests/issue_5_duplicateGroupNames.bs
+++ /dev/null
@@ -1,32 +0,0 @@
-'@Ignore - only unignore to test compiler works - remove REMOVE_THIS to test
-'@TestSuite [RBSA] REMOVE_THIS Rooibos before after tests
-namespace Rooibos.Tests.DuplicateGroupNames
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests before each and after each are running
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@BeforeEach
- function beforeEach() as void
- ? "!!! Before"
- end function
-
-
- '@AfterEach
- function afterEach() as void
- ? "!!! After"
- end function
-
- '@Test before after
- function before_after() as void
-
- assertResult = m.Fail("reason")
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.assertFalse(assertResult)
- m.assertTrue(isFail)
- end function
-
-end namespace
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/testConfig.json b/frameworkTests/src/source/tests/testConfig.json
deleted file mode 100644
index 8380fe04..00000000
--- a/frameworkTests/src/source/tests/testConfig.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "logLevel": 1,
- "failFast": false,
- "showOnlyFailures": true
-}
diff --git a/frameworkTests/src/source/tests/testUtils.bs b/frameworkTests/src/source/tests/testUtils.bs
deleted file mode 100644
index 54d2476d..00000000
--- a/frameworkTests/src/source/tests/testUtils.bs
+++ /dev/null
@@ -1,8 +0,0 @@
-
-sub AddTestUtils(testCase)
- 'add your own test utils you want access to when testing here
-
- 'e.g.
- 'testCase.testUtils = TestUtils()
- 'testCase.r = rodash()
-end sub
\ No newline at end of file
diff --git a/frameworkTests/src/source/tests/verifyBeforeEachAfterEach.bs b/frameworkTests/src/source/tests/verifyBeforeEachAfterEach.bs
deleted file mode 100644
index 32b1432c..00000000
--- a/frameworkTests/src/source/tests/verifyBeforeEachAfterEach.bs
+++ /dev/null
@@ -1,102 +0,0 @@
-'@TestSuite [BEAER] BeforeEach and AfterEach Running
-namespace Rooibos.Tests.VeritfyBeforeEachAfterEach
-
- '@Setup
- function Setup() as void
- ? "!!! Setup"
- end function
-
-
- '@TearDown
- function TearDown() as void
- ? "!!! TearDown"
- end function
-
- '@BeforeEach
- function BeforeEach() as void
- ? "!!! Before"
- end function
-
-
- '@AfterEach
- function AfterEach() as void
- ? "!!! After"
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests group 1 - should have global before/after
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test 1
- function group1_1() as void
- m.assertTrue(true)
- end function
-
- '@Test 2
- function group1_2() as void
- m.assertTrue(true)
- end function
-
- '@Test 3
- '@Params["a"]
- '@Params["b"]
- '@Params["c"]
- function group1_3(values) as void
- m.assertTrue(true)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests group 2 - should have group before after
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@BeforeEach
- function group2_BeforeEach() as void
- ? "!!! Before GROUP 2"
- end function
-
-
- '@AfterEach
- function group2_AfterEach() as void
- ? "!!! After GROUP 2"
- end function
-
- '@Test 1
- function group2_1() as void
- m.assertTrue(true)
- end function
-
- '@Test 2
- function group2_2() as void
- m.assertTrue(true)
- end function
-
- '@Test 3
- '@Params["a"]
- '@Params["b"]
- '@Params["c"]
- function group2_3(values) as void
- m.assertTrue(true)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '@It tests group 3 - should have global before/after
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '@Test 1
- function group3_1() as void
- m.assertTrue(true)
- end function
-
- '@Test 2
- function group3_2() as void
- m.assertTrue(true)
- end function
-
- '@Test 3
- '@Params["a"]
- '@Params["b"]
- '@Params["c"]
- function group3_3(values) as void
- m.assertTrue(true)
- end function
-end namespace
diff --git a/gulpfile.ts b/gulpfile.ts
deleted file mode 100644
index f9639bac..00000000
--- a/gulpfile.ts
+++ /dev/null
@@ -1,112 +0,0 @@
-import { series } from "gulp";
-import { ProgramBuilder, BsConfig } from 'brighterscript';
-import { inspect } from 'util';
-
-const concat = require('gulp-concat');
-const gulp = require('gulp');
-const path = require('path');
-const del = require('del');
-const header = require('gulp-header');
-const pkg = require('./package.json');
-const distDir = 'dist';
-const outDir = 'out';
-const buildDir = 'build';
-const distFile = `rooibosDist.brs`;
-const fullDistPath = path.join(distDir, distFile);
-const fs = require('fs');
-const rmLines = require('gulp-rm-lines');
-const cp = require('child_process');
-
-export function clean() {
- const distPath = path.join(distDir, '**');
- console.log('Doing a clean at ' + distPath);
- return del([distPath, outDir], { force: true });
-}
-
-function createDirectories() {
- return gulp.src('*.*', { read: false })
- .pipe(gulp.dest(distDir))
- .pipe(gulp.dest(outDir));
-}
-
-function squash() {
- var banner = [`'/**`,
- `' * ${pkg.name} - ${pkg.description}`,
- `' * @version v${pkg.version}`,
- `' * @link ${pkg.homepage}`,
- `' * @license ${pkg.license}`,
- `' */`,
- ``].join(`\n`);
-
- return gulp.src('./build/source/*.brs')
- .pipe(concat(distFile))
- .pipe(rmLines({
- 'filters': [/^\s*'/i, /((\r\n|\n|\r)$)|(^(\r\n|\n|\r))|^\s*$/i]
- }))
- .pipe(header(banner, { pkg: pkg }))
- .pipe(gulp.dest(distDir));
-}
-
-function copyToTests(cb) {
- const frameworkFile = path.join('frameworkTests/src/source/tests', distFile);
- if (fs.existsSync(frameworkFile)) {
- fs.unlinkSync(frameworkFile);
- }
- fs.copyFileSync(fullDistPath, frameworkFile);
- cb();
-}
-
-export function doc(cb) {
- let task = cp.exec('./node_modules/.bin/jsdoc -c jsdoc.json -t node_modules/minami -d docs');
- return task;
-}
-
-export function updateVersion(cb) {
- fs.writeFileSync("docs/version.txt", pkg.version);
- cb();
-}
-
-function insertVersionNumber(cb) {
- const filePath = path.join(buildDir, 'source', 'Rooibos.brs');
- let text = fs.readFileSync(filePath, 'utf8');
- text = text.replace('#ROOIBOS_VERSION#', pkg.version);
- fs.writeFileSync(filePath, text, 'utf8');
- cb();
-}
-
-
-export async function compile(cb) {
- let builder = new ProgramBuilder();
-
- let configFiles: any[] = [
- "manifest",
- "source/**/*.*",
- "components/**/*.*",
- "images/**/*.*",
- "font/**/*.*"
- ];
-
- let sourceDir = 'src';
- let config: BsConfig = {
- stagingFolderPath: 'build',
- createPackage: false,
- "rootDir": sourceDir,
- "autoImportComponentScript": true,
- "files": configFiles,
- "diagnosticFilters": [
- "source/rooibosFunctionMap.brs",
- "**/RALETrackerTask.*",
- 1107,
- 1001
- ],
- "showDiagnosticsInConsole": true
- }
-
- console.log(`using config ${inspect(config)}`);
- await builder.run(config);
- cb();
-}
-
-
-exports.build = series(clean, createDirectories, compile, insertVersionNumber, squash, copyToTests);
-exports.dist = series(exports.build, doc, updateVersion);
diff --git a/outRun/.roku-deploy-staging/components/TestsScene.xml b/outRun/.roku-deploy-staging/components/TestsScene.xml
deleted file mode 100644
index 9d5b14a5..00000000
--- a/outRun/.roku-deploy-staging/components/TestsScene.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/outRun/.roku-deploy-staging/manifest b/outRun/.roku-deploy-staging/manifest
deleted file mode 100644
index 9a12c564..00000000
--- a/outRun/.roku-deploy-staging/manifest
+++ /dev/null
@@ -1,4 +0,0 @@
-title=Rooibos
-major_version=0
-minor_version=2
-build_version=0
diff --git a/outRun/.roku-deploy-staging/source/main.brs b/outRun/.roku-deploy-staging/source/main.brs
deleted file mode 100644
index c7639c93..00000000
--- a/outRun/.roku-deploy-staging/source/main.brs
+++ /dev/null
@@ -1,57 +0,0 @@
-sub Main(args as dynamic)
- if (type(Rooibos__Init) = "Function") then Rooibos__Init(SetupGlobals, "AddTestUtils", invalid, m)
-
- InitScreen()
-end sub
-
-function InitScreen() as void
- 'this will be where you setup your typical roku app
- 'it will not be launched when running unit tests
- screen = CreateObject("roSGScreen")
- m.port = CreateObject("roMessagePort")
- screen.setMessagePort(m.port)
-
- rootScene = screen.CreateScene("TestsScene")
- rootScene.id = "ROOT"
-
- screen.show()
-
- SetupGlobals(screen)
-
- while(true)
- msg = wait(0, m.port)
- msgType = type(msg)
-
- if msgType = "roSGScreenEvent"
- if msg.isScreenClosed()
- return
- end if
- end if
- end while
-end function
-
-
-'*************************************************************
-'** SetupGlobals
-'** @param screen as roScreen - screen to set globals on
-'*************************************************************
-function SetupGlobals(screen) as void
- ? "SETTTING UP GLOBALS - do your standard setup stuff here"
-
- m.global = screen.getGlobalNode()
-
- m.roDeviceInfo = CreateObject("roDeviceInfo")
-
- m.displayInfo = {
- resolution: m.roDeviceInfo.GetUIResolution()
- displayType: m.roDeviceInfo.GetDisplayType()
- width: m.roDeviceInfo.GetDisplaySize().w
- height: m.roDeviceInfo.GetDisplaySize().h
- wFactor: m.roDeviceInfo.GetDisplaySize().w/1920
- hFactor: m.roDeviceInfo.GetDisplaySize().h/1080
- }
-
- m.modelLocator = {"displayInfo":m.displayInfo} ' contrived example : this would be a specifc modelLocator node/other setup thing
-
- m.global.addFields({"modelLocator": m.modelLocator})
-end function
diff --git a/outRun/.roku-deploy-staging/source/tests/AssertionTests.brs b/outRun/.roku-deploy-staging/source/tests/AssertionTests.brs
deleted file mode 100644
index 6eba2846..00000000
--- a/outRun/.roku-deploy-staging/source/tests/AssertionTests.brs
+++ /dev/null
@@ -1,660 +0,0 @@
-'@TestSuite [RBSA] Rooibos assertion tests
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests basic assertions
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test Fail
-function Simp_basic_Fail() as void
-
- assertResult = m.Fail("reason")
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.AssertFalse(assertResult)
- m.AssertTrue(isFail)
-end function
-
-'@Test AssertTrue
-'@Params[true, true]
-'@Params[false, false]
-'@Params[invalid, false]
-'@Params[0, false]
-'@Params[1, false]
-'@Params["test", false]
-function Simp_basic_AssertTrue(value, expectedAssertResult) as void
-
- assertResult = m.AssertTrue(value)
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.AssertEqual(assertResult, expectedAssertResult)
- m.AssertEqual(isFail, not expectedAssertResult)
-end function
-
-'@Test AssertFalse
-'@Params[false, true]
-'@Params[true, false]
-'@Params[invalid, false]
-'@Params[0, false]
-'@Params[1, false]
-'@Params["test", false]
-function Simp_basic_AssertFalse(value, expectedAssertResult) as void
-
- assertResult = m.AssertFalse(value)
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.AssertEqual(assertResult, expectedAssertResult)
- m.AssertEqual(isFail, not expectedAssertResult)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertArrayContainsAAs
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test Fail
-'@Params[[{"one":1}], [{"one":2}]]
-'@Params[[{"one":1}], [{"one":"a"}]]
-'@Params[[{"one":1}], [{}]]
-'@Params[[{"one":1}], [invalid]]
-'@Params[[{"one":1}], []]
-'@Params[[{"one":1}], invalid]
-'@Params[[{"one":1}], [[]] ]
-'@Params[[{"one":1}], ["wrong"] ]
-'@Params[[{"one":1}], [2] ]
-'@Params[[{"one":"a"}], [{"one":1}] ]
-'@Params[[{"two":1}], [{"one":1}] ]
-'@Params[[invalid], [{"one":1}] ]
-'@Params[invalid, [{"one":1}] ]
-'@Params[[{"one":1, "two":2}], [{"one":"1"}] ]
-'@Params[[{"one":1}, {"two":2}], [{"one":"1"}, {"two":"a"}] ]
-'@Params[[{"one":1}, {"two":2}], [{"a":1}, {"a":1}, {"a":1}] ]
-function Simp_AssertArrayContainsAAs_Fail(expectedAAs, items) as void
-
- assertResult = m.AssertArrayContainsAAs(items, expectedAAs)
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.AssertFalse(assertResult)
- m.AssertTrue(isFail)
-end function
-
-
-'@Test pass
-'@Params[[], []]
-'@Params[[{}], [{}]]
-'@Params[[{"one":1}], [{"one":1}]]
-'@Params[[{"one":1, "two":2}], [{"one":1, "two":2}]]
-'@Params[[{"one":1, "two":2}], [{ "two":2, "one":1}]]
-'@Params[[{"one":1, "two":2}, {"one":1}], [{"one":1}, { "two":2, "one":1}]]
-'@Params[[{"one":1, "two":2}, {"one":1}, {"three":3}], [{"one":1}, {"three":3}, { "two":2, "one":1}]]
-function Simp_AssertArrayContainsAAs_Pass(expectedAAs, items) as void
-
- assertResult = m.AssertArrayContainsAAs(items, expectedAAs)
-
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertTrue(assertResult)
- m.AssertFalse(isFail)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests global is present on testSuite
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@BeforeEach
-function Simp_AssertGlobal_beforeEach() as void
- m.beforeEachGlobal = m.global
-end function
-
-'@AfterEach
-function Simp_AssertGlobal_afterEach() as void
- m.afterEachGlobal = m.global
-end function
-
-'@Test global is in test
-function Simp_AssertGlobalIsPassedIntoTest() as void
- m.AssertNotInvalid(m.global)
-end function
-
-'@Test global is in before each and after each
-function Simp_AssertGlobalIsPassedInto_beforeEach_and_afterEach() as void
- m.AssertNotInvalid(m.global)
- m.AssertNotInvalid(m.beforeEachGlobal)
- m.AssertNotInvalid(m.afterEachGlobal)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertArrayContainsOnlyValuesOfType
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test pass
-'@Params[["one", "two", "three"], "String"]
-'@Params[[1, 2, 3], "Integer"]
-'@Params[[true, true, false], "Boolean"]
-'@Params[[[true, true], [false, false]], "Array"]
-'@Params[[{"test":1}, {"test":1}], "AssociativeArray"]
-function Simp_AssertArrayContainsOnlyValuesOfType_Pass(values, typeName) as void
-
- assertResult = m.AssertArrayContainsOnlyValuesOfType(values, typeName)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertTrue(assertResult)
- m.AssertFalse(isFail)
-
-end function
-
-'@Test fail
-'@Params[["one", 2, "three"], "String"]
-'@Params[[1, "two", 3], "Integer"]
-'@Params[[true, "true", false], "Boolean"]
-'@Params[[[true, true], false, false], "Array"]
-'@Params[[{"test":1}, "notAA"], "AssociativeArray"]
-'@Params[["one", "two", "three"], "UnknownType"]
-'@Params[["one", "two", "three"], "Integer"]
-'@Params[[1, 2, 3], "String"]
-'@Params[[true, true, false], "String"]
-'@Params[[[true, true], [false, false]], "AssociativeArray"]
-'@Params[[{"test":1}, {"test":1}], "Array"]
-function Simp_AssertArrayContainsOnlyValuesOfType_Fail(values, typeName) as void
-
- assertResult = m.AssertArrayContainsOnlyValuesOfType(values, typeName)
- isFail = m.currentResult.isFail
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.AssertFalse(assertResult)
- m.AssertTrue(isFail)
-
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests white spaces work with annotations
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'some comments to
-'demonstrate
-'@Test comments between tests
-'that we can have comments
-'between functions and tags
-function Simp_whiteSpacing() as void
- m.AssertTrue(true)
-end function
-
-'some comments to
-'demonstrate
-'@Test comments between tests with params
-'@Params[1]
-
-'@Params[2]
-'that we can have comments
-'@Params[3]
-'between functions and tags
-'@Params[4]
-
-function Simp_whiteSpacing_params(value) as void
- m.AssertTrue(true)
-end function
-
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests EqArray
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test
-'@Params[invalid, [], false]
-'@Params[[], invalid, false]
-'@Params[invalid, invalid, false]
-'@Params[["one", "three"], [], false]
-'@Params[[], ["one", "three"], false]
-'@Params[[], [], true]
-'@Params[["one", "two", "three"], ["one", "three"], false]
-'@Params[["one", "two", "three"], ["one", "two", "three"], true]
-'@Params[[1, 2, 3], ["one", "two", "three"], false]
-'@Params[[1, 2, 3], [1, 2, 3], true]
-'@Params[[1, invalid, "3"], [1, invalid, "3"], true]
-'@Params[[3, 2, 1], [1, 2, 3], false]
-function Simp_EqArray_Pass(values, values2, expected) as void
-
- result = m.EqArray(values, values2)
- m.AssertEqual(result, expected)
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertNotEmpty
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test pass
-'@Params[["one", "two", "three"]]
-'@Params[[1, 2, 3]]
-'@Params[[true]]
-'@Params[[[true, true], [false, false]]]
-'@Params[[{"test":1}]]
-'@Params["not empty"]
-'@Params[[invalid]]
-function Simp_AssertNotEmpty_Pass(values) as void
-
- assertResult = m.AssertNotEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertTrue(assertResult)
- m.AssertFalse(isFail)
-
-end function
-
-'@Test fail
-'@Params[invalid]
-'@Params[[]]
-'@Params[{}]
-'@Params[1]
-'@Params[""]
-function Simp_AssertNotEmpty_Fail(values) as void
-
- assertResult = m.AssertNotEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(assertResult)
- m.AssertTrue(isFail)
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests AssertEmpty
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test pass
-'@Params[[]]
-'@Params[{}]
-'@Params[""]
-function Simp_AssertEmpty_Pass(values) as void
-
- assertResult = m.AssertEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertTrue(assertResult)
- m.AssertFalse(isFail)
-
-end function
-
-'@Test fail
-'@Params[1]
-'@Params[invalid]
-'@Params[["one", "two", "three"]]
-'@Params[[1, 2, 3]]
-'@Params[[true]]
-'@Params[[[true, true], [false, false]]]
-'@Params[[{"test":1}]]
-'@Params["not empty"]
-'@Params[[invalid]]
-function Simp_AssertEmpty_Fail(values) as void
-
- assertResult = m.AssertEmpty(values)
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(assertResult)
- m.AssertTrue(isFail)
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests expect
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test multi return values
-function Simp_expect_multiValues()
- obj = {}
- m.expect(obj, "mockMethod", 5, invalid, {"multiResult": ["one", 2, invalid, "last"]}, true)
-
- result = obj.mockMethod()
- m.AssertEqual(result, "one")
-
- result = obj.mockMethod()
- m.AssertEqual(result, 2)
-
- result = obj.mockMethod()
- m.AssertEqual(result, invalid)
-
- result = obj.mockMethod()
- m.AssertEqual(result, "last")
-
- result = obj.mockMethod()
- m.AssertEqual(result, "last")
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(isFail)
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests expect with overloaded expectOnce
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test simple test
-function Simp_expect_multiExpect_success()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.AssertEqual(result, result1)
-
- result = obj.mockMethod(arg2)
- m.AssertEqual(result, result2)
-
- result = obj.mockMethod(arg3)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(isFail)
-end function
-
-
-'@Test can set up multi expects on same method - one invocation with any args
-function Simp_expect_multiExpect_success_oneCallsArgsNotTracked()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", invalid, result2, true)
- m.expectOnce(obj, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.AssertEqual(result, result1)
-
- result = obj.mockMethod("do not care about args", "used in invocation", 2)
- m.AssertEqual(result, result2)
-
- result = obj.mockMethod(arg3)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(isFail)
-
-end function
-
-'@Test can set up multi expects on same method - multi params
-function Simp_expect_multiExpect_multi_args_success()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
-
- result = obj.mockMethod(arg1, arg2, arg3)
- m.AssertEqual(result, result1)
-
- result = obj.mockMethod(arg2, arg3, arg1)
- m.AssertEqual(result, result2)
-
- result = obj.mockMethod(arg3, arg2, arg1)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(isFail)
-
-end function
-
-'@Test multi test, multi params with other expects
-function Simp_expect_multiExpect_multi_args_others_success()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "anotherMockMethod", invalid, "another", true)
- m.expectOnce(obj, "anotherMockMethod2", [1,2,3], "another2", true)
- m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
-
- result = obj.anotherMockMethod()
- m.AssertEqual(result, "another")
-
- result = obj.anotherMockMethod2(1, 2, 3)
- m.AssertEqual(result, "another2")
-
- result = obj.mockMethod(arg1, arg2, arg3)
- m.AssertEqual(result, result)
-
- result = obj.mockMethod(arg2, arg3, arg1)
- m.AssertEqual(result, result2)
-
- result = obj.mockMethod(arg3, arg2, arg1)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(isFail)
-
-end function
-
-'@Test multi test, multi params with other expects - fail others
-function Simp_expect_multiExpect_multi_args_others_fail()
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "anotherMockMethod", ["not passed"], "another", true)
- m.expectOnce(obj, "anotherMockMethod2", [1,2,3], "another2", true)
- m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
-
- result = obj.anotherMockMethod()
- m.AssertEqual(result, "another")
-
- result = obj.anotherMockMethod2(1, 2, 3)
- m.AssertEqual(result, "another2")
-
- result = obj.mockMethod(arg1, arg2, arg3)
- m.AssertEqual(result, result)
-
- result = obj.mockMethod(arg2, arg3, arg1)
- m.AssertEqual(result, result2)
-
- result = obj.mockMethod(arg3, arg2, arg1)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertTrue(isFail)
-
-end function
-
-'@Test can set up multi expects on same method
-'@Params["arg1_", "arg2", "arg3"]
-'@Params["arg1", "arg2", "arg3_"]
-'@Params["arg1", "arg2_", "arg3"]
-'@Params["arg1", "arg2_", "arg3"]
-'@Params["arg1_", "arg2_", "arg3"]
-'@Params["arg1_", invalid, "arg3"]
-function Simp_expect_multiExpect_fail(call1, call2, call3)
- obj = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(call1)
- m.AssertEqual(result, result1)
-
- result = obj.mockMethod(call2)
- m.AssertEqual(result, result2)
-
- result = obj.mockMethod(call2)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertTrue(isFail)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests overloaded expectOnce on different objects
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test success
-function Simp_expect_multiExpect_differentOnj_success()
- obj = {}
- obj2 = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj2, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.AssertEqual(result, result1)
-
- result = obj.mockMethod(arg2)
- m.AssertEqual(result, result2)
-
- result = obj2.mockMethod(arg3)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(isFail)
-
-end function
-
-'@Test fail to match
-function Simp_expect_multiExpect_differentOnj_fail()
- obj = {}
- obj2 = {}
- arg1 = "arg1"
- arg2 = "arg2"
- arg3 = "arg3"
- result1 = 1
- result2 = 2
- result3 = 3
-
- m.expectOnce(obj, "mockMethod", [arg1], result1, true)
- m.expectOnce(obj, "mockMethod", [arg2], result2, true)
- m.expectOnce(obj2, "mockMethod", [arg3], result3, true)
-
- result = obj.mockMethod(arg1)
- m.AssertEqual(result, result1)
-
- result = obj.mockMethod(arg2)
- m.AssertEqual(result, result2)
-
- result = obj2.mockMethod(arg3)
- m.AssertEqual(result, result3)
-
- m.assertMocks()
- isFail = m.currentResult.isFail
-
- m.currentResult.Reset()
- m.AssertFalse(isFail)
-
-end function
-
-'ASSERTIONS TO WRITE TESTS FOR!
-
-'This is coming soon!
-
-' AssertEqual
-' AssertLike
-' AssertNotEqual
-' AssertInvalid
-' AssertNotInvalid
-' AssertAAHasKey
-' AssertAANotHasKey
-' AssertAAHasKeys
-' AssertAANotHasKeys
-' AssertArrayNotContains
-' AssertArrayContainsSubset
-' AssertArrayNotContainsSubsetet
-' AssertArrayCount
-' AssertArrayNotCount
-' AssertArrayContainsOnly
-' AssertType
-' AssertSubType
-'
-' 'Node extensions
-' AssertNodeCount
-' AssertNodeNotCount
-' AssertNodeEmpty
-' AssertNodeNotEmpty
-' AssertNodeContains
-' AssertNodeNotContains
-' AssertNodeContainsFields
-' AssertNodeNotContainsFields
-
-' AssertArray
-' AssertAAContainsSubset
-'
-' 'Mocking and stubbing
-' AssertMocks
-' MockFail
\ No newline at end of file
diff --git a/outRun/.roku-deploy-staging/source/tests/ExpectTests.brs b/outRun/.roku-deploy-staging/source/tests/ExpectTests.brs
deleted file mode 100644
index 114ce322..00000000
--- a/outRun/.roku-deploy-staging/source/tests/ExpectTests.brs
+++ /dev/null
@@ -1,28 +0,0 @@
-'@TestSuite ET ExpectTests
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests bug with expectOnce not matching values
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test reported case
-'@Params[[52], true]
-'@Params[invalid, false]
-'@Params[[invalid], true]
-'@Params[["42"], true]
-'@Params[[42], false]
-function ET_expectOnce_valuesBug_reported(expectedValue, expectMockFail) as void
- obj = {
- foo: function(arg0) : return arg0 : end function
- }
-
- m.ExpectOnce(obj, "foo", expectedValue)
- obj.foo(42)
- m.isAutoAssertingMocks = false
- m.AssertMocks()
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
- m.CleanMocks()
- m.AssertEqual(isFail, expectMockFail)
-end function
-
diff --git a/outRun/.roku-deploy-staging/source/tests/ParamsTests.brs b/outRun/.roku-deploy-staging/source/tests/ParamsTests.brs
deleted file mode 100644
index a7ebed10..00000000
--- a/outRun/.roku-deploy-staging/source/tests/ParamsTests.brs
+++ /dev/null
@@ -1,32 +0,0 @@
-'@TestSuite PT ParamsTests
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests that nodes are created with RBSNode
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test
-'@Params["#RBSNode", "ContentNode"]
-'@Params["#RBSNode|Group", "Group"]
-'@Params["#RBSNode|Label", "Label"]
-function PT_RBSNodeDirective(node, expectedNodeType) as void
- m.assertSubType(node, expectedNodeType)
-end function
-
-'@Test node parsed as other arg index
-'@Params[1, 2, 3, "#RBSNode", "ContentNode"]
-'@Params[1, 2, 3, "#RBSNode|Group", "Group"]
-'@Params[1, 2, 3, "#RBSNode|Label", "Label"]
-function PT_RBSNodeDirective_otherArgs(arg1, arg2, arg3, node, expectedNodeType) as void
- m.assertSubType(node, expectedNodeType)
- m.assertEqual(arg1, 1)
- m.assertEqual(arg2, 2)
- m.assertEqual(arg3, 3)
-end function
-
-'@Test does not affect regular params
-'@Params["#someValue", "#someValue"]
-'@Params[22, 22]
-'@Params[[1,2,3], [1,2,3]]
-function PT_RBSNodeDirective_noSideEffect(arg1, expectedValue) as void
- m.assertEqual(arg1, expectedValue)
-end function
\ No newline at end of file
diff --git a/outRun/.roku-deploy-staging/source/tests/issue_13_afterEach_not_running.brs b/outRun/.roku-deploy-staging/source/tests/issue_13_afterEach_not_running.brs
deleted file mode 100644
index 228c7df5..00000000
--- a/outRun/.roku-deploy-staging/source/tests/issue_13_afterEach_not_running.brs
+++ /dev/null
@@ -1,48 +0,0 @@
-'@TestSuite [DGNT] Duplicate Group Name Tests
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It group1
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test simple
-function DGNT_group1_test()
- m.AssertTrue(true)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It group2
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test simple
-function DGNT_group2_test()
- m.AssertTrue(true)
-end function
-
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It group2
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test simple
-function DGNT_group2_dupe_test()
- m.AssertTrue(true)
-end function
-
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It group3
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test simple
-function DGNT_group3_test()
- m.AssertTrue(true)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It group1
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test simple
-function DGNT_group1_dupe_test()
- m.AssertTrue(true)
-end function
\ No newline at end of file
diff --git a/outRun/.roku-deploy-staging/source/tests/issue_15_tests_only_on_groups.brs b/outRun/.roku-deploy-staging/source/tests/issue_15_tests_only_on_groups.brs
deleted file mode 100644
index 67b33e76..00000000
--- a/outRun/.roku-deploy-staging/source/tests/issue_15_tests_only_on_groups.brs
+++ /dev/null
@@ -1,30 +0,0 @@
-'ADD '@Only ON NEXT LINE TO TEST
-'@TestSuite [RBSA] Rooibos before after tests
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests one
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test it one
-function RBSA__it_test_one() as void
- m.AssertTrue(true)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests two
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test it two
-function RBSA__it_test_two() as void
- m.AssertTrue(true)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'ADD '@Only ON NEXT LINE TO TEST
-'@It tests three
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test it three
-function RBSA__it_test_three() as void
- m.AssertTrue(true)
-end function
\ No newline at end of file
diff --git a/outRun/.roku-deploy-staging/source/tests/issue_5_duplicateGroupNames.brs b/outRun/.roku-deploy-staging/source/tests/issue_5_duplicateGroupNames.brs
deleted file mode 100644
index 1725a4bb..00000000
--- a/outRun/.roku-deploy-staging/source/tests/issue_5_duplicateGroupNames.brs
+++ /dev/null
@@ -1,28 +0,0 @@
-'@TestSuite [RBSA] Rooibos before after tests
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests before each and after each are running
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@BeforeEach
-function RBSA__BeforeEach() as void
- ? "!!! Before"
-end function
-
-
-'@AfterEach
-function RBSA__AfterEach() as void
- ? "!!! After"
-end function
-
-'@Test before after
-function RBSA__before_after() as void
-
- assertResult = m.Fail("reason")
-
- isFail = m.currentResult.isFail
- m.currentResult.Reset()
-
- m.AssertFalse(assertResult)
- m.AssertTrue(isFail)
-end function
\ No newline at end of file
diff --git a/outRun/.roku-deploy-staging/source/tests/testConfig.json b/outRun/.roku-deploy-staging/source/tests/testConfig.json
deleted file mode 100644
index 8380fe04..00000000
--- a/outRun/.roku-deploy-staging/source/tests/testConfig.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "logLevel": 1,
- "failFast": false,
- "showOnlyFailures": true
-}
diff --git a/outRun/.roku-deploy-staging/source/tests/testUtils.brs b/outRun/.roku-deploy-staging/source/tests/testUtils.brs
deleted file mode 100644
index 54d2476d..00000000
--- a/outRun/.roku-deploy-staging/source/tests/testUtils.brs
+++ /dev/null
@@ -1,8 +0,0 @@
-
-sub AddTestUtils(testCase)
- 'add your own test utils you want access to when testing here
-
- 'e.g.
- 'testCase.testUtils = TestUtils()
- 'testCase.r = rodash()
-end sub
\ No newline at end of file
diff --git a/outRun/.roku-deploy-staging/source/tests/verifyBeforeEachAfterEach.brs b/outRun/.roku-deploy-staging/source/tests/verifyBeforeEachAfterEach.brs
deleted file mode 100644
index 5bfae93e..00000000
--- a/outRun/.roku-deploy-staging/source/tests/verifyBeforeEachAfterEach.brs
+++ /dev/null
@@ -1,100 +0,0 @@
-'@TestSuite [BEAER] BeforeEach and AfterEach Running
-
-'@Setup
-function BEAER_Setup() as void
- ? "!!! Setup"
-end function
-
-
-'@TearDown
-function BEAER_TearDown() as void
- ? "!!! TearDown"
-end function
-
-'@BeforeEach
-function BEAER_BeforeEach() as void
- ? "!!! Before"
-end function
-
-
-'@AfterEach
-function BEAER_AfterEach() as void
- ? "!!! After"
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests group 1 - should have global before/after
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test 1
-function BEAER_group1_1() as void
- m.AssertTrue(true)
-end function
-
-'@Test 2
-function BEAER_group1_2() as void
- m.AssertTrue(true)
-end function
-
-'@Test 3
-'@Params["a"]
-'@Params["b"]
-'@Params["c"]
-function BEAER_group1_3(values) as void
- m.AssertTrue(true)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests group 2 - should have group before after
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@BeforeEach
-function BEAER_group2_BeforeEach() as void
- ? "!!! Before GROUP 2"
-end function
-
-
-'@AfterEach
-function BEAER_group2_AfterEach() as void
- ? "!!! After GROUP 2"
-end function
-
-'@Test 1
-function BEAER_group2_1() as void
- m.AssertTrue(true)
-end function
-
-'@Test 2
-function BEAER_group2_2() as void
- m.AssertTrue(true)
-end function
-
-'@Test 3
-'@Params["a"]
-'@Params["b"]
-'@Params["c"]
-function BEAER_group2_3(values) as void
- m.AssertTrue(true)
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests group 3 - should have global before/after
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-'@Test 1
-function BEAER_group3_1() as void
- m.AssertTrue(true)
-end function
-
-'@Test 2
-function BEAER_group3_2() as void
- m.AssertTrue(true)
-end function
-
-'@Test 3
-'@Params["a"]
-'@Params["b"]
-'@Params["c"]
-function BEAER_group3_3(values) as void
- m.AssertTrue(true)
-end function
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index eb853107..935eddf1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,6778 +1,4119 @@
{
"name": "rooibos",
- "version": "3.6.1",
- "lockfileVersion": 1,
+ "version": "4.1.3",
+ "lockfileVersion": 2,
"requires": true,
- "dependencies": {
- "@nodelib/fs.scandir": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
- "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.3",
- "run-parallel": "1.1.9"
- }
- },
- "@nodelib/fs.stat": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
- "dev": true
- },
- "@nodelib/fs.walk": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
- "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
- "dev": true,
- "requires": {
- "@nodelib/fs.scandir": "2.1.3",
- "fastq": "1.6.0"
+ "packages": {
+ "": {
+ "version": "4.1.3",
+ "license": "MIT",
+ "devDependencies": {
+ "brighterscript": "^0.32.2",
+ "ropm": "^0.5.0"
}
},
- "@types/events": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
- "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
- "dev": true
- },
- "@types/expect": {
- "version": "1.20.4",
- "resolved": "https://registry.npmjs.org/@types/expect/-/expect-1.20.4.tgz",
- "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==",
- "dev": true
- },
- "@types/glob": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
- "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
"dev": true,
- "requires": {
- "@types/events": "3.0.0",
- "@types/minimatch": "3.0.3",
- "@types/node": "13.5.0"
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.4",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "@types/glob-stream": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz",
- "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==",
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
"dev": true,
- "requires": {
- "@types/glob": "7.1.1",
- "@types/node": "13.5.0"
+ "engines": {
+ "node": ">= 8"
}
},
- "@types/gulp": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.6.tgz",
- "integrity": "sha512-0E8/iV/7FKWyQWSmi7jnUvgXXgaw+pfAzEB06Xu+l0iXVJppLbpOye5z7E2klw5akXd+8kPtYuk65YBcZPM4ow==",
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
"dev": true,
- "requires": {
- "@types/undertaker": "1.2.2",
- "@types/vinyl-fs": "2.4.11",
- "chokidar": "2.1.8"
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.4",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "@types/merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/@types/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-3xFWjsGhm5GCVlRrcrrVr9oapPxpbG5M3G/4JGF+Gra++7DWoeDOQphCEhyMpbpbptD3w/4PesYIMby/yHrzkQ==",
+ "node_modules/@types/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
"dev": true,
- "requires": {
- "@types/node": "13.5.0"
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
}
},
- "@types/minimatch": {
+ "node_modules/@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
"integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
"dev": true
},
- "@types/node": {
- "version": "13.5.0",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-13.5.0.tgz",
- "integrity": "sha512-Onhn+z72D2O2Pb2ql2xukJ55rglumsVo1H6Fmyi8mlU9SvKdBk/pUSUAiBY/d9bAOF7VVWajX3sths/+g6ZiAQ==",
+ "node_modules/@types/node": {
+ "version": "14.14.31",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz",
+ "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==",
"dev": true
},
- "@types/undertaker": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.2.2.tgz",
- "integrity": "sha512-j4iepCSuY2JGW/hShVtUBagic0klYNFIXP7VweavnYnNC2EjiKxJFeaS9uaJmAT0ty9sQSqTS1aagWMZMV0HyA==",
- "dev": true,
- "requires": {
- "@types/undertaker-registry": "1.0.1"
- }
- },
- "@types/undertaker-registry": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
- "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==",
+ "node_modules/@types/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==",
"dev": true
},
- "@types/vinyl": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.4.tgz",
- "integrity": "sha512-2o6a2ixaVI2EbwBPg1QYLGQoHK56p/8X/sGfKbFC8N6sY9lfjsMf/GprtkQkSya0D4uRiutRZ2BWj7k3JvLsAQ==",
- "dev": true,
- "requires": {
- "@types/expect": "1.20.4",
- "@types/node": "13.5.0"
- }
- },
- "@types/vinyl-fs": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.11.tgz",
- "integrity": "sha512-2OzQSfIr9CqqWMGqmcERE6Hnd2KY3eBVtFaulVo3sJghplUcaeMdL9ZjEiljcQQeHjheWY9RlNmumjIAvsBNaA==",
+ "node_modules/@xml-tools/ast": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@xml-tools/ast/-/ast-5.0.4.tgz",
+ "integrity": "sha512-k6BFvF2uQMXJTTZO100v1CgezOawoZOsL+L4xTDQBoRVU3LOkAYglL6xfKGCPHbTN1+EPVw9qE4+kXr4HVvvyg==",
"dev": true,
- "requires": {
- "@types/glob-stream": "6.1.0",
- "@types/node": "13.5.0",
- "@types/vinyl": "2.0.4"
+ "dependencies": {
+ "@xml-tools/common": "^0.1.5",
+ "@xml-tools/parser": "^1.0.10",
+ "lodash": "4.17.20"
}
},
- "adm-zip": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.14.tgz",
- "integrity": "sha512-/9aQCnQHF+0IiCl0qhXoK7qs//SwYE7zX8lsr/DNk1BRAHYxeLZPL4pguwK29gUEqasYQjqPtEpDRSWEkdHn9g==",
+ "node_modules/@xml-tools/ast/node_modules/lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
},
- "ajv": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz",
- "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==",
+ "node_modules/@xml-tools/common": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@xml-tools/common/-/common-0.1.5.tgz",
+ "integrity": "sha512-uEv4A1fZGd9c89AcD+OloGccmY1T6OtYNCf7dCiWwTdCpn2JoLj2TozXLX4lBAuY3oAuyigvrxupcUQWFTvg+Q==",
"dev": true,
- "requires": {
- "fast-deep-equal": "3.1.1",
- "fast-json-stable-stringify": "2.1.0",
- "json-schema-traverse": "0.4.1",
- "uri-js": "4.2.2"
+ "dependencies": {
+ "lodash": "4.17.20"
}
},
- "ansi-colors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
- "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+ "node_modules/@xml-tools/common/node_modules/lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
+ },
+ "node_modules/@xml-tools/parser": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.10.tgz",
+ "integrity": "sha512-9oRb68wEKT+MRB7e2GwTiKicRKVXKzquBDGgH6YcGafvnSYXorWi2oaTVtbv2109RlGiQSnoXaQFUXCnHwFS7Q==",
"dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
+ "dependencies": {
+ "chevrotain": "7.1.1"
}
},
- "ansi-cyan": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
- "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "node_modules/aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
"dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
+ "dependencies": {
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "ansi-gray": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
- "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "ansi-red": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
- "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "node_modules/ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true,
- "requires": {
- "ansi-wrap": "0.1.0"
+ "engines": {
+ "node": ">=8"
}
},
- "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": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "ansi-wrap": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
- "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
- "dev": true
- },
- "any-promise": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
- "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
- "dev": true
- },
- "anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "node_modules/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": {
- "micromatch": "3.1.10",
- "normalize-path": "2.1.1"
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "append-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
- "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
+ "node_modules/anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
- "requires": {
- "buffer-equal": "1.0.0"
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "archiver": {
+ "node_modules/archiver": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz",
"integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==",
"dev": true,
- "requires": {
- "archiver-utils": "2.1.0",
- "async": "2.6.3",
- "buffer-crc32": "0.2.13",
- "glob": "7.1.6",
- "readable-stream": "3.5.0",
- "tar-stream": "2.1.0",
- "zip-stream": "2.1.3"
- },
"dependencies": {
- "readable-stream": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz",
- "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==",
- "dev": true,
- "requires": {
- "inherits": "2.0.4",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
- }
- }
+ "archiver-utils": "^2.1.0",
+ "async": "^2.6.3",
+ "buffer-crc32": "^0.2.1",
+ "glob": "^7.1.4",
+ "readable-stream": "^3.4.0",
+ "tar-stream": "^2.1.0",
+ "zip-stream": "^2.1.2"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "archiver-utils": {
+ "node_modules/archiver-utils": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
"integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
"dev": true,
- "requires": {
- "glob": "7.1.6",
- "graceful-fs": "4.2.3",
- "lazystream": "1.0.0",
- "lodash.defaults": "4.2.0",
- "lodash.difference": "4.5.0",
- "lodash.flatten": "4.4.0",
- "lodash.isplainobject": "4.0.6",
- "lodash.union": "4.6.0",
- "normalize-path": "3.0.0",
- "readable-stream": "2.3.7"
+ "dependencies": {
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.2.0",
+ "lazystream": "^1.0.0",
+ "lodash.defaults": "^4.2.0",
+ "lodash.difference": "^4.5.0",
+ "lodash.flatten": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.union": "^4.6.0",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^2.0.0"
},
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/archiver-utils/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
"dependencies": {
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- }
+ "core-util-is": "~1.0.0",
+ "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.1"
}
},
- "archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "node_modules/archiver-utils/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
- "arg": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.2.tgz",
- "integrity": "sha512-+ytCkGcBtHZ3V2r2Z06AncYO8jz46UEamcspGoU8lHcEbpn6J77QK0vdWvChsclg/tM5XIJC5tnjmPp7Eq6Obg=="
+ "node_modules/archiver-utils/node_modules/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,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
},
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
+ "node_modules/array-flat-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz",
+ "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
},
- "arr-filter": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz",
- "integrity": "sha1-Q/3d0JHo7xGqTEXZzcGOLf8XEe4=",
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true,
- "requires": {
- "make-iterator": "1.0.1"
+ "engines": {
+ "node": ">=8"
}
},
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
+ "node_modules/asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": "~2.1.0"
+ }
},
- "arr-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz",
- "integrity": "sha1-Onc0X/wc814qkYJWAfnljy4kysQ=",
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
"dev": true,
- "requires": {
- "make-iterator": "1.0.1"
+ "engines": {
+ "node": ">=0.8"
}
},
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
+ "node_modules/async": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.14"
+ }
},
- "array-back": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz",
- "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==",
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
"dev": true
},
- "array-differ": {
+ "node_modules/at-least-node": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
- "dev": true
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
},
- "array-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
+ "node_modules/aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
"dev": true
},
- "array-flat-polyfill": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz",
- "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==",
+ "node_modules/balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
- "array-initial": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz",
- "integrity": "sha1-L6dLJnOTccOUe9enrcc74zSz15U=",
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
- "requires": {
- "array-slice": "1.1.0",
- "is-number": "4.0.0"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
}
- }
+ ]
},
- "array-last": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz",
- "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==",
+ "node_modules/bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
- "requires": {
- "is-number": "4.0.0"
- },
"dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true
- }
+ "tweetnacl": "^0.14.3"
}
},
- "array-slice": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
- "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
- "dev": true
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "array-sort": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz",
- "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==",
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
- "requires": {
- "default-compare": "1.0.0",
- "get-value": "2.0.6",
- "kind-of": "5.1.0"
- },
"dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
}
},
- "array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "node_modules/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": {
- "array-uniq": "1.0.3"
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "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
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "asn1": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
- "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
- "requires": {
- "safer-buffer": "2.1.2"
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
- "dev": true
+ "node_modules/brighterscript": {
+ "version": "0.32.2",
+ "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.32.2.tgz",
+ "integrity": "sha512-tZ558Q6JtqNh/1nr1Cbi1iy8rYRIDwsUgtYkP9s9fX8zNNa+hwPjWC0aENX/fLRfb2beMphLsMNBtDywUqTHPg==",
+ "dev": true,
+ "dependencies": {
+ "@xml-tools/parser": "^1.0.7",
+ "array-flat-polyfill": "^1.0.1",
+ "chalk": "^2.4.2",
+ "chokidar": "^3.0.2",
+ "clear": "^0.1.0",
+ "cross-platform-clear-console": "^2.3.0",
+ "debounce-promise": "^3.1.0",
+ "eventemitter3": "^4.0.0",
+ "file-url": "^3.0.0",
+ "fs-extra": "^7.0.1",
+ "glob": "^7.1.6",
+ "jsonc-parser": "^2.3.0",
+ "long": "^3.2.0",
+ "luxon": "^1.8.3",
+ "minimatch": "^3.0.4",
+ "moment": "^2.23.0",
+ "p-settle": "^2.1.0",
+ "parse-ms": "^2.1.0",
+ "roku-deploy": "^3.2.4",
+ "serialize-error": "^7.0.1",
+ "source-map": "^0.7.3",
+ "vscode-languageserver": "^6.1.1",
+ "vscode-languageserver-protocol": "~3.15.3",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-uri": "^2.1.1",
+ "xml2js": "^0.4.19",
+ "yargs": "^15.4.0"
+ },
+ "bin": {
+ "bsc": "dist/cli.js"
+ }
},
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
},
- "async": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
- "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
"dev": true,
- "requires": {
- "lodash": "4.17.15"
+ "engines": {
+ "node": "*"
}
},
- "async-done": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz",
- "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==",
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true,
- "requires": {
- "end-of-stream": "1.4.4",
- "once": "1.4.0",
- "process-nextick-args": "2.0.1",
- "stream-exhaust": "1.0.2"
+ "engines": {
+ "node": ">=6"
}
},
- "async-each": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
- "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+ "node_modules/caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
- "async-settle": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz",
- "integrity": "sha1-HQqRS7Aldb7IqPOnTlCA9yssDGs=",
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
- "requires": {
- "async-done": "1.3.2"
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
- "dev": true
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "dev": true
- },
- "aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
- "dev": true
- },
- "aws4": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
- "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==",
- "dev": true
+ "node_modules/chevrotain": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz",
+ "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==",
+ "dev": true,
+ "dependencies": {
+ "regexp-to-ast": "0.5.0"
+ }
},
- "babel-cli": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
- "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=",
+ "node_modules/chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
"dev": true,
- "requires": {
- "babel-core": "6.26.3",
- "babel-polyfill": "6.26.0",
- "babel-register": "6.26.0",
- "babel-runtime": "6.26.0",
- "chokidar": "1.7.0",
- "commander": "2.20.3",
- "convert-source-map": "1.7.0",
- "fs-readdir-recursive": "1.1.0",
- "glob": "7.1.6",
- "lodash": "4.17.15",
- "output-file-sync": "1.1.2",
- "path-is-absolute": "1.0.1",
- "slash": "1.0.0",
- "source-map": "0.5.7",
- "v8flags": "2.1.1"
- },
"dependencies": {
- "anymatch": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
- "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
- "dev": true,
- "optional": true,
- "requires": {
- "micromatch": "2.3.11",
- "normalize-path": "2.1.1"
- }
- },
- "arr-diff": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
- "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
- "dev": true,
- "optional": true,
- "requires": {
- "arr-flatten": "1.1.0"
- }
- },
- "array-unique": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
- "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
- "dev": true,
- "optional": true
- },
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
- "dev": true,
- "optional": true,
- "requires": {
- "expand-range": "1.8.2",
- "preserve": "0.2.0",
- "repeat-element": "1.1.3"
- }
- },
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
- "dev": true,
- "optional": true,
- "requires": {
- "anymatch": "1.3.2",
- "async-each": "1.0.3",
- "fsevents": "1.2.11",
- "glob-parent": "2.0.0",
- "inherits": "2.0.4",
- "is-binary-path": "1.0.1",
- "is-glob": "2.0.1",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.2.1"
- }
- },
- "expand-brackets": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
- "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-posix-bracket": "0.1.1"
- }
- },
- "extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- },
- "micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true,
- "optional": 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"
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- },
- "v8flags": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
- "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
- "dev": true,
- "requires": {
- "user-home": "1.1.1"
- }
- }
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.1"
}
},
- "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=",
+ "node_modules/clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
"dev": true,
- "requires": {
- "chalk": "1.1.3",
- "esutils": "2.0.3",
- "js-tokens": "3.0.2"
+ "engines": {
+ "node": ">=6"
}
},
- "babel-core": {
- "version": "6.26.3",
- "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
- "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+ "node_modules/clear": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz",
+ "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==",
"dev": true,
- "requires": {
- "babel-code-frame": "6.26.0",
- "babel-generator": "6.26.1",
- "babel-helpers": "6.24.1",
- "babel-messages": "6.23.0",
- "babel-register": "6.26.0",
- "babel-runtime": "6.26.0",
- "babel-template": "6.26.0",
- "babel-traverse": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "convert-source-map": "1.7.0",
- "debug": "2.6.9",
- "json5": "0.5.1",
- "lodash": "4.17.15",
- "minimatch": "3.0.4",
- "path-is-absolute": "1.0.1",
- "private": "0.1.8",
- "slash": "1.0.0",
- "source-map": "0.5.7"
- },
- "dependencies": {
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
+ "engines": {
+ "node": "*"
}
},
- "babel-generator": {
- "version": "6.26.1",
- "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz",
- "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==",
+ "node_modules/cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": 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.15",
- "source-map": "0.5.7",
- "trim-right": "1.0.1"
- },
"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
- }
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
}
},
- "babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-template": "6.26.0"
+ "dependencies": {
+ "color-name": "1.1.3"
}
},
- "babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
- "requires": {
- "babel-runtime": "6.26.0"
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
}
},
- "babel-polyfill": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
- "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
+ "node_modules/compress-commons": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz",
+ "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==",
"dev": true,
- "requires": {
- "babel-runtime": "6.26.0",
- "core-js": "2.6.11",
- "regenerator-runtime": "0.10.5"
- },
"dependencies": {
- "regenerator-runtime": {
- "version": "0.10.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
- "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
- "dev": true
- }
+ "buffer-crc32": "^0.2.13",
+ "crc32-stream": "^3.0.1",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^2.3.6"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
+ "node_modules/compress-commons/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
- "requires": {
- "babel-core": "6.26.3",
- "babel-runtime": "6.26.0",
- "core-js": "2.6.11",
- "home-or-tmp": "2.0.0",
- "lodash": "4.17.15",
- "mkdirp": "0.5.1",
- "source-map-support": "0.4.18"
- },
"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
- },
- "source-map-support": {
- "version": "0.4.18",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz",
- "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==",
- "dev": true,
- "requires": {
- "source-map": "0.5.7"
- }
- }
+ "core-util-is": "~1.0.0",
+ "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.1"
}
},
- "babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
+ "node_modules/compress-commons/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/compress-commons/node_modules/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": {
- "core-js": "2.6.11",
- "regenerator-runtime": "0.11.1"
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
}
},
- "babel-template": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz",
- "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=",
+ "node_modules/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
+ },
+ "node_modules/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
+ },
+ "node_modules/crc": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
+ "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
"dev": true,
- "requires": {
- "babel-runtime": "6.26.0",
- "babel-traverse": "6.26.0",
- "babel-types": "6.26.0",
- "babylon": "6.18.0",
- "lodash": "4.17.15"
- },
"dependencies": {
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- }
+ "buffer": "^5.1.0"
}
},
- "babel-traverse": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz",
- "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=",
+ "node_modules/crc32-stream": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
+ "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
"dev": 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.4",
- "lodash": "4.17.15"
+ "dependencies": {
+ "crc": "^3.4.4",
+ "readable-stream": "^3.4.0"
},
+ "engines": {
+ "node": ">= 6.9.0"
+ }
+ },
+ "node_modules/cross-platform-clear-console": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz",
+ "integrity": "sha512-To+sJ6plHHC6k5DfdvSVn6F1GRGJh/R6p76bCpLbyMyHEmbqFyuMAeGwDcz/nGDWH3HUcjFTTX9iUSCzCg9Eiw==",
+ "dev": true
+ },
+ "node_modules/dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
"dependencies": {
- "babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true
- }
+ "assert-plus": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10"
}
},
- "babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
+ "node_modules/dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
"dev": true,
- "requires": {
- "babel-runtime": "6.26.0",
- "esutils": "2.0.3",
- "lodash": "4.17.15",
- "to-fast-properties": "1.0.3"
+ "engines": {
+ "node": "*"
}
},
- "babylon": {
- "version": "7.0.0-beta.19",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.19.tgz",
- "integrity": "sha512-Vg0C9s/REX6/WIXN37UKpv5ZhRi6A4pjHlpkE34+8/a6c2W1Q692n3hmc+SZG5lKRnaExLUbxtJ1SVT+KaCQ/A==",
+ "node_modules/debounce-promise": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
+ "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==",
"dev": true
},
- "bach": {
+ "node_modules/decamelize": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz",
- "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true,
- "requires": {
- "arr-filter": "1.1.2",
- "arr-flatten": "1.1.0",
- "arr-map": "2.0.2",
- "array-each": "1.0.1",
- "array-initial": "1.1.0",
- "array-last": "1.3.0",
- "async-done": "1.3.2",
- "async-settle": "1.0.0",
- "now-and-later": "2.0.1"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "balanced-match": {
+ "node_modules/del": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
+ "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
+ "dev": true,
+ "dependencies": {
+ "globby": "^10.0.1",
+ "graceful-fs": "^4.2.2",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.1",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/delayed-stream": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
},
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
- "requires": {
- "cache-base": "1.0.1",
- "class-utils": "0.3.6",
- "component-emitter": "1.3.0",
- "define-property": "1.0.0",
- "isobject": "3.0.1",
- "mixin-deep": "1.3.2",
- "pascalcase": "0.1.1"
+ "dependencies": {
+ "path-type": "^4.0.0"
},
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
"dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "1.0.2"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.3"
- }
- }
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
}
},
- "base64-js": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
- "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
- "bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
- "requires": {
- "tweetnacl": "0.14.5"
+ "dependencies": {
+ "once": "^1.4.0"
}
},
- "beeper": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
- "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "node_modules/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,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true
},
- "binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
- "bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+ "node_modules/extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true,
- "optional": true,
- "requires": {
- "file-uri-to-path": "1.0.0"
- }
+ "engines": [
+ "node >=0.6.0"
+ ]
},
- "bl": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz",
- "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==",
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
+ "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
"dev": true,
- "requires": {
- "readable-stream": "3.5.0"
- },
"dependencies": {
- "readable-stream": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz",
- "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==",
- "dev": true,
- "requires": {
- "inherits": "2.0.4",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
- }
- }
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
- "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==",
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
},
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "node_modules/fastq": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz",
+ "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==",
"dev": true,
- "requires": {
- "arr-flatten": "1.1.0",
- "array-unique": "0.3.2",
- "extend-shallow": "2.0.1",
- "fill-range": "4.0.0",
- "isobject": "3.0.1",
- "repeat-element": "1.1.3",
- "snapdragon": "0.8.2",
- "snapdragon-node": "2.1.1",
- "split-string": "3.1.0",
- "to-regex": "3.0.2"
- },
"dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
+ "reusify": "^1.0.4"
}
},
- "brighterscript": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.10.0.tgz",
- "integrity": "sha512-7l6zxVmnJ1yvRHzzkjg5X4/hwoDs3FX2kfWwuoCMEr0N8d11fiSxfcthym8AyKSPibESWlpR+awHcAlq472+lw==",
+ "node_modules/file-url": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz",
+ "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==",
"dev": true,
- "requires": {
- "array-flat-polyfill": "1.0.1",
- "chalk": "2.4.2",
- "chokidar": "3.4.0",
- "clear": "0.1.0",
- "command-line-args": "5.1.1",
- "command-line-usage": "5.0.5",
- "cross-platform-clear-console": "2.3.0",
- "debounce-promise": "3.1.2",
- "eventemitter3": "4.0.4",
- "fs-extra": "7.0.1",
- "glob": "7.1.6",
- "jsonc-parser": "2.2.1",
- "long": "3.2.0",
- "luxon": "1.21.3",
- "minimatch": "3.0.4",
- "moment": "2.24.0",
- "p-settle": "2.1.0",
- "roku-deploy": "3.1.1",
- "source-map": "0.7.3",
- "vscode-languageserver": "6.1.1",
- "vscode-languageserver-textdocument": "1.0.1",
- "vscode-uri": "2.1.1",
- "xml2js": "0.4.23"
- },
- "dependencies": {
- "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.3"
- }
- },
- "anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
- "dev": true,
- "requires": {
- "normalize-path": "3.0.0",
- "picomatch": "2.2.1"
- }
- },
- "binary-extensions": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
- "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
- "dev": true
- },
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "7.0.1"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.5.0"
- }
- },
- "chokidar": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz",
- "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==",
- "dev": true,
- "requires": {
- "anymatch": "3.1.1",
- "braces": "3.0.2",
- "fsevents": "2.1.3",
- "glob-parent": "5.1.1",
- "is-binary-path": "2.1.0",
- "is-glob": "4.0.1",
- "normalize-path": "3.0.0",
- "readdirp": "3.4.0"
- }
- },
- "dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
- "dev": true
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "5.0.1"
- }
- },
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "requires": {
- "graceful-fs": "4.2.3",
- "jsonfile": "4.0.0",
- "universalify": "0.1.2"
- }
- },
- "fsevents": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
- "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
- "dev": true,
- "optional": true
- },
- "glob-parent": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
- "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
- "dev": true,
- "requires": {
- "is-glob": "4.0.1"
- }
- },
- "is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "requires": {
- "binary-extensions": "2.0.0"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- },
- "readdirp": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
- "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
- "dev": true,
- "requires": {
- "picomatch": "2.2.1"
- }
- },
- "roku-deploy": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.1.1.tgz",
- "integrity": "sha512-mdcnlC4T4NlA/BW1FJ9VV1UGt5OF87F8efieso2BZNQ/LO7LgzWA8dPS69hmtout1aMbXvkSy1ksEiDdJOKiIQ==",
- "dev": true,
- "requires": {
- "archiver": "3.1.1",
- "dateformat": "3.0.3",
- "fs-extra": "7.0.1",
- "glob": "7.1.6",
- "minimatch": "3.0.4",
- "path": "0.12.7",
- "request": "2.88.0"
- }
- },
- "source-map": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
- "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "3.0.0"
- }
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "7.0.0"
- }
- },
- "vscode-jsonrpc": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz",
- "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==",
- "dev": true
- },
- "vscode-languageserver": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz",
- "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==",
- "dev": true,
- "requires": {
- "vscode-languageserver-protocol": "3.15.3"
- }
- },
- "vscode-languageserver-protocol": {
- "version": "3.15.3",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz",
- "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==",
- "dev": true,
- "requires": {
- "vscode-jsonrpc": "5.0.1",
- "vscode-languageserver-types": "3.15.1"
- }
- },
- "vscode-languageserver-types": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
- "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
- "dev": true
- },
- "vscode-uri": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.1.tgz",
- "integrity": "sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A==",
- "dev": true
- }
+ "engines": {
+ "node": ">=8"
}
},
- "brightscript-language": {
- "version": "0.2.15",
- "resolved": "https://registry.npmjs.org/brightscript-language/-/brightscript-language-0.2.15.tgz",
- "integrity": "sha512-uqDnMXjgXMC4sfqeWhOV4VWKn5DPkUPLNl0osNMuD7A5Q90oHMpVbeyPU5ykvCUD7YBNhNXBoqsR9frSSNVjsA==",
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
"dev": true,
- "requires": {
- "brs": "0.14.0-nightly.20190613",
- "chalk": "2.4.2",
- "chokidar": "2.1.8",
- "clear": "0.1.0",
- "command-line-args": "5.1.1",
- "command-line-usage": "5.0.5",
- "cross-platform-clear-console": "2.3.0",
- "debounce-promise": "3.1.2",
- "fs-extra": "7.0.1",
- "moment": "2.24.0",
- "roku-deploy": "2.6.1",
- "vscode-languageserver": "5.2.1",
- "vscode-uri": "1.0.8",
- "xml2js": "0.4.23"
- },
"dependencies": {
- "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.3"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.5.0"
- }
- },
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
- "dev": true,
- "requires": {
- "graceful-fs": "4.2.3",
- "jsonfile": "4.0.0",
- "universalify": "0.1.2"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "3.0.0"
- }
- }
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "brs": {
- "version": "0.14.0-nightly.20190613",
- "resolved": "https://registry.npmjs.org/brs/-/brs-0.14.0-nightly.20190613.tgz",
- "integrity": "sha512-+CQq7frjIBzWL7dpyQqCc502nGvORhjhWtXk37SSvVdtt6P7jzhw6EDb6Q9qwj5QppzLRp7o5wVb3WB7rYbqLg==",
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"dev": true,
- "requires": {
- "commander": "2.20.3",
- "long": "3.2.0",
- "luxon": "1.21.3",
- "memory-fs": "0.4.1",
- "nanomatch": "1.2.13",
- "p-settle": "2.1.0"
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "buffer": {
- "version": "5.4.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz",
- "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==",
+ "node_modules/forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"dev": true,
- "requires": {
- "base64-js": "1.3.1",
- "ieee754": "1.1.13"
+ "engines": {
+ "node": "*"
}
},
- "buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
- "dev": true
+ "node_modules/form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 0.12"
+ }
},
- "buffer-equal": {
+ "node_modules/fs-constants": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
- "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"dev": true
},
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
- },
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"dev": true,
- "requires": {
- "collection-visit": "1.0.0",
- "component-emitter": "1.3.0",
- "get-value": "2.0.6",
- "has-value": "1.0.0",
- "isobject": "3.0.1",
- "set-value": "2.0.1",
- "to-object-path": "0.3.0",
- "union-value": "1.0.1",
- "unset-value": "1.0.0"
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
}
},
- "camelcase": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
- "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
- "dev": true
- },
- "caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "catharsis": {
- "version": "0.8.11",
- "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.8.11.tgz",
- "integrity": "sha512-a+xUyMV7hD1BrDQA/3iPV7oc+6W26BgVJO05PGEoatMyIuPScQKsde6i3YorWX1qs+AZjnJ18NqdKoCtKiNh1g==",
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
- "requires": {
- "lodash": "4.17.15"
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": 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"
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
}
},
- "chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "node_modules/getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
- "requires": {
- "anymatch": "2.0.0",
- "async-each": "1.0.3",
- "braces": "2.3.2",
- "fsevents": "1.2.11",
- "glob-parent": "3.1.0",
- "inherits": "2.0.4",
- "is-binary-path": "1.0.1",
- "is-glob": "4.0.1",
- "normalize-path": "3.0.0",
- "path-is-absolute": "1.0.1",
- "readdirp": "2.2.1",
- "upath": "1.2.0"
- },
"dependencies": {
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- }
+ "assert-plus": "^1.0.0"
}
},
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "node_modules/glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
"dev": 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",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "0.1.6"
- }
- }
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "clear": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz",
- "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==",
- "dev": true
- },
- "cliui": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
- "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "node_modules/glob-all": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz",
+ "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==",
"dev": true,
- "requires": {
- "string-width": "1.0.2",
- "strip-ansi": "3.0.1",
- "wrap-ansi": "2.1.0"
+ "dependencies": {
+ "glob": "^7.1.2",
+ "yargs": "^15.3.1"
+ },
+ "bin": {
+ "glob-all": "bin/glob-all"
}
},
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- },
- "clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
- "dev": true
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
+ "node_modules/glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
},
- "cloneable-readable": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz",
- "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==",
+ "node_modules/globby": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+ "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
"dev": true,
- "requires": {
- "inherits": "2.0.4",
- "process-nextick-args": "2.0.1",
- "readable-stream": "2.3.7"
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "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=",
+ "node_modules/graceful-fs": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
"dev": true
},
- "collection-map": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz",
- "integrity": "sha1-rqDwb40mx4DCt1SUOFVEsiVa8Yw=",
+ "node_modules/har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true,
- "requires": {
- "arr-map": "2.0.2",
- "for-own": "1.0.0",
- "make-iterator": "1.0.1"
+ "engines": {
+ "node": ">=4"
}
},
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "node_modules/har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "deprecated": "this library is no longer supported",
"dev": true,
- "requires": {
- "map-visit": "1.0.0",
- "object-visit": "1.0.1"
+ "dependencies": {
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
- "requires": {
- "color-name": "1.1.3"
+ "engines": {
+ "node": ">=4"
}
},
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "dev": true
- },
- "colors": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
- "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
- "dev": true
+ "node_modules/http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ },
+ "engines": {
+ "node": ">=0.8",
+ "npm": ">=1.3.7"
+ }
},
- "combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dev": true,
- "requires": {
- "delayed-stream": "1.0.0"
- }
- },
- "command-line-args": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.1.1.tgz",
- "integrity": "sha512-hL/eG8lrll1Qy1ezvkant+trihbGnaKaeEjj6Scyr3DN+RC7iQ5Rz84IeLERfAWDGo0HBSNAakczwgCilDXnWg==",
- "dev": true,
- "requires": {
- "array-back": "3.1.0",
- "find-replace": "3.0.0",
- "lodash.camelcase": "4.3.0",
- "typical": "4.0.0"
- }
- },
- "command-line-usage": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-5.0.5.tgz",
- "integrity": "sha512-d8NrGylA5oCXSbGoKz05FkehDAzSmIm4K03S5VDh4d5lZAtTWfc3D1RuETtuQCn8129nYfJfDdF7P/lwcz1BlA==",
- "dev": true,
- "requires": {
- "array-back": "2.0.0",
- "chalk": "2.4.2",
- "table-layout": "0.4.5",
- "typical": "2.6.1"
- },
- "dependencies": {
- "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.3"
- }
- },
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
- "dev": true,
- "requires": {
- "typical": "2.6.1"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.5.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "3.0.0"
- }
- },
- "typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
- "dev": true
- }
- }
- },
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "compare-directories": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/compare-directories/-/compare-directories-0.1.0.tgz",
- "integrity": "sha1-6Si7Oj42mC4KhK7oSqHHj1vbh0w=",
- "dev": true,
- "requires": {
- "fs-promise": "2.0.3",
- "recursive-readdir": "2.2.2"
- }
- },
- "component-emitter": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
- "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
- "dev": true
- },
- "compress-commons": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz",
- "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==",
- "dev": true,
- "requires": {
- "buffer-crc32": "0.2.13",
- "crc32-stream": "3.0.1",
- "normalize-path": "3.0.0",
- "readable-stream": "2.3.7"
- },
- "dependencies": {
- "normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true
- }
- }
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
- },
- "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.1.1",
- "inherits": "2.0.4",
- "readable-stream": "2.3.7",
- "typedarray": "0.0.6"
- }
- },
- "concat-with-sourcemaps": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
- "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
- "requires": {
- "source-map": "0.6.1"
- }
- },
- "convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dev": true,
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
- },
- "copy-props": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.4.tgz",
- "integrity": "sha512-7cjuUME+p+S3HZlbllgsn2CDwS+5eCCX16qBgNC4jgSTf49qR1VKy/Zhl400m0IQXl/bPGEVqncgUUMjrr4s8A==",
- "dev": true,
- "requires": {
- "each-props": "1.3.2",
- "is-plain-object": "2.0.4"
- }
- },
- "core-js": {
- "version": "2.6.11",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
- "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
- "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="
- },
- "crc": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
- "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
- "dev": true,
- "requires": {
- "buffer": "5.4.3"
- }
- },
- "crc32-stream": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
- "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
- "dev": true,
- "requires": {
- "crc": "3.8.0",
- "readable-stream": "3.5.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz",
- "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==",
- "dev": true,
- "requires": {
- "inherits": "2.0.4",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
- }
- }
- }
- },
- "cross-platform-clear-console": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz",
- "integrity": "sha512-To+sJ6plHHC6k5DfdvSVn6F1GRGJh/R6p76bCpLbyMyHEmbqFyuMAeGwDcz/nGDWH3HUcjFTTX9iUSCzCg9Eiw==",
- "dev": true
- },
- "d": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
- "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
- "dev": true,
- "requires": {
- "es5-ext": "0.10.53",
- "type": "1.2.0"
- }
- },
- "dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0"
- }
- },
- "dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
- "dev": true
- },
- "debounce-promise": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
- "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==",
- "dev": true
- },
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "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=",
- "dev": true
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true
- },
- "default-compare": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
- "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
- "dev": true,
- "requires": {
- "kind-of": "5.1.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "default-resolution": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz",
- "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=",
- "dev": true
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "1.1.1"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "requires": {
- "is-descriptor": "1.0.2",
- "isobject": "3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.3"
- }
- }
- }
- },
- "del": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz",
- "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=",
- "dev": true,
- "requires": {
- "globby": "6.1.0",
- "is-path-cwd": "1.0.0",
- "is-path-in-cwd": "1.0.1",
- "p-map": "1.2.0",
- "pify": "3.0.0",
- "rimraf": "2.7.1"
- },
- "dependencies": {
- "rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
- "dev": true,
- "requires": {
- "glob": "7.1.6"
- }
- }
- }
- },
- "delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
- "dev": true
- },
- "detect-file": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
- },
- "detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true,
- "requires": {
- "repeating": "2.0.1"
- }
- },
- "diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
- },
- "dir-compare": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-1.8.0.tgz",
- "integrity": "sha512-Ork/J37pKE6M+Fvl98OB+iAuZ5CG7d2d8DIMmiCDEZVAbEWn2lp+ghSbc1lgkgVX91p8jMQs2DeTMJvpMeU9+A==",
- "dev": true,
- "requires": {
- "bluebird": "3.4.1",
- "buffer-equal": "1.0.0",
- "colors": "1.0.3",
- "commander": "2.9.0",
- "minimatch": "3.0.2"
- },
- "dependencies": {
- "bluebird": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.1.tgz",
- "integrity": "sha1-tzHd9I4t077awudeEhWhG8uR+gc=",
- "dev": true
- },
- "commander": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
- "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
- "dev": true,
- "requires": {
- "graceful-readlink": "1.0.1"
- }
- },
- "minimatch": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz",
- "integrity": "sha1-DzmKcwDqRB6cNIyD2Yq4ydv5xAo=",
- "dev": true,
- "requires": {
- "brace-expansion": "1.1.11"
- }
- }
- }
- },
- "docdash": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/docdash/-/docdash-0.4.0.tgz",
- "integrity": "sha1-BcOlDYMYmYFpnuDAdtOjlQ237AA=",
- "dev": true
- },
- "dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
- "dev": true,
- "requires": {
- "domelementtype": "2.0.1",
- "entities": "2.0.0"
- },
- "dependencies": {
- "domelementtype": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
- "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
- "dev": true
- },
- "entities": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
- "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
- "dev": true
- }
- }
- },
- "domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
- "dev": true,
- "requires": {
- "domelementtype": "1.3.1"
- }
- },
- "domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
- "dev": true,
- "requires": {
- "dom-serializer": "0.2.2",
- "domelementtype": "1.3.1"
- }
- },
- "dotenv": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
- "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==",
- "dev": true
- },
- "duplexer2": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
- "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
- "dev": true,
- "requires": {
- "readable-stream": "1.1.14"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dev": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.4",
- "isarray": "0.0.1",
- "string_decoder": "0.10.31"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
- }
- },
- "duplexify": {
- "version": "3.7.1",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
- "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
- "dev": true,
- "requires": {
- "end-of-stream": "1.4.4",
- "inherits": "2.0.4",
- "readable-stream": "2.3.7",
- "stream-shift": "1.0.1"
- }
- },
- "each-props": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz",
- "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==",
- "dev": true,
- "requires": {
- "is-plain-object": "2.0.4",
- "object.defaults": "1.1.0"
- }
- },
- "ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
- "dev": true,
- "requires": {
- "jsbn": "0.1.1",
- "safer-buffer": "2.1.2"
- }
- },
- "end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dev": true,
- "requires": {
- "once": "1.4.0"
- }
- },
- "entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
- "dev": true
- },
- "errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "dev": true,
- "requires": {
- "prr": "1.0.1"
- }
- },
- "error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "requires": {
- "is-arrayish": "0.2.1"
- }
- },
- "es2015": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/es2015/-/es2015-0.0.0.tgz",
- "integrity": "sha1-hO7kw1yCd2WLaOfkY42zB0GCKxQ=",
- "dev": true
- },
- "es5-ext": {
- "version": "0.10.53",
- "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
- "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
- "dev": true,
- "requires": {
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.3",
- "next-tick": "1.0.0"
- }
- },
- "es6-iterator": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
- "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
- "dev": true,
- "requires": {
- "d": "1.0.1",
- "es5-ext": "0.10.53",
- "es6-symbol": "3.1.3"
- }
- },
- "es6-symbol": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
- "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
- "dev": true,
- "requires": {
- "d": "1.0.1",
- "ext": "1.4.0"
- }
- },
- "es6-weak-map": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
- "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
- "dev": true,
- "requires": {
- "d": "1.0.1",
- "es5-ext": "0.10.53",
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.3"
- }
- },
- "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
- },
- "esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true
- },
- "eventemitter3": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz",
- "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==",
- "dev": true
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": 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",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
- }
- },
- "expand-range": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
- "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
- "dev": true,
- "optional": true,
- "requires": {
- "fill-range": "2.2.4"
- },
- "dependencies": {
- "fill-range": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
- "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
- "dev": true,
- "optional": true,
- "requires": {
- "is-number": "2.1.0",
- "isobject": "2.1.0",
- "randomatic": "3.1.1",
- "repeat-element": "1.1.3",
- "repeat-string": "1.6.1"
- }
- },
- "is-number": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
- "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
- "dev": true,
- "optional": true,
- "requires": {
- "kind-of": "3.2.2"
- }
- },
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "optional": true,
- "requires": {
- "isarray": "1.0.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
- }
- },
- "expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "dev": true,
- "requires": {
- "homedir-polyfill": "1.0.3"
- }
- },
- "ext": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
- "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
- "dev": true,
- "requires": {
- "type": "2.0.0"
- },
- "dependencies": {
- "type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
- "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==",
- "dev": true
- }
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "1.0.0",
- "is-extendable": "1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "2.0.4"
- }
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": 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",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "1.0.2"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "0.1.1"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.3"
- }
- }
- }
- },
- "extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
- "dev": true
- },
- "fancy-log": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
- "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
- "dev": true,
- "requires": {
- "ansi-gray": "0.1.1",
- "color-support": "1.1.3",
- "parse-node-version": "1.0.1",
- "time-stamp": "1.1.0"
- }
- },
- "fast-deep-equal": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
- "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
- "dev": true
- },
- "fast-glob": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.1.1.tgz",
- "integrity": "sha512-nTCREpBY8w8r+boyFYAx21iL6faSsQynliPHM4Uf56SbkyohCNxpVPEH9xrF5TXKy+IsjkPUHDKiUkzBVRXn9g==",
- "dev": true,
- "requires": {
- "@nodelib/fs.stat": "2.0.3",
- "@nodelib/fs.walk": "1.2.4",
- "glob-parent": "5.1.0",
- "merge2": "1.3.0",
- "micromatch": "4.0.2"
- },
- "dependencies": {
- "braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "requires": {
- "fill-range": "7.0.1"
- }
- },
- "fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "requires": {
- "to-regex-range": "5.0.1"
- }
- },
- "glob-parent": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
- "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
- "dev": true,
- "requires": {
- "is-glob": "4.0.1"
- }
- },
- "is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true
- },
- "micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
- "requires": {
- "braces": "3.0.2",
- "picomatch": "2.2.1"
- }
- },
- "to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "requires": {
- "is-number": "7.0.0"
- }
- }
- }
- },
- "fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "fastq": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz",
- "integrity": "sha512-jmxqQ3Z/nXoeyDmWAzF9kH1aGZSis6e/SbfPmJpUnyZ0ogr6iscHQaml4wsEepEWSdtmpy+eVXmCRIMpxaXqOA==",
- "dev": true,
- "requires": {
- "reusify": "1.0.4"
- }
- },
- "file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
- "dev": true,
- "optional": true
- },
- "filename-regex": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
- "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
- "dev": true,
- "optional": true
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": 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",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
- }
- },
- "find-replace": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz",
- "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==",
- "dev": true,
- "requires": {
- "array-back": "3.1.0"
- }
- },
- "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"
- }
- },
- "findup-sync": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
- "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
- "dev": true,
- "requires": {
- "detect-file": "1.0.0",
- "is-glob": "4.0.1",
- "micromatch": "3.1.10",
- "resolve-dir": "1.0.1"
- }
- },
- "fined": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
- "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==",
- "dev": true,
- "requires": {
- "expand-tilde": "2.0.2",
- "is-plain-object": "2.0.4",
- "object.defaults": "1.1.0",
- "object.pick": "1.3.0",
- "parse-filepath": "1.0.2"
- }
- },
- "flagged-respawn": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
- "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
- "dev": true
- },
- "flush-write-stream": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
- "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
- "dev": true,
- "requires": {
- "inherits": "2.0.4",
- "readable-stream": "2.3.7"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
- "dev": true,
- "requires": {
- "for-in": "1.0.2"
- }
- },
- "forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
- "dev": true
- },
- "form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
- "dev": true,
- "requires": {
- "asynckit": "0.4.0",
- "combined-stream": "1.0.8",
- "mime-types": "2.1.26"
- }
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
- "requires": {
- "map-cache": "0.2.2"
- }
- },
- "fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true
- },
- "fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "dev": true,
- "requires": {
- "graceful-fs": "4.2.3",
- "jsonfile": "4.0.0",
- "universalify": "0.1.2"
- }
- },
- "fs-mkdirp-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
- "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
- "dev": true,
- "requires": {
- "graceful-fs": "4.2.3",
- "through2": "2.0.5"
- }
- },
- "fs-promise": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz",
- "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=",
- "dev": true,
- "requires": {
- "any-promise": "1.3.0",
- "fs-extra": "2.1.2",
- "mz": "2.7.0",
- "thenify-all": "1.6.0"
- },
- "dependencies": {
- "fs-extra": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz",
- "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=",
- "dev": true,
- "requires": {
- "graceful-fs": "4.2.3",
- "jsonfile": "2.4.0"
- }
- },
- "jsonfile": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
- "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
- "dev": true,
- "requires": {
- "graceful-fs": "4.2.3"
- }
- }
- }
- },
- "fs-readdir-recursive": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
- "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
- "dev": true
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
- },
- "fsevents": {
- "version": "1.2.11",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.11.tgz",
- "integrity": "sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw==",
- "dev": true,
- "optional": true,
- "requires": {
- "bindings": "1.5.0",
- "nan": "2.14.0",
- "node-pre-gyp": "0.14.0"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "dev": true
- },
- "aproba": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "are-we-there-yet": {
- "version": "1.1.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "delegates": "1.0.0",
- "readable-stream": "2.3.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- "dev": true,
- "requires": {
- "balanced-match": "1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chownr": {
- "version": "1.1.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "dev": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "debug": {
- "version": "3.2.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "deep-extend": {
- "version": "0.6.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "delegates": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "detect-libc": {
- "version": "1.0.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "fs-minipass": {
- "version": "1.2.7",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minipass": "2.9.0"
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "gauge": {
- "version": "2.7.4",
- "bundled": true,
- "dev": true,
- "optional": 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.3"
- }
- },
- "glob": {
- "version": "7.1.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.4",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "has-unicode": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "iconv-lite": {
- "version": "0.4.24",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safer-buffer": "2.1.2"
- }
- },
- "ignore-walk": {
- "version": "3.0.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minimatch": "3.0.4"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "once": "1.4.0",
- "wrappy": "1.0.2"
- }
- },
- "inherits": {
- "version": "2.0.4",
- "bundled": true,
- "dev": true
- },
- "ini": {
- "version": "1.3.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "number-is-nan": "1.0.1"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "dev": true,
- "requires": {
- "brace-expansion": "1.1.11"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "dev": true
- },
- "minipass": {
- "version": "2.9.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "safe-buffer": "5.1.2",
- "yallist": "3.1.1"
- }
- },
- "minizlib": {
- "version": "1.3.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minipass": "2.9.0"
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.1.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "needle": {
- "version": "2.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "debug": "3.2.6",
- "iconv-lite": "0.4.24",
- "sax": "1.2.4"
- }
- },
- "node-pre-gyp": {
- "version": "0.14.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "detect-libc": "1.0.3",
- "mkdirp": "0.5.1",
- "needle": "2.4.0",
- "nopt": "4.0.1",
- "npm-packlist": "1.4.7",
- "npmlog": "4.1.2",
- "rc": "1.2.8",
- "rimraf": "2.7.1",
- "semver": "5.7.1",
- "tar": "4.4.13"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "abbrev": "1.1.1",
- "osenv": "0.1.5"
- }
- },
- "npm-bundled": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "npm-normalize-package-bin": "1.0.1"
- }
- },
- "npm-normalize-package-bin": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "npm-packlist": {
- "version": "1.4.7",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ignore-walk": "3.0.3",
- "npm-bundled": "1.1.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "1.1.5",
- "console-control-strings": "1.1.0",
- "gauge": "2.7.4",
- "set-blocking": "2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "requires": {
- "wrappy": "1.0.2"
- }
- },
- "os-homedir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "os-tmpdir": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "osenv": {
- "version": "0.1.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "rc": {
- "version": "1.2.8",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "deep-extend": "0.6.0",
- "ini": "1.3.5",
- "minimist": "1.2.0",
- "strip-json-comments": "2.0.1"
- },
- "dependencies": {
- "minimist": {
- "version": "1.2.0",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.4",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.1",
- "safe-buffer": "5.1.2",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
- }
- },
- "rimraf": {
- "version": "2.7.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "glob": "7.1.6"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "bundled": true,
- "dev": true
- },
- "safer-buffer": {
- "version": "2.1.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "sax": {
- "version": "1.2.4",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "semver": {
- "version": "5.7.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "set-blocking": {
- "version": "2.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "string_decoder": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safe-buffer": "5.1.2"
- }
- },
- "strip-ansi": {
- "version": "3.0.1",
- "bundled": true,
- "dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "tar": {
- "version": "4.4.13",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "chownr": "1.1.3",
- "fs-minipass": "1.2.7",
- "minipass": "2.9.0",
- "minizlib": "1.3.3",
- "mkdirp": "0.5.1",
- "safe-buffer": "5.1.2",
- "yallist": "3.1.1"
- }
- },
- "util-deprecate": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "wide-align": {
- "version": "1.1.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "string-width": "1.0.2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true
- },
- "yallist": {
- "version": "3.1.1",
- "bundled": true,
- "dev": true
- }
- }
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "generate-changelog": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/generate-changelog/-/generate-changelog-1.8.0.tgz",
- "integrity": "sha512-msgpxeB75Ziyg3wGsZuPNl7c5RxChMKmYcAX5obnhUow90dBZW3nLic6nxGtst7Bpx453oS6zAIHcX7F3QVasw==",
- "dev": true,
- "requires": {
- "bluebird": "3.7.2",
- "commander": "2.20.3",
- "github-url-from-git": "1.5.0"
- }
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
- "dev": true
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
- },
- "getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
- "dev": true,
- "requires": {
- "assert-plus": "1.0.0"
- }
- },
- "github-url-from-git": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz",
- "integrity": "sha1-+YX+3MCpqledyI16/waNVcxiUaA=",
- "dev": true
- },
- "glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
- "requires": {
- "fs.realpath": "1.0.0",
- "inflight": "1.0.6",
- "inherits": "2.0.4",
- "minimatch": "3.0.4",
- "once": "1.4.0",
- "path-is-absolute": "1.0.1"
- }
- },
- "glob-all": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.1.0.tgz",
- "integrity": "sha1-iRPd+17hrHgSZWJBsD1SF8ZLAqs=",
- "dev": true,
- "requires": {
- "glob": "7.1.6",
- "yargs": "1.2.6"
- }
- },
- "glob-base": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
- "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
- "dev": true,
- "optional": true,
- "requires": {
- "glob-parent": "2.0.0",
- "is-glob": "2.0.1"
- },
- "dependencies": {
- "glob-parent": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
- "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
- "dev": true,
- "optional": true,
- "requires": {
- "is-glob": "2.0.1"
- }
- },
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
- "dev": true
- },
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
- "dev": true,
- "requires": {
- "is-extglob": "1.0.0"
- }
- }
- }
- },
- "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"
- },
- "dependencies": {
- "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"
- }
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
}
- }
+ ]
},
- "glob-stream": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
- "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
+ "node_modules/ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true,
- "requires": {
- "extend": "3.0.2",
- "glob": "7.1.6",
- "glob-parent": "3.1.0",
- "is-negated-glob": "1.0.0",
- "ordered-read-streams": "1.0.1",
- "pumpify": "1.5.1",
- "readable-stream": "2.3.7",
- "remove-trailing-separator": "1.1.0",
- "to-absolute-glob": "2.0.2",
- "unique-stream": "2.3.1"
- }
- },
- "glob-watcher": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz",
- "integrity": "sha512-8tWsULNEPHKQ2MR4zXuzSmqbdyV5PtwwCaWSGQ1WwHsJ07ilNeN1JB8ntxhckbnpSHaf9dXFUHzIWvm1I13dsg==",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-walk": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
+ "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
"dev": true,
- "requires": {
- "anymatch": "2.0.0",
- "async-done": "1.3.2",
- "chokidar": "2.1.8",
- "is-negated-glob": "1.0.0",
- "just-debounce": "1.0.0",
- "object.defaults": "1.1.0"
+ "dependencies": {
+ "minimatch": "^3.0.4"
}
},
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true,
- "requires": {
- "global-prefix": "1.0.2",
- "is-windows": "1.0.2",
- "resolve-dir": "1.0.1"
+ "engines": {
+ "node": ">=8"
}
},
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
- "requires": {
- "expand-tilde": "2.0.2",
- "homedir-polyfill": "1.0.3",
- "ini": "1.3.5",
- "is-windows": "1.0.2",
- "which": "1.3.1"
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
- "globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true
},
- "globby": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
- "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
- "requires": {
- "array-union": "1.0.2",
- "glob": "7.1.6",
- "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
- }
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "glogg": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
- "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
+ "node_modules/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,
- "requires": {
- "sparkles": "1.0.1"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "graceful-fs": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
- "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
- "dev": true
- },
- "graceful-readlink": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
- "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
- "dev": true
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "gulp": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz",
- "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==",
+ "node_modules/is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
- "requires": {
- "glob-watcher": "5.0.3",
- "gulp-cli": "2.2.0",
- "undertaker": "1.2.1",
- "vinyl-fs": "3.0.3"
- },
"dependencies": {
- "gulp-cli": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz",
- "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==",
- "dev": true,
- "requires": {
- "ansi-colors": "1.1.0",
- "archy": "1.0.0",
- "array-sort": "1.0.0",
- "color-support": "1.1.3",
- "concat-stream": "1.6.2",
- "copy-props": "2.0.4",
- "fancy-log": "1.3.3",
- "gulplog": "1.0.0",
- "interpret": "1.2.0",
- "isobject": "3.0.1",
- "liftoff": "3.1.0",
- "matchdep": "2.0.0",
- "mute-stdout": "1.0.1",
- "pretty-hrtime": "1.0.3",
- "replace-homedir": "1.0.0",
- "semver-greatest-satisfied-range": "1.1.0",
- "v8flags": "3.1.3",
- "yargs": "7.1.0"
- }
- },
- "yargs": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz",
- "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=",
- "dev": true,
- "requires": {
- "camelcase": "3.0.0",
- "cliui": "3.2.0",
- "decamelize": "1.2.0",
- "get-caller-file": "1.0.3",
- "os-locale": "1.4.0",
- "read-pkg-up": "1.0.1",
- "require-directory": "2.1.1",
- "require-main-filename": "1.0.1",
- "set-blocking": "2.0.0",
- "string-width": "1.0.2",
- "which-module": "1.0.0",
- "y18n": "3.2.1",
- "yargs-parser": "5.0.0"
- }
- }
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "gulp-concat": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
- "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
- "requires": {
- "concat-with-sourcemaps": "1.1.0",
- "through2": "2.0.5",
- "vinyl": "2.2.0"
+ "engines": {
+ "node": ">=0.12.0"
}
},
- "gulp-copy": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/gulp-copy/-/gulp-copy-4.0.1.tgz",
- "integrity": "sha512-UbdAwmEiVNNv55KAiUYWOP6Za7h8JPHNNyekNx8Gyc5XRlpUzTrlEclps939nOeiDPsd6jUtT2LmfavJirbZQg==",
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
"dev": true,
- "requires": {
- "gulp": "4.0.2",
- "plugin-error": "0.1.2",
- "through2": "2.0.5"
+ "engines": {
+ "node": ">=6"
}
},
- "gulp-header": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-2.0.9.tgz",
- "integrity": "sha512-LMGiBx+qH8giwrOuuZXSGvswcIUh0OiioNkUpLhNyvaC6/Ga8X6cfAeme2L5PqsbXMhL8o8b/OmVqIQdxprhcQ==",
- "requires": {
- "concat-with-sourcemaps": "1.1.0",
- "lodash.template": "4.5.0",
- "map-stream": "0.0.7",
- "through2": "2.0.5"
+ "node_modules/is-path-inside": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
+ "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
}
},
- "gulp-rm-lines": {
- "version": "0.0.9",
- "resolved": "https://registry.npmjs.org/gulp-rm-lines/-/gulp-rm-lines-0.0.9.tgz",
- "integrity": "sha1-sKeCv5W/+kDgSI2rGcTVTqbC/gc=",
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "node_modules/isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "node_modules/jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "node_modules/json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/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
+ },
+ "node_modules/jsonc-parser": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
+ "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
"dev": true,
- "requires": {
- "gulp-util": "3.0.8",
- "through2": "2.0.5"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "gulp-util": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "node_modules/jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
"dev": true,
- "requires": {
- "array-differ": "1.0.0",
- "array-uniq": "1.0.3",
- "beeper": "1.1.1",
- "chalk": "1.1.3",
- "dateformat": "2.2.0",
- "fancy-log": "1.3.3",
- "gulplog": "1.0.0",
- "has-gulplog": "0.1.0",
- "lodash._reescape": "3.0.0",
- "lodash._reevaluate": "3.0.0",
- "lodash._reinterpolate": "3.0.0",
- "lodash.template": "3.6.2",
- "minimist": "1.2.0",
- "multipipe": "0.1.2",
- "object-assign": "3.0.0",
- "replace-ext": "0.0.1",
- "through2": "2.0.5",
- "vinyl": "0.5.3"
- },
+ "engines": [
+ "node >=0.6.0"
+ ],
"dependencies": {
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "dev": true
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
- "dev": true
- },
- "lodash.template": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
- "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
- "dev": true,
- "requires": {
- "lodash._basecopy": "3.0.1",
- "lodash._basetostring": "3.0.1",
- "lodash._basevalues": "3.0.0",
- "lodash._isiterateecall": "3.0.9",
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0",
- "lodash.keys": "3.1.2",
- "lodash.restparam": "3.6.1",
- "lodash.templatesettings": "3.1.1"
- }
- },
- "lodash.templatesettings": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
- "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
- "dev": true,
- "requires": {
- "lodash._reinterpolate": "3.0.0",
- "lodash.escape": "3.2.0"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- },
- "object-assign": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
- "dev": true
- },
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
- "dev": true
- },
- "vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
- "dev": true,
- "requires": {
- "clone": "1.0.4",
- "clone-stats": "0.0.1",
- "replace-ext": "0.0.1"
- }
- }
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
}
},
- "gulpclass": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/gulpclass/-/gulpclass-0.2.0.tgz",
- "integrity": "sha512-S2p0SgnVLjBbIEw5tHbBV6Wm6abD+leA5xZG6ukf9M+j1I/8zIeKPby9GLWnI90671YRk+lXbvEUROKaZXo8NA==",
+ "node_modules/latinize": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/latinize/-/latinize-0.4.1.tgz",
+ "integrity": "sha512-A4miz97dNF+EbNgQdayPAEtud5eRpCGPwJy7JQFD1hBQcOzOgBS4m721zoREuPqpz1yKm8hYT2ANlh7pirapsA==",
+ "dev": true
+ },
+ "node_modules/lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
"dev": true,
- "requires": {
- "@types/gulp": "4.0.6",
- "@types/merge2": "1.3.0",
- "@types/node": "13.5.0",
- "gulp": "4.0.2",
- "merge2": "1.3.0"
+ "dependencies": {
+ "readable-stream": "^2.0.5"
+ },
+ "engines": {
+ "node": ">= 0.6.3"
}
},
- "gulplog": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
- "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "node_modules/lazystream/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
- "requires": {
- "glogg": "1.0.2"
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "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.1"
}
},
- "har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "node_modules/lazystream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
- "har-validator": {
- "version": "5.1.3",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
- "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "node_modules/lazystream/node_modules/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": {
- "ajv": "6.11.0",
- "har-schema": "2.0.0"
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
}
},
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"dev": true,
- "requires": {
- "ansi-regex": "2.1.1"
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "has-gulplog": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
- "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
- "dev": true,
- "requires": {
- "sparkles": "1.0.1"
- }
+ "node_modules/lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
},
- "has-symbols": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
- "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "node_modules/lodash.difference": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+ "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
"dev": true
},
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "node_modules/lodash.flatten": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+ "dev": true
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "node_modules/lodash.union": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
+ "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
+ "dev": true
+ },
+ "node_modules/long": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
+ "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=",
"dev": true,
- "requires": {
- "get-value": "2.0.6",
- "has-values": "1.0.0",
- "isobject": "3.0.1"
+ "engines": {
+ "node": ">=0.6"
}
},
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
- "requires": {
- "is-number": "3.0.0",
- "kind-of": "4.0.0"
- },
"dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.6"
- }
- }
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "home-or-tmp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
- "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+ "node_modules/luxon": {
+ "version": "1.26.0",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.26.0.tgz",
+ "integrity": "sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A==",
"dev": true,
- "requires": {
- "os-homedir": "1.0.2",
- "os-tmpdir": "1.0.2"
+ "engines": {
+ "node": "*"
}
},
- "homedir-polyfill": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
- "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
"dev": true,
- "requires": {
- "parse-passwd": "1.0.0"
+ "engines": {
+ "node": ">= 8"
}
},
- "hosted-git-info": {
- "version": "2.8.5",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.5.tgz",
- "integrity": "sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg==",
- "dev": true
- },
- "htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "node_modules/micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"dev": true,
- "requires": {
- "domelementtype": "1.3.1",
- "domhandler": "2.4.2",
- "domutils": "1.7.0",
- "entities": "1.1.2",
- "inherits": "2.0.4",
- "readable-stream": "3.5.0"
- },
"dependencies": {
- "readable-stream": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz",
- "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==",
- "dev": true,
- "requires": {
- "inherits": "2.0.4",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
- }
- }
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "node_modules/mime-db": {
+ "version": "1.46.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
+ "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==",
"dev": true,
- "requires": {
- "assert-plus": "1.0.0",
- "jsprim": "1.4.1",
- "sshpk": "1.16.1"
+ "engines": {
+ "node": ">= 0.6"
}
},
- "ieee754": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
- "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
- "dev": true
- },
- "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"
+ "node_modules/mime-types": {
+ "version": "2.1.29",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
+ "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.46.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
}
},
- "inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
- "dev": true
- },
- "ink-docstrap": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/ink-docstrap/-/ink-docstrap-1.3.0.tgz",
- "integrity": "sha1-6QBeW7kCXMmpvo5ErYf4rViIyB0=",
+ "node_modules/minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
- "requires": {
- "moment": "2.24.0",
- "sanitize-html": "1.21.1"
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "interpret": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
- "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
- "dev": true
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "node_modules/moment": {
+ "version": "2.29.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
"dev": true,
- "requires": {
- "loose-envify": "1.4.0"
+ "engines": {
+ "node": "*"
}
},
- "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-absolute": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
- "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
- "requires": {
- "is-relative": "1.0.0",
- "is-windows": "1.0.2"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "node_modules/npm-bundled": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
+ "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
"dev": true,
- "requires": {
- "kind-of": "3.2.2"
- },
"dependencies": {
- "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"
- }
- }
+ "npm-normalize-package-bin": "^1.0.1"
}
},
- "is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "node_modules/npm-normalize-package-bin": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+ "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
"dev": true
},
- "is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "node_modules/npm-packlist": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.4.tgz",
+ "integrity": "sha512-Qzg2pvXC9U4I4fLnUrBmcIT4x0woLtUgxUi9eC+Zrcv1Xx5eamytGAfbDWQ67j7xOcQ2VW1I3su9smVTIdu7Hw==",
"dev": true,
- "requires": {
- "binary-extensions": "1.13.1"
+ "dependencies": {
+ "glob": "^7.1.6",
+ "ignore-walk": "^3.0.3",
+ "npm-bundled": "^1.1.1",
+ "npm-normalize-package-bin": "^1.0.1"
+ },
+ "bin": {
+ "npm-packlist": "bin/index.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "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-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "node_modules/oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true,
- "requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "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"
- }
- }
+ "engines": {
+ "node": "*"
}
},
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": 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",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
+ "wrappy": "1"
}
},
- "is-dotfile": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
- "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
+ "node_modules/p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
- "optional": true
+ "dependencies": {
+ "p-try": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "is-equal-shallow": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
- "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
- "optional": true,
- "requires": {
- "is-primitive": "2.0.0"
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "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=",
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
- "requires": {
- "number-is-nan": "1.0.1"
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "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=",
+ "node_modules/p-locate/node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true,
- "requires": {
- "number-is-nan": "1.0.1"
+ "engines": {
+ "node": ">=6"
}
},
- "is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "node_modules/p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
"dev": true,
- "requires": {
- "is-extglob": "2.1.1"
+ "dependencies": {
+ "aggregate-error": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "is-negated-glob": {
+ "node_modules/p-reflect": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
- "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
- "dev": true
+ "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-1.0.0.tgz",
+ "integrity": "sha1-9Poe4btUbY6z7AMhFI3+CnkTe7g=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
},
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "node_modules/p-settle": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-2.1.0.tgz",
+ "integrity": "sha512-NHFIUYc+fQTFRrzzAugq0l1drwi57PB522smetcY8C/EoTYs6cU/fC6TJj0N3rq5NhhJJbhf0VGWziL3jZDnjA==",
"dev": true,
- "requires": {
- "kind-of": "3.2.2"
- },
"dependencies": {
- "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"
- }
- }
+ "p-limit": "^1.2.0",
+ "p-reflect": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
- "is-path-cwd": {
+ "node_modules/p-try": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
- "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
- "dev": true
- },
- "is-path-in-cwd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
- "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
"dev": true,
- "requires": {
- "is-path-inside": "1.0.1"
+ "engines": {
+ "node": ">=4"
}
},
- "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=",
+ "node_modules/parse-ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
+ "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==",
"dev": true,
- "requires": {
- "path-is-inside": "1.0.2"
+ "engines": {
+ "node": ">=6"
}
},
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "node_modules/path": {
+ "version": "0.12.7",
+ "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
+ "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
"dev": true,
- "requires": {
- "isobject": "3.0.1"
+ "dependencies": {
+ "process": "^0.11.1",
+ "util": "^0.10.3"
}
},
- "is-posix-bracket": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
- "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
- "optional": true
+ "engines": {
+ "node": ">=8"
+ }
},
- "is-primitive": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
- "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "node_modules/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,
- "optional": true
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true,
- "requires": {
- "is-unc-path": "1.0.0"
+ "engines": {
+ "node": ">=8"
}
},
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
},
- "is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
+ "node_modules/picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
"dev": true,
- "requires": {
- "unc-path-regex": "0.1.2"
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "is-valid-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
- "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ }
},
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
- "isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "node_modules/psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
"dev": true
},
- "js-tokens": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
- "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
- "dev": true
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
},
- "js2xmlparser": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz",
- "integrity": "sha1-P7YOqgicVED5MZ9RdgzNB+JJlzM=",
+ "node_modules/qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true,
- "requires": {
- "xmlcreate": "1.0.2"
+ "engines": {
+ "node": ">=0.6"
}
},
- "jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
- "dev": true
+ "node_modules/queue-microtask": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
+ "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
},
- "jsdoc": {
- "version": "3.5.5",
- "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.5.5.tgz",
- "integrity": "sha512-6PxB65TAU4WO0Wzyr/4/YhlGovXl0EVYfpKbpSroSj0qBxT4/xod/l40Opkm38dRHRdQgdeY836M0uVnJQG7kg==",
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
- "requires": {
- "babylon": "7.0.0-beta.19",
- "bluebird": "3.5.5",
- "catharsis": "0.8.11",
- "escape-string-regexp": "1.0.5",
- "js2xmlparser": "3.0.0",
- "klaw": "2.0.0",
- "marked": "0.3.19",
- "mkdirp": "0.5.1",
- "requizzle": "0.2.3",
- "strip-json-comments": "2.0.1",
- "taffydb": "2.6.2",
- "underscore": "1.8.3"
- },
"dependencies": {
- "bluebird": {
- "version": "3.5.5",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz",
- "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==",
- "dev": true
- }
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true
- },
- "json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
- "dev": true
- },
- "json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "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
- },
- "json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true
+ "node_modules/readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
},
- "jsonc-parser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
- "integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==",
+ "node_modules/regexp-to-ast": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
+ "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==",
"dev": true
},
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "node_modules/request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
"dev": true,
- "requires": {
- "graceful-fs": "4.2.3"
+ "dependencies": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "node_modules/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,
- "requires": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.2.3",
- "verror": "1.10.0"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "just-debounce": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz",
- "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=",
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"dev": true
},
- "kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
},
- "klaw": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-2.0.0.tgz",
- "integrity": "sha1-WcEo4Nxc5BAgEVEZTuucv4WGUPY=",
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
- "requires": {
- "graceful-fs": "4.2.3"
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "last-run": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz",
- "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=",
+ "node_modules/roku-deploy": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.3.0.tgz",
+ "integrity": "sha512-85XAgFH7AZylxIiECHbfydNEYeUUEEs/iq/zl3G3gqgM+x3fT/JnnkqrwgdFdLBj+aJVR3ZlyhuUWjDh1WxMbw==",
"dev": true,
- "requires": {
- "default-resolution": "2.0.0",
- "es6-weak-map": "2.0.3"
+ "dependencies": {
+ "archiver": "^3.0.0",
+ "dateformat": "^3.0.3",
+ "fs-extra": "^7.0.1",
+ "glob": "^7.1.6",
+ "jsonc-parser": "^2.3.0",
+ "minimatch": "^3.0.4",
+ "path": "^0.12.7",
+ "request": "^2.88.0",
+ "xml2js": "^0.4.23"
+ },
+ "bin": {
+ "roku-deploy": "dist/cli.js"
}
},
- "lazystream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
- "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "node_modules/ropm": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.5.0.tgz",
+ "integrity": "sha512-hoVElmmOtrlFKl66uBiIvjc82TeF0H1WiuGx6iJpel+zCh7MkQSZq8l9XYwTHM9FHVGaawkZJlOdGvBHaUphGQ==",
"dev": true,
- "requires": {
- "readable-stream": "2.3.7"
+ "dependencies": {
+ "@types/semver": "^7.3.1",
+ "@xml-tools/ast": "^5.0.0",
+ "@xml-tools/parser": "^1.0.7",
+ "del": "^5.1.0",
+ "fs-extra": "^9.0.1",
+ "glob-all": "^3.2.1",
+ "latinize": "^0.4.1",
+ "npm-packlist": "^2.1.2",
+ "roku-deploy": "^3.2.2",
+ "semver": "^7.3.2",
+ "yargs": "^15.4.1"
+ },
+ "bin": {
+ "ropm": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=8.1.10"
}
},
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "node_modules/ropm/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
- "requires": {
- "invert-kv": "1.0.0"
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "lead": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
- "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
+ "node_modules/ropm/node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
- "requires": {
- "flush-write-stream": "1.1.1"
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "liftoff": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz",
- "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==",
+ "node_modules/ropm/node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true,
- "requires": {
- "extend": "3.0.2",
- "findup-sync": "3.0.0",
- "fined": "1.2.0",
- "flagged-respawn": "1.0.1",
- "is-plain-object": "2.0.4",
- "object.map": "1.0.1",
- "rechoir": "0.6.2",
- "resolve": "1.15.0"
+ "engines": {
+ "node": ">= 10.0.0"
}
},
- "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=",
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
- "requires": {
- "graceful-fs": "4.2.3",
- "parse-json": "2.2.0",
- "pify": "2.3.0",
- "pinkie-promise": "2.0.1",
- "strip-bom": "2.0.0"
- },
- "dependencies": {
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
}
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
}
},
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
- "dev": true
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
},
- "lodash._basecopy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true
},
- "lodash._basetostring": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
- "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true
},
- "lodash._basevalues": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
- "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
- "dev": true
+ "node_modules/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
},
- "lodash._getnative": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
- "dev": true
+ "node_modules/serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "lodash._isiterateecall": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "node_modules/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
},
- "lodash._reescape": {
+ "node_modules/slash": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
- "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
- "dev": true
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
},
- "lodash._reevaluate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
- "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
- "dev": true
+ "node_modules/source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
},
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ "node_modules/sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "dependencies": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ },
+ "bin": {
+ "sshpk-conv": "bin/sshpk-conv",
+ "sshpk-sign": "bin/sshpk-sign",
+ "sshpk-verify": "bin/sshpk-verify"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "lodash._root": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
- "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
- "dev": true
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
},
- "lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
- "dev": true
+ "node_modules/string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
- "dev": true
+ "node_modules/strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
},
- "lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
- "dev": true
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "lodash.difference": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
- "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
- "dev": true
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "lodash.escape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
- "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
- "requires": {
- "lodash._root": "3.0.1"
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
}
},
- "lodash.escaperegexp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
- "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=",
- "dev": true
+ "node_modules/tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "dependencies": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
},
- "lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
- "dev": true
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
},
- "lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "node_modules/tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
- "lodash.isarray": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
- "dev": true
+ "node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
- "dev": true
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
},
- "lodash.isstring": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
- "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
- "dev": true
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
},
- "lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "node_modules/util": {
+ "version": "0.10.4",
+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
+ "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
"dev": true,
- "requires": {
- "lodash._getnative": "3.9.1",
- "lodash.isarguments": "3.1.0",
- "lodash.isarray": "3.0.4"
+ "dependencies": {
+ "inherits": "2.0.3"
}
},
- "lodash.mergewith": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
- "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true
},
- "lodash.padend": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz",
- "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=",
+ "node_modules/util/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
- "lodash.restparam": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
- "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
- "dev": true
+ "node_modules/uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true,
+ "bin": {
+ "uuid": "bin/uuid"
+ }
},
- "lodash.template": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
- "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
- "requires": {
- "lodash._reinterpolate": "3.0.0",
- "lodash.templatesettings": "4.2.0"
+ "node_modules/verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
}
},
- "lodash.templatesettings": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
- "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
- "requires": {
- "lodash._reinterpolate": "3.0.0"
+ "node_modules/vscode-jsonrpc": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz",
+ "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0 || >=10.0.0"
}
},
- "lodash.toarray": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
- "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=",
+ "node_modules/vscode-languageserver": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz",
+ "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==",
+ "dev": true,
+ "dependencies": {
+ "vscode-languageserver-protocol": "^3.15.3"
+ },
+ "bin": {
+ "installServerIntoExtension": "bin/installServerIntoExtension"
+ }
+ },
+ "node_modules/vscode-languageserver-protocol": {
+ "version": "3.15.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz",
+ "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==",
+ "dev": true,
+ "dependencies": {
+ "vscode-jsonrpc": "^5.0.1",
+ "vscode-languageserver-types": "3.15.1"
+ }
+ },
+ "node_modules/vscode-languageserver-textdocument": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.1.tgz",
+ "integrity": "sha512-UIcJDjX7IFkck7cSkNNyzIz5FyvpQfY7sdzVy+wkKN/BLaD4DQ0ppXQrKePomCxTS7RrolK1I0pey0bG9eh8dA==",
"dev": true
},
- "lodash.union": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
- "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
+ "node_modules/vscode-languageserver-types": {
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
+ "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
"dev": true
},
- "long": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
- "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=",
+ "node_modules/vscode-uri": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
+ "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
"dev": true
},
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "node_modules/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
+ },
+ "node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
- "requires": {
- "js-tokens": "3.0.2"
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "luxon": {
- "version": "1.21.3",
- "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.21.3.tgz",
- "integrity": "sha512-lLRwNcNnkZLuv13A1FUuZRZmTWF7ro2ricYvb0L9cvBYHPvZhQdKwrYnZzi103D2XKmlVmxWpdn2wfIiOt2YEw==",
- "dev": true
- },
- "maestro-cli-roku": {
- "version": "0.15.3",
- "resolved": "https://registry.npmjs.org/maestro-cli-roku/-/maestro-cli-roku-0.15.3.tgz",
- "integrity": "sha512-+IWN7jQ69VmgKyc9KRJyg3tvq7CBUxyloSNBQvCW2hZn8dgSysbg82u0m7P49fh2oWZ61MBbONemOr5Ep1j3rw==",
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
- "requires": {
- "adm-zip": "0.4.14",
- "brightscript-language": "0.2.15",
- "commander": "5.1.0",
- "compare-directories": "0.1.0",
- "debug": "4.1.1",
- "dir-compare": "1.8.0",
- "fs-extra": "5.0.0",
- "glob-all": "3.1.0",
- "lodash": "4.17.15",
- "make-dir": "3.1.0",
- "os": "0.1.1",
- "replace-ext": "1.0.0",
- "request-promise": "4.2.5",
- "sax": "1.2.4",
- "splice-string": "2.0.0"
+ "dependencies": {
+ "color-convert": "^2.0.1"
},
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
"dependencies": {
- "commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
- "dev": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- }
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
}
},
- "make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/xml2js": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+ "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"dev": true,
- "requires": {
- "semver": "6.3.0"
- },
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
- "dev": true
- }
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
}
},
- "make-error": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
- "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g=="
- },
- "make-iterator": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
- "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"dev": true,
- "requires": {
- "kind-of": "6.0.3"
+ "engines": {
+ "node": ">=4.0"
}
},
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "node_modules/y18n": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
"dev": true
},
- "map-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
- "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg="
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
},
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "node_modules/yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
- "requires": {
- "object-visit": "1.0.1"
+ "dependencies": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "engines": {
+ "node": ">=8"
}
},
- "marked": {
- "version": "0.3.19",
- "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz",
- "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==",
- "dev": true
- },
- "matchdep": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz",
- "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=",
+ "node_modules/yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
- "requires": {
- "findup-sync": "2.0.0",
- "micromatch": "3.1.10",
- "resolve": "1.15.0",
- "stack-trace": "0.0.10"
- },
"dependencies": {
- "findup-sync": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
- "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
- "dev": true,
- "requires": {
- "detect-file": "1.0.0",
- "is-glob": "3.1.0",
- "micromatch": "3.1.10",
- "resolve-dir": "1.0.1"
- }
- },
- "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"
- }
- }
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=6"
}
},
- "math-random": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz",
- "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==",
+ "node_modules/zip-stream": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz",
+ "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==",
"dev": true,
- "optional": true
- },
- "memory-fs": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
- "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+ "dependencies": {
+ "archiver-utils": "^2.1.0",
+ "compress-commons": "^2.1.1",
+ "readable-stream": "^3.4.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ }
+ },
+ "dependencies": {
+ "@nodelib/fs.scandir": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+ "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
"dev": true,
"requires": {
- "errno": "0.1.7",
- "readable-stream": "2.3.7"
+ "@nodelib/fs.stat": "2.0.4",
+ "run-parallel": "^1.1.9"
}
},
- "merge2": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
- "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
+ "@nodelib/fs.stat": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+ "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
"dev": true
},
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "@nodelib/fs.walk": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+ "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
"dev": true,
"requires": {
- "arr-diff": "4.0.0",
- "array-unique": "0.3.2",
- "braces": "2.3.2",
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "extglob": "2.0.4",
- "fragment-cache": "0.2.1",
- "kind-of": "6.0.3",
- "nanomatch": "1.2.13",
- "object.pick": "1.3.0",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
+ "@nodelib/fs.scandir": "2.1.4",
+ "fastq": "^1.6.0"
}
},
- "mime-db": {
- "version": "1.43.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
- "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
- "dev": true
- },
- "mime-types": {
- "version": "2.1.26",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
- "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
+ "@types/glob": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+ "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
"dev": true,
"requires": {
- "mime-db": "1.43.0"
+ "@types/minimatch": "*",
+ "@types/node": "*"
}
},
- "minami": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz",
- "integrity": "sha1-mbbc37LwpU2hycj3qjoyd4eq+fg=",
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
"dev": true
},
- "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"
- }
+ "@types/node": {
+ "version": "14.14.31",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.31.tgz",
+ "integrity": "sha512-vFHy/ezP5qI0rFgJ7aQnjDXwAMrG0KqqIH7tQG5PPv3BWBayOPIQNBjVc/P6hhdZfMx51REc6tfDNXHUio893g==",
+ "dev": true
},
- "minimist": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz",
- "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=",
+ "@types/semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-+nVsLKlcUCeMzD2ufHEYuJ9a2ovstb6Dp52A5VsoKxDXgvE051XgHI/33I1EymwkRGQkwnA0LkhnUzituGs4EQ==",
"dev": true
},
- "mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "@xml-tools/ast": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/@xml-tools/ast/-/ast-5.0.4.tgz",
+ "integrity": "sha512-k6BFvF2uQMXJTTZO100v1CgezOawoZOsL+L4xTDQBoRVU3LOkAYglL6xfKGCPHbTN1+EPVw9qE4+kXr4HVvvyg==",
"dev": true,
"requires": {
- "for-in": "1.0.2",
- "is-extendable": "1.0.1"
+ "@xml-tools/common": "^0.1.5",
+ "@xml-tools/parser": "^1.0.10",
+ "lodash": "4.17.20"
},
"dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "2.0.4"
- }
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
+ "dev": true
}
}
},
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "@xml-tools/common": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/@xml-tools/common/-/common-0.1.5.tgz",
+ "integrity": "sha512-uEv4A1fZGd9c89AcD+OloGccmY1T6OtYNCf7dCiWwTdCpn2JoLj2TozXLX4lBAuY3oAuyigvrxupcUQWFTvg+Q==",
"dev": true,
"requires": {
- "minimist": "0.0.8"
+ "lodash": "4.17.20"
},
"dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "lodash": {
+ "version": "4.17.20",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
+ "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
"dev": true
}
}
},
- "moment": {
- "version": "2.24.0",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
- "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
- "dev": true
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "multipipe": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
- "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "@xml-tools/parser": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.10.tgz",
+ "integrity": "sha512-9oRb68wEKT+MRB7e2GwTiKicRKVXKzquBDGgH6YcGafvnSYXorWi2oaTVtbv2109RlGiQSnoXaQFUXCnHwFS7Q==",
"dev": true,
"requires": {
- "duplexer2": "0.0.2"
+ "chevrotain": "7.1.1"
}
},
- "mute-stdout": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz",
- "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==",
- "dev": true
- },
- "mz": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
- "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "aggregate-error": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
+ "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
"dev": true,
"requires": {
- "any-promise": "1.3.0",
- "object-assign": "4.1.1",
- "thenify-all": "1.6.0"
+ "clean-stack": "^2.0.0",
+ "indent-string": "^4.0.0"
}
},
- "nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
- "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
- "dev": true,
- "optional": true
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": 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-windows": "1.0.2",
- "kind-of": "6.0.3",
- "object.pick": "1.3.0",
- "regex-not": "1.0.2",
- "snapdragon": "0.8.2",
- "to-regex": "3.0.2"
- }
- },
- "next-tick": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
- "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=",
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
"dev": true
},
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "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": {
- "hosted-git-info": "2.8.5",
- "resolve": "1.15.0",
- "semver": "5.7.1",
- "validate-npm-package-license": "3.0.4"
+ "color-convert": "^1.9.0"
}
},
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
"dev": true,
"requires": {
- "remove-trailing-separator": "1.1.0"
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
}
},
- "now-and-later": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz",
- "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==",
+ "archiver": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz",
+ "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==",
"dev": true,
"requires": {
- "once": "1.4.0"
+ "archiver-utils": "^2.1.0",
+ "async": "^2.6.3",
+ "buffer-crc32": "^0.2.1",
+ "glob": "^7.1.4",
+ "readable-stream": "^3.4.0",
+ "tar-stream": "^2.1.0",
+ "zip-stream": "^2.1.2"
}
},
- "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
- },
- "oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "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
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "archiver-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
+ "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
"dev": true,
"requires": {
- "copy-descriptor": "0.1.1",
- "define-property": "0.2.5",
- "kind-of": "3.2.2"
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.2.0",
+ "lazystream": "^1.0.0",
+ "lodash.defaults": "^4.2.0",
+ "lodash.difference": "^4.5.0",
+ "lodash.flatten": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.union": "^4.6.0",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^2.0.0"
},
"dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
"dev": true,
"requires": {
- "is-descriptor": "0.1.6"
+ "core-util-is": "~1.0.0",
+ "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.1"
}
},
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "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": {
- "is-buffer": "1.1.6"
+ "safe-buffer": "~5.1.0"
}
}
}
},
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "array-flat-polyfill": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz",
+ "integrity": "sha512-hfJmKupmQN0lwi0xG6FQ5U8Rd97RnIERplymOv/qpq8AoNKPPAnxJadjFA23FNWm88wykh9HmpLJUUwUtNU/iw==",
"dev": true
},
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
- "requires": {
- "isobject": "3.0.1"
- }
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
},
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
"dev": true,
"requires": {
- "define-properties": "1.1.3",
- "function-bind": "1.1.1",
- "has-symbols": "1.0.1",
- "object-keys": "1.1.1"
+ "safer-buffer": "~2.1.0"
}
},
- "object.defaults": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "dev": true
+ },
+ "async": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
+ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
"dev": true,
"requires": {
- "array-each": "1.0.1",
- "array-slice": "1.1.0",
- "for-own": "1.0.0",
- "isobject": "3.0.1"
+ "lodash": "^4.17.14"
}
},
- "object.map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+ "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
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
"dev": true,
"requires": {
- "for-own": "1.0.0",
- "make-iterator": "1.0.1"
+ "tweetnacl": "^0.14.3"
}
},
- "object.omit": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
- "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
- "optional": true,
"requires": {
- "for-own": "0.1.5",
- "is-extendable": "0.1.1"
- },
- "dependencies": {
- "for-own": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
- "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
- "dev": true,
- "optional": true,
- "requires": {
- "for-in": "1.0.2"
- }
- }
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
}
},
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "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": {
- "isobject": "3.0.1"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "object.reduce": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz",
- "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=",
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
"dev": true,
"requires": {
- "for-own": "1.0.0",
- "make-iterator": "1.0.1"
+ "fill-range": "^7.0.1"
}
},
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "requires": {
- "wrappy": "1.0.2"
+ "brighterscript": {
+ "version": "0.32.2",
+ "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.32.2.tgz",
+ "integrity": "sha512-tZ558Q6JtqNh/1nr1Cbi1iy8rYRIDwsUgtYkP9s9fX8zNNa+hwPjWC0aENX/fLRfb2beMphLsMNBtDywUqTHPg==",
+ "dev": true,
+ "requires": {
+ "@xml-tools/parser": "^1.0.7",
+ "array-flat-polyfill": "^1.0.1",
+ "chalk": "^2.4.2",
+ "chokidar": "^3.0.2",
+ "clear": "^0.1.0",
+ "cross-platform-clear-console": "^2.3.0",
+ "debounce-promise": "^3.1.0",
+ "eventemitter3": "^4.0.0",
+ "file-url": "^3.0.0",
+ "fs-extra": "^7.0.1",
+ "glob": "^7.1.6",
+ "jsonc-parser": "^2.3.0",
+ "long": "^3.2.0",
+ "luxon": "^1.8.3",
+ "minimatch": "^3.0.4",
+ "moment": "^2.23.0",
+ "p-settle": "^2.1.0",
+ "parse-ms": "^2.1.0",
+ "roku-deploy": "^3.2.4",
+ "serialize-error": "^7.0.1",
+ "source-map": "^0.7.3",
+ "vscode-languageserver": "^6.1.1",
+ "vscode-languageserver-protocol": "~3.15.3",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-uri": "^2.1.1",
+ "xml2js": "^0.4.19",
+ "yargs": "^15.4.0"
}
},
- "ordered-read-streams": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
- "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"requires": {
- "readable-stream": "2.3.7"
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
}
},
- "os": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz",
- "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=",
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
"dev": true
},
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
"dev": true
},
- "os-locale": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
- "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
- "dev": true,
- "requires": {
- "lcid": "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=",
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
"dev": true
},
- "output-file-sync": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz",
- "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=",
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
- "graceful-fs": "4.2.3",
- "mkdirp": "0.5.1",
- "object-assign": "4.1.1"
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
}
},
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "chevrotain": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz",
+ "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==",
+ "dev": true,
+ "requires": {
+ "regexp-to-ast": "0.5.0"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
+ "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
"dev": true,
"requires": {
- "p-try": "1.0.0"
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.1",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.5.0"
}
},
- "p-map": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz",
- "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==",
+ "clean-stack": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
+ "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
"dev": true
},
- "p-reflect": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-1.0.0.tgz",
- "integrity": "sha1-9Poe4btUbY6z7AMhFI3+CnkTe7g=",
+ "clear": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz",
+ "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==",
"dev": true
},
- "p-settle": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-2.1.0.tgz",
- "integrity": "sha512-NHFIUYc+fQTFRrzzAugq0l1drwi57PB522smetcY8C/EoTYs6cU/fC6TJj0N3rq5NhhJJbhf0VGWziL3jZDnjA==",
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"dev": true,
"requires": {
- "p-limit": "1.3.0",
- "p-reflect": "1.0.0"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.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=",
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "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
},
- "parse-filepath": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
"requires": {
- "is-absolute": "1.0.0",
- "map-cache": "0.2.2",
- "path-root": "0.1.1"
+ "delayed-stream": "~1.0.0"
}
},
- "parse-glob": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
- "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "compress-commons": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz",
+ "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==",
"dev": true,
- "optional": true,
"requires": {
- "glob-base": "0.3.0",
- "is-dotfile": "1.0.3",
- "is-extglob": "1.0.0",
- "is-glob": "2.0.1"
+ "buffer-crc32": "^0.2.13",
+ "crc32-stream": "^3.0.1",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^2.3.6"
},
"dependencies": {
- "is-extglob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
- "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "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.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
- "is-glob": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
- "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "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,
- "optional": true,
"requires": {
- "is-extglob": "1.0.0"
+ "safe-buffer": "~5.1.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.2"
- }
- },
- "parse-node-version": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
- "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
- "dev": true
- },
- "parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "dev": true
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "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
},
- "path": {
- "version": "0.12.7",
- "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
- "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
- "dev": true,
- "requires": {
- "process": "0.11.10",
- "util": "0.10.4"
- }
- },
- "path-dirname": {
+ "core-util-is": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true
},
- "path-exists": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
- "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "crc": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
+ "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
"dev": true,
"requires": {
- "pinkie-promise": "2.0.1"
+ "buffer": "^5.1.0"
}
},
- "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=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "path-root": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
+ "crc32-stream": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
+ "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==",
"dev": true,
"requires": {
- "path-root-regex": "0.1.2"
+ "crc": "^3.4.4",
+ "readable-stream": "^3.4.0"
}
},
- "path-root-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
+ "cross-platform-clear-console": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cross-platform-clear-console/-/cross-platform-clear-console-2.3.0.tgz",
+ "integrity": "sha512-To+sJ6plHHC6k5DfdvSVn6F1GRGJh/R6p76bCpLbyMyHEmbqFyuMAeGwDcz/nGDWH3HUcjFTTX9iUSCzCg9Eiw==",
"dev": true
},
- "path-type": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
- "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
"dev": true,
"requires": {
- "graceful-fs": "4.2.3",
- "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
- }
+ "assert-plus": "^1.0.0"
}
},
- "performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dateformat": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
+ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
"dev": true
},
- "picomatch": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
- "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
+ "debounce-promise": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
+ "integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg==",
"dev": true
},
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
"dev": true
},
- "pinkie": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
- "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "del": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz",
+ "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==",
+ "dev": true,
+ "requires": {
+ "globby": "^10.0.1",
+ "graceful-fs": "^4.2.2",
+ "is-glob": "^4.0.1",
+ "is-path-cwd": "^2.2.0",
+ "is-path-inside": "^3.0.1",
+ "p-map": "^3.0.0",
+ "rimraf": "^3.0.0",
+ "slash": "^3.0.0"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"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=",
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
"dev": true,
"requires": {
- "pinkie": "2.0.4"
+ "path-type": "^4.0.0"
}
},
- "plugin-error": {
+ "ecc-jsbn": {
"version": "0.1.2",
- "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
- "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
"dev": true,
"requires": {
- "ansi-cyan": "0.1.1",
- "ansi-red": "0.1.1",
- "arr-diff": "1.1.0",
- "arr-union": "2.1.0",
- "extend-shallow": "1.1.4"
- },
- "dependencies": {
- "arr-diff": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
- "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
- "dev": true,
- "requires": {
- "arr-flatten": "1.1.0",
- "array-slice": "0.2.3"
- }
- },
- "arr-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
- "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
- "dev": true
- },
- "array-slice": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
- "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
- "dev": true
- },
- "extend-shallow": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
- "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
- "dev": true,
- "requires": {
- "kind-of": "1.1.0"
- }
- },
- "kind-of": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
- "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
- "dev": true
- }
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
}
},
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
- "postcss": {
- "version": "7.0.26",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.26.tgz",
- "integrity": "sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==",
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"dev": true,
"requires": {
- "chalk": "2.4.2",
- "source-map": "0.6.1",
- "supports-color": "6.1.0"
- },
- "dependencies": {
- "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.3"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.5.0"
- },
- "dependencies": {
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "3.0.0"
- }
- }
- }
- },
- "supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
- "dev": true,
- "requires": {
- "has-flag": "3.0.0"
- }
- }
+ "once": "^1.4.0"
}
},
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true,
- "optional": true
- },
- "pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+ "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
},
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true
},
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"dev": true
},
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"dev": true
},
- "psl": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz",
- "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==",
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"dev": true
},
- "pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+ "fast-glob": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
+ "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
"dev": true,
"requires": {
- "end-of-stream": "1.4.4",
- "once": "1.4.0"
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.0",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.2",
+ "picomatch": "^2.2.1"
}
},
- "pumpify": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
- "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fastq": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz",
+ "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==",
"dev": true,
"requires": {
- "duplexify": "3.7.1",
- "inherits": "2.0.4",
- "pump": "2.0.1"
+ "reusify": "^1.0.4"
}
},
- "punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "file-url": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz",
+ "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==",
"dev": true
},
- "q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
- "dev": true
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
},
- "qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"dev": true
},
- "randomatic": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz",
- "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==",
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
"dev": true,
- "optional": true,
"requires": {
- "is-number": "4.0.0",
- "kind-of": "6.0.3",
- "math-random": "1.0.4"
- },
- "dependencies": {
- "is-number": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
- "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
- "dev": true,
- "optional": true
- }
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
}
},
- "read-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
- "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true
+ },
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"dev": true,
"requires": {
- "load-json-file": "1.1.0",
- "normalize-package-data": "2.5.0",
- "path-type": "1.1.0"
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.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=",
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
"dev": true,
"requires": {
- "find-up": "1.1.2",
- "read-pkg": "1.1.0"
+ "assert-plus": "^1.0.0"
}
},
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "dev": true,
"requires": {
- "core-util-is": "1.0.2",
- "inherits": "2.0.4",
- "isarray": "1.0.0",
- "process-nextick-args": "2.0.1",
- "safe-buffer": "5.1.2",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
}
},
- "readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "glob-all": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/glob-all/-/glob-all-3.2.1.tgz",
+ "integrity": "sha512-x877rVkzB3ipid577QOp+eQCR6M5ZyiwrtaYgrX/z3EThaSPFtLDwBXFHc3sH1cG0R0vFYI5SRYeWMMSEyXkUw==",
"dev": true,
"requires": {
- "graceful-fs": "4.2.3",
- "micromatch": "3.1.10",
- "readable-stream": "2.3.7"
+ "glob": "^7.1.2",
+ "yargs": "^15.3.1"
}
},
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+ "glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
"dev": true,
"requires": {
- "resolve": "1.15.0"
+ "is-glob": "^4.0.1"
}
},
- "recursive-readdir": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
- "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+ "globby": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz",
+ "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==",
"dev": true,
"requires": {
- "minimatch": "3.0.4"
+ "@types/glob": "^7.1.1",
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.0.3",
+ "glob": "^7.1.3",
+ "ignore": "^5.1.1",
+ "merge2": "^1.2.3",
+ "slash": "^3.0.0"
}
},
- "reduce-flatten": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz",
- "integrity": "sha1-JYx479FT3fk8tWEjf2EYTzaW4yc=",
+ "graceful-fs": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
+ "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
"dev": true
},
- "regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
"dev": true
},
- "regex-cache": {
- "version": "0.4.4",
- "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
- "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
- "dev": true,
- "optional": true,
- "requires": {
- "is-equal-shallow": "0.1.3"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
"dev": true,
"requires": {
- "extend-shallow": "3.0.2",
- "safe-regex": "1.1.0"
+ "ajv": "^6.12.3",
+ "har-schema": "^2.0.0"
}
},
- "remove-bom-buffer": {
+ "has-flag": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
- "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
- "dev": true,
- "requires": {
- "is-buffer": "1.1.6",
- "is-utf8": "0.2.1"
- }
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
},
- "remove-bom-stream": {
+ "http-signature": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
- "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
"dev": true,
"requires": {
- "remove-bom-buffer": "3.0.0",
- "safe-buffer": "5.1.2",
- "through2": "2.0.5"
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
}
},
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true
},
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "ignore": {
+ "version": "5.1.8",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+ "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
"dev": true
},
- "repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "ignore-walk": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz",
+ "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==",
"dev": true,
"requires": {
- "is-finite": "1.0.2"
+ "minimatch": "^3.0.4"
}
},
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true
},
- "replace-homedir": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz",
- "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=",
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
- "homedir-polyfill": "1.0.3",
- "is-absolute": "1.0.0",
- "remove-trailing-separator": "1.1.0"
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
- "request": {
- "version": "2.88.0",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
- "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
- "dev": true,
- "requires": {
- "aws-sign2": "0.7.0",
- "aws4": "1.9.1",
- "caseless": "0.12.0",
- "combined-stream": "1.0.8",
- "extend": "3.0.2",
- "forever-agent": "0.6.1",
- "form-data": "2.3.3",
- "har-validator": "5.1.3",
- "http-signature": "1.2.0",
- "is-typedarray": "1.0.0",
- "isstream": "0.1.2",
- "json-stringify-safe": "5.0.1",
- "mime-types": "2.1.26",
- "oauth-sign": "0.9.0",
- "performance-now": "2.1.0",
- "qs": "6.5.2",
- "safe-buffer": "5.1.2",
- "tough-cookie": "2.4.3",
- "tunnel-agent": "0.6.0",
- "uuid": "3.4.0"
- }
- },
- "request-promise": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.5.tgz",
- "integrity": "sha512-ZgnepCykFdmpq86fKGwqntyTiUrHycALuGggpyCZwMvGaZWgxW6yagT0FHkgo5LzYvOaCNvxYwWYIjevSH1EDg==",
- "dev": true,
- "requires": {
- "bluebird": "3.7.2",
- "request-promise-core": "1.1.3",
- "stealthy-require": "1.1.1",
- "tough-cookie": "2.4.3"
- }
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
},
- "request-promise-core": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
- "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
- "lodash": "4.17.15"
+ "binary-extensions": "^2.0.0"
}
},
- "require-directory": {
+ "is-extglob": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
"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=",
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"dev": true
},
- "requizzle": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz",
- "integrity": "sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ==",
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
"dev": true,
"requires": {
- "lodash": "4.17.15"
+ "is-extglob": "^2.1.1"
}
},
- "resolve": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz",
- "integrity": "sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==",
- "dev": true,
- "requires": {
- "path-parse": "1.0.6"
- }
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
},
- "resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
- "dev": true,
- "requires": {
- "expand-tilde": "2.0.2",
- "global-modules": "1.0.0"
- }
+ "is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true
},
- "resolve-options": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
- "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
- "dev": true,
- "requires": {
- "value-or-function": "3.0.0"
- }
+ "is-path-inside": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
+ "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
+ "dev": true
},
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
"dev": true
},
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true
},
- "reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
"dev": true
},
- "rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "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
+ },
+ "jsonc-parser": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
+ "integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
"requires": {
- "glob": "7.1.6"
+ "graceful-fs": "^4.1.6"
}
},
- "roku-deploy": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-2.6.1.tgz",
- "integrity": "sha512-TRe+PNc/kX1uSDweNy9VlSgSUd0js2qL05y72RKGixWap5m57ED/oze75KmvXnUYrMUc1opGR6vjCuMT7Fq50w==",
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "latinize": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/latinize/-/latinize-0.4.1.tgz",
+ "integrity": "sha512-A4miz97dNF+EbNgQdayPAEtud5eRpCGPwJy7JQFD1hBQcOzOgBS4m721zoREuPqpz1yKm8hYT2ANlh7pirapsA==",
+ "dev": true
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
"dev": true,
"requires": {
- "archiver": "3.1.1",
- "dateformat": "3.0.3",
- "fs-extra": "7.0.1",
- "glob-all": "3.1.0",
- "path": "0.12.7",
- "q": "1.5.1",
- "request": "2.88.0"
+ "readable-stream": "^2.0.5"
},
"dependencies": {
- "dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "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.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
- "fs-extra": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
- "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "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": {
- "graceful-fs": "4.2.3",
- "jsonfile": "4.0.0",
- "universalify": "0.1.2"
+ "safe-buffer": "~5.1.0"
}
}
}
},
- "rooibos-cli": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/rooibos-cli/-/rooibos-cli-1.2.0.tgz",
- "integrity": "sha512-yEJm8dfeyhEE/fCgr/JwaDqnxh1kflfwqtDroQQphmii11o+lhp6kc2SOhujApDJS0jkdEdf+E/FijvzxAttFQ==",
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.difference": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+ "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
+ "dev": true
+ },
+ "lodash.flatten": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.union": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
+ "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
+ "dev": true
+ },
+ "long": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
+ "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
"dev": true,
"requires": {
- "babel-cli": "6.26.0",
- "brs": "0.17.4",
- "commander": "4.1.0",
- "debug": "4.1.1",
- "es2015": "0.0.0",
- "fs-extra": "5.0.0",
- "glob-all": "3.1.0",
- "lodash": "4.17.15",
- "replace-ext": "1.0.0",
- "request": "2.88.0",
- "request-promise": "4.2.5",
- "splice-string": "2.0.0",
- "typescript": "3.7.4"
- },
- "dependencies": {
- "brs": {
- "version": "0.17.4",
- "resolved": "https://registry.npmjs.org/brs/-/brs-0.17.4.tgz",
- "integrity": "sha512-hASFOV+rQglgwbN05Nu3Q6hO/pvt/RpJtug47tjum67WCvRIAHXeCgg4cy9lDdFP5yEbAu8Tz48jeSO53RU0hQ==",
- "dev": true,
- "requires": {
- "commander": "2.20.3",
- "fast-glob": "3.1.1",
- "long": "3.2.0",
- "luxon": "1.21.3",
- "memory-fs": "0.4.1",
- "nanomatch": "1.2.13",
- "p-settle": "2.1.0",
- "xmldoc": "1.1.2"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- }
- }
- },
- "commander": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.0.tgz",
- "integrity": "sha512-NIQrwvv9V39FHgGFm36+U9SMQzbiHvU79k+iADraJTpmrFFfx7Ds0IvDoAdZsDrknlkRk14OYoWXb57uTh7/sw==",
- "dev": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
- "lodash": {
- "version": "4.17.15",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
- "dev": true
- },
- "ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
- },
- "typescript": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz",
- "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==",
- "dev": true
- }
+ "yallist": "^4.0.0"
}
},
- "run-parallel": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+ "luxon": {
+ "version": "1.26.0",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.26.0.tgz",
+ "integrity": "sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A==",
"dev": true
},
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true
},
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "micromatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+ "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
"dev": true,
"requires": {
- "ret": "0.1.15"
+ "braces": "^3.0.1",
+ "picomatch": "^2.0.5"
}
},
- "safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "mime-db": {
+ "version": "1.46.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz",
+ "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==",
"dev": true
},
- "sanitize-html": {
- "version": "1.21.1",
- "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-1.21.1.tgz",
- "integrity": "sha512-W6enXSVphVaVbmVbzVngBthR5f5sMmhq3EfPfBlzBzp2WnX8Rnk7NGpP7KmHUc0Y3MVk9tv/+CbpdHchX9ai7g==",
+ "mime-types": {
+ "version": "2.1.29",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz",
+ "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
"dev": true,
"requires": {
- "chalk": "2.4.2",
- "htmlparser2": "3.10.1",
- "lodash.clonedeep": "4.5.0",
- "lodash.escaperegexp": "4.1.2",
- "lodash.isplainobject": "4.0.6",
- "lodash.isstring": "4.0.1",
- "lodash.mergewith": "4.6.2",
- "postcss": "7.0.26",
- "srcset": "1.0.0",
- "xtend": "4.0.2"
- },
- "dependencies": {
- "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.3"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "3.2.1",
- "escape-string-regexp": "1.0.5",
- "supports-color": "5.5.0"
- }
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "3.0.0"
- }
- }
+ "mime-db": "1.46.0"
}
},
- "sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "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.7"
+ }
+ },
+ "moment": {
+ "version": "2.29.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
+ "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
"dev": true
},
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
- "semver-greatest-satisfied-range": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz",
- "integrity": "sha1-E+jCZYq5aRywzXEJMkAoDTb3els=",
+ "npm-bundled": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz",
+ "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==",
"dev": true,
"requires": {
- "sver-compat": "1.5.0"
+ "npm-normalize-package-bin": "^1.0.1"
}
},
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "npm-normalize-package-bin": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+ "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
"dev": true
},
- "set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "npm-packlist": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.1.4.tgz",
+ "integrity": "sha512-Qzg2pvXC9U4I4fLnUrBmcIT4x0woLtUgxUi9eC+Zrcv1Xx5eamytGAfbDWQ67j7xOcQ2VW1I3su9smVTIdu7Hw==",
"dev": 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",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "0.1.1"
- }
- }
+ "glob": "^7.1.6",
+ "ignore-walk": "^3.0.3",
+ "npm-bundled": "^1.1.1",
+ "npm-normalize-package-bin": "^1.0.1"
}
},
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
"dev": true
},
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": 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.3",
- "use": "3.1.1"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "0.1.6"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "0.1.1"
- }
- },
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true
- }
+ "wrappy": "1"
}
},
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "p-limit": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
"dev": true,
"requires": {
- "define-property": "1.0.0",
- "isobject": "3.0.1",
- "snapdragon-util": "3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "1.0.2"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "6.0.3"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "1.0.0",
- "is-data-descriptor": "1.0.0",
- "kind-of": "6.0.3"
- }
- }
+ "p-try": "^1.0.0"
}
},
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
+ "p-limit": "^2.2.0"
},
"dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"dev": true,
"requires": {
- "is-buffer": "1.1.6"
+ "p-try": "^2.0.0"
}
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
}
}
},
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
- },
- "source-map-resolve": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
- "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "p-map": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+ "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
"dev": true,
"requires": {
- "atob": "2.1.2",
- "decode-uri-component": "0.2.0",
- "resolve-url": "0.2.1",
- "source-map-url": "0.4.0",
- "urix": "0.1.0"
+ "aggregate-error": "^3.0.0"
}
},
- "source-map-support": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
- "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
+ "p-reflect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-1.0.0.tgz",
+ "integrity": "sha1-9Poe4btUbY6z7AMhFI3+CnkTe7g=",
+ "dev": true
+ },
+ "p-settle": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-settle/-/p-settle-2.1.0.tgz",
+ "integrity": "sha512-NHFIUYc+fQTFRrzzAugq0l1drwi57PB522smetcY8C/EoTYs6cU/fC6TJj0N3rq5NhhJJbhf0VGWziL3jZDnjA==",
+ "dev": true,
"requires": {
- "buffer-from": "1.1.1",
- "source-map": "0.6.1"
+ "p-limit": "^1.2.0",
+ "p-reflect": "^1.0.0"
}
},
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "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
},
- "sparkles": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
- "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
+ "parse-ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
+ "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==",
"dev": true
},
- "spdx-correct": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
- "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
+ "path": {
+ "version": "0.12.7",
+ "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
+ "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
"dev": true,
"requires": {
- "spdx-expression-parse": "3.0.0",
- "spdx-license-ids": "3.0.5"
+ "process": "^0.11.1",
+ "util": "^0.10.3"
}
},
- "spdx-exceptions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
- "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"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.2.0",
- "spdx-license-ids": "3.0.5"
- }
- },
- "spdx-license-ids": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz",
- "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==",
+ "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
},
- "splice-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/splice-string/-/splice-string-2.0.0.tgz",
- "integrity": "sha1-HpCypb6O0luBA2UlVZrIEqjB8wU=",
- "dev": true,
- "requires": {
- "lodash.toarray": "4.4.0"
- }
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
},
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
- "requires": {
- "extend-shallow": "3.0.2"
- }
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
},
- "srcset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/srcset/-/srcset-1.0.0.tgz",
- "integrity": "sha1-pWad4StC87HV6D7QPHEEb8SPQe8=",
- "dev": true,
- "requires": {
- "array-uniq": "1.0.3",
- "number-is-nan": "1.0.1"
- }
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true
},
- "sshpk": {
- "version": "1.16.1",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
- "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
- "dev": true,
- "requires": {
- "asn1": "0.2.4",
- "assert-plus": "1.0.0",
- "bcrypt-pbkdf": "1.0.2",
- "dashdash": "1.14.1",
- "ecc-jsbn": "0.1.2",
- "getpass": "0.1.7",
- "jsbn": "0.1.1",
- "safer-buffer": "2.1.2",
- "tweetnacl": "0.14.5"
- }
+ "process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+ "dev": true
},
- "stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
"dev": true
},
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
- "dev": true,
- "requires": {
- "define-property": "0.2.5",
- "object-copy": "0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "0.1.6"
- }
- }
- }
+ "psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+ "dev": true
},
- "stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
- "stream-exhaust": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz",
- "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==",
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
"dev": true
},
- "stream-shift": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz",
- "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+ "queue-microtask": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
+ "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
"dev": true
},
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
"dev": true,
"requires": {
- "code-point-at": "1.1.0",
- "is-fullwidth-code-point": "1.0.0",
- "strip-ansi": "3.0.1"
- }
- },
- "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==",
- "requires": {
- "safe-buffer": "5.1.2"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
}
},
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+ "readdirp": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+ "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
"dev": true,
"requires": {
- "ansi-regex": "2.1.1"
+ "picomatch": "^2.2.1"
}
},
- "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"
+ "regexp-to-ast": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
+ "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==",
+ "dev": true
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
}
},
- "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=",
+ "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
},
- "supports-color": {
+ "require-main-filename": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
"dev": true
},
- "sver-compat": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz",
- "integrity": "sha1-PPh9/rTQe0o/FIJ7wYaz/QxkXNg=",
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
"dev": true,
"requires": {
- "es6-iterator": "2.0.3",
- "es6-symbol": "3.1.3"
+ "glob": "^7.1.3"
}
},
- "table-layout": {
- "version": "0.4.5",
- "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz",
- "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==",
- "dev": true,
- "requires": {
- "array-back": "2.0.0",
- "deep-extend": "0.6.0",
- "lodash.padend": "4.6.1",
- "typical": "2.6.1",
- "wordwrapjs": "3.0.0"
+ "roku-deploy": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.3.0.tgz",
+ "integrity": "sha512-85XAgFH7AZylxIiECHbfydNEYeUUEEs/iq/zl3G3gqgM+x3fT/JnnkqrwgdFdLBj+aJVR3ZlyhuUWjDh1WxMbw==",
+ "dev": true,
+ "requires": {
+ "archiver": "^3.0.0",
+ "dateformat": "^3.0.3",
+ "fs-extra": "^7.0.1",
+ "glob": "^7.1.6",
+ "jsonc-parser": "^2.3.0",
+ "minimatch": "^3.0.4",
+ "path": "^0.12.7",
+ "request": "^2.88.0",
+ "xml2js": "^0.4.23"
+ }
+ },
+ "ropm": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/ropm/-/ropm-0.5.0.tgz",
+ "integrity": "sha512-hoVElmmOtrlFKl66uBiIvjc82TeF0H1WiuGx6iJpel+zCh7MkQSZq8l9XYwTHM9FHVGaawkZJlOdGvBHaUphGQ==",
+ "dev": true,
+ "requires": {
+ "@types/semver": "^7.3.1",
+ "@xml-tools/ast": "^5.0.0",
+ "@xml-tools/parser": "^1.0.7",
+ "del": "^5.1.0",
+ "fs-extra": "^9.0.1",
+ "glob-all": "^3.2.1",
+ "latinize": "^0.4.1",
+ "npm-packlist": "^2.1.2",
+ "roku-deploy": "^3.2.2",
+ "semver": "^7.3.2",
+ "yargs": "^15.4.1"
},
"dependencies": {
- "array-back": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
- "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
"requires": {
- "typical": "2.6.1"
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
}
},
- "typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
- "dev": true
- }
- }
- },
- "taffydb": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz",
- "integrity": "sha1-fLy2S1oUG2ou/CxdLGe04VCyomg=",
- "dev": true
- },
- "tar-stream": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz",
- "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==",
- "dev": true,
- "requires": {
- "bl": "3.0.0",
- "end-of-stream": "1.4.4",
- "fs-constants": "1.0.0",
- "inherits": "2.0.4",
- "readable-stream": "3.5.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz",
- "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==",
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
"dev": true,
"requires": {
- "inherits": "2.0.4",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
}
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "dev": true
}
}
},
- "thenify": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz",
- "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=",
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"requires": {
- "any-promise": "1.3.0"
+ "queue-microtask": "^1.2.2"
}
},
- "thenify-all": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
- "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "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
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+ "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
"dev": true,
"requires": {
- "thenify": "3.3.0"
+ "lru-cache": "^6.0.0"
}
},
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "dev": true,
"requires": {
- "readable-stream": "2.3.7",
- "xtend": "4.0.2"
+ "type-fest": "^0.13.1"
}
},
- "through2-filter": {
+ "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
+ },
+ "slash": {
"version": "3.0.0",
- "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
- "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
- "dev": true,
- "requires": {
- "through2": "2.0.5",
- "xtend": "4.0.2"
- }
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
},
- "time-stamp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
- "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "source-map": {
+ "version": "0.7.3",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+ "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true
},
- "to-absolute-glob": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
- "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
"dev": true,
"requires": {
- "is-absolute": "1.0.0",
- "is-negated-glob": "1.0.0"
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
}
},
- "to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
- "dev": true
- },
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
"requires": {
- "kind-of": "3.2.2"
- },
- "dependencies": {
- "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"
- }
- }
+ "safe-buffer": "~5.2.0"
}
},
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
"dev": true,
"requires": {
- "define-property": "2.0.2",
- "extend-shallow": "3.0.2",
- "regex-not": "1.0.2",
- "safe-regex": "1.1.0"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
}
},
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
"dev": true,
"requires": {
- "is-number": "3.0.0",
- "repeat-string": "1.6.1"
+ "ansi-regex": "^5.0.0"
}
},
- "to-through": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
- "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
- "through2": "2.0.5"
+ "has-flag": "^3.0.0"
}
},
- "tough-cookie": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
- "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"dev": true,
"requires": {
- "psl": "1.7.0",
- "punycode": "1.4.1"
- },
- "dependencies": {
- "punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
- "dev": true
- }
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
}
},
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
- "dev": true
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
},
- "ts-node": {
- "version": "8.6.2",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
- "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
"requires": {
- "arg": "4.1.2",
- "diff": "4.0.2",
- "make-error": "1.3.5",
- "source-map-support": "0.5.16",
- "yn": "3.1.1"
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
}
},
"tunnel-agent": {
@@ -6781,7 +4122,7 @@
"integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
"dev": true,
"requires": {
- "safe-buffer": "5.1.2"
+ "safe-buffer": "^5.0.1"
}
},
"tweetnacl": {
@@ -6790,166 +4131,27 @@
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"dev": true
},
- "type": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
- "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
- "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": "3.7.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz",
- "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==",
- "dev": true
- },
- "typical": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz",
- "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==",
- "dev": true
- },
- "unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
- "dev": true
- },
- "underscore": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
- "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
- "dev": true
- },
- "undertaker": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz",
- "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==",
- "dev": true,
- "requires": {
- "arr-flatten": "1.1.0",
- "arr-map": "2.0.2",
- "bach": "1.2.0",
- "collection-map": "1.0.0",
- "es6-weak-map": "2.0.3",
- "last-run": "1.1.1",
- "object.defaults": "1.1.0",
- "object.reduce": "1.0.1",
- "undertaker-registry": "1.0.1"
- }
- },
- "undertaker-registry": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz",
- "integrity": "sha1-XkvaMI5KiirlhPm5pDWaSZglzFA=",
+ "type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
"dev": true
},
- "union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "dev": true,
- "requires": {
- "arr-union": "3.1.0",
- "get-value": "2.0.6",
- "is-extendable": "0.1.1",
- "set-value": "2.0.1"
- }
- },
- "unique-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
- "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
- "dev": true,
- "requires": {
- "json-stable-stringify-without-jsonify": "1.0.1",
- "through2-filter": "3.0.0"
- }
- },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
"dev": true
},
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
- "dev": true,
- "requires": {
- "has-value": "0.3.1",
- "isobject": "3.0.1"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
- "requires": {
- "get-value": "2.0.6",
- "has-values": "0.1.4",
- "isobject": "2.1.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
- }
- }
- },
- "upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
- "dev": true
- },
"uri-js": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
- "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
"dev": true,
"requires": {
- "punycode": "2.1.1"
+ "punycode": "^2.1.0"
}
},
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
- "dev": true
- },
- "user-home": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
- "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
- "dev": true
- },
"util": {
"version": "0.10.4",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
@@ -6970,7 +4172,8 @@
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
},
"uuid": {
"version": "3.4.0",
@@ -6978,129 +4181,40 @@
"integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
"dev": true
},
- "v8flags": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.3.tgz",
- "integrity": "sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==",
- "dev": true,
- "requires": {
- "homedir-polyfill": "1.0.3"
- }
- },
- "validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "requires": {
- "spdx-correct": "3.1.0",
- "spdx-expression-parse": "3.0.0"
- }
- },
- "value-or-function": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
- "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
- "dev": true
- },
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
"integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
"dev": true,
"requires": {
- "assert-plus": "1.0.0",
+ "assert-plus": "^1.0.0",
"core-util-is": "1.0.2",
- "extsprintf": "1.3.0"
- }
- },
- "vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dev": true,
- "requires": {
- "clone": "2.1.2",
- "clone-buffer": "1.0.0",
- "clone-stats": "1.0.0",
- "cloneable-readable": "1.1.3",
- "remove-trailing-separator": "1.1.0",
- "replace-ext": "1.0.0"
- }
- },
- "vinyl-fs": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
- "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
- "dev": true,
- "requires": {
- "fs-mkdirp-stream": "1.0.0",
- "glob-stream": "6.1.0",
- "graceful-fs": "4.2.3",
- "is-valid-glob": "1.0.0",
- "lazystream": "1.0.0",
- "lead": "1.0.0",
- "object.assign": "4.1.0",
- "pumpify": "1.5.1",
- "readable-stream": "2.3.7",
- "remove-bom-buffer": "3.0.0",
- "remove-bom-stream": "1.2.0",
- "resolve-options": "1.1.0",
- "through2": "2.0.5",
- "to-through": "2.0.0",
- "value-or-function": "3.0.0",
- "vinyl": "2.2.0",
- "vinyl-sourcemap": "1.1.0"
- }
- },
- "vinyl-paths": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/vinyl-paths/-/vinyl-paths-2.1.0.tgz",
- "integrity": "sha1-AIIEN8ujgmLO+IAthA+T4zku5Es=",
- "dev": true,
- "requires": {
- "through2": "2.0.5"
- }
- },
- "vinyl-sourcemap": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
- "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
- "dev": true,
- "requires": {
- "append-buffer": "1.0.2",
- "convert-source-map": "1.7.0",
- "graceful-fs": "4.2.3",
- "normalize-path": "2.1.1",
- "now-and-later": "2.0.1",
- "remove-bom-buffer": "3.0.0",
- "vinyl": "2.2.0"
+ "extsprintf": "^1.2.0"
}
},
"vscode-jsonrpc": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz",
- "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz",
+ "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==",
"dev": true
},
"vscode-languageserver": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz",
- "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==",
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-6.1.1.tgz",
+ "integrity": "sha512-DueEpkUAkD5XTR4MLYNr6bQIp/UFR0/IPApgXU3YfCBCB08u2sm9hRCs6DxYZELkk++STPjpcjksR2H8qI3cDQ==",
"dev": true,
"requires": {
- "vscode-languageserver-protocol": "3.14.1",
- "vscode-uri": "1.0.8"
+ "vscode-languageserver-protocol": "^3.15.3"
}
},
"vscode-languageserver-protocol": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz",
- "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==",
+ "version": "3.15.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz",
+ "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==",
"dev": true,
"requires": {
- "vscode-jsonrpc": "4.0.0",
- "vscode-languageserver-types": "3.14.0"
+ "vscode-jsonrpc": "^5.0.1",
+ "vscode-languageserver-types": "3.15.1"
}
},
"vscode-languageserver-textdocument": {
@@ -7110,64 +4224,65 @@
"dev": true
},
"vscode-languageserver-types": {
- "version": "3.14.0",
- "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz",
- "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==",
+ "version": "3.15.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz",
+ "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==",
"dev": true
},
"vscode-uri": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz",
- "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==",
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.2.tgz",
+ "integrity": "sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==",
"dev": true
},
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "2.0.0"
- }
- },
"which-module": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
- "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
"dev": true
},
- "wordwrapjs": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz",
- "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==",
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"dev": true,
"requires": {
- "reduce-flatten": "1.0.1",
- "typical": "2.6.1"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"dependencies": {
- "typical": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
- "integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0=",
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"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"
- }
- },
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
},
"xml2js": {
"version": "0.4.23",
@@ -7175,8 +4290,8 @@
"integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
"dev": true,
"requires": {
- "sax": "1.2.4",
- "xmlbuilder": "11.0.1"
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
}
},
"xmlbuilder": {
@@ -7185,77 +4300,56 @@
"integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
"dev": true
},
- "xmlcreate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz",
- "integrity": "sha1-+mv3YqYKQT+z3Y9LA8WyaSONMI8=",
+ "y18n": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+ "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
"dev": true
},
- "xmldoc": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz",
- "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==",
- "dev": true,
- "requires": {
- "sax": "1.2.4"
- }
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
- },
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
"dev": true
},
"yargs": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-1.2.6.tgz",
- "integrity": "sha1-nHtKgv1dWVsr8Xq23MQxNUMv40s=",
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"dev": true,
"requires": {
- "minimist": "0.1.0"
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
}
},
"yargs-parser": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
- "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"dev": true,
"requires": {
- "camelcase": "3.0.0"
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
}
},
- "yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
- },
"zip-stream": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz",
"integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==",
"dev": true,
"requires": {
- "archiver-utils": "2.1.0",
- "compress-commons": "2.1.1",
- "readable-stream": "3.5.0"
- },
- "dependencies": {
- "readable-stream": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz",
- "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==",
- "dev": true,
- "requires": {
- "inherits": "2.0.4",
- "string_decoder": "1.1.1",
- "util-deprecate": "1.0.2"
- }
- }
+ "archiver-utils": "^2.1.0",
+ "compress-commons": "^2.1.1",
+ "readable-stream": "^3.4.0"
}
}
}
diff --git a/package.json b/package.json
index 3748d578..73bd53d5 100644
--- a/package.json
+++ b/package.json
@@ -1,58 +1,39 @@
-{
- "name": "rooibos",
- "version": "4.0.0",
- "description": "simple, flexible, fun brightscript test framework for roku scenegraph apps",
- "main": "index.js",
- "directories": {
- "doc": "docs"
- },
- "dependencies": {
- "gulp-header": "^2.0.7",
- "rimraf": "^3.0.2"
- },
- "devDependencies": {
- "brighterscript": "^0.10.11",
- "burp-brightscript": "^0.3.2",
- "del": "^3.0.0",
- "docdash": "^0.4.0",
- "dotenv": "^8.1.0",
- "generate-changelog": "^1.8.0",
- "glob-all": "^3.2.1",
- "gulp": "^4.0.2",
- "gulp-concat": "^2.6.1",
- "gulp-copy": "^4.0.1",
- "gulp-rm-lines": "0.0.9",
- "gulpclass": "^0.2.0",
- "ink-docstrap": "1.3.0",
- "jsdoc": "3.5.5",
- "maestro-cli-roku": "^0.15.4",
- "minami": "^1.2.3",
- "minimist": "^1.2.5",
- "roku-deploy": "^2.7.0",
- "rooibos-cli": "^1.3.0",
- "ts-node": "^8.10.2",
- "typescript": "3.7.4",
- "vinyl-paths": "^2.1.0"
- },
- "scripts": {
- "use-live-cli": "npm install maestro-cli-roku --save-dev",
- "use-local-cli": "npm install ../maestro-cli --save-dev"
- },
- "repository": {
- "type": "git",
- "url": "https://github.com/georgejecook/rooibos.git"
- },
- "keywords": [
- "brightscript",
- "unit",
- "testing",
- "rooibos",
- "tdd"
- ],
- "author": "George Cook",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/georgejecook/rooibos/issues"
- },
- "homepage": "https://github.com/georgejecook/rooibos#readme"
-}
+{
+ "name": "rooibos",
+ "version": "4.2.1",
+ "description": "simple, flexible, fun brightscript test framework for roku scenegraph apps",
+ "files": [
+ "dist/**/!(manifest)*"
+ ],
+ "devDependencies": {
+ "brighterscript": "^0.32.2",
+ "ropm": "^0.5.0"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/georgejecook/rooibos.git"
+ },
+ "keywords": [
+ "ropm",
+ "brightscript",
+ "unit",
+ "testing",
+ "rooibos",
+ "tdd"
+ ],
+ "author": "George Cook",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/georgejecook/rooibos/issues"
+ },
+ "ropm": {
+ "rootDir": "src",
+ "packageRootDir": "dist"
+ },
+ "homepage": "https://github.com/georgejecook/rooibos#readme",
+ "scripts": {
+ "build": "npx bsc",
+ "test": "cd tests && npx ropm copy && bsc --project ./bsconfig.json",
+ "coverage": "cd tests && npx ropm copy && bsc --project ./bsconfig.coverage.json"
+ }
+}
diff --git a/rooibos.code-workspace b/rooibos.code-workspace
new file mode 100644
index 00000000..e7cc867d
--- /dev/null
+++ b/rooibos.code-workspace
@@ -0,0 +1,29 @@
+{
+ "folders": [
+ {
+ "path": "bsc-plugin"
+ },
+ {
+ "path": "framework"
+ },
+ {
+ "path": "tests"
+ },
+ {
+ "path": "../vsc/brighterscript"
+ }
+ ],
+ "settings": {
+ "jira-plugin.workingProject": "",
+ "workbench.colorCustomizations": {
+ "statusBar.background": "#b3b024",
+ "statusBar.debuggingBackground": "#f1ee2f",
+ "panelTitle.activeBorder": "#ff0000",
+ "activityBar.background": "#f1ee2f",
+ "activityBar.foreground": "#1b1b1a",
+ "activityBar.activeBackground": "#b3b024",
+ "titleBar.activeBackground": "#b3b024",
+ "titleBar.activeForeground": "#F9F9F8"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/source/BaseTestSuite.bs b/src/source/BaseTestSuite.bs
deleted file mode 100644
index 5dba0729..00000000
--- a/src/source/BaseTestSuite.bs
+++ /dev/null
@@ -1,1929 +0,0 @@
-namespace Rooibos
-
- ' /**
- ' * @module BaseTestSuite
- ' * @description All brs files that include `'@TestSuite` annotations automatically extend the BaseTestSuite.
- ' * The base test suite contains all of the assertions, and utility methods required to writey our tests, as well as being responsible for tracking the state of the tests and groups.
- ' */
- class BaseTestSuite
-
- public name = "BaseTestSuite"
- public invalidValue = "#ROIBOS#INVALID_VALUE" ' special value used in mock arguments
- public ignoreValue = "#ROIBOS#IGNORE_VALUE" ' special value used in mock arguments
-
- 'built in any matchers
- public anyStringMatcher = { "matcher": Rooibos_Matcher_anyString }
- public anyBoolMatcher = { "matcher": Rooibos_Matcher_anyBool }
- public anyNumberMatcher = { "matcher": Rooibos_Matcher_anyNumber }
- public anyAAMatcher = { "matcher": Rooibos_Matcher_anyAA }
- public anyArrayMatcher = { "matcher": Rooibos_Matcher_anyArray }
- public anyNodeMatcher = { "matcher": Rooibos_Matcher_anyNode }
- public allowNonExistingMethodsOnMocks = true
- public isAutoAssertingMocks = true
-
- 'Test Cases methods
- public testCases = []
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name addTest
- ' * @function
- ' * @instance
- ' * @description Add a test to a suite's test cases array. Used internally.
- ' * @param {Dynamic} name - A test name.
- ' * @param {Dynamic} func - A test function name.
- ' */
- public function addTest(name, func, funcName, setup = invalid, teardown = invalid)
- m.testCases.Push(m.createTest(name, func, setup, teardown))
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name createTest
- ' * @function
- ' * @instance
- ' * @description Create a test object. Used internally
- ' * @param {Dynamic} name - A test name.
- ' * @param {Dynamic} func - A test function name.
- ' */
- public function createTest(name, func, funcName, setup = invalid, teardown = invalid) as object
-
- if (func = invalid)
- ? " ASKED TO CREATE TEST WITH INVALID FUNCITON POINTER FOR FUNCTION " ; funcName
- end if
-
- return {
- name: name
- func: func
- funcName: funcName
- setUp: setup
- tearDown: teardown
- }
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name fail
- ' * @function
- ' * @instance
- ' * @description Fail immediately, with the given message
- ' * @param {Dynamic} [msg=""] - message to display in the test report
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function fail(msg = "Error") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end function
-
- '*************************************************************
- '** GetLegacyCompatibleReturnValue
- '** will return the correct type of return value for a new-style/legacy test
- '*************************************************************
- public function getLegacyCompatibleReturnValue(value) as object
- if (value = true)
- if (m.isLegacy = true)
- return ""
- else
- return true
- end if
- else
- if (m.isLegacy = true)
- return "ERROR"
- else
- return false
- end if
- end if
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertFalse
- ' * @function
- ' * @instance
- ' * @description Fail the test if the expression is true.
- ' * @param {Dynamic} expr - An expression to evaluate.
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' Default value: "Expression evaluates to true"' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertFalse(expr, msg = "Expression evaluates to true") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if not Rooibos.Common.isBoolean(expr) or expr
- return m.fail(msg)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertTrue
- ' * @function
- ' * @instance
- ' * @description Fail the test unless the expression is true.
- ' * @param {Dynamic} expr - An expression to evaluate.
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertTrue(expr, msg = "Expression evaluates to false")
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
-
- if not Rooibos.Common.isBoolean(expr) or not expr
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
-
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertEqual
- ' * @function
- ' * @instance
- ' * @description Fail if the two objects are unequal as determined by the '<>' operator.
- ' * @param {Dynamic} first - first object to compare
- ' * @param {Dynamic} second - second object to compare
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertEqual(first, second, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if not Rooibos.Common.eqValues(first, second)
- if msg = ""
- first_as_string = Rooibos.Common.asString(first)
- second_as_string = Rooibos.Common.asString(second)
- msg = first_as_string + " != " + second_as_string
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertLike
- ' * @function
- ' * @instance
- ' * @description does a fuzzy comparison
- ' * @param {Dynamic} first - first object to compare
- ' * @param {Dynamic} second - second object to compare
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertLike(first, second, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if first <> second
- if msg = ""
- first_as_string = Rooibos.Common.asString(first)
- second_as_string = Rooibos.Common.asString(second)
- msg = first_as_string + " != " + second_as_string
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNotEqual
- ' * @function
- ' * @instance
- ' * @description Fail if the two objects are equal as determined by the '=' operator.
- ' * @param {Dynamic} first - first object to compare
- ' * @param {Dynamic} second - second object to compare
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNotEqual(first, second, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.eqValues(first, second)
- if msg = ""
- first_as_string = Rooibos.Common.asString(first)
- second_as_string = Rooibos.Common.asString(second)
- msg = first_as_string + " == " + second_as_string
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertInvalid
- ' * @function
- ' * @instance
- ' * @description Fail if the value is not invalid.
- ' * @param {Dynamic} value - value to check - value to check for
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertInvalid(value, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if value <> invalid
- if msg = ""
- expr_as_string = Rooibos.Common.asString(value)
- msg = expr_as_string + " <> Invalid"
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNotInvalid
- ' * @function
- ' * @instance
- ' * @description Fail if the value is invalid.
- ' * @param {Dynamic} value - value to check - value to check for
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNotInvalid(value, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if value = invalid
- if msg = ""
- expr_as_string = Rooibos.Common.asString(value)
- msg = expr_as_string + " = Invalid"
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertAAHasKey
- ' * @function
- ' * @instance
- ' * @description Fail if the array doesn't have the key.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} key - key name
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertAAHasKey(array, key, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array)
- if not array.DoesExist(key)
- if msg = ""
- msg = "Array doesn't have the '" + key + "' key."
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Associative Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertAANotHasKey
- ' * @function
- ' * @instance
- ' * @description Fail if the array has the key.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} key - key name
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertAANotHasKey(array, key, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array)
- if array.DoesExist(key)
- if msg = ""
- msg = "Array has the '" + key + "' key."
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Associative Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertAAHasKeys
- ' * @function
- ' * @instance
- ' * @description Fail if the array doesn't have the keys list.
- ' * @param {Dynamic} array - A target associative array.
- ' * @param {Dynamic} keys - Array of key names.
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertAAHasKeys(array, keys, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isArray(keys)
- for each key in keys
- if not array.DoesExist(key)
- if msg = ""
- msg = "Array doesn't have the '" + key + "' key."
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end for
- else
- msg = "Input value is not an Associative Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertAANotHasKeys
- ' * @function
- ' * @instance
- ' * @description Fail if the array has the keys list.
- ' * @param {Dynamic} array - A target associative array.
- ' * @param {Dynamic} keys - Array of key names.
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertAANotHasKeys(array, keys, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isArray(keys)
- for each key in keys
- if array.DoesExist(key)
- if msg = ""
- msg = "Array has the '" + key + "' key."
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end for
- else
- msg = "Input value is not an Associative Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
-
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayContains
- ' * @function
- ' * @instance
- ' * @description Fail if the array doesn't have the item.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} value - value to check - value to check for
- ' * @param {Dynamic} key - key name in associative array
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayContains(array, value, key = invalid, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
- if not Rooibos.Common.arrayContains(array, value, key)
- msg = "Array doesn't have the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayContainsAAs
- ' * @function
- ' * @instance
- ' * @description Fail if the array does not contain all of the aa's in the values array.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} values - array of aas to look for in target array
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayContainsAAs(array, values, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
-
- if not Rooibos.Common.isArray(values)
- msg = "values to search for are not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
-
- if Rooibos.Common.isArray(array)
- for each value in values
- isMatched = false
- if not Rooibos.Common.isAssociativeArray(value)
- msg = "Value to search for was not associativeArray " + Rooibos.Common.asString(value)
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- for each item in array
- if (Rooibos.Common.IsAssociativeArray(item))
- isValueMatched = true
- for each key in value
- fieldValue = value[key]
- itemValue = item[key]
- if (not Rooibos.Common.eqValues(fieldValue, itemValue))
- isValueMatched = false
- exit for
- end if
- end for
- if (isValueMatched)
- isMatched = true
- exit for
- end if
- end if
- end for ' items in array
-
- if not isMatched
- msg = "array missing value: " + Rooibos.Common.asString(value)
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
-
- end for 'values to match
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayNotContains
- ' * @function
- ' * @instance
- ' * @description Fail if the array has the item.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} value - value to check - Value to check for
- ' * @param {Dynamic} key - A key name for associative array.
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayNotContains(array, value, key = invalid, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
- if Rooibos.Common.arrayContains(array, value, key)
- msg = "Array has the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayContainsSubset
- ' * @function
- ' * @instance
- ' * @description Fail if the array doesn't have the item subset.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} subset - items to check presnece of
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayContainsSubset(array, subset, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if (Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isAssociativeArray(subset)) or (Rooibos.Common.isArray(array) and Rooibos.Common.isArray(subset))
- isAA = Rooibos.Common.isAssociativeArray(subset)
- for each item in subset
- key = invalid
- value = item
- if isAA
- key = item
- value = subset[key]
- end if
- if not Rooibos.Common.arrayContains(array, value, key)
- msg = "Array doesn't have the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end for
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayNotContainsSubset
- ' * @function
- ' * @instance
- ' * @description Fail if the array have the item from subset.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} subset - items to check presnece of
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayNotContainsSubset(array, subset, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if (Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isAssociativeArray(subset)) or (Rooibos.Common.isArray(array) and Rooibos.Common.isArray(subset))
- isAA = Rooibos.Common.isAssociativeArray(subset)
- for each item in subset
- key = invalid
- value = item
- if isAA
- key = item
- value = item[key]
- end if
- if Rooibos.Common.arrayContains(array, value, key)
- msg = "Array has the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end for
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayCount
- ' * @function
- ' * @instance
- ' * @description Fail if the array items count <> expected count
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} count - An expected array items count
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayCount(array, count, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
- if array.Count() <> count
- msg = "Array items count " + Rooibos.Common.asString(array.Count()) + " <> " + Rooibos.Common.asString(count) + "."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayNotCount
- ' * @function
- ' * @instance
- ' * @description Fail if the array items count = expected count.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} count - An expected array items count.
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayNotCount(array, count, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
- if array.Count() = count
- msg = "Array items count = " + Rooibos.Common.asString(count) + "."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertEmpty
- ' * @function
- ' * @instance
- ' * @description Fail if the item is not empty array or string.
- ' * @param {Dynamic} item - item to check
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertEmpty(item, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(item) or Rooibos.Common.isArray(item)
- if item.count() > 0
- msg = "Array is not empty."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else if (Rooibos.Common.isString(item))
- if (Rooibos.Common.asString(item) <> "")
- msg = "Input value is not empty."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "AssertEmpty: Input value was not an array or a string"
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNotEmpty
- ' * @function
- ' * @instance
- ' * @description Fail if the item is empty array or string.
- ' * @param {Dynamic} item - item to check
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNotEmpty(item, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if Rooibos.Common.isAssociativeArray(item) or Rooibos.Common.isArray(item)
- if item.count() = 0
- msg = "Array is empty."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else if Rooibos.Common.isString(item)
- if (item = "")
- msg = "Input value is empty."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not a string or array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertArrayContainsOnlyValuesOfType
- ' * @function
- ' * @instance
- ' * @description Fail if the array doesn't contains items of specific type only.
- ' * @param {Dynamic} array - target array
- ' * @param {Dynamic} typeStr - type name - must be String, Array, Boolean, or AssociativeArray
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertArrayContainsOnlyValuesOfType(array, typeStr, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if typeStr <> "String" and typeStr <> "Integer" and typeStr <> "Boolean" and typeStr <> "Array" and typeStr <> "AssociativeArray"
- msg = "Type must be Boolean, String, Array, Integer, or AssociativeArray"
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
-
- if Rooibos.Common.isAssociativeArray(array) or Rooibos.Common.isArray(array)
- methodName = "Rooibos_Common_Is" + typeStr
- typeCheckFunction = m.getIsTypeFunction(methodName)
- if (typeCheckFunction <> invalid)
- for each item in array
- if not typeCheckFunction(item)
- msg = Rooibos.Common.asString(item) + "is not a '" + typeStr + "' type."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end for
- else
- msg = "could not find comparator for type '" + typeStr + "' type."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Array."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- public function getIsTypeFunction(name)
- if name = "Rooibos_Common_IsFunction"
- return Rooibos.Common.isFunction
- else if name = "Rooibos_Common_IsXmlElement"
- return Rooibos.Common.isXmlElement
- else if name = "Rooibos_Common_IsInteger"
- return Rooibos.Common.isInteger
- else if name = "Rooibos_Common_IsBoolean"
- return Rooibos.Common.isBoolean
- else if name = "Rooibos_Common_IsFloat"
- return Rooibos.Common.isFloat
- else if name = "Rooibos_Common_IsDouble"
- return Rooibos.Common.isDouble
- else if name = "Rooibos_Common_IsLongInteger"
- return Rooibos.Common.isLongInteger
- else if name = "Rooibos_Common_IsNumber"
- return Rooibos.Common.isNumber
- else if name = "Rooibos_Common_IsList"
- return Rooibos.Common.isList
- else if name = "Rooibos_Common_IsArray"
- return Rooibos.Common.isArray
- else if name = "Rooibos_Common_IsAssociativeArray"
- return Rooibos.Common.isAssociativeArray
- else if name = "Rooibos_Common_IsSGNode"
- return Rooibos.Common.isSGNode
- else if name = "Rooibos_Common_IsString"
- return Rooibos.Common.isString
- else if name = "Rooibos_Common_IsDateTime"
- return Rooibos.Common.isDateTime
- else if name = "Rooibos_Common_IsUndefined"
- return Rooibos.Common.isUndefined
- else
- return invalid
- end if
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertType
- ' * @function
- ' * @instance
- ' * @description Asserts that the value is a node of designated type
- ' * @param {Dynamic} value - value to check - target node
- ' * @param {Dynamic} typeStr - type name
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertType(value, typeStr, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(value) <> typeStr
- if msg = ""
- expr_as_string = Rooibos.Common.asString(value)
- msg = expr_as_string + " was not expected type " + typeStr
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertSubType
- ' * @function
- ' * @instance
- ' * @description Asserts that the value is a node of designated subtype
- ' * @param {Dynamic} value - value to check - target node
- ' * @param {Dynamic} typeStr - type name
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertSubType(value, typeStr, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(value) <> "roSGNode"
- if msg = ""
- expr_as_string = Rooibos.Common.asString(value)
- msg = expr_as_string + " was not a node, so could not match subtype " + typeStr
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- else if (value.subType() <> typeStr)
- if msg = ""
- expr_as_string = Rooibos.Common.asString(value)
- msg = expr_as_string + "( type : " + value.subType() + ") was not of subType " + typeStr
- end if
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ NEW NODE ASSERTS
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeCount
- ' * @function
- ' * @instance
- ' * @description Asserts that the node contains the desginated number of children
- ' * @param {Dynamic} node - target node
- ' * @param {Dynamic} count - expected number of child items
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert w, false otherwise
- ' */
- public function assertNodeCount(node, count, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(node) = "roSGNode"
- if node.getChildCount() <> count
- msg = "node items count <> " + Rooibos.Common.asString(count) + ". Received " + Rooibos.Common.asString(node.getChildCount())
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an node."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeNotCount
- ' * @function
- ' * @instance
- ' * @description Fail if the node items count = expected count.
- ' * @param {Dynamic} node - A target node
- ' * @param {Dynamic} count - Expected item count
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNodeNotCount(node, count, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(node) = "roSGNode"
- if node.getChildCount() = count
- msg = "node items count = " + Rooibos.Common.asString(count) + "."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an node."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeEmpty
- ' * @function
- ' * @instance
- ' * @description Asserts the node has no children
- ' * @param {Dynamic} node - a node to check
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNodeEmpty(node, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(node) = "roSGNode"
- if node.getChildCount() > 0
- msg = "node is not empty."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeNotEmpty
- ' * @function
- ' * @instance
- ' * @description Asserts the node has children
- ' * @param {Dynamic} node - a node to check
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNodeNotEmpty(node, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(node) = "roSGNode"
- if node.Count() = 0
- msg = "Array is empty."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeContains
- ' * @function
- ' * @instance
- ' * @description Asserts the node contains the child _value_
- ' * @param {Dynamic} node - a node to check
- ' * @param {Dynamic} value - value to check - value to look for
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNodeContains(node, value, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(node) = "roSGNode"
- if not Rooibos.Common.nodeContains(node, value)
- msg = "Node doesn't have the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Node."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeContainsOnly
- ' * @function
- ' * @instance
- ' * @description Asserts the node contains only the child _value_
- ' * @param {Dynamic} node - a node to check
- ' * @param {Dynamic} value - value to check - value to look for
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNodeContainsOnly(node, value, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(node) = "roSGNode"
- if not Rooibos.Common.nodeContains(node, value)
- msg = "Node doesn't have the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- else if node.getChildCount() <> 1
- msg = "Node Contains speicified value; but other values as well"
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Node."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeNotContains
- ' * @function
- ' * @instance
- ' * @description Fail if the node h item.
- ' * @param {Dynamic} node - A target node
- ' * @param {Dynamic} value - value to check - a node child
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNodeNotContains(node, value, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if type(node) = "roSGNode"
- if Rooibos.Common.nodeContains(node, value)
- msg = "Node has the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- else
- msg = "Input value is not an Node."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeContainsFields
- ' * @function
- ' * @instance
- ' * @description Fail if the node doesn't have the item subset.
- ' * @param {Dynamic} node - A target node
- ' * @param {Dynamic} subset - items to check
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertNodeContainsFields(node, subset, ignoredFields = invalid, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if (type(node) = "roSGNode" and Rooibos.Common.isAssociativeArray(subset)) or (type(node) = "roSGNode" and Rooibos.Common.isArray(subset))
- isAA = Rooibos.Common.isAssociativeArray(subset)
- isIgnoredFields = Rooibos.Common.isArray(ignoredFields)
- for each key in subset
- if (key <> "")
- if (not isIgnoredFields or not Rooibos.Common.arrayContains(ignoredFields, key))
- subsetValue = subset[key]
- nodeValue = node[key]
- if not Rooibos.Common.eqValues(nodeValue, subsetValue)
- msg = key + ": Expected '" + Rooibos.Common.asString(subsetValue) + "', got '" + Rooibos.Common.asString(nodeValue) + "'"
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end if
- else
- ? "Found empty key!"
- end if
- end for
- else
- msg = "Input value is not an Node."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertNodeNotContainsFields
- ' * @function
- ' * @instance
- ' * @description Fail if the node have the item from subset.
- ' * @param {Dynamic} node - A target node
- ' * @param {Dynamic} subset - the items to check for
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert w, false otherwise
- ' */
- public function assertNodeNotContainsFields(node, subset, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if (type(node) = "roSGNode" and Rooibos.Common.isAssociativeArray(subset)) or (type(node) = "roSGNode" and Rooibos.Common.isArray(subset))
- isAA = Rooibos.Common.isAssociativeArray(subset)
- for each item in subset
- key = invalid
- value = item
- if isAA
- key = item
- value = item[key]
- end if
- if Rooibos.Common.nodeContains(node, value)
- msg = "Node has the '" + Rooibos.Common.asString(value) + "' value."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end for
- else
- msg = "Input value is not an Node."
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ END NODE ASSERTS
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertAAContainsSubset
- ' * @function
- ' * @instance
- ' * @description Asserts the associative array contains the fields contained in subset; while ignoring the fields in the ignoredFields array
- ' * @param {Dynamic} array - associative array to check
- ' * @param {Dynamic} subset - associative array of values to check for
- ' * @param {Dynamic} ignoredFields - array of fieldnames to ignore while comparing
- ' * @param {Dynamic} [msg=""] - alternate error message
- ' * @returns {boolean} - true if the assert was satisfied, false otherwise
- ' */
- public function assertAAContainsSubset(array, subset, ignoredFields = invalid, msg = "") as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if (Rooibos.Common.isAssociativeArray(array) and Rooibos.Common.isAssociativeArray(subset))
- isAA = Rooibos.Common.isAssociativeArray(subset)
- isIgnoredFields = Rooibos.Common.isArray(ignoredFields)
- for each key in subset
- if (key <> "")
- if (not isIgnoredFields or not Rooibos.Common.arrayContains(ignoredFields, key))
- subsetValue = subset[key]
- arrayValue = array[key]
- if not Rooibos.Common.eqValues(arrayValue, subsetValue)
- msg = key + ": Expected '" + Rooibos.Common.asString(subsetValue) + "', got '" + Rooibos.Common.asString(arrayValue) + "'"
- m.currentResult.addResult(msg)
- return m.getLegacyCompatibleReturnValue(false)
- end if
- end if
- else
- ? "Found empty key!"
- end if
- end for
- else
- msg = "Input values are not an Associative Array."
-
- return m.getLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ Stubbing helpers
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name stub
- ' * @function
- ' * @instance
- ' * @description Creates a stub to replace a real method with
- ' * @param {Dynamic} target - object on which the method to be stubbed is found
- ' * @param {Dynamic} methodName - name of method to stub
- ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
- ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
- ' * @returns {Object} - stub that was wired into the real method
- ' */
- public function stub(target, methodName, returnValue = invalid, allowNonExistingMethods = false) as object
- if (type(target) <> "roAssociativeArray")
- m.fail("could not create Stub provided target was null")
- return {}
- end if
-
- if (m.stubs = invalid)
- m.__stubId = -1
- m.stubs = {}
- end if
- m.__stubId++
-
- if (m.__stubId > 5)
- ? "ERROR ONLY 6 STUBS PER TEST ARE SUPPORTED!!"
- return invalid
- end if
-
- id = stri(m.__stubId).trim()
-
- fake = m.createFake(id, target, methodName, 1, invalid, returnValue)
- m.stubs[id] = fake
- allowNonExisting = m.allowNonExistingMethodsOnMocks = true or allowNonExistingMethods
- isMethodPresent = type(target[methodName]) = "Function" or type(target[methodName]) = "roFunction"
- if (isMethodPresent or allowNonExisting)
- target[methodName] = m["StubCallback" + id]
- target.__stubs = m.stubs
-
- if (not isMethodPresent)
- ? "WARNING - stubbing call " ; methodName; " which did not exist on target object"
- end if
- else
- ? "ERROR - could not create Stub : method not found "; target ; "." ; methodName
- end if
-
- return fake
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name expectOnce
- ' * @function
- ' * @instance
- ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked the wrong number of times, or with wrong arguments, it will result in test failure
- ' * @param {Dynamic} target - object on which the method to be stubbed is found
- ' * @param {Dynamic} methodName - name of method to stub
- ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
- ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
- ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
- ' * @returns {Object} - mock that was wired into the real method
- ' */
- public function expectOnce(target, methodName, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- return m.mock(target, methodName, 1, expectedArgs, returnValue, allowNonExistingMethods)
- end function
-
- public function expectOnceWLN(lineNumber, target, methodName, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- return m.mock(target, methodName, 1, expectedArgs, returnValue, allowNonExistingMethods, lineNumber)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name expectOnceOrNone
- ' * @function
- ' * @instance
- ' * @description Toggles between expectOnce and expectNone, to allow for easy paremeterized expect behaviour
- ' * @param {Dynamic} target - object on which the method to be stubbed is found
- ' * @param {Dynamic} methodName - name of method to stub
- ' * @param {Dynamic} isExpected - if true, then this is the same as expectOnce, if false, then this is the same as expectNone
- ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
- ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
- ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
- ' * @returns {Object} - mock that was wired into the real method
- ' */
- public function expectOnceOrNone(target, methodName, isExpected, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- if isExpected
- return m.expectOnce(target, methodName, expectedArgs, returnValue, allowNonExistingMethods)
- else
- return m.expectNone(target, methodName, allowNonExistingMethods)
- end if
- end function
-
- public function expectOnceOrNoneWLN(lineNumber, target, methodName, isExpected, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- if isExpected
- return m.expectOnceWLN(lineNumber, target, methodName, expectedArgs, returnValue, allowNonExistingMethods)
- else
- return m.expectNoneWLN(lineNumber, target, methodName, allowNonExistingMethods)
- end if
- end function
-
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name expectNone
- ' * @function
- ' * @instance
- ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked, it will result in test failure
- ' * @param {Dynamic} target - object on which the method to be stubbed is found
- ' * @param {Dynamic} methodName - name of method to stub
- ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
- ' * @returns {Object} - mock that was wired into the real method
- ' */
- public function expectNone(target, methodName, allowNonExistingMethods = false) as object
- return m.mock(target, methodName, 0, invalid, invalid, allowNonExistingMethods)
- end function
-
- public function expectNoneWLN(lineNumber, target, methodName, allowNonExistingMethods = false) as object
- return m.mock(target, methodName, 0, invalid, invalid, allowNonExistingMethods, lineNumber)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name expect
- ' * @function
- ' * @instance
- ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked the wrong number of times, or with wrong arguments, it will result in test failure
- ' * @param {Dynamic} target - object on which the method to be stubbed is found
- ' * @param {Dynamic} methodName - name of method to stub
- ' * @param {Dynamic} [expectedInvocations=1] - number of invocations we expect
- ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
- ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
- ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
- ' * @returns {Object} - mock that was wired into the real method
- ' */
- public function expect(target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- return m.mock(target, methodName, expectedInvocations, expectedArgs, returnValue, allowNonExistingMethods)
- end function
-
- public function expectWLN(lineNumber, target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- return m.mock(target, methodName, expectedInvocations, expectedArgs, returnValue, allowNonExistingMethods, lineNumber)
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name mock
- ' * @function
- ' * @instance
- ' * @description Creates a stub to replace a real method with, which the framework will track. If it was invoked the wrong number of times, or with wrong arguments, it will result in test failure
- ' * @param {Dynamic} target - object on which the method to be stubbed is found
- ' * @param {Dynamic} methodName - name of method to stub
- ' * @param {Dynamic} expectedInvocations - number of invocations we expect
- ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
- ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
- ' * @param {boolean} [allowNonExistingMethods=false] - if true, then rooibos will only warn if the method did not exist prior to faking
- ' * @returns {Object} - mock that was wired into the real method
- ' */
- public function mock(target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false, lineNumber = -1) as object
- 'check params
- if not Rooibos.Common.isAssociativeArray(target)
- methodName = ""
- m.mockFail(lineNumber, "", "mock args: target was not an AA")
- else if not Rooibos.Common.isString(methodName)
- methodName = ""
- m.mockFail(lineNumber, "", "mock args: methodName was not a string")
- else if not Rooibos.Common.isNumber(expectedInvocations)
- m.mockFail(lineNumber, methodName, "mock args: expectedInvocations was not an int")
- else if not Rooibos.Common.isArray(expectedArgs) and Rooibos.Common.isValid(expectedArgs)
- m.mockFail(lineNumber, methodName, "mock args: expectedArgs was not invalid or an array of args")
- else if Rooibos.Common.isUndefined(expectedArgs)
- m.mockFail(lineNumber, methodName, "mock args: expectedArgs undefined")
- else if Rooibos.Common.isUndefined(returnValue)
- m.mockFail(lineNumber, methodName, "mock args: returnValue undefined")
- end if
-
- if m.currentResult.isFail
- ? "ERROR! Cannot create MOCK. method " ; methodName ;" " str(lineNumber) ; " "; m.currentResult.messages.peek()
- return {}
- end if
-
- if (m.mocks = invalid)
- m.__mockId = -1
- m.__mockTargetId = -1
- m.mocks = {}
- end if
-
- fake = invalid
- if not target.doesExist("__rooibosTargetId")
- m.__mockTargetId++
- target["__rooibosTargetId"] = m.__mockTargetId
- end if
- 'ascertain if mock already exists
- for i = 0 to m.__mockId
- id = stri(i).trim()
- mock = m.mocks[id]
- if mock <> invalid and mock.methodName = methodName and mock.target.__rooibosTargetId = target.__rooibosTargetId
- fake = mock
- fake.lineNumbers.push(lineNumber)
- exit for
- end if
- end for
- if fake = invalid
- m.__mockId++
- id = stri(m.__mockId).trim()
- if (m.__mockId > 25)
- ? "ERROR ONLY 25 MOCKS PER TEST ARE SUPPORTED!! you're on # " ; m.__mockId
- ? " Method was " ; methodName
- return invalid
- end if
-
- fake = m.createFake(id, target, methodName, expectedInvocations, expectedArgs, returnValue, lineNumber)
- m.mocks[id] = fake 'this will bind it to m
- allowNonExisting = m.allowNonExistingMethodsOnMocks = true or allowNonExistingMethods
- isMethodPresent = type(target[methodName]) = "Function" or type(target[methodName]) = "roFunction"
- if (isMethodPresent or allowNonExisting)
- target[methodName] = m["MockCallback" + id]
- target.__mocks = m.mocks
-
- if (not isMethodPresent)
- ? "WARNING - mocking call " ; methodName; " which did not exist on target object"
- end if
- else
- ? "ERROR - could not create Mock : method not found "; target ; "." ; methodName
- end if
- else
- m.combineFakes(fake, m.createFake(id, target, methodName, expectedInvocations, expectedArgs, returnValue, lineNumber))
- end if
- return fake
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name createFake
- ' * @function
- ' * @instance
- ' * @description Creates a stub to replace a real method with. This is used internally.
- ' * @param {Dynamic} target - object on which the method to be stubbed is found
- ' * @param {Dynamic} methodName - name of method to stub
- ' * @param {Dynamic} [expectedInvocations=1] - number of invocations we expect
- ' * @param {Dynamic} [expectedArgs=invalid] - array containing the arguments we expect the method to be invoked with
- ' * @param {Dynamic} [returnValue=invalid] - value that the stub method will return when invoked
- ' * @returns {Object} - stub that was wired into the real method
- ' */
- public function createFake(id, target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, lineNumber = -1) as object
- expectedArgsValues = []
- hasArgs = Rooibos.Common.isArray(expectedArgs)
- if (hasArgs)
- defaultValue = m.invalidValue
- else
- defaultValue = m.ignoreValue
- expectedArgs = []
- end if
- lineNumbers = [lineNumber]
-
- for i = 0 to 9
- if (hasArgs and expectedArgs.count() > i)
- 'guard against bad values
- value = expectedArgs[i]
- if not Rooibos.Common.isUndefined(value)
- if Rooibos.Common.isAssociativeArray(value) and Rooibos.Common.isValid(value.matcher)
- if not Rooibos.Common.isFunction(value.matcher)
- ? "[ERROR] you have specified a matching function; but it is not in scope!"
- expectedArgsValues.push("#ERR-OUT_OF_SCOPE_MATCHER!")
- else
- expectedArgsValues.push(expectedArgs[i])
- end if
- else
- expectedArgsValues.push(expectedArgs[i])
- end if
- else
- expectedArgsValues.push("#ERR-UNDEFINED!")
- end if
- else
- expectedArgsValues.push(defaultValue)
- end if
- end for
- fake = {
- id : id,
- target: target,
- methodName: methodName,
- returnValue: returnValue,
- lineNumbers: lineNumbers,
- isCalled: false,
- invocations: 0,
- invokedArgs: [invalid, invalid, invalid, invalid, invalid, invalid, invalid, invalid, invalid],
- expectedArgs: expectedArgsValues,
- expectedInvocations: expectedInvocations,
- callback: function(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- ' ? "FAKE CALLBACK CALLED FOR " ; m.methodName
- if (m.allInvokedArgs = invalid)
- m.allInvokedArgs = []
- end if
- m.invokedArgs = [arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9]
- m.allInvokedArgs.push ([arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9])
- m.isCalled = true
- m.invocations++
-
- if (type(m.returnValue) = "roAssociativeArray" and m.returnValue.doesExist("multiResult"))
- returnValues = m.returnValue["multiResult"]
- returnIndex = m.invocations - 1
-
- if (type(returnValues) = "roArray" and returnValues.count() > 0)
-
- if returnValues.count() <= m.invocations
- returnIndex = returnValues.count() - 1
- print "Multi return values all used up - repeating last value"
- end if
- return returnValues[returnIndex]
- else
- ? "Multi return value was specified; but no array of results were found"
- return invalid
- end if
- else
- return m.returnValue
- end if
- end function
- }
- return fake
- end function
-
- public function combineFakes(fake, otherFake)
- 'add on the expected invoked args
- if type(fake.expectedArgs) <> "roAssociativeArray" or not fake.expectedArgs.doesExist("multiInvoke")
- currentExpectedArgsArgs = fake.expectedArgs
- fake.expectedArgs = {
- "multiInvoke": [currentExpectedArgsArgs]
- }
- end if
- fake.expectedArgs.multiInvoke.push(otherFake.expectedArgs)
-
- 'add on the expected return values
- if type(fake.returnValue) <> "roAssociativeArray" or not fake.returnValue.doesExist("multiResult")
- currentReturnValue = fake.returnValue
- fake.returnValue = {
- "multiResult": [currentReturnValue]
- }
- end if
- fake.returnValue.multiResult.push(otherFake.returnValue)
- fake.lineNumbers.push(lineNumber)
- fake.expectedInvocations++
- end function
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name assertMocks
- ' * @function
- ' * @instance
- ' * @description Will check all mocks that have been created to ensure they were invoked the expected amount of times, with the expected args.
- ' */
- public function assertMocks() as void
- if (m.__mockId = invalid or not Rooibos.Common.isAssociativeArray(m.mocks))
- return
- end if
-
- lastId = int(m.__mockId)
- for each id in m.mocks
- mock = m.mocks[id]
- methodName = mock.methodName
- if (mock.expectedInvocations <> mock.invocations)
- m.mockFail(mock.lineNumbers[0], methodName, "Wrong number of calls. (" + stri(mock.invocations).trim() + " / " + stri(mock.expectedInvocations).trim() + ")")
- m.cleanMocks()
- return
- else if mock.expectedInvocations > 0 and (Rooibos.Common.isArray(mock.expectedArgs) or (type(mock.expectedArgs) = "roAssociativeArray" and Rooibos.Common.isArray(mock.expectedArgs.multiInvoke)))
- isMultiArgsSupported = type(mock.expectedArgs) = "roAssociativeArray" and Rooibos.Common.isArray(mock.expectedArgs.multiInvoke)
-
- for invocationIndex = 0 to mock.invocations - 1
- invokedArgs = mock.allInvokedArgs[invocationIndex]
- if isMultiArgsSupported
- expectedArgs = mock.expectedArgs.multiInvoke[invocationIndex]
- else
- expectedArgs = mock.expectedArgs
- end if
- for i = 0 to expectedArgs.count() - 1
- value = invokedArgs[i]
- expected = expectedArgs[i]
- didNotExpectArg = Rooibos.Common.isString(expected) and expected = m.invalidValue
- if (didNotExpectArg)
- expected = invalid
- end if
-
- isUsingMatcher = Rooibos.Common.isAssociativeArray(expected) and Rooibos.Common.isFunction(expected.matcher)
-
- if isUsingMatcher
- if not expected.matcher(value)
- m.mockFail(mock.lineNumbers[invocationIndex], methodName, "on Invocation #" + stri(invocationIndex).trim() + ", expected arg #" + stri(i).trim() + " to match matching function '" + Rooibos.Common.asString(expected.matcher) + "' got '" + Rooibos.Common.asString(value) + "')")
- m.cleanMocks()
- end if
- else
- if (not (Rooibos.Common.isString(expected) and expected = m.ignoreValue) and not Rooibos.Common.eqValues(value, expected))
- if (expected = invalid)
- expected = "[INVALID]"
- end if
-
- m.mockFail(mock.lineNumbers[invocationIndex], methodName, "on Invocation #" + stri(invocationIndex).trim() + ", expected arg #" + stri(i).trim() + " to be '" + Rooibos.Common.asString(expected) + "' got '" + Rooibos.Common.asString(value) + "')")
- m.cleanMocks()
- return
- end if
- end if
- end for
- end for
- end if
- end for
-
- m.cleanMocks()
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name cleanMocks
- ' * @function
- ' * @instance
- ' * @description Cleans up all tracking data associated with mocks
- ' */
- public function cleanMocks() as void
- if m.mocks = invalid then return
- for each id in m.mocks
- mock = m.mocks[id]
- mock.target.__mocks = invalid
- end for
- m.mocks = invalid
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name cleanStubs
- ' * @function
- ' * @instance
- ' * @description Cleans up all tracking data associated with stubs
- ' */
- public function cleanStubs() as void
- if m.stubs = invalid then return
- for each id in m.stubs
- stub = m.stubs[id]
- stub.target.__stubs = invalid
- end for
- m.stubs = invalid
- end function
-
-
- public function mockFail(lineNumber, methodName, message) as dynamic
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- m.currentResult.addMockResult(lineNumber, "mock failure on '" + methodName + "' : " + message)
- return m.getLegacyCompatibleReturnValue(false)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ Fake Stub callback functions - this is required to get scope
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- public function stubCallback0(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__Stubs["0"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function stubCallback1(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__Stubs["1"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function stubCallback2(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__Stubs["2"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
-
- public function stubCallback3(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__Stubs["3"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
-
- public function stubCallback4(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__Stubs["4"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
-
- public function stubCallback5(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__Stubs["5"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ Fake Mock callback functions - this is required to get scope
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- public function mockCallback0(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["0"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback1(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["1"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback2(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["2"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback3(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["3"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback4(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["4"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback5(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["5"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback6(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["6"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback7(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["7"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback8(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["8"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback9(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["9"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback10(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["10"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback11(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["11"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback12(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["12"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback13(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["13"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback14(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["14"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback15(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["15"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback16(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["16"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback17(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["17"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback18(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["18"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback19(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["19"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback20(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["20"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback21(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["21"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback22(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["22"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback23(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["23"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
- public function mockCallback24(arg1 = invalid, arg2 = invalid, arg3 = invalid, arg4 = invalid, arg5 = invalid, arg6 = invalid, arg7 = invalid, arg8 = invalid, arg9 = invalid)as dynamic
- fake = m.__mocks["24"]
- return fake.callback(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)
- end function
-
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ Utility functions!
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- '*************************************************************
- '** ripped and adapted from rodash - thanks @veeta!
- '** used by get method - consider thsis private
- '*************************************************************
- public function pathAsArray_(path)
- pathRE = CreateObject("roRegex", "\[([0-9]+)\]", "i")
- segments = []
- if type(path) = "String" or type(path) = "roString"
- dottedPath = pathRE.replaceAll(path, ".\1")
- stringSegments = dottedPath.tokenize(".")
- for each s in stringSegments
- if (Asc(s) >= 48) and (Asc(s) <= 57)
- segments.push(s.toInt())
- else
- segments.push(s)
- end if
- end for
- else if type(path) = "roList" or type(path) = "roArray"
- stringPath = ""
- for each s in path
- stringPath = stringPath + "." + Box(s).toStr()
- end for
- segments = m.pathAsArray_(stringPath)
- else
- segments = invalid
- end if
- return segments
- end function
-
- ' /**
- ' * @memberof module:BaseTestSuite
- ' * @name g
- ' * @function
- ' * @instance
- ' * @description ripped and adapted from rodash - thanks @veeta!
- ' * use this method to safely get anything. useful for when unit testing a collection
- ' * or something and you're not sure if it's gonna crash!
- ' * @param {Dynamic} aa - node, array or assoArray
- ' * @param {Dynamic} subset - the items to check for
- ' * @param {Dynamic} path -as string path to target field. Can use .0. or [0] index notation e.g. "children.0.title" or "children[0].title"
- ' * @returns {dynamic} - matched item, on aa at path
- ' */
-
- public function g(aa, path, default = invalid)
- if type(aa) <> "roAssociativeArray" and type(aa) <> "roArray" and type(aa) <> "roSGNode" then return default
- segments = m.pathAsArray_(path)
-
- if (Type(path) = "roInt" or Type(path) = "roInteger" or Type(path) = "Integer")
- path = stri(path).trim()
- end if
-
- if segments = invalid then return default
- result = invalid
-
- while segments.count() > 0
- key = segments.shift()
- if (type(key) = "roInteger") 'it's a valid index
- if (aa <> invalid and GetInterface(aa, "ifArray") <> invalid)
- value = aa[key]
- else if (aa <> invalid and GetInterface(aa, "ifSGNodeChildren") <> invalid)
- value = aa.getChild(key)
- else if (aa <> invalid and GetInterface(aa, "ifAssociativeArray") <> invalid)
- key = str(key)
- if not aa.doesExist(key)
- exit while
- end if
-
- value = aa.lookup(key)
- else
- value = invalid
- end if
- else
- if not aa.doesExist(key)
- exit while
- end if
-
- value = aa.lookup(key)
- end if
-
- if segments.count() = 0
- result = value
- exit while
- end if
-
- if type(value) <> "roAssociativeArray" and type(value) <> "roArray" and type(value) <> "roSGNode"
- exit while
- end if
- aa = value
- end while
-
- if result = invalid then return default
- return result
- end function
-
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- '++ crude async support
- '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
- ' /**
- ' * @member waitForField
- ' * @memberof module:TestUtils
- ' * @instance
- ' * @function
- ' * @description observeField doesn't work in regular unit tests, so we have to wait for the result. We can use this to wait for a network task, foe example, and pass the result directly to a handler. Note - we wait for the value TO CHANGE - so make sure that will be the case, or you'll get stuck forever :)
- ' * @param {any} target to observe
- ' * @param {string} field to observe
- ' * @param {int} delay for each wait
- ' * @param {int} max attempts
- ' */
- function waitForField(target, fieldName, delay = 500, maxAttempts = 10)
- attempts = 0
- if target = invalid
- return false
- end if
-
- initialValue = target[fieldName]
- while target[fieldName] = initialValue
- port = CreateObject("roMessagePort")
- wait(delay, port)
- attempts++
- if attempts = maxAttempts
- return false
- end if
- ? "waiting for signal field '" ; fieldName "' - " ; attempts
- end while
-
- return true
- end function
-
- public function assertAsyncField(target, fieldName, delay = 500, maxAttempts = 10)
- if m.currentResult.isFail then return m.getLegacyCompatibleReturnValue(false)
- if target = invalid
- m.fail("Target was invalid")
- end if
-
- result = m.waitForField(target, fieldName, delay, maxAttempts)
- if not result
- return m.fail("Timeout waiting for targetField " + fieldName + " to be set on target")
- end if
-
- m.currentResult.addResult("")
- return m.getLegacyCompatibleReturnValue(true)
- end function
-
- end class
-end namespace
\ No newline at end of file
diff --git a/src/source/Coverage.bs b/src/source/Coverage.bs
deleted file mode 100644
index 6b279112..00000000
--- a/src/source/Coverage.bs
+++ /dev/null
@@ -1,51 +0,0 @@
-namespace Rooibos.Coverage
-
- function createLCovOutput()
- ? "Generating lcov.info file..."
-
- cc = m.global._rbs_ccn
- expectedMap = cc.expectedMap
- filePathMap = cc.filePathMap
- resolvedMap = cc.resolvedMap
-
- buffer = ""
-
- for each module in filePathMap.items()
- moduleNumber = module.key
- filePath = module.value
- packageName = "."
-
- relativePath = filePath.replace("pkg:", packageName)
- sanitizedPath = relativePath.replace("\\", "/")
-
- buffer = buffer + "TN:" + chr(10)
- buffer = buffer + "SF:" + sanitizedPath + chr(10)
-
- for each expected in expectedMap[moduleNumber]
- lineNumber = expected[0]
- SHIFT = 1
-
- if (resolvedMap[moduleNumber] <> invalid) and resolvedMap[moduleNumber].doesExist(str(lineNumber)) then
- buffer = buffer + "DA:" + str(lineNumber + SHIFT) + ",1" + chr(10)
- else
- buffer = buffer + "DA:" + str(lineNumber + SHIFT) + ",0" + chr(10)
- end if
- end for
-
- buffer = buffer + "end_of_record" + chr(10)
- end for
- return buffer
- end function
-
- function printLCovInfo()
- ?
- ? "+++++++++++++++++++++++++++++++++++++++++++"
- ? "LCOV.INFO FILE"
- ? "+++++++++++++++++++++++++++++++++++++++++++"
- ?
- ? "+-=-coverage:start"
- ? Rooibos.Coverage.createLCovOutput()
- ? "+-=-coverage:end"
- end function
-
-end namespace
\ No newline at end of file
diff --git a/src/source/ItGroup.bs b/src/source/ItGroup.bs
deleted file mode 100644
index b20961cf..00000000
--- a/src/source/ItGroup.bs
+++ /dev/null
@@ -1,39 +0,0 @@
-namespace Rooibos.ItGroup
-
- function getTestCases(group) as object
- if (group.hasSoloTests = true)
- return group.soloTestCases
- else
- return group.testCases
- end if
- end function
-
- function getRunnableTestSuite(group) as object
- testCases = Rooibos.ItGroup.getTestCases(group)
-
- runnableSuite = new Rooibos.BaseTestSuite()
- runnableSuite.name = group.name
- runnableSuite.isLegacy = group.isLegacy = true
- if group.testCaseLookup = invalid
- group.testCaseLookup = {}
- end if
-
- for each testCase in testCases
- name = testCase.name
- if (testCase.isSolo = true)
- name = name + " [SOLO] "
- end if
- testFunction = Rooibos.Common.getFunction(group.filename, testCase.funcName)
- runnableSuite.addTest(name, testFunction, testCase.funcName)
- group.testCaseLookup[name] = testCase
- end for
-
- runnableSuite.SetUp = Rooibos.Common.getFunction(group.filename, group.setupFunctionName)
- runnableSuite.TearDown = Rooibos.Common.getFunction(group.filename, group.teardownFunctionName)
- runnableSuite.BeforeEach = Rooibos.Common.getFunction(group.filename, group.beforeEachFunctionName)
- runnableSuite.AfterEach = Rooibos.Common.getFunction(group.filename, group.afterEachFunctionName)
-
- return runnableSuite
- end function
-
-end namespace
\ No newline at end of file
diff --git a/src/source/ItemGenerator.bs b/src/source/ItemGenerator.bs
deleted file mode 100644
index 802d857b..00000000
--- a/src/source/ItemGenerator.bs
+++ /dev/null
@@ -1,211 +0,0 @@
-namespace Rooibos
- ' /**
- ' * @module ItemGenerator
- ' */
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name ItemGenerator
- ' * @function
- ' * @instance
- ' * @param {Dynamic} scheme - A scheme with desired object structure. Can be
- ' * any simple type, array of types or associative array in form
- ' *
- ' * ``` { propertyName1 : "propertyType1"
- ' * propertyName2 : "propertyType2"
- ' * ...
- ' * propertyNameN : "propertyTypeN" }
- ' * ```
- ' * @description Creates an ItemGenerator instance
- ' * @returns {Object} An object according to specified scheme or invalid, if scheme is not valid.
- ' */
- class ItemGenerator
-
- public function new()
- m.isValid = Rooibos.Common.isValid(scheme)
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetItem
- ' * @function
- ' * @instance
- ' * @param {Dynamic} scheme - A scheme with desired object structure. Can be
- ' * any simple type, array of types or associative array in form
- ' *
- ' * ``` { propertyName1 : "propertyType1"
- ' * propertyName2 : "propertyType2"
- ' * ...
- ' * propertyNameN : "propertyTypeN" }
- ' * ```
- ' * @description Gets an item according to the schem
- ' * @returns {Object} An object according to specified scheme or invalid if scheme is not one of simple type, array or associative array.
- ' */
- public function GetItem(scheme as object) as object
-
- item = invalid
-
- if Rooibos.Common.isAssociativeArray(scheme)
- item = m.getAssocArray(scheme)
- else if Rooibos.Common.isArray(scheme)
- item = m.getArray(scheme)
- else if Rooibos.Common.isString(scheme)
- item = m.getSimpleType(lCase(scheme))
- end if
-
- return item
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetAssocArray
- ' * @function
- ' * @instance
- ' * @param {Dynamic} scheme - A scheme with desired object structure. Can be
- ' * any simple type, array of types or associative array in form
- ' *
- ' * ``` { propertyName1 : "propertyType1"
- ' * propertyName2 : "propertyType2"
- ' * ...
- ' * propertyNameN : "propertyTypeN" }
- ' * ```
- ' * @description Generates associative array according to specified scheme.
- ' * @returns {Object} An associative array according to specified scheme.
- ' */
- public function GetAssocArray(scheme as object) as object
-
- item = {}
-
- for each key in scheme
- if not item.DoesExist(key)
- item[key] = m.getItem(scheme[key])
- end if
- end for
-
- return item
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetArray
- ' * @function
- ' * @instance
- ' * @param {Dynamic} An array with desired object types.
- ' *
- ' * ``` { propertyName1 : "propertyType1"
- ' * propertyName2 : "propertyType2"
- ' * ...
- ' * propertyNameN : "propertyTypeN" }
- ' * ```
- ' * @description Generates array according to specified scheme.
- ' * @returns {Object} An array according to specified scheme.
- ' */
- public function GetArray(scheme as object) as object
-
- item = []
-
- for each key in scheme
- item.Push(m.getItem(key))
- end for
-
- return item
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetSimpleType
- ' * @function
- ' * @instance
- ' * @description Generates random value of specified type
- ' * @param {Dynamic} typeStr - name of desired object type.
- ' * @returns {Object} A simple type object or invalid if type is not supported.
- ' */
- public function GetSimpleType(typeStr as string) as object
-
- item = invalid
-
- if typeStr = "integer" or typeStr = "int" or typeStr = "roint"
- item = m.getInteger()
- else if typeStr = "float" or typeStr = "rofloat"
- item = m.getFloat()
- else if typeStr = "string" or typeStr = "rostring"
- item = m.getString(10)
- else if typeStr = "boolean" or typeStr = "roboolean"
- item = m.getBoolean()
- end if
-
- return item
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetBoolean
- ' * @function
- ' * @instance
- ' * @description Generates random boolean value.
- ' * @returns {Boolean} A random boolean value.
- ' */
- public function GetBoolean() as boolean
- return Rooibos.Common.asBoolean(Rnd(2) \ Rnd(2))
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetInteger
- ' * @function
- ' * @instance
- ' * @description Generates random integer value from 1 to specified seed value.
- ' * @param {Dynamic} seed - seed value for Rnd function.
- ' * @returns {integer} A random integer value.
- ' */
- public function GetInteger(seed = 100) as integer
- return Rnd(seed)
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetFloat
- ' * @function
- ' * @instance
- ' * @description Generates random float value.
- ' * @returns {float} A random float value.
- ' */
- public function GetFloat() as float
- return Rnd(0)
- end function
-
- ' /**
- ' * @memberof module:ItemGenerator
- ' * @name GetString
- ' * @function
- ' * @instance
- ' * @description Generates random string with specified length.
- ' * @param {Dynamic} seed - A string length
- ' * @returns {string} A random string value or empty string if seed is 0.
- ' */
- public function GetString(seed as integer) as string
-
- item = ""
- if seed > 0
- stringLength = Rnd(seed)
-
- for i = 0 to stringLength
- chType = Rnd(3)
-
- if chType = 1 'Chr(48-57) - numbers
- chNumber = 47 + Rnd(10)
- else if chType = 2 'Chr(65-90) - Uppercase Letters
- chNumber = 64 + Rnd(26)
- else 'Chr(97-122) - Lowercase Letters
- chNumber = 96 + Rnd(26)
- end if
-
- item = item + Chr(chNumber)
- end for
- end if
-
- return item
- end function
-
- end class
-end namespace
\ No newline at end of file
diff --git a/src/source/NodeMixin.bs b/src/source/NodeMixin.bs
deleted file mode 100644
index c7e20c9d..00000000
--- a/src/source/NodeMixin.bs
+++ /dev/null
@@ -1,41 +0,0 @@
-namespace Rooibos
- ' /**
- ' * @memberof module:TestRunner
- ' * @name Rooibos_RunNodeTests
- ' * @function
- ' * @instance
- ' * @description interface hook for exeucting tests on nodes. This method is for internal use only. Only the Rooibos framework should invoke this method
- ' * @param {Dynamic} args - associated array, containing all the information required to execute the tests.
- ' * @returns {Object} test stats object, for merging into main test stats
- ' */
- function RunNodeTests(args) as object
- ? " RUNNING NODE TESTS"
- totalStatObj = Rooibos.Stats.CreateTotalStatistic()
-
- Rooibos.TestRunnerMixin.RunItGroups(args.metaTestSuite, totalStatObj, args.testUtilsDecoratorMethodName, args.config, args.runtimeConfig, m)
- return totalStatObj
- end function
-
- ' /**
- ' * @memberof module:TestRunner
- ' * @name CreateTestNode
- ' * @function
- ' * @instance
- ' * @description interface hook for correctly creating nodes that get tested. This ensures they are in the correct scope.
- ' * This method must be defined in your tests scene xml.
- ' * @param {String} nodeType - name of node to create. The framework will pass this in as required
- ' * @returns {Object} the required node, or invalid if it could not be invoked.
- ' */
- function CreateTestNode(nodeType) as object
- node = createObject("roSGNode", nodeType)
-
- if (type(node) = "roSGNode" and node.subType() = nodeType)
- m.top.AppendChild(node)
- return node
- else
- ? " Error creating test node of type " ; nodeType
- return invalid
- end if
- end function
-
-end namespace
\ No newline at end of file
diff --git a/src/source/Rooibos.bs b/src/source/Rooibos.bs
deleted file mode 100644
index 6862a28f..00000000
--- a/src/source/Rooibos.bs
+++ /dev/null
@@ -1,151 +0,0 @@
-' /**
-' * @module rooibos
-' */
-namespace Rooibos
- ' /**
- ' * @memberof module:rooibos
- ' * @name Rooibos_init
- ' * @function
- ' * @description Entry point for rooibos unit testing framework. Will identify, run, and report all tests in the app, before terminating the application.
- ' * @param {Dynamic} preTestSetup - called to do any initialization once the screen is created
- ' * Use this to configure anything such as globals, etc that you need
- ' * @param {Dynamic} testUtilsDecorator - will be invoked, with the test case as a param - the function
- ' * can then compose/decorate any additional functionality, as required
- ' * Use this to add things like, rodash, common test utils, etc
- ' * @param testsSceneName as string - name of scene to create. All unit tests run in the scene thread
- ' * and therefore require a screen and scene are created.
- ' * @param nodeContext as object - this is the global scope of your tests - so where anonymous methods will run from. This should be m
- ' */
- function init(preTestSetup = invalid, testUtilsDecoratorMethodName = invalid, testSceneName = invalid, nodeContext = invalid) as void
- args = {}
- if createObject("roAPPInfo").IsDev() <> true then
- ? " not running in dev mode! - rooibos tests only support sideloaded builds - aborting"
- return
- end if
-
- args.testUtilsDecoratorMethodName = testUtilsDecoratorMethodName
- args.nodeContext = nodeContext
-
- screen = CreateObject("roSGScreen")
- m.port = CreateObject("roMessagePort")
- screen.setMessagePort(m.port)
- if testSceneName = invalid
- testSceneName = "TestsScene"
- end if
- ? "Starting test using test scene with name TestsScene" ; testSceneName
- scene = screen.CreateScene(testSceneName)
- scene.id = "ROOT"
- screen.show()
-
- m.global = screen.getGlobalNode()
- m.global.addFields({ "testsScene": scene })
-
- if (preTestSetup <> invalid)
- preTestSetup(screen)
- end if
-
-
- testId = args.TestId
- if (testId = invalid)
- testId = "UNDEFINED_TEST_ID"
- end if
-
- ? "#########################################################################"
- ? "#TEST START : ###" ; testId ; "###"
-
- args.testScene = scene
- args.global = m.global
- rooibosVersion = "#ROOIBOS_VERSION#"
- requiredRooibosPreprocessorVersion = "1.0.0"
-
- if not Rooibos.Common.isFunction(RBSFM_getPreprocessorVersion)
- versionError = "You are using a rooibos-preprocessor (i.e. rooibos-cli) version older than 1.0.0 - please update to " + requiredRooibosPreprocessorVersion
- else
- 'bs:disable-next-line
- if Rooibos.versionCompare(RBSFM_getPreprocessorVersion(), requiredRooibosPreprocessorVersion) >= 0
- versionError = ""
- else
- 'bs:disable-next-line
- versionError = "Your rooibos-preprocessor (i.e. rooibos-cli) version '" + RBSFM_getPreprocessorVersion() + "' is not compatible with rooibos version " + rooibosVersion + ". Please upgrade your rooibos-cli to version " + requiredRooibosPreprocessorVersion
- end if
- end if
-
- if versionError = ""
- ? "######################################################"
- ? ""
- ? "# rooibos framework version: " ; rooibosVersion
- 'bs:disable-next-line
- ? "# tests parsed with rooibosC version: " ; RBSFM_getPreprocessorVersion()
- ? "######################################################"
- ? ""
-
- if scene.hasField("isReadyToStartTests") and scene.isReadyToStartTests = false
- ? "The scene is not ready yet - waiting for it to set isReadyToStartTests to true"
- scene.observeField("isReadyToStartTests", m.port)
-
- else
- ? "scene is ready; running tests now"
- runner = new Rooibos.TestRunner(args)
- runner.Run()
- end if
-
- while(true)
- msg = wait(0, m.port)
- msgType = type(msg)
- if msgType = "roSGScreenEvent"
- if msg.isScreenClosed()
- return
- end if
- else if msgType = "roSGNodeEvent"
-
- if msg.getField() = "isReadyToStartTests" and msg.getData() = true
- ? "scene is ready; running tests now"
- runner = new Rooibos.TestRunner(args)
- runner.Run()
- end if
- end if
- end while
- else
- ? ""
- ? "#########################################################"
- ? "ERROR - VERSION MISMATCH"
- ? versionError
- ? "#########################################################"
- end if
- end function
-
- function versionCompare(v1, v2)
- v1parts = v1.split(".")
- v2parts = v2.split(".")
-
- while v1parts.count() < v2parts.count()
- v1parts.push("0")
- end while
-
- while v2parts.count() < v1parts.count()
- v2parts.push("0")
- end while
-
- for i = 0 to v1parts.count() - 1
- if (v2parts.count() = i)
- return 1
- end if
-
- if (v1parts[i] <> v2parts[i])
- if (v1parts[i] > v2parts[i])
- return 1
- else
- return -1
- end if
- end if
- end for
-
- if (v1parts.count() <> v2parts.count())
- return -1
- end if
-
- return 0
-
- end function
-
-end namespace
\ No newline at end of file
diff --git a/src/source/RuntimeConfig.bs b/src/source/RuntimeConfig.bs
deleted file mode 100644
index 9cf1747e..00000000
--- a/src/source/RuntimeConfig.bs
+++ /dev/null
@@ -1,39 +0,0 @@
-namespace Rooibos
- class UnitTestRuntimeConfig
-
- public hasSoloSuites = false
- public hasSoloGroups = false
- public hasSoloTests = false
-
- public function new()
- m.suites = m.CreateSuites()
- end function
-
- public function createSuites()
- 'bs:disable-next-line
- suites = RBSFM_getTestSuitesForProject()
- includedSuites = []
- for i = 0 to suites.count() - 1
- suite = suites[i]
- if (suite.valid)
- if (suite.isSolo)
- m.hasSoloSuites = true
- end if
- if (suite.hasSoloTests = true)
- m.hasSoloTests = true
- end if
- if (suite.hasSoloGroups = true)
- m.hasSoloGroups = true
- end if
- ' ? "valid - suite"
- includedSuites.push(suite)
- else
- ? "ERROR! suite was not valid - ignoring"
- end if
-
- end for
- return includedSuites
- end function
-
- end class
-end namespace
\ No newline at end of file
diff --git a/src/source/Stats.bs b/src/source/Stats.bs
deleted file mode 100644
index 0b41a313..00000000
--- a/src/source/Stats.bs
+++ /dev/null
@@ -1,162 +0,0 @@
-namespace Rooibos.Stats
-
- '----------------------------------------------------------------
- ' Create an empty statistic object for totals in output log.
- '
- ' @return An empty statistic object.
- '----------------------------------------------------------------
- function createTotalStatistic() as object
- statTotalItem = {
- Suites: []
- Time: 0
- Total: 0
- Correct: 0
- Fail: 0
- Ignored: 0
- Crash: 0
- IgnoredTestNames: []
- }
-
- return statTotalItem
- end function
-
- '*************************************************************
- '** Rooibos.Stats_MergeTotalStatistic
- '** merges the stats from stat2 onto stat1
- '** @param param as ObjectP paramdesc
- '** @return ObjectR retdesc
- '*************************************************************
- function mergeTotalStatistic(stat1, stat2) as void
- for each suite in stat2.Suites
- stat1.Suites.push(suite)
- end for
-
- stat1.time = stat1.Time + stat2.Time
- stat1.total = stat1.Total + stat2.Total
- stat1.correct = stat1.Correct + stat2.Correct
- stat1.fail = stat1.Fail + stat2.Fail
- stat1.crash = stat1.Crash + stat2.Crash
- stat1.ignored = stat1.Ignored + stat2.Ignored
- stat1.ignoredTestNames.append(stat2.IgnoredTestNames)
- end function
-
- '----------------------------------------------------------------
- ' Create an empty statistic object for test suite with specified name.
- '
- ' @param name (string) A test suite name for statistic object.
- '
- ' @return An empty statistic object for test suite.
- '----------------------------------------------------------------
- function createSuiteStatistic(name as string) as object
- statSuiteItem = {
- name: name
- tests: []
- time: 0
- total: 0
- correct: 0
- fail: 0
- crash: 0
- ignored: 0
- ignoredTestNames: []
- }
-
- return statSuiteItem
- end function
-
- '----------------------------------------------------------------
- ' Create statistic object for test with specified name.
- '
- ' @param name (string) A test name.
- ' @param result (string) A result of test running.
- ' Posible values: "Success", "Fail".
- ' Default value: "Success"
- ' @param time (integer) A test running time.
- ' Default value: 0
- ' @param errorCode (integer) An error code for failed test.
- ' Posible values:
- ' 252 (&hFC) : ERR_NORMAL_END
- ' 226 (&hE2) : ERR_VALUE_RETURN
- ' 233 (&hE9) : ERR_USE_OF_UNINIT_VAR
- ' 020 (&h14) : ERR_DIV_ZERO
- ' 024 (&h18) : ERR_TM
- ' 244 (&hF4) : ERR_RO2
- ' 236 (&hEC) : ERR_RO4
- ' 002 (&h02) : ERR_SYNTAX
- ' 241 (&hF1) : ERR_WRONG_NUM_PARAM
- ' Default value: 0
- ' @param errorMessage (string) An error message for failed test.
- '
- ' @return A statistic object for test.
- '----------------------------------------------------------------
- function createTestStatistic(name, result = "Success", time = 0, errorCode = 0, errorMessage = "") as object
- statTestItem = {
- name: name
- result: result
- time: time
- error: {
- code: errorCode
- message: errorMessage
- }
- }
-
- return statTestItem
- end function
-
- '----------------------------------------------------------------
- ' Append test statistic to test suite statistic.
- '
- ' @param statSuiteObj (object) A target test suite object.
- ' @param statTestObj (object) A test statistic to append.
- '----------------------------------------------------------------
- sub AppendTestStatistic(statSuiteObj as object, statTestObj as object)
- if Rooibos.Common.IsAssociativeArray(statSuiteObj) and Rooibos.Common.IsAssociativeArray(statTestObj)
- statSuiteObj.Tests.Push(statTestObj)
-
- if Rooibos.Common.IsInteger(statTestObj.time)
- statSuiteObj.Time = statSuiteObj.Time + statTestObj.Time
- end if
-
- statSuiteObj.Total = statSuiteObj.Total + 1
-
- if lCase(statTestObj.Result) = "success"
- statSuiteObj.Correct = statSuiteObj.Correct + 1
- else if lCase(statTestObj.result) = "fail"
- statSuiteObj.Fail = statSuiteObj.Fail + 1
- else
- statSuiteObj.crash = statSuiteObj.crash + 1
- end if
-
- end if
- end sub
-
- '----------------------------------------------------------------
- ' Append suite statistic to total statistic object.
- '
- ' @param statTotalObj (object) A target total statistic object.
- ' @param statSuiteObj (object) A test suite statistic object to append.
- '----------------------------------------------------------------
- sub AppendSuiteStatistic(statTotalObj as object, statSuiteObj as object)
- if Rooibos.Common.IsAssociativeArray(statTotalObj) and Rooibos.Common.IsAssociativeArray(statSuiteObj)
- statTotalObj.Suites.Push(statSuiteObj)
- statTotalObj.Time = statTotalObj.Time + statSuiteObj.Time
-
- if Rooibos.Common.IsInteger(statSuiteObj.Total)
- statTotalObj.Total = statTotalObj.Total + statSuiteObj.Total
- end if
-
- if Rooibos.Common.IsInteger(statSuiteObj.Correct)
- statTotalObj.Correct = statTotalObj.Correct + statSuiteObj.Correct
- end if
-
- if Rooibos.Common.IsInteger(statSuiteObj.Fail)
- statTotalObj.Fail = statTotalObj.Fail + statSuiteObj.Fail
- end if
-
- if Rooibos.Common.IsInteger(statSuiteObj.Crash)
- statTotalObj.Crash = statTotalObj.Crash + statSuiteObj.Crash
- end if
-
- end if
- end sub
-
-end namespace
\ No newline at end of file
diff --git a/src/source/TestCase.bs b/src/source/TestCase.bs
deleted file mode 100644
index 95916e05..00000000
--- a/src/source/TestCase.bs
+++ /dev/null
@@ -1,38 +0,0 @@
-namespace Rooibos
- class UnitTestCase
-
- public isSolo
- public func
- public funcName
- public isIgnored
- public name
- public lineNumber
- public paramLineNumber
- public assertIndex = 0
- 'Map with which the testsuite processor can take the index of a an assert line, and map it to the line Number
- public assertLineNumberMap = {}
- public getTestLineIndex = 0
- public rawParams
- public paramTestIndex
- public isParamTest = false
- public time = 0
-
- public function new(name as string, func as dynamic, funcName as string, isSolo as boolean, isIgnored as boolean, lineNumber as integer, params = invalid, paramTestIndex = 0, paramLineNumber = 0)
- m.isSolo = isSolo
- m.func = func
- m.funcName = funcName
- m.isIgnored = isIgnored
- m.name = name
- m.lineNumber = lineNumber
- m.paramLineNumber = paramLineNumber
- m.rawParams = params
- m.paramTestIndex = paramTestIndex
-
- if (params <> invalid)
- m.name = m.name + stri(m.paramTestIndex)
- end if
-
- return this
- end function
- end class
-end namespace
\ No newline at end of file
diff --git a/src/source/TestLogger.bs b/src/source/TestLogger.bs
deleted file mode 100644
index 447ebc5f..00000000
--- a/src/source/TestLogger.bs
+++ /dev/null
@@ -1,230 +0,0 @@
-namespace Rooibos
- class Logger
-
- public function new(config)
- m.config = config
-
- m.verbosityLevel = {
- basic: 0
- normal: 1
- verbose: 2
- }
-
- m.verbosity = m.config.logLevel
- end function
-
- '----------------------------------------------------------------
- ' Print statistic object with specified verbosity.
- '
- ' @param statObj (object) A statistic object to print.
- '----------------------------------------------------------------
- public sub printStatistic(statObj as object)
- m.PrintStart()
- previousfile = invalid
-
- for each testSuite in statObj.Suites
- if (not statObj.testRunHasFailures or ((not m.config.showOnlyFailures) or testSuite.fail > 0 or testSuite.crash > 0))
- if (testSuite.metaTestSuite.filePath <> previousfile)
- m.PrintMetaSuiteStart(testSuite.metaTestSuite)
- previousfile = testSuite.metaTestSuite.filePath
- end if
- m.PrintSuiteStatistic(testSuite, statObj.testRunHasFailures)
- end if
- end for
-
- ? ""
- m.PrintEnd()
- 'bs:disable-next-line
- ignoredInfo = RBSFM_getIgnoredTestInfo()
- ? "Total = "; Rooibos.Common.AsString(statObj.Total); " ; Passed = "; statObj.Correct; " ; Failed = "; statObj.Fail; " ; Ignored = "; ignoredInfo.count
- ? " Time spent: "; statObj.Time; "ms"
- ? ""
- ? ""
- if (ignoredInfo.count > 0)
- ? "IGNORED TESTS:"
- for each ignoredItemName in ignoredInfo.items
- print ignoredItemName
- end for
- end if
-
- if (statObj.ignored > 0)
- ? "IGNORED TESTS:"
- for each ignoredItemName in statObj.IgnoredTestNames
- print ignoredItemName
- end for
- end if
-
- if (statObj.Total = statObj.Correct)
- overrallResult = "Success"
- else
- overrallResult = "Fail"
- end if
- ? "RESULT: "; overrallResult
-
- end sub
-
- '----------------------------------------------------------------
- ' Print test suite statistic.
- '
- ' @param statSuiteObj (object) A target test suite object to print.
- '----------------------------------------------------------------
- public sub printSuiteStatistic(statSuiteObj as object, hasFailures)
- m.PrintSuiteStart(statSuiteObj.Name)
-
- for each testCase in statSuiteObj.Tests
- if (not hasFailures or ((not m.config.showOnlyFailures) or testCase.Result <> "Success"))
- m.PrintTestStatistic(testCase)
- end if
- end for
-
- ? " |"
- end sub
-
- public sub printTestStatistic(testCase as object)
- metaTestCase = testCase.metaTestCase
-
- if (LCase(testCase.Result) <> "success")
- testChar = "-"
- if metaTestCase.testResult.failedMockLineNumber > -1
- lineNumber = metaTestCase.testResult.failedMockLineNumber
- else
- assertIndex = metaTestCase.testResult.failedAssertIndex
- lineNumber = Rooibos.Common.getAssertLine(metaTestCase, assertIndex)
- end if
- if lineNumber <> invalid
- locationLine = StrI(lineNumber).trim()
- else
- locationLine = StrI(metaTestCase.lineNumber).trim()
- end if
-
- else
- testChar = "|"
- locationLine = StrI(metaTestCase.lineNumber).trim()
- end if
- locationText = "pkg:/" + testCase.filePath.trim() + "(" + locationLine + ")"
-
- if m.config.printTestTimes = true
- timeText = " (" + stri(metaTestCase.time).trim() + "ms)"
- else
- timeText = ""
- end if
-
- insetText = ""
- if (metaTestcase.isParamTest <> true)
- messageLine = Rooibos.Common.fillText(" " + testChar + " |--" + metaTestCase.Name + " : ", ".", 80)
- ? messageLine ; testCase.Result ; timeText
- else if (metaTestcase.paramTestIndex = 0)
- name = metaTestCase.Name
- if (len(name) > 1 and right(name, 1) = "0")
- name = left(name, len(name) - 1)
- end if
- ? " " + testChar + " |--" + name + " : "
- end if
-
- if (metaTestcase.isParamTest = true)
- insetText = " "
-
- if type(metaTestCase.rawParams) = "roAssociativeArray"
- rawParams = {}
- for each key in metaTestCase.rawParams
- if type(metaTestCase.rawParams[key]) <> "Function" and type(metaTestCase.rawParams[key]) <> "roFunction"
- rawParams[key] = metaTestCase.rawParams[key]
- end if
- end for
- else
- rawParams = metaTestCase.rawParams
- end if
- messageLine = Rooibos.Common.fillText(" " + testChar + insetText + " |--" + formatJson(rawParams) + " : ", ".", 80)
- ? messageLine ; testCase.Result ; timeText
- end if
-
- if LCase(testCase.Result) <> "success"
- ? " | "; insettext ;" |--Location: "; locationText
- if (metaTestcase.isParamTest = true)
- ? " | "; insettext ;" |--Param Line: "; StrI(metaTestCase.paramlineNumber).trim()
- end if
- ? " | "; insettext ;" |--Error Message: "; testCase.Error.Message
- end if
- end sub
-
- '----------------------------------------------------------------
- ' Print testting start message.
- '----------------------------------------------------------------
- public sub printStart()
- ? ""
- ? "[START TEST REPORT]"
- ? ""
- end sub
-
- '----------------------------------------------------------------
- ' Print testing end message.
- '----------------------------------------------------------------
- public sub printEnd()
- ? ""
- ? "[END TEST REPORT]"
- ? ""
- end sub
-
- '----------------------------------------------------------------
- ' Print test suite SetUp message.
- '----------------------------------------------------------------
- public sub printSuiteSetUp(sName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "================================================================="
- ? "=== SetUp "; sName; " suite."
- ? "================================================================="
- end if
- end sub
-
-
- '----------------------------------------------------------------
- ' Print test suite start message.
- '----------------------------------------------------------------
-
- public sub printMetaSuiteStart(metaTestSuite)
- ? metaTestSuite.name; " " ; "pkg:/" ; metaTestSuite.filePath + "(1)"
- end sub
-
- '----------------------------------------------------------------
- ' Print '@It group start message.
- '----------------------------------------------------------------
- public sub printSuiteStart(sName as string)
- ' ? "It "; sName
- ? " |-" ; sName
- ' ? ""
- end sub
-
- '----------------------------------------------------------------
- ' Print test suite TearDown message.
- '----------------------------------------------------------------
- public sub printSuiteTearDown(sName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "================================================================="
- ? "=== TearDown "; sName; " suite."
- ? "================================================================="
- end if
- end sub
-
- '----------------------------------------------------------------
- ' Print test setUp message.
- '----------------------------------------------------------------
- public sub printTestSetUp(tName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "----------------------------------------------------------------"
- ? "--- SetUp "; tName; " test."
- ? "----------------------------------------------------------------"
- end if
- end sub
-
- '----------------------------------------------------------------
- ' Print test TearDown message.
- '----------------------------------------------------------------
- public sub printTestTearDown(tName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "----------------------------------------------------------------"
- ? "--- TearDown "; tName; " test."
- ? "----------------------------------------------------------------"
- end if
- end sub
- end class
-end namespace
diff --git a/src/source/TestRunner.bs b/src/source/TestRunner.bs
deleted file mode 100644
index 448264c0..00000000
--- a/src/source/TestRunner.bs
+++ /dev/null
@@ -1,360 +0,0 @@
-namespace Rooibos
- ' /**
- ' * @module TestRunner
- ' */
-
- ' /**
- ' * @memberof module:TestRunner
- ' * @name Rooibos_TestRunner
- ' * @function
- ' * @description Creates an instance of the test runner
- ' * @param {Dynamic} args - contains the application launch args, and other settings required for test execution
- ' */
- class TestRunner
- private RunItGroups = Rooibos_TestRunnerMixin_RunItGroups
- private RunTestCases = Rooibos_TestRunnerMixin_RunTestCases
-
- public function new(args = {})
- m.testScene = args.testScene
- m.nodeContext = args.nodeContext
-
- 'bs:disable-next-line
- config = RBSFM_getRuntimeConfig()
- if (config = invalid or not Rooibos.Common.isAssociativeArray(config))
- ? "WARNING : specified config is invalid - using default"
- config = {
- showOnlyFailures: false
- failFast: false
- }
- end if
-
- 'mix in parsed in args
- if (args.showOnlyFailures <> invalid)
- config.showOnlyFailures = args.showOnlyFailures = "true"
- end if
-
- if (args.failFast <> invalid)
- config.failFast = args.failFast = "true"
- end if
-
- m.testUtilsDecoratorMethodName = args.testUtilsDecoratorMethodName
- m.config = config
-
- ' Internal properties
- m.config.testsDirectory = config.testsDirectory
-
- m.logger = new Rooibos.Logger(m.config)
- m.global = args.global
- end function
-
- ' /**
- ' * @memberof module:TestRunner
- ' * @name Run
- ' * @function
- ' * @instance
- ' * @description Executes all tests for a project, as per the config
- ' */
- public sub run()
- if type(RBSFM_getTestSuitesForProject) <> "Function"
- ? " ERROR! RBSFM_getTestSuitesForProject is not found! That looks like you didn't run the preprocessor as part of your test process. Please refer to the docs."
- return
- end if
-
- totalStatObj = Rooibos.Stats.createTotalStatistic()
- m.runtimeConfig = new Rooibos.UnitTestRuntimeConfig()
- m.runtimeConfig.global = m.global
- totalStatObj.testRunHasFailures = false
-
- for each metaTestSuite in m.runtimeConfig.suites
- if (m.runtimeConfig.hasSoloTests = true)
- if (metaTestSuite.hasSoloTests <> true)
- if (m.config.logLevel = 2)
- ? "TestSuite " ; metaTestSuite.name ; " Is filtered because it has no solo tests"
- end if
- goto skipSuite
- end if
- else if (m.runtimeConfig.hasSoloSuites)
- if (metaTestSuite.isSolo <> true)
- if (m.config.logLevel = 2)
- ? "TestSuite " ; metaTestSuite.name ; " Is filtered due to solo flag"
- end if
- goto skipSuite
- end if
- end if
-
- if (metaTestSuite.isIgnored = true)
- if (m.config.logLevel = 2)
- ? "Ignoring TestSuite " ; metaTestSuite.name ; " Due to Ignore flag"
- end if
- totalstatobj.ignored++
- totalStatObj.IgnoredTestNames.push("|-" + metaTestSuite.name + " [WHOLE SUITE]")
-
- goto skipSuite
- end if
- ? ""
- ? Rooibos.Common.fillText("> SUITE: " + metaTestSuite.name, ">", 80)
-
- if (metaTestSuite.isNodeTest = true and metaTestSuite.nodeTestFileName <> "")
- ? " +++++RUNNING NODE TEST"
- nodeType = metaTestSuite.nodeTestFileName
- ? " node type is " ; nodeType
-
- node = m.testScene.CallFunc("Rooibos_CreateTestNode", nodeType)
-
- if (type(node) = "roSGNode" and node.subType() = nodeType)
- args = {
- "metaTestSuite": metaTestSuite
- "testUtilsDecoratorMethodName": m.testUtilsDecoratorMethodName
- "config": m.config
- "runtimeConfig": m.runtimeConfig
- }
- nodeStatResults = node.callFunc("Rooibos_RunNodeTests", args)
- if nodeStatResults <> invalid
- Rooibos.Stats.mergeTotalStatistic(totalStatObj, nodeStatResults)
- else
- ? " ERROR! The node "; nodeType; " did not return stats from the Rooibos_RunNodeTests method. This usually means you are not importing rooibosDist.brs, or rooibosFunctionMap.brs. Please refer to : https://github.com/georgejecook/rooibos/blob/master/docs/index.md#testing-scenegraph-nodes"
- end if
- m.testScene.RemoveChild(node)
-
- else
- ? " ERROR!! - could not create node required to execute tests for " ; metaTestSuite.name
- ? " Node of type " ; nodeType ; " was not found/could not be instantiated"
- end if
- else
- if (metaTestSuite.hasIgnoredTests)
- totalStatObj.IgnoredTestNames.push("|-" + metaTestSuite.name)
- end if
- m.RunItGroups(metaTestSuite, totalStatObj, m.testUtilsDecoratorMethodName, m.config, m.runtimeConfig, m.nodeContext)
- end if
- skipSuite:
- end for
- m.logger.PrintStatistic(totalStatObj)
-
- if Rooibos.Common.isFunction(RBS_ReportCodeCoverage)
- 'bs:disable-next-line
- RBS_ReportCodeCoverage()
-
- if m.config.printLcov = true
- Rooibos.Coverage.printLCovInfo()
- end if
- end if
- m.sendHomeKeypress()
- end sub
-
-
- public sub sendHomeKeypress()
- ut = CreateObject("roUrlTransfer")
- ut.SetUrl("http://localhost:8060/keypress/Home")
- ut.PostFromString("")
- end sub
-
- end class
-end namespace
-
-'TODO convert to namespace when Bron fixes bug that does not allow ns resoluiton on assignment
-' namespace Rooibos.TestRunnerMixin
-
-sub Rooibos_TestRunnerMixin_RunItGroups(metaTestSuite, totalStatObj, testUtilsDecoratorMethodName, config, runtimeConfig, nodeContext = invalid)
- if (testUtilsDecoratorMethodName <> invalid)
- testUtilsDecorator = Rooibos.Common.getFunctionBruteForce(testUtilsDecoratorMethodName)
- if (not Rooibos.Common.isFunction(testUtilsDecorator))
- ? "[ERROR] Test utils decorator method `" ; testUtilsDecoratorMethodName ;"` was not in scope! for testSuite: " + metaTestSuite.name
- end if
- end if
-
- for each itGroup in metaTestSuite.itGroups
- testSuite = Rooibos.ItGroup.GetRunnableTestSuite(itGroup)
- if (nodeContext <> invalid)
- testSuite.node = nodeContext
- testSuite.global = nodeContext.global
- testSuite.top = nodeContext.top
- end if
-
- if (Rooibos.Common.isFunction(testUtilsDecorator))
- testUtilsDecorator(testSuite)
- end if
-
- totalStatObj.Ignored = totalStatObj.Ignored + itGroup.ignoredTestCases.count()
-
- if (itGroup.isIgnored = true)
- if (config.logLevel = 2)
- ? "Ignoring itGroup " ; itGroup.name ; " Due to Ignore flag"
- end if
- totalStatObj.ignored = totalStatObj.ignored + itGroup.testCases.count()
- totalStatObj.IgnoredTestNames.push(" |-" + itGroup.name + " [WHOLE GROUP]")
- goto skipItGroup
- else
- if (itGroup.ignoredTestCases.count() > 0)
- totalStatObj.IgnoredTestNames.push(" |-" + itGroup.name)
- totalStatObj.ignored = totalStatObj.ignored + itGroup.ignoredTestCases.count()
- for each testCase in itGroup.ignoredTestCases
- if (testcase.isParamTest <> true)
- totalStatObj.IgnoredTestNames.push(" | |--" + testCase.name)
- else if (testcase.paramTestIndex = 0)
- testCaseName = testCase.Name
- if (len(testCaseName) > 1 and right(testCaseName, 1) = "0")
- testCaseName = left(testCaseName, len(testCaseName) - 1)
- end if
- totalStatObj.IgnoredTestNames.push(" | |--" + testCaseName)
- end if
- end for
- end if
- end if
-
- if (runtimeConfig.hasSoloTests)
- if (itGroup.hasSoloTests <> true)
- if (config.logLevel = 2)
- ? "Ignoring itGroup " ; itGroup.name ; " Because it has no solo tests"
- end if
- goto skipItGroup
- end if
- else if (runtimeConfig.hasSoloGroups)
- if (itGroup.isSolo <> true)
- goto skipItGroup
- end if
- end if
-
- if (testSuite.testCases.Count() = 0)
- if (config.logLevel = 2)
- ? "Ignoring TestSuite " ; itGroup.name ; " - NO TEST CASES"
- end if
- goto skipItGroup
- end if
- ? ""
- ? Rooibos.Common.fillText("> GROUP: " + itGroup.name, ">", 80)
-
- if Rooibos.Common.isFunction(testSuite.SetUp)
- testSuite.SetUp()
- end if
-
- Rooibos_TestRunnerMixin_RunTestCases(metaTestSuite, itGroup, testSuite, totalStatObj, config, runtimeConfig)
-
- if Rooibos.Common.isFunction(testSuite.TearDown)
- testSuite.TearDown()
- end if
-
- if (totalStatObj.testRunHasFailures = true and config.failFast = true)
- exit for
- end if
- skipItGroup:
- end for
-end sub
-
-sub Rooibos_TestRunnerMixin_RunTestCases(metaTestSuite, itGroup, testSuite, totalStatObj, config, runtimeConfig)
- suiteStatObj = Rooibos.Stats.createSuiteStatistic(itGroup.Name)
- testSuite.global = runtimeConfig.global
-
- for each testCase in testSuite.testCases
- metaTestCase = itGroup.testCaseLookup[testCase.Name]
- metaTestCase.time = 0
- if (runtimeConfig.hasSoloTests and not metaTestCase.isSolo)
- goto skipTestCase
- end if
- ? ""
- ? Rooibos.Common.fillText("> TEST: " + testCase.Name + " ", ">", 80)
-
- if Rooibos.Common.isFunction(testSuite.beforeEach)
- testSuite.beforeEach()
- end if
-
- testTimer = CreateObject("roTimespan")
- testCaseTimer = CreateObject("roTimespan")
- testStatObj = Rooibos.Stats.createTestStatistic(testCase.Name)
- testSuite.testCase = testCase.Func
- testStatObj.filePath = metaTestSuite.filePath
- testStatObj.metaTestCase = metaTestCase
- testSuite.currentResult = new Rooibos.UnitTestResult()
-
- testStatObj.metaTestCase.testResult = testSuite.currentResult
-
- if (metaTestCase.isParamsValid)
- if (metaTestCase.isParamTest)
- testCaseParams = []
- for paramIndex = 0 to metaTestCase.rawParams.count()
- paramValue = metaTestCase.rawParams[paramIndex]
- if type(paramValue) = "roString" and len(paramValue) >= 8 and left(paramValue, 8) = "#RBSNode"
- nodeType = "ContentNode"
- paramDirectiveArgs = paramValue.split("|")
- if paramDirectiveArgs.count() > 1
- nodeType = paramDirectiveArgs[1]
- end if
- paramValue = createObject("roSGNode", nodeType)
- end if
- testCaseParams.push(paramValue)
- end for
- testCaseTimer.mark()
- 'up to 10 param args supported for now
- if (metaTestCase.expectedNumberOfParams = 1)
- testSuite.testCase(testCaseParams[0])
- else if (metaTestCase.expectedNumberOfParams = 2)
- testSuite.testCase(testCaseParams[0], testCaseParams[1])
- else if (metaTestCase.expectedNumberOfParams = 3)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2])
- else if (metaTestCase.expectedNumberOfParams = 4)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3])
- else if (metaTestCase.expectedNumberOfParams = 5)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4])
- else if (metaTestCase.expectedNumberOfParams = 6)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4], testCaseParams[5])
- else if (metaTestCase.expectedNumberOfParams = 7)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4], testCaseParams[5], testCaseParams[6])
- else if (metaTestCase.expectedNumberOfParams = 8)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4], testCaseParams[5], testCaseParams[6], testCaseParams[7])
- else if (metaTestCase.expectedNumberOfParams = 9)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4], testCaseParams[5], testCaseParams[6], testCaseParams[7], testCaseParams[8])
- else if (metaTestCase.expectedNumberOfParams = 10)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4], testCaseParams[5], testCaseParams[6], testCaseParams[7], testCaseParams[8], testCaseParams[9])
- else if (metaTestCase.expectedNumberOfParams = 11)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4], testCaseParams[5], testCaseParams[6], testCaseParams[7], testCaseParams[8], testCaseParams[9], testCaseParams[10])
- else if (metaTestCase.expectedNumberOfParams = 12)
- testSuite.testCase(testCaseParams[0], testCaseParams[1], testCaseParams[2], testCaseParams[3], testCaseParams[4], testCaseParams[5], testCaseParams[6], testCaseParams[7], testCaseParams[8], testCaseParams[9], testCaseParams[10], testCaseParams[11])
- else if (metaTestCase.expectedNumberOfParams > 12)
- testSuite.fail("Test case had more than 12 params. Max of 12 params is supported")
- end if
- metaTestCase.time = testCaseTimer.totalMilliseconds()
- else
- testCaseTimer.mark()
- testSuite.testCase()
- metaTestCase.time = testCaseTimer.totalMilliseconds()
- end if
- else
- testSuite.Fail("Could not parse args for test ")
- end if
- if testSuite.isAutoAssertingMocks = true
- testSuite.AssertMocks()
- testSuite.CleanMocks()
- testSuite.CleanStubs()
- end if
- runResult = testSuite.currentResult.getResult()
-
-
- if runResult <> ""
- testStatObj.result = "Fail"
- testStatObj.error.Code = 1
- testStatObj.error.Message = runResult
- else
- testStatObj.result = "Success"
- end if
-
- testStatObj.time = testTimer.totalMilliseconds()
- Rooibos.Stats.appendTestStatistic(suiteStatObj, testStatObj)
-
- if Rooibos.Common.isFunction(testSuite.afterEach)
- testSuite.afterEach()
- end if
-
- if testStatObj.result <> "Success"
- totalStatObj.testRunHasFailures = true
- end if
-
- if testStatObj.result = "Fail" and config.failFast = true
- exit for
- end if
- skipTestCase:
- end for
-
- suiteStatObj.metaTestSuite = metaTestSuite
- Rooibos.Stats.appendSuiteStatistic(totalStatObj, suiteStatObj)
-end sub
-
-' end namespace
\ No newline at end of file
diff --git a/src/source/UnitTestResult.bs b/src/source/UnitTestResult.bs
deleted file mode 100644
index a9d0b61d..00000000
--- a/src/source/UnitTestResult.bs
+++ /dev/null
@@ -1,54 +0,0 @@
-namespace Rooibos
- class UnitTestResult
-
- public messages = []
- public isFail = false
- public currentAssertIndex = 0
- public failedAssertIndex = 0
- public failedMockLineNumber = -1
-
- public function reset() as void
- m.isFail = false
- m.failedMockLineNumber = -1
- m.messages = []
- end function
-
- public function addResult(message as string) as string
- if (message <> "")
- m.messages.push(message)
- if (not m.isFail)
- m.failedAssertIndex = m.currentAssertIndex
- end if
- m.isFail = true
- end if
- m.currentAssertIndex++
- return message
- end function
-
- public function addMockResult(lineNumber, message as string) as string
- if (message <> "")
- m.messages.push(message)
- if (not m.isFail)
- m.failedMockLineNumber = lineNumber
- end if
- m.isFail = true
- end if
- return message
- end function
-
- public function getResult() as string
- if (m.isFail)
- msg = m.messages.peek()
-
- if (msg <> invalid)
- return msg
- else
- return "unknown test failure"
- end if
- else
- return ""
- end if
- end function
-
- end class
-end namespace
\ No newline at end of file
diff --git a/tests/.vscode/launch.json b/tests/.vscode/launch.json
new file mode 100644
index 00000000..eb725e95
--- /dev/null
+++ b/tests/.vscode/launch.json
@@ -0,0 +1,31 @@
+{
+ // Use IntelliSense to learn about possible attributes.
+ // Hover to view descriptions of existing attributes.
+ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "brightscript",
+ "request": "launch",
+ "name": "Framework Tests",
+ "stopOnEntry": false,
+ "preLaunchTask": "build-tests",
+ "envFile": "${workspaceFolder}/.vscode/.env",
+ "host": "${env:ROKU_DEV_TARGET}",
+ "password": "${env:ROKU_DEVPASSWORD}",
+ "rootDir": "${workspaceFolder}/build",
+ "sourceDirs": [
+ "${workspaceFolder}/src"
+ ],
+ "files": [
+ "manifest",
+ "source/**/*.*",
+ "components/**/*.*",
+ "images/**/*.*",
+ "font/**/*.*",
+ "!*.zip",
+ "!**/*.zip"
+ ],
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/.vscode/settings.json b/tests/.vscode/settings.json
new file mode 100644
index 00000000..0e1ced81
--- /dev/null
+++ b/tests/.vscode/settings.json
@@ -0,0 +1,49 @@
+{
+ "files.exclude": {
+ "build": true,
+ ".history": true,
+ "node_modules": true,
+ "out": true,
+ "**/.classpath": true,
+ "**/.project": true,
+ "**/.settings": true,
+ "**/.factorypath": true,
+ "/tmp/**": true,
+ },
+ "search.exclude": {
+ "**/.git/objects/**": true,
+ "**/.git/subtree-cache/**": true,
+ "**/node_modules/**": true,
+ "**/.meteor/local": true,
+ "**/build/**": true,
+ "build/**": true,
+ "**/.history/**": true,
+ ".history/**": true,
+ ".history/**/*": true,
+ "out/**": true,
+ "**/out/**": true,
+ "/tmp/**": true,
+ },
+ "files.useExperimentalFileWatcher": true,
+ "files.watcherExclude": {
+ "**/.git/objects/**": true,
+ "**/.git/subtree-cache/**": true,
+ "**/node_modules/**": true,
+ "**/.meteor/local": true,
+ "**/build/**": true,
+ "**/.history/**": true,
+ ".history/**": true,
+ "**/out/**": true,
+ },
+ "editor.tokenColorCustomizations": {
+ "textMateRules": [
+ {
+ "scope": "meta.function-call.brs,punctuation.decorator.brs",
+ "settings": {
+ "foreground": "#34BEB0",
+ "fontStyle": ""
+ }
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/tests/.vscode/tasks.json b/tests/.vscode/tasks.json
new file mode 100644
index 00000000..7406ef12
--- /dev/null
+++ b/tests/.vscode/tasks.json
@@ -0,0 +1,25 @@
+{
+ // See https://go.microsoft.com/fwlink/?LinkId=733558
+ // for the documentation about the tasks.json format
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "build-tests",
+ "type": "shell",
+ "command": "npm run build",
+ "problemMatcher": [],
+ "presentation": {
+ "echo": true,
+ "reveal": "silent",
+ "focus": false,
+ "panel": "shared",
+ "showReuseMessage": false,
+ "clear": true
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ },
+ },
+ ]
+}
\ No newline at end of file
diff --git a/tests/bsconfig.coverage.json b/tests/bsconfig.coverage.json
new file mode 100644
index 00000000..1183314c
--- /dev/null
+++ b/tests/bsconfig.coverage.json
@@ -0,0 +1,14 @@
+{
+ "rootDir": "src",
+ "files": [
+ "manifest",
+ "source/**/*.*",
+ "components/**/*.*"
+ ],
+ "autoImportComponentScript": true,
+ "createPackage": false,
+ "stagingFolderPath": "dist",
+ "rooibos-settings": {
+ "coverage": true
+ }
+}
\ No newline at end of file
diff --git a/tests/bsconfig.json b/tests/bsconfig.json
new file mode 100644
index 00000000..1039c9c1
--- /dev/null
+++ b/tests/bsconfig.json
@@ -0,0 +1,28 @@
+{
+ "rootDir": "src",
+ "files": [
+ "manifest",
+ "source/**/*.*",
+ "components/**/*.*"
+ ],
+ "autoImportComponentScript": true,
+ "createPackage": false,
+ "stagingFolderPath": "build",
+ "diagnosticFilters": [
+ {
+ "src": "**/roku_modules/**/*.*",
+ "codes": [
+ 1107,
+ 1009
+ ]
+ }
+ ],
+ "plugins": [
+ "../bsc-plugin/dist/plugin.js"
+ ],
+ "rooibos": {
+ "showOnlyFailures": true,
+ "lineWidth": 70
+ },
+ "sourceMap": true
+}
\ No newline at end of file
diff --git a/tests/package.json b/tests/package.json
new file mode 100644
index 00000000..549a4153
--- /dev/null
+++ b/tests/package.json
@@ -0,0 +1,43 @@
+{
+ "name": "rooibos-tests",
+ "version": "4.1.0",
+ "description": "simple, flexible, fun brightscript test framework for roku scenegraph apps - tests",
+ "directories": {
+ "doc": "docs"
+ },
+ "dependencies": {
+ "source-map": "^0.7.3"
+ },
+ "devDependencies": {
+ "brighterscript": "^0.37.4"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/georgejecook/rooibos.git"
+ },
+ "keywords": [
+ "brightscript",
+ "mvvm",
+ "framework",
+ "fun"
+ ],
+ "author": "George Cook",
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/georgejecook/rooibos/issues"
+ },
+ "homepage": "https://github.com/georgejecook/rooibos#readme",
+ "ts-node": {
+ "transpileOnly": true,
+ "compileOptions": {
+ "incremental": true,
+ "allowJs": false
+ }
+ },
+ "ropm": {
+ "rootDir": "src"
+ },
+ "scripts": {
+ "build": "npx bsc"
+ }
+}
diff --git a/tests/src/components/NodeExample.bs b/tests/src/components/NodeExample.bs
new file mode 100644
index 00000000..7be0042b
--- /dev/null
+++ b/tests/src/components/NodeExample.bs
@@ -0,0 +1,37 @@
+function Init() as void
+ m.nameText = m.top.findNode("nameText")
+end function
+
+function HelloFromNode(name, age) as string
+ return "HELLO " + name + " age:" + stri(age)
+end function
+
+function UpdateState(newState) as void
+ m.top.state = newState
+end function
+
+function SetLabelText(newText) as void
+ m.nameText.text = newText
+end function
+
+
+function r_real_Init() as void
+ if m.top.stubs["init"] <> invalid
+ 'mock call here
+ else
+ Init()
+ end if
+end function
+
+function r_real_HelloFromNode(name, age) as string
+ return "HELLO " + name + " age:" + stri(age)
+end function
+
+function r_real_UpdateState(newState) as void
+ m.top.state = newState
+end function
+
+function r_real_SetLabelText(newText) as void
+ m.nameText.text = newText
+end function
+
diff --git a/tests/src/components/NodeExample.xml b/tests/src/components/NodeExample.xml
new file mode 100644
index 00000000..4b2d58a6
--- /dev/null
+++ b/tests/src/components/NodeExample.xml
@@ -0,0 +1,5 @@
+
+
+
\ No newline at end of file
diff --git a/tests/src/manifest b/tests/src/manifest
new file mode 100644
index 00000000..95212f6a
--- /dev/null
+++ b/tests/src/manifest
@@ -0,0 +1,4 @@
+title=maestro sample
+major_version=0
+minor_version=1
+build_version=1
diff --git a/tests/src/source/Assertion.spec.bs b/tests/src/source/Assertion.spec.bs
new file mode 100644
index 00000000..fe8042c6
--- /dev/null
+++ b/tests/src/source/Assertion.spec.bs
@@ -0,0 +1,612 @@
+namespace tests
+
+ @noEarlyExit
+ @suite("Rooibos assertion tests")
+ class AssertionTests extends Rooibos.BaseTestSuite
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests basic assertions")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("Fail")
+ function _()
+
+ assertResult = m.Fail("reason")
+
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+
+ m.assertFalse(assertResult)
+ m.assertTrue(isFail)
+ end function
+
+ @it("AssertTrue")
+ @params(true, true)
+ @params(false, false)
+ @params(invalid, false)
+ @params(0, false)
+ @params(1, false)
+ @params("test", false)
+ function _(value, expectedAssertResult)
+
+ assertResult = m.assertTrue(value)
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+
+ m.assertEqual(assertResult, expectedAssertResult)
+ m.assertEqual(isFail, not expectedAssertResult)
+ end function
+
+
+ @it("AssertFalse")
+ @params(false, true)
+ @params(true, false)
+ @params(invalid, false)
+ @params(0, false)
+ @params(1, false)
+ @params("test", false)
+ function _(value, expectedAssertResult)
+
+ assertResult = m.assertFalse(value)
+
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+
+ m.assertEqual(assertResult, expectedAssertResult)
+ m.assertEqual(isFail, not expectedAssertResult)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests AssertArrayContainsAAs")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("Fail")
+ @params([{ "one": 1 }], [{ "one": 2 }])
+ @params([{ "one": 1 }], [{ "one": "a" }])
+ @params([{ "one": 1 }], [{}])
+ @params([{ "one": 1 }], [invalid])
+ @params([{ "one": 1 }], [])
+ @params([{ "one": 1 }], invalid)
+ @params([{ "one": 1 }], [[]])
+ @params([{ "one": 1 }], ["wrong"])
+ @params([{ "one": 1 }], [2])
+ @params([{ "one": "a" }], [{ "one": 1 }])
+ @params([{ "two": 1 }], [{ "one": 1 }])
+ @params([invalid], [{ "one": 1 }])
+ @params(invalid, [{ "one": 1 }])
+ @params([{ "one": 1, "two": 2 }], [{ "one": "1" }])
+ @params([{ "one": 1 }, { "two": 2 }], [{ "one": "1" }, { "two": "a" }])
+ @params([{ "one": 1 }, { "two": 2 }], [{ "a": 1 }, { "a": 1 }, { "a": 1 }])
+ function _(expectedAAs, items)
+
+ assertResult = m.assertArrayContainsAAs(items, expectedAAs)
+
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+
+ m.assertFalse(assertResult)
+ m.assertTrue(isFail)
+ end function
+
+
+ @it("pass")
+ @params([], [])
+ @params([{}], [{}])
+ @params([{ "one": 1 }], [{ "one": 1 }])
+ @params([{ "one": 1, "two": 2 }], [{ "one": 1, "two": 2 }])
+ @params([{ "one": 1, "two": 2 }], [{ "two": 2, "one": 1 }])
+ @params([{ "one": 1, "two": 2 }, { "one": 1 }], [{ "one": 1 }, { "two": 2, "one": 1 }])
+ @params([{ "one": 1, "two": 2 }, { "one": 1 }, { "three": 3 }], [{ "one": 1 }, { "three": 3 }, { "two": 2, "one": 1 }])
+ function _(expectedAAs, items)
+
+ assertResult = m.assertArrayContainsAAs(items, expectedAAs)
+
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertTrue(assertResult)
+ m.assertFalse(isFail)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests global is present on testSuite")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @beforeEach
+ function test_assertGlobal_beforeEach()
+ m.beforeEachGlobal = m.global
+ end function
+
+ @afterEach
+ function test_assertGlobal_afterEach()
+ m.afterEachGlobal = m.global
+ end function
+
+ @it("global is in test")
+ function _()
+ m.assertNotInvalid(m.global)
+ end function
+
+ @it("global is in before each and after each")
+ function _()
+ m.assertNotInvalid(m.global)
+ m.assertNotInvalid(m.beforeEachGlobal)
+ m.assertNotInvalid(m.afterEachGlobal)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests AssertArrayContainsOnlyValuesOfType")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("pass")
+ @params(["one", "two", "three"], "String")
+ @params([1, 2, 3], "Integer")
+ @params([true, true, false], "Boolean")
+ @params([[true, true], [false, false]], "Array")
+ @params([{ "test": 1 }, { "test": 1 }], "AssociativeArray")
+ function _(values, typeName)
+
+ assertResult = m.assertArrayContainsOnlyValuesOfType(values, typeName)
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertTrue(assertResult)
+ m.assertFalse(isFail)
+
+ end function
+
+ @it("fail")
+ @params(["one", 2, "three"], "String")
+ @params([1, "two", 3], "Integer")
+ @params([true, "true", false], "Boolean")
+ @params([[true, true], false, false], "Array")
+ @params([{ "test": 1 }, "notAA"], "AssociativeArray")
+ @params(["one", "two", "three"], "UnknownType")
+ @params(["one", "two", "three"], "Integer")
+ @params([1, 2, 3], "String")
+ @params([true, true, false], "String")
+ @params([[true, true], [false, false]], "AssociativeArray")
+ @params([{ "test": 1 }, { "test": 1 }], "Array")
+ function _(values, typeName)
+
+ assertResult = m.assertArrayContainsOnlyValuesOfType(values, typeName)
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+
+ m.assertFalse(assertResult)
+ m.assertTrue(isFail)
+
+
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests AssertNotEmpty")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("pass")
+ @params(["one", "two", "three"])
+ @params([1, 2, 3])
+ @params([true])
+ @params([[true, true], [false, false]])
+ @params([{ "test": 1 }])
+ @params("not empty")
+ @params([invalid])
+ function _(values)
+
+ assertResult = m.assertNotEmpty(values)
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertTrue(assertResult)
+ m.assertFalse(isFail)
+
+ end function
+
+ @it("fail")
+ @params(invalid)
+ @params([])
+ @params({})
+ @params(1)
+ @params("")
+ function _(values)
+
+ assertResult = m.assertNotEmpty(values)
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(assertResult)
+ m.assertTrue(isFail)
+
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests AssertEmpty")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("pass")
+ @params([])
+ @params({})
+ @params("")
+ function _(values)
+
+ assertResult = m.assertEmpty(values)
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertTrue(assertResult)
+ m.assertFalse(isFail)
+
+ end function
+
+ @it("fail")
+ @params(1)
+ @params(invalid)
+ @params(["one", "two", "three"])
+ @params([1, 2, 3])
+ @params([true])
+ @params([[true, true], [false, false]])
+ @params([{ "test": 1 }])
+ @params("not empty")
+ @params([invalid])
+ function _(values)
+
+ assertResult = m.assertEmpty(values)
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(assertResult)
+ m.assertTrue(isFail)
+
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests expect")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("multi return values")
+ function _()
+ obj = {}
+ m.expect(obj, "mockMethod", 5, invalid, { "multiResult": ["one", 2, invalid, "last"] }, true)
+
+ result = obj.mockMethod()
+ m.assertEqual(result, "one")
+
+ result = obj.mockMethod()
+ m.assertEqual(result, 2)
+
+ result = obj.mockMethod()
+ m.assertEqual(result, invalid)
+
+ result = obj.mockMethod()
+ m.assertEqual(result, "last")
+
+ result = obj.mockMethod()
+ m.assertEqual(result, "last")
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(isFail)
+
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests expect with overloaded expectOnce")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("simple test")
+ function _()
+ obj = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "mockMethod", [arg1], result1, true)
+ m.expectOnce(obj, "mockMethod", [arg2], result2, true)
+ m.expectOnce(obj, "mockMethod", [arg3], result3, true)
+
+ result = obj.mockMethod(arg1)
+ m.assertEqual(result, result1)
+
+ result = obj.mockMethod(arg2)
+ m.assertEqual(result, result2)
+
+ result = obj.mockMethod(arg3)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(isFail)
+ end function
+
+
+ @it("can set up multi expects on same method - one invocation with any args")
+ function _()
+ obj = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "mockMethod", [arg1], result1, true)
+ m.expectOnce(obj, "mockMethod", invalid, result2, true)
+ m.expectOnce(obj, "mockMethod", [arg3], result3, true)
+
+ result = obj.mockMethod(arg1)
+ m.assertEqual(result, result1)
+
+ result = obj.mockMethod("do not care about args", "used in invocation", 2)
+ m.assertEqual(result, result2)
+
+ result = obj.mockMethod(arg3)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(isFail)
+
+ end function
+
+ @it("can set up multi expects on same method - multi params")
+ function _()
+ obj = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
+ m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
+ m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
+
+ result = obj.mockMethod(arg1, arg2, arg3)
+ m.assertEqual(result, result1)
+
+ result = obj.mockMethod(arg2, arg3, arg1)
+ m.assertEqual(result, result2)
+
+ result = obj.mockMethod(arg3, arg2, arg1)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(isFail)
+
+ end function
+
+ @it("multi test, multi params with other expects")
+ function _()
+ obj = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "anotherMockMethod", invalid, "another", true)
+ m.expectOnce(obj, "anotherMockMethod2", [1, 2, 3], "another2", true)
+ m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
+ m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
+ m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
+
+ result = obj.anotherMockMethod()
+ m.assertEqual(result, "another")
+
+ result = obj.anotherMockMethod2(1, 2, 3)
+ m.assertEqual(result, "another2")
+
+ result = obj.mockMethod(arg1, arg2, arg3)
+ m.assertEqual(result, result)
+
+ result = obj.mockMethod(arg2, arg3, arg1)
+ m.assertEqual(result, result2)
+
+ result = obj.mockMethod(arg3, arg2, arg1)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(isFail)
+
+ end function
+
+ @it("multi test, multi params with other expects - fail others")
+ function _()
+ obj = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "anotherMockMethod", ["not passed"], "another", true)
+ m.expectOnce(obj, "anotherMockMethod2", [1, 2, 3], "another2", true)
+ m.expectOnce(obj, "mockMethod", [arg1, arg2, arg3], result1, true)
+ m.expectOnce(obj, "mockMethod", [arg2, arg3, arg1], result2, true)
+ m.expectOnce(obj, "mockMethod", [arg3, arg2, arg1], result3, true)
+
+ result = obj.anotherMockMethod()
+ m.assertEqual(result, "another")
+
+ result = obj.anotherMockMethod2(1, 2, 3)
+ m.assertEqual(result, "another2")
+
+ result = obj.mockMethod(arg1, arg2, arg3)
+ m.assertEqual(result, result)
+
+ result = obj.mockMethod(arg2, arg3, arg1)
+ m.assertEqual(result, result2)
+
+ result = obj.mockMethod(arg3, arg2, arg1)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertTrue(isFail)
+
+ end function
+
+ @it("can set up multi expects on same method")
+ @params("arg1", "arg2", "arg3")
+ @params("arg1", "arg2", "arg3")
+ @params("arg1", "arg2", "arg3")
+ @params("arg1", "arg2", "arg3")
+ @params("arg1", "arg2", "arg3")
+ @params("arg1", invalid, "arg3")
+ function _(call1, call2, call3)
+ obj = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "mockMethod", [arg1], result1, true)
+ m.expectOnce(obj, "mockMethod", [arg2], result2, true)
+ m.expectOnce(obj, "mockMethod", [arg3], result3, true)
+
+ result = obj.mockMethod(call1)
+ m.assertEqual(result, result1)
+
+ result = obj.mockMethod(call2)
+ m.assertEqual(result, result2)
+
+ result = obj.mockMethod(call2)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertTrue(isFail)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests overloaded expectOnce on different objects")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("success")
+ function _()
+ obj = {}
+ obj2 = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "mockMethod", [arg1], result1, true)
+ m.expectOnce(obj, "mockMethod", [arg2], result2, true)
+ m.expectOnce(obj2, "mockMethod", [arg3], result3, true)
+
+ result = obj.mockMethod(arg1)
+ m.assertEqual(result, result1)
+
+ result = obj.mockMethod(arg2)
+ m.assertEqual(result, result2)
+
+ result = obj2.mockMethod(arg3)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(isFail)
+
+ end function
+
+ @it("fail to match")
+ function _()
+ obj = {}
+ obj2 = {}
+ arg1 = "arg1"
+ arg2 = "arg2"
+ arg3 = "arg3"
+ result1 = 1
+ result2 = 2
+ result3 = 3
+
+ m.expectOnce(obj, "mockMethod", [arg1], result1, true)
+ m.expectOnce(obj, "mockMethod", [arg2], result2, true)
+ m.expectOnce(obj2, "mockMethod", [arg3], result3, true)
+
+ result = obj.mockMethod(arg1)
+ m.assertEqual(result, result1)
+
+ result = obj.mockMethod(arg2)
+ m.assertEqual(result, result2)
+
+ result = obj2.mockMethod(arg3)
+ m.assertEqual(result, result3)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertFalse(isFail)
+
+ end function
+
+ 'ASSERTIONS TO WRITE TESTS FOR!
+
+ 'This is coming soon!
+
+ ' AssertEqual
+ ' AssertLike
+ ' AssertNotEqual
+ ' AssertInvalid
+ ' AssertNotInvalid
+ ' AssertAAHasKey
+ ' AssertAANotHasKey
+ ' AssertAAHasKeys
+ ' AssertAANotHasKeys
+ ' AssertArrayNotContains
+ ' AssertArrayContainsSubset
+ ' AssertArrayNotContainsSubsetet
+ ' AssertArrayCount
+ ' AssertArrayNotCount
+ ' AssertArrayContainsOnly
+ ' AssertType
+ ' AssertSubType
+ '
+ ' 'Node extensions
+ ' AssertNodeCount
+ ' AssertNodeNotCount
+ ' AssertNodeEmpty
+ ' AssertNodeNotEmpty
+ ' AssertNodeContains
+ ' AssertNodeNotContains
+ ' AssertNodeContainsFields
+ ' AssertNodeNotContainsFields
+
+ ' AssertArray
+ ' AssertAAContainsSubset
+ '
+ ' 'Mocking and stubbing
+ ' AssertMocks
+ ' MockFail
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/Basic.spec.bs b/tests/src/source/Basic.spec.bs
new file mode 100644
index 00000000..3780c164
--- /dev/null
+++ b/tests/src/source/Basic.spec.bs
@@ -0,0 +1,68 @@
+namespace tests
+
+ @noEarlyExit
+ @suite
+ class BasicTests extends Rooibos.BaseTestSuite
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("equals fix for stubbed aas")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("tests aa's with a mock will not crash the box!")
+ function _()
+ aa = { "test": "value" }
+ m.expectOnce(aa, "getStubbedObject", [aa])
+
+ aa.getStubbedObject(aa)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("print results fix for stubbed aas")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("tests aa's that get printed as failures don't crash box")
+ function _()
+ aa = { "test": "value" }
+ bb = { "other": "value" }
+ m.expectOnce(bb, "getStubbedObject", [aa])
+ m.assertEqual(aa, bb)
+ 'not crashing on printing the wrong output is a pass
+ m.assertMocks()
+ m.currentResult.Reset()
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("url in params")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("works for simple case")
+ @params("http://101.rooibos.com")
+ function _(url)
+ m.assertEqual(url, "http://101.rooibos.com")
+ end function
+
+ @it("on objects")
+ @params({"url":"http://101.rooibos.com", "othervalue":2})
+ @params({url:"http://101.rooibos.com", "othervalue":2})
+ @params({url:"http://101.rooibos.com", othervalue:2})
+ function urlParams_objects(aa)
+ m.assertEqual(aa.url, "http://101.rooibos.com")
+ m.assertEqual(aa.othervalue, 2)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("assertAsyncField")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("times out")
+ function _()
+ item = { "id": "item" }
+
+ m.assertAsyncField(item, "id")
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+ m.assertTrue(isFail)
+
+ end function
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/Common.spec.bs b/tests/src/source/Common.spec.bs
new file mode 100644
index 00000000..d5884177
--- /dev/null
+++ b/tests/src/source/Common.spec.bs
@@ -0,0 +1,30 @@
+namespace tests
+
+ @suite
+ class Common extends Rooibos.BaseTestSuite
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("eqArray")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("compares arrays")
+ @params(invalid, [], false)
+ @params([], invalid, false)
+ @params(invalid, invalid, false)
+ @params(["one", "three"], [], false)
+ @params([], ["one", "three"], false)
+ @params([], [], true)
+ @params(["one", "two", "three"], ["one", "three"], false)
+ @params(["one", "two", "three"], ["one", "two", "three"], true)
+ @params([1, 2, 3], ["one", "two", "three"], false)
+ @params([1, 2, 3], [1, 2, 3], true)
+ @params([1, invalid, "3"], [1, invalid, "3"], true)
+ @params([3, 2, 1], [1, 2, 3], false)
+ function _(values, values2, expected)
+
+ result = Rooibos.Common.eqArray(values, values2)
+ m.assertEqual(result, expected)
+
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/Expect.spec.bs b/tests/src/source/Expect.spec.bs
new file mode 100644
index 00000000..5ec22ee5
--- /dev/null
+++ b/tests/src/source/Expect.spec.bs
@@ -0,0 +1,59 @@
+
+namespace tests
+
+ @noEarlyExit
+ @suite
+ class ExpectTests extends Rooibos.BaseTestSuite
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("expectonce bug")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("tests bug with expectOnce not matching values")
+ @params([52], true)
+ @params(invalid, false)
+ @params([invalid], true)
+ @params(["42"], true)
+ @params([42], false)
+ function _(expectedValue, expectMockFail)
+ obj = {
+ foo: function(arg0) : return arg0 : end function
+ }
+
+ m.ExpectOnce(obj, "foo", expectedValue)
+ obj.foo(42)
+ m.isAutoAssertingMocks = false
+ m.assertMocks()
+
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+ m.CleanMocks()
+ m.assertEqual(isFail, expectMockFail)
+ end function
+
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests mock count limit")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("mock count limit at least 25")
+ function _()
+
+ interface = {}
+
+ mockCountLimit = 25
+ for i = 1 to mockCountLimit
+ keyName = StrI(i).trim()
+ interface[keyName] = function(arg0) : return arg0 : end function
+
+ expectedArg = "a"
+ expectedReturnValue = "b"
+ m.ExpectOnce(interface, keyName, [expectedArg], [expectedReturnValue])
+
+ interface[keyName](expectedArg)
+ end for
+
+ end function
+ end class
+
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/Main.bs b/tests/src/source/Main.bs
new file mode 100644
index 00000000..f669bacc
--- /dev/null
+++ b/tests/src/source/Main.bs
@@ -0,0 +1,6 @@
+
+function Main(args)
+
+ ? "here is my code"
+ ? "hello"
+end function
\ No newline at end of file
diff --git a/tests/src/source/Matcher.spec.bs b/tests/src/source/Matcher.spec.bs
new file mode 100644
index 00000000..f7cb9e94
--- /dev/null
+++ b/tests/src/source/Matcher.spec.bs
@@ -0,0 +1,214 @@
+namespace tests
+
+ @noEarlyExit
+ @suite
+ class MatcherTests extends Rooibos.BaseTestSuite
+
+ override function beforeEach()
+ 'make a mock class
+ m.myClass = {}
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("boolean matcher")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("matches values")
+ @params(true, false, false)
+ @params(false, true, true)
+ @params(false, false, true)
+ @params(true, true, true)
+ function _(v1, v2, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [{ "matcher": m.match_true }, { "matcher": m.match_false }], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1, v2), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("inline matcher")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("matches values")
+ @params(true, false, false)
+ @params(false, true, true)
+ @params(false, false, true)
+ @params(true, true, true)
+ function _(v1, v2, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [{ "matcher": function(value)
+ return value = true
+ end function }, { "matcher": function(value)
+ return value = false
+ end function }], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1, v2), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ built in matchers
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("anyBoolMatcher")
+ @params(invalid, true)
+ @params("false", true)
+ @params("true", true)
+ @params(23, true)
+ @params({}, true)
+ @params([], true)
+ @params(false, false)
+ @params(true, false)
+ function _(v1, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [m.anyBoolMatcher], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+ @it("anyStringMatcher")
+ @params(invalid, true)
+ @params("false", false)
+ @params("true", false)
+ @params(23, true)
+ @params({}, true)
+ @params([], true)
+ @params(false, true)
+ @params(true, true)
+ function _(v1, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [m.anyStringMatcher], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+ @it("anyNumberMatcher")
+ @params(invalid, true)
+ @params("false", true)
+ @params("true", true)
+ @params(23, false)
+ @params(9, false)
+ @params(0, false)
+ @params(0.2, false)
+ @params({}, true)
+ @params([], true)
+ @params(false, true)
+ @params(true, true)
+ function _(v1, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [m.anyNumberMatcher], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+ @it("anyAAMatcher")
+ @params(invalid, true)
+ @params("false", true)
+ @params("true", true)
+ @params(23, true)
+ @params({}, false)
+ @params([], true)
+ @params(false, true)
+ @params(true, true)
+ function _(v1, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [m.anyAAMatcher], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+ @it("anyArrayMatcher")
+ @params(invalid, true)
+ @params("false", true)
+ @params("true", true)
+ @params(23, true)
+ @params({}, true)
+ @params([], false)
+ @params(false, true)
+ @params(true, true)
+ function _(v1, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [m.anyArrayMatcher], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+ @it("anyNodeMatcher")
+ @params(invalid, true)
+ @params("false", true)
+ @params("true", true)
+ @params(23, true)
+ @params({}, true)
+ @params("#RBSNode", false)
+ @params([], true)
+ @params(false, true)
+ @params(true, true)
+ function _(v1, expectedFail)
+ returnValue = "notBroken"
+ m.expectOnce(m.myClass, "doWork", [m.anyNodeMatcher], returnValue)
+
+ m.assertEqual(m.myClass.doWork(v1), returnValue)
+
+ m.assertMocks()
+ isFail = m.currentResult.isFail
+
+ m.currentResult.Reset()
+ m.assertEqual(isFail, expectedFail)
+ end function
+
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ '++ matchers
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ function match_true(value)
+ return value = true
+ end function
+
+ function match_false(value)
+ return value = false
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/NodeExample.spec.bs b/tests/src/source/NodeExample.spec.bs
new file mode 100644
index 00000000..0f9874e0
--- /dev/null
+++ b/tests/src/source/NodeExample.spec.bs
@@ -0,0 +1,37 @@
+namespace tests
+ @SGNode("NodeExample")
+ @suite
+ class NodeExampleTests extends Rooibos.BaseTestSuite
+ override function setup()
+ m.setupThing = "something created during setup"
+ end function
+
+ override function beforeEach()
+ m.beforeEachThing = "something created beforeEach"
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests methods present on the node")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("HelloFromNode")
+ function _()
+ 'bs:disable-next-line
+ text = HelloFromNode("georgejecook", 12)
+ m.AssertEqual(text, "HELLO georgejecook" + " age:" + stri(12))
+ end function
+
+ @it("HelloFromNode with params")
+ @params("jon", 40)
+ @params("ringo", 23)
+ @params("ringo", 50)
+ @params("ringo", 24)
+ @params("george", 40)
+ @params("paul", 50)
+ function _(name, age)
+ 'bs:disable-next-line
+ text = HelloFromNode(name, age)
+ m.AssertEqual(text, "HELLO " + name + " age:" + stri(age))
+ end function
+ end class
+end namespace
diff --git a/tests/src/source/Params.spec.bs b/tests/src/source/Params.spec.bs
new file mode 100644
index 00000000..0835b1e2
--- /dev/null
+++ b/tests/src/source/Params.spec.bs
@@ -0,0 +1,36 @@
+namespace tests
+
+ @suite
+ class ParamsTest extends Rooibos.BaseTestSuite
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("params")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("creates nodes with RBSNode directive")
+ @params("#RBSNode", "ContentNode")
+ @params("#RBSNode|Group", "Group")
+ @params("#RBSNode|Label", "Label")
+ function _(node, expectedNodeType)
+ m.assertSubType(node, expectedNodeType)
+ end function
+
+ @it("creates nodes on other arguments")
+ @params(1, 2, 3, "#RBSNode", "ContentNode")
+ @params(1, 2, 3, "#RBSNode|Group", "Group")
+ @params(1, 2, 3, "#RBSNode|Label", "Label")
+ function _(arg1, arg2, arg3, node, expectedNodeType)
+ m.assertSubType(node, expectedNodeType)
+ m.assertEqual(arg1, 1)
+ m.assertEqual(arg2, 2)
+ m.assertEqual(arg3, 3)
+ end function
+
+ @it("does not affect regular params")
+ @params("#someValue", "#someValue")
+ @params(22, 22)
+ @params([1,2,3], [1,2,3])
+ function _(arg1, expectedValue)
+ m.assertEqual(arg1, expectedValue)
+ end function
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/issue_13_afterEach_not_running.spec.bs b/tests/src/source/issue_13_afterEach_not_running.spec.bs
new file mode 100644
index 00000000..b4f38472
--- /dev/null
+++ b/tests/src/source/issue_13_afterEach_not_running.spec.bs
@@ -0,0 +1,60 @@
+
+
+namespace tests
+
+ @Ignore("only unignore to test compiler works")
+ @suite
+ class AfterEachNotRunning extends Rooibos.BaseTestSuite
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group1")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("simple")
+ function _()
+ m.assertTrue(true)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group2")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("simple")
+ function _()
+ m.assertTrue(true)
+ end function
+
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group22")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("simple2")
+ function _()
+ m.assertTrue(true)
+ end function
+
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group3")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("simple")
+ function _()
+ m.assertTrue(true)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group11")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("simple")
+ function _()
+ m.assertTrue(true)
+ end function
+
+ @it("simple2")
+ function _()
+ m.assertTrue(true)
+ end function
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/issue_15_tests_only_on_groups.spec.bs b/tests/src/source/issue_15_tests_only_on_groups.spec.bs
new file mode 100644
index 00000000..d490b7a7
--- /dev/null
+++ b/tests/src/source/issue_15_tests_only_on_groups.spec.bs
@@ -0,0 +1,33 @@
+namespace tests
+ 'ADD '@Only ON NEXT LINE TO TEST
+ @suite()
+ class OnlyOnGroups extends Rooibos.BaseTestSuite
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests one")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("it test one")
+ function _()
+ m.assertTrue(true)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests two")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("it test two")
+ function _()
+ m.assertTrue(true)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 'ADD '@Only ON NEXT LINE TO TEST
+ @describe("tests three")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("it test three")
+ function _()
+ m.assertTrue(true)
+ end function
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/issue_5_duplicateGroupNames.spec.bs b/tests/src/source/issue_5_duplicateGroupNames.spec.bs
new file mode 100644
index 00000000..62807903
--- /dev/null
+++ b/tests/src/source/issue_5_duplicateGroupNames.spec.bs
@@ -0,0 +1,34 @@
+namespace tests
+
+
+ @Ignore("only unignore to test compiler works - remove REMOVE_THIS to test")
+ @noEarlyExit
+ @suite
+ class DuplicateGroupNames extends Rooibos.BaseTestSuite
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("tests before each and after each are running")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ override function group_beforeEach()
+ ? "!!! Before"
+ end function
+
+ override function group_afterEach()
+ ? "!!! After"
+ end function
+
+ @it("called beforeEach and afterEach")
+ function _()
+
+ assertResult = m.Fail("reason")
+
+ isFail = m.currentResult.isFail
+ m.currentResult.Reset()
+
+ m.assertFalse(assertResult)
+ m.assertTrue(isFail)
+ end function
+
+ end class
+end namespace
\ No newline at end of file
diff --git a/tests/src/source/testUtils.bs b/tests/src/source/testUtils.bs
new file mode 100644
index 00000000..4cf3d227
--- /dev/null
+++ b/tests/src/source/testUtils.bs
@@ -0,0 +1,8 @@
+
+sub AddTestUtils(test)
+ 'add your own test utils you want access to when testing here
+
+ 'e.g.
+ 'test.testUtils = TestUtils()
+ 'test.r = rodash()
+end sub
\ No newline at end of file
diff --git a/tests/src/source/verifyBeforeEachAfterEach.spec.bs b/tests/src/source/verifyBeforeEachAfterEach.spec.bs
new file mode 100644
index 00000000..f5ce7c2a
--- /dev/null
+++ b/tests/src/source/verifyBeforeEachAfterEach.spec.bs
@@ -0,0 +1,103 @@
+namespace tests
+
+ @suite
+ @strict
+ class VeritfyBeforeEachAfterEach extends Rooibos.BaseTestSuite
+
+ private beforeEachValue
+ override function setup()
+ ? "!!! Setup"
+ end function
+
+ override function tearDown()
+ ? "!!! TearDown"
+ end function
+
+ override function beforeEach()
+ ? "!!! Before"
+ m.beforeEachValue = 1
+ end function
+
+ override function afterEach()
+ ? "!!! After"
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group 1")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("1")
+ function _()
+ m.assertEqual(m.beforeEachValue, 1)
+ end function
+
+ @it("2")
+ function _()
+ m.assertEqual(m.beforeEachValue, 1)
+ end function
+
+ @it("3")
+ @params("a")
+ @params("b")
+ @params("c")
+ function _(values)
+ m.assertEqual(m.beforeEachValue, 1)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group 2")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @beforeEach
+ function g2_be()
+ m.beforeEachValue = 2
+ ? "!!! Before GROUP 2"
+ end function
+
+ @afterEach
+ function g2_ae()
+ ? "!!! After GROUP 2"
+ end function
+
+ @it("1 ")
+ function _()
+ m.assertEqual(m.beforeEachValue, 2)
+ end function
+
+ @it("2")
+ function _()
+ m.assertEqual(m.beforeEachValue, 2)
+ end function
+
+ @it("3")
+ @params("a")
+ @params("b")
+ @params("c")
+ function _(values)
+ m.assertEqual(m.beforeEachValue, 2)
+ end function
+
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ @describe("group 3")
+ '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+
+ @it("1 ")
+ function _()
+ m.assertEqual(m.beforeEachValue, 1)
+ end function
+
+ @it("2")
+ function _()
+ m.assertEqual(m.beforeEachValue, 1)
+ end function
+
+ @it("3")
+ @params("a")
+ @params("b")
+ @params("c")
+ function _(values)
+ m.assertEqual(m.beforeEachValue, 1)
+ end function
+
+ end class
+end namespace
diff --git a/tsconfig.json b/tsconfig.json
deleted file mode 100644
index 1d8745d5..00000000
--- a/tsconfig.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "compilerOptions": {
- "outDir": "./dist",
- "allowJs": true,
- "target": "es5",
- "lib": ["esnext"]
- },
- "include": [
- "./src/**/*"
- ]
-}
\ No newline at end of file