diff --git a/.github/workflows/auto-close-stale-pr.yml b/.github/workflows/auto-close-stale-pr.yml
index 773c2c33..51d2e351 100644
--- a/.github/workflows/auto-close-stale-pr.yml
+++ b/.github/workflows/auto-close-stale-pr.yml
@@ -9,7 +9,7 @@ jobs:
permissions:
pull-requests: write
steps:
- - uses: actions/stale@3de2653986ebd134983c79fe2be5d45cc3d9f4e1 # tag=v6
+ - uses: actions/stale@5ebf00ea0e4c1561e9b43a292ed34424fb1d4578 # tag=v6
with:
days-before-issue-stale: -1
days-before-issue-close: -1
@@ -17,4 +17,5 @@ jobs:
close-pr-message: "This pull request has been closed because it has been inactive for 28 days. You may submit a new pull request if desired."
days-before-pr-stale: 21
days-before-pr-close: 7
+ exempt-draft-pr: true
repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3c187c05..835665af 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -8,14 +8,14 @@ jobs:
run:
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
- - uses: actions/setup-node@2fddd8803e2f5c9604345a0b591c3020ee971a93 # tag=v3
+ - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3
+ - uses: actions/setup-node@8c91899e586c5b171469028077307d293428b516 # tag=v3
with:
node-version: "14.12.0"
- run: npm ci
- run: npx ropm install
- run: make dev
- - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # tag=v3
+ - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # tag=v3
with:
name: Jellyfin-Roku-dev-${{ github.sha }}
path: ${{ github.workspace }}/out/staging
diff --git a/.github/workflows/master-release.yml b/.github/workflows/master-release.yml
index b7387b6f..13e3eeb9 100644
--- a/.github/workflows/master-release.yml
+++ b/.github/workflows/master-release.yml
@@ -22,7 +22,7 @@ jobs:
run: awk 'BEGIN { FS="=" } /^minor_version/ { print "MINOR="$2; }' manifest >> $GITHUB_ENV
- name: "Find and save build_version from manifest"
run: awk 'BEGIN { FS="=" } /^build_version/ { print "BUILD="$2; }' manifest >> $GITHUB_ENV
- - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
+ - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3
- uses: vimtor/action-zip@5f1c4aa587ea41db1110df6a99981dbe19cee310 # tag=v1
with:
recursive: false
@@ -36,7 +36,7 @@ jobs:
prerelease: false
title: v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}
files: ${{ github.workspace }}/jellyfin_v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}.zip
- - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # tag=v3
+ - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # tag=v3
with:
name: jellyfin_v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}.zip
path: ${{ github.workspace }}/jellyfin_v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}.zip
diff --git a/.github/workflows/unstable-release.yml b/.github/workflows/unstable-release.yml
index 979965c9..8317d290 100644
--- a/.github/workflows/unstable-release.yml
+++ b/.github/workflows/unstable-release.yml
@@ -22,7 +22,7 @@ jobs:
run: awk 'BEGIN { FS="=" } /^minor_version/ { print "MINOR="$2; }' manifest >> $GITHUB_ENV
- name: "Find and save build_version from manifest"
run: awk 'BEGIN { FS="=" } /^build_version/ { print "BUILD="$2; }' manifest >> $GITHUB_ENV
- - uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # tag=v3
+ - uses: actions/checkout@93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8 # v3
- uses: vimtor/action-zip@5f1c4aa587ea41db1110df6a99981dbe19cee310 # tag=v1
with:
recursive: false
@@ -35,7 +35,7 @@ jobs:
prerelease: true
title: v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}
files: ${{ github.workspace }}/jellyfin_v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}.zip
- - uses: actions/upload-artifact@3cea5372237819ed00197afe530f5a7ea3e805c8 # tag=v3
+ - uses: actions/upload-artifact@83fd05a356d7e2593de66fc9913b3002723633cb # tag=v3
with:
name: jellyfin_v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}.zip
path: ${{ github.workspace }}/jellyfin_v${{ env.MAJOR }}.${{ env.MINOR }}.${{ env.BUILD }}.zip
diff --git a/.gitignore b/.gitignore
index c81cf067..3d5bcad8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,11 +12,6 @@ roku_modules
#NPM modules
node_modules/
-#Rooibos generated
-rooibosFunctionMap.brs
-*/buildinfo.brs
-logs
-
#Eclipse
.buildpath
.project
diff --git a/DEVGUIDE.md b/DEVGUIDE.md
index 6a41643d..14adc7bb 100644
--- a/DEVGUIDE.md
+++ b/DEVGUIDE.md
@@ -130,37 +130,12 @@ Modify code -> `make install` -> Use Roku remote to test changes -> `telnet ${RO
Unfortunately there is no debuger. You will need to use telnet to see log statements, warnings, and error reports. You won't always need to telnet into your device but the workflow above is typical when you are new to Brightscript or are working on tricky code.
-### Testing
-
-Testing is done with the [Rooibos](https://github.com/georgejecook/rooibos/) library. This works by including tests in the deployment and then looking at telnet
-for the test results.
-
Install necessary packages:
```bash
sudo apt-get install nodejs npm
```
-Install [rooibos-cli](https://github.com/georgejecook/rooibos-cli):
-
-```bash
-npm install -g rooibos-cli
-```
-
-Deploy the application with tests:
-
-```bash
-make test
-```
-
-View test results:
-
-```bash
-telnet ${ROKU_DEV_TARGET} 8085
-```
-
-To exit telnet: `CTRL + ]` and then type `quit + ENTER`
-
### Committing
Before commiting your code, please run:
diff --git a/Makefile b/Makefile
index 095a3d31..42c7e289 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,6 @@
#########################################################################
# Makefile Usage:
-# > make test ' run all tests
-# > make testFailures ' run all tests and show only failures
#
# 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
@@ -12,11 +10,9 @@
##########################################################################
APPNAME = Jellyfin_Roku
-VERSION = 1.6.1
-ROKU_TEST_ID = 1
-ROKU_TEST_WAIT_DURATION = 5
+VERSION = 1.6.2
-ZIP_EXCLUDE= -x rooibos/**\* -x xml/* -x artwork/* -x \*.pkg -x storeassets\* -x keys\* -x \*/.\* -x *.git* -x *.DS* -x *.pkg* -x dist/**\* -x out/**\*
+ZIP_EXCLUDE= -x xml/* -x artwork/* -x \*.pkg -x storeassets\* -x keys\* -x \*/.\* -x *.git* -x *.DS* -x *.pkg* -x dist/**\* -x out/**\*
include app.mk
@@ -29,7 +25,4 @@ beta:
release:
$(MAKE) BUILD='release' package
-test: prep_staging prep_tests remove install
- echo "Running tests"
-
deploy: prep_staging remove install
diff --git a/app.mk b/app.mk
index ae43982f..9e09f21e 100644
--- a/app.mk
+++ b/app.mk
@@ -163,13 +163,6 @@ package: prep_staging
@echo "*** packaging $(APPNAME)-$(BUILD) complete ***"
-prep_tests:
- @mkdir -p $(STAGINGREL)/components/tests/; \
- mkdir -p $(STAGINGREL)/source/tests/; \
- cp -r $(SOURCEREL)/tests/components/* $(STAGINGREL)/components/tests/;\
- cp -r $(SOURCEREL)/tests/source/* $(STAGINGREL)/source/tests/;\
- ./node_modules/.bin/rooibos-cli i tests/.rooibosrc.json
-
prep_commit:
npm run format
npm ci
diff --git a/components/GetNextEpisodeTask.brs b/components/GetNextEpisodeTask.brs
new file mode 100644
index 00000000..cc3be1ba
--- /dev/null
+++ b/components/GetNextEpisodeTask.brs
@@ -0,0 +1,13 @@
+sub init()
+ m.top.functionName = "getNextEpisodeTask"
+end sub
+
+sub getNextEpisodeTask()
+ m.nextEpisodeData = api_API().shows.getepisodes(m.top.showID, {
+ UserId: get_setting("active_user"),
+ StartItemId: m.top.videoID,
+ Limit: 2
+ })
+
+ m.top.nextEpisodeData = m.nextEpisodeData
+end sub
diff --git a/components/GetNextEpisodeTask.xml b/components/GetNextEpisodeTask.xml
new file mode 100644
index 00000000..4832d770
--- /dev/null
+++ b/components/GetNextEpisodeTask.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/components/ItemGrid/GridItemSmall.brs b/components/ItemGrid/GridItemSmall.brs
new file mode 100644
index 00000000..776e496f
--- /dev/null
+++ b/components/ItemGrid/GridItemSmall.brs
@@ -0,0 +1,42 @@
+sub init()
+ m.itemPoster = m.top.findNode("itemPoster")
+ m.posterText = m.top.findNode("posterText")
+ m.posterText.font.size = 30
+ m.backdrop = m.top.findNode("backdrop")
+
+ m.itemPoster.observeField("loadStatus", "onPosterLoadStatusChanged")
+
+ 'Parent is MarkupGrid and it's parent is the ItemGrid
+ m.topParent = m.top.GetParent().GetParent()
+
+ 'Get the imageDisplayMode for these grid items
+ if m.topParent.imageDisplayMode <> invalid
+ m.itemPoster.loadDisplayMode = m.topParent.imageDisplayMode
+ end if
+
+end sub
+
+sub itemContentChanged()
+ m.backdrop.blendColor = "#101010"
+
+ itemData = m.top.itemContent
+
+ if not isValid(itemData) then return
+
+ m.itemPoster.uri = itemData.PosterUrl
+ m.posterText.text = itemData.title
+
+ 'If Poster not loaded, ensure "blue box" is shown until loaded
+ if m.itemPoster.loadStatus <> "ready"
+ m.backdrop.visible = true
+ m.posterText.visible = true
+ end if
+end sub
+
+'Hide backdrop and text when poster loaded
+sub onPosterLoadStatusChanged()
+ if m.itemPoster.loadStatus = "ready"
+ m.backdrop.visible = false
+ m.posterText.visible = false
+ end if
+end sub
diff --git a/components/ItemGrid/GridItemSmall.xml b/components/ItemGrid/GridItemSmall.xml
new file mode 100644
index 00000000..6e2f9b1d
--- /dev/null
+++ b/components/ItemGrid/GridItemSmall.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/ItemGrid/ItemGrid.brs b/components/ItemGrid/ItemGrid.brs
index 2ddaaca2..38e9aea0 100644
--- a/components/ItemGrid/ItemGrid.brs
+++ b/components/ItemGrid/ItemGrid.brs
@@ -320,13 +320,14 @@ end sub
' Set Photo Album view, sort, and filter options
sub setPhotoAlbumOptions(options)
- ' TODO/FIXME: Show shuffle options once implemented
- ' options.views = [
- ' { "Title": tr("Don't Shuffle"), "Name": "singlephoto"}
- ' { "Title": tr("Shuffle"), "Name": "shufflephoto"}
- ' ]
- options.views = []
+ options.views = [
+ { "Title": tr("Slideshow Off"), "Name": "singlephoto" }
+ { "Title": tr("Slideshow On"), "Name": "slideshowphoto" }
+ { "Title": tr("Random Off"), "Name": "singlephoto" }
+ { "Title": tr("Random On"), "Name": "randomphoto" }
+ ]
options.sort = []
+ options.filter = []
end sub
' Set Default view, sort, and filter options
@@ -574,14 +575,17 @@ sub optionsClosed()
end if
end if
- if m.top.parentItem.Type = "CollectionFolder" or m.top.parentItem.CollectionType = "CollectionFolder"
- ' Did the user just request "Shuffle" on a PhotoAlbum?
+ if m.top.parentItem.Type = "CollectionFolder" or m.top.parentItem.Type = "Folder" or m.top.parentItem.CollectionType = "CollectionFolder"
+ ' Did the user just request "Random" on a PhotoAlbum?
if m.options.view = "singlephoto"
- ' TODO/FIXME: Stop shuffling here
- print "TODO/FIXME: Stop any shuffling here"
- else if m.options.view = "shufflephoto"
- ' TODO/FIXME: Start shuffling here
- print "TODO/FIXME: Start shuffle here"
+ set_user_setting("photos.slideshow", "false")
+ set_user_setting("photos.random", "false")
+ else if m.options.view = "slideshowphoto"
+ set_user_setting("photos.slideshow", "true")
+ set_user_setting("photos.random", "false")
+ else if m.options.view = "randomphoto"
+ set_user_setting("photos.random", "true")
+ set_user_setting("photos.slideshow", "false")
end if
end if
@@ -724,9 +728,10 @@ function onKeyEvent(key as string, press as boolean) as boolean
return true
else if itemToPlay <> invalid and itemToPlay.type = "Photo"
' Spawn photo player task
- photoPlayer = CreateObject("roSgNode", "PhotoPlayerTask")
- photoPlayer.itemContent = itemToPlay
- photoPlayer.control = "RUN"
+ photoPlayer = CreateObject("roSgNode", "PhotoDetails")
+ photoPlayer.items = markupGrid
+ photoPlayer.itemIndex = markupGrid.itemFocused
+ m.global.sceneManager.callfunc("pushScene", photoPlayer)
return true
end if
else if key = "left" and topGrp.isinFocusChain()
diff --git a/components/ItemGrid/LoadItemsTask2.brs b/components/ItemGrid/LoadItemsTask2.brs
index 1ee17066..25a6be09 100644
--- a/components/ItemGrid/LoadItemsTask2.brs
+++ b/components/ItemGrid/LoadItemsTask2.brs
@@ -20,6 +20,16 @@ sub loadItems()
sort_order = "Descending"
end if
+ if m.top.ItemType = "LogoImage"
+ logoImageExists = api_API().items.headimageurlbyname(m.top.itemId, "logo")
+ if logoImageExists
+ m.top.content = [api_API().items.getimageurl(m.top.itemId, "logo", 0, { "maxHeight": 500, "maxWidth": 500, "quality": "90" })]
+ else
+ m.top.content = []
+ end if
+
+ return
+ end if
params = {
limit: m.top.limit,
@@ -52,14 +62,17 @@ sub loadItems()
end if
end if
- if m.top.searchTerm <> ""
+ 'reset data
+ if LCase(m.top.searchTerm) = LCase(tr("all"))
+ params.searchTerm = " "
+ else if m.top.searchTerm <> ""
params.searchTerm = m.top.searchTerm
end if
- filter = m.top.filter
- if filter = "All" or filter = "all"
+ filter = LCase(m.top.filter)
+ if filter = "all"
' do nothing
- else if filter = "Favorites"
+ else if filter = "favorites"
params.append({ Filters: "IsFavorite" })
params.append({ isFavorite: true })
end if
@@ -117,7 +130,49 @@ sub loadItems()
else if item.type = "Episode"
tmp = CreateObject("roSGNode", "TVEpisode")
else if item.Type = "Genre"
- tmp = CreateObject("roSGNode", "FolderData")
+ tmp = CreateObject("roSGNode", "ContentNode")
+ tmp.title = item.name
+
+ genreData = api_API().users.getitemsbyquery(get_setting("active_user"), {
+ SortBy: "Random",
+ SortOrder: "Ascending",
+ IncludeItemTypes: "Movie",
+ Recursive: true,
+ Fields: "PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo",
+ ImageTypeLimit: 1,
+ EnableImageTypes: "Primary",
+ Limit: 6,
+ GenreIds: item.id,
+ EnableTotalRecordCount: false,
+ ParentId: m.top.itemId
+ })
+
+ if genreData.Items.Count() > 5
+ ' Add View All item to the start of the row
+ row = tmp.createChild("FolderData")
+ row.parentFolder = m.top.itemId
+ genreMovieImage = api_API().items.getimageurl(item.id)
+ row.title = item.name
+ row.json = item
+ row.FHDPOSTERURL = genreMovieImage
+ row.HDPOSTERURL = genreMovieImage
+ row.SDPOSTERURL = genreMovieImage
+ row.type = "Folder"
+ end if
+
+ for each genreMovie in genreData.Items
+ row = tmp.createChild("MovieData")
+
+ genreMovieImage = api_API().items.getimageurl(genreMovie.id)
+ row.title = genreMovie.name
+ row.FHDPOSTERURL = genreMovieImage
+ row.HDPOSTERURL = genreMovieImage
+ row.SDPOSTERURL = genreMovieImage
+ row.json = genreMovie
+ row.id = genreMovie.id
+ row.type = genreMovie.type
+ end for
+
else if item.Type = "Studio"
tmp = CreateObject("roSGNode", "FolderData")
else if item.Type = "MusicAlbum"
@@ -135,12 +190,16 @@ sub loadItems()
else
print "[LoadItems] Unknown Type: " item.Type
end if
+
if tmp <> invalid
- tmp.parentFolder = m.top.itemId
- tmp.json = item
- if item.UserData <> invalid and item.UserData.isFavorite <> invalid
- tmp.favorite = item.UserData.isFavorite
+ if item.Type <> "Genre"
+ tmp.parentFolder = m.top.itemId
+ tmp.json = item
+ if item.UserData <> invalid and item.UserData.isFavorite <> invalid
+ tmp.favorite = item.UserData.isFavorite
+ end if
end if
+
results.push(tmp)
end if
end for
diff --git a/components/ItemGrid/MovieLibraryView.brs b/components/ItemGrid/MovieLibraryView.brs
new file mode 100644
index 00000000..bf2c831b
--- /dev/null
+++ b/components/ItemGrid/MovieLibraryView.brs
@@ -0,0 +1,790 @@
+sub setupNodes()
+ m.options = m.top.findNode("options")
+ m.itemGrid = m.top.findNode("itemGrid")
+ m.voiceBox = m.top.findNode("voiceBox")
+ m.backdrop = m.top.findNode("backdrop")
+ m.newBackdrop = m.top.findNode("backdropTransition")
+ m.emptyText = m.top.findNode("emptyText")
+ m.selectedMovieName = m.top.findNode("selectedMovieName")
+ m.selectedMovieOverview = m.top.findNode("selectedMovieOverview")
+ m.selectedMovieProductionYear = m.top.findNode("selectedMovieProductionYear")
+ m.selectedMovieOfficialRating = m.top.findNode("selectedMovieOfficialRating")
+ m.movieLogo = m.top.findNode("movieLogo")
+ m.swapAnimation = m.top.findNode("backroundSwapAnimation")
+ m.spinner = m.top.findNode("spinner")
+ m.Alpha = m.top.findNode("AlphaMenu")
+ m.AlphaSelected = m.top.findNode("AlphaSelected")
+ m.micButton = m.top.findNode("micButton")
+ m.micButtonText = m.top.findNode("micButtonText")
+ m.communityRatingGroup = m.top.findNode("communityRatingGroup")
+ m.criticRatingIcon = m.top.findNode("criticRatingIcon")
+ m.criticRatingGroup = m.top.findNode("criticRatingGroup")
+ m.overhang = m.top.getScene().findNode("overhang")
+ m.genreList = m.top.findNode("genrelist")
+ m.infoGroup = m.top.findNode("infoGroup")
+end sub
+
+sub init()
+ setupNodes()
+
+ m.overhang.isVisible = false
+
+ m.showItemCount = get_user_setting("itemgrid.showItemCount") = "true"
+
+ m.swapAnimation.observeField("state", "swapDone")
+
+ m.loadedRows = 0
+ m.loadedItems = 0
+
+ m.data = CreateObject("roSGNode", "ContentNode")
+
+ m.itemGrid.content = m.data
+
+ m.genreData = CreateObject("roSGNode", "ContentNode")
+ m.genreList.observeField("itemSelected", "onGenreItemSelected")
+ m.genreList.content = m.genreData
+
+ m.itemGrid.observeField("itemFocused", "onItemFocused")
+ m.itemGrid.observeField("itemSelected", "onItemSelected")
+ m.itemGrid.observeField("alphaSelected", "onItemalphaSelected")
+
+ 'Voice filter setup
+ m.voiceBox.voiceEnabled = true
+ m.voiceBox.active = true
+ m.voiceBox.observeField("text", "onvoiceFilter")
+ 'set voice help text
+ m.voiceBox.hintText = tr("Use voice remote to search")
+
+ 'backdrop
+ m.newBackdrop.observeField("loadStatus", "newBGLoaded")
+
+ 'Background Image Queued for loading
+ m.queuedBGUri = ""
+
+ 'Item sort - maybe load defaults from user prefs?
+ m.sortField = "SortName"
+ m.sortAscending = true
+
+ m.filter = "All"
+ m.favorite = "Favorite"
+
+ m.loadItemsTask = createObject("roSGNode", "LoadItemsTask2")
+ m.loadLogoTask = createObject("roSGNode", "LoadItemsTask2")
+
+ 'set inital counts for overhang before content is loaded.
+ m.loadItemsTask.totalRecordCount = 0
+
+ m.spinner.visible = true
+
+ 'Get reset folder setting
+ m.resetGrid = get_user_setting("itemgrid.reset") = "true"
+
+ 'Check if device has voice remote
+ devinfo = CreateObject("roDeviceInfo")
+
+ 'Hide voice search if device does not have voice remote
+ if devinfo.HasFeature("voice_remote") = false
+ m.micButton.visible = false
+ m.micButtonText.visible = false
+ end if
+end sub
+
+sub OnScreenHidden()
+ if not m.overhang.isVisible
+ m.overhang.disableMoveAnimation = true
+ m.overhang.isVisible = true
+ m.overhang.disableMoveAnimation = false
+ end if
+end sub
+
+sub OnScreenShown()
+ m.overhang.isVisible = false
+
+ if m.top.lastFocus <> invalid
+ m.top.lastFocus.setFocus(true)
+ else
+ m.top.setFocus(true)
+ end if
+end sub
+
+'
+'Load initial set of Data
+sub loadInitialItems()
+ m.loadItemsTask.control = "stop"
+ m.spinner.visible = true
+
+ if m.top.parentItem.json.Type = "CollectionFolder"
+ m.top.HomeLibraryItem = m.top.parentItem.Id
+ end if
+
+ if m.top.parentItem.backdropUrl <> invalid
+ SetBackground(m.top.parentItem.backdropUrl)
+ else
+ SetBackground("")
+ end if
+
+ m.sortField = get_user_setting("display." + m.top.parentItem.Id + ".sortField")
+ sortAscendingStr = get_user_setting("display." + m.top.parentItem.Id + ".sortAscending")
+ m.filter = get_user_setting("display." + m.top.parentItem.Id + ".filter")
+ m.view = get_user_setting("display." + m.top.parentItem.Id + ".landing")
+
+ if not isValid(m.sortField) then m.sortField = "SortName"
+ if not isValid(m.filter) then m.filter = "All"
+ if not isValid(m.view) then m.view = "Movies"
+
+ if sortAscendingStr = invalid or sortAscendingStr = "true"
+ m.sortAscending = true
+ else
+ m.sortAscending = false
+ end if
+
+ if m.top.parentItem.json.type = "Studio"
+ m.loadItemsTask.studioIds = m.top.parentItem.id
+ m.loadItemsTask.itemId = m.top.parentItem.parentFolder
+ m.loadItemsTask.genreIds = ""
+ else if m.top.parentItem.json.type = "Genre"
+ m.loadItemsTask.genreIds = m.top.parentItem.id
+ m.loadItemsTask.itemId = m.top.parentItem.parentFolder
+ m.loadItemsTask.studioIds = ""
+ else if m.view = "Movies" or m.options.view = "Movies"
+ m.loadItemsTask.studioIds = ""
+ m.loadItemsTask.genreIds = ""
+ else
+ m.loadItemsTask.itemId = m.top.parentItem.Id
+ end if
+
+ m.loadItemsTask.nameStartsWith = m.top.alphaSelected
+ m.loadItemsTask.searchTerm = m.voiceBox.text
+ m.emptyText.visible = false
+ m.loadItemsTask.sortField = m.sortField
+ m.loadItemsTask.sortAscending = m.sortAscending
+ m.loadItemsTask.filter = m.filter
+ m.loadItemsTask.startIndex = 0
+
+ ' Load Item Types
+ if getCollectionType() = "movies"
+ m.loadItemsTask.itemType = "Movie"
+ m.loadItemsTask.itemId = m.top.parentItem.Id
+ end if
+
+ ' By default we load movies
+ m.loadItemsTask.studioIds = ""
+ m.loadItemsTask.view = "Movies"
+ m.itemGrid.translation = "[96, 650]"
+ m.itemGrid.numRows = "2"
+ m.selectedMovieOverview.visible = true
+ m.infoGroup.visible = true
+
+ if m.options.view = "Studios" or m.view = "Studios"
+ m.itemGrid.translation = "[96, 60]"
+ m.itemGrid.numRows = "3"
+ m.loadItemsTask.view = "Networks"
+ m.top.imageDisplayMode = "scaleToFit"
+ m.selectedMovieOverview.visible = false
+ m.infoGroup.visible = false
+ else if m.options.view = "Genres" or m.view = "Genres"
+ m.loadItemsTask.StudioIds = m.top.parentItem.Id
+ m.loadItemsTask.view = "Genres"
+ m.movieLogo.visible = false
+ m.selectedMovieName.visible = false
+ m.selectedMovieOverview.visible = false
+ m.infoGroup.visible = false
+ end if
+
+ m.loadItemsTask.observeField("content", "ItemDataLoaded")
+ m.spinner.visible = true
+ m.loadItemsTask.control = "RUN"
+ SetUpOptions()
+end sub
+
+' Set Movies view, sort, and filter options
+sub setMoviesOptions(options)
+
+ options.views = [
+ { "Title": tr("Movies"), "Name": "Movies" },
+ { "Title": tr("Studios"), "Name": "Studios" },
+ { "Title": tr("Genres"), "Name": "Genres" }
+ ]
+
+ if m.top.parentItem.json.type = "Genre"
+ options.views = [
+ { "Title": tr("Movies"), "Name": "Movies" }
+ ]
+ end if
+
+ options.sort = [
+ { "Title": tr("TITLE"), "Name": "SortName" },
+ { "Title": tr("IMDB_RATING"), "Name": "CommunityRating" },
+ { "Title": tr("CRITIC_RATING"), "Name": "CriticRating" },
+ { "Title": tr("DATE_ADDED"), "Name": "DateCreated" },
+ { "Title": tr("DATE_PLAYED"), "Name": "DatePlayed" },
+ { "Title": tr("OFFICIAL_RATING"), "Name": "OfficialRating" },
+ { "Title": tr("PLAY_COUNT"), "Name": "PlayCount" },
+ { "Title": tr("RELEASE_DATE"), "Name": "PremiereDate" },
+ { "Title": tr("RUNTIME"), "Name": "Runtime" }
+ ]
+
+ options.filter = [
+ { "Title": tr("All"), "Name": "All" },
+ { "Title": tr("Favorites"), "Name": "Favorites" }
+ ]
+
+ if m.options.view = "Genres" or m.view = "Genres"
+ options.sort = []
+ options.filter = []
+ end if
+
+ if m.options.view = "Studios" or m.view = "Studios"
+ options.sort = [
+ { "Title": tr("TITLE"), "Name": "SortName" },
+ { "Title": tr("DATE_ADDED"), "Name": "DateCreated" },
+ ]
+ end if
+end sub
+
+' Return parent collection type
+function getCollectionType() as string
+ if m.top.parentItem.collectionType = invalid
+ return m.top.parentItem.Type
+ else
+ return m.top.parentItem.CollectionType
+ end if
+end function
+
+' Search string array for search value. Return if it's found
+function inStringArray(array, searchValue) as boolean
+ for each item in array
+ if lcase(item) = lcase(searchValue) then return true
+ end for
+ return false
+end function
+
+' Data to display when options button selected
+sub SetUpOptions()
+ options = {}
+ options.filter = []
+ options.favorite = []
+
+ setMoviesOptions(options)
+
+ ' Set selected view option
+ for each o in options.views
+ if o.Name = m.view
+ o.Selected = true
+ o.Ascending = m.sortAscending
+ m.options.view = o.Name
+ end if
+ end for
+
+ ' Set selected sort option
+ for each o in options.sort
+ if o.Name = m.sortField
+ o.Selected = true
+ o.Ascending = m.sortAscending
+ m.options.sortField = o.Name
+ end if
+ end for
+
+ ' Set selected filter option
+ for each o in options.filter
+ if o.Name = m.filter
+ o.Selected = true
+ m.options.filter = o.Name
+ end if
+ end for
+
+ m.options.options = options
+end sub
+
+'
+' Logo Image Loaded Event Handler
+sub LogoImageLoaded(msg)
+ data = msg.GetData()
+ m.loadLogoTask.unobserveField("content")
+ m.loadLogoTask.content = []
+
+ if data.Count() > 0
+ m.movieLogo.uri = data[0]
+ m.movieLogo.visible = true
+ else
+ m.selectedMovieName.visible = true
+ end if
+end sub
+
+'
+'Handle loaded data, and add to Grid
+sub ItemDataLoaded(msg)
+ m.top.alphaActive = false
+ itemData = msg.GetData()
+ m.loadItemsTask.unobserveField("content")
+ m.loadItemsTask.content = []
+
+ if itemData = invalid
+ m.Loading = false
+ return
+ end if
+
+ if m.loadItemsTask.view = "Genres"
+ ' Reset genre list data
+ m.genreData.removeChildren(m.genreData.getChildren(-1, 0))
+
+ for each item in itemData
+ m.genreData.appendChild(item)
+ end for
+
+ m.itemGrid.opacity = "0"
+ m.genreList.opacity = "1"
+
+ m.itemGrid.setFocus(false)
+ m.genreList.setFocus(true)
+
+ m.loading = false
+ m.spinner.visible = false
+ return
+ end if
+
+ m.itemGrid.opacity = "1"
+ m.genreList.opacity = "0"
+
+ m.itemGrid.setFocus(true)
+ m.genreList.setFocus(false)
+
+ for each item in itemData
+ m.data.appendChild(item)
+ end for
+
+ 'Update the stored counts
+ m.loadedItems = m.itemGrid.content.getChildCount()
+ m.loadedRows = m.loadedItems / m.itemGrid.numColumns
+ m.Loading = false
+ 'If there are no items to display, show message
+ if m.loadedItems = 0
+ m.emptyText.text = tr("NO_ITEMS").Replace("%1", m.top.parentItem.Type)
+ m.emptyText.visible = true
+ end if
+
+ m.spinner.visible = false
+end sub
+
+'
+'Set Selected Movie Name
+sub SetName(movieName as string)
+ m.selectedMovieName.text = movieName
+end sub
+
+'
+'Set Selected Movie Overview
+sub SetOverview(movieOverview as string)
+ m.selectedMovieOverview.text = movieOverview
+end sub
+
+'
+'Set Selected Movie OfficialRating
+sub SetOfficialRating(movieOfficialRating as string)
+ m.selectedMovieOfficialRating.text = movieOfficialRating
+end sub
+
+'
+'Set Selected Movie ProductionYear
+sub SetProductionYear(movieProductionYear)
+ m.selectedMovieProductionYear.text = movieProductionYear
+end sub
+
+'
+'Set Background Image
+sub SetBackground(backgroundUri as string)
+ if backgroundUri = ""
+ m.backdrop.opacity = 0
+ end if
+
+ 'If a new image is being loaded, or transitioned to, store URL to load next
+ if m.swapAnimation.state <> "stopped" or m.newBackdrop.loadStatus = "loading"
+ m.queuedBGUri = backgroundUri
+ return
+ end if
+
+ m.newBackdrop.uri = backgroundUri
+end sub
+
+'
+'Handle new item being focused
+sub onItemFocused()
+ focusedRow = m.itemGrid.currFocusRow
+
+ itemInt = m.itemGrid.itemFocused
+
+ ' If no selected item, set background to parent backdrop
+ if itemInt = -1
+ return
+ end if
+
+ m.movieLogo.visible = false
+ m.selectedMovieName.visible = false
+
+ ' Load more data if focus is within last 5 rows, and there are more items to load
+ if focusedRow >= m.loadedRows - 5 and m.loadeditems < m.loadItemsTask.totalRecordCount
+ loadMoreData()
+ end if
+
+ m.selectedFavoriteItem = getItemFocused()
+ m.communityRatingGroup.visible = false
+ m.criticRatingGroup.visible = false
+
+ if m.options.view = "Studios" or m.view = "Studios"
+ return
+ end if
+
+ itemData = m.selectedFavoriteItem.json
+
+ if isValid(itemData.communityRating)
+ setFieldText("communityRating", int(itemData.communityRating * 10) / 10)
+ m.communityRatingGroup.visible = true
+ end if
+
+ if isValid(itemData.CriticRating)
+ setFieldText("criticRatingLabel", itemData.criticRating)
+
+ tomato = "pkg:/images/rotten.png"
+
+ if itemData.CriticRating > 60
+ tomato = "pkg:/images/fresh.png"
+ end if
+
+ m.criticRatingIcon.uri = tomato
+ m.criticRatingGroup.visible = true
+ end if
+
+ if isValid(itemData.Name)
+ SetName(itemData.Name)
+ else
+ SetName("")
+ end if
+
+ if isValid(itemData.Overview)
+ SetOverview(itemData.Overview)
+ else
+ SetOverview("")
+ end if
+
+ if isValid(itemData.ProductionYear)
+ SetProductionYear(str(itemData.ProductionYear))
+ else
+ SetProductionYear("")
+ end if
+
+ if type(itemData.RunTimeTicks) = "LongInteger"
+ setFieldText("runtime", stri(getRuntime(itemData.RunTimeTicks)) + " mins")
+ else
+ setFieldText("runtime", "")
+ end if
+
+ if isValid(itemData.OfficialRating)
+ SetOfficialRating(itemData.OfficialRating)
+ else
+ SetOfficialRating("")
+ end if
+
+ m.loadLogoTask.itemId = itemData.id
+ m.loadLogoTask.itemType = "LogoImage"
+ m.loadLogoTask.observeField("content", "LogoImageLoaded")
+ m.loadLogoTask.control = "RUN"
+
+ ' Set Background to item backdrop
+ SetBackground(m.selectedFavoriteItem.backdropUrl)
+end sub
+
+function getRuntime(runTimeTicks) as integer
+ return round(runTimeTicks / 600000000.0)
+end function
+
+function round(f as float) as integer
+ ' BrightScript only has a "floor" round
+ ' This compares floor to floor + 1 to find which is closer
+ m = int(f)
+ n = m + 1
+ x = abs(f - m)
+ y = abs(f - n)
+ if y > x
+ return m
+ else
+ return n
+ end if
+end function
+
+sub setFieldText(field, value)
+ node = m.top.findNode(field)
+ if node = invalid or value = invalid then return
+
+ ' Handle non strings... Which _shouldn't_ happen, but hey
+ if type(value) = "roInt" or type(value) = "Integer"
+ value = str(value)
+ else if type(value) = "roFloat" or type(value) = "Float"
+ value = str(value)
+ else if type(value) <> "roString" and type(value) <> "String"
+ value = ""
+ end if
+
+ node.text = value
+end sub
+
+'
+'When Image Loading Status changes
+sub newBGLoaded()
+ 'If image load was sucessful, start the fade swap
+ if m.newBackdrop.loadStatus = "ready"
+ m.swapAnimation.control = "start"
+ end if
+end sub
+
+'
+'Swap Complete
+sub swapDone()
+ if m.swapAnimation.state = "stopped"
+ 'Set main BG node image and hide transitioning node
+ m.backdrop.uri = m.newBackdrop.uri
+ m.backdrop.opacity = 1
+ m.newBackdrop.opacity = 0
+
+ 'If there is another one to load
+ if m.newBackdrop.uri <> m.queuedBGUri and m.queuedBGUri <> ""
+ SetBackground(m.queuedBGUri)
+ m.queuedBGUri = ""
+ end if
+ end if
+end sub
+
+'
+'Load next set of items
+sub loadMoreData()
+ m.spinner.visible = true
+ if m.Loading = true then return
+ m.Loading = true
+ m.loadItemsTask.startIndex = m.loadedItems
+ m.loadItemsTask.observeField("content", "ItemDataLoaded")
+ m.loadItemsTask.control = "RUN"
+end sub
+
+'
+'Item Selected
+sub onItemSelected()
+ m.top.selectedItem = m.itemGrid.content.getChild(m.itemGrid.itemSelected)
+end sub
+
+'
+'Returns Focused Item
+function getItemFocused()
+ return m.itemGrid.content.getChild(m.itemGrid.itemFocused)
+end function
+
+'
+'Genre Item Selected
+sub onGenreItemSelected()
+ m.top.selectedItem = m.genreList.content.getChild(m.genreList.rowItemSelected[0]).getChild(m.genreList.rowItemSelected[1])
+end sub
+
+sub onItemalphaSelected()
+ if m.top.alphaSelected <> ""
+ m.loadedRows = 0
+ m.loadedItems = 0
+
+ m.data = CreateObject("roSGNode", "ContentNode")
+ m.itemGrid.content = m.data
+
+ m.genreData = CreateObject("roSGNode", "ContentNode")
+ m.genreList.content = m.genreData
+
+ m.loadItemsTask.searchTerm = ""
+ m.VoiceBox.text = ""
+ m.loadItemsTask.nameStartsWith = m.alpha.itemAlphaSelected
+ m.spinner.visible = true
+ loadInitialItems()
+ end if
+end sub
+
+sub onvoiceFilter()
+ if m.VoiceBox.text <> ""
+ m.loadedRows = 0
+ m.loadedItems = 0
+ m.data = CreateObject("roSGNode", "ContentNode")
+ m.itemGrid.content = m.data
+ m.top.alphaSelected = ""
+ m.loadItemsTask.NameStartsWith = " "
+ m.loadItemsTask.searchTerm = m.voiceBox.text
+ m.loadItemsTask.recursive = true
+ m.spinner.visible = true
+ loadInitialItems()
+ end if
+end sub
+
+
+'
+'Check if options updated and any reloading required
+sub optionsClosed()
+ reload = false
+
+ if m.options.sortField <> m.sortField or m.options.sortAscending <> m.sortAscending
+ m.sortField = m.options.sortField
+ m.sortAscending = m.options.sortAscending
+ reload = true
+
+ sortAscendingStr = "true"
+
+ 'Store sort settings
+ if not m.sortAscending
+ sortAscendingStr = "false"
+ end if
+
+ set_user_setting("display." + m.top.parentItem.Id + ".sortField", m.sortField)
+ set_user_setting("display." + m.top.parentItem.Id + ".sortAscending", sortAscendingStr)
+ end if
+
+ if m.options.filter <> m.filter
+ m.filter = m.options.filter
+ reload = true
+ set_user_setting("display." + m.top.parentItem.Id + ".filter", m.options.filter)
+ end if
+
+ m.view = get_user_setting("display." + m.top.parentItem.Id + ".landing")
+
+ if m.options.view <> m.view
+ m.view = m.options.view
+ set_user_setting("display." + m.top.parentItem.Id + ".landing", m.view)
+
+ ' Reset any filtering or search terms
+ m.top.alphaSelected = ""
+ m.loadItemsTask.NameStartsWith = " "
+ m.loadItemsTask.searchTerm = ""
+ m.filter = "All"
+ m.sortField = "SortName"
+ m.sortAscending = true
+
+ ' Reset view to defaults
+ set_user_setting("display." + m.top.parentItem.Id + ".sortField", m.sortField)
+ set_user_setting("display." + m.top.parentItem.Id + ".sortAscending", "true")
+ set_user_setting("display." + m.top.parentItem.Id + ".filter", m.filter)
+
+ reload = true
+ end if
+
+ if reload
+ m.loadedRows = 0
+ m.loadedItems = 0
+ m.data = CreateObject("roSGNode", "ContentNode")
+ m.itemGrid.content = m.data
+ loadInitialItems()
+ end if
+
+ m.itemGrid.setFocus(m.itemGrid.opacity = 1)
+ m.genreList.setFocus(m.genreList.opacity = 1)
+end sub
+
+sub onChannelSelected(msg)
+ node = msg.getRoSGNode()
+ m.top.lastFocus = lastFocusedChild(node)
+ if node.watchChannel <> invalid
+ ' Clone the node when it's reused/update in the TimeGrid it doesn't automatically start playing
+ m.top.selectedItem = node.watchChannel.clone(false)
+ end if
+end sub
+
+function onKeyEvent(key as string, press as boolean) as boolean
+ if not press then return false
+
+ if key = "left" and m.voiceBox.isinFocusChain()
+ m.itemGrid.setFocus(m.itemGrid.opacity = 1)
+ m.genreList.setFocus(m.genreList.opacity = 1)
+ m.voiceBox.setFocus(false)
+ end if
+
+ if key = "options"
+ if m.options.visible = true
+ m.options.visible = false
+ m.top.removeChild(m.options)
+ optionsClosed()
+ else
+
+ itemSelected = m.selectedFavoriteItem
+ if itemSelected <> invalid
+ m.options.selectedFavoriteItem = itemSelected
+ end if
+
+ m.options.visible = true
+ m.top.appendChild(m.options)
+ m.options.setFocus(true)
+ end if
+ return true
+ else if key = "back"
+ if m.options.visible = true
+ m.options.visible = false
+ optionsClosed()
+ return true
+ else
+ m.global.sceneManager.callfunc("popScene")
+ m.loadItemsTask.control = "stop"
+ return true
+ end if
+ else if key = "play" or key = "OK"
+
+ itemToPlay = getItemFocused()
+
+ if itemToPlay <> invalid and (itemToPlay.type = "Movie" or itemToPlay.type = "Episode")
+ m.top.quickPlayNode = itemToPlay
+ return true
+ end if
+ else if key = "left"
+ if m.itemGrid.isinFocusChain()
+ m.top.alphaActive = true
+ m.itemGrid.setFocus(false)
+ alpha = m.alpha.getChild(0).findNode("Alphamenu")
+ alpha.setFocus(true)
+ return true
+ else if m.genreList.isinFocusChain()
+ m.top.alphaActive = true
+ m.genreList.setFocus(false)
+ alpha = m.alpha.getChild(0).findNode("Alphamenu")
+ alpha.setFocus(true)
+ return true
+ end if
+
+ else if key = "right" and m.Alpha.isinFocusChain()
+ m.top.alphaActive = false
+ m.Alpha.setFocus(false)
+ m.Alpha.visible = true
+
+ m.itemGrid.setFocus(m.itemGrid.opacity = 1)
+ m.genreList.setFocus(m.genreList.opacity = 1)
+
+ return true
+
+ else if key = "replay" and m.itemGrid.isinFocusChain()
+ if m.resetGrid = true
+ m.itemGrid.animateToItem = 0
+ else
+ m.itemGrid.jumpToItem = 0
+ end if
+
+ else if key = "replay" and m.genreList.isinFocusChain()
+ if m.resetGrid = true
+ m.genreList.animateToItem = 0
+ else
+ m.genreList.jumpToItem = 0
+ end if
+ return true
+ end if
+
+ if key = "replay"
+ m.spinner.visible = true
+ m.loadItemsTask.searchTerm = ""
+ m.loadItemsTask.nameStartsWith = ""
+ m.voiceBox.text = ""
+ m.top.alphaSelected = ""
+ m.loadItemsTask.filter = "All"
+ m.filter = "All"
+ m.data = CreateObject("roSGNode", "ContentNode")
+ m.itemGrid.content = m.data
+ loadInitialItems()
+ return true
+ end if
+
+ return false
+end function
diff --git a/components/ItemGrid/MovieLibraryView.xml b/components/ItemGrid/MovieLibraryView.xml
new file mode 100644
index 00000000..68a3c678
--- /dev/null
+++ b/components/ItemGrid/MovieLibraryView.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/JFOverhang.brs b/components/JFOverhang.brs
index a7615895..1fd0c869 100644
--- a/components/JFOverhang.brs
+++ b/components/JFOverhang.brs
@@ -25,19 +25,14 @@ sub init()
' get system preference clock format (12/24hr)
di = CreateObject("roDeviceInfo")
m.clockFormat = di.GetClockFormat()
-
- ' grab current time
- currentTime = CreateObject("roDateTime")
- currentTime.ToLocalTime()
- m.currentHours = currentTime.GetHours()
- m.currentMinutes = currentTime.GetMinutes()
+ m.overlayHours = m.top.findNode("overlayHours")
+ m.overlayMinutes = m.top.findNode("overlayMinutes")
+ m.overlayMeridian = m.top.findNode("overlayMeridian")
' start timer
m.currentTimeTimer = m.top.findNode("currentTimeTimer")
m.currentTimeTimer.control = "start"
m.currentTimeTimer.ObserveField("fire", "updateTime")
-
- updateTimeDisplay()
end if
setClockVisibility()
@@ -97,64 +92,50 @@ sub updateUser()
end sub
sub updateTime()
- if (m.currentMinutes + 1) > 59
- m.currentHours = m.currentHours + 1
- m.currentMinutes = 0
- else
- m.currentMinutes = m.currentMinutes + 1
- end if
-
+ m.currentTime = CreateObject("roDateTime")
+ m.currentTime.ToLocalTime()
+ m.currentTimeTimer.duration = 60 - m.currentTime.GetSeconds()
+ m.currentHours = m.currentTime.GetHours()
+ m.currentMinutes = m.currentTime.GetMinutes()
updateTimeDisplay()
end sub
sub resetTime()
m.currentTimeTimer.control = "stop"
-
- currentTime = CreateObject("roDateTime")
m.currentTimeTimer.control = "start"
-
- currentTime.ToLocalTime()
-
- m.currentHours = currentTime.GetHours()
- m.currentMinutes = currentTime.GetMinutes()
-
- updateTimeDisplay()
+ updateTime()
end sub
sub updateTimeDisplay()
- overlayHours = m.top.findNode("overlayHours")
- overlayMinutes = m.top.findNode("overlayMinutes")
- overlayMeridian = m.top.findNode("overlayMeridian")
-
if m.clockFormat = "24h"
- overlayMeridian.text = ""
+ m.overlayMeridian.text = ""
if m.currentHours < 10
- overlayHours.text = "0" + StrI(m.currentHours).trim()
+ m.overlayHours.text = "0" + StrI(m.currentHours).trim()
else
- overlayHours.text = m.currentHours
+ m.overlayHours.text = m.currentHours
end if
else
if m.currentHours < 12
- overlayMeridian.text = "AM"
+ m.overlayMeridian.text = "AM"
if m.currentHours = 0
- overlayHours.text = "12"
+ m.overlayHours.text = "12"
else
- overlayHours.text = m.currentHours
+ m.overlayHours.text = m.currentHours
end if
else
- overlayMeridian.text = "PM"
+ m.overlayMeridian.text = "PM"
if m.currentHours = 12
- overlayHours.text = "12"
+ m.overlayHours.text = "12"
else
- overlayHours.text = m.currentHours - 12
+ m.overlayHours.text = m.currentHours - 12
end if
end if
end if
if m.currentMinutes < 10
- overlayMinutes.text = "0" + StrI(m.currentMinutes).trim()
+ m.overlayMinutes.text = "0" + StrI(m.currentMinutes).trim()
else
- overlayMinutes.text = m.currentMinutes
+ m.overlayMinutes.text = m.currentMinutes
end if
end sub
diff --git a/components/JFVideo.brs b/components/JFVideo.brs
index 556ebc26..366b3877 100644
--- a/components/JFVideo.brs
+++ b/components/JFVideo.brs
@@ -2,6 +2,8 @@ sub init()
m.playbackTimer = m.top.findNode("playbackTimer")
m.bufferCheckTimer = m.top.findNode("bufferCheckTimer")
m.top.observeField("state", "onState")
+ m.top.observeField("content", "onContentChange")
+
m.playbackTimer.observeField("fire", "ReportPlayback")
m.bufferPercentage = 0 ' Track whether content is being loaded
m.playReported = false
@@ -12,6 +14,88 @@ sub init()
clockNode = findNodeBySubtype(m.top, "clock")
if clockNode[0] <> invalid then clockNode[0].parent.removeChild(clockNode[0].node)
end if
+
+ 'Play Next Episode button
+ m.nextEpisodeButton = m.top.findNode("nextEpisode")
+ m.nextEpisodeButton.text = tr("Next Episode")
+ m.nextEpisodeButton.setFocus(false)
+
+ m.showNextEpisodeButtonAnimation = m.top.findNode("showNextEpisodeButton")
+ m.hideNextEpisodeButtonAnimation = m.top.findNode("hideNextEpisodeButton")
+
+ m.checkedForNextEpisode = false
+ m.getNextEpisodeTask = createObject("roSGNode", "GetNextEpisodeTask")
+ m.getNextEpisodeTask.observeField("nextEpisodeData", "onNextEpisodeDataLoaded")
+
+end sub
+
+' Event handler for when video content field changes
+sub onContentChange()
+ if not isValid(m.top.content) then return
+
+ m.top.observeField("position", "onPositionChanged")
+
+ ' If video content type is not episode, remove position observer
+ if m.top.content.contenttype <> 4
+ m.top.unobserveField("position")
+ end if
+end sub
+
+sub onNextEpisodeDataLoaded()
+ m.checkedForNextEpisode = true
+
+ m.top.observeField("position", "onPositionChanged")
+
+ if m.getNextEpisodeTask.nextEpisodeData.Items.count() <> 2
+ m.top.unobserveField("position")
+ end if
+end sub
+
+'
+' Runs Next Episode button animation and sets focus to button
+sub showNextEpisodeButton()
+ if not m.nextEpisodeButton.visible
+ m.showNextEpisodeButtonAnimation.control = "start"
+ m.nextEpisodeButton.setFocus(true)
+ m.nextEpisodeButton.visible = true
+ end if
+end sub
+
+'
+'Update count down text
+sub updateCount()
+ m.nextEpisodeButton.text = tr("Next Episode") + " " + Int(m.top.runTime - m.top.position).toStr()
+end sub
+
+'
+' Runs hide Next Episode button animation and sets focus back to video
+sub hideNextEpisodeButton()
+ m.hideNextEpisodeButtonAnimation.control = "start"
+ m.nextEpisodeButton.setFocus(false)
+ m.top.setFocus(true)
+end sub
+
+' Checks if we need to display the Next Episode button
+sub checkTimeToDisplayNextEpisode()
+ if int(m.top.position) >= (m.top.runTime - 30)
+ showNextEpisodeButton()
+ updateCount()
+ return
+ end if
+
+ if m.nextEpisodeButton.visible or m.nextEpisodeButton.hasFocus()
+ m.nextEpisodeButton.visible = false
+ m.nextEpisodeButton.setFocus(false)
+ end if
+end sub
+
+' When Video Player state changes
+sub onPositionChanged()
+ ' Check if dialog is open
+ m.dialog = m.top.getScene().findNode("dialogBackground")
+ if not isValid(m.dialog)
+ checkTimeToDisplayNextEpisode()
+ end if
end sub
'
@@ -40,6 +124,16 @@ sub onState(msg)
m.top.control = "stop"
m.top.backPressed = true
else if m.top.state = "playing"
+
+ ' Check if next episde is available
+ if isValid(m.top.showID)
+ if m.top.showID <> "" and not m.checkedForNextEpisode and m.top.content.contenttype = 4
+ m.getNextEpisodeTask.showID = m.top.showID
+ m.getNextEpisodeTask.videoID = m.top.id
+ m.getNextEpisodeTask.control = "RUN"
+ end if
+ end if
+
if m.playReported = false
ReportPlayback("start")
m.playReported = true
@@ -126,12 +220,24 @@ sub dialogClosed(msg)
sourceNode.close = true
end sub
-
-
function onKeyEvent(key as string, press as boolean) as boolean
+
+ if key = "OK" and m.nextEpisodeButton.hasfocus() and not m.top.trickPlayBar.visible
+ m.top.state = "finished"
+ hideNextEpisodeButton()
+ return true
+ else
+ 'Hide Next Episode Button
+ if m.nextEpisodeButton.visible or m.nextEpisodeButton.hasFocus()
+ m.nextEpisodeButton.visible = false
+ m.nextEpisodeButton.setFocus(false)
+ m.top.setFocus(true)
+ end if
+ end if
+
if not press then return false
- if m.top.Subtitles.count() and key = "down"
+ if key = "down"
m.top.selectSubtitlePressed = true
return true
else if key = "up"
diff --git a/components/JFVideo.xml b/components/JFVideo.xml
index 3bda0f37..3d444f16 100644
--- a/components/JFVideo.xml
+++ b/components/JFVideo.xml
@@ -22,12 +22,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file
diff --git a/components/data/MovieData.brs b/components/data/MovieData.brs
index 4bfcbfbc..b1bcaa61 100644
--- a/components/data/MovieData.brs
+++ b/components/data/MovieData.brs
@@ -8,11 +8,13 @@ sub setFields()
m.top.watched = json.UserData.played
m.top.Type = "Movie"
- if json.MediaSourceCount <> invalid and json.MediaSourceCount > 1
- m.top.mediaSources = []
- for each source in json.MediaSources
- m.top.mediaSources.push(source)
- end for
+ if isValid(json.MediaSourceCount) and json.MediaSourceCount > 1
+ if isValid(json.MediaSources)
+ m.top.mediaSources = []
+ for each source in json.MediaSources
+ m.top.mediaSources.push(source)
+ end for
+ end if
end if
if json.ProductionYear <> invalid
@@ -49,9 +51,11 @@ sub setPoster()
end if
' Add Backdrop Image
- if m.top.json.BackdropImageTags[0] <> invalid
- imgParams = { "maxHeight": 720, "maxWidth": 1280 }
- m.top.backdropURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
+ if m.top.json.BackdropImageTags <> invalid
+ if m.top.json.BackdropImageTags[0] <> invalid
+ imgParams = { "maxHeight": 720, "maxWidth": 1280 }
+ m.top.backdropURL = ImageURL(m.top.json.id, "Backdrop", imgParams)
+ end if
end if
end if
diff --git a/components/data/MovieData.xml b/components/data/MovieData.xml
index 2d73e676..f89087c1 100644
--- a/components/data/MovieData.xml
+++ b/components/data/MovieData.xml
@@ -12,4 +12,5 @@
+
diff --git a/components/extras/ExtrasRowList.brs b/components/extras/ExtrasRowList.brs
index 451d9d96..bdd1751a 100644
--- a/components/extras/ExtrasRowList.brs
+++ b/components/extras/ExtrasRowList.brs
@@ -14,6 +14,9 @@ sub init()
m.SpecialFeaturesTask = CreateObject("roSGNode", "LoadItemsTask")
m.SpecialFeaturesTask.itemsToLoad = "specialfeatures"
m.SpecialFeaturesTask.observeField("content", "onSpecialFeaturesLoaded")
+ m.LoadAdditionalPartsTask = CreateObject("roSGNode", "LoadItemsTask")
+ m.LoadAdditionalPartsTask.itemsToLoad = "additionalparts"
+ m.LoadAdditionalPartsTask.observeField("content", "onAdditionalPartsLoaded")
m.LoadMoviesTask = CreateObject("roSGNode", "LoadItemsTask")
m.LoadMoviesTask.itemsToLoad = "personMovies"
m.LoadShowsTask = CreateObject("roSGNode", "LoadItemsTask")
@@ -28,10 +31,11 @@ sub updateSize()
m.top.rowItemSpacing = [36, 36]
end sub
-sub loadPeople(data as object)
+sub loadParts(data as object)
m.top.parentId = data.id
- m.LoadPeopleTask.peopleList = data.People
- m.LoadPeopleTask.control = "RUN"
+ m.people = data.People
+ m.LoadAdditionalPartsTask.itemId = m.top.parentId
+ m.LoadAdditionalPartsTask.control = "RUN"
end sub
sub loadPersonVideos(personId)
@@ -41,12 +45,32 @@ sub loadPersonVideos(personId)
m.LoadMoviesTask.control = "RUN"
end sub
+sub onAdditionalPartsLoaded()
+ parts = m.LoadAdditionalPartsTask.content
+ m.LoadAdditionalPartsTask.unobserveField("content")
+
+ data = CreateObject("roSGNode", "ContentNode") ' The row Node
+ m.top.content = data
+ if parts <> invalid and parts.count() > 0
+ row = buildRow("Additional Parts", parts, 464)
+ addRowSize([464, 291])
+ m.top.content.appendChild(row)
+ m.top.rowItemSize = [[464, 291]]
+ else
+ m.top.rowItemSize = [[234, 396]]
+ end if
+ m.top.translation = "[75,10]"
+
+ ' Load Cast and Crew and everything else...
+ m.LoadPeopleTask.peopleList = m.people
+ m.LoadPeopleTask.control = "RUN"
+end sub
+
sub onPeopleLoaded()
people = m.LoadPeopleTask.content
m.loadPeopleTask.unobserveField("content")
- data = CreateObject("roSGNode", "ContentNode") ' The row Node
if people <> invalid and people.count() > 0
- row = data.createChild("ContentNode")
+ row = m.top.content.createChild("ContentNode")
row.Title = tr("Cast & Crew")
for each person in people
if person.json.type = "Actor" and person.json.Role <> invalid
@@ -58,9 +82,6 @@ sub onPeopleLoaded()
row.appendChild(person)
end for
end if
- m.top.content = data
- m.top.translation = "[75,10]"
- m.top.rowItemSize = [[234, 396]]
m.LikeThisTask.itemId = m.top.parentId
m.LikeThisTask.control = "RUN"
end sub
@@ -86,6 +107,7 @@ sub onLikeThisLoaded()
end for
addRowSize([234, 396])
end if
+ ' Special Features next...
m.SpecialFeaturesTask.itemId = m.top.parentId
m.SpecialFeaturesTask.control = "RUN"
end sub
diff --git a/components/extras/ExtrasRowList.xml b/components/extras/ExtrasRowList.xml
index d3b2e14f..ac412649 100644
--- a/components/extras/ExtrasRowList.xml
+++ b/components/extras/ExtrasRowList.xml
@@ -5,7 +5,7 @@
-
+
diff --git a/components/home/HomeItem.brs b/components/home/HomeItem.brs
index 057a8d00..a70df44f 100644
--- a/components/home/HomeItem.brs
+++ b/components/home/HomeItem.brs
@@ -133,6 +133,7 @@ sub itemContentChanged()
end if
return
end if
+
if itemData.type = "Series"
m.itemText.text = itemData.name
@@ -170,6 +171,34 @@ sub itemContentChanged()
return
end if
+ if itemData.type = "MusicArtist"
+ m.itemText.text = itemData.name
+ m.itemTextExtra.text = itemData.json.AlbumArtist
+ m.itemPoster.uri = ImageURL(itemData.id)
+ return
+ end if
+
+ if itemData.type = "Audio"
+ m.itemText.text = itemData.name
+ m.itemTextExtra.text = itemData.json.AlbumArtist
+ m.itemPoster.uri = ImageURL(itemData.id)
+ return
+ end if
+
+ if itemData.type = "TvChannel"
+ m.itemText.text = itemData.name
+ m.itemTextExtra.text = itemData.json.AlbumArtist
+ m.itemPoster.uri = ImageURL(itemData.id)
+ return
+ end if
+
+ if itemData.type = "Season"
+ m.itemText.text = itemData.json.SeriesName
+ m.itemTextExtra.text = itemData.name
+ m.itemPoster.uri = ImageURL(itemData.id)
+ return
+ end if
+
print "Unhandled Home Item Type: " + itemData.type
end sub
diff --git a/components/home/HomeRows.brs b/components/home/HomeRows.brs
index ae025c32..57b3a21b 100644
--- a/components/home/HomeRows.brs
+++ b/components/home/HomeRows.brs
@@ -19,13 +19,19 @@ sub init()
' Load the Libraries from API via task
m.LoadLibrariesTask = createObject("roSGNode", "LoadItemsTask")
m.LoadLibrariesTask.observeField("content", "onLibrariesLoaded")
+
' set up tesk nodes for other rows
m.LoadContinueTask = createObject("roSGNode", "LoadItemsTask")
m.LoadContinueTask.itemsToLoad = "continue"
+
m.LoadNextUpTask = createObject("roSGNode", "LoadItemsTask")
m.LoadNextUpTask.itemsToLoad = "nextUp"
+
m.LoadOnNowTask = createObject("roSGNode", "LoadItemsTask")
m.LoadOnNowTask.itemsToLoad = "onNow"
+
+ m.LoadFavoritesTask = createObject("roSGNode", "LoadItemsTask")
+ m.LoadFavoritesTask.itemsToLoad = "favorites"
end sub
sub loadLibraries()
@@ -61,20 +67,28 @@ sub onLibrariesLoaded()
continueRow.title = tr("Continue Watching")
nextUpRow = content.CreateChild("HomeRow")
nextUpRow.title = tr("Next Up >")
+
+ favoritesRow = content.CreateChild("HomeRow")
+ favoritesRow.title = tr("Favorites")
+
sizeArray = [
[464, 311], ' My Media
[464, 331], ' Continue Watching
- [464, 331] ' Next Up
+ [464, 331], ' Next Up
+ [464, 331] ' Favorites
]
+
haveLiveTV = false
' validate library data
if m.libraryData <> invalid and m.libraryData.count() > 0
userConfig = m.top.userConfig
+
' populate My Media row
filteredMedia = filterNodeArray(m.libraryData, "id", userConfig.MyMediaExcludes)
for each item in filteredMedia
mediaRow.appendChild(item)
end for
+
' create a "Latest In" row for each library
filteredLatest = filterNodeArray(m.libraryData, "id", userConfig.LatestItemsExcludes)
for each lib in filteredLatest
@@ -99,6 +113,10 @@ sub onLibrariesLoaded()
m.LoadContinueTask.observeField("content", "updateContinueItems")
m.LoadContinueTask.control = "RUN"
+ ' Load the Favorites Data
+ m.LoadFavoritesTask.observeField("content", "updateFavoritesItems")
+ m.LoadFavoritesTask.control = "RUN"
+
' If we have Live TV access, load "On Now" data
if haveLiveTV
m.LoadOnNowTask.observeField("content", "updateOnNowItems")
@@ -116,6 +134,51 @@ sub updateHomeRows()
m.LoadContinueTask.control = "RUN"
end sub
+sub updateFavoritesItems()
+ itemData = m.LoadFavoritesTask.content
+ m.LoadFavoritesTask.unobserveField("content")
+ m.LoadFavoritesTask.content = []
+
+ if itemData = invalid then return
+
+ homeRows = m.top.content
+ rowIndex = getRowIndex("Favorites")
+
+ if itemData.count() < 1
+ if rowIndex <> invalid
+ ' remove the row
+ deleteFromSizeArray(rowIndex)
+ homeRows.removeChildIndex(rowIndex)
+ end if
+ else
+ ' remake row using the new data
+ row = CreateObject("roSGNode", "HomeRow")
+ row.title = tr("Favorites")
+ itemSize = [464, 331]
+
+ for each item in itemData
+ usePoster = true
+
+ if lcase(item.type) = "episode" or lcase(item.type) = "audio" or lcase(item.type) = "musicartist"
+ usePoster = false
+ end if
+
+ item.usePoster = usePoster
+ item.imageWidth = row.imageWidth
+ row.appendChild(item)
+ end for
+
+ if rowIndex = invalid
+ ' insert new row under "My Media"
+ updateSizeArray(itemSize, 1)
+ homeRows.insertChild(row, 1)
+ else
+ ' replace the old row
+ homeRows.replaceChild(row, rowIndex)
+ end if
+ end if
+end sub
+
sub updateContinueItems()
itemData = m.LoadContinueTask.content
m.LoadContinueTask.unobserveField("content")
diff --git a/components/home/LoadItemsTask.brs b/components/home/LoadItemsTask.brs
index 796421b3..3ac51aec 100644
--- a/components/home/LoadItemsTask.brs
+++ b/components/home/LoadItemsTask.brs
@@ -100,6 +100,27 @@ sub loadItems()
end if
end for
+ else if m.top.itemsToLoad = "favorites"
+
+ url = Substitute("Users/{0}/Items", get_setting("active_user"))
+
+ params = {}
+ params["Filters"] = "IsFavorite"
+ params["Limit"] = 20
+ params["recursive"] = true
+ params["sortby"] = "random"
+
+ resp = APIRequest(url, params)
+ data = getJson(resp)
+ for each item in data.Items
+ ' Skip Books for now as we don't support it (issue #558)
+ if item.Type <> "Book"
+ tmp = CreateObject("roSGNode", "HomeData")
+ tmp.json = item
+ results.push(tmp)
+ end if
+ end for
+
else if m.top.itemsToLoad = "onNow"
url = "LiveTv/Programs/Recommended"
params = {}
@@ -151,6 +172,20 @@ sub loadItems()
tmp.json = specfeat
end for
end if
+ else if m.top.itemsToLoad = "additionalparts"
+ additionalParts = api_API().videos.getAdditionalParts(m.top.itemId)
+ if isValid(additionalParts)
+ for each part in additionalParts.items
+ tmp = CreateObject("roSGNode", "ExtrasData")
+ params = {}
+ params["Tags"] = part.ImageTags.Primary
+ params["MaxWidth"] = 450
+ params["MaxHeight"] = 402
+ tmp.posterURL = ImageUrl(part.Id, "Primary", params)
+ tmp.json = part
+ results.push(tmp)
+ end for
+ end if
else if m.top.itemsToLoad = "likethis"
params = { "userId": get_setting("active_user"), "limit": 16 }
url = Substitute("Items/{0}/Similar", m.top.itemId)
diff --git a/components/home/LoadItemsTask.xml b/components/home/LoadItemsTask.xml
index fc5d37e8..45cd24cb 100644
--- a/components/home/LoadItemsTask.xml
+++ b/components/home/LoadItemsTask.xml
@@ -15,4 +15,5 @@
+
diff --git a/components/liveTv/schedule.brs b/components/liveTv/schedule.brs
index 49cdfa05..cad9386f 100644
--- a/components/liveTv/schedule.brs
+++ b/components/liveTv/schedule.brs
@@ -44,7 +44,14 @@ end sub
'Voice Search set
sub channelsearchTermSet()
m.scheduleGrid.jumpToChannel = 0
- if m.top.searchTerm <> invalid and m.LoadChannelsTask.searchTerm <> m.top.searchTerm
+ 'Reset filter if user says all
+ if LCase(m.top.searchTerm) = LCase(tr("all")) or m.LoadChannelsTask.searchTerm = LCase(tr("all"))
+ m.top.searchTerm = " "
+ m.LoadChannelsTask.searchTerm = " "
+ m.spinner.visible = true
+ m.LoadChannelsTask.control = "RUN"
+ 'filter if the searterm is not invalid
+ else if m.top.searchTerm <> invalid and LCase(m.LoadChannelsTask.searchTerm) <> LCase(m.top.searchTerm)
if m.LoadChannelsTask.state = "run" then m.LoadChannelsTask.control = "stop"
m.LoadChannelsTask.searchTerm = m.top.searchTerm
@@ -279,6 +286,7 @@ end sub
function onKeyEvent(key as string, press as boolean) as boolean
if not press then return false
+
detailsGrp = m.top.findNode("detailsPane")
gridGrp = m.top.findNode("scheduleGrid")
diff --git a/components/movies/MovieDetails.brs b/components/movies/MovieDetails.brs
index 837b35be..81bedbc4 100644
--- a/components/movies/MovieDetails.brs
+++ b/components/movies/MovieDetails.brs
@@ -55,14 +55,20 @@ sub itemContentChanged()
' Handle all "As Is" fields
m.top.overhangTitle = itemData.name
setFieldText("releaseYear", itemData.productionYear)
- setFieldText("officialRating", itemData.officialRating)
setFieldText("overview", itemData.overview)
+ if itemData.officialRating <> invalid
+ setFieldText("officialRating", itemData.officialRating)
+ else
+ m.top.findNode("infoGroup").removeChild(m.top.findNode("officialRating"))
+ end if
+
if itemData.communityRating <> invalid
setFieldText("communityRating", int(itemData.communityRating * 10) / 10)
+ m.top.findNode("star").visible = "true"
else
' hide the star icon
- m.top.findNode("communityRatingGroup").visible = false
+ m.top.findNode("infoGroup").removeChild(m.top.findNode("communityRatingGroup"))
end if
if itemData.CriticRating <> invalid
@@ -86,6 +92,8 @@ sub itemContentChanged()
if itemData.genres.count() > 0
setFieldText("genres", tr("Genres") + ": " + itemData.genres.join(", "))
+ else
+ m.top.findNode("details").removeChild(m.top.findNode("genres"))
end if
' show tags if there are no genres to display
@@ -101,10 +109,8 @@ sub itemContentChanged()
end for
if directors.count() > 0
setFieldText("director", tr("Director") + ": " + directors.join(", "))
- end if
-
- if itemData.mediaStreams[0] <> invalid
- setFieldText("video_codec", tr("Video") + ": " + itemData.mediaStreams[0].displayTitle)
+ else
+ m.top.findNode("details").removeChild(m.top.findNode("director"))
end if
if get_user_setting("ui.details.hidetagline") = "false"
@@ -115,6 +121,15 @@ sub itemContentChanged()
m.details.removeChild(m.tagline)
end if
+ 'set aired date if type is Episode
+ if itemData.PremiereDate <> invalid and itemData.Type = "Episode"
+ airDate = CreateObject("roDateTime")
+ airDate.FromISO8601String(itemData.PremiereDate)
+ m.top.findNode("aired").text = tr("Aired") + ": " + airDate.AsDateString("short-month-no-weekday")
+ 'remove movie release year label
+ m.top.findNode("infoGroup").removeChild(m.top.findNode("releaseYear"))
+ end if
+
setFavoriteColor()
setWatchedColor()
SetUpVideoOptions(itemData.mediaSources)
@@ -125,11 +140,28 @@ end sub
sub SetUpVideoOptions(streams)
videos = []
+ codecDetailsSet = false
for i = 0 to streams.Count() - 1
if streams[i].VideoType = "VideoFile"
codec = ""
- if streams[i].mediaStreams <> invalid and streams[i].mediaStreams.Count() > 0 then codec = streams[i].mediaStreams[0].displayTitle
+ if streams[i].mediaStreams <> invalid and streams[i].mediaStreams.Count() > 0
+
+ ' find the first (default) video track to get the codec for the details screen
+ if codecDetailsSet = false
+ for index = 0 to streams[i].mediaStreams.Count() - 1
+ if streams[i].mediaStreams[index].Type = "Video"
+ setFieldText("video_codec", tr("Video") + ": " + streams[i].mediaStreams[index].displayTitle)
+ codecDetailsSet = true
+ exit for
+ end if
+ end for
+ end if
+
+ codec = streams[i].mediaStreams[0].displayTitle
+ end if
+
+ ' Create options for user to switch between video tracks
videos.push({
"Title": streams[i].Name,
"Description": tr("Video"),
diff --git a/components/movies/MovieDetails.xml b/components/movies/MovieDetails.xml
index 25534f55..5e55073c 100644
--- a/components/movies/MovieDetails.xml
+++ b/components/movies/MovieDetails.xml
@@ -9,7 +9,7 @@
@@ -17,6 +17,7 @@
+
diff --git a/components/music/NowPlaying.brs b/components/music/NowPlaying.brs
index 04645c7a..ecf3323e 100644
--- a/components/music/NowPlaying.brs
+++ b/components/music/NowPlaying.brs
@@ -408,7 +408,7 @@ sub onMetaDataLoaded()
if data <> invalid and data.count() > 0
' Use metadata to load backdrop image
- if isvalid(data.json)
+ if isValid(data.json)
if isValid(data.json.ArtistItems)
if data.json.ArtistItems.count() > 0
if isValid(data.json.ArtistItems[0].id)
diff --git a/components/photos/PhotoDetails.brs b/components/photos/PhotoDetails.brs
index 0903a779..4494022e 100644
--- a/components/photos/PhotoDetails.brs
+++ b/components/photos/PhotoDetails.brs
@@ -1,21 +1,123 @@
sub init()
- m.top.optionsAvailable = false ' Change once Shuffle option is added
+ m.top.optionsAvailable = true
m.top.overhangVisible = false
+ m.slideshowTimer = m.top.findNode("slideshowTimer")
+ m.slideshowTimer.observeField("fire", "nextSlide")
+ m.status = m.top.findNode("status")
+ m.textBackground = m.top.findNode("background")
+ m.statusTimer = m.top.findNode("statusTimer")
+ m.statusTimer.observeField("fire", "statusUpdate")
+ m.slideshow = get_user_setting("photos.slideshow")
+ m.random = get_user_setting("photos.random")
+
+ m.showStatusAnimation = m.top.findNode("showStatusAnimation")
+ m.hideStatusAnimation = m.top.findNode("hideStatusAnimation")
+
+ itemContentChanged()
end sub
sub itemContentChanged()
- m.LoadLibrariesTask = createObject("roSGNode", "LoadPhotoTask")
- m.LoadLibrariesTask.itemContent = m.top.itemContent
- m.LoadLibrariesTask.observeField("results", "onPhotoLoaded")
- m.LoadLibrariesTask.control = "RUN"
+ if isValidToContinue(m.top.itemIndex)
+ m.LoadLibrariesTask = createObject("roSGNode", "LoadPhotoTask")
+ itemContent = m.top.items.content.getChild(m.top.itemIndex)
+ m.LoadLibrariesTask.itemContent = itemContent
+ m.LoadLibrariesTask.observeField("results", "onPhotoLoaded")
+ m.LoadLibrariesTask.control = "RUN"
+ end if
end sub
sub onPhotoLoaded()
if m.LoadLibrariesTask.results <> invalid
photo = m.top.findNode("photo")
photo.uri = m.LoadLibrariesTask.results
+
+ if m.slideshow = "true" or m.random = "true"
+ ' user has requested either a slideshow or random...
+ m.slideshowTimer.control = "start"
+ end if
else
'Show user error here (for example if it's not a supported image type)
message_dialog("This image type is not supported.")
end if
end sub
+
+sub nextSlide()
+ m.slideshowTimer.control = "stop"
+
+ if m.slideshow = "true"
+ if isValidToContinue(m.top.itemIndex + 1)
+ m.top.itemIndex++
+ m.slideshowTimer.control = "start"
+ end if
+ else if m.random = "true"
+ index = rnd(m.top.items.content.getChildCount() - 1)
+ if isValidToContinue(index)
+ m.top.itemIndex = index
+ m.slideshowTimer.control = "start"
+ end if
+ end if
+end sub
+
+sub statusUpdate()
+ m.statusTimer.control = "stop"
+ m.hideStatusAnimation.control = "start"
+end sub
+
+function onKeyEvent(key as string, press as boolean) as boolean
+ if not press then return false
+
+ if key = "right"
+ if isValidToContinue(m.top.itemIndex + 1)
+ m.slideshowTimer.control = "stop"
+ m.top.itemIndex++
+ end if
+ return true
+ end if
+
+ if key = "left"
+ if isValidToContinue(m.top.itemIndex - 1)
+ m.slideshowTimer.control = "stop"
+ m.top.itemIndex--
+ end if
+ return true
+ end if
+
+ if key = "play"
+ if m.slideshowTimer.control = "start"
+ ' stop the slideshow if the user hits "pause"
+ m.slideshowTimer.control = "stop"
+ m.status.text = tr("Slideshow Paused")
+ if m.textBackground.opacity = 0
+ m.showStatusAnimation.control = "start"
+ end if
+ m.statusTimer.control = "start"
+ else
+ ' start the slideshow if the user hits "play"
+ m.status.text = tr("Slideshow Resumed")
+ if m.textBackground.opacity = 0
+ m.showStatusAnimation.control = "start"
+ end if
+ m.slideshow = "true"
+ m.statusTimer.control = "start"
+ m.slideshowTimer.control = "start"
+ end if
+ return true
+ end if
+
+ if key = "options"
+ ' Options (random etc) is done on itemGrid
+ return true
+ end if
+
+ return false
+end function
+
+function isValidToContinue(index as integer)
+ if isValid(m.top.items) and isValid(m.top.items.content)
+ if index >= 0 and index < m.top.items.content.getChildCount()
+ return true
+ end if
+ end if
+
+ return false
+end function
diff --git a/components/photos/PhotoDetails.xml b/components/photos/PhotoDetails.xml
index ea7d7f7e..12867c1d 100644
--- a/components/photos/PhotoDetails.xml
+++ b/components/photos/PhotoDetails.xml
@@ -1,13 +1,28 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
diff --git a/components/photos/PhotoPlayerTask.brs b/components/photos/PhotoPlayerTask.brs
deleted file mode 100644
index 337f6da6..00000000
--- a/components/photos/PhotoPlayerTask.brs
+++ /dev/null
@@ -1,17 +0,0 @@
-sub init()
- m.top.functionName = "loadItems"
-end sub
-
-sub loadItems()
- item = m.top.itemContent
-
- group = CreateObject("roSGNode", "PhotoDetails")
- group.optionsAvailable = false
- m.global.sceneManager.callFunc("pushScene", group)
-
- group.itemContent = item
-
- ' TODO/FIXME:
- ' Wait some time and move to the next photo...
-
-end sub
diff --git a/components/photos/PhotoPlayerTask.xml b/components/photos/PhotoPlayerTask.xml
deleted file mode 100644
index 0f7ef147..00000000
--- a/components/photos/PhotoPlayerTask.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/components/search/SearchResults.brs b/components/search/SearchResults.brs
index 8fb9ba3c..5dc18656 100644
--- a/components/search/SearchResults.brs
+++ b/components/search/SearchResults.brs
@@ -48,7 +48,7 @@ function onKeyEvent(key as string, press as boolean) as boolean
m.searchAlphabox.textEditBox.translation = "[0, 0]"
end if
- if key = "left" and m.searchSelect.isinFocusChain() and (m.searchSelect.currFocusColumn = -1 or m.searchSelect.currFocusColumn = 0)
+ if key = "left" and m.searchSelect.isinFocusChain()
m.searchAlphabox.setFocus(true)
return true
else if key = "right"
diff --git a/components/tvshows/TVListDetails.brs b/components/tvshows/TVListDetails.brs
index 318713b3..19f5ff2c 100644
--- a/components/tvshows/TVListDetails.brs
+++ b/components/tvshows/TVListDetails.brs
@@ -18,6 +18,12 @@ sub itemContentChanged()
m.title.text = indexNumber + item.title
m.overview.text = item.overview
+ if itemData.PremiereDate <> invalid
+ airDate = CreateObject("roDateTime")
+ airDate.FromISO8601String(itemData.PremiereDate)
+ m.top.findNode("aired").text = tr("Aired") + ": " + airDate.AsDateString("short-month-no-weekday")
+ end if
+
imageUrl = item.posterURL
if get_user_setting("ui.tvshows.blurunwatched") = "true"
@@ -30,8 +36,14 @@ sub itemContentChanged()
m.poster.uri = imageUrl
- if type(itemData.RunTimeTicks) = "LongInteger"
- m.top.findNode("runtime").text = stri(getRuntime()).trim() + " mins"
+ if type(itemData.RunTimeTicks) = "roInt" or type(itemData.RunTimeTicks) = "LongInteger"
+ runTime = getRuntime()
+ if runTime < 2
+ m.top.findNode("runtime").text = "1 min"
+ else
+ m.top.findNode("runtime").text = stri(runTime).trim() + " mins"
+ end if
+
if get_user_setting("ui.design.hideclock") <> "true"
m.top.findNode("endtime").text = tr("Ends at %1").Replace("%1", getEndTime())
end if
@@ -41,7 +53,8 @@ sub itemContentChanged()
m.top.findNode("star").visible = true
m.top.findNode("communityRating").text = str(int(itemData.communityRating * 10) / 10)
else
- m.top.findNode("star").visible = false
+
+ m.top.findnode("infoBar").removeChild(m.top.findnode("rating"))
end if
videoIdx = invalid
diff --git a/components/tvshows/TVListDetails.xml b/components/tvshows/TVListDetails.xml
index e58becd3..4cb79d61 100644
--- a/components/tvshows/TVListDetails.xml
+++ b/components/tvshows/TVListDetails.xml
@@ -8,13 +8,14 @@
-
+
-
+
+
diff --git a/components/tvshows/TVShowDetails.brs b/components/tvshows/TVShowDetails.brs
index 3799f6b1..0c538671 100644
--- a/components/tvshows/TVShowDetails.brs
+++ b/components/tvshows/TVShowDetails.brs
@@ -17,14 +17,31 @@ sub itemContentChanged()
' Handle all "As Is" fields
m.top.overhangTitle = itemData.name
- setFieldText("releaseYear", itemData.productionYear)
- setFieldText("officialRating", itemData.officialRating)
+
+ 'Check production year, if invalid remove label
+ if itemData.productionYear <> invalid
+ setFieldText("releaseYear", itemData.productionYear)
+ else
+ m.top.findNode("main_group").removeChild(m.top.findNode("releaseYear"))
+ end if
+
+ 'Check officialRating, if invalid remove label
+ if itemData.officialRating <> invalid
+ setFieldText("officialRating", itemData.officialRating)
+ else
+ m.top.findNode("main_group").removeChild(m.top.findNode("officialRating"))
+ end if
+
+ 'Check communityRating, if invalid remove label
if itemData.communityRating <> invalid
m.top.findNode("star").visible = true
setFieldText("communityRating", int(itemData.communityRating * 10) / 10)
else
+ m.top.findNode("main_group").removeChild(m.top.findNode("communityRating"))
+ m.top.findNode("main_group").removeChild(m.top.findNode("star"))
m.top.findNode("star").visible = false
end if
+
setFieldText("overview", itemData.overview)
@@ -32,11 +49,17 @@ sub itemContentChanged()
setFieldText("runtime", stri(getRuntime()) + " mins")
end if
+ 'History feild is set via the function getHistory()
setFieldText("history", getHistory())
+ 'Check genres, if invalid remove label
if itemData.genres.count() > 0
setFieldText("genres", itemData.genres.join(", "))
+ else
+ m.top.findNode("main_group").removeChild(m.top.findNode("genres"))
end if
+
+ 'We don't display Directors in the show page. Might want to remove this.
for each person in itemData.people
if person.type = "Director"
exit for
@@ -44,6 +67,8 @@ sub itemContentChanged()
end for
if itemData.taglines.count() > 0
setFieldText("tagline", itemData.taglines[0])
+ else
+ m.top.findNode("main_group").removeChild(m.top.findNode("tagline"))
end if
end sub
@@ -105,6 +130,7 @@ function getHistory() as string
end if
if studio = invalid and airwords = invalid
+ m.top.findNode("main_group").removeChild(m.top.findNode("history"))
return ""
end if
diff --git a/components/tvshows/TVShowDetails.xml b/components/tvshows/TVShowDetails.xml
index b135f4eb..199210e8 100644
--- a/components/tvshows/TVShowDetails.xml
+++ b/components/tvshows/TVShowDetails.xml
@@ -9,7 +9,7 @@
-
+
diff --git a/locale/de_DE/translations.ts b/locale/de_DE/translations.ts
index f1ad1229..3b652063 100644
--- a/locale/de_DE/translations.ts
+++ b/locale/de_DE/translations.ts
@@ -8295,5 +8295,134 @@
Server wechseln
+
+
+ Zugangsdaten speichern?
+
+
+
+ Fehler beim Abrufen des Inhaltes
+ Dialog title when unable to load Content from Server
+
+
+
+ Fehler bei der Wiedergabe
+ Dialog title when error occurs during playback
+
+
+
+ Es ist ein Fehler beim Abrufen der Daten vom Server aufgetreten.
+ Dialog detail when unable to load Content from Server
+
+
+
+ Bei der Wiedergabe dieses Elements ist ein Fehler aufgetreten.
+ Dialog detail when error occurs during playback
+
+
+
+ Kanaldaten können nicht vom Server geladen werden
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Dieser %1 enthält keine Dateien
+
+
+ Name or Title field of media item
+
+ Name
+
+
+
+ Kritikerbewertung
+
+
+
+ Veröffentlichungsdatum
+
+
+ Title of Tab for options to sort library content
+
+ Sortierung
+
+
+
+ Geboren am
+
+
+
+ Alter
+
+
+
+ Besetzung & Mitwirkende
+
+
+
+ Gestorben am
+
+
+
+ Abmelden
+
+
+
+ Jetzt verfügbar
+
+
+
+ Fehler beim Laden der Kanalinformationen
+
+
+ Title of Tab for switching "views" when looking at a library
+
+ Übersicht
+
+
+
+ Ähnliches
+
+
+
+ Filme
+
+
+
+ Laufzeit
+
+
+
+ Altersfreigabe
+
+
+
+ Lade Daten des Kanals
+
+
+
+ IMDb Bewertung
+
+
+
+ Wiedergabezähler
+
+
+ Title of Tab for options to filter library content
+
+ Filter
+
+
+
+ Server wechseln
+
+
+
+ Abgespielt am
+
+
+
+ Hinzugefügt am
+
diff --git a/locale/en_GB/translations.ts b/locale/en_GB/translations.ts
index 35326b04..b5fb7e86 100644
--- a/locale/en_GB/translations.ts
+++ b/locale/en_GB/translations.ts
@@ -1844,5 +1844,276 @@
Disabled
+
+
+ Use voice remote to search
+ Help text in search voice text box
+
+
+
+ Use the replay button to slowly animate to the first item in the folder. (If disabled, the folder will reset to the first item immediately).
+ Description for option in Setting Screen
+
+
+
+ Options for TV Shows.
+ Description for TV Shows user settings.
+
+
+
+ Cinema Mode brings the cinema experience straight to your living room with the ability to play custom intros before the main feature.
+ Settings Menu - Description for option
+
+
+
+ Hides all clocks in Jellyfin. Jellyfin will need to be closed and reopened for change to take effect.
+ Settings Menu - Description for option
+
+
+
+ Settings relating to playback and supported codec and media types.
+
+
+
+ Settings relating to how the application looks.
+
+
+
+ Studios
+
+
+
+ Return to Top
+ UI -> Media Grid -> Item Title in user setting screen.
+
+
+
+ Details Page
+
+
+
+ Hide Taglines
+ Option Title in user setting screen
+
+
+
+ Use Splashscreen as Screensaver Background
+ Option Title in user setting screen
+
+
+
+ Playback Information
+
+
+
+ Transcoding Information
+
+
+
+ Video Codec
+
+
+
+ Audio Codec
+
+
+
+ direct
+
+
+
+ Level
+ Video profile level
+
+
+
+ Bit Rate
+ Video streaming bit rate
+
+
+
+ Size
+ Video size
+
+
+
+ WxH
+ Video width x height
+
+
+
+ Quick Connect
+
+
+
+ Here is your Quick Connect code:
+
+
+
+ (Dialogue will close automatically)
+
+
+
+ Play Trailer
+
+
+
+ Home Page
+
+
+
+ Options for Home Page.
+ Description for Home Page user settings.
+
+
+
+ Cinema Mode
+ Settings Menu - Title for option
+
+
+
+ Use Splashscreen as Home Background
+ Option Title in user setting screen
+
+
+
+ Design Elements
+
+
+
+ Screensaver
+
+
+
+ Search now
+ Help text in search Box
+
+
+
+ Go to episode
+ Continue Watching Popup Menu - Navigate to the Episode Detail Page
+
+
+
+ Go to season
+ Continue Watching Popup Menu - Navigate to the Season Page
+
+
+
+ You can search for Titles, People, Live TV Channels and more
+ Help text in search results
+
+
+
+ %1 of %2
+ Item position and count. %1 = current item. %2 = total number of items
+
+
+
+ There was an error authenticating via Quick Connect.
+
+
+
+ Networks
+
+
+
+ Shows
+
+
+
+ Options for Details pages.
+ Description for Details page user settings.
+
+
+
+ Hides tagline text on details pages.
+
+
+
+ Blur Unwatched Episodes
+ Option Title in user setting screen
+
+
+
+ If enabled, images of unwatched episodes will be blurred.
+
+
+
+ Options for Jellyfin's screensaver.
+ Description for Screensaver user settings.
+
+
+
+ Use generated splashscreen image as Jellyfin's screensaver background. Jellyfin will need to be closed and reopened for change to take effect.
+
+
+
+ Options that alter the design of Jellyfin.
+ Description for Design Elements user settings.
+
+
+
+ Use generated splashscreen image as Jellyfin's home background. Jellyfin will need to be closed and reopened for change to take effect.
+ Description for option in Setting Screen
+
+
+
+ Hide Clock
+ Option Title in user setting screen
+
+
+
+ Max Days Next Up
+ Option Title in user setting screen
+
+
+
+ Set the maximum amount of days a show should stay in the 'Next Up' list without watching it.
+ Settings Menu - Description for option
+
+
+
+ Reason
+
+
+
+ Total Bitrate
+
+
+
+ Audio Channels
+
+
+
+ Stream Information
+
+
+
+ Codec
+
+
+
+ Codec Tag
+
+
+
+ Container
+ Video streaming container
+
+
+
+ Video range type
+
+
+
+ Pixel format
+ Video pixel format
+
+
+
+ Unable to find any albums or songs belonging to this artist
+ Popup message when we find no audio data for an artist
+
diff --git a/locale/en_US/translations.ts b/locale/en_US/translations.ts
index 53ab194d..8d86143d 100644
--- a/locale/en_US/translations.ts
+++ b/locale/en_US/translations.ts
@@ -285,13 +285,18 @@
More Like This
+
+
+ Press 'OK' to Close
+
Special Features
-
-
- Press 'OK' to Close
-
+
+
+
+ Additional Parts
+ Additional parts of a video
@@ -489,6 +494,16 @@
Support Direct Play of MPEG-2 content (e.g., Live TV). This will prevent transcoding of MPEG-2 content, but uses significantly more bandwidth.
Settings Menu - Description for option
+
+
+ AV1 Support
+ Settings Menu - Title for option
+
+
+
+ ** EXPERIMENTAL** Support Direct Play of AV1 content if this Roku device supports it.
+ Settings Menu - Description for option
+
Enabled
@@ -703,10 +718,34 @@
Hides all clocks in Jellyfin. Jellyfin will need to be closed and reopened for change to take effect.
Settings Menu - Description for option
+
+
+ Next episode
+
Play Trailer
+
+
+ Direct Play H.264 Unsupported Profile Levels
+ Settings Menu - Title for option
+
+
+
+ Attempt Direct Play for H.264 media with unsupported profile levels before falling back to transcoding if it fails.
+ Settings Menu - Description for option
+
+
+
+ Direct Play HEVC Unsupported Profile Levels
+ Settings Menu - Title for option
+
+
+
+ Attempt Direct Play for HEVC media with unsupported profile levels before falling back to trancoding if it fails.
+ Settings Menu - Description for option
+
Settings relating to playback and supported codec and media types.
@@ -817,5 +856,49 @@
Unable to find any albums or songs belonging to this artist
Popup message when we find no audio data for an artist
+
+
+ all
+ all will reset the searchTerm so all data will be availible
+
+
+
+ Aired
+ Aired date label
+
+
+
+ Slideshow Off
+
+
+
+ Slideshow On
+
+
+
+ Slideshow Paused
+
+
+
+ Slideshow Resumed
+
+
+
+ Random Off
+
+
+
+ Random On
+
+
+
+ MPEG-4 Support
+ Settings Menu - Title for option
+
+
+
+ Support Direct Play of MPEG-4 content. This may need to be disabled for playback of DIVX encoded video files.
+ Settings Menu - Description for option
+
diff --git a/locale/es_419/translations.ts b/locale/es_419/translations.ts
index 224f5996..635100f3 100644
--- a/locale/es_419/translations.ts
+++ b/locale/es_419/translations.ts
@@ -1614,5 +1614,104 @@
Guardar credenciales?
+
+
+ Guardar Credenciales?
+
+
+
+ Error al recuperar contenido
+ Dialog title when unable to load Content from Server
+
+
+
+ Se ha encontrado un error mientras se reproducía este ítem.
+ Dialog detail when error occurs during playback
+
+
+
+ Error al cargar datos del canal
+
+
+
+ Peliculas
+
+
+
+ Programa de TV
+
+
+
+ Hoy
+ Current day
+
+
+
+ Ayer
+ Previous day
+
+
+
+ Error durante la reproducción
+ Dialog title when error occurs during playback
+
+
+ Name or Title field of media item
+
+ Nombre
+
+
+
+ Calificación de los Críticos
+
+
+
+ Lunes
+ Day of Week
+
+
+
+ Cargando información del canal
+
+
+
+ Borrado confirmado
+
+
+
+ Ocurrió un error al recuperar los datos para este ítem desde el servidor.
+ Dialog detail when unable to load Content from Server
+
+
+
+ No se pudo cargar los datos del canal desde el servidor
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Este %1 no contiene ítems
+
+
+
+ Calificación IMDb
+
+
+
+ Funciones especiales
+
+
+ Press 'OK' to Close
+
+
+
+
+ Mañana
+ Next day
+
+
+
+ Domingo
+ Day of Week
+
diff --git a/locale/es_ES/translations.ts b/locale/es_ES/translations.ts
index 4bbde2c5..d160ddd0 100644
--- a/locale/es_ES/translations.ts
+++ b/locale/es_ES/translations.ts
@@ -1884,5 +1884,320 @@
Nombre
+
+
+ Error de Reproducción de Contenido de Canal
+
+
+
+ Terminar Sesión
+
+
+
+ Borrar Credenciales
+
+
+
+ Edad
+
+
+
+ Criticas Raiting
+
+
+
+ Nacido/a
+
+
+
+ hoy
+ Current day
+
+
+
+ Reproduciendo Contenido de Canal
+
+
+
+ Canales
+ Menu option for showing Live TV Channel List
+
+
+
+ Muerto/a
+
+
+
+ Ver Canales
+
+
+
+ si no hay servidores disponibles, puedes agregar manualmente la URL
+ Instructions on initial app launch when the user is asked to manually enter a server URL
+
+
+
+ Ha ocurrido un error tratando de recuperar la información desde el servidor.
+ Dialog detail when unable to load Content from Server
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Este %1 no contiene elementos
+
+
+
+ IMDb Raiting
+
+
+
+ Fecha Agregada
+
+
+
+ Fecha Reproducida
+
+
+
+ Películas
+
+
+
+ ayer
+ Previous day
+
+
+
+ mañana
+ Next day
+
+
+
+ Martes
+ Day of Week
+
+
+
+ Jueves
+ Day of Week
+
+
+
+ Viernes
+ Day of Week
+
+
+ Title of Tab for options to filter library content
+
+ Filtro
+
+
+
+ Domingo
+ Day of Week
+
+
+
+ Lunes
+ Day of Week
+
+
+
+ Miercoles
+ Day of Week
+
+
+
+ Sabado
+ Day of Week
+
+
+
+ Comienza a
+ (Past Tense) For defining time when a program started today (e.g. Started at 08:00)
+
+
+
+ En Vivo
+ If TV Show is being broadcast live (not pre-recorded)
+
+
+
+ Repetir
+ If TV Shows has previously been broadcasted
+
+
+
+ Guia de Television
+ Menu option for showing Live TV Guide / Schedule
+
+
+
+ Grabar
+
+
+
+ Grabar Series
+
+
+
+ Cerrar
+
+
+
+ desconocido
+ Title for a cast member for which we have no information for
+
+
+
+ Conectando con el Servidor
+ Message to display to user while client is attempting to connect to the server
+
+
+
+ No se ha encontrado
+ Title of message box when the requested content is not found on the server
+
+
+
+ Guardar Credenciales?
+
+
+ Name or Title field of media item
+
+ Nombre
+
+
+
+ Ha ocurrido un error al reproducir este contenido.
+ Dialog detail when error occurs during playback
+
+
+
+ Error Recuperando Contenido
+ Dialog title when unable to load Content from Server
+
+
+
+ Padres Raiting
+
+
+
+ Cambiar de Servidor
+
+
+ Title of Tab for options to sort library content
+
+ Clasificar
+
+
+ Title of Tab for switching "views" when looking at a library
+
+ Vista
+
+
+
+ Tiempo de Ejecución
+
+
+
+ Error Durante la Reproducción
+ Dialog title when error occurs during playback
+
+
+
+ No se ha podido reproducir el Contenido del Canal de este servidor
+
+
+
+ Fecha de Premiere
+
+
+
+ Cuenta de Reproducción
+
+
+
+ Mas de este Estilo
+
+
+
+ Funciones Especiales
+
+
+ Press 'OK' to Close
+
+
+
+
+ Programas de Televisión
+
+
+
+ Termina a
+ (Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00)
+
+
+
+ Cancelar la grabación
+
+
+
+ Cancelar la grabación de Series
+
+
+
+ Elige un servidor Jellyfin disponible de la red local
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ Comenzó
+ (Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00)
+
+
+
+ Comenzó a
+ (Future Tense) For defining time when a program will start today (e.g. Starts at 08:00)
+
+
+
+ Comienza
+ (Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00)
+
+
+
+ Terminó
+ (Past Tense) For defining time when a program will ended (e.g. Ended at 08:00)
+
+
+
+ Agregar el nombre del servidor o direccion de IP
+ Title of KeyboardDialog when manually entering a server URL
+
+
+
+ Elige un servidor Jellyfin disponible de la red local:
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ si no hay servidores disponibles, puedes agregar manualmente la URL:
+ Instructions on initial app launch when the user is asked to manually enter a server URL
+
+
+
+ Ha ocurrido un error tratando de recuperar la información desde el servidor.
+ Dialog detail when unable to load Content from Server
+
+
+
+ Reproduciendo Contenido de Canal
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Este %1 no contiene elementos
+
diff --git a/locale/fr/translations.ts b/locale/fr/translations.ts
index 6849ce44..08a8232c 100644
--- a/locale/fr/translations.ts
+++ b/locale/fr/translations.ts
@@ -3605,5 +3605,441 @@
Date de sortie
+
+
+ Retour en haut
+ UI -> Media Grid -> Item Title in user setting screen.
+
+
+
+ Voici votre code Quick Connect :
+
+
+
+ Erreur lors de l'obtention des informations de lecture
+ Dialog Title: Received error from server when trying to get information about the selected item for playback
+
+
+
+ Sélectionnez un serveur Jellyfin disponible sur votre réseau local :
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ Annuler l'enregistrement
+
+
+
+ Enregistrer
+
+
+
+ Écran de veille
+
+
+
+ Aller à l'épisode
+ Continue Watching Popup Menu - Navigate to the Episode Detail Page
+
+
+
+ Aller à la série
+ Continue Watching Popup Menu - Navigate to the Series Detail Page
+
+
+
+ Studios
+
+
+
+ Rechercher maintenant
+ Help text in search Box
+
+
+
+ Vous pouvez rechercher des titres, des personnes, des chaînes de télévision en direct et plus encore
+ Help text in search results
+
+
+
+ Quick Connect
+
+
+
+ %1 sur %2
+ Item position and count. %1 = current item. %2 = total number of items
+
+
+
+ Options de l'écran de veille de Jellyfin.
+ Description for Screensaver user settings.
+
+
+
+ Mode Cinéma
+ Settings Menu - Title for option
+
+
+
+ Le Mode Cinéma vous fait vivre l'expérience du cinéma directement dans votre salon en vous permettant de diffuser des intros personnalisées avant le film.
+ Settings Menu - Description for option
+
+
+
+ WxH
+ Video width x height
+
+
+
+ Séries
+
+
+
+ Réseaux
+
+
+
+ Interface Utilisateur
+ Title for User Interface section in user setting screen.
+
+
+
+ Fermer
+
+
+
+ Lire la bande-annonce
+
+
+
+ Nombre d'éléments
+ UI -> Media Grid -> Item Count in user setting screen.
+
+
+
+ Version
+
+
+
+ Connexion au Serveur
+ Message to display to user while client is attempting to connect to the server
+
+
+
+ Guide Télé
+ Menu option for showing Live TV Guide / Schedule
+
+
+
+ Introuvable
+ Title of message box when the requested content is not found on the server
+
+
+
+ Le contenu demandé n'existe pas sur le serveur
+ Content of message box when the requested content is not found on the server
+
+
+
+ Entrer le nom du serveur ou son adresse IP
+ Title of KeyboardDialog when manually entering a server URL
+
+
+
+ Aller à la saison
+ Continue Watching Popup Menu - Navigate to the Season Page
+
+
+
+ Options pour les Séries Télé.
+ Description for TV Shows user settings.
+
+
+
+ Flouter les épisodes non visionnés
+ Option Title in user setting screen
+
+
+
+ Si activé, les images des épisodes non visionnés seront floutées.
+
+
+
+ Codec Vidéo
+
+
+
+ Codec Audio
+
+
+
+ Canaux Audio
+
+
+
+ Codec
+
+
+
+ Balise de Codec
+
+
+
+ Conteneur
+ Video streaming container
+
+
+
+ Taille
+ Video size
+
+
+
+ Inconnu
+ Title for a cast member for which we have no information for
+
+
+
+ Activé
+
+
+
+ Désactivé
+
+
+
+ Lecture
+ Title for Playback section in user setting screen.
+
+
+
+ Une erreur a été rencontrée lors de la lecture de ce fichier. Le serveur n'a pas communiqué les données nécessaires pour le transcodage.
+ Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url
+
+
+
+ Toujours afficher les titres sous les images des affiches. (Si désactivé, les titres s'afficherons uniquement sous les éléments en surbrillance).
+ Description for option in Setting Screen
+
+
+
+ Afficher le nombre d'éléments dans la bibliotèque et l'index de l'élément sélectionné.
+ Description for option in Setting Screen
+
+
+
+ Utiliser la télécomande vocale pour rechercher
+ Help text in search voice text box
+
+
+
+ (La boîte de dialogue se fermera automatiquement)
+
+
+
+ Utiliser la touche Replay pour lentement animer la sélection du première élément du dossier. (Si désactivé, le premier élément du dossier sera immédiatement sélectionné).
+ Description for option in Setting Screen
+
+
+
+ Options des Pages de Détails.
+ Description for Details page user settings.
+
+
+
+ Options pour les Séries Télévisée.
+ Description for TV Shows user settings.
+
+
+
+ Voir la Chaîne
+
+
+
+ Utiliser le Splash Screen comme fond d'écran de veille
+ Option Title in user setting screen
+
+
+
+ LxH
+ Video width x height
+
+
+
+ Utiliser le Splash Screen généré comme fond d'écran de veille de Jellyfin. Jellyfin devra être fermé et rouvert pour que le changement prenne effet.
+
+
+
+ Utiliser le Splash Screen généré comme arrière plan principal de Jellyfin. Jellyfin devra être fermé et rouvert pour que le changement prenne effet.
+ Description for option in Setting Screen
+
+
+
+ Masquer l'Horloge
+ Option Title in user setting screen
+
+
+
+ Masquer toutes les horloges dans Jellyfin. Jellyfin devra être fermé et rouvert pour que le changement prenne effet.
+ Settings Menu - Description for option
+
+
+
+ Réglages relatifs à l'apparence de l'application.
+
+
+
+ Format des pixels
+ Video pixel format
+
+
+
+ Aucuns n'albums ni chansons ont été trouvés pour cet artiste
+ Popup message when we find no audio data for an artist
+
+
+
+ Débute
+ (Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00)
+
+
+
+ Enregistrer la Série
+
+
+
+ Masquer les étiquettes
+ Option Title in user setting screen
+
+
+
+ Options de la Grille Média.
+
+
+
+ Mettre en Favori
+ Button Text - When pressed, sets item as Favorite
+
+
+
+ Page de Détails
+
+
+
+ Options pour la Page d'Accueil.
+ Description for Home Page user settings.
+
+
+
+ Nombre Max de jours dans Suivant
+ Option Title in user setting screen
+
+
+
+ Définir le nombre maximum de jours une émission doit rester dans la liste "Suivant" sans la regarder.
+ Settings Menu - Description for option
+
+
+
+ Informations de Lecture
+
+
+
+ Élements de Désign
+
+
+
+ Page d'Accueil
+
+
+
+ Informations de Transcodage
+
+
+
+ Options qui modifient le design de Jellyfin.
+ Description for Design Elements user settings.
+
+
+
+ Utiliser le Splash Screen comme arrière-plan principal
+ Option Title in user setting screen
+
+
+
+ Grille Média
+ UI -> Media Grid section in user setting screen.
+
+
+
+ Support MPEG-2
+ Settings Menu - Title for option
+
+
+
+ Annuler l'enregistrement de la Série
+
+
+
+ Si aucun serveur n'est affiché ci-dessus vous pouvez également saisir l'adresse IP du serveur manuellement :
+ Instructions on initial app launch when the user is asked to manually enter a server URL
+
+
+
+ Prise en charge de la lecture directe du codec MPEG-2 (ex., Live TV). Cela empêchera le transcodage du contenu MPEG-2 mais utilisera sensiblement plus de bande passante.
+ Settings Menu - Description for option
+
+
+
+ Titres des éléments
+ UI -> Media Grid -> Item Title in user setting screen.
+
+
+
+ Mettre en Visionné
+ Button Text - When pressed, marks item as Warched
+
+
+
+ Une erreur s'est produite lors de l'autentification via Quick Connect.
+
+
+
+ Masquer les étiquettes sur la page des détails.
+
+
+
+ Réglages relatifs à la lecture, aux codecs pris en charges et aux types de médias.
+
+
+
+ Raison
+
+
+
+ direct
+
+
+
+ Débit Total
+
+
+
+ Informations du Flux
+
+
+
+ Niveau
+ Video profile level
+
+
+
+ Débit
+ Video streaming bit rate
+
+
+
+ Différents types de vidéo
+
diff --git a/locale/hu/translations.ts b/locale/hu/translations.ts
index e724768c..193bd551 100644
--- a/locale/hu/translations.ts
+++ b/locale/hu/translations.ts
@@ -7642,5 +7642,17 @@ elemeket
Mented a hitelesítő adatokat?
+
+
+ Mentettek Törlése
+
+
+
+ Mented a hitelesítő adatokat?
+
+
+
+ Most
+
diff --git a/locale/it_IT/translations.ts b/locale/it_IT/translations.ts
index 367b7b4e..e9ba4bfc 100644
--- a/locale/it_IT/translations.ts
+++ b/locale/it_IT/translations.ts
@@ -1723,5 +1723,203 @@
È stato riscontrato un errore durante la riproduzione di questo oggetto.
Dialog detail when error occurs during playback
+
+
+ Cast & Crew
+
+
+
+ Serie TV
+
+
+
+ Mercoledi
+ Day of Week
+
+
+
+ Giovedi
+ Day of Week
+
+
+
+ Iniziato
+ (Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00)
+
+
+
+ Inizia
+ (Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00)
+
+
+
+ Termina alle
+ (Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00)
+
+
+
+ Guida TV
+ Menu option for showing Live TV Guide / Schedule
+
+
+
+ In Connessione al Server
+ Message to display to user while client is attempting to connect to the server
+
+
+
+ Il contenuto richiesto non esiste sul server
+ Content of message box when the requested content is not found on the server
+
+
+
+ Inserisci il nome o l'IP del server
+ Title of KeyboardDialog when manually entering a server URL
+
+
+
+ Scegli un server Jellyfin dalla rete locale
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ Se il server non è nella lista, puoi anche inserire l'URL:
+ Instructions on initial app launch when the user is asked to manually enter a server URL
+
+
+
+ Errore nel recupero delle informazioni di riproduzione
+ Dialog Title: Received error from server when trying to get information about the selected item for playback
+
+
+
+ Martedi
+ Day of Week
+
+
+
+ oggi
+ Current day
+
+
+
+ Chiudi
+
+
+
+ Premi "OK" per Chiudere
+
+
+
+ Film
+
+
+
+ ieri
+ Previous day
+
+
+
+ domani
+ Next day
+
+
+
+ Domenica
+ Day of Week
+
+
+
+ Lunedi
+ Day of Week
+
+
+
+ Venerdi
+ Day of Week
+
+
+
+ Sabato
+ Day of Week
+
+
+
+ Iniziato il
+ (Past Tense) For defining time when a program started today (e.g. Started at 08:00)
+
+
+
+ Inizia il
+ (Future Tense) For defining time when a program will start today (e.g. Starts at 08:00)
+
+
+
+ Interrompi Registrazione
+
+
+
+ Interrompi Registrazione Seria
+
+
+
+ Non trovato
+ Title of message box when the requested content is not found on the server
+
+
+
+ Terminato alle
+ (Past Tense) For defining time when a program will ended (e.g. Ended at 08:00)
+
+
+
+ In diretta
+ If TV Show is being broadcast live (not pre-recorded)
+
+
+
+ Replica
+ If TV Shows has previously been broadcasted
+
+
+
+ Canali
+ Menu option for showing Live TV Channel List
+
+
+
+ Visione del Canale
+
+
+
+ Registra
+
+
+
+ Sconosciuto
+ Title for a cast member for which we have no information for
+
+
+
+ Controllo Parentale
+
+
+
+ Scegli un server Jellyfin dalla rete locale:
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ Salvare le credenziali?
+
+
+
+ Cambia server
+
+
+
+ Errore durante la riproduzione
+ Dialog title when error occurs during playback
+
diff --git a/locale/pt_BR/translations.ts b/locale/pt_BR/translations.ts
index c486a8c8..ad52f7d2 100644
--- a/locale/pt_BR/translations.ts
+++ b/locale/pt_BR/translations.ts
@@ -2583,5 +2583,65 @@ não contém itens
Erro Durante Reprodução
Dialog title when error occurs during playback
+
+
+ Houve um erro ao coletar dados do servidor para este item.
+ Dialog detail when unable to load Content from Server
+
+
+
+ Carregando dados do canal
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Este %1 não possui itens
+
+
+ Name or Title field of media item
+
+ Nome
+
+
+
+ Data de Reprodução
+
+
+
+ Avaliação IMDb
+
+
+
+ Data de Lançamento
+
+
+
+ Um erro foi encontrado enquanto reproduzindo este item.
+ Dialog detail when error occurs during playback
+
+
+
+ Erro ao carregar os dados do canal
+
+
+
+ Não foi possível carregar do servidor os dados do canal
+
+
+
+ Avaliação de críticos
+
+
+
+ Data de Adição
+
+
+
+ Número de Reproduções
+
+
+
+ Classificação Etária
+
diff --git a/locale/sk/translations.ts b/locale/sk/translations.ts
index a0536947..8e2024a2 100644
--- a/locale/sk/translations.ts
+++ b/locale/sk/translations.ts
@@ -671,5 +671,292 @@
Uložiť poverenia?
+
+
+ Uložiť prihlasovacie údaje?
+
+
+
+ Pondelok
+ Day of Week
+
+
+
+ Začalo o
+ (Past Tense) For defining time when a program started today (e.g. Started at 08:00)
+
+
+
+ Zobraziť kanál
+
+
+
+ Séria nahrávok
+
+
+
+ Zrušiť nahrávanie série
+
+
+
+ Pripája sa k serveru
+ Message to display to user while client is attempting to connect to the server
+
+
+
+ Zadajte názov servera alebo IP adresu
+ Title of KeyboardDialog when manually entering a server URL
+
+
+
+ Chyba pri získavaní informácií o prehrávaní
+ Dialog Title: Received error from server when trying to get information about the selected item for playback
+
+
+
+ Pri prehrávaní tejto položky sa vyskytla chyba. Server neposkytol požadované údaje na prekódovanie.
+ Content of message box when trying to play an item which requires transcoding, and the server did not provide transcode url
+
+
+
+ Naživo
+ If TV Show is being broadcast live (not pre-recorded)
+
+
+
+ Piatok
+ Day of Week
+
+
+
+ Odstrániť uložené
+
+
+
+ Teraz
+
+
+
+ Dátum hrania
+
+
+
+ TV sprievodca
+ Menu option for showing Live TV Guide / Schedule
+
+
+
+ Narodený
+
+
+
+ Herci & štáb
+
+
+
+ Viac takých
+
+
+
+ Filmy
+
+
+
+ Utorok
+ Day of Week
+
+
+
+ Začína
+ (Future Tense) For defining a day and time when a program will start (e.g. Starts Wednesday, 08:00)
+
+
+
+ Skončil o
+ (Past Tense) For defining time when a program will ended (e.g. Ended at 08:00)
+
+
+
+ Požadovaný obsah na serveri neexistuje
+ Content of message box when the requested content is not found on the server
+
+
+ Name or Title field of media item
+
+ Meno
+
+
+
+ Počet prehrania
+
+
+
+ Zomrel
+
+
+
+ Vek
+
+
+
+ Špeciálne vlastnosti
+
+
+ Press 'OK' to Close
+
+
+
+
+ Zatvorte stlačením tlačidla „OK“
+
+
+
+ zajtra
+ Next day
+
+
+
+ Nedeľa
+ Day of Week
+
+
+
+ Streda
+ Day of Week
+
+
+
+ Sobota
+ Day of Week
+
+
+
+ Začalo
+ (Past Tense) For defining a day and time when a program started (e.g. Started Wednesday, 08:00)
+
+
+
+ Začne
+ (Future Tense) For defining time when a program will start today (e.g. Starts at 08:00)
+
+
+
+ Končí o
+ (Past Tense) For defining a day and time when a program ended (e.g. Ended Wednesday, 08:00)
+
+
+
+ Nenájdené
+ Title of message box when the requested content is not found on the server
+
+
+ Title of Tab for options to sort library content
+
+ Triediť
+
+
+
+ Beh programu
+
+
+
+ Verzia
+
+
+ Message displayed in Item Grid when no item to display. %1 is container type (e.g. Boxset, Collection, Folder, etc)
+
+ Tento %1 neobsahuje žiadne položky
+
+
+
+ IMDB hodnotenie
+
+
+
+ Dátum pridania
+
+
+
+ Rodičovské hodnotenie
+
+
+
+ Dátum vydania
+
+
+ Title of Tab for switching "views" when looking at a library
+
+ Vyhliadka
+
+
+ Title of Tab for options to filter library content
+
+ Filter
+
+
+
+ TV relácie
+
+
+
+ dnes
+ Current day
+
+
+
+ včera
+ Previous day
+
+
+
+ Štvrtok
+ Day of Week
+
+
+
+ Opakujte
+ If TV Shows has previously been broadcasted
+
+
+
+ Kanály
+ Menu option for showing Live TV Channel List
+
+
+
+ Záznam
+
+
+
+ Zrušiť nahrávanie
+
+
+
+ Zavrieť
+
+
+
+ Vyberte dostupný server Jellyfin z vašej lokálnej siete:
+ Instructions on initial app launch when the user is asked to pick a server from a list
+
+
+
+ Ak vyššie nie je uvedený žiadny server, adresu URL servera môžete zadať aj ručne:
+ Instructions on initial app launch when the user is asked to manually enter a server URL
+
+
+
+ Hodnotenie kritikov
+
+
+
+ Neznámy
+ Title for a cast member for which we have no information for
+
+
+
+ Prehrávanie
+ Title for Playback section in user setting screen.
+
diff --git a/manifest b/manifest
index 0c8f4b83..17e49aea 100644
--- a/manifest
+++ b/manifest
@@ -2,7 +2,7 @@
title=Jellyfin
major_version=1
minor_version=6
-build_version=1
+build_version=2
### Main Menu Icons / Channel Poster Artwork
mm_icon_focus_fhd=pkg:/images/channel-poster_fhd.png
diff --git a/package-lock.json b/package-lock.json
index ce612aed..ffadb384 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "jellyfin-roku",
- "version": "1.4.12",
+ "version": "1.6.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "jellyfin-roku",
- "version": "1.4.12",
+ "version": "1.6.2",
"hasInstallScript": true,
"license": "GPL-2.0",
"dependencies": {
@@ -18,8 +18,7 @@
},
"devDependencies": {
"@rokucommunity/bslint": "0.7.5",
- "brighterscript": "0.57.2",
- "rooibos-cli": "1.4.0",
+ "brighterscript": "0.61.1",
"ropm": "0.10.10"
}
},
@@ -297,73 +296,12 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "micromatch": "^2.1.5",
- "normalize-path": "^2.0.0"
- }
- },
"node_modules/api": {
"name": "jellyfin-api-bs-client",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/jellyfin-api-bs-client/-/jellyfin-api-bs-client-1.0.5.tgz",
"integrity": "sha512-W09wOl7Hm1Z4z82SQB44M3O706L98p3j0aOpVw59OBylUOshSdHPgQ/9Lth5t6xB9wrkhWoDCyK7XEYRL3wYwA=="
},
- "node_modules/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,
- "dependencies": {
- "arr-flatten": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/array-flat-polyfill": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz",
@@ -381,16 +319,6 @@
"node": ">=8"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -407,22 +335,6 @@
"node": ">=0.8"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "optional": true
- },
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -437,18 +349,6 @@
"node": ">= 4.0.0"
}
},
- "node_modules/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,
- "bin": {
- "atob": "bin/atob.js"
- },
- "engines": {
- "node": ">= 4.5.0"
- }
- },
"node_modules/aws-sign2": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
@@ -462,318 +362,11 @@
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
},
- "node_modules/babel-cli": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
- "integrity": "sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q==",
- "dev": true,
- "dependencies": {
- "babel-core": "^6.26.0",
- "babel-polyfill": "^6.26.0",
- "babel-register": "^6.26.0",
- "babel-runtime": "^6.26.0",
- "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"
- },
- "bin": {
- "babel": "bin/babel.js",
- "babel-doctor": "bin/babel-doctor.js",
- "babel-external-helpers": "bin/babel-external-helpers.js",
- "babel-node": "bin/babel-node.js"
- },
- "optionalDependencies": {
- "chokidar": "^1.6.1"
- }
- },
- "node_modules/babel-cli/node_modules/commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
- "dev": true
- },
- "node_modules/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,
- "dependencies": {
- "chalk": "^1.1.3",
- "esutils": "^2.0.2",
- "js-tokens": "^3.0.2"
- }
- },
- "node_modules/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,
- "dependencies": {
- "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"
- }
- },
- "node_modules/babel-core/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "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"
- }
- },
- "node_modules/babel-helpers": {
- "version": "6.24.1",
- "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
- "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
- "dev": true,
- "dependencies": {
- "babel-runtime": "^6.22.0",
- "babel-template": "^6.24.1"
- }
- },
- "node_modules/babel-messages": {
- "version": "6.23.0",
- "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
- "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
- "dev": true,
- "dependencies": {
- "babel-runtime": "^6.22.0"
- }
- },
- "node_modules/babel-polyfill": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
- "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
- "dev": true,
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "core-js": "^2.5.0",
- "regenerator-runtime": "^0.10.5"
- }
- },
- "node_modules/babel-polyfill/node_modules/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
- },
- "node_modules/babel-register": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz",
- "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=",
- "dev": true,
- "dependencies": {
- "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"
- }
- },
- "node_modules/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,
- "dependencies": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "babel-traverse": "^6.26.0",
- "babel-types": "^6.26.0",
- "babylon": "^6.18.0",
- "lodash": "^4.17.4"
- }
- },
- "node_modules/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,
- "dependencies": {
- "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"
- }
- },
- "node_modules/babel-traverse/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- }
- },
- "node_modules/babylon": {
- "version": "6.18.0",
- "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
- "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==",
- "dev": true,
- "bin": {
- "babylon": "bin/babylon.js"
- }
- },
"node_modules/balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
- "node_modules/base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/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,
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/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,
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -788,22 +381,6 @@
"resolved": "https://registry.npmjs.org/button-group-vert/-/button-group-vert-1.0.2.tgz",
"integrity": "sha512-pfrUYI/aFubtjhA8I08qNCtDluyIScksldR15icR7Pj24tNELYCYXE7M0jaU7xgdiFAhZJcYuB3aCXzyI1CoMw=="
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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
- },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -813,25 +390,10 @@
"concat-map": "0.0.1"
}
},
- "node_modules/braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/brighterscript": {
- "version": "0.57.2",
- "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.57.2.tgz",
- "integrity": "sha512-idvz7lVLSN1mM/VoDt4/uJPFqdydSgCro2eIwT9vqV8z/1iNLpUtvXCWfeAbWxsbJkXWtmQq4GPkklCxc4OjrQ==",
+ "version": "0.61.1",
+ "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.61.1.tgz",
+ "integrity": "sha512-H3QyE3ZvKQGvE1IrNymzprgOkpGbHibY1x86eT69ehO/+ism/mA+h4YlIKZup9wyR9PhfhhbpS5jL+KHFsGn5w==",
"dev": true,
"dependencies": {
"@rokucommunity/bslib": "^0.1.1",
@@ -855,7 +417,7 @@
"p-settle": "^2.1.0",
"parse-ms": "^2.1.0",
"require-relative": "^0.8.7",
- "roku-deploy": "^3.8.1",
+ "roku-deploy": "^3.9.2",
"serialize-error": "^7.0.1",
"source-map": "^0.7.3",
"vscode-languageserver": "7.0.0",
@@ -1156,9 +718,9 @@
}
},
"node_modules/brighterscript/node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"dependencies": {
"normalize-path": "^3.0.0",
@@ -1370,58 +932,6 @@
"node": ">=10"
}
},
- "node_modules/brs": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/brs/-/brs-0.14.0.tgz",
- "integrity": "sha512-AeUGgzjzJ77uGfjaSZ5scG/Ekfzdiow+UDvZrlaSyso5N2VSXCN1V9NAh9Bz2F1NbwumTlmKCbglIEZ7U5zv2g==",
- "dev": true,
- "dependencies": {
- "commander": "^2.12.2",
- "long": "^3.2.0",
- "luxon": "^1.8.3",
- "memory-fs": "^0.4.1",
- "nanomatch": "^1.2.13",
- "p-settle": "^2.1.0"
- },
- "bin": {
- "brs": "bin/cli.js"
- }
- },
- "node_modules/brs/node_modules/commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
- "dev": true
- },
- "node_modules/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,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/cache-base/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -1435,22 +945,6 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
- "node_modules/chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/chevrotain": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.2.tgz",
@@ -1459,1154 +953,6 @@
"regexp-to-ast": "0.5.0"
}
},
- "node_modules/chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==",
- "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.",
- "dev": true,
- "optional": true,
- "dependencies": {
- "anymatch": "^1.3.0",
- "async-each": "^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"
- },
- "optionalDependencies": {
- "fsevents": "^1.0.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/braces/node_modules/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,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/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,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/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,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/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,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/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,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/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,
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/expand-brackets/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/extglob/node_modules/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,
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/extglob/node_modules/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,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fill-range/node_modules/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,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
- "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
- "bundleDependencies": [
- "node-pre-gyp"
- ],
- "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "dependencies": {
- "nan": "^2.12.1",
- "node-pre-gyp": "^0.12.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/abbrev": {
- "version": "1.1.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/ansi-regex": {
- "version": "2.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/aproba": {
- "version": "1.2.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/are-we-there-yet": {
- "version": "1.1.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^2.0.6"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/balanced-match": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/brace-expansion": {
- "version": "1.1.11",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/chownr": {
- "version": "1.1.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/code-point-at": {
- "version": "1.1.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/concat-map": {
- "version": "0.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/console-control-strings": {
- "version": "1.1.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/core-util-is": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/debug": {
- "version": "4.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/deep-extend": {
- "version": "0.6.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/delegates": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/detect-libc": {
- "version": "1.0.3",
- "dev": true,
- "inBundle": true,
- "license": "Apache-2.0",
- "optional": true,
- "bin": {
- "detect-libc": "bin/detect-libc.js"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/fs-minipass": {
- "version": "1.2.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "minipass": "^2.2.1"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/fs.realpath": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/gauge": {
- "version": "2.7.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "aproba": "^1.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/glob": {
- "version": "7.1.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "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": "*"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/has-unicode": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/iconv-lite": {
- "version": "0.4.24",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/ignore-walk": {
- "version": "3.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "minimatch": "^3.0.4"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/inflight": {
- "version": "1.0.6",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/inherits": {
- "version": "2.0.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/ini": {
- "version": "1.3.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/is-fullwidth-code-point": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "number-is-nan": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/isarray": {
- "version": "1.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/minimatch": {
- "version": "3.0.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/minimist": {
- "version": "0.0.8",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/minipass": {
- "version": "2.3.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/minizlib": {
- "version": "1.2.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "minipass": "^2.2.1"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/mkdirp": {
- "version": "0.5.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "minimist": "0.0.8"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/ms": {
- "version": "2.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/needle": {
- "version": "2.3.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "debug": "^4.1.0",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- },
- "bin": {
- "needle": "bin/needle"
- },
- "engines": {
- "node": ">= 4.4.x"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/node-pre-gyp": {
- "version": "0.12.0",
- "dev": true,
- "inBundle": true,
- "license": "BSD-3-Clause",
- "optional": true,
- "dependencies": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- },
- "bin": {
- "node-pre-gyp": "bin/node-pre-gyp"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/nopt": {
- "version": "4.0.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/npm-bundled": {
- "version": "1.0.6",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/npm-packlist": {
- "version": "1.4.1",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/npmlog": {
- "version": "4.1.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/number-is-nan": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/object-assign": {
- "version": "4.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/once": {
- "version": "1.4.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/os-homedir": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/os-tmpdir": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/osenv": {
- "version": "0.1.5",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/path-is-absolute": {
- "version": "1.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/process-nextick-args": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/rc": {
- "version": "1.2.8",
- "dev": true,
- "inBundle": true,
- "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
- "optional": true,
- "dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/rc/node_modules/minimist": {
- "version": "1.2.0",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/readable-stream": {
- "version": "2.3.6",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "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"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/rimraf": {
- "version": "2.6.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/safe-buffer": {
- "version": "5.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/safer-buffer": {
- "version": "2.1.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/sax": {
- "version": "1.2.4",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/semver": {
- "version": "5.7.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/set-blocking": {
- "version": "2.0.0",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/signal-exit": {
- "version": "3.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/string_decoder": {
- "version": "1.1.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/string-width": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/strip-ansi": {
- "version": "3.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/tar": {
- "version": "4.4.8",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.3.4",
- "minizlib": "^1.1.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.2"
- },
- "engines": {
- "node": ">=4.5"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/util-deprecate": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/wide-align": {
- "version": "1.1.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true,
- "dependencies": {
- "string-width": "^1.0.2 || 2"
- }
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/wrappy": {
- "version": "1.0.2",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/fsevents/node_modules/yallist": {
- "version": "3.0.3",
- "dev": true,
- "inBundle": true,
- "license": "ISC",
- "optional": true
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/is-number/node_modules/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,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/chokidar/node_modules/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,
- "dependencies": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/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,
- "dependencies": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/class-utils/node_modules/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,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/class-utils/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -2653,19 +999,6 @@
"node": ">=8"
}
},
- "node_modules/collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
- "dependencies": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -2690,49 +1023,11 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.1.tgz",
- "integrity": "sha512-UNgvDd+csKdc9GD4zjtkHKQbT8Aspt2jCBqNSPp53vAS0L1tS9sXB2TCEOPHJ7kt9bN/niWkYj8T3RQSoMXdSQ==",
- "dev": true
- },
- "node_modules/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
- },
"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="
},
- "node_modules/convert-source-map": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
- "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/core-js": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
- "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==",
- "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.",
- "dev": true,
- "hasInstallScript": 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",
@@ -2772,22 +1067,6 @@
"resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
"integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg=="
},
- "node_modules/debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/debug/node_modules/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
- },
"node_modules/decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
@@ -2796,84 +1075,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/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,
- "dependencies": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/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,
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/define-property/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/del": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
@@ -2934,18 +1135,6 @@
"node": ">=0.4.0"
}
},
- "node_modules/detect-indent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
- "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
- "dev": true,
- "dependencies": {
- "repeating": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -2972,24 +1161,6 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
- "node_modules/errno": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz",
- "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==",
- "dev": true,
- "dependencies": {
- "prr": "~1.0.1"
- },
- "bin": {
- "errno": "cli.js"
- }
- },
- "node_modules/es2015": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/es2015/-/es2015-0.0.0.tgz",
- "integrity": "sha1-hO7kw1yCd2WLaOfkY42zB0GCKxQ=",
- "dev": true
- },
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -3006,89 +1177,16 @@
"node": ">=0.8.0"
}
},
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
},
- "node_modules/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,
- "dependencies": {
- "is-posix-bracket": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "fill-range": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
- "node_modules/extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "dependencies": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extend-shallow/node_modules/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,
- "dependencies": {
- "is-plain-object": "^2.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
- "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
- "dev": true,
- "optional": true,
- "dependencies": {
- "is-extglob": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -3221,33 +1319,6 @@
"node": ">=8"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "is-number": "^2.1.0",
- "isobject": "^2.0.0",
- "randomatic": "^3.0.0",
- "repeat-element": "^1.1.2",
- "repeat-string": "^1.5.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -3260,28 +1331,6 @@
"node": ">=8"
}
},
- "node_modules/for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "for-in": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -3303,35 +1352,6 @@
"node": ">= 0.12"
}
},
- "node_modules/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,
- "dependencies": {
- "map-cache": "^0.2.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fs-extra": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz",
- "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "node_modules/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
- },
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -3358,15 +1378,6 @@
"node": "6.* || 8.* || >= 10.*"
}
},
- "node_modules/get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/getpass": {
"version": "0.1.7",
"resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
@@ -3516,39 +1527,6 @@
"node": ">=6"
}
},
- "node_modules/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,
- "dependencies": {
- "glob-parent": "^2.0.0",
- "is-glob": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "is-glob": "^2.0.0"
- }
- },
- "node_modules/globals": {
- "version": "9.18.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
- "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
@@ -3604,18 +1582,6 @@
"node": ">=6"
}
},
- "node_modules/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,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -3624,91 +1590,6 @@
"node": ">=4"
}
},
- "node_modules/has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "dependencies": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-value/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-values/node_modules/is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-values/node_modules/is-number/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-values/node_modules/kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "os-homedir": "^1.0.0",
- "os-tmpdir": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -3775,135 +1656,6 @@
"resolved": "https://registry.npmjs.org/integer-keyboard/-/integer-keyboard-1.0.12.tgz",
"integrity": "sha512-DSLyd/PvtEBfc4grICTxSLu94Yo/Vm6rNerRZRbbzRrP0HQ9pYaquoY2RD9x6gAmica43gsFimScNpuRYVe54w=="
},
- "node_modules/invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "dependencies": {
- "loose-envify": "^1.0.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "binary-extensions": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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
- },
- "node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-descriptor/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "is-primitive": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-finite": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
- "dev": true,
- "dependencies": {
- "number-is-nan": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"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",
@@ -3912,32 +1664,6 @@
"node": ">=8"
}
},
- "node_modules/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,
- "dependencies": {
- "is-extglob": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-path-cwd": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
@@ -3956,104 +1682,26 @@
"node": ">=8"
}
},
- "node_modules/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,
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-plain-object/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
},
- "node_modules/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,
- "dependencies": {
- "isarray": "1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"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="
},
- "node_modules/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/jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
- "node_modules/jsesc": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
- "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
- "dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
- }
- },
"node_modules/json-schema": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
@@ -4069,15 +1717,6 @@
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
- "node_modules/json5": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
- "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
- }
- },
"node_modules/jsonc-parser": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
@@ -4116,18 +1755,6 @@
"set-immediate-shim": "~1.0.1"
}
},
- "node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/latinize": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/latinize/-/latinize-0.5.0.tgz",
@@ -4159,12 +1786,6 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "node_modules/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
- },
"node_modules/long": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
@@ -4173,18 +1794,6 @@
"node": ">=0.6"
}
},
- "node_modules/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,
- "dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- },
- "bin": {
- "loose-envify": "cli.js"
- }
- },
"node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -4205,44 +1814,6 @@
"node": "*"
}
},
- "node_modules/map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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
- },
- "node_modules/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,
- "dependencies": {
- "errno": "^0.1.3",
- "readable-stream": "^2.0.1"
- }
- },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4251,31 +1822,6 @@
"node": ">= 8"
}
},
- "node_modules/micromatch": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
- "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
- "dev": true,
- "optional": true,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
@@ -4296,9 +1842,9 @@
}
},
"node_modules/minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -4306,49 +1852,6 @@
"node": "*"
}
},
- "node_modules/minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
- "dev": true
- },
- "node_modules/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,
- "dependencies": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/mixin-deep/node_modules/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,
- "dependencies": {
- "is-plain-object": "^2.0.4"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
"node_modules/moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
@@ -4357,81 +1860,6 @@
"node": "*"
}
},
- "node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "node_modules/nan": {
- "version": "2.14.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
- "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
- "dev": true,
- "optional": true
- },
- "node_modules/nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dev": true,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/nanomatch/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/nanomatch/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/nanomatch/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "remove-trailing-separator": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/npm-bundled": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
@@ -4465,15 +1893,6 @@
"node": ">=10"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/oauth-sign": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
@@ -4482,97 +1901,6 @@
"node": "*"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
- "dependencies": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-copy/node_modules/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,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-visit/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "for-own": "^0.1.4",
- "is-extendable": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object.pick/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -4581,35 +1909,6 @@
"wrappy": "1"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "graceful-fs": "^4.1.4",
- "mkdirp": "^0.5.1",
- "object-assign": "^4.1.0"
- }
- },
"node_modules/p-limit": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
@@ -4702,22 +2001,6 @@
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
- "node_modules/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,
- "dependencies": {
- "glob-base": "^0.3.0",
- "is-dotfile": "^1.0.0",
- "is-extglob": "^1.0.0",
- "is-glob": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/parse-ms": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
@@ -4726,15 +2009,6 @@
"node": ">=6"
}
},
- "node_modules/pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -4776,46 +2050,11 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/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,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">= 0.6"
- }
- },
"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=="
},
- "node_modules/prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
- "dev": true
- },
"node_modules/punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
@@ -4825,9 +2064,9 @@
}
},
"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==",
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
"engines": {
"node": ">=0.6"
}
@@ -4851,41 +2090,6 @@
}
]
},
- "node_modules/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,
- "dependencies": {
- "is-number": "^4.0.0",
- "kind-of": "^6.0.0",
- "math-random": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/randomatic/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/randomatic/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
@@ -4911,91 +2115,11 @@
"node": ">=8.10.0"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "dev": true
- },
- "node_modules/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,
- "dependencies": {
- "is-equal-shallow": "^0.1.3"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"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=="
},
- "node_modules/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,
- "optional": true
- },
- "node_modules/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,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "optional": true,
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/repeating": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
- "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
- "dev": true,
- "dependencies": {
- "is-finite": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/request": {
"version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
@@ -5027,40 +2151,6 @@
"node": ">= 4"
}
},
- "node_modules/request-promise": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz",
- "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==",
- "deprecated": "request-promise has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
- "dev": true,
- "dependencies": {
- "bluebird": "^3.5.0",
- "request-promise-core": "1.1.2",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "peerDependencies": {
- "request": "^2.34"
- }
- },
- "node_modules/request-promise-core": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
- "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
- "dev": true,
- "dependencies": {
- "lodash": "^4.17.11"
- },
- "engines": {
- "node": ">=0.10.0"
- },
- "peerDependencies": {
- "request": "^2.34"
- }
- },
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -5080,22 +2170,6 @@
"integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==",
"dev": true
},
- "node_modules/resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "deprecated": "https://github.com/lydell/resolve-url#deprecated",
- "dev": true
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.12"
- }
- },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -5121,9 +2195,9 @@
}
},
"node_modules/roku-deploy": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.8.1.tgz",
- "integrity": "sha512-b8Q2IvBdEka4XIBNLU9CumPDto8X5zCmWQwwFfBPkJqwDnJ4U47GqKCJp1dHdmAY9H/JRYIj2TmFE4cTOUiTNw==",
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.9.2.tgz",
+ "integrity": "sha512-2LZyR4EhaFrka1gVmcuJO/f42tqz4clGImboVLCNem1q/PcFV5cnXNZRfqDI+MZ/n8eJto71JlZkcc7TDLt/EQ==",
"dependencies": {
"chalk": "^2.4.2",
"dateformat": "^3.0.3",
@@ -5133,9 +2207,9 @@
"is-glob": "^4.0.3",
"jsonc-parser": "^2.3.0",
"jszip": "^3.6.0",
- "minimatch": "^3.0.4",
"moment": "^2.29.1",
"parse-ms": "^2.1.0",
+ "picomatch": "^2.2.1",
"request": "^2.88.0",
"temp-dir": "^2.0.0",
"xml2js": "^0.4.23"
@@ -5211,30 +2285,6 @@
"node": ">=4"
}
},
- "node_modules/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,
- "dependencies": {
- "babel-cli": "^6.26.0",
- "brs": "latest",
- "commander": "latest",
- "debug": "latest",
- "es2015": "0.0.0",
- "fs-extra": "^5.0.0",
- "glob-all": "^3.1.0",
- "lodash": "latest",
- "replace-ext": "^1.0.0",
- "request": "^2.88.0",
- "request-promise": "^4.2.4",
- "splice-string": "^2.0.0",
- "typescript": "3.7.4"
- },
- "bin": {
- "rooibos-cli": "dist/cli.js"
- }
- },
"node_modules/ropm": {
"version": "0.10.10",
"resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.10.tgz",
@@ -5269,6 +2319,139 @@
"chevrotain": "7.1.1"
}
},
+ "node_modules/ropm/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,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ropm/node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/ropm/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"
+ }
+ },
+ "node_modules/ropm/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,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ropm/node_modules/brighterscript": {
+ "version": "0.57.2",
+ "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.57.2.tgz",
+ "integrity": "sha512-idvz7lVLSN1mM/VoDt4/uJPFqdydSgCro2eIwT9vqV8z/1iNLpUtvXCWfeAbWxsbJkXWtmQq4GPkklCxc4OjrQ==",
+ "dev": true,
+ "dependencies": {
+ "@rokucommunity/bslib": "^0.1.1",
+ "@xml-tools/parser": "^1.0.7",
+ "array-flat-polyfill": "^1.0.1",
+ "chalk": "^2.4.2",
+ "chevrotain": "^7.0.1",
+ "chokidar": "^3.5.1",
+ "clear": "^0.1.0",
+ "cross-platform-clear-console": "^2.3.0",
+ "debounce-promise": "^3.1.0",
+ "eventemitter3": "^4.0.0",
+ "fast-glob": "^3.2.11",
+ "file-url": "^3.0.0",
+ "fs-extra": "^8.0.0",
+ "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",
+ "require-relative": "^0.8.7",
+ "roku-deploy": "^3.8.1",
+ "serialize-error": "^7.0.1",
+ "source-map": "^0.7.3",
+ "vscode-languageserver": "7.0.0",
+ "vscode-languageserver-protocol": "3.16.0",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-uri": "^2.1.1",
+ "xml2js": "^0.4.19",
+ "yargs": "^16.2.0"
+ },
+ "bin": {
+ "bsc": "dist/cli.js"
+ }
+ },
+ "node_modules/ropm/node_modules/brighterscript/node_modules/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,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/ropm/node_modules/brighterscript/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/ropm/node_modules/brighterscript/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"
+ }
+ },
+ "node_modules/ropm/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,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/ropm/node_modules/chevrotain": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz",
@@ -5278,6 +2461,45 @@
"regexp-to-ast": "0.5.0"
}
},
+ "node_modules/ropm/node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/ropm/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,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/ropm/node_modules/fs-extra": {
"version": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -5293,6 +2515,60 @@
"node": ">=10"
}
},
+ "node_modules/ropm/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/ropm/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,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ropm/node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ropm/node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ropm/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,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
"node_modules/ropm/node_modules/jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -5305,6 +2581,48 @@
"graceful-fs": "^4.1.6"
}
},
+ "node_modules/ropm/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,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ropm/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/ropm/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"
+ }
+ },
+ "node_modules/ropm/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,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/ropm/node_modules/universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
@@ -5359,15 +2677,6 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
- "node_modules/safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
- "dependencies": {
- "ret": "~0.1.10"
- }
- },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -5420,265 +2729,12 @@
"node": ">=0.10.0"
}
},
- "node_modules/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,
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/set-value/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "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"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "optional": true,
- "dependencies": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/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,
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/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,
- "dependencies": {
- "kind-of": "^6.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/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,
- "dependencies": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon-node/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "optional": true,
- "dependencies": {
- "kind-of": "^3.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/snapdragon/node_modules/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,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/snapdragon/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/sob": {
"name": "slide-out-button",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/slide-out-button/-/slide-out-button-1.0.1.tgz",
"integrity": "sha512-R2m/9IcxjE7G9BlL+AcHBUEh84ojdfImwk/CAaEX3WZT/oSIGYF2StHQ0TcWqatN2Tg9OTr4pNLVso66KH2Tgw=="
},
- "node_modules/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": ">=0.10.0"
- }
- },
- "node_modules/source-map-resolve": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
- "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
- "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
- "dev": true,
- "dependencies": {
- "atob": "^2.1.1",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "source-map": "^0.5.6"
- }
- },
- "node_modules/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=",
- "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
- "dev": true
- },
- "node_modules/splice-string": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/splice-string/-/splice-string-2.0.0.tgz",
- "integrity": "sha1-HpCypb6O0luBA2UlVZrIEqjB8wU=",
- "dev": true,
- "dependencies": {
- "lodash.toarray": "^4.4.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/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,
- "dependencies": {
- "extend-shallow": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
@@ -5703,40 +2759,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/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,
- "dependencies": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/static-extend/node_modules/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,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -5777,27 +2799,6 @@
"node": ">=8"
}
},
- "node_modules/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,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/temp-dir": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
@@ -5806,69 +2807,6 @@
"node": ">=8"
}
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/to-regex-range/node_modules/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,
- "dependencies": {
- "kind-of": "^3.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/tough-cookie": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
@@ -5891,15 +2829,6 @@
"resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
"integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
},
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -5927,34 +2856,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/typescript": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz",
- "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/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,
- "dependencies": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -5963,63 +2864,6 @@
"node": ">= 4.0.0"
}
},
- "node_modules/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,
- "dependencies": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/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,
- "dependencies": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "dependencies": {
- "isarray": "1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/unset-value/node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -6028,34 +2872,6 @@
"punycode": "^2.1.0"
}
},
- "node_modules/urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "deprecated": "Please see https://github.com/lydell/urix#deprecated",
- "dev": true
- },
- "node_modules/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,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/user-home": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
- "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
- "dev": true,
- "bin": {
- "user-home": "cli.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -6070,18 +2886,6 @@
"uuid": "bin/uuid"
}
},
- "node_modules/v8flags": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
- "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
- "dev": true,
- "dependencies": {
- "user-home": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
"node_modules/verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
@@ -6506,57 +3310,11 @@
"uri-js": "^4.2.2"
}
},
- "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
- },
- "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"
- }
- },
"api": {
"version": "npm:jellyfin-api-bs-client@1.0.5",
"resolved": "https://registry.npmjs.org/jellyfin-api-bs-client/-/jellyfin-api-bs-client-1.0.5.tgz",
"integrity": "sha512-W09wOl7Hm1Z4z82SQB44M3O706L98p3j0aOpVw59OBylUOshSdHPgQ/9Lth5t6xB9wrkhWoDCyK7XEYRL3wYwA=="
},
- "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"
- }
- },
- "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,
- "optional": true
- },
- "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-flat-polyfill": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-flat-polyfill/-/array-flat-polyfill-1.0.1.tgz",
@@ -6568,13 +3326,6 @@
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true
},
- "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
- },
"asn1": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
@@ -6588,19 +3339,6 @@
"resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
"integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
},
- "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
- },
- "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,
- "optional": true
- },
"asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
@@ -6612,12 +3350,6 @@
"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
"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",
@@ -6628,296 +3360,11 @@
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
"integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
},
- "babel-cli": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz",
- "integrity": "sha512-wau+BDtQfuSBGQ9PzzFL3REvR9Sxnd4LKwtcHAiPjhugA7K/80vpHXafj+O5bAqJOuSefjOx5ZJnNSR2J1Qw6Q==",
- "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": {
- "commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
- "dev": true
- }
- }
- },
- "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"
- }
- },
- "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"
- }
- }
- }
- },
- "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"
- }
- },
- "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"
- }
- }
- }
- },
- "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
- },
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
},
- "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"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "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
- }
- }
- },
"bcrypt-pbkdf": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
@@ -6931,19 +3378,6 @@
"resolved": "https://registry.npmjs.org/button-group-vert/-/button-group-vert-1.0.2.tgz",
"integrity": "sha512-pfrUYI/aFubtjhA8I08qNCtDluyIScksldR15icR7Pj24tNELYCYXE7M0jaU7xgdiFAhZJcYuB3aCXzyI1CoMw=="
},
- "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
- },
- "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
- },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -6953,22 +3387,10 @@
"concat-map": "0.0.1"
}
},
- "braces": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
- "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==",
- "dev": true,
- "optional": true,
- "requires": {
- "expand-range": "^1.8.1",
- "preserve": "^0.2.0",
- "repeat-element": "^1.1.2"
- }
- },
"brighterscript": {
- "version": "0.57.2",
- "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.57.2.tgz",
- "integrity": "sha512-idvz7lVLSN1mM/VoDt4/uJPFqdydSgCro2eIwT9vqV8z/1iNLpUtvXCWfeAbWxsbJkXWtmQq4GPkklCxc4OjrQ==",
+ "version": "0.61.1",
+ "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.61.1.tgz",
+ "integrity": "sha512-H3QyE3ZvKQGvE1IrNymzprgOkpGbHibY1x86eT69ehO/+ism/mA+h4YlIKZup9wyR9PhfhhbpS5jL+KHFsGn5w==",
"dev": true,
"requires": {
"@rokucommunity/bslib": "^0.1.1",
@@ -6992,7 +3414,7 @@
"p-settle": "^2.1.0",
"parse-ms": "^2.1.0",
"require-relative": "^0.8.7",
- "roku-deploy": "^3.8.1",
+ "roku-deploy": "^3.9.2",
"serialize-error": "^7.0.1",
"source-map": "^0.7.3",
"vscode-languageserver": "7.0.0",
@@ -7013,9 +3435,9 @@
}
},
"anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
@@ -7379,53 +3801,6 @@
}
}
},
- "brs": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/brs/-/brs-0.14.0.tgz",
- "integrity": "sha512-AeUGgzjzJ77uGfjaSZ5scG/Ekfzdiow+UDvZrlaSyso5N2VSXCN1V9NAh9Bz2F1NbwumTlmKCbglIEZ7U5zv2g==",
- "dev": true,
- "requires": {
- "commander": "^2.12.2",
- "long": "^3.2.0",
- "luxon": "^1.8.3",
- "memory-fs": "^0.4.1",
- "nanomatch": "^1.2.13",
- "p-settle": "^2.1.0"
- },
- "dependencies": {
- "commander": {
- "version": "2.20.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
- "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
- "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"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
"camelcase": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -7436,19 +3811,6 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
- "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"
- }
- },
"chevrotain": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.2.tgz",
@@ -7457,925 +3819,6 @@
"regexp-to-ast": "0.5.0"
}
},
- "chokidar": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
- "integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==",
- "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"
- },
- "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"
- }
- }
- }
- },
- "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": "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-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"
- }
- }
- }
- },
- "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"
- }
- }
- }
- },
- "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.9",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
- "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
- "dev": true,
- "optional": true,
- "requires": {
- "nan": "^2.12.1",
- "node-pre-gyp": "^0.12.0"
- },
- "dependencies": {
- "abbrev": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ansi-regex": {
- "version": "2.1.1",
- "bundled": true,
- "dev": true,
- "optional": 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.0.6"
- }
- },
- "balanced-match": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "brace-expansion": {
- "version": "1.1.11",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "chownr": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "code-point-at": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "concat-map": {
- "version": "0.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "console-control-strings": {
- "version": "1.1.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "debug": {
- "version": "4.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "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.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "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.0.3",
- "console-control-strings": "^1.0.0",
- "has-unicode": "^2.0.0",
- "object-assign": "^4.1.0",
- "signal-exit": "^3.0.0",
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1",
- "wide-align": "^1.1.0"
- }
- },
- "glob": {
- "version": "7.1.3",
- "bundled": true,
- "dev": true,
- "optional": 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"
- }
- },
- "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 < 3"
- }
- },
- "ignore-walk": {
- "version": "3.0.1",
- "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.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.3",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "ini": {
- "version": "1.3.5",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "minimatch": {
- "version": "3.0.4",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "0.0.8",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "minipass": {
- "version": "2.3.5",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.0"
- }
- },
- "minizlib": {
- "version": "1.2.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minipass": "^2.2.1"
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "minimist": "0.0.8"
- }
- },
- "ms": {
- "version": "2.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "needle": {
- "version": "2.3.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "debug": "^4.1.0",
- "iconv-lite": "^0.4.4",
- "sax": "^1.2.4"
- }
- },
- "node-pre-gyp": {
- "version": "0.12.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "detect-libc": "^1.0.2",
- "mkdirp": "^0.5.1",
- "needle": "^2.2.1",
- "nopt": "^4.0.1",
- "npm-packlist": "^1.1.6",
- "npmlog": "^4.0.2",
- "rc": "^1.2.7",
- "rimraf": "^2.6.1",
- "semver": "^5.3.0",
- "tar": "^4"
- }
- },
- "nopt": {
- "version": "4.0.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "abbrev": "1",
- "osenv": "^0.1.4"
- }
- },
- "npm-bundled": {
- "version": "1.0.6",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "npm-packlist": {
- "version": "1.4.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ignore-walk": "^3.0.1",
- "npm-bundled": "^1.0.1"
- }
- },
- "npmlog": {
- "version": "4.1.2",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "are-we-there-yet": "~1.1.2",
- "console-control-strings": "~1.1.0",
- "gauge": "~2.7.3",
- "set-blocking": "~2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "object-assign": {
- "version": "4.1.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "once": {
- "version": "1.4.0",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "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.0",
- "os-tmpdir": "^1.0.0"
- }
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "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.0",
- "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.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"
- }
- },
- "rimraf": {
- "version": "2.6.3",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "glob": "^7.1.3"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "bundled": true,
- "dev": true,
- "optional": 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.0",
- "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_decoder": {
- "version": "1.1.1",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "string-width": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": 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",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "strip-json-comments": {
- "version": "2.0.1",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "tar": {
- "version": "4.4.8",
- "bundled": true,
- "dev": true,
- "optional": true,
- "requires": {
- "chownr": "^1.1.1",
- "fs-minipass": "^1.2.5",
- "minipass": "^2.3.4",
- "minizlib": "^1.1.1",
- "mkdirp": "^0.5.0",
- "safe-buffer": "^5.1.2",
- "yallist": "^3.0.2"
- }
- },
- "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 || 2"
- }
- },
- "wrappy": {
- "version": "1.0.2",
- "bundled": true,
- "dev": true,
- "optional": true
- },
- "yallist": {
- "version": "3.0.3",
- "bundled": true,
- "dev": true,
- "optional": true
- }
- }
- },
- "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"
- }
- },
- "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"
- }
- },
- "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"
- }
- },
- "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"
- },
- "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"
- }
- }
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "optional": 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,
- "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"
- }
- },
- "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"
- }
- }
- }
- },
- "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"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
"clean-stack": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
@@ -8412,16 +3855,6 @@
}
}
},
- "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",
@@ -8443,44 +3876,11 @@
"delayed-stream": "~1.0.0"
}
},
- "commander": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.1.tgz",
- "integrity": "sha512-UNgvDd+csKdc9GD4zjtkHKQbT8Aspt2jCBqNSPp53vAS0L1tS9sXB2TCEOPHJ7kt9bN/niWkYj8T3RQSoMXdSQ==",
- "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
- },
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
},
- "convert-source-map": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
- "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
- "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
- },
- "core-js": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.9.tgz",
- "integrity": "sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==",
- "dev": true
- },
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -8514,87 +3914,11 @@
"resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
"integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg=="
},
- "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"
- },
- "dependencies": {
- "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
- }
- }
- },
"decamelize": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
"integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
},
- "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
- },
- "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"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "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
- }
- }
- },
"del": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
@@ -8639,15 +3963,6 @@
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
- "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"
- }
- },
"dir-glob": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -8671,21 +3986,6 @@
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
},
- "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"
- }
- },
- "es2015": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/es2015/-/es2015-0.0.0.tgz",
- "integrity": "sha1-hO7kw1yCd2WLaOfkY42zB0GCKxQ=",
- "dev": true
- },
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
@@ -8696,73 +3996,16 @@
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
},
- "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.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
},
- "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"
- }
- },
- "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"
- }
- },
"extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
},
- "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": "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"
- }
- },
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -8864,27 +4107,6 @@
"resolved": "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz",
"integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA=="
},
- "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": "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"
- }
- },
"find-up": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -8894,22 +4116,6 @@
"path-exists": "^4.0.0"
}
},
- "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": "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"
- }
- },
"forever-agent": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
@@ -8925,32 +4131,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"
- }
- },
- "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"
- }
- },
- "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",
@@ -8967,12 +4147,6 @@
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
},
- "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",
@@ -9091,33 +4265,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.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.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
- },
"globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
@@ -9159,90 +4306,11 @@
"har-schema": "^2.0.0"
}
},
- "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"
- }
- },
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
},
- "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"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "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"
- }
- },
"http-signature": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -9298,132 +4366,11 @@
"resolved": "https://registry.npmjs.org/integer-keyboard/-/integer-keyboard-1.0.12.tgz",
"integrity": "sha512-DSLyd/PvtEBfc4grICTxSLu94Yo/Vm6rNerRZRbbzRrP0HQ9pYaquoY2RD9x6gAmica43gsFimScNpuRYVe54w=="
},
- "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"
- }
- },
- "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"
- }
- },
- "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-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"
- }
- },
- "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": "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-finite": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
- "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
- "dev": true,
- "requires": {
- "number-is-nan": "^1.0.0"
- }
- },
"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=="
},
- "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": "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"
- }
- },
"is-path-cwd": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
@@ -9436,85 +4383,26 @@
"integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
"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"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "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-typedarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
"integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
},
- "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="
},
- "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"
- }
- },
"isstream": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
"integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
},
- "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
- },
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
},
- "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.4.0",
"resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
@@ -9530,12 +4418,6 @@
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
"integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
},
- "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.1",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
@@ -9571,15 +4453,6 @@
"set-immediate-shim": "~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=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- },
"latinize": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/latinize/-/latinize-0.5.0.tgz",
@@ -9608,26 +4481,11 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
- "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
- },
"long": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz",
"integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s="
},
- "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"
- }
- },
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -9642,65 +4500,11 @@
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.17.2.tgz",
"integrity": "sha512-qELKtIj3HD41N+MvgoxArk8DZGUb4Gpiijs91oi+ZmKJzRlxY6CoyTwNoUwnogCVs4p8HuxVJDik9JbnYgrCng=="
},
- "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-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"
- }
- },
- "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
- },
- "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"
- }
- },
"merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
},
- "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"
- }
- },
"mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
@@ -9715,116 +4519,18 @@
}
},
"minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
"requires": {
"brace-expansion": "^1.1.7"
}
},
- "minimist": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
- "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
- "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.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.6"
- }
- },
"moment": {
"version": "2.29.4",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
},
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- },
- "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==",
- "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"
- },
- "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
- },
- "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
- },
- "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
- }
- }
- },
- "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"
- }
- },
"npm-bundled": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
@@ -9852,90 +4558,11 @@
"npm-normalize-package-bin": "^1.0.1"
}
},
- "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=="
},
- "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"
- }
- }
- }
- },
- "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"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
- "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"
- }
- },
- "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"
- },
- "dependencies": {
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -9944,29 +4571,6 @@
"wrappy": "1"
}
},
- "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-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",
@@ -10031,30 +4635,11 @@
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
},
- "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"
- }
- },
"parse-ms": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
"integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA=="
},
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
- },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -10081,80 +4666,26 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
- "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,
- "optional": true
- },
- "preserve": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
- "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
- "dev": true,
- "optional": 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-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=",
- "dev": true
- },
"punycode": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
},
"qs": {
- "version": "6.5.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
- "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ "version": "6.5.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
+ "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
},
"queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
},
- "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
- },
- "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
- }
- }
- },
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
@@ -10177,73 +4708,11 @@
"picomatch": "^2.2.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.5.0",
"resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz",
"integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw=="
},
- "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,
- "optional": 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,
- "optional": 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,
- "optional": 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.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
"request": {
"version": "2.88.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
@@ -10271,27 +4740,6 @@
"uuid": "^3.3.2"
}
},
- "request-promise": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.4.tgz",
- "integrity": "sha512-8wgMrvE546PzbR5WbYxUQogUnUDfM0S7QIFZMID+J73vdFARkFy+HElj4T+MWYhpXwlLp0EQ8Zoj8xUA0he4Vg==",
- "dev": true,
- "requires": {
- "bluebird": "^3.5.0",
- "request-promise-core": "1.1.2",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
- }
- },
- "request-promise-core": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz",
- "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==",
- "dev": true,
- "requires": {
- "lodash": "^4.17.11"
- }
- },
"require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -10308,18 +4756,6 @@
"integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==",
"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=",
- "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==",
- "dev": true
- },
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -10335,9 +4771,9 @@
}
},
"roku-deploy": {
- "version": "3.8.1",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.8.1.tgz",
- "integrity": "sha512-b8Q2IvBdEka4XIBNLU9CumPDto8X5zCmWQwwFfBPkJqwDnJ4U47GqKCJp1dHdmAY9H/JRYIj2TmFE4cTOUiTNw==",
+ "version": "3.9.2",
+ "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.9.2.tgz",
+ "integrity": "sha512-2LZyR4EhaFrka1gVmcuJO/f42tqz4clGImboVLCNem1q/PcFV5cnXNZRfqDI+MZ/n8eJto71JlZkcc7TDLt/EQ==",
"requires": {
"chalk": "^2.4.2",
"dateformat": "^3.0.3",
@@ -10347,9 +4783,9 @@
"is-glob": "^4.0.3",
"jsonc-parser": "^2.3.0",
"jszip": "^3.6.0",
- "minimatch": "^3.0.4",
"moment": "^2.29.1",
"parse-ms": "^2.1.0",
+ "picomatch": "^2.2.1",
"request": "^2.88.0",
"temp-dir": "^2.0.0",
"xml2js": "^0.4.23"
@@ -10406,27 +4842,6 @@
}
}
},
- "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": "latest",
- "commander": "latest",
- "debug": "latest",
- "es2015": "0.0.0",
- "fs-extra": "^5.0.0",
- "glob-all": "^3.1.0",
- "lodash": "latest",
- "replace-ext": "^1.0.0",
- "request": "^2.88.0",
- "request-promise": "^4.2.4",
- "splice-string": "^2.0.0",
- "typescript": "3.7.4"
- }
- },
"ropm": {
"version": "0.10.10",
"resolved": "https://registry.npmjs.org/ropm/-/ropm-0.10.10.tgz",
@@ -10455,6 +4870,117 @@
"chevrotain": "7.1.1"
}
},
+ "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"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "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
+ },
+ "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.57.2",
+ "resolved": "https://registry.npmjs.org/brighterscript/-/brighterscript-0.57.2.tgz",
+ "integrity": "sha512-idvz7lVLSN1mM/VoDt4/uJPFqdydSgCro2eIwT9vqV8z/1iNLpUtvXCWfeAbWxsbJkXWtmQq4GPkklCxc4OjrQ==",
+ "dev": true,
+ "requires": {
+ "@rokucommunity/bslib": "^0.1.1",
+ "@xml-tools/parser": "^1.0.7",
+ "array-flat-polyfill": "^1.0.1",
+ "chalk": "^2.4.2",
+ "chevrotain": "^7.0.1",
+ "chokidar": "^3.5.1",
+ "clear": "^0.1.0",
+ "cross-platform-clear-console": "^2.3.0",
+ "debounce-promise": "^3.1.0",
+ "eventemitter3": "^4.0.0",
+ "fast-glob": "^3.2.11",
+ "file-url": "^3.0.0",
+ "fs-extra": "^8.0.0",
+ "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",
+ "require-relative": "^0.8.7",
+ "roku-deploy": "^3.8.1",
+ "serialize-error": "^7.0.1",
+ "source-map": "^0.7.3",
+ "vscode-languageserver": "7.0.0",
+ "vscode-languageserver-protocol": "3.16.0",
+ "vscode-languageserver-textdocument": "^1.0.1",
+ "vscode-uri": "^2.1.1",
+ "xml2js": "^0.4.19",
+ "yargs": "^16.2.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "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"
+ }
+ },
"chevrotain": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz",
@@ -10464,6 +4990,31 @@
"regexp-to-ast": "0.5.0"
}
},
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "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": "9.1.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
@@ -10476,6 +5027,45 @@
"universalify": "^2.0.0"
}
},
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "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-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.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
+ },
"jsonfile": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -10486,6 +5076,36 @@
"universalify": "^2.0.0"
}
},
+ "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
+ },
+ "source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "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"
+ }
+ },
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
@@ -10522,15 +5142,6 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
- "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",
@@ -10568,217 +5179,11 @@
"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
},
- "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"
- }
- }
- }
- },
- "slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
- "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"
- }
- }
- }
- },
- "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,
- "optional": 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,
- "optional": 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,
- "optional": 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,
- "optional": 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,
- "optional": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true,
- "optional": 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,
- "optional": true
- }
- }
- },
- "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,
- "optional": true,
- "requires": {
- "kind-of": "^3.2.0"
- }
- },
"sob": {
"version": "npm:slide-out-button@1.0.1",
"resolved": "https://registry.npmjs.org/slide-out-button/-/slide-out-button-1.0.1.tgz",
"integrity": "sha512-R2m/9IcxjE7G9BlL+AcHBUEh84ojdfImwk/CAaEX3WZT/oSIGYF2StHQ0TcWqatN2Tg9OTr4pNLVso66KH2Tgw=="
},
- "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-resolve": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
- "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
- "dev": true,
- "requires": {
- "atob": "^2.1.1",
- "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"
- }
- },
- "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
- },
- "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"
- }
- },
"sshpk": {
"version": "1.16.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
@@ -10795,33 +5200,6 @@
"tweetnacl": "~0.14.0"
}
},
- "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"
- }
- }
- }
- },
- "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
- },
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
@@ -10855,76 +5233,11 @@
}
}
},
- "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
- },
"temp-dir": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz",
"integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg=="
},
- "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"
- }
- },
- "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": "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"
- },
- "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,
- "optional": true,
- "requires": {
- "kind-of": "^3.0.2"
- }
- }
- }
- },
"tough-cookie": {
"version": "2.4.3",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
@@ -10946,12 +5259,6 @@
}
}
},
- "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
- },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -10970,75 +5277,11 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
"integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg=="
},
- "typescript": {
- "version": "3.7.4",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.4.tgz",
- "integrity": "sha512-A25xv5XCtarLwXpcDNZzCGvW2D1S3/bACratYBx2sax8PefsFhlYmkQicKHvpYflFS8if4zne5zT5kpJ7pzuvw==",
- "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"
- }
- },
"universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
"integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg=="
},
- "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
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- }
- }
- },
"uri-js": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
@@ -11047,24 +5290,6 @@
"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-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -11075,15 +5300,6 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz",
"integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ=="
},
- "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"
- }
- },
"verror": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
diff --git a/package.json b/package.json
index 49888721..80bba529 100644
--- a/package.json
+++ b/package.json
@@ -1,15 +1,11 @@
{
"name": "jellyfin-roku",
- "version": "1.6.1",
+ "version": "1.6.2",
"description": "Roku app for Jellyfin media server",
"main": "index.js",
- "directories": {
- "test": "tests"
- },
"devDependencies": {
"@rokucommunity/bslint": "0.7.5",
- "brighterscript": "0.57.2",
- "rooibos-cli": "1.4.0",
+ "brighterscript": "0.61.1",
"ropm": "0.10.10"
},
"scripts": {
diff --git a/settings/settings.json b/settings/settings.json
index 8a860c9b..1b70da60 100644
--- a/settings/settings.json
+++ b/settings/settings.json
@@ -3,6 +3,13 @@
"title": "Playback",
"description": "Settings relating to playback and supported codec and media types.",
"children": [
+ {
+ "title": "AV1 Support",
+ "description": "** EXPERIMENTAL** Support Direct Play of AV1 content if this Roku device supports it.",
+ "settingName": "playback.av1",
+ "type": "bool",
+ "default": "false"
+ },
{
"title": "MPEG-2 Support",
"description": "Support Direct Play of MPEG-2 content (e.g., Live TV). This will prevent transcoding of MPEG-2 content, but uses significantly more bandwidth.",
@@ -11,12 +18,26 @@
"default": "false"
},
{
- "title": "Attempt Direct Play (Profile Lvl)",
- "description": "Attempt Direct Play for H.264 media with unsupported profile levels (> 4.2) before falling back to transcoding if it fails.",
+ "title": "MPEG-4 Support",
+ "description": "Support Direct Play of MPEG-4 content. This may need to be disabled for playback of DIVX encoded video files.",
+ "settingName": "playback.mpeg4",
+ "type": "bool",
+ "default": "true"
+ },
+ {
+ "title": "Direct Play H.264 Unsupported Profile Levels",
+ "description": "Attempt Direct Play for H.264 media with unsupported profile levels before falling back to transcoding if it fails.",
"settingName": "playback.tryDirect.h264ProfileLevel",
"type": "bool",
"default": "true"
},
+ {
+ "title": "Direct Play HEVC Unsupported Profile Levels",
+ "description": "Attempt Direct Play for HEVC media with unsupported profile levels before falling back to trancoding if it fails.",
+ "settingName": "playback.tryDirect.hevcProfileLevel",
+ "type": "bool",
+ "default": "true"
+ },
{
"title": "Cinema Mode",
"description": "Cinema Mode brings the theater experience straight to your living room with the ability to play custom intros before the main feature.",
diff --git a/source/Main.brs b/source/Main.brs
index 75579e4e..839139b4 100644
--- a/source/Main.brs
+++ b/source/Main.brs
@@ -1,9 +1,5 @@
sub Main (args as dynamic) as void
- ' If the Rooibos files are included in deployment, run tests
- 'bs:disable-next-line
- if type(Rooibos__Init) = "Function" then Rooibos__Init()
-
' The main function that runs when the application is launched.
m.screen = CreateObject("roSGScreen")
@@ -13,13 +9,6 @@ sub Main (args as dynamic) as void
WriteAsciiFile("tmp:/scene.temp", "")
MoveFile("tmp:/scene.temp", "tmp:/scene")
- ' Temporary code to migrate MPEG2 setting from device setting to user setting
- ' Added for 1.4.13 release and should probably be removed for 1.4.15
- if get_setting("playback.mpeg2") <> invalid and registry_read("playback.mpeg2", get_setting("active_user")) = invalid
- set_user_setting("playback.mpeg2", get_setting("playback.mpeg2"))
- end if
- ' End Temporary code
-
m.port = CreateObject("roMessagePort")
m.screen.setMessagePort(m.port)
m.scene = m.screen.CreateScene("JFScene")
@@ -110,8 +99,20 @@ sub Main (args as dynamic) as void
else if isNodeEvent(msg, "selectedItem")
' If you select a library from ANYWHERE, follow this flow
selectedItem = msg.getData()
+
m.selectedItemType = selectedItem.type
- if selectedItem.type = "CollectionFolder" or selectedItem.type = "UserView" or selectedItem.type = "Folder" or selectedItem.type = "Channel" or selectedItem.type = "Boxset"
+ '
+ if selectedItem.type = "CollectionFolder"
+ if selectedItem.collectionType = "movies"
+ group = CreateMovieLibraryView(selectedItem)
+ else
+ group = CreateItemGrid(selectedItem)
+ end if
+ sceneManager.callFunc("pushScene", group)
+ else if selectedItem.type = "Folder" and selectedItem.json.type = "Genre"
+ group = CreateMovieLibraryView(selectedItem)
+ sceneManager.callFunc("pushScene", group)
+ else if selectedItem.type = "UserView" or selectedItem.type = "Folder" or selectedItem.type = "Channel" or selectedItem.type = "Boxset"
group = CreateItemGrid(selectedItem)
sceneManager.callFunc("pushScene", group)
else if selectedItem.type = "Episode"
@@ -128,6 +129,8 @@ sub Main (args as dynamic) as void
end if
else if selectedItem.type = "Series"
group = CreateSeriesDetailsGroup(selectedItem.json)
+ else if selectedItem.type = "Season"
+ group = CreateSeasonDetailsGroupByID(selectedItem.json.SeriesId, selectedItem.id)
else if selectedItem.type = "Movie"
' open movie detail page
group = CreateMovieDetailsGroup(selectedItem)
@@ -142,7 +145,12 @@ sub Main (args as dynamic) as void
dialog.title = tr("Loading Channel Data")
m.scene.dialog = dialog
- video = CreateVideoPlayerGroup(video_id)
+ if LCase(selectedItem.subtype()) = "extrasdata"
+ video = CreateVideoPlayerGroup(video_id, invalid, 1, false, true, false)
+ else
+ video = CreateVideoPlayerGroup(video_id)
+ end if
+
dialog.close = true
if video <> invalid and video.errorMsg <> "introaborted"
@@ -332,7 +340,7 @@ sub Main (args as dynamic) as void
video_id = trailerData[0].id
- video = CreateVideoPlayerGroup(video_id, mediaSourceId, audio_stream_idx)
+ video = CreateVideoPlayerGroup(video_id, mediaSourceId, audio_stream_idx, false, false)
if video <> invalid and video.errorMsg <> "introaborted"
sceneManager.callFunc("pushScene", video)
end if
@@ -437,12 +445,6 @@ sub Main (args as dynamic) as void
autoPlayNextEpisode(node.id, node.showID)
end if
end if
- 'else if isNodeEvent(msg, "selectedExtra")
- 'rl = msg.getData()
- 'sel = rl.rowItemSelected
- '? "msg.getfield():" + msg.getField()
- 'stop
- 'CreatePersonView(msg.getData())
else if type(msg) = "roDeviceInfoEvent"
event = msg.GetInfo()
group = sceneManager.callFunc("getActiveScene")
diff --git a/source/ShowScenes.brs b/source/ShowScenes.brs
index 84276831..90042322 100644
--- a/source/ShowScenes.brs
+++ b/source/ShowScenes.brs
@@ -352,7 +352,7 @@ function CreateMovieDetailsGroup(movie)
extras = group.findNode("extrasGrid")
extras.observeField("selectedItem", m.port)
- extras.callFunc("loadPeople", movie.json)
+ extras.callFunc("loadParts", movie.json)
return group
end function
@@ -369,7 +369,7 @@ function CreateSeriesDetailsGroup(series)
extras = group.findNode("extrasGrid")
extras.observeField("selectedItem", m.port)
- extras.callFunc("loadPeople", group.itemcontent.json)
+ extras.callFunc("loadParts", group.itemcontent.json)
return group
end function
@@ -453,6 +453,20 @@ function CreateSeasonDetailsGroup(series, season)
return group
end function
+function CreateSeasonDetailsGroupByID(seriesID, seasonID)
+ group = CreateObject("roSGNode", "TVEpisodes")
+ group.optionsAvailable = false
+ m.global.sceneManager.callFunc("pushScene", group)
+
+ group.seasonData = ItemMetaData(seasonID).json
+ group.objects = TVEpisodes(seriesID, seasonID)
+
+ group.observeField("episodeSelected", m.port)
+ group.observeField("quickPlayNode", m.port)
+
+ return group
+end function
+
function CreateItemGrid(libraryItem)
group = CreateObject("roSGNode", "ItemGrid")
group.parentItem = libraryItem
@@ -461,6 +475,14 @@ function CreateItemGrid(libraryItem)
return group
end function
+function CreateMovieLibraryView(libraryItem)
+ group = CreateObject("roSGNode", "MovieLibraryView")
+ group.parentItem = libraryItem
+ group.optionsAvailable = true
+ group.observeField("selectedItem", m.port)
+ return group
+end function
+
function CreateSearchPage()
' Search + Results Page
group = CreateObject("roSGNode", "searchResults")
@@ -476,10 +498,10 @@ sub CreateSidePanel(buttons, options)
group.options = options
end sub
-function CreateVideoPlayerGroup(video_id, mediaSourceId = invalid, audio_stream_idx = 1, forceTranscoding = false, showIntro = true)
+function CreateVideoPlayerGroup(video_id, mediaSourceId = invalid, audio_stream_idx = 1, forceTranscoding = false, showIntro = true, allowResumeDialog = true)
' Video is Playing
- video = VideoPlayer(video_id, mediaSourceId, audio_stream_idx, defaultSubtitleTrackFromVid(video_id), forceTranscoding, showIntro)
+ video = VideoPlayer(video_id, mediaSourceId, audio_stream_idx, defaultSubtitleTrackFromVid(video_id), forceTranscoding, showIntro, allowResumeDialog)
if video = invalid then return invalid
if video.errorMsg = "introaborted" then return video
@@ -570,17 +592,6 @@ function CreatePersonView(personData as object) as object
return person
end function
-function CreatePhotoPage(photo)
- group = CreateObject("roSGNode", "PhotoDetails")
- group.optionsAvailable = true
- m.global.sceneManager.callFunc("pushScene", group)
-
- group.itemContent = photo
-
- return group
-
-end function
-
sub UpdateSavedServerList()
server = get_setting("server")
username = get_setting("username")
diff --git a/source/VideoPlayer.brs b/source/VideoPlayer.brs
index f8e8a105..291b5a85 100644
--- a/source/VideoPlayer.brs
+++ b/source/VideoPlayer.brs
@@ -1,8 +1,8 @@
-function VideoPlayer(id, mediaSourceId = invalid, audio_stream_idx = 1, subtitle_idx = -1, forceTranscoding = false, showIntro = true)
+function VideoPlayer(id, mediaSourceId = invalid, audio_stream_idx = 1, subtitle_idx = -1, forceTranscoding = false, showIntro = true, allowResumeDialog = true)
' Get video controls and UI
video = CreateObject("roSGNode", "JFVideo")
video.id = id
- AddVideoContent(video, mediaSourceId, audio_stream_idx, subtitle_idx, -1, forceTranscoding, showIntro)
+ AddVideoContent(video, mediaSourceId, audio_stream_idx, subtitle_idx, -1, forceTranscoding, showIntro, allowResumeDialog)
if video.errorMsg = "introaborted"
return video
@@ -19,7 +19,7 @@ function VideoPlayer(id, mediaSourceId = invalid, audio_stream_idx = 1, subtitle
return video
end function
-sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -1, playbackPosition = -1, forceTranscoding = false, showIntro = true)
+sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -1, playbackPosition = -1, forceTranscoding = false, showIntro = true, allowResumeDialog = true)
video.content = createObject("RoSGNode", "ContentNode")
meta = ItemMetaData(video.id)
m.videotype = meta.type
@@ -45,108 +45,115 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
end if
end if
+ if m.videotype = "Episode" or m.videotype = "Series"
+ video.runTime = (meta.json.RunTimeTicks / 10000000.0)
+ video.content.contenttype = "episode"
+ end if
+
video.content.title = meta.title
video.showID = meta.showID
if playbackPosition = -1
playbackPosition = meta.json.UserData.PlaybackPositionTicks
- if playbackPosition > 0
- dialogResult = startPlayBackOver(playbackPosition)
- 'Dialog returns -1 when back pressed, 0 for resume, and 1 for start over
- if dialogResult = -1
- 'User pressed back, return invalid and don't load video
- video.content = invalid
- return
- else if dialogResult = 1
- 'Start Over selected, change position to 0
- playbackPosition = 0
- else if dialogResult = 2
- 'Mark this item as watched, refresh the page, and return invalid so we don't load the video
- MarkItemWatched(video.id)
- video.content.watched = not video.content.watched
- group = m.scene.focusedChild
- group.timeLastRefresh = CreateObject("roDateTime").AsSeconds()
- group.callFunc("refresh")
- video.content = invalid
- return
- else if dialogResult = 3
- 'get series ID based off episiode ID
- params = {
- ids: video.Id
- }
- url = Substitute("Users/{0}/Items/", get_setting("active_user"))
- resp = APIRequest(url, params)
- data = getJson(resp)
- for each item in data.Items
- m.series_id = item.SeriesId
- end for
- 'Get series json data
- params = {
- ids: m.series_id
- }
- url = Substitute("Users/{0}/Items/", get_setting("active_user"))
- resp = APIRequest(url, params)
- data = getJson(resp)
- for each item in data.Items
- m.tmp = item
- end for
- 'Create Series Scene
- CreateSeriesDetailsGroup(m.tmp)
- video.content = invalid
- return
+ if allowResumeDialog
+ if playbackPosition > 0
+ dialogResult = startPlayBackOver(playbackPosition)
+ 'Dialog returns -1 when back pressed, 0 for resume, and 1 for start over
+ if dialogResult = -1
+ 'User pressed back, return invalid and don't load video
+ video.content = invalid
+ return
+ else if dialogResult = 1
+ 'Start Over selected, change position to 0
+ playbackPosition = 0
+ else if dialogResult = 2
+ 'Mark this item as watched, refresh the page, and return invalid so we don't load the video
+ MarkItemWatched(video.id)
+ video.content.watched = not video.content.watched
+ group = m.scene.focusedChild
+ group.timeLastRefresh = CreateObject("roDateTime").AsSeconds()
+ group.callFunc("refresh")
+ video.content = invalid
+ return
+ else if dialogResult = 3
+ 'get series ID based off episiode ID
+ params = {
+ ids: video.Id
+ }
+ url = Substitute("Users/{0}/Items/", get_setting("active_user"))
+ resp = APIRequest(url, params)
+ data = getJson(resp)
+ for each item in data.Items
+ m.series_id = item.SeriesId
+ end for
+ 'Get series json data
+ params = {
+ ids: m.series_id
+ }
+ url = Substitute("Users/{0}/Items/", get_setting("active_user"))
+ resp = APIRequest(url, params)
+ data = getJson(resp)
+ for each item in data.Items
+ m.tmp = item
+ end for
+ 'Create Series Scene
+ CreateSeriesDetailsGroup(m.tmp)
+ video.content = invalid
+ return
- else if dialogResult = 4
- 'get Season/Series ID based off episiode ID
- params = {
- ids: video.Id
- }
- url = Substitute("Users/{0}/Items/", get_setting("active_user"))
- resp = APIRequest(url, params)
- data = getJson(resp)
- for each item in data.Items
- m.season_id = item.SeasonId
- m.series_id = item.SeriesId
- end for
- 'Get Series json data
- params = {
- ids: m.season_id
- }
- url = Substitute("Users/{0}/Items/", get_setting("active_user"))
- resp = APIRequest(url, params)
- data = getJson(resp)
- for each item in data.Items
- m.Season_tmp = item
- end for
- 'Get Season json data
- params = {
- ids: m.series_id
- }
- url = Substitute("Users/{0}/Items/", get_setting("active_user"))
- resp = APIRequest(url, params)
- data = getJson(resp)
- for each item in data.Items
- m.Series_tmp = item
- end for
- 'Create Season Scene
- CreateSeasonDetailsGroup(m.Series_tmp, m.Season_tmp)
- video.content = invalid
- return
+ else if dialogResult = 4
+ 'get Season/Series ID based off episiode ID
+ params = {
+ ids: video.Id
+ }
+ url = Substitute("Users/{0}/Items/", get_setting("active_user"))
+ resp = APIRequest(url, params)
+ data = getJson(resp)
+ for each item in data.Items
+ m.season_id = item.SeasonId
+ m.series_id = item.SeriesId
+ end for
+ 'Get Series json data
+ params = {
+ ids: m.season_id
+ }
+ url = Substitute("Users/{0}/Items/", get_setting("active_user"))
+ resp = APIRequest(url, params)
+ data = getJson(resp)
+ for each item in data.Items
+ m.Season_tmp = item
+ end for
+ 'Get Season json data
+ params = {
+ ids: m.series_id
+ }
+ url = Substitute("Users/{0}/Items/", get_setting("active_user"))
+ resp = APIRequest(url, params)
+ data = getJson(resp)
+ for each item in data.Items
+ m.Series_tmp = item
+ end for
+ 'Create Season Scene
+ CreateSeasonDetailsGroup(m.Series_tmp, m.Season_tmp)
+ video.content = invalid
+ return
- else if dialogResult = 5
- 'get episiode ID
- params = {
- ids: video.Id
- }
- url = Substitute("Users/{0}/Items/", get_setting("active_user"))
- resp = APIRequest(url, params)
- data = getJson(resp)
- for each item in data.Items
- m.episode_id = item
- end for
- 'Create Episode Scene
- CreateMovieDetailsGroup(m.episode_id)
- video.content = invalid
- return
+ else if dialogResult = 5
+ 'get episiode ID
+ params = {
+ ids: video.Id
+ }
+ url = Substitute("Users/{0}/Items/", get_setting("active_user"))
+ resp = APIRequest(url, params)
+ data = getJson(resp)
+ for each item in data.Items
+ m.episode_id = item
+ end for
+ 'Create Episode Scene
+ CreateMovieDetailsGroup(m.episode_id)
+ video.content = invalid
+ return
+ end if
end if
end if
end if
@@ -213,16 +220,20 @@ sub AddVideoContent(video, mediaSourceId, audio_stream_idx = 1, subtitle_idx = -
fully_external = false
- ' For h264 video, Roku spec states that it supports and Encoding level 4.1 and 4.2.
+ ' For h264/hevc video, Roku spec states that it supports specfic encoding levels
' The device can decode content with a Higher Encoding level but may play it back with certain
' artifacts. If the user preference is set, and the only reason the server says we need to
- ' transcode is that the Envoding Level is not supported, then try to direct play but silently
+ ' transcode is that the Encoding Level is not supported, then try to direct play but silently
' fall back to the transcode if that fails.
- if meta.live = false and get_user_setting("playback.tryDirect.h264ProfileLevel") = "true" and m.playbackInfo.MediaSources[0].TranscodingUrl <> invalid and forceTranscoding = false and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "h264"
- transcodingReasons = getTranscodeReasons(m.playbackInfo.MediaSources[0].TranscodingUrl)
- if transcodingReasons.Count() = 1 and transcodingReasons[0] = "VideoLevelNotSupported"
- video.directPlaySupported = true
- video.transcodeAvailable = true
+ if m.playbackInfo.MediaSources[0].MediaStreams.Count() > 0 and meta.live = false
+ tryDirectPlay = get_user_setting("playback.tryDirect.h264ProfileLevel") = "true" and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "h264"
+ tryDirectPlay = tryDirectPlay or (get_user_setting("playback.tryDirect.hevcProfileLevel") = "true" and m.playbackInfo.MediaSources[0].MediaStreams[0].codec = "hevc")
+ if tryDirectPlay and m.playbackInfo.MediaSources[0].TranscodingUrl <> invalid and forceTranscoding = false
+ transcodingReasons = getTranscodeReasons(m.playbackInfo.MediaSources[0].TranscodingUrl)
+ if transcodingReasons.Count() = 1 and transcodingReasons[0] = "VideoLevelNotSupported"
+ video.directPlaySupported = true
+ video.transcodeAvailable = true
+ end if
end if
end if
@@ -420,7 +431,7 @@ sub autoPlayNextEpisode(videoID as string, showID as string)
if data <> invalid and data.Items.Count() = 2
' setup new video node
nextVideo = CreateVideoPlayerGroup(data.Items[1].Id, invalid, 1, false, false)
- ' remove last video scene
+ ' remove last videoplayer scene
m.global.sceneManager.callFunc("clearPreviousScene")
if nextVideo <> invalid
m.global.sceneManager.callFunc("pushScene", nextVideo)
diff --git a/source/api/Items.brs b/source/api/Items.brs
index 6c24a933..4cdf4b8e 100644
--- a/source/api/Items.brs
+++ b/source/api/Items.brs
@@ -329,26 +329,32 @@ function AudioStream(id as string)
songData = AudioItem(id)
content = createObject("RoSGNode", "ContentNode")
-
- params = {}
-
- params.append({
- "Static": "true",
- "Container": songData.mediaSources[0].container
- })
-
- params.MediaSourceId = songData.mediaSources[0].id
-
- content.url = buildURL(Substitute("Audio/{0}/stream", songData.id), params)
content.title = songData.title
- content.streamformat = songData.mediaSources[0].container
- playbackInfo = ItemPostPlaybackInfo(songData.id, params.MediaSourceId)
+ playbackInfo = ItemPostPlaybackInfo(songData.id, songData.mediaSources[0].id)
content.id = playbackInfo.PlaySessionId
+ if useTranscodeAudioStream(playbackInfo)
+ ' Transcode the audio
+ content.url = buildURL(playbackInfo.mediaSources[0].TranscodingURL)
+ else
+ ' Direct Stream the audio
+ params = {
+ "Static": "true",
+ "Container": songData.mediaSources[0].container,
+ "MediaSourceId": songData.mediaSources[0].id
+ }
+ content.streamformat = songData.mediaSources[0].container
+ content.url = buildURL(Substitute("Audio/{0}/stream", songData.id), params)
+ end if
+
return content
end function
+function useTranscodeAudioStream(playbackInfo)
+ return playbackInfo.mediaSources[0] <> invalid and playbackInfo.mediaSources[0].TranscodingURL <> invalid
+end function
+
function BackdropImage(id as string)
imgParams = { "maxHeight": "720", "maxWidth": "1280" }
return ImageURL(id, "Backdrop", imgParams)
diff --git a/source/utils/deviceCapabilities.brs b/source/utils/deviceCapabilities.brs
index 0f4002f7..ceb5bebe 100644
--- a/source/utils/deviceCapabilities.brs
+++ b/source/utils/deviceCapabilities.brs
@@ -18,6 +18,7 @@ end function
function getDeviceProfile() as object
playMpeg2 = get_user_setting("playback.mpeg2") = "true"
+ playAv1 = get_user_setting("playback.av1") = "true"
'Check if 5.1 Audio Output connected
maxAudioChannels = 2
@@ -26,14 +27,19 @@ function getDeviceProfile() as object
maxAudioChannels = 6
end if
- if playMpeg2 and di.CanDecodeVideo({ Codec: "mpeg2" }).Result = true
- tsVideoCodecs = "h264,mpeg2video"
- else
- tsVideoCodecs = "h264"
+ addHevcProfile = false
+ MAIN10 = ""
+ tsVideoCodecs = "h264"
+ if di.CanDecodeVideo({ Codec: "hevc" }).Result = true
+ tsVideoCodecs = "h265,hevc," + tsVideoCodecs
+ addHevcProfile = true
+ if di.CanDecodeVideo({ Codec: "hevc", Profile: "main 10" }).Result
+ MAIN10 = "|main 10"
+ end if
end if
- if di.CanDecodeVideo({ Codec: "hevc" }).Result = true
- tsVideoCodecs = tsVideoCodecs + ",h265,hevc"
+ if playMpeg2 and di.CanDecodeVideo({ Codec: "mpeg2" }).Result = true
+ tsVideoCodecs = tsVideoCodecs + ",mpeg2video"
end if
if di.CanDecodeAudio({ Codec: "ac3" }).result
@@ -42,9 +48,42 @@ function getDeviceProfile() as object
tsAudioCodecs = "aac"
end if
+ addAv1Profile = false
+ if playAv1 and di.CanDecodeVideo({ Codec: "av1" }).result
+ tsVideoCodecs = tsVideoCodecs + ",av1"
+ addAv1Profile = true
+ end if
+
+ addVp9Profile = false
+ if di.CanDecodeVideo({ Codec: "vp9" }).result
+ tsVideoCodecs = tsVideoCodecs + ",vp9"
+ addVp9Profile = true
+ end if
+
+ hevcVideoRangeTypes = "SDR"
+ vp9VideoRangeTypes = "SDR"
+ av1VideoRangeTypes = "SDR"
+
+ dp = di.GetDisplayProperties()
+ if dp.Hdr10 ' or dp.Hdr10Plus?
+ hevcVideoRangeTypes = hevcVideoRangeTypes + "|HDR10"
+ vp9VideoRangeTypes = vp9VideoRangeTypes + "|HDR10"
+ av1VideoRangeTypes = av1VideoRangeTypes + "|HDR10"
+ end if
+ if dp.HLG
+ hevcVideoRangeTypes = hevcVideoRangeTypes + "|HLG"
+ vp9VideoRangeTypes = vp9VideoRangeTypes + "|HLG"
+ av1VideoRangeTypes = av1VideoRangeTypes + "|HLG"
+ end if
+ if dp.DolbyVision
+ hevcVideoRangeTypes = hevcVideoRangeTypes + "|DOVI"
+ 'vp9VideoRangeTypes = vp9VideoRangeTypes + ",DOVI" no evidence that vp9 can hold DOVI
+ av1VideoRangeTypes = av1VideoRangeTypes + "|DOVI"
+ end if
+
DirectPlayProfile = GetDirectPlayProfiles()
- return {
+ deviceProfile = {
"MaxStreamingBitrate": 120000000,
"MaxStaticBitrate": 100000000,
"MusicStreamingTranscodingBitrate": 192000,
@@ -133,24 +172,6 @@ function getDeviceProfile() as object
"IsRequired": false
}
]
- },
- {
- "Type": "Video",
- "Codec": "hevc",
- "Conditions": [
- {
- "Condition": "EqualsAny",
- "Property": "VideoProfile",
- "Value": "main",
- "IsRequired": false
- },
- {
- "Condition": "LessThanEqual",
- "Property": "VideoLevel",
- "Value": StrI(120 * 5.1),
- "IsRequired": false
- }
- ]
}
],
"SubtitleProfiles": [
@@ -172,12 +193,68 @@ function getDeviceProfile() as object
}
]
}
+ if addAv1Profile
+ deviceProfile.CodecProfiles.push({
+ "Type": "Video",
+ "Codec": "av1",
+ "Conditions": [
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": av1VideoRangeTypes,
+ "IsRequired": false
+ }
+ ]
+ })
+ end if
+ if addHevcProfile
+ deviceProfile.CodecProfiles.push({
+ "Type": "Video",
+ "Codec": "hevc",
+ "Conditions": [
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoProfile",
+ "Value": "main" + MAIN10,
+ "IsRequired": false
+ },
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": hevcVideoRangeTypes,
+ "IsRequired": false
+ },
+ {
+ "Condition": "LessThanEqual",
+ "Property": "VideoLevel",
+ "Value": (120 * 5.1).ToStr(),
+ "IsRequired": false
+ }
+ ]
+ })
+ end if
+ if addVp9Profile
+ deviceProfile.CodecProfiles.push({
+ "Type": "Video",
+ "Codec": "vp9",
+ "Conditions": [
+ {
+ "Condition": "EqualsAny",
+ "Property": "VideoRangeType",
+ "Value": vp9VideoRangeTypes,
+ "IsRequired": false
+ }
+ ]
+ })
+ end if
+
+ return deviceProfile
end function
function GetDirectPlayProfiles() as object
- mp4Video = "h264,mpeg4"
+ mp4Video = "h264"
mp4Audio = "mp3,pcm,lpcm,wav"
mkvVideo = "h264,vp8"
mkvAudio = "mp3,pcm,lpcm,wav"
@@ -202,6 +279,10 @@ function GetDirectPlayProfiles() as object
mkvVideo = mkvVideo + ",mpeg2video"
end if
+ if get_user_setting("playback.mpeg4") = "true"
+ mp4Video = mp4Video + ",mpeg4"
+ end if
+
' Check for supported Audio
if di.CanDecodeAudio({ Codec: "ac3" }).result
mkvAudio = mkvAudio + ",ac3"
diff --git a/tests/.rooibosrc.json b/tests/.rooibosrc.json
deleted file mode 100644
index 6b273721..00000000
--- a/tests/.rooibosrc.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "testPath": "out/staging/source/tests/specs",
- "rootPath": "",
- "outputPath": "out/staging/source/tests/rooibos",
- "projectPath": "."
- }
diff --git a/tests/components/rooibos/TestsScene.xml b/tests/components/rooibos/TestsScene.xml
deleted file mode 100644
index 674734c3..00000000
--- a/tests/components/rooibos/TestsScene.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
diff --git a/tests/source/rooibos/rooibosDist.brs b/tests/source/rooibos/rooibosDist.brs
deleted file mode 100644
index b2ba0873..00000000
--- a/tests/source/rooibos/rooibosDist.brs
+++ /dev/null
@@ -1,2216 +0,0 @@
-'/**
-' * rooibos - simple, flexible, fun brightscript test framework for roku scenegraph apps
-' * @version v2.3.0
-' * @link https://github.com/georgejecook/rooibos#readme
-' * @license MIT
-' */
-function Rooibos__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
- runner = RBS_TR_TestRunner(args)
- runner.Run()
- 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
-function BaseTestSuite() as object
- this = {}
- this.Name = "BaseTestSuite"
- this.invalidValue = "#ROIBOS#INVALID_VALUE" ' special value used in mock arguments
- this.ignoreValue = "#ROIBOS#IGNORE_VALUE" ' special value used in mock arguments
- this.allowNonExistingMethodsOnMocks = true
- this.isAutoAssertingMocks = true
- this.TestCases = []
- this.AddTest = RBS_BTS_AddTest
- this.CreateTest = RBS_BTS_CreateTest
- this.GetLegacyCompatibleReturnValue = RBS_BTS_GetLegacyCompatibleReturnValue
- this.Fail = RBS_BTS_Fail
- this.AssertFalse = RBS_BTS_AssertFalse
- this.AssertTrue = RBS_BTS_AssertTrue
- this.AssertEqual = RBS_BTS_AssertEqual
- this.AssertLike = RBS_BTS_AssertLike
- this.AssertNotEqual = RBS_BTS_AssertNotEqual
- this.AssertInvalid = RBS_BTS_AssertInvalid
- this.AssertNotInvalid = RBS_BTS_AssertNotInvalid
- this.AssertAAHasKey = RBS_BTS_AssertAAHasKey
- this.AssertAANotHasKey = RBS_BTS_AssertAANotHasKey
- this.AssertAAHasKeys = RBS_BTS_AssertAAHasKeys
- this.AssertAANotHasKeys = RBS_BTS_AssertAANotHasKeys
- this.AssertArrayContains = RBS_BTS_AssertArrayContains
- this.AssertArrayNotContains = RBS_BTS_AssertArrayNotContains
- this.AssertArrayContainsSubset = RBS_BTS_AssertArrayContainsSubset
- this.AssertArrayContainsAAs = RBS_BTS_AssertArrayContainsAAs
- this.AssertArrayNotContainsSubset = RBS_BTS_AssertArrayNotContainsSubset
- this.AssertArrayCount = RBS_BTS_AssertArrayCount
- this.AssertArrayNotCount = RBS_BTS_AssertArrayNotCount
- this.AssertEmpty = RBS_BTS_AssertEmpty
- this.AssertNotEmpty = RBS_BTS_AssertNotEmpty
- this.AssertArrayContainsOnlyValuesOfType = RBS_BTS_AssertArrayContainsOnlyValuesOfType
- this.AssertType = RBS_BTS_AssertType
- this.AssertSubType = RBS_BTS_AssertSubType
- this.AssertNodeCount = RBS_BTS_AssertNodeCount
- this.AssertNodeNotCount = RBS_BTS_AssertNodeNotCount
- this.AssertNodeEmpty = RBS_BTS_AssertNodeEmpty
- this.AssertNodeNotEmpty = RBS_BTS_AssertNodenotEmpty
- this.AssertNodeContains = RBS_BTS_AssertNodeContains
- this.AssertNodeNotContains = RBS_BTS_AssertNodeNotContains
- this.AssertNodeContainsFields = RBS_BTS_AssertNodeContainsFields
- this.AssertNodeNotContainsFields = RBS_BTS_AssertNodeNotContainsFields
- this.AssertAAContainsSubset = RBS_BTS_AssertAAContainsSubset
- this.EqValues = RBS_BTS_EqValues
- this.EqAssocArrays = RBS_BTS_EqAssocArray
- this.EqArray = RBS_BTS_EqArray
- this.Stub = RBS_BTS_Stub
- this.Mock = RBS_BTS_Mock
- this.AssertMocks = RBS_BTS_AssertMocks
- this.CreateFake = RBS_BTS_CreateFake
- this.CombineFakes = RBS_BTS_CombineFakes
- this.MockFail = RBS_BTS_MockFail
- this.CleanMocks = RBS_BTS_CleanMocks
- this.CleanStubs = RBS_BTS_CleanStubs
- this.ExpectOnce = RBS_BTS_ExpectOnce
- this.ExpectNone = RBS_BTS_ExpectNone
- this.Expect = RBS_BTS_Expect
- this.ExpectOnceOrNone = RBS_BTS_ExpectOnceOrNone
- this.MockCallback0 = RBS_BTS_MockCallback0
- this.MockCallback1 = RBS_BTS_MockCallback1
- this.MockCallback2 = RBS_BTS_MockCallback2
- this.MockCallback3 = RBS_BTS_MockCallback3
- this.MockCallback4 = RBS_BTS_MockCallback4
- this.MockCallback5 = RBS_BTS_MockCallback5
- this.StubCallback0 = RBS_BTS_StubCallback0
- this.StubCallback1 = RBS_BTS_StubCallback1
- this.StubCallback2 = RBS_BTS_StubCallback2
- this.StubCallback3 = RBS_BTS_StubCallback3
- this.StubCallback4 = RBS_BTS_StubCallback4
- this.StubCallback5 = RBS_BTS_StubCallback5
- this.pathAsArray_ = RBS_BTS_rodash_pathsAsArray_
- this.g = RBS_BTS_rodash_get_
- return this
-end function
-sub RBS_BTS_AddTest(name, func,funcName, setup = invalid, teardown = invalid)
- m.testCases.Push(m.createTest(name, func, setup, teardown))
-end sub
-function RBS_BTS_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
-function RBS_BTS_Fail(msg = "Error" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- m.currentResult.AddResult(msg)
- return m.GetLegacyCompatibleReturnValue(false)
-end function
-function RBS_BTS_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
-function RBS_BTS_AssertFalse(expr , msg = "Expression evaluates to true" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if not RBS_CMN_IsBoolean(expr) or expr
- m.currentResult.AddResult(msg)
- return m.fail(msg)
- end if
- m.currentResult.AddResult("")
- return m.GetLegacyCompatibleReturnValue(true)
-end function
-function RBS_BTS_AssertTrue(expr , msg = "Expression evaluates to false" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if not RBS_CMN_IsBoolean(expr) or not expr then
- m.currentResult.AddResult(msg)
- return m.GetLegacyCompatibleReturnValue(false)
- end if
- m.currentResult.AddResult("")
- return m.GetLegacyCompatibleReturnValue(true)
-end function
-function RBS_BTS_AssertEqual(first , second , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if not m.eqValues(first, second)
- if msg = ""
- first_as_string = RBS_CMN_AsString(first)
- second_as_string = RBS_CMN_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
-function RBS_BTS_AssertLike(first , second , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if first <> second
- if msg = ""
- first_as_string = RBS_CMN_AsString(first)
- second_as_string = RBS_CMN_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
-function RBS_BTS_AssertNotEqual(first , second , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if m.eqValues(first, second)
- if msg = ""
- first_as_string = RBS_CMN_AsString(first)
- second_as_string = RBS_CMN_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
-function RBS_BTS_AssertInvalid(value , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if value <> invalid
- if msg = ""
- expr_as_string = RBS_CMN_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
-function RBS_BTS_AssertNotInvalid(value , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if value = invalid
- if msg = ""
- expr_as_string = RBS_CMN_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
-function RBS_BTS_AssertAAHasKey(array , key , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_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
-function RBS_BTS_AssertAANotHasKey(array , key , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_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
-function RBS_BTS_AssertAAHasKeys(array , keys , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(array) and RBS_CMN_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
-function RBS_BTS_AssertAANotHasKeys(array , keys , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(array) and RBS_CMN_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
-function RBS_BTS_AssertArrayContains(array , value , key = invalid , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(array) or RBS_CMN_IsArray(array)
- if not RBS_CMN_ArrayContains(array, value, key)
- msg = "Array doesn't have the '" + RBS_CMN_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
-function RBS_BTS_AssertArrayContainsAAs(array , values , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if not RBS_CMN_IsArray(values)
- msg = "values to search for are not an Array."
- m.currentResult.AddResult(msg)
- return m.GetLegacyCompatibleReturnValue(false)
- end if
- if RBS_CMN_IsArray(array)
- for each value in values
- isMatched = false
- if not RBS_CMN_IsAssociativeArray(value)
- msg = "Value to search for was not associativeArray "+ RBS_CMN_AsString(value)
- m.currentResult.AddResult(msg)
- return m.GetLegacyCompatibleReturnValue(false)
- end if
- for each item in array
- if (RBS_CMN_IsAssociativeArray(item))
- isValueMatched = true
- for each key in value
- fieldValue = value[key]
- itemValue = item[key]
- if (not m.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: "+ RBS_CMN_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
-function RBS_BTS_AssertArrayNotContains(array , value , key = invalid , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(array) or RBS_CMN_IsArray(array)
- if RBS_CMN_ArrayContains(array, value, key)
- msg = "Array has the '" + RBS_CMN_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
-function RBS_BTS_AssertArrayContainsSubset(array , subset , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if (RBS_CMN_IsAssociativeArray(array) and RBS_CMN_IsAssociativeArray(subset)) or (RBS_CMN_IsArray(array) and RBS_CMN_IsArray(subset))
- isAA = RBS_CMN_IsAssociativeArray(subset)
- for each item in subset
- key = invalid
- value = item
- if isAA
- key = item
- value = subset[key]
- end if
- if not RBS_CMN_ArrayContains(array, value, key)
- msg = "Array doesn't have the '" + RBS_CMN_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
-function RBS_BTS_AssertArrayNotContainsSubset(array , subset , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if (RBS_CMN_IsAssociativeArray(array) and RBS_CMN_IsAssociativeArray(subset)) or (RBS_CMN_IsArray(array) and RBS_CMN_IsArray(subset))
- isAA = RBS_CMN_IsAssociativeArray(subset)
- for each item in subset
- key = invalid
- value = item
- if isAA
- key = item
- value = item[key]
- end if
- if RBS_CMN_ArrayContains(array, value, key)
- msg = "Array has the '" + RBS_CMN_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
-function RBS_BTS_AssertArrayCount(array , count , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(array) or RBS_CMN_IsArray(array)
- if array.Count() <> count
- msg = "Array items count " + RBS_CMN_AsString(array.Count()) + " <> " + RBS_CMN_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
-function RBS_BTS_AssertArrayNotCount(array , count , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(array) or RBS_CMN_IsArray(array)
- if array.Count() = count
- msg = "Array items count = " + RBS_CMN_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
-function RBS_BTS_AssertEmpty(item , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(item) or RBS_CMN_IsArray(item)
- if item.Count() > 0
- msg = "Array is not empty."
- m.currentResult.AddResult(msg)
- return m.GetLegacyCompatibleReturnValue(false)
- end if
- else if (RBS_CMN_IsString(item))
- if (RBS_CMN_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
-function RBS_BTS_AssertNotEmpty(item , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if RBS_CMN_IsAssociativeArray(item) or RBS_CMN_IsArray(item)
- if item.Count() = 0
- msg = "Array is empty."
- m.currentResult.AddResult(msg)
- return m.GetLegacyCompatibleReturnValue(false)
- end if
- else if RBS_CMN_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
-function RBS_BTS_AssertArrayContainsOnlyValuesOfType(array , typeStr , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- 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 RBS_CMN_IsAssociativeArray(array) or RBS_CMN_IsArray(array)
- methodName = "RBS_CMN_Is" + typeStr
- typeCheckFunction = RBS_CMN_GetIsTypeFunction(methodName)
- if (typeCheckFunction <> invalid)
- for each item in array
- if not typeCheckFunction(item)
- msg = RBS_CMN_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
-function RBS_CMN_GetIsTypeFunction(name)
- if name = "RBS_CMN_IsFunction"
- return RBS_CMN_IsFunction
- else if name = "RBS_CMN_IsXmlElement"
- return RBS_CMN_IsXmlElement
- else if name = "RBS_CMN_IsInteger"
- return RBS_CMN_IsInteger
- else if name = "RBS_CMN_IsBoolean"
- return RBS_CMN_IsBoolean
- else if name = "RBS_CMN_IsFloat"
- return RBS_CMN_IsFloat
- else if name = "RBS_CMN_IsDouble"
- return RBS_CMN_IsDouble
- else if name = "RBS_CMN_IsLongInteger"
- return RBS_CMN_IsLongInteger
- else if name = "RBS_CMN_IsNumber"
- return RBS_CMN_IsNumber
- else if name = "RBS_CMN_IsList"
- return RBS_CMN_IsList
- else if name = "RBS_CMN_IsArray"
- return RBS_CMN_IsArray
- else if name = "RBS_CMN_IsAssociativeArray"
- return RBS_CMN_IsAssociativeArray
- else if name = "RBS_CMN_IsSGNode"
- return RBS_CMN_IsSGNode
- else if name = "RBS_CMN_IsString"
- return RBS_CMN_IsString
- else if name = "RBS_CMN_IsDateTime"
- return RBS_CMN_IsDateTime
- else if name = "RBS_CMN_IsUndefined"
- return RBS_CMN_IsUndefined
- else
- return invalid
- end if
-end function
-function RBS_BTS_AssertType(value , typeStr , msg ="" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if type(value) <> typeStr
- if msg = ""
- expr_as_string = RBS_CMN_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
-function RBS_BTS_AssertSubType(value , typeStr , msg ="" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if type(value) <> "roSGNode"
- if msg = ""
- expr_as_string = RBS_CMN_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 = RBS_CMN_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
-function RBS_BTS_EqValues(Value1 , Value2 ) as dynamic
- val1Type = type(Value1)
- val2Type = type(Value2)
- if val1Type = "" or val2Type = "" or val1Type = "" or val2Type = ""
- ? "ERROR!!!! - undefined value passed"
- return false
- end if
- if val1Type = "roString" or val1Type = "String"
- Value1 = RBS_CMN_AsString(Value1)
- else
- Value1 = box(Value1)
- end if
- if val2Type = "roString" or val2Type = "String"
- Value2 = RBS_CMN_AsString(Value2)
- else
- Value2 = box(Value2)
- end if
- val1Type = type(Value1)
- val2Type = type(Value2)
- if val1Type = "roFloat" and val2Type = "roInt"
- Value2 = box(Cdbl(Value2))
- else if val2Type = "roFloat" and val1Type = "roInt"
- Value1 = box(Cdbl(Value1))
- end if
- if val1Type <> val2Type
- return false
- else
- valtype = val1Type
- if valtype = "roList"
- return RBS_BTS_EqArray(Value1, Value2)
- else if valtype = "roAssociativeArray"
- return RBS_BTS_EqAssocArray(Value1, Value2)
- else if valtype = "roArray"
- return RBS_BTS_EqArray(Value1, Value2)
- else if (valtype = "roSGNode")
- if (val2Type <> "roSGNode")
- return false
- else
- return Value1.isSameNode(Value2)
- end if
- else
- return Value1 = Value2
- end if
- end if
-end function
-function RBS_BTS_EqAssocArray(Value1 , Value2 ) as dynamic
- l1 = Value1.Count()
- l2 = Value2.Count()
- if not l1 = l2
- return false
- else
- for each k in Value1
- if not Value2.DoesExist(k)
- return false
- else
- v1 = Value1[k]
- v2 = Value2[k]
- if not RBS_BTS_EqValues(v1, v2)
- return false
- end if
- end if
- end for
- return true
- end if
-end function
-function RBS_BTS_EqArray(Value1 , Value2 ) as dynamic
- if not (RBS_CMN_IsArray(Value1)) or not RBS_CMN_IsArray(Value2) then return false
- l1 = Value1.Count()
- l2 = Value2.Count()
- if not l1 = l2
- return false
- else
- for i = 0 to l1 - 1
- v1 = Value1[i]
- v2 = Value2[i]
- if not RBS_BTS_EqValues(v1, v2) then
- return false
- end if
- end for
- return true
- end if
-end function
-function RBS_BTS_AssertNodeCount(node , count , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if type(node) = "roSGNode"
- if node.getChildCount() <> count
- msg = "node items count <> " + RBS_CMN_AsString(count) + ". Received " + RBS_CMN_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
-function RBS_BTS_AssertNodeNotCount(node , count , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if type(node) = "roSGNode"
- if node.getChildCount() = count
- msg = "node items count = " + RBS_CMN_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
-function RBS_BTS_AssertNodeEmpty(node , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- 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
-function RBS_BTS_AssertNodeNotEmpty(node , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- 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
-function RBS_BTS_AssertNodeContains(node , value , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if type(node) = "roSGNode"
- if not RBS_CMN_NodeContains(node, value)
- msg = "Node doesn't have the '" + RBS_CMN_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
-function RBS_BTS_AssertNodeContainsOnly(node , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if type(node) = "roSGNode"
- if not RBS_CMN_NodeContains(node, value)
- msg = "Node doesn't have the '" + RBS_CMN_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
-function RBS_BTS_AssertNodeNotContains(node , value , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if type(node) = "roSGNode"
- if RBS_CMN_NodeContains(node, value)
- msg = "Node has the '" + RBS_CMN_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
-function RBS_BTS_AssertNodeContainsFields(node , subset , ignoredFields=invalid, msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if ( type(node) = "roSGNode" and RBS_CMN_IsAssociativeArray(subset)) or ( type(node) = "roSGNode" and RBS_CMN_IsArray(subset))
- isAA = RBS_CMN_IsAssociativeArray(subset)
- isIgnoredFields = RBS_CMN_IsArray(ignoredFields)
- for each key in subset
- if (key <> "")
- if (not isIgnoredFields or not RBS_CMN_ArrayContains(ignoredFields, key))
- subsetValue = subset[key]
- nodeValue = node[key]
- if not m.eqValues(nodeValue, subsetValue)
- msg = key + ": Expected '" + RBS_CMN_AsString(subsetValue) + "', got '" + RBS_CMN_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
-function RBS_BTS_AssertNodeNotContainsFields(node , subset , msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if ( type(node) = "roSGNode" and RBS_CMN_IsAssociativeArray(subset)) or ( type(node) = "roSGNode" and RBS_CMN_IsArray(subset))
- isAA = RBS_CMN_IsAssociativeArray(subset)
- for each item in subset
- key = invalid
- value = item
- if isAA
- key = item
- value = item[key]
- end if
- if RBS_CMN_NodeContains(node, value, key)
- msg = "Node has the '" + RBS_CMN_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
-function RBS_BTS_AssertAAContainsSubset(array , subset , ignoredFields = invalid, msg = "" ) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- if (RBS_CMN_IsAssociativeArray(array) and RBS_CMN_IsAssociativeArray(subset))
- isAA = RBS_CMN_IsAssociativeArray(subset)
- isIgnoredFields = RBS_CMN_IsArray(ignoredFields)
- for each key in subset
- if (key <> "")
- if (not isIgnoredFields or not RBS_CMN_ArrayContains(ignoredFields, key))
- subsetValue = subset[key]
- arrayValue = array[key]
- if not m.eqValues(arrayValue, subsetValue)
- msg = key + ": Expected '" + RBS_CMN_AsString(subsetValue) + "', got '" + RBS_CMN_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
-function RBS_BTS_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
-function RBS_BTS_ExpectOnce(target, methodName, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- return m.Mock(target, methodName, 1, expectedArgs, returnValue, allowNonExistingMethods)
-end function
-function RBS_BTS_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
-function RBS_BTS_ExpectNone(target, methodName, allowNonExistingMethods = false) as object
- return m.Mock(target, methodName, 0, invalid, invalid, allowNonExistingMethods)
-end function
-function RBS_BTS_Expect(target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- return m.Mock(target, methodName, expectedInvocations, expectedArgs, returnValue, allowNonExistingMethods)
-end function
-function RBS_BTS_Mock(target, methodName, expectedInvocations = 1, expectedArgs = invalid, returnValue = invalid, allowNonExistingMethods = false) as object
- if not RBS_CMN_IsAssociativeArray(target)
- m.Fail("mock args: target was not an AA")
- else if not RBS_CMN_IsString(methodName)
- m.Fail("mock args: methodName was not a string")
- else if not RBS_CMN_IsNumber(expectedInvocations)
- m.Fail("mock args: expectedInvocations was not an int")
- else if not RBS_CMN_IsArray(expectedArgs) and RBS_CMN_IsValid(expectedArgs)
- m.Fail("mock args: expectedArgs was not invalid or an array of args")
- else if RBS_CMN_IsUndefined(expectedArgs)
- m.Fail("mock args: expectedArgs undefined")
- end if
- if m.currentResult.isFail
- ? "ERROR: "; m.currentResult.messages[m.currentResult.currentAssertIndex - 1]
- 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
- 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
- exit for
- end if
- end for
- if fake = invalid
- m.__mockId++
- id = stri(m.__mockId).trim()
- if (m.__mockId > 6)
- ? "ERROR ONLY 6 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
-function RBS_BTS_CreateFake(id, target, methodName, expectedInvocations = 1, expectedArgs =invalid, returnValue=invalid ) as object
- expectedArgsValues = []
- hasArgs = RBS_CMN_IsArray(expectedArgs)
- if (hasArgs)
- defaultValue = m.invalidValue
- else
- defaultValue = m.ignoreValue
- expectedArgs = []
- end if
- for i = 0 to 9
- if (hasArgs and expectedArgs.count() > i)
- value = expectedArgs[i]
- if not RBS_CMN_IsUndefined(value)
- expectedArgsValues.push(expectedArgs[i])
- else
- expectedArgsValues.push("#ERR-UNDEFINED!")
- end if
- else
- expectedArgsValues.push(defaultValue)
- end if
- end for
- fake = {
- id : id,
- target: target,
- methodName: methodName,
- returnValue: returnValue,
- 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
- 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
-function RBS_BTS_CombineFakes(fake, otherFake)
- 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)
- 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.expectedInvocations++
-end function
-function RBS_BTS_AssertMocks() as void
- if (m.__mockId = invalid or not RBS_CMN_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(methodName, "Wrong number of calls. (" + stri(mock.invocations).trim() + " / " + stri(mock.expectedInvocations).trim() + ")")
- m.CleanMocks()
- return
- else if mock.expectedInvocations > 0 and (RBS_CMN_IsArray(mock.expectedArgs) or (type(mock.expectedArgs) = "roAssociativeArray" and RBS_CMN_IsArray(mock.expectedArgs.multiInvoke)))
- isMultiArgsSupported = type(mock.expectedArgs) = "roAssociativeArray" and RBS_CMN_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 = RBS_CMN_IsString(expected) and expected = m.invalidValue
- if (didNotExpectArg)
- expected = invalid
- end if
- if (not (RBS_CMN_IsString(expected) and expected = m.ignoreValue) and not m.eqValues(value, expected))
- if (expected = invalid)
- expected = "[INVALID]"
- end if
- m.MockFail(methodName, "on Invocation #" + stri(invocationIndex).trim() + ", expected arg #" + stri(i).trim() + " to be '" + RBS_CMN_AsString(expected) + "' got '" + RBS_CMN_AsString(value) + "')")
- m.CleanMocks()
- return
- end if
- end for
- end for
- end if
- end for
- m.CleanMocks()
-end function
-function RBS_BTS_CleanMocks() as void
- if m.mocks = invalid return
- for each id in m.mocks
- mock = m.mocks[id]
- mock.target.__mocks = invalid
- end for
- m.mocks = invalid
- end function
- function RBS_BTS_CleanStubs() as void
- if m.stubs = invalid return
- for each id in m.stubs
- stub = m.stubs[id]
- stub.target.__stubs = invalid
- end for
- m.stubs = invalid
- end function
- function RBS_BTS_MockFail(methodName, message) as dynamic
- if (m.currentResult.isFail) then return m.GetLegacyCompatibleReturnValue(false) ' skip test we already failed
- m.currentResult.AddResult("mock failure on '" + methodName + "' : " + message)
- return m.GetLegacyCompatibleReturnValue(false)
- end function
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_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
- function RBS_BTS_rodash_pathsAsArray_(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
- function RBS_BTS_rodash_get_(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 = tostr(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
-function RBS_CMN_IsXmlElement(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifXMLElement") <> invalid
-end function
-function RBS_CMN_IsFunction(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifFunction") <> invalid
-end function
-function RBS_CMN_GetFunction(filename, functionName) as object
- if (not RBS_CMN_IsNotEmptyString(functionName)) then return invalid
- if (not RBS_CMN_IsNotEmptyString(filename)) then return invalid
- mapFunction = RBSFM_getFunctionsForFile(filename)
- if mapFunction <> invalid
- map = mapFunction()
- if (type(map) ="roAssociativeArray")
- functionPointer = map[functionName]
- return functionPointer
- else
- return invalid
- end if
- end if
- return invalid
-end function
-function RBS_CMN_GetFunctionBruteForce(functionName) as object
- if (not RBS_CMN_IsNotEmptyString(functionName)) then return invalid
- filenames = RBSFM_getFilenames()
- for i = 0 to filenames.count() - 1
- filename = filenames[i]
- mapFunction = RBSFM_getFunctionsForFile(filename)
- if mapFunction <> invalid
- map = mapFunction()
- if (type(map) ="roAssociativeArray")
- functionPointer = map[functionName]
- if functionPointer <> invalid
- return functionPointer
- end if
- end if
- end if
- end for
- return invalid
-end function
-function RBS_CMN_IsBoolean(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifBoolean") <> invalid
-end function
-function RBS_CMN_IsInteger(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifInt") <> invalid and (Type(value) = "roInt" or Type(value) = "roInteger" or Type(value) = "Integer")
-end function
-function RBS_CMN_IsFloat(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifFloat") <> invalid
-end function
-function RBS_CMN_IsDouble(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifDouble") <> invalid
-end function
-function RBS_CMN_IsLongInteger(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifLongInt") <> invalid
-end function
-function RBS_CMN_IsNumber(value ) as boolean
- return RBS_CMN_IsLongInteger(value) or RBS_CMN_IsDouble(value) or RBS_CMN_IsInteger(value) or RBS_CMN_IsFloat(value)
-end function
-function RBS_CMN_IsList(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifList") <> invalid
-end function
-function RBS_CMN_IsArray(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifArray") <> invalid
-end function
-function RBS_CMN_IsAssociativeArray(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifAssociativeArray") <> invalid
-end function
-function RBS_CMN_IsSGNode(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifSGNodeChildren") <> invalid
-end function
-function RBS_CMN_IsString(value ) as boolean
- return RBS_CMN_IsValid(value) and GetInterface(value, "ifString") <> invalid
-end function
-function RBS_CMN_IsNotEmptyString(value ) as boolean
- return RBS_CMN_IsString(value) and len(value) > 0
-end function
-function RBS_CMN_IsDateTime(value ) as boolean
- return RBS_CMN_IsValid(value) and (GetInterface(value, "ifDateTime") <> invalid or Type(value) = "roDateTime")
-end function
-function RBS_CMN_IsValid(value ) as boolean
- return not RBS_CMN_IsUndefined(value) and value <> invalid
-end function
-function RBS_CMN_IsUndefined(value ) as boolean
- return type(value) = "" or Type(value) = ""
-end function
-function RBS_CMN_ValidStr(obj ) as string
- if obj <> invalid and GetInterface(obj, "ifString") <> invalid
- return obj
- else
- return ""
- end if
-end function
-function RBS_CMN_AsString(input ) as string
- if RBS_CMN_IsValid(input) = false
- return ""
- else if RBS_CMN_IsString(input)
- return input
- else if RBS_CMN_IsInteger(input) or RBS_CMN_IsLongInteger(input) or RBS_CMN_IsBoolean(input)
- return input.ToStr()
- else if RBS_CMN_IsFloat(input) or RBS_CMN_IsDouble(input)
- return Str(input).Trim()
- else if type(input) = "roSGNode"
- return "Node(" + input.subType() +")"
- else if type(input) = "roAssociativeArray"
- isFirst = true
- text = "{"
- if (not isFirst)
- text += ","
- isFirst = false
- end if
- for each key in input
- text += key + ":" + RBS_CMN_AsString(input[key])
- end for
- text += "}"
- return text
- else
- return ""
- end if
-end function
-function RBS_CMN_AsInteger(input ) as integer
- if RBS_CMN_IsValid(input) = false
- return 0
- else if RBS_CMN_IsString(input)
- return input.ToInt()
- else if RBS_CMN_IsInteger(input)
- return input
- else if RBS_CMN_IsFloat(input) or RBS_CMN_IsDouble(input) or RBS_CMN_IsLongInteger(input)
- return Int(input)
- else
- return 0
- end if
-end function
-function RBS_CMN_AsLongInteger(input ) as longinteger
- if RBS_CMN_IsValid(input) = false
- return 0
- else if RBS_CMN_IsString(input)
- return RBS_CMN_AsInteger(input)
- else if RBS_CMN_IsLongInteger(input) or RBS_CMN_IsFloat(input) or RBS_CMN_IsDouble(input) or RBS_CMN_IsInteger(input)
- return input
- else
- return 0
- end if
-end function
-function RBS_CMN_AsFloat(input ) as float
- if RBS_CMN_IsValid(input) = false
- return 0.0
- else if RBS_CMN_IsString(input)
- return input.ToFloat()
- else if RBS_CMN_IsInteger(input)
- return (input / 1)
- else if RBS_CMN_IsFloat(input) or RBS_CMN_IsDouble(input) or RBS_CMN_IsLongInteger(input)
- return input
- else
- return 0.0
- end if
-end function
-function RBS_CMN_AsDouble(input ) as double
- if RBS_CMN_IsValid(input) = false
- return 0.0
- else if RBS_CMN_IsString(input)
- return RBS_CMN_AsFloat(input)
- else if RBS_CMN_IsInteger(input) or RBS_CMN_IsLongInteger(input) or RBS_CMN_IsFloat(input) or RBS_CMN_IsDouble(input)
- return input
- else
- return 0.0
- end if
-end function
-function RBS_CMN_AsBoolean(input ) as boolean
- if RBS_CMN_IsValid(input) = false
- return false
- else if RBS_CMN_IsString(input)
- return LCase(input) = "true"
- else if RBS_CMN_IsInteger(input) or RBS_CMN_IsFloat(input)
- return input <> 0
- else if RBS_CMN_IsBoolean(input)
- return input
- else
- return false
- end if
-end function
-function RBS_CMN_AsArray(value ) as object
- if RBS_CMN_IsValid(value)
- if not RBS_CMN_IsArray(value)
- return [value]
- else
- return value
- end if
- end if
- return []
-end function
-function RBS_CMN_IsNullOrEmpty(value ) as boolean
- if RBS_CMN_IsString(value)
- return Len(value) = 0
- else
- return not RBS_CMN_IsValid(value)
- end if
-end function
-function RBS_CMN_FindElementIndexInArray(array , value , compareAttribute = invalid , caseSensitive = false ) as integer
- if RBS_CMN_IsArray(array)
- for i = 0 to RBS_CMN_AsArray(array).Count() - 1
- compareValue = array[i]
- if compareAttribute <> invalid and RBS_CMN_IsAssociativeArray(compareValue)
- compareValue = compareValue.LookupCI(compareAttribute)
- end if
- if RBS_BTS_EqValues(compareValue, value)
- return i
- end if
- item = array[i]
- next
- end if
- return -1
-end function
-function RBS_CMN_ArrayContains(array , value , compareAttribute = invalid ) as boolean
- return (RBS_CMN_FindElementIndexInArray(array, value, compareAttribute) > -1)
-end function
-function RBS_CMN_FindElementIndexInNode(node , value ) as integer
- if type(node) = "roSGNode"
- for i = 0 to node.getChildCount() - 1
- compareValue = node.getChild(i)
- if type(compareValue) = "roSGNode" and compareValue.isSameNode(value)
- return i
- end if
- next
- end if
- return -1
-end function
-function RBS_CMN_NodeContains(node , value ) as boolean
- return (RBS_CMN_FindElementIndexInNode(node, value) > -1)
-end function
-function RBS_ItG_GetTestCases(group) as object
- if (group.hasSoloTests = true)
- return group.soloTestCases
- else
- return group.testCases
- end if
-end function
-function RBS_ItG_GetRunnableTestSuite(group) as object
- testCases = RBS_ItG_GetTestCases(group)
- runnableSuite = 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 += " [SOLO] "
- end if
- testFunction = RBS_CMN_GetFunction(group.filename, testCase.funcName)
- runnableSuite.addTest(name, testFunction, testCase.funcName)
- group.testCaseLookup[name] = testCase
- end for
- runnableSuite.SetUp = RBS_CMN_GetFunction(group.filename, group.setupFunctionName)
- runnableSuite.TearDown = RBS_CMN_GetFunction(group.filename, group.teardownFunctionName)
- runnableSuite.BeforeEach = RBS_CMN_GetFunction(group.filename, group.beforeEachFunctionName)
- runnableSuite.AfterEach = RBS_CMN_GetFunction(group.filename, group.afterEachFunctionName)
- return runnableSuite
-end function
-function ItemGenerator(scheme as object) as object
- this = {}
- this.getItem = RBS_IG_GetItem
- this.getAssocArray = RBS_IG_GetAssocArray
- this.getArray = RBS_IG_GetArray
- this.getSimpleType = RBS_IG_GetSimpleType
- this.getInteger = RBS_IG_GetInteger
- this.getFloat = RBS_IG_GetFloat
- this.getString = RBS_IG_GetString
- this.getBoolean = RBS_IG_GetBoolean
- if not RBS_CMN_IsValid(scheme)
- return invalid
- end if
- return this.getItem(scheme)
-end function
-function RBS_IG_GetItem(scheme as object) as object
- item = invalid
- if RBS_CMN_IsAssociativeArray(scheme)
- item = m.getAssocArray(scheme)
- else if RBS_CMN_IsArray(scheme)
- item = m.getArray(scheme)
- else if RBS_CMN_IsString(scheme)
- item = m.getSimpleType(lCase(scheme))
- end if
- return item
-end function
-function RBS_IG_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
-function RBS_IG_GetArray(scheme as object) as object
- item = []
- for each key in scheme
- item.Push(m.getItem(key))
- end for
- return item
-end function
-function RBS_IG_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
-function RBS_IG_GetBoolean() as boolean
- return RBS_CMN_AsBoolean(Rnd(2) \ Rnd(2))
-end function
-function RBS_IG_GetInteger(seed = 100 as integer) as integer
- return Rnd(seed)
-end function
-function RBS_IG_GetFloat() as float
- return Rnd(0)
-end function
-function RBS_IG_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
-function UnitTestRuntimeConfig()
- this = {}
- this.CreateSuites = RBS_CreateSuites
- this.hasSoloSuites = false
- this.hasSoloGroups = false
- this.hasSoloTests = false
- this.suites = this.CreateSuites()
- return this
-end function
-function RBS_CreateSuites()
- 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
- includedSuites.Push(suite)
- else
- ? "ERROR! suite was not valid - ignoring"
- end if
- end for
- return includedSuites
-end function
-function RBS_STATS_CreateTotalStatistic() as object
- statTotalItem = {
- Suites : []
- Time : 0
- Total : 0
- Correct : 0
- Fail : 0
- Ignored : 0
- Crash : 0
- IgnoredTestNames: []
- }
- return statTotalItem
-end function
-function RBS_STATS_MergeTotalStatistic(stat1, stat2) as void
- for each suite in stat2.Suites
- stat1.Suites.push(suite)
- end for
- stat1.Time += stat2.Time
- stat1.Total += stat2.Total
- stat1.Correct += stat2.Correct
- stat1.Fail += stat2.Fail
- stat1.Crash += stat2.Crash
- stat1.Ignored += stat2.Ignored
- stat1.IgnoredTestNames.append(stat2.IgnoredTestNames)
-end function
-function RBS_STATS_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
-function RBS_STATS_CreateTestStatistic(name as string, result = "Success" as string, time = 0 as integer, errorCode = 0 as integer, errorMessage = "" as string) as object
- statTestItem = {
- Name : name
- Result : result
- Time : time
- Error : {
- Code : errorCode
- Message : errorMessage
- }
- }
- return statTestItem
-end function
-sub RBS_STATS_AppendTestStatistic(statSuiteObj as object, statTestObj as object)
- if RBS_CMN_IsAssociativeArray(statSuiteObj) and RBS_CMN_IsAssociativeArray(statTestObj)
- statSuiteObj.Tests.Push(statTestObj)
- if RBS_CMN_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
-sub RBS_STATS_AppendSuiteStatistic(statTotalObj as object, statSuiteObj as object)
- if RBS_CMN_IsAssociativeArray(statTotalObj) and RBS_CMN_IsAssociativeArray(statSuiteObj)
- statTotalObj.Suites.Push(statSuiteObj)
- statTotalObj.Time = statTotalObj.Time + statSuiteObj.Time
- if RBS_CMN_IsInteger(statSuiteObj.Total)
- statTotalObj.Total = statTotalObj.Total + statSuiteObj.Total
- end if
- if RBS_CMN_IsInteger(statSuiteObj.Correct)
- statTotalObj.Correct = statTotalObj.Correct + statSuiteObj.Correct
- end if
- if RBS_CMN_IsInteger(statSuiteObj.Fail)
- statTotalObj.Fail = statTotalObj.Fail + statSuiteObj.Fail
- end if
- if RBS_CMN_IsInteger(statSuiteObj.Crash)
- statTotalObj.Crash = statTotalObj.Crash + statSuiteObj.Crash
- end if
- end if
-end sub
-function UnitTestCase(name as string, func as dynamic, funcName as string, isSolo as boolean, isIgnored as boolean, lineNumber as integer, params = invalid, paramTestIndex =0, paramLineNumber = 0)
- this = {}
- this.isSolo = isSolo
- this.func = func
- this.funcName = funcName
- this.isIgnored = isIgnored
- this.name = name
- this.lineNumber = lineNumber
- this.paramLineNumber = paramLineNumber
- this.assertIndex = 0
- this.assertLineNumberMap = {}
- this.AddAssertLine = RBS_TC_AddAssertLine
- this.getTestLineIndex = 0
- this.rawParams = params
- this.paramTestIndex = paramTestIndex
- this.isParamTest = false
- this.time = 0
- if (params <> invalid)
- this.name += stri(this.paramTestIndex)
- end if
- return this
-end function
-function RBS_TC_AddAssertLine(lineNumber as integer)
- m.assertLineNumberMap[stri(m.assertIndex).trim()] = lineNumber
- m.assertIndex++
-end function
-function RBS_TC_GetAssertLine(testCase, index)
- if (testCase.assertLineNumberMap.doesExist(stri(index).trim()))
- return testCase.assertLineNumberMap[stri(index).trim()]
- else
- return testCase.lineNumber
- end if
-end function
-function Logger(config) as object
- this = {}
- this.config = config
- this.verbosityLevel = {
- basic : 0
- normal : 1
- verbose : 2
- }
- this.verbosity = this.config.logLevel
- this.PrintStatistic = RBS_LOGGER_PrintStatistic
- this.PrintMetaSuiteStart = RBS_LOGGER_PrintMetaSuiteStart
- this.PrintSuiteStatistic = RBS_LOGGER_PrintSuiteStatistic
- this.PrintTestStatistic = RBS_LOGGER_PrintTestStatistic
- this.PrintStart = RBS_LOGGER_PrintStart
- this.PrintEnd = RBS_LOGGER_PrintEnd
- this.PrintSuiteStart = RBS_LOGGER_PrintSuiteStart
- return this
-end function
-sub RBS_LOGGER_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()
- ? "Total = "; RBS_CMN_AsString(statObj.Total); " ; Passed = "; statObj.Correct; " ; Failed = "; statObj.Fail; " ; Ignored = "; statObj.Ignored
- ? " Time spent: "; statObj.Time; "ms"
- ? ""
- ? ""
- 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
-sub RBS_LOGGER_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
-sub RBS_LOGGER_PrintTestStatistic(testCase as object)
- metaTestCase = testCase.metaTestCase
- if (LCase(testCase.Result) <> "success")
- testChar = "-"
- assertIndex = metaTestCase.testResult.failedAssertIndex
- locationLine = StrI(RBS_TC_GetAssertLine(metaTestCase,assertIndex)).trim()
- else
- testChar = "|"
- locationLine = StrI(metaTestCase.lineNumber).trim()
- end if
- locationText = testCase.filePath.trim() + "(" + locationLine + ")"
- insetText = ""
- if (metaTestcase.isParamTest <> true)
- messageLine = RBS_LOGGER_FillText(" " + testChar + " |--" + metaTestCase.Name + " : ", ".", 80)
- ? messageLine ; testCase.Result ; " (" + stri(metaTestCase.time).trim() +"ms)"
- 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 = " "
- messageLine = RBS_LOGGER_FillText(" " + testChar + insetText + " |--" + formatJson(metaTestCase.rawParams) + " : ", ".", 80)
- ? messageLine ; testCase.Result ; " (" + stri(metaTestCase.time).trim() +"ms)"
- 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
-function RBS_LOGGER_FillText(text as string, fillChar = " ", numChars = 40) as string
- if (len(text) >= numChars)
- text = left(text, numChars - 5) + "..." + fillChar + fillChar
- else
- numToFill= numChars - len(text) -1
- for i = 0 to numToFill
- text += fillChar
- end for
- end if
- return text
-end function
-sub RBS_LOGGER_PrintStart()
- ? ""
- ? "[START TEST REPORT]"
- ? ""
-end sub
-sub RBS_LOGGER_PrintEnd()
- ? ""
- ? "[END TEST REPORT]"
- ? ""
-end sub
-sub RBS_LOGGER_PrintSuiteSetUp(sName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "================================================================="
- ? "=== SetUp "; sName; " suite."
- ? "================================================================="
- end if
-end sub
-sub RBS_LOGGER_PrintMetaSuiteStart(metaTestSuite)
- ? metaTestSuite.name; " (" ; metaTestSuite.filePath + "(1))"
-end sub
-sub RBS_LOGGER_PrintSuiteStart(sName as string)
- ? " |-" ; sName
-end sub
-sub RBS_LOGGER_PrintSuiteTearDown(sName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "================================================================="
- ? "=== TearDown "; sName; " suite."
- ? "================================================================="
- end if
-end sub
-sub RBS_LOGGER_PrintTestSetUp(tName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "----------------------------------------------------------------"
- ? "--- SetUp "; tName; " test."
- ? "----------------------------------------------------------------"
- end if
-end sub
-sub RBS_LOGGER_PrintTestTearDown(tName as string)
- if m.verbosity = m.verbosityLevel.verbose
- ? "----------------------------------------------------------------"
- ? "--- TearDown "; tName; " test."
- ? "----------------------------------------------------------------"
- end if
-end sub
-function UnitTestResult() as object
- this = {}
- this.messages = CreateObject("roArray", 0, true)
- this.isFail = false
- this.currentAssertIndex = 0
- this.failedAssertIndex = 0
- this.Reset = RBS_TRes_Reset
- this.AddResult = RBS_TRes_AddResult
- this.GetResult = RBS_TRes_GetResult
- return this
-end function
-function RBS_TRes_Reset() as void
- m.isFail = false
- m.messages = CreateObject("roArray", 0, true)
-end function
-function RBS_TRes_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
-function RBS_TRes_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
-function RBS_TR_TestRunner(args = {}) as object
- this = {}
- this.testScene = args.testScene
- this.nodeContext = args.nodeContext
- fs = CreateObject("roFileSystem")
- defaultConfig = {
- logLevel : 1,
- testsDirectory: "pkg:/source/Tests",
- testFilePrefix: "Test__",
- failFast: false,
- showOnlyFailures: false,
- maxLinesWithoutSuiteDirective: 100
- }
- rawConfig = invalid
- config = invalid
- if (args.testConfigPath <> invalid and fs.Exists(args.testConfigPath))
- ? "Loading test config from " ; args.testConfigPath
- rawConfig = ReadAsciiFile(args.testConfigPath)
- else if (fs.Exists("pkg:/source/tests/testconfig.json"))
- ? "Loading test config from default location : pkg:/source/tests/testconfig.json"
- rawConfig = ReadAsciiFile("pkg:/source/tests/testconfig.json")
- else
- ? "None of the testConfig.json locations existed"
- end if
- if (rawConfig <> invalid)
- config = ParseJson(rawConfig)
- end if
- if (config = invalid or not RBS_CMN_IsAssociativeArray(config) or RBS_CMN_IsNotEmptyString(config.rawtestsDirectory))
- ? "WARNING : specified config is invalid - using default"
- config = defaultConfig
- end if
- if (args.showOnlyFailures <> invalid)
- config.showOnlyFailures = args.showOnlyFailures = "true"
- end if
- if (args.failFast <> invalid)
- config.failFast = args.failFast = "true"
- end if
- this.testUtilsDecoratorMethodName = args.testUtilsDecoratorMethodName
- this.config = config
- this.config.testsDirectory = config.testsDirectory
- this.logger = Logger(this.config)
- this.global = args.global
- this.Run = RBS_TR_Run
- return this
-end function
-sub RBS_TR_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 = RBS_STATS_CreateTotalStatistic()
- m.runtimeConfig = 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
- 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)
- RBS_STATS_MergeTotalStatistic(totalStatObj, nodeStatResults)
- 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
- RBS_RT_RunItGroups(metaTestSuite, totalStatObj, m.testUtilsDecoratorMethodName, m.config, m.runtimeConfig, m.nodeContext)
- end if
- skipSuite:
- end for
- m.logger.PrintStatistic(totalStatObj)
- RBS_TR_SendHomeKeypress()
-end sub
-sub RBS_RT_RunItGroups(metaTestSuite, totalStatObj, testUtilsDecoratorMethodName, config, runtimeConfig, nodeContext = invalid)
- if (testUtilsDecoratorMethodName <> invalid)
- testUtilsDecorator = RBS_CMN_GetFunctionBruteForce(testUtilsDecoratorMethodName)
- if (not RBS_CMN_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 = RBS_ItG_GetRunnableTestSuite(itGroup)
- if (nodeContext <> invalid)
- testSuite.node = nodeContext
- testSuite.global = nodeContext.global
- testSuite.top = nodeContext.top
- end if
- if (RBS_CMN_IsFunction(testUtilsDecorator))
- testUtilsDecorator(testSuite)
- end if
- 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 += 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 += 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
- if RBS_CMN_IsFunction(testSuite.SetUp)
- testSuite.SetUp()
- end if
- RBS_RT_RunTestCases(metaTestSuite, itGroup, testSuite, totalStatObj, config, runtimeConfig)
- if RBS_CMN_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 RBS_RT_RunTestCases(metaTestSuite, itGroup, testSuite, totalStatObj, config, runtimeConfig)
- suiteStatObj = RBS_STATS_CreateSuiteStatistic(itGroup.Name)
- testSuite.global = runtimeConfig.global
- for each testCase in testSuite.testCases
- metaTestCase = itGroup.testCaseLookup[testCase.Name]
- if (runtimeConfig.hasSoloTests and not metaTestCase.isSolo)
- goto skipTestCase
- end if
- if RBS_CMN_IsFunction(testSuite.beforeEach)
- testSuite.beforeEach()
- end if
- testTimer = CreateObject("roTimespan")
- testCaseTimer = CreateObject("roTimespan")
- testStatObj = RBS_STATS_CreateTestStatistic(testCase.Name)
- testSuite.testCase = testCase.Func
- testStatObj.filePath = metaTestSuite.filePath
- testStatObj.metaTestCase = metaTestCase
- testSuite.currentResult = 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()
- 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])
- 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()
- RBS_STATS_AppendTestStatistic(suiteStatObj, testStatObj)
- if RBS_CMN_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
- RBS_STATS_AppendSuiteStatistic(totalStatObj, suiteStatObj)
-end sub
-sub RBS_TR_SendHomeKeypress()
- ut = CreateObject("roUrlTransfer")
- ut.SetUrl("http://localhost:8060/keypress/Home")
- ut.PostFromString("")
-end sub
-function Rooibos_RunNodeTests(args) as object
- ? " RUNNING NODE TESTS"
- totalStatObj = RBS_STATS_CreateTotalStatistic()
- RBS_RT_RunItGroups(args.metaTestSuite, totalStatObj, args.testUtilsDecoratorMethodName, args.config, args.runtimeConfig, m)
- return totalStatObj
-end function
-function Rooibos_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
\ No newline at end of file
diff --git a/tests/source/specs/GlobalsTests.brs b/tests/source/specs/GlobalsTests.brs
deleted file mode 100644
index 6c112694..00000000
--- a/tests/source/specs/GlobalsTests.brs
+++ /dev/null
@@ -1,20 +0,0 @@
-'@TestSuite [GLT] Globals Tests
-
-'@Setup
-function GLT_setup() as void
-
-end function
-
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-'@It tests the ability to use the globals getter/setter
-'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-'@Test Global Getter and Setter
-'@Params["this", "that"]
-'@Params["somenumber", 2342342]
-function GLT__SetGetGlobals(key, value) as void
- setGlobal(key, value)
- m.assertEqual(getGlobal(key), value)
-end function
-
diff --git a/tests/source/testconfig.json b/tests/source/testconfig.json
deleted file mode 100644
index f298413a..00000000
--- a/tests/source/testconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "logLevel": 4,
- "testsDirectory": "pkg:source/tests/specs",
- "failFast": false,
- "showOnlyFailures": false,
- "maxLinesWithoutSuiteDirective": 30,
- "supportLegacyTests": false
-}
\ No newline at end of file