diff --git a/.eslintrc.js b/.eslintrc.js
index d7257c074..d2a4b7f4d 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -209,5 +209,14 @@ module.exports = {
'@typescript-eslint/no-require-imports': 'off',
'@typescript-eslint/no-var-requires': 'off'
}
+ }, {
+ files: ['src/roku-types/data.json'],
+ rules: {
+ '@typescript-eslint/no-unused-expressions': 'off',
+ '@typescript-eslint/quotes': 'off',
+ 'no-template-curly-in-string': 'off',
+ 'eol-last': 'off',
+ '@typescript-eslint/semi': 'off'
+ }
}]
};
diff --git a/.github/workflows/create-vsix.yml b/.github/workflows/create-vsix.yml
index 4ac98de1a..28f671128 100644
--- a/.github/workflows/create-vsix.yml
+++ b/.github/workflows/create-vsix.yml
@@ -38,5 +38,5 @@ jobs:
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
- body: 'Hey there! I just built a new version of the vscode extension based on ${{ github.event.pull_request.head.sha }}. You can downloaded the .vsix [here](${{steps.create-vsix.outputs.workflow-url}}) and then follow [these installation instructions](https://github.com/rokucommunity/vscode-brightscript-language#pre-release-versions).'
+ body: 'Hey there! I just built a new version of the vscode extension based on ${{ github.event.pull_request.head.sha }}. You can download the .vsix [here](${{steps.create-vsix.outputs.workflow-url}}) and then follow [these installation instructions](https://github.com/rokucommunity/vscode-brightscript-language#pre-release-versions).'
})
diff --git a/.vscode/launch.json b/.vscode/launch.json
index 10af662de..ba2f23675 100644
--- a/.vscode/launch.json
+++ b/.vscode/launch.json
@@ -41,11 +41,32 @@
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
"!**/node_modules/typescript/**",
- "!**/node_modules/vscode-languageserver/**"
+ "!**/node_modules/vscode-languageserver*/**"
]
},
{
"name": "Debug Doc Generator",
+ "type": "pwa-node",
+ "request": "launch",
+ "args": [
+ "scripts/compile-doc-examples.ts"
+ ],
+ "runtimeArgs": [
+ "--nolazy",
+ "-r",
+ "ts-node/register"
+ ],
+ "sourceMaps": true,
+ "cwd": "${workspaceRoot}",
+ "protocol": "inspector",
+ "resolveSourceMapLocations": [
+ "${workspaceFolder}/**",
+ "!**/node_modules/typescript/**",
+ "!**/node_modules/vscode-languageserver/**"
+ ]
+ },
+ {
+ "name": "Debug Roku Docs Scraper",
"type": "node",
"request": "launch",
"runtimeExecutable": "node",
@@ -55,7 +76,7 @@
"ts-node/register/transpile-only"
],
"args": [
- "scripts/compile-doc-examples.ts"
+ "scripts/scrape-roku-docs.ts"
],
"cwd": "${workspaceRoot}",
"internalConsoleOptions": "openOnSessionStart",
@@ -65,4 +86,4 @@
]
}
]
-}
\ No newline at end of file
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index f6db1ff14..e922f5628 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -23,7 +23,10 @@
"presentation": {
"group": "watch"
},
- "problemMatcher": []
+ "isBackground": true,
+ "problemMatcher": [
+ "$tsc-watch"
+ ]
},
{
"type": "npm",
@@ -41,10 +44,28 @@
"test:nocover",
"--silent"
],
+ "presentation": {
+ "echo": true,
+ "reveal": "always",
+ "focus": true,
+ "panel": "shared",
+ "showReuseMessage": true,
+ "clear": true
+ },
"group": {
"kind": "test",
"isDefault": true
},
+ "problemMatcher": []
+ },
+ {
+ "label": "scrape-roku-docs",
+ "type": "shell",
+ "command": "npm",
+ "args": [
+ "run",
+ "scrape-roku-docs"
+ ],
"presentation": {
"echo": true,
"reveal": "always",
@@ -56,4 +77,4 @@
"problemMatcher": []
}
]
-}
\ No newline at end of file
+}
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5ed642e16..7815a97be 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,133 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
+## [0.47.3](https://github.com/rokucommunity/brighterscript/compare/v0.47.2...v0.47.3) - 2022-04-08
+### Fixed
+ - accuracy issues when parsing the manifest ([#565](https://github.com/rokucommunity/brighterscript/pull/565))
+
+
+
+## [0.47.2](https://github.com/rokucommunity/brighterscript/compare/v0.47.1...v0.47.2) - 2022-04-07
+### Fixed
+ - enum transpile bug for binary expressions ([#559](https://github.com/rokucommunity/brighterscript/pull/559))
+ - add missing `require` entry to `bsconfig.schema.json` ([#560](https://github.com/rokucommunity/brighterscript/pull/560))
+
+
+
+## [0.47.1](https://github.com/rokucommunity/brighterscript/compare/v0.47.0...v0.47.1) - 2022-04-05
+### Changed
+ - disable strict cli args to empower plugins ([#557](https://github.com/rokucommunity/brighterscript/pull/557))
+ - don't add trailing commas in transpiled output for array and aa literals ([#556](https://github.com/rokucommunity/brighterscript/pull/556))
+ - retain quote char when transpiling xml attributes ([#552](https://github.com/rokucommunity/brighterscript/pull/552))
+
+
+
+## [0.47.0](https://github.com/rokucommunity/brighterscript/compare/v0.46.0...v0.47.0) - 2022-03-30
+### Added
+ - `require` flag to allow loading external node modules as part of the build process (useful for things like `ts-node/register`). ([#550](https://github.com/rokucommunity/brighterscript/pull/550), [#551](https://github.com/rokucommunity/brighterscript/pull/551))
+
+
+
+## [0.46.0](https://github.com/rokucommunity/brighterscript/compare/v0.45.6...v0.46.0) - 2022-03-24
+### Changed
+ - refactored try-catch statement to make the expressions and bodies easier to access via plugins. [#514](https://github.com/rokucommunity/brighterscript/pull/514)
+
+
+
+## [0.45.6](https://github.com/rokucommunity/brighterscript/compare/v0.45.5...v0.45.6) - 2022-03-17
+### Changed
+ - upgrade to [roku-deploy@3.5.4](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#354---2022-03-17) which fixed significant performance issues during globbing. ([roku-deploy#86](https://github.com/rokucommunity/roku-deploy/pull/86))
+### Fixed
+ - crash when checking for enums to transpile [#539](https://github.com/rokucommunity/brighterscript/pull/539)
+ - Transpile if statements as written [#537](https://github.com/rokucommunity/brighterscript/pull/537)
+ - Keep the original type case when transpiling. [#536](https://github.com/rokucommunity/brighterscript/pull/536)
+ - Show cli usage in plugins documentation
+
+
+
+## [0.45.5](https://github.com/rokucommunity/brighterscript/compare/v0.45.4...v0.45.5) - 2022-03-10
+### Fixed
+ - bug with typedefs and auto-generated class constructor functions [#535](https://github.com/rokucommunity/brighterscript/pull/535)
+
+
+
+## [0.45.4](https://github.com/rokucommunity/brighterscript/compare/v0.45.3...v0.45.4) - 2022-03-08
+### Fixed
+ - bug that wasn't computing ownScriptImports after calling `invalidateReferences()` [#529](https://github.com/rokucommunity/brighterscript/pull/529)
+ - bug with logger.time() not having accurate timings when run asynchronously [#532](https://github.com/rokucommunity/brighterscript/pull/532)
+
+
+
+## [0.45.3](https://github.com/rokucommunity/brighterscript/compare/v0.45.2...v0.45.3) - 2022-02-25
+### Fixed
+ - source map bug with plugins that used the AST node creation functions depending on `interpolatedRange`. [#528](https://github.com/rokucommunity/brighterscript/pull/528)
+
+
+
+## [0.45.2](https://github.com/rokucommunity/brighterscript/compare/v0.45.1...v0.45.2) - 2022-02-24
+### Changed
+ - add default token values in creators. [#520](https://github.com/rokucommunity/brighterscript/pull/520)
+### Fixed
+ - significant memory leak [#527](https://github.com/rokucommunity/brighterscript/pull/527)
+ - bug with transpiling empty for loop [#519](https://github.com/rokucommunity/brighterscript/pull/519)
+
+
+
+## [0.45.1](https://github.com/rokucommunity/brighterscript/compare/v0.45.0...v0.45.1) - 2022-02-16
+### Changed
+ - upgrade to [roku-deploy@3.5.3](https://github.com/rokucommunity/roku-deploy/blob/master/CHANGELOG.md#353---2022-02-16) which fixed a missing typescript definition issue.
+
+
+
+## [0.45.0](https://github.com/rokucommunity/brighterscript/compare/v0.44.0...v0.45.0) - 2022-02-11
+### Added
+ - `enum` language feature ([#484](https://github.com/rokucommunity/brighterscript/pull/484))
+ - transpile override for plugins when providing AST edits. ([#511](https://github.com/rokucommunity/brighterscript/pull/511))
+ - `setFile` method to align with v1. ([#510](https://github.com/rokucommunity/brighterscript/pull/510))
+### Changed
+ - deprecated `addOrReplaceFile` method to align with v1. ([#510](https://github.com/rokucommunity/brighterscript/pull/510))
+ - internal `Cache` method now extends `Map` instead of keeping an internal map. ([#509](https://github.com/rokucommunity/brighterscript/pull/509))
+
+
+
+## [0.44.0](https://github.com/rokucommunity/brighterscript/compare/v0.43.1...v0.44.0) - 2022-02-08
+### Added
+ - `onScopeValidate` plugin event useful when plugins want to contribute scope validations ([#505](https://github.com/rokucommunity/brighterscript/pull/505))
+### Changed
+ - show plugin transpile modifications in the `getTranspiledFile` callback (used for "show preview" functionality in vscode) ([#502](https://github.com/rokucommunity/brighterscript/pull/502))
+ - make `Program.getFile` more flexible, and deprecate `Program.getFileByPkgPath`, `Program.getFileByPathAbsolute` ([#506](https://github.com/rokucommunity/brighterscript/pull/506))
+ - add `Program.getFiles` and deprecate `Program.getFilesByPkgPath` ([#506](https://github.com/rokucommunity/brighterscript/pull/506))
+ - move file validation plugin event emitting into `Program.validate()` which means you can't trigger those events by calling `File.validate()` anymore. ([#504](https://github.com/rokucommunity/brighterscript/pull/504))
+ - support generics for `Cache` class ([#503](https://github.com/rokucommunity/brighterscript/pull/503))
+### Fixed
+ - bug in hover showing required params as optional and optional params as required ([#501](https://github.com/rokucommunity/brighterscript/pull/501))
+
+
+
+## [0.43.1](https://github.com/rokucommunity/brighterscript/compare/v0.43.0...v0.43.1) - 2022-01-28
+### Fixed
+ - crash when hovering over global functions ([#497](https://github.com/rokucommunity/brighterscript/pull/497))
+
+
+
+## [0.43.0](https://github.com/rokucommunity/brighterscript/compare/v0.42.0...v0.43.0) - 2022-01-28
+### Added
+ - show function documentation when hovering over functions. ([#495](https://github.com/rokucommunity/brighterscript/pull/495))
+ - for plugin authors:
+ - added `beforeFileValidate` and `onFileValidate` plugin hooks ([#490](https://github.com/rokucommunity/brighterscript/pull/490))
+ - added `expressions` collection to `BrsFile.parser.references` which includes all the full expressions, which can be used instead of AST walking in many cases. ([#487](https://github.com/rokucommunity/brighterscript/pull/487))
+### Changed
+ - For plugin authors:
+ - move parse and validate events to `Program` class and out of `XmlFile` and `BrsFile`. This only impacts plugins that depend on the `afterFileParse`, `onFileValidate` and `afterFileValidate` events while also constructing those files with their constructors directly. ([#494](https://github.com/rokucommunity/brighterscript/pull/494))
+ - removed internal [barrels](https://github.com/basarat/typescript-book/blob/master/docs/tips/barrel.md). This means plugins can no longer do things like: `import { something} from 'brighterscript/some-path'`. All necessary exports can be done from the top-level brighterscript package directly. ([#492](https://github.com/rokucommunity/brighterscript/pull/492))
+ - use `Map` for `ClassValidator` class lookup instead of an object. ([#481](https://github.com/rokucommunity/brighterscript/pull/481))
+
+
+
+### Fixed
+ - bug preventing code to come after an interface statement. ([#493](https://github.com/rokucommunity/brighterscript/pull/493))
+ - don't crash on null options in `printDiagnostics`. ([3147202](https://github.com/rokucommunity/brighterscript/commit/3147202b948d08be198255c068f082857c9de1f0))
+
## [0.42.0](https://github.com/rokucommunity/brighterscript/compare/v0.41.6...v0.42.0) - 2022-01-10
### Added
- AST editing utility for transformations during between the begin and end transpile lifecycle events. See [the documentation](https://github.com/rokucommunity/brighterscript/blob/master/docs/plugins.md#modifying-code) for more info. ([#478](https://github.com/rokucommunity/brighterscript/pull/478))
diff --git a/README.md b/README.md
index 8d7fb8f43..5d8504050 100644
--- a/README.md
+++ b/README.md
@@ -2,10 +2,12 @@
A superset of Roku's BrightScript language. Compiles to standard BrightScript.
-[![build](https://img.shields.io/github/workflow/status/rokucommunity/brighterscript/build.svg?logo=github)](https://github.com/rokucommunity/brighterscript/actions?query=workflow%3Abuild)
-[![Coverage Status](https://coveralls.io/repos/github/rokucommunity/brighterscript/badge.svg?branch=master)](https://coveralls.io/github/rokucommunity/brighterscript?branch=master)
-[![NPM Version](https://badge.fury.io/js/brighterscript.svg?style=flat)](https://npmjs.org/package/brighterscript)
-
+[![build status](https://img.shields.io/github/workflow/status/rokucommunity/brighterscript/build.svg?logo=github)](https://github.com/rokucommunity/brighterscript/actions?query=workflow%3Abuild)
+[![coverage status](https://img.shields.io/coveralls/github/rokucommunity/brighterscript?logo=coveralls)](https://coveralls.io/github/rokucommunity/brighterscript?branch=master)
+[![monthly downloads](https://img.shields.io/npm/dm/brighterscript.svg?sanitize=true&logo=npm&logoColor=)](https://npmcharts.com/compare/brighterscript?minimal=true)
+[![npm version](https://img.shields.io/npm/v/brighterscript.svg?logo=npm)](https://www.npmjs.com/package/brighterscript)
+[![license](https://img.shields.io/npm/l/brighterscript.svg)](LICENSE)
+[![Slack](https://img.shields.io/badge/Slack-RokuCommunity-4A154B?logo=slack)](https://join.slack.com/t/rokudevelopers/shared_invite/zt-4vw7rg6v-NH46oY7hTktpRIBM_zGvwA)
## Overview
@@ -59,12 +61,27 @@ BrighterScript adds several new features to the BrightScript language such as Na
- And if it's not enough, the [plugin API](https://github.com/rokucommunity/brighterscript/blob/master/docs/plugins.md) allows extending the compiler to provide extra diagnostics or transformations.
## Who uses Brighterscript?
-
-Brighterscript is used by [applicaster](https://www.applicaster.com/), [The miracle channel](https://miraclechannel.ca/corco/), and in open source projects such as [rooibos](https://github.com/georgejecook/rooibos/blob/master/docs/index.md), the [maestro framework](https://github.com/georgejecook/maestro/blob/master/docs/index.md), and more.
-
-The BrighterScript project is used to power the popular [Brightscript Language](https://marketplace.visualstudio.com/items?itemName=rokucommunity.brightscript) VSCode extension, and other tools.
-
-More projects are adopting BrighterScript all the time, from using the new BrighterScript language features to simply using the compiler as part of their build pipeline. Be sure to watch this space!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+The BrighterScript project is used to power the popular [Brightscript Language](https://marketplace.visualstudio.com/items?itemName=rokucommunity.brightscript) VSCode extension, the [maestro framework](https://github.com/georgejecook/maestro/blob/master/docs/index.md), and more.
+
+[Contact us](https://github.com/rokucommunity/brighterscript/issues/new) if you use BrighterScript on your project and would like your logo listed above. More projects are adopting BrighterScript all the time, from using the new BrighterScript language features to simply using the compiler in their build pipeline.
## What's with the name?
The name BrighterScript is a compliment to everything that is great about Roku's awesome BrightScript language. Naming things is hard, and discoverability and recognizability are both very important. Here are the reasons we chose this name:
@@ -226,6 +243,8 @@ These are the options available in the `bsconfig.json` file.
- **plugins**: `Array` - List of node scripts or npm modules to load as plugins to the BrighterScript compiler.
+ - **require**: `Array` - List of node scripts or npm modules to load during the startup sequence. Useful for running things like `ts-node/require`
+
## Ignore errors and warnings on a per-line basis
In addition to disabling an entire class of errors in `bsconfig.json` by using `ignoreErrorCodes`, you may also disable errors for a subset of the complier rules within a file with the following comment flags:
- `bs:disable-next-line`
diff --git a/benchmarks/index.js b/benchmarks/index.js
index 76fdd0d77..cbeb66a91 100644
--- a/benchmarks/index.js
+++ b/benchmarks/index.js
@@ -6,6 +6,8 @@ const yargs = require('yargs');
const readline = require('readline');
const rimraf = require('rimraf');
const glob = require('glob');
+let nodeParams = ['--max-old-space-size=8192'];
+const tempDir = path.join(__dirname, '.tmp');
class Runner {
constructor(options) {
@@ -15,6 +17,7 @@ class Runner {
this.project = options.project;
this.quick = options.quick;
this.profile = options.profile;
+ this.tar = options.tar;
}
run() {
this.downloadFiles();
@@ -29,7 +32,6 @@ class Runner {
* Download the necessary files
*/
downloadFiles() {
- const tempDir = path.join(__dirname, '.tmp');
//ensure the `.tmp` folder exists
fsExtra.ensureDirSync(tempDir);
@@ -57,15 +59,28 @@ class Runner {
}
}
- buildCurrentTarball() {
+ buildCurrent() {
const bscDir = path.resolve(__dirname, '..');
console.log('benchmark: build current brighterscript');
this.npmSync(['run', 'build'], {
cwd: bscDir
});
+ return 'file:' + path.resolve(bscDir);
+ }
+
+ buildCurrentTarball() {
+ const bscDir = path.resolve(__dirname, '..');
+ this.buildCurrent();
console.log('benchmark: pack current brighterscript');
+ //pack the package
const filename = this.npmSync(['pack'], { cwd: bscDir, stdio: 'pipe' }).stdout.toString().trim();
- return path.resolve(bscDir, filename);
+
+ //move the tarball to temp to declutter the outer project
+ let newFilename = path.join(tempDir, path.basename(filename).replace('.tgz', `${Date.now()}.tgz`));
+ fsExtra.renameSync(filename, newFilename);
+
+ //return path to the tarball
+ return path.resolve(newFilename);
}
/**
@@ -79,13 +94,15 @@ class Runner {
fsExtra.emptyDirSync(nodeModulesDir);
const dependencies = {};
+ console.log(`benchmark: using versions: ${this.versions}`);
for (let i = 0; i < this.versions.length; i++) {
const version = this.versions[i];
const name = `brighterscript${i + 1}`;
//if the version is "current", then make a local copy of the package from the dist folder to install (because npm link makes things slower)
if (version === 'local') {
- dependencies[name] = this.buildCurrentTarball();
+ const localVersion = this.tar ? this.buildCurrentTarball() : this.buildCurrent();
+ dependencies[name] = localVersion;
} else {
dependencies[name] = `npm:brighterscript@${version}`;
}
@@ -140,7 +157,7 @@ class Runner {
cwd: __dirname
});
- execSync(`node ${this.profile ? '--prof ' : ''}target-runner.js "${version}" "${maxVersionLength}" "${target}" "${maxTargetLength}" "${alias}" "${this.project}" "${this.quick}"`, {
+ execSync(`node ${nodeParams.join(' ')} ${this.profile ? '--prof ' : ''}target-runner.js "${version}" "${maxVersionLength}" "${target}" "${maxTargetLength}" "${alias}" "${this.project}" "${this.quick}"`, {
cwd: path.join(__dirname),
stdio: 'inherit'
});
@@ -202,6 +219,11 @@ let options = yargs
description: 'Enable nodejs profiling of each benchmark run',
default: false
})
+ .option('tar', {
+ type: 'boolean',
+ description: 'use a npm-packed tarball for local files instead of using the files directly',
+ default: true
+ })
.strict()
.check(argv => {
const idx = argv.versions.indexOf('latest');
diff --git a/benchmarks/targets/parse-brs.js b/benchmarks/targets/parse-brs.js
index 24a0dffc9..1b6c75f74 100644
--- a/benchmarks/targets/parse-brs.js
+++ b/benchmarks/targets/parse-brs.js
@@ -19,9 +19,10 @@ module.exports = async (suite, name, brighterscript, projectPath, options) => {
}
suite.add(name, (deferred) => {
const promises = [];
+ const setFileFuncName = builder.program.setFile ? 'setFile' : 'addOrReplaceFile';
for (const file of files) {
promises.push(
- builder.program.addOrReplaceFile(file.pkgPath, file.fileContents)
+ builder.program[setFileFuncName](file.pkgPath, file.fileContents)
);
}
// eslint-disable-next-line @typescript-eslint/no-floating-promises
diff --git a/bsconfig.schema.json b/bsconfig.schema.json
index 41f659abe..d20d555c1 100644
--- a/bsconfig.schema.json
+++ b/bsconfig.schema.json
@@ -188,6 +188,18 @@
]
}
},
+ "require": {
+ "description": "A list of scripts or modules to pass to node's `require()` on startup. This is useful for doing things like ts-node registration",
+ "type": "array",
+ "items": {
+ "anyOf": [
+ {
+ "type": "string",
+ "description": "a path to a node script or an npm module to load dynamically at startup."
+ }
+ ]
+ }
+ },
"autoImportComponentScript": {
"description": "When enabled, every xml component will search for a .bs or .brs file with the same name in the same folder, and add it as a script import if found. Disabled by default",
"type": "boolean",
diff --git a/docs/enums.md b/docs/enums.md
new file mode 100644
index 000000000..4c06416d1
--- /dev/null
+++ b/docs/enums.md
@@ -0,0 +1,150 @@
+# Enums
+
+BrighterScript Enums are a way to define a set of named constants, sharing many similarities to their implementations in other languages such as [TypeScript](https://www.typescriptlang.org/docs/handbook/enums.html) and [C#](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/enum).
+
+## Enums at runtime
+Enums do not exist at runtime. Instead, the literal values are inserted into the code. See the next section for an example.
+
+## Numeric enums
+The most common type of enum is the numeric enum.
+```BrighterScript
+enum Direction
+ up
+ down
+ left
+ right
+end enum
+sub main()
+ print Direction.up
+ print Direction.down
+ print Direction.left
+ print Direction.right
+end sub
+```
+
+transpiles to
+
+```BrightScript
+sub main()
+ print 0
+ print 1
+ print 2
+ print 3
+end sub
+```
+
+Notice how the enum completely disappears from the output code? That's because enums only exist at compile-time. At runtime, their literal values are injected into their reference locations.
+
+By default, enums are type `integer`, and start with the initial value of zero, increasing by one for each enum member. You can also use initializers to set the values of the enum.
+
+```brighterscript
+enum Direction
+ up = 5
+ down
+ left = 10
+ right
+end enum
+sub main()
+ print Direction.up
+ print Direction.down
+ print Direction.left
+ print Direction.right
+end sub
+```
+
+transpiles to
+
+```BrightScript
+sub main()
+ print 5
+ print 6
+ print 10
+ print 11
+end sub
+```
+
+In this scenario, `Direction.down` is given the next whole number after its previous member. Same with `Direction.right`.
+
+## String enums
+String enums are similar to numeric enums, except that each member must be given an explicit value.
+
+```brighterscript
+enum Direction
+ up = "up"
+ down = "down"
+ left = "left"
+ right = "right"
+end enum
+sub main()
+ print Direction.up
+ print Direction.down
+ print Direction.left
+ print Direction.right
+end sub
+```
+
+transpiles to
+
+```BrightScript
+sub main()
+ print "up"
+ print "down"
+ print "left"
+ print "right"
+end sub
+```
+
+## Hex Integer enums
+Since hex integers are treated as normal integers at runtime, you can mix and match hex integers and regular integers in enums. The numeric value of a hex integer will be considered when incrementing the next enum member value as well.
+```brighterscript
+enum Colors
+ lessRed = 254
+ red = &HFF ' this is 255
+ moreRed
+end enum
+sub main()
+ print Colors.lessRed
+ print Colors.red
+ print Colors.moreRed
+end sub
+```
+
+transpiles to
+
+```brightscript
+sub main()
+ print 254
+ print &HFF
+ print 256
+end sub
+```
+Notice how `Colors.moreRed` is one number higher than the 255 used in `Colors.red`?
+
+## Other enum types
+You define an enum using any numeric or string literal values. Here are some other examples:
+```vb
+enum Floats
+ value = 1.2
+end enum
+
+enum Doubles
+ value = 2.3#
+end enum
+
+enum LongInteger
+ value = 9876543210&
+end enum
+```
+
+
+## Enum members must all be the same type
+Due to the BrightScript strict runtime type system, you cannot mix and match different enum member types, because the most common use case for enums is to compare one value to another, which might result in a runtime error when comparing string and float for example.
+```vb
+enum Direction
+ up = "up"
+ down = 2 'this is an error
+end enum
+sub main()
+ print Direction.up = Direction.down ' runtime error: Type Mismatch. Operator "=" can't be applied to "String" and "Integer".
+end sub
+```
diff --git a/docs/plugins.md b/docs/plugins.md
index 0877915e1..120fd284a 100644
--- a/docs/plugins.md
+++ b/docs/plugins.md
@@ -21,6 +21,11 @@ Those plugins will be loaded by the VSCode extension and can provide live diagno
}
```
+### Usage on the CLI
+```bash
+npx bsc --plugins "./scripts/myPlugin.js" "@rokucommunity/bslint"
+```
+
### Programmatic configuration
When using the compiler API directly, plugins can directly reference your code:
@@ -45,10 +50,14 @@ Full compiler lifecycle:
- `beforeFileParse`
- `afterFileParse`
- `afterScopeCreate` (component scope)
- - `afterFileValidate`
- `beforeProgramValidate`
+ - For each file:
+ - `beforeFileValidate`
+ - `onFileValidate`
+ - `afterFileValidate`
- For each scope:
- `beforeScopeValidate`
+ - `onScopeValidate`
- `afterScopeValidate`
- `afterProgramValidate`
- `beforePrepublish`
@@ -178,9 +187,30 @@ To walk/modify the AST, a number of helpers are provided in `brighterscript/dist
It is highly recommended to use TypeScript as intellisense helps greatly writing code against new APIs.
+### Using ts-node to transpile plugin dynamically
+The ts-node module can transpile typescript on the fly. This is by far the easiest way to develop a brighterscript plugin, as you can elimintate the manual typescript transpile step.
+
+```bash
+# install modules needed to compile a plugin
+npm install brighterscript typescript @types/node ts-node -D
+
+#run the brighterscript cli and use ts-node to dynamically transpile your plugin
+npx bsc --sourceMap --require ts-node/register --plugins myPlugin.ts
+```
+
+The `require` flag can also be set in the `bsconfig.json`, simplifying your bsc command arguments.
+```javascript
+{
+ "require": ["ts-node/register"]
+}
+```
+
+### Transpiling manually
+If you would prefer to transpile your plugin manually, you can follow these steps:
+
```bash
# install modules needed to compile a plugin
-npm install brighterscript typescript @types/node
+npm install brighterscript typescript @types/node -D
# transpile to JS (with source maps for debugging)
npx tsc myPlugin.ts -m commonjs --sourceMap
@@ -189,6 +219,7 @@ npx tsc myPlugin.ts -m commonjs --sourceMap
npx tsc myPlugin.ts -m commonjs --sourceMap --watch
```
+
### Example diagnostic plugins
Diagnostics must run every time it is relevant:
@@ -199,30 +230,28 @@ Diagnostics must run every time it is relevant:
Note: in a language-server context, Scope validation happens every time a file changes.
```typescript
-// myDiagnosticPlugin.ts
-import { CompilerPlugin, BrsFile, XmlFile } from 'brighterscript';
-import { isBrsFile } from 'brighterscript/dist/parser/ASTUtils';
+// bsc-plugin-no-underscores.ts
+import { CompilerPlugin, BscFile, isBrsFile } from 'brighterscript';
// plugin factory
export default function () {
return {
- name: 'myDiagnosticPlugin',
+ name: 'no-underscores',
// post-parsing validation
afterFileValidate: (file: BscFile) => {
- if (!isBrsFile(file)) {
- return;
+ if (isBrsFile(file)) {
+ // visit function statements and validate their name
+ file.parser.references.functionStatements.forEach((fun) => {
+ if (fun.name.text.includes('_')) {
+ file.addDiagnostics([{
+ code: 9000,
+ message: 'Do not use underscores in function names',
+ range: fun.name.range,
+ file
+ }]);
+ }
+ });
}
- // visit function statements and validate their name
- file.parser.functionStatements.forEach((fun) => {
- if (fun.name.text.toLowerCase() === 'main') {
- file.addDiagnostics([{
- code: 9000,
- message: 'Use RunUserInterface as entry point',
- range: fun.name.range,
- file
- }]);
- }
- });
}
} as CompilerPlugin;
};
@@ -243,12 +272,12 @@ end sub
Here's the plugin:
```typescript
-import { CompilerPlugin, BeforeFileTranspileEvent, isBrsFile, WalkMode, createVisitor, TokenKind } from './';
+import { CompilerPlugin, BeforeFileTranspileEvent, isBrsFile, WalkMode, createVisitor, TokenKind } from 'brighterscript';
// plugin factory
export default function () {
return {
- name: 'removePrint',
+ name: 'replacePlaceholders',
// transform AST before transpilation
beforeFileTranspile: (event: BeforeFileTranspileEvent) => {
if (isBrsFile(event.file)) {
@@ -268,4 +297,34 @@ export default function () {
};
```
-This plugin will search through every LiteralExpression in the entire project, and every time we find a string literal, we will replace `` with `world`. This is done with the `event.editor` object. `editor` allows you to apply edits to the AST, and then the brighterscript compiler will `undo` those edits once the file has been transpiled.
\ No newline at end of file
+This plugin will search through every LiteralExpression in the entire project, and every time we find a string literal, we will replace `` with `world`. This is done with the `event.editor` object. `editor` allows you to apply edits to the AST, and then the brighterscript compiler will `undo` those edits once the file has been transpiled.
+
+## Remove Comment and Print Statements
+
+Another common use case is to remove print statements and comments. Here's a plugin to do that:
+```typescript
+import { isBrsFile, createVisitor, WalkMode, BeforeFileTranspileEvent, CompilerPlugin } from 'brighterscript';
+
+export default function plugin() {
+ return {
+ name: 'removeCommentAndPrintStatements',
+ beforeFileTranspile: (event: BeforeFileTranspileEvent) => {
+ if (isBrsFile(event.file)) {
+ // visit functions bodies and replace `PrintStatement` nodes with `EmptyStatement`
+ for (const func of event.file.parser.references.functionExpressions) {
+ func.body.walk(createVisitor({
+ PrintStatement: (statement) => {
+ event.editor.overrideTranspileResult(statement, '');
+ },
+ CommentStatement: (statement) => {
+ event.editor.overrideTranspileResult(statement, '');
+ }
+ }), {
+ walkMode: WalkMode.visitStatements
+ });
+ }
+ }
+ }
+ } as CompilerPlugin;
+}
+```
diff --git a/docs/readme.md b/docs/readme.md
index f3e1a04f1..d7e876e92 100644
--- a/docs/readme.md
+++ b/docs/readme.md
@@ -6,6 +6,7 @@ See the following pages for more information
- [Annotations](annotations.md)
- [Callfunc Operator](callfunc-operator.md)
- [Classes](classes.md)
+ - [Enums](enums.md)
- [Imports](imports.md)
- [Namespaces](namespaces.md)
- [Null-coalescing operator](null-coalescing-operator.md)
diff --git a/docs/source-literals.md b/docs/source-literals.md
index ff40c0fcc..8698e21bd 100644
--- a/docs/source-literals.md
+++ b/docs/source-literals.md
@@ -14,7 +14,7 @@ print SOURCE_FILE_PATH
transpiles to:
```BrightScript
-print "file" + ":///c:/projects/roku/brighterscript/scripts/rootDir/source/main.bs"
+print "file" + ":///c:/projects/roku/local/brighterscript/scripts/rootDir/source/main.bs"
```
_note: the literal is concatenated to keep the roku static analysis tool happy_
@@ -155,7 +155,7 @@ transpiles to:
```BrightScript
function main()
- print "file" + ":///c:/projects/roku/brighterscript/scripts/rootDir/source/main.bs:2"
+ print "file" + ":///c:/projects/roku/local/brighterscript/scripts/rootDir/source/main.bs:2"
end function
```
diff --git a/docs/ternary-operator.md b/docs/ternary-operator.md
index 17809a02c..d21d0bc83 100644
--- a/docs/ternary-operator.md
+++ b/docs/ternary-operator.md
@@ -1,5 +1,9 @@
# Ternary (Conditional) Operator: ?
-The ternary (conditional) operator is the only BrighterScript operator that takes three operands: a condition followed by a question mark (?), then an expression to execute (consequent) if the condition is true followed by a colon (:), and finally the expression to execute (alternate) if the condition is false. This operator is frequently used as a shortcut for the if statement. It can be used in assignments, and in any other place where an expression is valid. Due to ambiguity in the brightscript syntax, ternary operators cannot be used as standalone statements. See the [No standalone statements](#no-standalone-statements) for more information.
+The ternary (conditional) operator is the only BrighterScript operator that takes three operands: a condition followed by a question mark (?), then an expression to execute (consequent) if the condition is true followed by a colon (:), and finally the expression to execute (alternate) if the condition is false. This operator is frequently used as a shortcut for the if statement. It can be used in assignments, and in any other place where an expression is valid. Due to ambiguity in the brightscript syntax, ternary operators cannot be used as standalone statements. See the [No standalone statements](#no-standalone-statements) section for more information.
+
+## Warning
+The optional chaining operator was added to the BrightScript runtime in Roku OS 11, which introduced a slight limitation to the BrighterScript ternary operator. As such, all ternary expressions must have a space to the right of the question mark when followed by [ or (. See the optional chaning section for more information.
+
## Basic usage
@@ -102,7 +106,7 @@ a = (function(__bsCondition, getNoNameMessage, m, user)
end function)(user = invalid, getNoNameMessage, m, user)
```
-### nested scope protection
+### Nested Scope Protection
The scope protection works for multiple levels as well
```BrighterScript
m.count = 1
@@ -174,3 +178,45 @@ a = (myValue ? "a" : "b'")
```
This ambiguity is why BrighterScript does not allow for standalone ternary statements.
+
+
+## Optional Chaining considerations
+The [optional chaining operator](https://developer.roku.com/docs/references/brightscript/language/expressions-variables-types.md#optional-chaining-operators) was added to the BrightScript runtime in Roku OS 11, which introduced a slight limitation to the BrighterScript ternary operator. As such, all ternary expressions must have a space to the right of the question mark when followed by `[` or `(`. If there's no space, then it's optional chaining.
+
+For example:
+
+*Ternary:*
+```brightscript
+data = isTrue ? ["key"] : getFalseData()
+data = isTrue ? (1 + 2) : getFalseData()
+```
+*Optional chaining:*
+```brightscript
+data = isTrue ?["key"] : getFalseData()
+data = isTrue ?(1 + 2) : getFalseData()
+```
+
+The colon symbol `:` can be used in BrightScript to include multiple statements on a single line. So, let's look at the first ternary statement again.
+```brightscript
+data = isTrue ? ["key"] : getFalseData()
+```
+
+This can be logically rewritten as:
+```brightscript
+if isTrue then
+ data = ["key"]
+else
+ data = getFalseData()
+```
+
+Now consider the first optional chaining example:
+```brightscript
+data = isTrue ?["key"] : getFalseData()
+```
+This can be logically rewritten as:
+```brightscript
+data = isTrue ?["key"]
+getFalseData()
+```
+
+Both examples have valid use cases, so just remember that a single space could result in significantly different code output.
diff --git a/package-lock.json b/package-lock.json
index d5ab99a62..e0511f408 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "brighterscript",
- "version": "0.42.0",
+ "version": "0.47.3",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "brighterscript",
- "version": "0.42.0",
+ "version": "0.47.3",
"license": "MIT",
"dependencies": {
"@rokucommunity/bslib": "^0.1.1",
@@ -29,7 +29,7 @@
"moment": "^2.23.0",
"p-settle": "^2.1.0",
"parse-ms": "^2.1.0",
- "roku-deploy": "^3.5.0",
+ "roku-deploy": "^3.5.4",
"serialize-error": "^7.0.1",
"source-map": "^0.7.3",
"vscode-languageserver": "7.0.0",
@@ -43,18 +43,19 @@
"bsc": "dist/cli.js"
},
"devDependencies": {
+ "@guyplusplus/turndown-plugin-gfm": "^1.0.7",
"@types/benchmark": "^1.0.31",
"@types/chai": "^4.1.2",
- "@types/chokidar": "^2.1.3",
"@types/command-line-args": "^5.0.0",
"@types/command-line-usage": "^5.0.1",
"@types/debounce-promise": "^3.1.1",
"@types/fs-extra": "^5.0.1",
"@types/glob": "^7.1.1",
+ "@types/marked": "^4.0.3",
"@types/mocha": "^5.2.5",
"@types/node": "^11.9.0",
- "@types/request": "^2.47.0",
"@types/sinon": "^9.0.4",
+ "@types/turndown": "^5.0.1",
"@types/yargs": "^15.0.5",
"@typescript-eslint/eslint-plugin": "4.32.0",
"@typescript-eslint/parser": "4.32.0",
@@ -62,14 +63,18 @@
"chai": "^4.2.0",
"chai-files": "^1.4.0",
"coveralls": "^3.0.0",
+ "deepmerge": "^4.2.2",
"eslint": "^7.32.0",
"eslint-plugin-github": "4.3.0",
"eslint-plugin-no-only-tests": "2.6.0",
+ "he": "^1.2.0",
"madge": "^4.0.2",
+ "marked": "^4.0.12",
"mocha": "^9.1.3",
"node-run-cmd": "^1.0.1",
"nyc": "^15.1.0",
"object.pick": "^1.3.0",
+ "phin": "^3.5.1",
"rimraf": "^2.6.2",
"semver-extra": "^3.0.0",
"sinon": "^9.0.2",
@@ -78,6 +83,8 @@
"testdouble": "^3.5.2",
"thenby": "^1.3.4",
"ts-node": "8.9.1",
+ "turndown": "^7.1.1",
+ "turndown-plugin-gfm": "^1.0.2",
"typescript": "^4.4.3",
"typescript-formatter": "^7.2.2",
"vscode-jsonrpc": "^5.0.1"
@@ -137,35 +144,6 @@
"@babel/highlight": "^7.12.13"
}
},
- "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "node_modules/@babel/core/node_modules/@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "node_modules/@babel/core/node_modules/@babel/parser": {
- "version": "7.13.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
- "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@babel/core/node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -282,12 +260,6 @@
"@babel/types": "^7.13.14"
}
},
- "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
"node_modules/@babel/helper-optimise-call-expression": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
@@ -399,35 +371,6 @@
"@babel/highlight": "^7.12.13"
}
},
- "node_modules/@babel/template/node_modules/@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "node_modules/@babel/template/node_modules/@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "node_modules/@babel/template/node_modules/@babel/parser": {
- "version": "7.13.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
- "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@babel/traverse": {
"version": "7.13.13",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz",
@@ -453,35 +396,6 @@
"@babel/highlight": "^7.12.13"
}
},
- "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "node_modules/@babel/traverse/node_modules/@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/parser": {
- "version": "7.13.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
- "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
- "dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@babel/traverse/node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -502,12 +416,6 @@
"to-fast-properties": "^2.0.0"
}
},
- "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
"node_modules/@eslint/eslintrc": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz",
@@ -537,6 +445,15 @@
"node": ">= 4"
}
},
+ "node_modules/@guyplusplus/turndown-plugin-gfm": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@guyplusplus/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.7.tgz",
+ "integrity": "sha512-k2KATk491JIeq1KNsjOwaD88cdknQeTpKVXh9OuZfHdjFuSEtEVVDCfCbxzmRvJxeKDPbZQl8DGP5o7SaIvWBw==",
+ "dev": true,
+ "dependencies": {
+ "turndown": "^7.1.1"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
@@ -595,7 +512,6 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
"integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
- "dev": true,
"dependencies": {
"@nodelib/fs.stat": "2.0.3",
"run-parallel": "^1.1.9"
@@ -608,7 +524,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
"integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
- "dev": true,
"engines": {
"node": ">= 8"
}
@@ -617,7 +532,6 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
"integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
- "dev": true,
"dependencies": {
"@nodelib/fs.scandir": "2.1.3",
"fastq": "^1.6.0"
@@ -682,28 +596,12 @@
"integrity": "sha512-rG7Ieasa9UfZJnL72qiFvY9ivhEIYjCGgfcLLb5tJ/EL9+Mcxernj6W3HVCv/cOfJYuwNUwvVVhnrKl8iT8aqA==",
"dev": true
},
- "node_modules/@types/caseless": {
- "version": "0.12.2",
- "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz",
- "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==",
- "dev": true
- },
"node_modules/@types/chai": {
"version": "4.2.13",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.13.tgz",
"integrity": "sha512-o3SGYRlOpvLFpwJA6Sl1UPOwKFEvE4FxTEB/c9XHI2whdnd4kmPVkNLL8gY4vWGBxWWDumzLbKsAhEH5SKn37Q==",
"dev": true
},
- "node_modules/@types/chokidar": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-2.1.3.tgz",
- "integrity": "sha512-6qK3xoLLAhQVTucQGHTySwOVA1crHRXnJeLwqK6KIFkkKa2aoMFXh+WEi8PotxDtvN6MQJLyYN9ag9P6NLV81w==",
- "deprecated": "This is a stub types definition. chokidar provides its own type definitions, so you do not need this installed.",
- "dev": true,
- "dependencies": {
- "chokidar": "*"
- }
- },
"node_modules/@types/command-line-args": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.0.0.tgz",
@@ -771,6 +669,12 @@
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
"dev": true
},
+ "node_modules/@types/marked": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.3.tgz",
+ "integrity": "sha512-HnMWQkLJEf/PnxZIfbm0yGJRRZYYMhb++O9M36UCTA9z53uPvVoSlAwJr3XOpDEryb7Hwl1qAx/MV6YIW1RXxg==",
+ "dev": true
+ },
"node_modules/@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -795,32 +699,6 @@
"integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==",
"dev": true
},
- "node_modules/@types/request": {
- "version": "2.48.5",
- "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz",
- "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==",
- "dev": true,
- "dependencies": {
- "@types/caseless": "*",
- "@types/node": "*",
- "@types/tough-cookie": "*",
- "form-data": "^2.5.0"
- }
- },
- "node_modules/@types/request/node_modules/form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
- "dev": true,
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
"node_modules/@types/sinon": {
"version": "9.0.8",
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.8.tgz",
@@ -836,10 +714,10 @@
"integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==",
"dev": true
},
- "node_modules/@types/tough-cookie": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz",
- "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
+ "node_modules/@types/turndown": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.1.tgz",
+ "integrity": "sha512-N8Ad4e3oJxh9n9BiZx9cbe/0M3kqDpOTm2wzj13wdDUxDPjfjloWIJaquZzWE1cYTAHpjOH3rcTnXQdpEfS/SQ==",
"dev": true
},
"node_modules/@types/yargs": {
@@ -889,23 +767,6 @@
}
}
},
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
"node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -1005,23 +866,6 @@
}
}
},
- "node_modules/@typescript-eslint/parser/node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
"node_modules/@typescript-eslint/scope-manager": {
"version": "4.32.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.32.0.tgz",
@@ -1079,23 +923,6 @@
}
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
"node_modules/@typescript-eslint/typescript-estree/node_modules/globby": {
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
@@ -1195,14 +1022,6 @@
"chevrotain": "7.0.1"
}
},
- "node_modules/@xml-tools/parser/node_modules/chevrotain": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.0.1.tgz",
- "integrity": "sha512-B/44jrdw5GAzy483LEeVSgXSX0qOYM8lUd3l5+yf6Vl6OQjEUCm2BUiYbHRCIK6xCEvCLAFe1kj8uyV6+zdaVw==",
- "dependencies": {
- "regexp-to-ast": "0.5.0"
- }
- },
"node_modules/acorn": {
"version": "7.4.1",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
@@ -1281,9 +1100,9 @@
}
},
"node_modules/anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -1649,9 +1468,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001230",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
- "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==",
+ "version": "1.0.30001312",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+ "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
"dev": true,
"funding": {
"type": "opencollective",
@@ -1663,6 +1482,12 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
+ "node_modules/centra": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/centra/-/centra-2.5.0.tgz",
+ "integrity": "sha512-CnSF1HD8vOOgNbE4P2fZEhdhfAohvpcF3DSdSvEcSHDAZvr+Xfw73isT8SXJJc3VMBqSwjXhr29/ikHUgFcypg==",
+ "dev": true
+ },
"node_modules/chai": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
@@ -1720,23 +1545,29 @@
}
},
"node_modules/chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
"dependencies": {
- "anymatch": "~3.1.1",
+ "anymatch": "~3.1.2",
"braces": "~3.0.2",
- "glob-parent": "~5.1.0",
+ "glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
+ "readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"optionalDependencies": {
- "fsevents": "~2.3.1"
+ "fsevents": "~2.3.2"
}
},
"node_modules/clean-stack": {
@@ -1962,10 +1793,9 @@
"integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg=="
},
"node_modules/debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
- "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)",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
@@ -2028,6 +1858,15 @@
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
+ "node_modules/deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/default-require-extensions": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
@@ -2094,23 +1933,6 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "node_modules/dependency-tree/node_modules/debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
"node_modules/dependency-tree/node_modules/typescript": {
"version": "3.9.10",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz",
@@ -2245,63 +2067,6 @@
"node": "^10.13 || >=12.0.0"
}
},
- "node_modules/detective-typescript/node_modules/@typescript-eslint/types": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.20.0.tgz",
- "integrity": "sha512-cYY+1PIjei1nk49JAPnH1VEnu7OYdWRdJhYI5wiKOUMhLTG1qsx5cQxCUTuwWCmQoyriadz3Ni8HZmGSofeC+w==",
- "dev": true,
- "engines": {
- "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/detective-typescript/node_modules/@typescript-eslint/typescript-estree": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.20.0.tgz",
- "integrity": "sha512-Knpp0reOd4ZsyoEJdW8i/sK3mtZ47Ls7ZHvD8WVABNx5Xnn7KhenMTRGegoyMTx6TiXlOVgMz9r0pDgXTEEIHA==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "4.20.0",
- "@typescript-eslint/visitor-keys": "4.20.0",
- "debug": "^4.1.1",
- "globby": "^11.0.1",
- "is-glob": "^4.0.1",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/detective-typescript/node_modules/@typescript-eslint/visitor-keys": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.20.0.tgz",
- "integrity": "sha512-NXKRM3oOVQL8yNFDNCZuieRIwZ5UtjNLYtmMx2PacEAGmbaEYtGgVHUHVyZvU/0rYZcizdrWjDo+WBtRPSgq+A==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "4.20.0",
- "eslint-visitor-keys": "^2.0.0"
- },
- "engines": {
- "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
"node_modules/detective-typescript/node_modules/typescript": {
"version": "3.9.10",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz",
@@ -2348,6 +2113,12 @@
"node": ">=6.0.0"
}
},
+ "node_modules/domino": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
+ "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==",
+ "dev": true
+ },
"node_modules/ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -3294,20 +3065,18 @@
"dev": true
},
"node_modules/fast-glob": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
- "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
- "dev": true,
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
+ "glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
+ "micromatch": "^4.0.4"
},
"engines": {
- "node": ">=8"
+ "node": ">=8.6.0"
}
},
"node_modules/fast-json-stable-stringify": {
@@ -3325,7 +3094,6 @@
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
"integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
- "dev": true,
"dependencies": {
"reusify": "^1.0.4"
}
@@ -3383,23 +3151,6 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "node_modules/filing-cabinet/node_modules/debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
"node_modules/filing-cabinet/node_modules/resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
@@ -3740,9 +3491,9 @@
}
},
"node_modules/glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -3796,26 +3547,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/globby": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
- "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
- "dev": true,
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/gonzales-pe": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
@@ -4233,9 +3964,9 @@
}
},
"node_modules/is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -4693,9 +4424,9 @@
"dev": true
},
"node_modules/json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"node_modules/json-schema-traverse": {
"version": "0.4.1",
@@ -4742,17 +4473,17 @@
}
},
"node_modules/jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
- "engines": [
- "node >=0.6.0"
- ],
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"dependencies": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
- "json-schema": "0.2.3",
+ "json-schema": "0.4.0",
"verror": "1.10.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
}
},
"node_modules/jszip": {
@@ -5162,26 +4893,36 @@
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
+ "node_modules/marked": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
+ "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
+ "dev": true,
+ "bin": {
+ "marked": "bin/marked.js"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"dependencies": {
"braces": "^3.0.1",
- "picomatch": "^2.0.5"
+ "picomatch": "^2.2.3"
},
"engines": {
- "node": ">=8"
+ "node": ">=8.6"
}
},
"node_modules/mime-db": {
@@ -5224,38 +4965,38 @@
}
},
"node_modules/minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
"node_modules/mocha": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz",
- "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz",
+ "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==",
"dev": true,
"dependencies": {
"@ungap/promise-all-settled": "1.1.2",
"ansi-colors": "4.1.1",
"browser-stdout": "1.3.1",
- "chokidar": "3.5.2",
- "debug": "4.3.2",
+ "chokidar": "3.5.3",
+ "debug": "4.3.3",
"diff": "5.0.0",
"escape-string-regexp": "4.0.0",
"find-up": "5.0.0",
- "glob": "7.1.7",
+ "glob": "7.2.0",
"growl": "1.10.5",
"he": "1.2.0",
"js-yaml": "4.1.0",
"log-symbols": "4.1.0",
"minimatch": "3.0.4",
"ms": "2.1.3",
- "nanoid": "3.1.25",
+ "nanoid": "3.2.0",
"serialize-javascript": "6.0.0",
"strip-json-comments": "3.1.1",
"supports-color": "8.1.1",
"which": "2.0.2",
- "workerpool": "6.1.5",
+ "workerpool": "6.2.0",
"yargs": "16.2.0",
"yargs-parser": "20.2.4",
"yargs-unparser": "2.0.0"
@@ -5272,69 +5013,12 @@
"url": "https://opencollective.com/mochajs"
}
},
- "node_modules/mocha/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/mocha/node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
- "node_modules/mocha/node_modules/chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "dev": true,
- "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/mocha/node_modules/debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/mocha/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/mocha/node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -5363,26 +5047,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mocha/node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": 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": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/mocha/node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -5455,18 +5119,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mocha/node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
"node_modules/mocha/node_modules/supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -5533,9 +5185,9 @@
"dev": true
},
"node_modules/moment": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
- "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==",
+ "version": "2.29.2",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
+ "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
"engines": {
"node": "*"
}
@@ -5547,9 +5199,9 @@
"dev": true
},
"node_modules/nanoid": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
- "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
+ "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"dev": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
@@ -6193,15 +5845,6 @@
"node": ">=6"
}
},
- "node_modules/path": {
- "version": "0.12.7",
- "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
- "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
- "dependencies": {
- "process": "^0.11.1",
- "util": "^0.10.3"
- }
- },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -6259,9 +5902,9 @@
}
},
"node_modules/pathval": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
- "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
"dev": true,
"engines": {
"node": "*"
@@ -6272,10 +5915,22 @@
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
+ "node_modules/phin": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/phin/-/phin-3.6.1.tgz",
+ "integrity": "sha512-ubcFKk2jRr2WUJEh+QpMkCgOQansJDuIShKbsjpejeyI/aOMLrAf0TaisbMjKwTq9CsypFFJqUaN9ZSRmBJLPw==",
+ "dev": true,
+ "dependencies": {
+ "centra": "^2.4.2"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"engines": {
"node": ">=8.6"
},
@@ -6409,18 +6064,6 @@
"node": ">=6.14.4"
}
},
- "node_modules/postcss/node_modules/nanoid": {
- "version": "3.1.23",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
- "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
- "dev": true,
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
"node_modules/postcss/node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -6457,86 +6100,12 @@
"node": "^10.13 || ^12 || >=14"
}
},
- "node_modules/precinct/node_modules/@typescript-eslint/types": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.20.0.tgz",
- "integrity": "sha512-cYY+1PIjei1nk49JAPnH1VEnu7OYdWRdJhYI5wiKOUMhLTG1qsx5cQxCUTuwWCmQoyriadz3Ni8HZmGSofeC+w==",
- "dev": true,
- "engines": {
- "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/precinct/node_modules/@typescript-eslint/typescript-estree": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.20.0.tgz",
- "integrity": "sha512-Knpp0reOd4ZsyoEJdW8i/sK3mtZ47Ls7ZHvD8WVABNx5Xnn7KhenMTRGegoyMTx6TiXlOVgMz9r0pDgXTEEIHA==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "4.20.0",
- "@typescript-eslint/visitor-keys": "4.20.0",
- "debug": "^4.1.1",
- "globby": "^11.0.1",
- "is-glob": "^4.0.1",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/precinct/node_modules/@typescript-eslint/visitor-keys": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.20.0.tgz",
- "integrity": "sha512-NXKRM3oOVQL8yNFDNCZuieRIwZ5UtjNLYtmMx2PacEAGmbaEYtGgVHUHVyZvU/0rYZcizdrWjDo+WBtRPSgq+A==",
- "dev": true,
- "dependencies": {
- "@typescript-eslint/types": "4.20.0",
- "eslint-visitor-keys": "^2.0.0"
- },
- "engines": {
- "node": "^8.10.0 || ^10.13.0 || >=11.10.1"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
"node_modules/precinct/node_modules/commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "node_modules/precinct/node_modules/debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
"node_modules/precinct/node_modules/detective-typescript": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-6.0.0.tgz",
@@ -6613,14 +6182,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -6830,9 +6391,9 @@
}
},
"node_modules/readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dependencies": {
"picomatch": "^2.2.1"
},
@@ -6996,7 +6557,6 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
"engines": {
"iojs": ">=1.0.0",
"node": ">=0.10.0"
@@ -7015,20 +6575,20 @@
}
},
"node_modules/roku-deploy": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.5.0.tgz",
- "integrity": "sha512-F8Y+0g+xkXr54I0i/GKwLrUxXD3FgSPbxcQmGOQ0oSM7w3lY0BacdncDtuL3FUw8VkRWa1jiHtGHc77oSy5jaw==",
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.5.4.tgz",
+ "integrity": "sha512-2qXrfGRQUUM6mxc821FyKIR0dlC9BLYO+g7AiVIuhs+ujNAv6Ohx7VHywwISSn248sQ6uWkSnew1qO1z7L1O/A==",
"dependencies": {
"chalk": "^2.4.2",
"dateformat": "^3.0.3",
+ "fast-glob": "^3.2.11",
"fs-extra": "^7.0.1",
- "glob": "^7.1.6",
+ "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",
- "path": "^0.12.7",
"request": "^2.88.0",
"xml2js": "^0.4.23"
},
@@ -7039,8 +6599,7 @@
"node_modules/run-parallel": {
"version": "1.1.9",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
- "dev": true
+ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
},
"node_modules/safe-buffer": {
"version": "5.1.2",
@@ -7650,16 +7209,7 @@
},
"funding": {
"type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/table/node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "engines": {
- "node": ">=8"
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
"node_modules/table/node_modules/json-schema-traverse": {
@@ -7892,21 +7442,6 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
- "node_modules/tsutils": {
- "version": "3.17.1",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
- "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
- "dev": true,
- "dependencies": {
- "tslib": "^1.8.1"
- },
- "engines": {
- "node": ">= 6"
- },
- "peerDependencies": {
- "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
- }
- },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -7918,6 +7453,21 @@
"node": "*"
}
},
+ "node_modules/turndown": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.1.tgz",
+ "integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==",
+ "dev": true,
+ "dependencies": {
+ "domino": "^2.1.6"
+ }
+ },
+ "node_modules/turndown-plugin-gfm": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz",
+ "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==",
+ "dev": true
+ },
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
@@ -8039,24 +7589,11 @@
"punycode": "^2.1.0"
}
},
- "node_modules/util": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
- "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
- "dependencies": {
- "inherits": "2.0.3"
- }
- },
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
},
- "node_modules/util/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- },
"node_modules/uuid": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -8212,9 +7749,9 @@
}
},
"node_modules/workerpool": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
- "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz",
+ "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
"dev": true
},
"node_modules/wrap-ansi": {
@@ -8457,29 +7994,6 @@
"@babel/highlight": "^7.12.13"
}
},
- "@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.13.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
- "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
- "dev": true
- },
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -8585,14 +8099,6 @@
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.13",
"@babel/types": "^7.13.14"
- },
- "dependencies": {
- "@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- }
}
},
"@babel/helper-optimise-call-expression": {
@@ -8693,29 +8199,6 @@
"requires": {
"@babel/highlight": "^7.12.13"
}
- },
- "@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.13.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
- "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
- "dev": true
}
}
},
@@ -8744,29 +8227,6 @@
"@babel/highlight": "^7.12.13"
}
},
- "@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- },
- "@babel/highlight": {
- "version": "7.13.10",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
- "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.12.11",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "@babel/parser": {
- "version": "7.13.13",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
- "integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
- "dev": true
- },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -8784,14 +8244,6 @@
"@babel/helper-validator-identifier": "^7.12.11",
"lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
- },
- "dependencies": {
- "@babel/helper-validator-identifier": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
- "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
- "dev": true
- }
}
},
"@eslint/eslintrc": {
@@ -8819,6 +8271,15 @@
}
}
},
+ "@guyplusplus/turndown-plugin-gfm": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/@guyplusplus/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.7.tgz",
+ "integrity": "sha512-k2KATk491JIeq1KNsjOwaD88cdknQeTpKVXh9OuZfHdjFuSEtEVVDCfCbxzmRvJxeKDPbZQl8DGP5o7SaIvWBw==",
+ "dev": true,
+ "requires": {
+ "turndown": "^7.1.1"
+ }
+ },
"@humanwhocodes/config-array": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz",
@@ -8867,7 +8328,6 @@
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz",
"integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==",
- "dev": true,
"requires": {
"@nodelib/fs.stat": "2.0.3",
"run-parallel": "^1.1.9"
@@ -8876,14 +8336,12 @@
"@nodelib/fs.stat": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz",
- "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==",
- "dev": true
+ "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA=="
},
"@nodelib/fs.walk": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz",
"integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==",
- "dev": true,
"requires": {
"@nodelib/fs.scandir": "2.1.3",
"fastq": "^1.6.0"
@@ -8945,27 +8403,12 @@
"integrity": "sha512-rG7Ieasa9UfZJnL72qiFvY9ivhEIYjCGgfcLLb5tJ/EL9+Mcxernj6W3HVCv/cOfJYuwNUwvVVhnrKl8iT8aqA==",
"dev": true
},
- "@types/caseless": {
- "version": "0.12.2",
- "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz",
- "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==",
- "dev": true
- },
"@types/chai": {
"version": "4.2.13",
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.13.tgz",
"integrity": "sha512-o3SGYRlOpvLFpwJA6Sl1UPOwKFEvE4FxTEB/c9XHI2whdnd4kmPVkNLL8gY4vWGBxWWDumzLbKsAhEH5SKn37Q==",
"dev": true
},
- "@types/chokidar": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-2.1.3.tgz",
- "integrity": "sha512-6qK3xoLLAhQVTucQGHTySwOVA1crHRXnJeLwqK6KIFkkKa2aoMFXh+WEi8PotxDtvN6MQJLyYN9ag9P6NLV81w==",
- "dev": true,
- "requires": {
- "chokidar": "*"
- }
- },
"@types/command-line-args": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.0.0.tgz",
@@ -9033,6 +8476,12 @@
"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
"dev": true
},
+ "@types/marked": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.3.tgz",
+ "integrity": "sha512-HnMWQkLJEf/PnxZIfbm0yGJRRZYYMhb++O9M36UCTA9z53uPvVoSlAwJr3XOpDEryb7Hwl1qAx/MV6YIW1RXxg==",
+ "dev": true
+ },
"@types/minimatch": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
@@ -9057,31 +8506,6 @@
"integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==",
"dev": true
},
- "@types/request": {
- "version": "2.48.5",
- "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.5.tgz",
- "integrity": "sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ==",
- "dev": true,
- "requires": {
- "@types/caseless": "*",
- "@types/node": "*",
- "@types/tough-cookie": "*",
- "form-data": "^2.5.0"
- },
- "dependencies": {
- "form-data": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
- "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
- "dev": true,
- "requires": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- }
- }
- }
- },
"@types/sinon": {
"version": "9.0.8",
"resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-9.0.8.tgz",
@@ -9097,10 +8521,10 @@
"integrity": "sha512-dIPoZ3g5gcx9zZEszaxLSVTvMReD3xxyyDnQUjA6IYDG9Ba2AV0otMPs+77sG9ojB4Qr2N2Vk5RnKeuA0X/0bg==",
"dev": true
},
- "@types/tough-cookie": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz",
- "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==",
+ "@types/turndown": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/turndown/-/turndown-5.0.1.tgz",
+ "integrity": "sha512-N8Ad4e3oJxh9n9BiZx9cbe/0M3kqDpOTm2wzj13wdDUxDPjfjloWIJaquZzWE1cYTAHpjOH3rcTnXQdpEfS/SQ==",
"dev": true
},
"@types/yargs": {
@@ -9134,15 +8558,6 @@
"tsutils": "^3.21.0"
},
"dependencies": {
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -9202,17 +8617,6 @@
"@typescript-eslint/types": "4.32.0",
"@typescript-eslint/typescript-estree": "4.32.0",
"debug": "^4.3.1"
- },
- "dependencies": {
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- }
}
},
"@typescript-eslint/scope-manager": {
@@ -9246,15 +8650,6 @@
"tsutils": "^3.21.0"
},
"dependencies": {
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
"globby": {
"version": "11.0.4",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
@@ -9326,16 +8721,6 @@
"integrity": "sha512-mdjG4dWj4zaubxWAgr0YMNkZr182aHek5xrpDqgITNnGf+E8FhvAmCU95QiL9+pGjqK8Qfd+qnuer9f8KELRyQ==",
"requires": {
"chevrotain": "7.0.1"
- },
- "dependencies": {
- "chevrotain": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.0.1.tgz",
- "integrity": "sha512-B/44jrdw5GAzy483LEeVSgXSX0qOYM8lUd3l5+yf6Vl6OQjEUCm2BUiYbHRCIK6xCEvCLAFe1kj8uyV6+zdaVw==",
- "requires": {
- "regexp-to-ast": "0.5.0"
- }
- }
}
},
"acorn": {
@@ -9392,9 +8777,9 @@
}
},
"anymatch": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
- "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -9661,9 +9046,9 @@
"dev": true
},
"caniuse-lite": {
- "version": "1.0.30001230",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz",
- "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==",
+ "version": "1.0.30001312",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz",
+ "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==",
"dev": true
},
"caseless": {
@@ -9671,6 +9056,12 @@
"resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
"integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
},
+ "centra": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/centra/-/centra-2.5.0.tgz",
+ "integrity": "sha512-CnSF1HD8vOOgNbE4P2fZEhdhfAohvpcF3DSdSvEcSHDAZvr+Xfw73isT8SXJJc3VMBqSwjXhr29/ikHUgFcypg==",
+ "dev": true
+ },
"chai": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
@@ -9719,18 +9110,18 @@
}
},
"chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
"requires": {
- "anymatch": "~3.1.1",
+ "anymatch": "~3.1.2",
"braces": "~3.0.2",
- "fsevents": "~2.3.1",
- "glob-parent": "~5.1.0",
+ "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.5.0"
+ "readdirp": "~3.6.0"
}
},
"clean-stack": {
@@ -9916,9 +9307,9 @@
"integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg=="
},
"debug": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
- "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+ "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
"dev": true,
"requires": {
"ms": "2.1.2"
@@ -9960,6 +9351,12 @@
"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
"dev": true
},
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
+ },
"default-require-extensions": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz",
@@ -10011,15 +9408,6 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
"typescript": {
"version": "3.9.10",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz",
@@ -10122,37 +9510,6 @@
"typescript": "^3.9.7"
},
"dependencies": {
- "@typescript-eslint/types": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.20.0.tgz",
- "integrity": "sha512-cYY+1PIjei1nk49JAPnH1VEnu7OYdWRdJhYI5wiKOUMhLTG1qsx5cQxCUTuwWCmQoyriadz3Ni8HZmGSofeC+w==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.20.0.tgz",
- "integrity": "sha512-Knpp0reOd4ZsyoEJdW8i/sK3mtZ47Ls7ZHvD8WVABNx5Xnn7KhenMTRGegoyMTx6TiXlOVgMz9r0pDgXTEEIHA==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.20.0",
- "@typescript-eslint/visitor-keys": "4.20.0",
- "debug": "^4.1.1",
- "globby": "^11.0.1",
- "is-glob": "^4.0.1",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.20.0.tgz",
- "integrity": "sha512-NXKRM3oOVQL8yNFDNCZuieRIwZ5UtjNLYtmMx2PacEAGmbaEYtGgVHUHVyZvU/0rYZcizdrWjDo+WBtRPSgq+A==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.20.0",
- "eslint-visitor-keys": "^2.0.0"
- }
- },
"typescript": {
"version": "3.9.10",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz",
@@ -10185,6 +9542,12 @@
"esutils": "^2.0.2"
}
},
+ "domino": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz",
+ "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==",
+ "dev": true
+ },
"ecc-jsbn": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -10906,17 +10269,15 @@
"dev": true
},
"fast-glob": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
- "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
- "dev": true,
+ "version": "3.2.11",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+ "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.0",
+ "glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.2",
- "picomatch": "^2.2.1"
+ "micromatch": "^4.0.4"
}
},
"fast-json-stable-stringify": {
@@ -10934,7 +10295,6 @@
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
"integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
- "dev": true,
"requires": {
"reusify": "^1.0.4"
}
@@ -10980,15 +10340,6 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
"resolve": {
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
@@ -11231,9 +10582,9 @@
}
},
"glob": {
- "version": "7.1.6",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
- "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -11268,20 +10619,6 @@
}
}
},
- "globby": {
- "version": "11.0.1",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz",
- "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
- "dev": true,
- "requires": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.1.1",
- "ignore": "^5.1.4",
- "merge2": "^1.3.0",
- "slash": "^3.0.0"
- }
- },
"gonzales-pe": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz",
@@ -11579,9 +10916,9 @@
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
},
"is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"requires": {
"is-extglob": "^2.1.1"
}
@@ -11912,9 +11249,9 @@
"dev": true
},
"json-schema": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
- "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
},
"json-schema-traverse": {
"version": "0.4.1",
@@ -11955,13 +11292,13 @@
}
},
"jsprim": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
- "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+ "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
"requires": {
"assert-plus": "1.0.0",
"extsprintf": "1.3.0",
- "json-schema": "0.2.3",
+ "json-schema": "0.4.0",
"verror": "1.10.0"
}
},
@@ -12291,20 +11628,24 @@
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
"dev": true
},
+ "marked": {
+ "version": "4.0.12",
+ "resolved": "https://registry.npmjs.org/marked/-/marked-4.0.12.tgz",
+ "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==",
+ "dev": true
+ },
"merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
},
"micromatch": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
- "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
- "dev": true,
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+ "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
"requires": {
"braces": "^3.0.1",
- "picomatch": "^2.0.5"
+ "picomatch": "^2.2.3"
}
},
"mime-db": {
@@ -12335,92 +11676,49 @@
}
},
"minimist": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
- "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
+ "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==",
"dev": true
},
"mocha": {
- "version": "9.1.3",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.3.tgz",
- "integrity": "sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.0.tgz",
+ "integrity": "sha512-kNn7E8g2SzVcq0a77dkphPsDSN7P+iYkqE0ZsGCYWRsoiKjOt+NvXfaagik8vuDa6W5Zw3qxe8Jfpt5qKf+6/Q==",
"dev": true,
"requires": {
"@ungap/promise-all-settled": "1.1.2",
"ansi-colors": "4.1.1",
"browser-stdout": "1.3.1",
- "chokidar": "3.5.2",
- "debug": "4.3.2",
+ "chokidar": "3.5.3",
+ "debug": "4.3.3",
"diff": "5.0.0",
"escape-string-regexp": "4.0.0",
"find-up": "5.0.0",
- "glob": "7.1.7",
+ "glob": "7.2.0",
"growl": "1.10.5",
"he": "1.2.0",
"js-yaml": "4.1.0",
"log-symbols": "4.1.0",
"minimatch": "3.0.4",
"ms": "2.1.3",
- "nanoid": "3.1.25",
+ "nanoid": "3.2.0",
"serialize-javascript": "6.0.0",
"strip-json-comments": "3.1.1",
"supports-color": "8.1.1",
"which": "2.0.2",
- "workerpool": "6.1.5",
+ "workerpool": "6.2.0",
"yargs": "16.2.0",
"yargs-parser": "20.2.4",
"yargs-unparser": "2.0.0"
},
"dependencies": {
- "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"
- }
- },
"argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true
},
- "chokidar": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
- "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
- "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"
- }
- },
- "debug": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
- "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- },
- "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
- }
- }
- },
"escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -12437,20 +11735,6 @@
"path-exists": "^4.0.0"
}
},
- "glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -12499,15 +11783,6 @@
"p-limit": "^3.0.2"
}
},
- "readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "requires": {
- "picomatch": "^2.2.1"
- }
- },
"supports-color": {
"version": "8.1.1",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -12557,9 +11832,9 @@
}
},
"moment": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
- "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
+ "version": "2.29.2",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
+ "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
},
"ms": {
"version": "2.1.2",
@@ -12568,9 +11843,9 @@
"dev": true
},
"nanoid": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
- "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
+ "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
"dev": true
},
"natural-compare": {
@@ -13063,15 +12338,6 @@
"resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz",
"integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA=="
},
- "path": {
- "version": "0.12.7",
- "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz",
- "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=",
- "requires": {
- "process": "^0.11.1",
- "util": "^0.10.3"
- }
- },
"path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -13119,9 +12385,9 @@
"dev": true
},
"pathval": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
- "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
"dev": true
},
"performance-now": {
@@ -13129,10 +12395,19 @@
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
},
+ "phin": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/phin/-/phin-3.6.1.tgz",
+ "integrity": "sha512-ubcFKk2jRr2WUJEh+QpMkCgOQansJDuIShKbsjpejeyI/aOMLrAf0TaisbMjKwTq9CsypFFJqUaN9ZSRmBJLPw==",
+ "dev": true,
+ "requires": {
+ "centra": "^2.4.2"
+ }
+ },
"picomatch": {
- "version": "2.2.2",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
- "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
},
"pify": {
"version": "3.0.0",
@@ -13217,12 +12492,6 @@
"source-map": "^0.6.1"
},
"dependencies": {
- "nanoid": {
- "version": "3.1.23",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
- "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
- "dev": true
- },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -13263,52 +12532,12 @@
"node-source-walk": "^4.2.0"
},
"dependencies": {
- "@typescript-eslint/types": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.20.0.tgz",
- "integrity": "sha512-cYY+1PIjei1nk49JAPnH1VEnu7OYdWRdJhYI5wiKOUMhLTG1qsx5cQxCUTuwWCmQoyriadz3Ni8HZmGSofeC+w==",
- "dev": true
- },
- "@typescript-eslint/typescript-estree": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.20.0.tgz",
- "integrity": "sha512-Knpp0reOd4ZsyoEJdW8i/sK3mtZ47Ls7ZHvD8WVABNx5Xnn7KhenMTRGegoyMTx6TiXlOVgMz9r0pDgXTEEIHA==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.20.0",
- "@typescript-eslint/visitor-keys": "4.20.0",
- "debug": "^4.1.1",
- "globby": "^11.0.1",
- "is-glob": "^4.0.1",
- "semver": "^7.3.2",
- "tsutils": "^3.17.1"
- }
- },
- "@typescript-eslint/visitor-keys": {
- "version": "4.20.0",
- "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.20.0.tgz",
- "integrity": "sha512-NXKRM3oOVQL8yNFDNCZuieRIwZ5UtjNLYtmMx2PacEAGmbaEYtGgVHUHVyZvU/0rYZcizdrWjDo+WBtRPSgq+A==",
- "dev": true,
- "requires": {
- "@typescript-eslint/types": "4.20.0",
- "eslint-visitor-keys": "^2.0.0"
- }
- },
"commander": {
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
- "debug": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
- "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
- "dev": true,
- "requires": {
- "ms": "2.1.2"
- }
- },
"detective-typescript": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/detective-typescript/-/detective-typescript-6.0.0.tgz",
@@ -13361,11 +12590,6 @@
"parse-ms": "^2.1.0"
}
},
- "process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
- },
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -13535,9 +12759,9 @@
}
},
"readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"requires": {
"picomatch": "^2.2.1"
}
@@ -13656,8 +12880,7 @@
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
},
"rimraf": {
"version": "2.7.1",
@@ -13669,20 +12892,20 @@
}
},
"roku-deploy": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.5.0.tgz",
- "integrity": "sha512-F8Y+0g+xkXr54I0i/GKwLrUxXD3FgSPbxcQmGOQ0oSM7w3lY0BacdncDtuL3FUw8VkRWa1jiHtGHc77oSy5jaw==",
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/roku-deploy/-/roku-deploy-3.5.4.tgz",
+ "integrity": "sha512-2qXrfGRQUUM6mxc821FyKIR0dlC9BLYO+g7AiVIuhs+ujNAv6Ohx7VHywwISSn248sQ6uWkSnew1qO1z7L1O/A==",
"requires": {
"chalk": "^2.4.2",
"dateformat": "^3.0.3",
+ "fast-glob": "^3.2.11",
"fs-extra": "^7.0.1",
- "glob": "^7.1.6",
+ "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",
- "path": "^0.12.7",
"request": "^2.88.0",
"xml2js": "^0.4.23"
}
@@ -13690,8 +12913,7 @@
"run-parallel": {
"version": "1.1.9",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
- "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
- "dev": true
+ "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q=="
},
"safe-buffer": {
"version": "5.1.2",
@@ -14169,12 +13391,6 @@
"uri-js": "^4.2.2"
}
},
- "ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true
- },
"json-schema-traverse": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
@@ -14362,15 +13578,6 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
"dev": true
},
- "tsutils": {
- "version": "3.17.1",
- "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
- "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
- "dev": true,
- "requires": {
- "tslib": "^1.8.1"
- }
- },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -14379,6 +13586,21 @@
"safe-buffer": "^5.0.1"
}
},
+ "turndown": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.1.tgz",
+ "integrity": "sha512-BEkXaWH7Wh7e9bd2QumhfAXk5g34+6QUmmWx+0q6ThaVOLuLUqsnkq35HQ5SBHSaxjSfSM7US5o4lhJNH7B9MA==",
+ "dev": true,
+ "requires": {
+ "domino": "^2.1.6"
+ }
+ },
+ "turndown-plugin-gfm": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/turndown-plugin-gfm/-/turndown-plugin-gfm-1.0.2.tgz",
+ "integrity": "sha512-vwz9tfvF7XN/jE0dGoBei3FXWuvll78ohzCZQuOb+ZjWrs3a0XhQVomJEb2Qh4VHTPNRO4GPZh0V7VRbiWwkRg==",
+ "dev": true
+ },
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
@@ -14466,21 +13688,6 @@
"punycode": "^2.1.0"
}
},
- "util": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
- "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
- "requires": {
- "inherits": "2.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- }
- }
- },
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -14612,9 +13819,9 @@
"dev": true
},
"workerpool": {
- "version": "6.1.5",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz",
- "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz",
+ "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==",
"dev": true
},
"wrap-ansi": {
diff --git a/package.json b/package.json
index 7e85570a9..4e580dd0e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "brighterscript",
- "version": "0.42.0",
+ "version": "0.47.3",
"description": "A superset of Roku's BrightScript language.",
"scripts": {
"preversion": "npm run build && npm run lint && npm run test",
@@ -15,7 +15,8 @@
"publish-coverage": "nyc report --reporter=text-lcov | coveralls",
"dep-graph": "madge --image graph.svg --extensions ts ./src/parser",
"docs": "ts-node scripts/compile-doc-examples.ts",
- "benchmark": "node ./benchmarks/index.js"
+ "benchmark": "node ./benchmarks/index.js",
+ "scrape-roku-docs": "ts-node scripts/scrape-roku-docs.ts"
},
"mocha": {
"spec": "src/**/*.spec.ts",
@@ -24,6 +25,7 @@
"ts-node/register"
],
"fullTrace": true,
+ "timeout": 987654321,
"watchExtensions": [
"ts"
]
@@ -69,18 +71,19 @@
"branches": 100
},
"devDependencies": {
+ "@guyplusplus/turndown-plugin-gfm": "^1.0.7",
"@types/benchmark": "^1.0.31",
"@types/chai": "^4.1.2",
- "@types/chokidar": "^2.1.3",
"@types/command-line-args": "^5.0.0",
"@types/command-line-usage": "^5.0.1",
"@types/debounce-promise": "^3.1.1",
"@types/fs-extra": "^5.0.1",
"@types/glob": "^7.1.1",
+ "@types/marked": "^4.0.3",
"@types/mocha": "^5.2.5",
"@types/node": "^11.9.0",
- "@types/request": "^2.47.0",
"@types/sinon": "^9.0.4",
+ "@types/turndown": "^5.0.1",
"@types/yargs": "^15.0.5",
"@typescript-eslint/eslint-plugin": "4.32.0",
"@typescript-eslint/parser": "4.32.0",
@@ -88,14 +91,18 @@
"chai": "^4.2.0",
"chai-files": "^1.4.0",
"coveralls": "^3.0.0",
+ "deepmerge": "^4.2.2",
"eslint": "^7.32.0",
"eslint-plugin-github": "4.3.0",
"eslint-plugin-no-only-tests": "2.6.0",
+ "he": "^1.2.0",
"madge": "^4.0.2",
+ "marked": "^4.0.12",
"mocha": "^9.1.3",
"node-run-cmd": "^1.0.1",
"nyc": "^15.1.0",
"object.pick": "^1.3.0",
+ "phin": "^3.5.1",
"rimraf": "^2.6.2",
"semver-extra": "^3.0.0",
"sinon": "^9.0.2",
@@ -104,6 +111,8 @@
"testdouble": "^3.5.2",
"thenby": "^1.3.4",
"ts-node": "8.9.1",
+ "turndown": "^7.1.1",
+ "turndown-plugin-gfm": "^1.0.2",
"typescript": "^4.4.3",
"typescript-formatter": "^7.2.2",
"vscode-jsonrpc": "^5.0.1"
@@ -129,7 +138,7 @@
"moment": "^2.23.0",
"p-settle": "^2.1.0",
"parse-ms": "^2.1.0",
- "roku-deploy": "^3.5.0",
+ "roku-deploy": "^3.5.4",
"serialize-error": "^7.0.1",
"source-map": "^0.7.3",
"vscode-languageserver": "7.0.0",
diff --git a/scripts/.cache.json b/scripts/.cache.json
new file mode 100644
index 000000000..70d51f9ca
--- /dev/null
+++ b/scripts/.cache.json
@@ -0,0 +1 @@
+{"https://developer.roku.com/api/v1/get-dev-cms-doc?filePath=left-nav%2Freferences.json&locale=en-us":"{\n \"content\": \"{\\n \\\"Reference overview\\\":\\\"/docs/references/references-overview.md\\\",\\n\\n \\\"SceneGraph\\\":{\\n \\\"Component functions\\\":{\\n \\\"init()\\\":\\\"/docs/references/scenegraph/component-functions/init.md\\\",\\n \\\"onKeyEvent()\\\":\\\"/docs/references/scenegraph/component-functions/onkeyevent.md\\\"\\n },\\n \\\"XML elements\\\":{\\n \\\"\\\":\\\"/docs/references/scenegraph/xml-elements/component.md\\\",\\n \\\"\\\":\\\"/docs/references/scenegraph/xml-elements/interface.md\\\",\\n \\\"\n\n\n\n\n```",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "renderLast",
+ "description": "| Option | Description |\n| --- | --- |\n| `\"renderFirst\"` | any drawing done by this node will be done **before** the node children are rendered |\n| `\"renderLast\"` | any drawing done by this node will be done **after** the node children are rendered |",
+ "name": "childRenderOrder",
+ "type": "option as string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ 0.0, 0.0, 0.0, 0.0 \\]",
+ "description": "Specifies a rectangle in the node local coordinate system that is used to limit the region where this node and its children can render. If a non-empty rectangle is specified, then all drawing by this node and its children will be limited to that rectangular area. \\* \\`ClippingRects\\` can be specified by the node or by any of its ancestors in the SceneGraph. \\* \\`ClippingRects\\` are automatically set by some nodes such as lists and grids. \\* \\`ClippingRects\\` are always clipped to the screen boundaries, so if a \\`clippingRect\\` is specified that is partially or completely offscreen, it will be clipped to the screen boundaries. With respect to render tracking, although the node could be completely within the bounds of the specified \\`clippingRect\\`, it's \\`renderTracking\\` field could be set to \\`\"none\"\\` if the portion of the \\`clippingRect\\` it occupies is completely offscreen.",
+ "name": "clippingRect",
+ "type": "array of float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "If true, renderTracking will be set to a string describing how much of the node is rendered on screen",
+ "name": "enableRenderTracking",
+ "type": "Boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "true",
+ "description": "If true, the node opacity is determined by multiplying opacity attribute of the node by the opacity of the parent node, which may have been determined by multiplying the opacity of its ancestor nodes. If false, the node opacity is determined by the opacity attribute set for the node or the default opacity attribute value",
+ "name": "inheritParentOpacity",
+ "type": "Boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "true",
+ "description": "If true, the node overall transformation is determined by combining the accumulated transformation matrix of all of its ancestors in the SceneGraph with the node local 2D transformation matrix described by its translation, rotation, scale and scaleRotateCenter fields. If false, the accumulated transformation of all of its ancestors in the SceneGraph is ignored and only the node local transformation matrix is used. This causes the node to be transformed relative to the root of the SceneGraph (that is, the Scene component)",
+ "name": "inheritParentTransform",
+ "type": "Boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "Set to true to suppress the default CVAA text to speech. This allows channels to provide their own custom implementation",
+ "name": "muteAudioGuide",
+ "type": "Boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "1.0",
+ "description": "Sets the opacity of the node and its children. Opacity is the opposite of transparency. Opacity values range from 0.0 (fully transparent) to 1.0 (fully opaque). As the SceneGraph is traversed, the opacity values are combined by multiplying the current accumulated opacity with the node opacity, so that if the accumulated opacity of a node ancestors is 0.25 (75% transparent), the node will have opacity of 0.25 or less. This allows entire branches of the SceneGraph to fade in and out by animating the opacity of the node at the root of the branch",
+ "name": "opacity",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0",
+ "description": "Used in combination with the numRenderPasses field of nodes extended from the \\[ArrayGrid\\](https://developer.roku.com/docs/references/scenegraph/abstract-nodes/arraygrid.md\"ArrayGrid\") abstract node class, to optimize rendering of lists and grids. This should never be set to a non-zero value unless you are optimizing the performance of a list or grid rendering by specifying the sequence of rendering operations for sub-elements of the list or grid items, and have set the numRenderPasses field value for the list or grid to a value greater than 1. If the numRenderPasses field value for the list or grid is set to a value greater than 1, you must set this field to a value greater than 0 for all sub-elements of the list or grid items, and not greater than the numRenderPasses field value. If the numRenderPasses field is set to a value greater than 1, and you set this field for a list or grid item sub-element to 0 (the default), or a value greater than the numRenderPasses field value, the list or grid item sub-element will not render",
+ "name": "renderPass",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "disabled",
+ "description": "renderTracking is set to \"disabled\" when enableRenderTracking is set to false. The following options are only available when enableRenderTracking is set to true:\n\n| Option | Description |\n| --- | --- |\n| `\"none\"` | renderTracking is set to `\"none\"` if **one or more** of these conditions is true: the node's `visible` field is set to `false`the node's `opacity` field is set to `0.0`no `clippingRect` is specified and the node is completely offscreena `clippingRect` is specified and the node lies completely outside that `clippingRect's` coordinates or is completely offscreen |\n| `\"partial\"` | renderTracking is set to `\"partial\"` if **all** of the following conditions are true: the node's `visible` field is set to `true`the node's `opacity` field is greater than `0.0`no `clippingRect` is specified and the node is partially offscreena `clippingRect` is specified and the node lies partially inside the `clippingRect's` coordinates |\n| `\"full\"` | renderTracking is set to `\"full\"` if **all** of the following conditions are true: the node's `visible` field is set to `true`the node's `opacity` field is greater than `0.0`no `clippingRect` is specified and the node is completely onscreena `clippingRect` is specified and the node lies completely inside the `clippingRect's` coordinates |",
+ "name": "renderTracking",
+ "type": "option as string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0.0",
+ "description": "Defines the rotation angle about the scaleRotateCenter point (in radians) of the node local coordinate system. Positive values specify a counterclockwise rotation, negative values specify a clockwise rotation. For some Roku Player hardware, specifically Roku Players without OpenGL graphics support, only rotations of 0, 90, 180 and 270 degrees (in equivalent radians) are supported. (See \\[Roku Models and Features\\](/docs/specs/hardware.md#current-models \"Roku Models and Features\") for information on OpenGL support)",
+ "name": "rotation",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[1.0,1.0\\]",
+ "description": "Defines the scale factor to be applied to the node local coordinate",
+ "name": "scale",
+ "type": "vector2d"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[0.0,0.0\\]",
+ "description": "Describes the location of a point in the node local coordinate that serves as the center of the scale and rotation operations",
+ "name": "scaleRotateCenter",
+ "type": "vector2d"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[0.0,0.0\\]",
+ "description": "Defines the origin of the node local coordinate system relative to its parent node",
+ "name": "translation",
+ "type": "vector2d"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "true",
+ "description": "If true, the node and its children are rendered. If false, the node and its children do not render",
+ "name": "visible",
+ "type": "Boolean"
+ }
+ ],
+ "interfaces": [],
+ "name": "SimpleLabel",
+ "url": "https://developer.roku.com/docs/references/scenegraph/renderable-nodes/simplelabel.md"
+ },
+ "soundeffect": {
+ "description": "Extends [**Node**](https://developer.roku.com/docs/references/scenegraph/node.md\n\nThe SoundEffect node class is used to play audio sound effects that can be triggered from events that occur in the UI. Typically, these sound effects are short audio clips, but there is no inherent limit on their length. Currently, up to four simultaneous sounds can be playing at any time, in addition to audio from streaming content and TextToSpeech audio.\n\nFiles can be installed locally as part of the channel package or dynamically downloaded from the network. All files must be WAV (i.e. PCM) format.\n\nFor local files, the convention is to include the WAV files in a directory named \"sounds\".\n\nFor downloaded files, a least-recently-used (LRU) mechanism is used to keep the most recently downloaded/played sounds in temporary storage on the device. If the limits on the maximum number/size of downloaded sounds is exceeded, the least recently used sounds are removed from temporary storage. They will be automatically reloaded the next time the control field is set to \"play\".\n\nA sample demonstrating how to use the SoundEffect node can be found here: [SimpleSoundEffect](https://github.com/rokudev/samples/blob/master/media/SimpleSoundEffect.zip)",
+ "events": [],
+ "extends": {
+ "name": "Node",
+ "url": "https://developer.roku.com/docs/references/scenegraph/node.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "none",
+ "description": "Set to control the audio playback. Getting the value of this field returns the most recent value set, or none if no value has been set.\n\n| Option | Effect |\n| --- | --- |\n| none | No effect |\n| play | Start playing the audio. If the audio is already playing, it will be restarted. If the `loadStatus` field is not \"ready\", the sound will not be played and the `state` field will be set to \"notready\". For networked files with the `loadStatus` field set to \"flushed\", setting `control` to \"play\" will automatically trigger a reload of the network file, but will not result in the sound being played, due to the time it takes to download the file again. In this case, the sound can be played once the `loadStatus` field changes from \"flushed\" to \"ready\" |\n| stop | If the audio is playing, stop playing the audio. If the audio is not playing, no effect. |",
+ "name": "control",
+ "type": "option string"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "none",
+ "description": "Indicates the status of the sound file.\n\n| Value | Meaning |\n| --- | --- |\n| none | No file has been requested. |\n| loading | (network files only) The file has been requested and is being downloaded. |\n| ready | The file is ready to be played (i.e. it is on the device and is a valid WAV file). |\n| failed | The file path or URI is incorrect or refers to a file that is not a valid WAV file. |\n| flushed | (network files only) The file was ready, but has been deleted from the LRU cache. Setting the `control` field to play will cause the file to be automatically reloaded, but not be played upon completion. |",
+ "name": "loadStatus",
+ "type": "value string"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "none",
+ "description": "Can be used to track the progress of current state of local and networked sound files When the field value changes to ready, the sound is ready to be played. The possible values are:\n\n| Value | Meaning |\n| --- | --- |\n| none | No current playback state |\n| playing | Audio is currently playing. |\n| stopped | The audio playback was stopped by setting control to \"stop\". The state will also be set to \"stopped\" if audio was playing and the uri is changed. |\n| finished | The audio playback reached the end of the audio |\n| toomanysounds | Control was to \"play\" while there were already the maximum number of SoundEffect sounds playing. Currently, this limit is 4. |\n| notready | The sound file is not on the device. This is set in response to the control field being set to \"play\". For local WAV files included in a channel package, it will be occur if the path to the file is not correct, or if the file is not a valid WAV file. For network-accessed WAV files, this indicates one of these three conditions is true: * The file has been requested, but is not finished downloading. In this case, the `loadStatus` field will be set to \"loading\". * The file request has completed, but the URL is incorrect or the downloaded file is not a valid WAV filed. In this case, the `loadStatus` field will be set to \"failed\" * The file has previously been downloaded, but has been flushed from the LRU cache. In this case, the `loadStatus` field will be set to \"flushed\". |",
+ "name": "state",
+ "type": "value string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "",
+ "description": "Specifies the URI of the WAV file. Sounds included as part of the application package can be referenced using the \\`pkg:/sounds\\` prefix. This may also specify the location of a WAV file on a remote server.",
+ "name": "uri",
+ "type": "uri"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "50",
+ "description": "The volume is a number between 0 and 100 (percentage of full volume). 50 should be used for normal volume.",
+ "name": "volume",
+ "type": "integer"
+ }
+ ],
+ "interfaces": [],
+ "name": "SoundEffect",
+ "url": "https://developer.roku.com/docs/references/scenegraph/media-playback-nodes/soundeffect.md"
+ },
+ "standarddialog": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [Group](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md\"**Group**\")\n\nThe **StandardDialog** node is the base for Roku's pre-built standard message, keyboard, pinpad, and progress dialogs. It can also be used directly with a custom dialog structure built with the **StdDialogItem** nodes.",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "0",
+ "description": "Indicates the index of the button that gained focus when the user moved the focus onto one of the buttons in the button area.",
+ "name": "buttonFocused",
+ "type": "int"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "0",
+ "description": "indicates the index of the selected button when the user selects one of the buttons in the button area.",
+ "name": "buttonSelected",
+ "type": "int"
+ },
+ {
+ "accessPermission": "WRITE\\_ONLY",
+ "default": "false",
+ "description": "Dismisses the dialog. The dialog is dismissed whenever the close field is set, regardless of whether the field is set to true or false.",
+ "name": "close",
+ "type": "boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0.0f",
+ "description": "Sets the height of the dialog. If this field is set to greater than 0, and the layout of the dialog for the specified width results in a dialog with a height less than the value of this field, the dialog layout is increased so that the dialog height matches the value of this field. In this case, the button area is moved to the bottom of the dialog and a blank region exists between the content area and the button area.",
+ "name": "height",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "not set",
+ "description": "Sets the color palette for the dialog's background, text, buttons, and other elements. By default, no palette is specified; therefore, the dialog inherits the color palette from the nodes higher in the scene graph (typically, from the dialog's \\[Scene\\](https://developer.roku.com/docs/references/scenegraph/scene.md node, which has a \\*\\*palette\\*\\* field that can be used to consistently color the standard dialogs and keyboards in the channel). The RSGPalette color values used by the StandardDialog node are as follows:\n\n| Palette Color Name | Usages |\n| --- | --- |\n| DialogBackgroundColor | Blend color for dialog's background bitmap. |\n| DialogItemColor | Blend color for the following items: * [StdDlgProgressItem's](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-progress-item.md spinner bitmap * [StdDlgDeterminateProgressItem's](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-determinate-progress-item.md graphic |\n| DialogTextColor | Color for the text in the following items: * [StdDlgTextItem](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-text-item.md and [StdDlgGraphicItem](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-graphic-item.md if the **namedTextStyle** field is set to \"normal\" or \"bold\". * All [content area items](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md, except for [StdDlgTextItem](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-text-item.md and [StdDlgGraphicItem](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-graphic-item.md. * [Title area](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-title-area.mdfields). Unfocused button. |\n| DialogFocusColor | Blend color for the following: * The [button area](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-button-area.mdfields) focus bitmap. * The focused scrollbar thumb. |\n| DialogFocusItemColor | Color for the text of the focused button. |\n| DialogSecondaryTextColor | Color for the text of in the following items: * [StdDlgTextItem](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-text-item.md and [StdDlgGraphicItem](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-graphic-item.md if the **namedTextStyle** field is set to \"secondary\". * Disabled button. |\n| DialogSecondaryItemColor | Color for the following items: * The divider displayed below the title area. * The unfilled portion of the [StdDlgDeterminateProgressItem's](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-determinate-progress-item.md graphic. |\n| DialogInputFieldColor | The blend color for the text edit box background bitmap for keyboards used inside dialogs. |\n| DialogKeyboardColor | The blend color for the keyboard background bitmap for keyboards used inside dialogs |\n| DialogFootprintColor | The blend color for the following items: * The button focus footprint bitmap that is displayed when the [button area](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-button-area.mdfields) does not have focus. * Unfocused scrollbar thumb and scrollbar track. |",
+ "name": "palette",
+ "type": "RSGPalette node"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "N/A",
+ "description": "An event that indicates the dialog was dismissed. This event is triggered when one of the following occurs: \\* The \\*\\*close\\*\\* field is set. \\* The Back, Home, or Options key is pressed. \\* Another dialog is displayed.",
+ "name": "wasClosed",
+ "type": "event"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0.0f",
+ "description": "Sets the width of the dialog: \\* If set to 0, the standard system dialog width is used (1038 for FHD, 692 for HD). If the title or any button text is too wide to fit within the standard width, the dialog width will be automatically increased to show the full title or button text up to a preset maximum (1380 for FHD and 920 for HD). \\* If set to greater than 0, the specified width is used as the overall width of the dialog.",
+ "name": "width",
+ "type": "float"
+ }
+ ],
+ "interfaces": [],
+ "name": "StandardDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md"
+ },
+ "standardkeyboarddialog": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StandardDialog](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md\"**Standard Dialog**\")\n\nThe **StandardKeyboardDialog** node enables text and voice entry of strings consisting of alphanumeric characters as well as many commonly used symbols. It is similar to the legacy [KeyboardDialog](https://developer.roku.com/docs/references/scenegraph/dialog-nodes/keyboarddialog.md node, but includes voice entry functionality, which is provided through its internal **DynamicKeyboard** node.\n\n![keyboard-dialog](https://image.roku.com/ZHZscHItMTc2/keyboard-dialog.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StandardDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "List of buttons to be displayed in the button area at the bottom of the dialog. Each string in the buttons array adds a new button to the button area. > Minimize the number of buttons in the dialog to ensure that all buttons are visible without the user having to scroll up and down.",
+ "name": "buttons",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "Access Permission",
+ "default": "Default",
+ "description": "Description",
+ "name": "Field",
+ "type": "Type"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"generic\"",
+ "description": "The type of text to be entered. This may be used by the keyboard to modify the voice entry method and to determine when a valid string has been entered. This may be one of the following values: \\* \"email\": letter-by-letter dictation for emails. \\* \"numeric\": letter-by-letter dictation for PIN codes, zip codes, and other numeric input. \\* \"alphanumeric\": letter-by-letter dication for street addresses or other sequences of numbers and letters. \\* \"generic\": Full word input for search queries or other sequences of numbers, letters and symbols. \\* \"password\": letter-by-letter dication for passwords.",
+ "name": "keyboardDomain",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "One or more blocks of text, which are typically used to describe information about the data to be entered. Each string in the array is displayed as a separate block of text with the standard amount of space left between the blocks. > Minimize the message length to avoid having a scrollbar automatically added to the content area. If multiple strings are specified or any string is too long, the dialog may not be able to fit within the height of the display.",
+ "name": "message",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The default string to be displayed in the keyboard's text edit box. When the user enters the text, this field is updated with the currently entered string.",
+ "name": "text",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ",
+ "default": "The keyboard item's VoiceTextEditBox node",
+ "description": "The internal VoiceTextEditBox node used by this dialog's internal keyboard. This field should be used only to access the fields of this internal node.",
+ "name": "textEditBox",
+ "type": "VoiceTextEditBox node"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The title to be displayed at the top of the dialog.",
+ "name": "title",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StandardKeyboardDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-keyboard-dialog.md"
+ },
+ "standardmessagedialog": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StandardDialog](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md\"**Standard Dialog**\")\n\nThe **StandardMessageDialog** node is used to displays a message to the user. It is similar to the legacy [Dialog](https://developer.roku.com/docs/references/scenegraph/dialog-nodes/dialog.md node. It may contain the following items (from top to bottom):\n\n* One or more blocks of text at the top.\n* One bulleted / numbered list.\n* One or more blocks of text at the bottom.\n\n![standard-message-dialog](https://image.roku.com/ZHZscHItMTc2/standard-message-dialog.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StandardDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "One or more blocks of informational text displayed at the bottom of the dialog's content area. Each string in the array is displayed as a separate block of text with the standard amount of space left between the blocks. > To separate lines of text, add each line as an element in the array. Do not use newline characters.",
+ "name": "bottomMessage",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "An array of strings displayed as a bulleted or numbered list. The list is displayed in the content area below the message and above the bottom message.",
+ "name": "bulletText",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"bullet\"",
+ "description": "If the \\*\\*bulletText\\*\\* field is set, specifies the type of list item delimiter, which may be one of the following: \\* \"bullet\" (this is the default) \\* \"numbered\" \\* \"lettered\" .",
+ "name": "bulletType",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "List of buttons to be displayed in the button area at the bottom of the dialog. Each string in the buttons array adds a new button to the button area. > Minimize the number of buttons in the dialog to ensure they are all visible when the dialog is displayed.",
+ "name": "buttons",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "One or more blocks of informational text displayed at the top of the dialog's content area. Each string in the array is displayed as a separate block of text with the standard amount of space left between the blocks. > To separate lines of text, add each line as an element in the array. Do not use newline characters.",
+ "name": "message",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The title to be displayed at the top of the dialog.",
+ "name": "title",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StandardMessageDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-message-dialog.md"
+ },
+ "standardpinpaddialog": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StandardDialog](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md\"**Standard Dialog**\")\n\nThe **StandardPinPadDialog** node enables text and voice entry of numeric characters—typically, short numeric PIN codes. It is similar to the legacy [PinDialog](https://developer.roku.com/docs/references/scenegraph/dialog-nodes/pindialog.md node, but includes additional voice entry of the numeric digits. This additional functionality is provided through the node's internal DynamicPinPad and VoiceTextEditBox nodes.\n\n![pin-pad-dialog](https://image.roku.com/ZHZscHItMTc2/pin-pad-dialog.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StandardDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "List of buttons to be displayed in the button area at the bottom of the dialog. Each string in the buttons array adds a new button to the button area. > Minimize the number of buttons in the dialog to ensure that all buttons are visible without the user having to scroll up and down.",
+ "name": "buttons",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "One or more blocks of text, which are typically used to describe information about the data to be entered. Each string in the array is displayed as a separate block of text with the standard amount of space left between the blocks. > Minimize the message length to avoid having a scrollbar automatically added to the content area. If multiple strings are specified or any string is too long, the dialog may not be able to fit within the height of the display.",
+ "name": "message",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Displays the entered PIN number in the text edit box. As the user enters each numeric digit, this field is updated with the currently entered value.",
+ "name": "pin",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ",
+ "default": "The keyboard item's VoiceTextEditBox node",
+ "description": "The internal VoiceTextEditBox node used by this dialog's internal keyboard. This field should be used only to access the fields of this internal node > Use the \\*\\*textEditBox.maxTextLength\\*\\* field to limit the length of the pin to be entered.",
+ "name": "textEditBox",
+ "type": "VoiceTextEditBox node"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The title to be displayed at the top of the dialog.",
+ "name": "title",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StandardPinPadDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-pinpad-dialog.md"
+ },
+ "standardprogressdialog": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StandardDialog](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md\"**Standard Dialog**\")\n\nThe StandardProgressDialog node displays a spinning progress indicator that includes a short progress message to the user. It is similar to the legacy [ProgressDialog](https://developer.roku.com/docs/references/scenegraph/dialog-nodes/progressdialog.md) node.\n\n![progress-dialog-title](https://image.roku.com/ZHZscHItMTc2/progress-dialog-title-v2.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StandardDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "A string to be displayed next to the spinning progress indicator. It typically tells the user why they are waiting. > Minimize the message length.",
+ "name": "message",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The title to be displayed at the top of the dialog.If no title is specified, the progress dialog will be displayed without a title area and will use the minimum width needed to show the spinning progress indicator and message",
+ "name": "title",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StandardProgressDialog",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-progress-dialog.md"
+ },
+ "stddlgareabase": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [Group](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md\n\nThe **StdDlgAreaBase** node is the base class and provides the common functionality for the three StandardDialog area nodes: [**StdDlgTitleArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-title-area.md, [**StdDlgContentArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md and [**StdDlgButtonArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-button-area.md.",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [],
+ "interfaces": [],
+ "name": "StdDlgAreaBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-area-base.md"
+ },
+ "stddlgbullettextitem": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgItemBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md\"**StdDlgItemBase**\")\n\nThe **StdDlgBulletTextItem** node is used to display a bulleted list of text in the dialog's content area. It should only be used as a child of a [**StdDlgContentArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md node.\n\n![StdDlgBulletTextItem](https://image.roku.com/ZHZscHItMTc2/StdDlgBulletTextItem-v2.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgItemBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "An array of strings displayed as a bulleted or numbered list. The list is displayed in the content area below the message and above the bottom message.",
+ "name": "bulletText",
+ "type": "array of string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"bullet\"",
+ "description": "Specifies the type of list item delimiter, which may be one of the following: \\* \"bullet\" \\* \"numbered\" \\* \"lettered\"",
+ "name": "bulletType",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgBulletTextItem",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-bullet-text-item.md"
+ },
+ "stddlgbutton": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [Group](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md\"**Group**\")\n\n**StdDlgButton** is the class used for each button in the [button area](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog-framework-overview.mdstructure). The buttons are displayed in the order in which they are listed as children of the [**StdDlgButtonArea** node](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-button-area.md. The size and layout of each button are controlled by the StandardDialog layout algorithm. **StdDlgButton** nodes should only be used as children of a **StdDlgButtonArea** node.\n\n![std-dlg-button](https://image.roku.com/ZHZscHItMTc2/std-dlg-button-3.jpg)",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "Specifies whether the button can receive focus. If this field is set to true, the button has an inactive appearance and is unable to receive focus.",
+ "name": "disabled",
+ "type": "boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The text to be displayed on the button",
+ "name": "text",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgButton",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-button.md"
+ },
+ "stddlgbuttonarea": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgAreaBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-area-base.md\"**StdDlgAreaBase**\")\n\nThe **StdDlgButtonArea** node is always positioned at the bottom of the [StandardDialog](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md. It contains zero or more child nodes of type [**StdDlgButton**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-button.md or a type that extends **StdDlgButton**. Each of the **StdDlgButton** nodes provides an option to perform some task related to the purpose of the dialog. For example, dialogs often have \"Continue\" and \"Cancel\" buttons in the bottom area. The buttons are positioned and sized so that they are arranged vertically in the order in which their **StdDlgButton** child nodes are listed.\n\nA dialog may only have a single button area, and the button area is optional.\n\n![std-dlg-button-area](https://image.roku.com/ZHZscHItMTc2/std-dlg-button-area.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgAreaBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-area-base.md"
+ },
+ "fields": [],
+ "interfaces": [],
+ "name": "StdDlgButtonArea",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-button-area.md"
+ },
+ "stddlgcontentarea": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgAreaBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-area-base.md\"**StdDlgAreaBase**\")\n\nThe **StdDlgContentArea** node contains the main body of the dialog. It is positioned between the title area and the button area.\n\nIt contains zero or more child nodes that extend [**StdDlgItemBase**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md (for example, [**StdDlgTextItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-text-item.md, [**StdDlgProgressItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-progress-item.md, [**StdDlgGraphicItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-graphic-item.md, and other dialog building blocks). The layout and position of the [**StdDlgItemBase** nodes](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md are based on the dialog's width; the nodes are arranged vertically from top to bottom in the content area based on the order in which they are listed. The content area should contain only [**StdDlgItemBase** nodes](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md; otherwise, its layout and rendering are undefined.\n\nA dialog may only have a single content area, and the content area is optional.\n\n![content-area](https://image.roku.com/ZHZscHItMTc2/content-area.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgAreaBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-area-base.md"
+ },
+ "fields": [],
+ "interfaces": [],
+ "name": "StdDlgContentArea",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md"
+ },
+ "stddlgdeterminateprogressitem": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgItemBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md\"**StdDlgItemBase**\")\n\nThe **StdDlgDeterminateProgressItem** node is used to display a progress indicator in the dialog's content area. It provides the percentage of progress that has been completed for a task that takes a limited amount of time. It should only be used as a child of a [**StdDlgContentArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md node.\n\n![std-dlg-determinate-progress-item](https://image.roku.com/ZHZscHItMTc2/std-dlg-determinate-progress-item-2.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgItemBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"0\"",
+ "description": "Specifies the current completion percentage text and graphic to be displayed (for example \"35%\" with more than a third of the indicator filled). If this is set to a number less than 0 or greater than 100, the progress indicator will display \"0%\" or \"100%\" completion, respectively.",
+ "name": "percent",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies the text to be displayed next to the progress graphic. If the text width does not fit within the width of the content area, the text will wrap onto multiple lines.",
+ "name": "text",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgDeterminateProgressItem",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-determinate-progress-item.md"
+ },
+ "stddlggraphicitem": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgItemBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md\"**StdDlgItemBase**\")\n\nThe **StdDlgGraphicItem** node is used to display an image in the dialog's content area with an optional text label displayed to the left, right, above, or below the image. It should only be used as a child of a [**StdDlgContentArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md node.\n\n![std-dlg-graphic-item](https://image.roku.com/ZHZscHItMTc2/std-dlg-graphic-item.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgItemBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"left\"",
+ "description": "Specifies where to position and align the graphic and its text label, relative to the content area. This may be one of the following values:\n\n| Value | Text Position |\n| --- | --- |\n| left | The graphic is left-aligned in the content area. The text label is positioned horizontally to the right of the graphic, and centered vertically. |\n| right | The graphic is right-aligned in the content area. The text label is positioned horizontally to the left of the graphic, and centered vertically. |\n| center\\_below | The graphic and text label are centered horizontally in the content area. The graphic is positioned below the text label. |\n| center\\_above | The graphic and text label are centered horizontally in the content area. The graphic is positioned above the text label. |",
+ "name": "graphicAlign",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0",
+ "description": "The image height to be used instead of the image's actual height.",
+ "name": "graphicHeight",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The URI of the image to be displayed.",
+ "name": "graphicUri",
+ "type": "uri"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0",
+ "description": "The image width to be used instead of the image's actual width.",
+ "name": "graphicWidth",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies the text to be displayed next to the graphic. If the text width does not fit within the width of the content area, the text will wrap onto multiple lines.",
+ "name": "text",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgGraphicItem",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-graphic-item.md"
+ },
+ "stddlgitembase": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [Group](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md)\n\n**StdDlgItemBase** is the base class for all the content area items. It provides the common functionality for all StdDlg\\[_x_\\]Item nodes (for example, [**StdDlgBulletTextItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-bullet-text-item.md, [**StdDlgTextItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-text-item.md, [**StdDlgKeyboardItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-keyboard-item.md, [**StdDlgProgressItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-progress-item.md, [**StdDlgGraphicItem**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-graphic-item.md, and the other dialog building block nodes).",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.comhttps://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "Indicates whether the item can be scrolled vertically by the user. The StandardDialog layout algorithm reduces the height of a scrollable item as needed if the overall height of the dialog is too large to fit on the display.",
+ "name": "scrollable",
+ "type": "boolean"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgItemBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md"
+ },
+ "stddlgkeyboarditem": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgItemBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md\"**StdDlgItemBase**\")\n\nThe **StdDlgKeyboardItem** node is used to display a keyboard or PINpad in the dialog's content area. It provides text and voice entry of strings containing alphanumeric characters and symbols or numeric digits. It should only be used as a child of a [**StdDlgContentArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md node.\n\n![std-dlg-keyboard-item](https://image.roku.com/ZHZscHItMTc2/std-dlg-keyboard-item.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgItemBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"unspecified\"",
+ "description": "Specifies the type of keyboard to be displayed: \\* \"unspecified\": no keyboard is displayed. \\* \"keyboard\": A \\[\\*\\*DynamicKeyboard\\*\\*\\](https://developer.roku.com/docs/references/scenegraph/dynamic-voice-keyboard-nodes/dynamic-keyboard.md node is displayed. \\* \"pinpad\": A \\[\\*\\*DynamicPinPad\\*\\*\\](https://developer.roku.com/docs/references/scenegraph/dynamic-voice-keyboard-nodes/dynamic-pinpad.md node is displayed.",
+ "name": "keyLayout",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The default string to be displayed in the keyboard's text edit box. When the user enters the text, this field is updated with the currently entered string.",
+ "name": "text",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ",
+ "default": "The [**VoiceTextEditBox**](/docs/references/scenegraph/dynamic-voice-keyboard-nodes/voice-text-edit-box.md) associated with the keyboard",
+ "description": "The internal \\[\\*\\*VoiceTextEditBox\\*\\* node\\](https://developer.roku.com/docs/references/scenegraph/dynamic-voice-keyboard-nodes/voice-text-edit-box.md used by this dialog's internal keyboard. This field should be used only to access the fields of this internal node.",
+ "name": "textEditBox",
+ "type": "VoiceTextEditBox node"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgKeyboardItem",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-keyboard-item.md"
+ },
+ "stddlgprogressitem": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgItemBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md\"**StdDlgItemBase**\")\n\nThe **StdDlgProgressItem** node is used to display a spinning progress indicator in the dialog's content area. It provides the status of a task that takes an indeterminate amount of time. It should only be used as a child of a [**StdDlgContentArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md node.\n\n![std-dlg-progress-item](https://image.roku.com/ZHZscHItMTc2/std-dlg-progress-item.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgItemBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies the text to be displayed next to the progress graphic. If the text width does not fit within the width of the content area, the text will wrap onto multiple lines.",
+ "name": "text",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgProgressItem",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-progress-item.md"
+ },
+ "stddlgtextitem": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgItemBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md\"**StdDlgItemBase**\")\n\nThe **StdDlgTextItem** node is used to display a block of text. It should only be used as a child of a [**StdDlgContentArea**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-content-area.md node.\n\n![StdDlgTextItem](https://image.roku.com/ZHZscHItMTc2/std-dlg-text-item.jpg)\n\n> To separate lines of text, use multiple **StdDlgTextItem** nodes. Do not use newline characters.",
+ "events": [],
+ "extends": {
+ "name": "StdDlgItemBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-item-base.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies the string to be spoken when the audio guide reads the text item. By default, the audio guide reads the string specified in the \\*\\*text\\*\\* field.",
+ "name": "audioGuideText",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"normal\"",
+ "description": "Specifies a named style to be used for the displayed text's color and font. The supported styles include:\n\n| Style Name | Palette Color | Font |\n| --- | --- | --- |\n| \"normal\" | DialogTextColor | SmallSystemFont |\n| \"secondary\" | DialogSecondaryTextColor | SmallestSystemFont |\n| \"bold\" | DialogTextColor | SmallBoldSystemFont |",
+ "name": "namedTextStyle",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies the text to be displayed. If the text width does not fit within the width of the content area, the text will wrap onto multiple lines.",
+ "name": "text",
+ "type": "string"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgTextItem",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-text-item.md"
+ },
+ "stddlgtitlearea": {
+ "availableSince": "10.0",
+ "description": "_Available since Roku OS 10.0_\n\nExtends [StdDlgAreaBase](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-area-base.md\"**StdDlgAreaBase**\")\n\nThe **StdDlgTitleArea** node contains the dialog's title information, which is always displayed at the top of the dialog. The title area may also include optional icons that appear left or right justified. The **StdDlgTitleArea** should only be used as a child node of a [**StandardDialog**](https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/standard-dialog.md.\n\nA dialog may a single title area, and the title area is optional (but is typically used in nearly all cases)\n\n![title-area-icon](https://image.roku.com/ZHZscHItMTc2/title-area-icon.jpg)",
+ "events": [],
+ "extends": {
+ "name": "StdDlgAreaBase",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-area-base.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies a bitmap to be displayed at the left edge of the dialog's title area (to the left of dialog's primary title).",
+ "name": "primaryIcon",
+ "type": "URL"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0.0f",
+ "description": "Adjusts the vertical position of the primary icon relative to the baseline of the dialog's primary title. By default, the bottom of the primary icon is aligned with the primary title's baseline.",
+ "name": "primaryIconVertOffset",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies the title to be displayed in the dialog's title area.",
+ "name": "primaryTitle",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies a bitmap to be displayed at the right edge of the dialog's title area.",
+ "name": "secondaryIcon",
+ "type": "URL"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0.0f",
+ "description": "Adjusts the vertical position of the secondary icon relative to the baseline of the dialog's primary title. By default, the bottom of the secondary icon is aligned with the primary title's baseline.",
+ "name": "secondaryIconVertOffset",
+ "type": "float"
+ }
+ ],
+ "interfaces": [],
+ "name": "StdDlgTitleArea",
+ "url": "https://developer.roku.com/docs/references/scenegraph/standard-dialog-framework-nodes/std-dlg-title-area.md"
+ },
+ "targetgroup": {
+ "description": "Extends [**Group**](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md\"**Group**\")\n\nThe TargetGroup node class associates a set of rectangular regions that children of the group will occupy. Like MarkupList, the TargetGroup has a content field containing the data for each item and an itemComponentName field that specifies an RSG component that will be used to render a content item. It also has a targetSet field that contains a [TargetSet](https://developer.roku.com/docs/references/scenegraph/list-and-grid-nodes/targetset.md\"TargetSet\") that define a set of rectangular targets where children of the TargetGroup will be rendered.\n\nThe TargetGroup node is typically used to create a scrolling list (or row) of items where the focused item occupies more space than the other items.\n\nFor example, a TargetGroup could be used to create a full screen vertical scrolling list of item where the focused item is larger than the other items in the list. As the list items scroll, the appearance of the item moving into the focus region would be dynamically adjusted to fill the larger focus region. Simultaneously, the appearance of the item leaving the focus region would be dynamically adjust to return to the unfocused size. To set up this use case, you might set the targetSet field to a TargetSet node that specifies nine rectangles. The first rectangle would be specified to have the width and height of an unfocused item and be positioned so that it's bottom is above the top of the screen. The last rectangle would be specified to have the width and height of an unfocused item and be positioned so that's top is below the bottom of the screen. The remaining seven rectangles would define the rectangular regions of the onscreen items. Suppose the design calls for the focus item to be centered vertically at the center of the screen. To do that, you would specify the 5th rectangle to be larger than the other eight and position it so that it is centered vertically, you would specify the remaining rectangles to form a column of rectangular regions where the top three and bottom three visible items would be located.\n\nThe second step of setting up this use case would be to implement an RSG component that will be used to render each item. The TargetGroup node manages the creation of the items for the visible components, associates each with a ContentNode, and updates fields of the item component with information such as the current width and height of the item and the focus status of the item.\n\nThe TargetGroup's jumpToItem field is set to identify which content item is to be located at the TargetSet's targetRects field target rectangle identified by the TargetSet's focusindex field.\n\nThe final step of setting up this use case would be to create a VerticalList component that extends TargetGroup, sets up the TargetGroup's TargetSet node, and as the user presses up and down buttons on the remote, sets the TargetGroup's animateToTargetItem field to the prior or next index. Setting the animateToTargetItem field causes the displayed items to smoothly animate from their current target region to another target region, such that the specified index ends up at the TargetSet's target rectangle that is identified by the TargetSet's focusIndex field.\n\nThe above use case specifies the most common use case for the TargetGroup node, but only hints at the possible uses. For example, you could create your own RSG components with various custom behaviors. There might include:\n\n* A list where all the items are small when the list does not have the focus, but when the list receives the focus, all of the items smoothly adjust their size and position so that the focus item is largest, the items on either side of the focus item are slightly larger than the unfocused size and the remaining items remain the same size as the unfocused items. To do this, you would create two TargetSet's in your RSG component, one that defines the regions when the list is unfocused and one that defines the regions when the list is focused. Initially, the TargetGroup's targetSet field would be set to the unfocused TargetSet node. Then, when the list is focused, the targetSet's animateToTargetSet field would be set to the focused TargetSet node, causing all of the target regions to smoothly animate to their new size and position, taking along the associated item component's with them.\n* A horizontal scrolling list of items where the focused region floats across the screen as the user presses left/right until the focus region reaches the edge of the display, at which point the focus region remains stationary and the items scroll left or right. This would require the use of several TargetSet nodes (one for each possible position of the focus region). Initally, the TargetGroup's targetSet field would be set to one of these TargetSet's. Then while the focus region is not at one of the edges, key presses would set the animateToTargetSet field to animate the focus region to its next location. Once the focus region reaches an edge, another key press in the same direction would set the animateToTargetIndex field to cause the items to scroll so that the next content item occupies the focus region.\n* A list where when an item is selected, all of the items fly off the screen while the selected item zooms up and moves to the center of the screen. To set up this use case, you would specify a TargetSet for when the list items are onscreen and another TargetSet for the onscreen location of the focused item and the offscreen locations where each items will disappear.\n* A circular arrangement of a fixed number of items with the item at the 6 o'clock position being larger and having the focus. Note that in this case, no offscreen targets would be specified.",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "WRITE\\_ONLY",
+ "default": "0",
+ "description": "When set to a valid item index, causes the group to quickly scroll so that the specified index moves into the to the target region specified by the TargetSet's focusIndex",
+ "name": "animateToItem",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "WRITE\\_ONLY",
+ "default": "invalid",
+ "description": "When set to a valid TargetSet, causes the group to quickly animate so that the target regions of the initial TargetSet node are smoothly interpolated to the corresponding target regions of the new TargetSet node. If the two TargetSet's focusIndex fields are different, the focusIndex is also animated from the old to the new value",
+ "name": "animateToTargetSet",
+ "type": "TargetSet"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "none",
+ "description": "Specifies the content for the group. See \\[Data Bindings\\](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/targetgroup.mddata-bindings \"Data Bindings\") below for more details",
+ "name": "content",
+ "type": "ContentNode"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "\\-1.0",
+ "description": "As the TargetGroup animation occurs, this field is constantly updated to represent the index of the ContentNode currently occupying the focus target region. When currFocusItemIndex is an integer value, the specified ContentNode occupies the focus target. When currFocusItemIndex has a fractional part, the value indicates that an animation is in process. For example, a value of 5.7 would indicate that items 5 and 6 are currently overlapping the focus region, with item 6 occupying 70% and item 5 the other 30%",
+ "name": "currFocusItemIndex",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "invalid",
+ "description": "As the TargetGroup animation occurs that is initiated by setting the animateToTargetSet field, currTargetSet contains the current values of the target regions as the animation proceeds from the initial TargetSet's targets to the new TargetSet's targets",
+ "name": "currTargetSet",
+ "type": "TargetSet"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0",
+ "description": "For TargetSet's that do not specify a focusIndex, this value will be used as the index of the TargetSet where the focused item is located. If a TargetSet specifies any value for the focusIndex, that value will be used instead of defaultTargetSetFocusIndex",
+ "name": "defaultTargetSetFocusIndex",
+ "type": "int"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0.3 seconds",
+ "description": "Specifies the time, in seconds, to perform the animation when the animateToItem or animateToTargetSet fields are set",
+ "name": "duration",
+ "type": "Time"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "",
+ "description": "Specifies the name of a XML component for the group items. An instance of this component is created on demand for each visible item of the group. The XML component must define a specific interface as detailed in \\[TargetGroup XML Component\\](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/targetgroup.mdtargetgroup-xml-component \"TargetGroup XML Component\") below",
+ "name": "itemComponentName",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "0",
+ "description": "When a group item gains the key focus, set to the index of the focused item",
+ "name": "itemFocused",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "0",
+ "description": "When a group item is selected, set to the index of the selected item",
+ "name": "itemSelected",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "0",
+ "description": "When a group item loses the key focus, set to the index of the unfocused item",
+ "name": "itemUnfocused",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "WRITE\\_ONLY",
+ "default": "0",
+ "description": "When set to a valid item index, causes the group to immediately update so that the specified index moves to the target region specified by the TargetSet's focusIndex",
+ "name": "jumpToItem",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "Specifies whether the current target rectangles (as defined in the read-only currTargetSet field's TargetSet) are drawn or not. Typically this would only be set to true while debugging a channel, although in some use cases its possible that you might want to display the current target rectangles. The rectangles are drawn using the color in the targetSet's TargetSet node's color field",
+ "name": "showTargetRects",
+ "type": "Boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "invalid",
+ "description": "Specifies the TargetSet to use to define the target regions of the items in the group. When set or modified, the target regions are immediately adjusted to use the new values",
+ "name": "targetSet",
+ "type": "TargetSet"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "Specifies whether the content items wraparound at the end of the TargetGroup to fill all of the targets rectangles",
+ "name": "wrap",
+ "type": "Boolean"
+ }
+ ],
+ "interfaces": [],
+ "name": "TargetGroup",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/targetgroup.md"
+ },
+ "targetlist": {
+ "description": "Extends [**TargetGroup**](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/targetgroup.md\n\nThe TargetList node class adds useful functionality to the TargetGroup node by making is easy to set up lists and rows of items with limited amounts of scripting required. In particular, TargetList provides a built-in focused/unfocused transition, as well as a simple way to implement various focus management policies (i.e. fixed focus, floating focus, etc.). It also provides default key handling for navigating the list or row.",
+ "events": [],
+ "extends": {
+ "name": "TargetGroup",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/targetgroup.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"down\"",
+ "description": "Specifies which remote button will move the focus forward. For vertical lists, this will typically be set to \"down\". For horizontal rows, this will typically be set to \"right\".",
+ "name": "advanceKey",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "Specifies one or more TargetSet's to be used when the TargetList has the focus. If a single TargetSet is specified, focus will stay fixed on the targetRect of that TargetSet that corresponds to the TargetGroup's focus index. The focus index will come from the TargetSet if explicitly specified or from the TargetGroup's defaultTargetSetFocusIndex field if not. If focusedTargetSet includes more than one TargetSet node, that defines a sequence of TargetSet's that will be advanced through as the user presses the advance or reverse key. When advancing, the focus floats from one TargetSet's to the next TargetSet in the array until the last element of the focusedTargetSet is reached, at which point the focus is fixed to the last element and the items begin to scroll. When reversing, the focus floats from one TargetSet to the previous TargetSet in the array until the first element of the focusedTargetSet is reached, at which point the focus is fixed to the first element and the items begin to scroll. See above for more discussion of setting up fixed and floating focus use cases.",
+ "name": "focusedTargetSet",
+ "type": "array of TargetSet nodes"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"up\"",
+ "description": "Specifies which remote button will move the focus backward. For vertical lists, this will typically be set to \"up\". For horizontal rows, this will typically be set to \"left\".",
+ "name": "reverseKey",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "invalid",
+ "description": "Specifies the TargetSet to be used when the TargetList does not have the focus.",
+ "name": "unfocusedTargetSet",
+ "type": "TargetSet"
+ }
+ ],
+ "interfaces": [],
+ "name": "TargetList",
+ "url": "https://developer.roku.com/docs/references/scenegraph/list-and-grid-nodes/targetlist.md"
+ },
+ "targetset": {
+ "description": "Extends [**Node**](https://developer.roku.com/docs/references/scenegraph/node.md\n\nThe TargetSet node class is used to specify a set of target regions where items in a [TargetGroup](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/targetgroup.md node are rendered. This information includes an array of rectangles that is used to define the location and size of a region that will be occupied by an item in the TargetGroup as well as an optional index that identifies one rectangle in the array to be treated as the region where the item with focus is located.",
+ "events": [],
+ "extends": {
+ "name": "Node",
+ "url": "https://developer.roku.com/docs/references/scenegraph/node.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0xFFFFFF80",
+ "description": "If the TargetGroup using this TargetSet has its showTargetRects field set to true, the target rectangles of the current TargetSet will be drawn using the specified color. Drawing the TargetSet's target rectangles is generally only done when debugging an application.",
+ "name": "color",
+ "type": "Color"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\-1",
+ "description": "Identifies the index of an element of the targetRects array that will be treated as the region occupied by the focus item. The default of of -1 indicates that the TargetGroup's current focus index will not be changed when the TargetGroup is set to use the TargetSet to define its target regions.",
+ "name": "focusIndex",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "Specifies an array of rectangles that define the target regions used by a TargetGroup node. To specify a rectangle, you can either specify a associative array with x, y, width and height elements or an array of 4 numeric values. For example, you could specify an array of two rectangles like this: \\\\\\[ \\\\\\[ x:10, y:5, width: 200, height:150 \\\\\\], \\\\\\[ x:10, y:160, width: 200, height:150 \\\\\\] \\\\\\] Alternately, you could specify the same array like this: \\\\\\[ \\\\\\[ 10, 5, 200, 150 \\\\\\], \\\\\\[ 10, 160, 200, 150 \\\\\\] \\\\\\]",
+ "name": "targetRects",
+ "type": "array of rectangles"
+ }
+ ],
+ "interfaces": [],
+ "name": "TargetSet",
+ "url": "https://developer.roku.com/docs/references/scenegraph/list-and-grid-nodes/targetset.md"
+ },
+ "task": {
+ "description": "Extends [**Node**](https://developer.roku.com/docs/references/scenegraph/node.md\n\nThe Task node class allows you to specify a function to be spawned in a different thread, and run asynchronously with respect to both the scene rendering thread and the main application thread. A Task node also allows you to run functions that cannot be run in SceneGraph node or component, typically BrightScript code functions involving operations such as reading data from servers and file system manipulation. (You also cannot, and should not, run functions in a SceneGraph application for operations that are functionally the same as SceneGraph nodes and components, such as playing videos.) A list of all the BrightScript functions and components that cannot be used in SceneGraph applications or can only be used in a Task node can be found in [BrightScript Support](/docs/developer-program/core-concepts/scenegraph-brightscript/brightscript-support.md \"BrightScript Support\").\n\nA Task node is typically used to read data from a server to create a ContentNode node to configure a SceneGraph node or component (see [ContentNode](https://developer.roku.com/docs/references/scenegraph/control-nodes/contentnode.md\"ContentNode\")). A Task node used for this purpose can be thought of as a content reader. Since ContentNode nodes are required to configure many components rendered in a scene, such as lists, panels, and grids, and you will generally want to read the data for those types of nodes from your server, you should create a Task node as a content reader for each of those components that you use in your scene.\n\nThe Task node class was designed with three general development use cases:\n\n* A new Task node object is created for each asynchronous operation. The input data needed for the operation is set in the Task node object [](https://developer.roku.com/docs/references/scenegraph/xml-elements/interface.md\"\") fields in the render thread, along with an observer of the output field data, and the Task node control field is set to RUN. After the output data is returned to the render thread, the Task node object is not used again.\n* A Task node object is used multiple times for several identical asynchronous operations. In this case, the input data for each operation is set in the existing Task node object, with another observer for the output field data, and the Task node control field is again set to RUN. This may be more efficient than creating a new Task node object for each of the identical operations.\n* A Task node observes its input fields using the port form of the ifSGNodeField [observeField()](https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodefield.mdobservefieldfieldname-as-string-functionname-as-string-as-boolean \"observeField()\") method, and returns output data with each field change. In this case, the Task node acts like a continuous server.\n\nSince Task nodes launch asynchronous threads, and have no provisions for locks and mutexes, you must be careful to avoid race, deadlock, and other asynchronous thread errors. Here are a few tips for using Task nodes:\n\n* Avoid accessing files which must be persistent before thread completion, to avoid a subsequent Task node or other thread access of the same file before the thread completes. It is easier and safer to use a dynamically-created string or other data object to hold temporary thread data to avoid having a subsequent or existing thread overwrite and corrupt the data.\n* Be very careful if you access any object in a Task node that may exist in another thread. It is better to completely separate all objects in any other possible thread from the Task node thread by setting the fields of the Task node with copies of the minimum amount of data needed to run the thread.\n* In the Task node init() function, perform the minimum required amount of initialization of the Task node and any included thread functions. If you intend to trigger an asynchronous task based on a Task node input field change, in many cases, you should only set up the observer for the field in init().\n* Use the port form of the ifSGNodeField [observeField()](https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodefield.mdobservefieldfieldname-as-string-functionname-as-string-as-boolean \"observeField()\") rather than the onChange attribute. This will avoid triggering the thread in response to a render thread event before the Task node observers are set up.\n* It is more efficient to use a persistent Task node that is triggered by an field change than to create a new Task node every time a particular asynchronous thread is required. If needed, you can communicate that the particular asynchronous thread is no longer required through an field as well, either through the triggering field, or a special field used for control of the Task node.\n* You can use a single Task node object to run any number of different asynchronous threads by setting the functionName field to the Task node function you want before setting the control field to RUN. If you do not use the input data fields to trigger running the thread, this is equivalent to calling an asynchronous function, and passing the input data fields as arguments to the function. The output data fields can likewise be considered as the return value of a asynchronous function call, but to avoid blocking you must observe the fields, or the state field, as a callback event to handle the results in the calling thread.\n\nAlso review \"[SceneGraph threads](/docs/developer-program/core-concepts/threads.md \"SceneGraph\")\" for in-depth information on using Task nodes most efficiently.",
+ "events": [],
+ "extends": {
+ "name": "Node",
+ "url": "https://developer.roku.com/docs/references/scenegraph/node.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "WRITE\\_ONLY",
+ "default": "init",
+ "description": "Requests a change in the run state of the spawned task. The valid options are the same as for the state field, but case-insensitive (i.e. can set \"RUN\" or \"run\")",
+ "name": "control",
+ "type": "option string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "The name of the function in the Task node component to be executed when the state field changes to RUN. The function must be declared within the scope of the Task node component",
+ "name": "functionName",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "init",
+ "description": "Inquires about the run state of the spawned task. Note that the values are in lowercase: \"init\", \"stop\", \"run\", \"done\"",
+ "name": "state",
+ "type": "value string"
+ }
+ ],
+ "interfaces": [],
+ "name": "Task",
+ "url": "https://developer.roku.com/docs/references/scenegraph/control-nodes/task.md"
+ },
+ "texteditbox": {
+ "description": "Extends [**Group**](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md\"**Group**\")\n\nThe **TextEditBox** node class is intended to display a string of characters as they are typed. When focused, it displays a flashing cursor to indicate the text insertion position.\n\n**TextEditBox** nodes are automatically included in the [**Keyboard**](https://developer.roku.com/docs/references/scenegraph/widget-nodes/keyboard.md\"**Keyboard**\") and [**MiniKeyboard**](https://developer.roku.com/docs/references/scenegraph/widget-nodes/minikeyboard.md\"**MiniKeyboard**\") node classes.\n\nThe default appearance of the **TextEditBox** is very transparent, allowing it to pick up most of its color from what is rendered underneath it. The appearance can be customized by changing the backgroundUri and other fields.",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "Read-Write",
+ "default": "false",
+ "description": "When active is set to true, the cursor is displayed. When set to false, the cursor is hidden. When used internal to the \\*\\*Keyboard\\*\\* and \\*\\*MiniKeyboard\\*\\* nodes, those nodes set this field to true when the keyboard has focus, and false when it does not.",
+ "name": "active",
+ "type": "boolean"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "\"\"",
+ "description": "Specifies the URI of the image rendered as the background of the \\*\\*TextEditBox\\*\\* node.",
+ "name": "backgroundUri",
+ "type": "string"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "true",
+ "description": "When clearOnDownKey is set to true, the textEditBox erases all the characters when down key is pressed (focus does not move down). When set to false, the characters are not erased and focus moves down.",
+ "name": "clearOnDownKey",
+ "type": "boolean"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "0",
+ "description": "By default, this is set to the length of the text field, indicating that the next character to be entered should be appended at the end of the string. When used internal to the \\*\\*Keyboard\\*\\* and \\*\\*MiniKeyboard\\*\\* nodes, those nodes use this field to move the text insertion point.",
+ "name": "cursorPosition",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "\"\"",
+ "description": "Specifies a string to be displayed if the length of the text field string is zero. The typical usage of this field is to prompt the user about what to enter (such as, \"Enter your WiFi password\").",
+ "name": "hintText",
+ "type": "string"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "0xffffffff",
+ "description": "Specifies the color of the hint text string.",
+ "name": "hintTextColor",
+ "type": "color"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "15",
+ "description": "Specifies the maximum length of the string that can be displayed. When used internal to the \\*\\*Keyboard\\*\\* node, maxTextLength is initialized to 75. When used in the \\*\\*MiniKeyboard\\*\\* node, maxTextLength is initialized to 25.",
+ "name": "maxTextLength",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "false",
+ "description": "When set to true, the characters entered are briefly displayed, then replaced with an asterisk. When set to false, the characters entered are always displayed. When used internal to the \\*\\*Keyboard\\*\\* and \\*\\*MiniKeyboard\\*\\* nodes, you can access the keyboard \\*\\*textEditBox\\*\\* field to set its secureMode field. For example: \\`myKeyboard.textEditBox.secureMode = true\\`",
+ "name": "secureMode",
+ "type": "boolean"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "\"\"",
+ "description": "Contains the string of characters being displayed.",
+ "name": "text",
+ "type": "string"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "0xffffffff",
+ "description": "Specifies the color of the text string displayed.",
+ "name": "textColor",
+ "type": "color"
+ },
+ {
+ "accessPermission": "Read-Write",
+ "default": "\\-1.0",
+ "description": "Specifies the width of the \\*\\*TextEditBox\\*\\* node. When used internal to the \\*\\*Keyboard\\*\\* and \\*\\*MiniKeyboard\\*\\* nodes, those nodes set this field to match the width of the keyboard.",
+ "name": "width",
+ "type": "float"
+ }
+ ],
+ "interfaces": [],
+ "name": "TextEditBox",
+ "url": "https://developer.roku.com/docs/references/scenegraph/widget-nodes/texteditbox.md"
+ },
+ "timegrid": {
+ "description": "OTT providers can use the TimeGrid node to implement an Electronic Program Guide (EPG) in their channels. In an EPG, channels are represented as horizontal rows, one for each channel. Each row has a channel name on the left, and a set of programs airing on that channel to the right. The size of each program depends on its duration. One of these programs has a remote control focus highlight indicator on it, and this highlight can be moved around using the remote control (as long as the TimeGrid node has remote control focus).\n\nThe TimeGrid node also features an alternative Now/Next view that lists only the programs currently airing and airing next, with their respective start times. See [Now/Next mode](https://developer.roku.com/docs/references/scenegraph/list-and-grid-nodes/timegrid.mdnownext-mode) for more information.\n\n![time grid](https://image.roku.com/ZHZscHItMTc2/epg-standard.jpg \"time grid\")",
+ "events": [],
+ "fields": [],
+ "interfaces": [],
+ "name": "TimeGrid",
+ "url": "https://developer.roku.com/docs/references/scenegraph/list-and-grid-nodes/timegrid.md"
+ },
+ "timer": {
+ "description": "Extends [**Node**](https://developer.roku.com/docs/references/scenegraph/node.md\n\nThe Timer node class generates an observable event after a specified amount of time has elapsed.",
+ "events": [],
+ "extends": {
+ "name": "Node",
+ "url": "https://developer.roku.com/docs/references/scenegraph/node.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "none",
+ "description": "Used to control the operation of the Timer node. Recognized values include:\n\n| Value | Effect |\n| --- | --- |\n| none | No effect |\n| start | Starts the **Timer** node operation |\n| stop | Stops a running **Timer** node |",
+ "name": "control",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "1",
+ "description": "Specifies the time in seconds before the Timer node fires after the control field value is set to start. To specify time values down to millisecond granularity, use a float type (0.001 equals one millisecond)",
+ "name": "duration",
+ "type": "time"
+ },
+ {
+ "accessPermission": "OBSERVE\\_ONLY",
+ "default": "N/A",
+ "description": "Triggers observer callback functions when the Timer node fires. Please note that the timer observer callback executes on the render thread",
+ "name": "fire",
+ "type": "Event"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "If set to true, the Timer node fires repeatedly, each time the specified duration field value elapses. If set to false, the Timer node only fires once until restarted",
+ "name": "repeat",
+ "type": "Boolean"
+ }
+ ],
+ "interfaces": [],
+ "name": "Timer",
+ "url": "https://developer.roku.com/docs/references/scenegraph/control-nodes/timer.md"
+ },
+ "vector2dfieldinterpolator": {
+ "description": "Extends [**Node**](https://developer.roku.com/docs/references/scenegraph/node.md\n\nVector2DFieldInterpolator specifies a keyframe animation sequence to be applied to a pair Vector2D field of a node. Most typically, this is used to animate the (x,y) coordinates of a node's translation field.\n\nAll field interpolators include a set of key/keyValue pairs that define a keyframe of the animation. Field interpolators are generally used as children of an Animation node. As the animation progresses, it sets the fraction field of its field interpolators to a value between 0 and 1, indicating the percentage of the Animation's progress. The keyframes of the interpolator include a \"key\", the percentage where the keyframe should occur, and a \"keyValue\", the value that the field should have at that percentage.\n\nFor example, if a Vector2DFieldInterpolator had three keyframes, (0.0, \\[0.0, 0.0\\]), (0.4, \\[500.0, 0.0\\]) and (1.0, \\[500, 200.0\\]), then when the interpolator's fraction field was 0.0 (i.e. 0%), the field would be set to \\[0.0, 0.0\\]. When fraction was 0.4 (i.e. 40%), the field would be set to \\[500.0, 0.0\\]. When fraction was 1.0 (i.e. 100%), the field would be set to \\[500.0, 200.0\\].\n\nFor values of fraction between 0.0 and 0.4 (e.g. 0.2 or 20%), the field value is determined by linearly interpolating the keyValues for the first two keyframes. In this case, since the key of 0.2 is halfway between the key at 0.0 and the key at 0.4, the field would be set to \\[250.0, 0.0\\] (halfway between the point \\[0.0, 0.0\\] and \\[200.0, 0.0\\]. Similarly, when fraction is between the second and third keys (i.e. between 0.4 and 1.0), the field value is determined by linearly interpolating the keyValues of the second and third keyframes.\n\nFor this example, if the field being interpolated were the translation field of a Poster node parented to the Scene node, the Poster would originally be positioned with its top/left corner at the upper, left corner of the screen. As the animation proceeded from 0% to 40% complete, the Poster would slide horizontally to the right until it's top/left corner was at x=500.0, y=0.0. As the animation continued from 40% to 100% complete, the Poster would slide vertically down until its top/left corner was at x=500.0, y=200.0.\n\nIf the first keyframe has a key percentage greater than zero, then the field value will be equal to the keyValue of the first keyframe until fraction reaches the first keyframe's key percentage. Similarly, if the last keyframe has a key percentage less than one, the field value will be set to the keyValue of the last keyframe from when fraction equals the the last keyframe's key percentage and will not change as fraction increases from that value to 1.0.\n\n> While linearly interpolation is used to compute the keyValue's for fraction values between successive keys, non-linear easing functions may be applied to the fraction values computed by the Animation node, so the overall animation may vary in speed.",
+ "events": [],
+ "extends": {
+ "name": "Node",
+ "url": "https://developer.roku.com/docs/references/scenegraph/node.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"\"",
+ "description": "Specifies the field to interpolate. The string should contain the ID of a node in the scene and the name of a field of that node, separated by a dot \".\". For example, \"title.width\" would indicate that the interpolator should be applied to the width field of a node whose id field was \"title\". The specified field must be of type float",
+ "name": "fieldToInterp",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "0.0",
+ "description": "Specifies the percentage to be used to compute a value for the field",
+ "name": "fraction",
+ "type": "float"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "Specifies the key percentages for the interpolator's keyframes. Each key percentage should be a unique value from 0 to 1 indicating the percentage of the animation where the keyValue should occur. Behavior is undefined if the number of values in the key field does not match the number of values in the keyValue field",
+ "name": "key",
+ "type": "array of float's"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\[ \\]",
+ "description": "Specifies the key values or the interpolator's keyframes. Each value in the keyValue array corresponds to a value in the key field's array. The interpolator's behavior is undefined if the number of values in the key field does not match the number of values in the keyValue field",
+ "name": "keyValue",
+ "type": "array of float's"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "Enables animation to be played in reverse.",
+ "name": "reverse",
+ "type": "boolean"
+ }
+ ],
+ "interfaces": [],
+ "name": "Vector2DFieldInterpolator",
+ "url": "https://developer.roku.com/docs/references/scenegraph/animation-nodes/vector2dfieldinterpolator.md"
+ },
+ "video": {
+ "description": "Extends [**Group**](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md\n\nThe Video node class provides a controlled play of live or VOD video.\n\nThe Video node includes a wide variety of internal nodes to support trick play, playback buffering indicators, and so forth. Playback buffering indicators, to indicate buffering before initial playback as well as re-buffering, use an internal instance of a ProgressBar node. For trick play, an internal instance of a TrickPlayBar node is provided. For display of BIF images for DVD-like chapter selection, an internal instance of a BIFDisplay node is provided.\n\nStarting from Roku OS 8, the behavior of the Roku system overlay is such that the system overlay now slides in whenever the \\* button is pressed, the Video node is in focus, and the app does not have its OnKeyEvent() handler fired. When the Video node is not in focus, the system overlay does not slide in and the OnKeyEvent() handler is fired.",
+ "events": [],
+ "extends": {
+ "name": "Group",
+ "url": "https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "NULL",
+ "description": "The ContentNode node with the \\[Content Meta-Data\\](/docs/developer-program/getting-started/architecture/content-metadata.md) for the video, or a video playlist (a sequence of videos) to be played. If a video playlist is to be played, the children of this ContentNode node comprise the playlist, and each ContentNode child must have all attributes required to play that video. For example, if the videos \"A\" and \"B\" are to be played, three ContentNode nodes must be created: the parent ContentNode (which is largely ignored), one ContentNode child for \"A,\" and one ContentNode child for \"B.\" The parent node is set into this content field, and when video playback is started, all of its children will be played in sequence. Any changes made to the playlist after playback has started are ignored. See the \\`contentIsPlaylist\\` and \\`contentIndex\\` fields, for more information on playlists.",
+ "name": "content",
+ "type": "ContentNode"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "\\-1",
+ "description": "The index of the video in the video playlist that is currently playing. Generally, you would only want to check this field if video playlists are enabled (by setting the \\`contentIsPlaylist\\` field to true), but it is set to 0 when a single video is playing, and video playlists are not enabled.",
+ "name": "contentIndex",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "If set to true, enables video playlists (a sequence of videos to be played). See the \\`content\\` and \\`contentIndex\\` field for more information on playlists.",
+ "name": "contentIsPlaylist",
+ "type": "Boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "none",
+ "description": "Sets the desired play state for the video, such as starting or stopping the video play. Getting the value of this field returns the most recent value set, or none if no value has been set. To dynamically monitor the actual state of the video, see the \\`state\\` field. The play and stop commands to commence and discontinue playback should not be used to implement trick modes like rewind, or replay. For that use the \\`seek\\` field.\n\n| Option | Effect |\n| --- | --- |\n| none | No play state set |\n| play | Start video play |\n| stop | Stop video play |\n| pause | Pause video play |\n| resume | Resume video play after a pause |\n| replay | Replay video |\n| prebuffer | Starts buffering the video stream before the Video node actually begins playback. Only one video stream can be buffering in the application at any time. Setting the `control` field to `prebuffer` for another video stream after setting `prebuffer` for a previous video stream stops the buffering of the previous video stream. |\n| skipcontent | Skip the currently-playing content and begin playing the next content in the playlist. If the content is not a playlist, or if the current content is the end of the playlist, this will end playback. |",
+ "name": "control",
+ "type": "option string"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "0",
+ "description": "The error code associated with the video play error set in the \\`state\\` field. Use the \\*\\*errorStr\\*\\* and and \\*\\*errorInfo\\*\\* fields for more descriptive diagnostic information to help identify and resolve the cause of the error.",
+ "name": "errorCode",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ-ONLY",
+ "default": "",
+ "description": "A diagnostic message to help resolve the video play error set in the \\`state\\` field. The roAssociativeArray contains the following fields:\n\n| Field | Type | Description |\n| --- | --- | --- |\n| clip\\_id | integer | The unique ID for the clip |\n| ignored | integer | Indicates whether the error generated an exception (0) or was ignored resulting in the next item in the content list being played (1). |\n| source | string | The module that generated the error. |\n| category | String | The type of error, which includes: \"http\", \"drm\", \"mediaerror\", or \"mediaplayer\". |\n| error\\_code | integer | The internal Roku code associated with the error. Use the **dbgmsg** field for debugging. |\n| dbgmsg | string | A verbose debug message that can help identify the root cause of the error. |\n| error\\_attributes | string | The error attribute, which includes the clip\\_id (the unique ID of the clip that failed to play). |",
+ "name": "errorInfo",
+ "type": "roAssociativeArray"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "",
+ "description": "An error message describing the video play error set in the \\`state\\` field. Use the \\*\\*errorStr\\*\\* and and \\*\\*errorInfo\\*\\* fields for more descriptive diagnostic information to help identify and resolve the cause of the error.",
+ "name": "errorMsg",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ-ONLY",
+ "default": "",
+ "description": "A diagnostic message to help resolve the video play error set in the \\`state\\` field. The format of the errorStr is as follows: category:{category\\\\\\_name}:error:{error\\\\\\_code}:ignored:{0|1}:{source}:{source\\\\\\_name}:{additional catcher comment}:{error\\\\\\_string}:extra:{error\\\\\\_attributes}\n\n| errorStr Field | Type | Description |\n| --- | --- | --- |\n| category\\_name | string | The type of error, which includes: \"http\", \"drm\", \"mediaerror\", or \"mediaplayer\". |\n| error\\_code | integer | The unique code associated with the error. |\n| ignored | integer | Indicates whether the error generated an exception (0) or was ignored resulting in the next item in the content list being played (1). |\n| source | string | The module that generated the error. |\n| source\\_name | string | The module that generated the error. |\n| additional catcher comment | string | Typically, the comment added when the exception is caught. |\n| error\\_string | string | A text message describing the video play error. |\n| error\\_attributes | string | The error attribute, which includes the clip\\_id (the unique ID of the clip that failed to play). |",
+ "name": "errorStr",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_ONL",
+ "default": "",
+ "description": "Indicates whether the DRM license was acquired. If a failure occurs, this field provides additional details about the error. The roAssociativeArray contains the following fields:\n\n| Key | Type | Value |\n| --- | --- | --- |\n| response | string | The server response. If a license is not retrieved, the response is empty and the HTTP response code is returned instead. |\n| status | string | The HTTP response code. |\n| keysystem | string | The DRM technology used. |\n| duration | string | The total time elapsed in sending a request to the license server and receiving a response (in milliseconds). |",
+ "name": "licenseStatus",
+ "type": "roAssociativeArray"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\\-1",
+ "description": "If the \\`contentIsPlaylist\\` field is set to true to enable video playlists, sets the index of the next video in the playlist to be played. Setting this field does not immediately change the video being played, but takes effect when the current video is completed or skipped. By default, this value is -1, which performs the default index increment operation. After the video specified by the index in this field begins playing, the field is set to the default -1 again, so the next video played will be set by the default index increment operation unless the field is set again to a different index.",
+ "name": "nextContentIndex",
+ "type": "integer"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "",
+ "description": "Provides timing measurements related to the start of video playback. All measurements are in seconds. The roAssociativeArray contains the following fields:\n\n| Field | Type | Access Permission | Description |\n| --- | --- | --- | --- |\n| total\\_dur | float | READ\\_ONLY | Total video start duration. |\n| manifest\\_dur | float | READ\\_ONLY | Manifest download and parsing. |\n| drm\\_load\\_dur | float | READ\\_ONLY | DRM system initialization. |\n| drm\\_lic\\_acq\\_dur | float | READ\\_ONLY | License acquisition. This typically includes interactions with the license server. |\n| prebuf\\_dur | float | READ\\_ONLY | Prebuffer content. |\n| manifest\\_start (_Available since Roku OS 10.0_) | Float | READ\\_ONLY | Point at which manifest download and parsing begins. |\n| drm\\_load\\_start (_Available since Roku OS 10.0_) | Float | READ\\_ONLY | Point at which DRM system initialization begins. |\n| drm\\_lic\\_acq\\_start (_Available since Roku OS 10.0_) | Float | READ\\_ONLY | Point at which license acquisition begins. |\n| prebuf\\_start (_Available since Roku OS 10.0_) | Float | READ\\_ONLY | Point at which content pre-buffering begins. |\n\n\\> The \\\\\\_start fields correspond to the similarly named \\\\\\_dur (duration) fields in this structure. In each case, the \\\\\\_start point is the number of milliseconds elapsed from the initialization of the media player (t=0.000). If required, ending points for each interval can be derived from its associated starting-point and duration.",
+ "name": "playStartInfo _Available since Roku OS 9.3_",
+ "type": "roAssociativeArray"
+ },
+ {
+ "accessPermission": "READ\\_ONLY",
+ "default": "none",
+ "description": "Describes the current video play state, such as if the video play has been paused.\n\n| Value | Meaning |\n| --- | --- |\n| none | No current play state |\n| buffering | Video stream is currently buffering |\n| playing | Video is currently playing |\n| paused | Video is currently paused |\n| stopped | Video is currently stopped |\n| finished | Video has successfully completed playback |\n| error | An error has occurred in the video play. The error code, message, and diagnostics can be found in the `errorCode`, `errorMsg`, and `errorStr` fields respectively. |",
+ "name": "state",
+ "type": "value string"
+ }
+ ],
+ "interfaces": [],
+ "name": "Video",
+ "url": "https://developer.roku.com/docs/references/scenegraph/media-playback-nodes/video.md"
+ },
+ "voicetexteditbox": {
+ "availableSince": "9.4",
+ "description": "_Available since Roku OS 9.4_\n\nExtends [TextEditBox](https://developer.roku.com/docs/references/scenegraph/widget-nodes/texteditbox.md\n\nThe **VoiceTextEditBox** node is similar to the [legacy **TextEditBox** node](https://developer.roku.com/docs/references/scenegraph/widget-nodes/texteditbox.md, but with additional voice entry functionality. Only one voice-enabled **VoiceTextEditBox** node may be on the screen at a time. If another VoiceTextEditBox is rendered on the screen, its voice functionality is disabled implicitly.",
+ "events": [],
+ "extends": {
+ "name": "TextEditBox",
+ "url": "https://developer.roku.com/docs/references/scenegraph/widget-nodes/texteditbox.md"
+ },
+ "fields": [
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "The direction in which the voice hint tooltip points: \\* true. The voice hint tooltip points right. \\* false. The voice hint tooltip points left.",
+ "name": "flipVoiceToolTip",
+ "type": "boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "false",
+ "description": "Enables the text box to be voice-enabled. In this case, it will display a mic icon and have a voice UI with voice hints.",
+ "name": "voiceEnabled",
+ "type": "boolean"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "\"generic\"",
+ "description": "The type of voice entry mode to be used: \\* \"email\": letter-by-letter dictation for emails. \\* \"numeric\": letter-by-letter dictation for PIN codes, zip codes, and other numeric input. \\* \"alphanumeric\": letter-by-letter dication for street addresses or other sequences of numbers and letters. \\* \"generic\": Full word input for search queries or other sequences of numbers, letters and symbols. \\* \"password\": letter-by-letter dication for passwords.",
+ "name": "voiceEntryType",
+ "type": "string"
+ },
+ {
+ "accessPermission": "READ\\_WRITE",
+ "default": "FHD: 321HD: 214",
+ "description": "The maximum width of the voice hint tootip. The height scales based on the specified width.",
+ "name": "voiceToolTipWidth",
+ "type": "float"
+ }
+ ],
+ "interfaces": [],
+ "name": "VoiceTextEditBox",
+ "url": "https://developer.roku.com/docs/references/scenegraph/dynamic-voice-keyboard-nodes/voice-text-edit-box.md"
+ },
+ "zoomrowlist": {
+ "description": "Extends [**ArrayGrid**](https://developer.roku.com/docs/references/scenegraph/abstract-nodes/arraygrid.md\n\nThe ZoomRowList node allows a row of the Row-Row Grid to smoothly zoom up to a larger size when that row has focus. Rows in this node are capable of gaining the focus while scrolling, and smoothly zooming up by the specified amount. The amount to zoom can be specified on a per row basis so that some rows can zoom up by a larger amount than others.",
+ "events": [],
+ "extends": {
+ "name": "ArrayGrid",
+ "url": "https://developer.roku.com/docs/references/scenegraph/abstract-nodes/arraygrid.md"
+ },
+ "fields": [],
+ "interfaces": [],
+ "name": "ZoomRowList",
+ "url": "https://developer.roku.com/docs/references/scenegraph/list-and-grid-nodes/zoomrowlist.md"
+ }
+ },
+ "components": {
+ "roappinfo": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roAppInfo"
+ }
+ ],
+ "description": "roAppInfo retrieves the developer ID, which can be useful during development. It also retrieves manifest values, such as the title and version number, avoiding the need to parse the manifest file from BrightScript. This object is created with no parameters.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifAppInfo",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifappinfo.md"
+ }
+ ],
+ "name": "roAppInfo",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roappinfo.md"
+ },
+ "roappmanager": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roAppManager"
+ }
+ ],
+ "description": "The Application Manager APIs set application level attributes, which mostly affect the look-and-feel of the application. The use of screen styles gives each application a consistent look-and-feel, but it's often desirable to customize attributes such as colors, fonts, and logos for each application. Setting artwork and colors allows the developer to specify a theme for their application. If these values are not set, the application will use default values.\n\nThe table below describes each attribute and its values, the screen types to which it applies, and the Roku OS version in which the attribute was first supported. Unless otherwise indicated, an attribute is supported in all Roku OS versions after the one in which it was first supported.\n\nTo save space, the screen types in the table are specified by a two letter code:\n\n| Code | Screen Type |\n| --- | --- |\n| Co | roCodeRegistrationScreen |\n| Di | roMessageDialog, roOneLineDialog, roPinEntryDialog |\n| Gr | roGridScreen |\n| Ke | roKeyboardScreen |\n| Li | roListScreen |\n| Pa | roParagraphScreen |\n| Po | roPosterScreen |\n| Se | roSearchScreen |\n| Sp | roSpringboardScreen |\n| Te | roTextScreen |\n\nAll attribute values are strings. Numeric values are specified as decimal strings.\n\n| Attribute | Screen Types | Values | Example | Version |\n| --- | --- | --- | --- | --- |\n| BackgroundColor | Gr Li Pa Po Se Sp Te | HTML HEX Color Value | #E0DFDF | 1.0 |\n| BreadcrumbDelimiter | Gr Li Pa Po Se Sp Te | HTML HEX Color Value | #FF00FF | 1.0 |\n| BreadcrumbTextLeft | Gr Li Pa Po Se Sp Te | HTML HEX Color Value | #FF00FF | 1.0 |\n| BreadcrumbTextRight | Gr Li Pa Po Se Sp Te | HTML HEX Color Value | #FF00FF | 1.0 |\n| ButtonHighlightColor | Di Se Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| ButtonMenuHighlightText | Di Se Sp | HTML HEX Color Value | #0033FF | 1.0 |\n| ButtonMenuNormalOverlayText | Di Se Sp | HTML HEX Color Value | #B0B0B0 | 1.0 |\n| ButtonMenuNormalText | Di Se Sp | HTML HEX Color Value | #686868 | 1.0 |\n| ButtonNormalColor | Di Se Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| CounterSeparator | Gr Po | HTML HEX Color Value | #00FF00 | 2.7 |\n| CounterTextLeft | Gr Po | HTML HEX Color Value | #FF0000 | 2.7 |\n| CounterTextRight | Gr Po | HTML HEX Color Value | #0000FF | 2.7 |\n| DialogBodyText | Di | HTML HEX Color Value. Must be a grayscale value | #808080 | 3.1 |\n| DialogTitleText | Di | HTML HEX Color Value. Must be a grayscale value | #363636 | 3.1 |\n| EpisodeSynopsisText | Po | HTML HEX Color Value | #FF00FF | 1.0 |\n| FilterBannerActiveColor | Po | HTML HEX Color Value | #FF00FF | 1.0 |\n| FilterBannerActiveHD | Po | URL to set HD Filter Banner Active/Focus Highlighter | pkg:/images/Filter\\_ActiveHint\\_HD.png | 1.0 |\n| FilterBannerActiveSD | Po | URL to set SD Filter Banner Active/Focus Highlighter | pkg:/images/Filter\\_ActiveHint\\_SD43.png | 1.0 |\n| FilterBannerInactiveColor | Po | HTML HEX Color Value | #FF00FF | 1.0 |\n| FilterBannerInactiveHD | Po | URL to set HD Filter Banner Inactive Highlighter | pkg:/images/Filter\\_InactiveHint\\_HD.png | 1.0 |\n| FilterBannerInactiveSD | Po | URL to set SD Filter Banner Inactive Highlighter | pkg:/images/Filter\\_ActiveHint\\_SD43.png | 1.0 |\n| FilterBannerSideColor | Po | HTML HEX Color Value | #FF00FF | 1.0 |\n| FilterBannerSliceHD | Po | URL to set HD Filter Banner Background Image | pkg:/images/Filter\\_ActiveHint\\_HD.png | 1.0 |\n| FilterBannerSliceSD | Po | URL to set SD Filter Banner Background Image | pkg:/images/Filter\\_ActiveHint\\_SD43.png | 1.0 |\n| GridScreenBackgroundColor | Gr | HTML HEX Color Value Must be a grayscale value | #363636 | 2.7 |\n| GridScreenBorderOffsetHD | Gr | String representing point \"(x, y)\" that is the offset from the upper left corner of the focused HD image. Set to the negative width & height of border | (-25,-25) | 2.8 |\n| GridScreenBorderOffsetSD | Gr | String representing point \"(x, y)\" that is the offset from the upper left corner of the focused SD image. Set to the negative width & height of border | (-20,-20) | 2.8 |\n| GridScreenDescriptionDateColor | Gr | HTML HEX Color Value | #FF005B | 2.7 |\n| GridScreenDescriptionImageHD | Gr | URL to set HD Description callout background image on Grid | pkg:/images/Description\\_Background\\_HD.ng | 2.8 |\n| GridScreenDescriptionImageSD | Gr | URL to set SD Description callout background image on Grid | pkg:/images/Description\\_Background\\_SD43.ng | 2.8 |\n| GridScreenDescriptionOffsetHD | Gr | String representing point \"(x, y)\" that is the offset from the upper left corner of the focused HD image. Negative values have the description above and to the left of the focused image | (190,255) | 2.8 |\n| GridScreenDescriptionOffsetSD | Gr | String representing point \"(x, y)\" that is the offset from the upper left corner of the focused SD image. Negative values have the description above and to the left of the focused image | (125,170) | 2.8 |\n| GridScreenDescriptionRuntimeColor | Gr | HTML HEX Color Value | #5B005B | 2.7 |\n| GridScreenDescriptionSynopsisColor | Gr | HTML HEX Color Value | #606000 | 2.7 |\n| GridScreenDescriptionTitleColor | Gr | HTML HEX Color Value | #00FFFF | 2.7 |\n| GridScreenFocusBorderHD | Gr | URL to set HD Focus image on Active Grid Poster | pkg:/images/Border\\_16x9\\_HD.png | 2.8 |\n| GridScreenFocusBorderSD | Gr | URL to set SD Focus image on Active Grid Poster | pkg:/images/Border\\_16x9\\_SD43.png | 2.8 |\n| GridScreenListNameColor | Gr | HTML HEX Color Value. Must be a grayscale value | #FFFFFF | 2.7 |\n| GridScreenLogoHD | Gr | Logo formatted for display in the overhang | pkg:/images/gridlogoHD.png | 2.7 |\n| GridScreenLogoOffsetHD\\_X | Gr | Offset in pixels from the top-left origin of the display. Range 0 to 1280 | 592 | 2.7 |\n| GridScreenLogoOffsetHD\\_Y | Gr | Offset in pixels from the top-left origin of the display. Range 0 to 720 | 31 | 2.7 |\n| GridScreenLogoOffsetSD\\_X | Gr | Offset in pixels from the top-left origin of the display. Range 0 to 720 | 324 | 2.7 |\n| GridScreenLogoOffsetSD\\_Y | Gr | Offset in pixels from the top-left origin of the display. Range 0 to 480 | 21 | 2.7 |\n| GridScreenLogoSD | Gr | Logo formatted for display in the overhang | pkg:/images/gridlogoSD.png | 2.7 |\n| GridScreenMessageColor | Gr | HTML HEX Color Value. Must be a grayscale value | #808080 | 2.7 |\n| GridScreenOverhangHeightHD | Gr | The HD overhang height. Default: \"69\" | 75 | 2.8 |\n| GridScreenOverhangHeightSD | Gr | The SD overhang height. Default: \"49\" | 55 | 2.8 |\n| GridScreenOverhangSliceHD | Gr | URI for the overhang slice (thin piece of top of screen border) | pkg:/images/gridoverhangHD.png | 2.7 |\n| GridScreenOverhangSliceSD | Gr | URI for the overhang slice (thin piece of top of screen border) | pkg:/images/gridoverhangSD.png | 2.7 |\n| GridScreenRetrievingColor | Gr | HTML HEX Color Value. Must be a grayscale value | #CCCCCC | 2.7 |\n| ListItemHighlightHD | Gr Li Po | URL to set HD highlight image | pkg:/images/listitem\\_highlight\\_hd.png | 3.1 |\n| ListItemHighlightSD | Gr Li Po | URL to set SD highlight image | pkg:/images/listitem\\_highlight\\_sd.png | 3.1 |\n| ListItemHighlightText | Gr Li Po | HTML HEX Color Value | #CCCC00 | 3.1 |\n| ListItemText | Gr Li Po | HTML HEX Color Value | #CCCC00 | 3.1 |\n| ListScreenDescriptionText | Li | HTML HEX Color Value | #CCCC00 | 3.1 |\n| ListScreenTitleColor | Li | HTML HEX Color Value | #CC0000 | 3.1 |\n| OverhangPrimaryLogoHD | Co Ke Li Pa Po Se Sp Te | Small application logo formatted for display in overhang top left | pkg:/images/co\\_logo\\_sd.png | 1.0 |\n| OverhangPrimaryLogoOffsetHD\\_X | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films.Range 0 to 1280 | 25 | 1.0 |\n| OverhangPrimaryLogoOffsetHD\\_Y | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films.Range 0 to 720 | 50 | 1.0 |\n| OverhangPrimaryLogoOffsetSD\\_X | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films.Range 0 to 720 | 25 | 1.0 |\n| OverhangPrimaryLogoOffsetSD\\_Y | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films.Range 0 to 480 | 50 | 1.0 |\n| OverhangPrimaryLogoSD | Co Ke Li Pa Po Se Sp Te | Small application logo formatted for display in overhang top left | pkg:/images/co\\_logo\\_sd.png | 1.0 |\n| OverhangSecondaryLogoHD | Co Ke Li Pa Po Se Sp Te | Small application logo formatted for display in overhang top left | pkg:/images/co\\_logo\\_hd.png | 1.0 |\n| OverhangSecondaryLogoOffsetHD\\_X | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films. Range 0 to 1280 | 25 | 1.0 |\n| OverhangSecondaryLogoOffsetHD\\_Y | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films. Range 0 to 720 | 50 | 1.0 |\n| OverhangSecondaryLogoOffsetSD\\_X | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films. Range 0 to 720 | 25 | 1.0 |\n| OverhangSecondaryLogoOffsetSD\\_Y | Co Ke Li Pa Po Se Sp Te | Offset in pixels from the top-left origin of the display films. Range 0 to 480 | 50 | 1.0 |\n| OverhangSecondaryLogoSD | Co Ke Li Pa Po Se Sp Te | Small application logo formatted for display in overhang top left | pkg:/images/co\\_logo\\_sd.png | 1.0 |\n| OverhangSliceHD | Co Ke Li Pa Po Se Sp Te | URI for the overhang slice (thin piece of border at the top of the screen in HD size) | pkg:/images/overhang\\_hd.png | 1.0 |\n| OverhangSliceSD | Co Ke Li Pa Po Se Sp Te | URI for the overhang slice (thin piece of top of screen border) | pkg:/images/overhang\\_sd.png | 1.0 |\n| ParagraphBodyText | Co Pa Te | HTML HEX Color Value | #FF00FF | 1.0 |\n| ParagraphHeaderText | Co Pa Te | HTML HEX Color Value | #FF00FF | 1.0 |\n| PosterScreenLine1Text | Po | HTML HEX Color Value | #FF00FF | 1.0 |\n| PosterScreenLine2Text | Po | HTML HEX Color Value | #FF00FF | 1.0 |\n| RegistrationCodeColor | Co | HTML HEX Color Value | #FF00FF | 1.0 |\n| RegistrationFocalColor | Co | HTML HEX Color Value | #FF00FF | 1.0 |\n| RegistrationFocalRectColor | Co | HTML HEX Color Value | #10FF80 | |\n| RegistrationFocalRectHD | Co | Position and size of the HD focal rectangle. Four integer: (x,y,width,height) | (228,360,120,82) | |\n| RegistrationFocalRectSD | Co | Position and size of the SD focal rectangle. Four integer: (x,y,width,height) | (172,220,90,76) | |\n| SpringboardActorColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardAlbumColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardAlbumLabel | Sp | Album Label | on | 1.0 |\n| SpringboardAlbumLabelColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardAllow6Buttons | Sp | boolean string | true | |\n| SpringboardArtistColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardArtistLabel | Sp | Artist Label | by | 1.0 |\n| SpringboardArtistLabelColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardDirectorColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardDirectorText | Sp | Director Label | Written by | 1.0 |\n| SpringboardDirectorLabelColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardDirectorPrefixText | Sp | HTML HEX Color Value | #FF00FF | |\n| SpringboardGenreColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardRuntimeColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardSynopsisColor | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| SpringboardTitleText | Sp | HTML HEX Color Value | #FF00FF | 1.0 |\n| TextScreenBodyBackgroundColor | Te | HTML HEX Color Value. Must be a grayscale value | #808080 | 4.3 |\n| TextScreenBodyText | Te | HTML HEX Color Value | #363636 | 4.3 |\n| TextScreenScrollBarColor | Te | HTML HEX Color Value | #CC0000 | 4.3 |\n| TextScreenScrollThumbColor | Te | HTML HEX Color Value | #00CC00 | 4.3 |\n| ThemeType | | Theme type. Generic-dark is the only valid value. Otherwise the default theme applies | generic-dark | 2.7 |\n\n**Example**\n\n```\nSub SetApplicationTheme()\n app = CreateObject(\"roAppManager\")\n theme = CreateObject(\"roAssociativeArray\")\n theme.OverhangSliceHD = \"pkg:/images/Overhang_Slice_HD.png\"\n theme.OverhangPrimaryLogoSD = \"pkg:/images/Logo_Overhang_SD43.png\"\n theme.OverhangPrimaryLogoOffsetSD_X = \"72\"\n theme.OverhangPrimaryLogoOffsetSD_Y = \"25\"\n theme.OverhangPrimaryLogoHD = \"pkg:/images/Logo_Overhang_HD.png\"\n theme.OverhangPrimaryLogoOffsetHD_X = \"123\"\n theme.OverhangPrimaryLogoOffsetHD_Y = \"48\"\n app.SetTheme(theme)\nEnd Sub\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifAppManager",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifappmanager.md"
+ }
+ ],
+ "name": "roAppManager",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roappmanager.md"
+ },
+ "roarray": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "size",
+ "type": "Integer"
+ },
+ {
+ "isRequired": true,
+ "name": "resizeAs",
+ "type": "Boolean"
+ }
+ ],
+ "returnType": "roArray"
+ }
+ ],
+ "description": "An array stores an indexed collection of BrightScript objects. Each entry of an array can be a different type, or they may all of the same type.\n\nAn roArray is created with two parameters:\n\n**CreateObject(\"roArray\", size As Integer, resizeAs Boolean)**\n\nSize is the initial number of elements allocated for the array. If resize is true, the array will be resized if needed to accommodate more elements. If the array is large, this might be slow. The \"dim\" statement may be used instead of CreateObject to allocate a new array. Dim has the advantage in that it automatically creates arrays of arrays for multi-dimensional arrays.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarray.md"
+ },
+ {
+ "name": "ifArrayGet",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayget.md"
+ },
+ {
+ "name": "ifArrayJoin",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayjoin.md"
+ },
+ {
+ "name": "ifArraySet",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayset.md"
+ },
+ {
+ "name": "ifArraySort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarraysort.md"
+ },
+ {
+ "name": "ifEnum",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifenum.md"
+ }
+ ],
+ "name": "roArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roarray.md"
+ },
+ "roassociativearray": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roAssociativeArray"
+ }
+ ],
+ "description": "An associative array (also known as a map, dictionary or hash table) allows objects to be associated with string keys. Associative arrays are built into the language. They can be accessed implicitly by using the dot or bracket operators, or by calling functions from the [ifAssociativeArray](https://developer.roku.com/docs/references/brightscript/interfaces/ifassociativearray.md\"ifAssociativeArray\") interface. For example, the last three lines in this example are equivalent:\n\n```\naa = { one : 1, two : 2, three : 3 }\nx = aa[\"two\"]\nx = aa.two\nx = aa.Lookup(\"two\")\n```\n\nThis object is created with no parameters:\n\n```\nCreateObject(\"roAssociativeArray\")\n```\n\nIt can also be created implicitly by using an Associative Array literal.\n\nStarting from Roku OS 8, the quoted keys in Associative Array literals are now case-preserving. This change improves the readability of your code and is compatible with JSON usage.\n\n**Example**\n\n```\n' Creation of associative arrays\n\naa1 = CreateObject(\"roAssociativeArray\") ' Explicitly \naa2 = {} ' Implicitly\naa3 = { ' With some initial values\n foo : 12,\n bar : 13\n}\n\n' Assigning values\n\naa1.AddReplace(\"Bright\", \"Script\") ' With explicit function calls\naa1.AddReplace(\"TMOL\", 42)\naa1.boo = 112 ' With dot operator\naa1[\"baz\"] = \"abcdefg\" ' With bracket operator\n\n' Accessing values\n\nprint aa1.Bright ' With dot operator (will print 'Script')\nprint aa1.Lookup(\"TMOL\") ' With function call (will print 42)\nprint aa1[\"boo\"] ' With bracket operator (will print 112)\n\n' Using ifEnum interface to walk through keys in an associative array\nfor each key in aa1\n\n print \" \" key \"=\" aa1[key]\n\nend for\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifAssociativeArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifassociativearray.md"
+ },
+ {
+ "name": "ifEnum",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifenum.md"
+ }
+ ],
+ "name": "roAssociativeArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roassociativearray.md"
+ },
+ "roaudioguide": {
+ "constructors": [],
+ "description": "> This component is only available on the following devices: Roku Streaming Stick (3600X), Roku Express (3700X) and Express+ (3710X), Roku Premiere (4620X) and Premiere+ (4630X), Roku Ultra (4640X), and any Roku TV running Roku OS version 7.5 and later.\n\nThe roAudioGuide component provides Audio Guide support for applications that require custom speech beyond what is provided by automatic Audio Guide in SDK and Scene Graph components.\n\nThough some of the roAudioGuide API is similar to [roTextToSpeech](https://developer.roku.com/docs/references/brightscript/components/rotexttospeech.md\"roTextToSpeech\"), roAudioGuide provides support specific to Audio Guide, including:\n\n* Speaks when Audio Guide is enabled, and doesn't speak if it isn't.\n* Automatically splits up text to reduce lag.\n* Uses the correct voice, language, volume, and speech rate for Audio Guide.\n* Tries to be \"smart\" by pre-processing the text for correct pronunciation of things like currency, email addresses, acronyms, media-related names and titles, etc.\n\nUsually, roAudioGuide would be used on its own, but it can be used in conjunction with [roTextToSpeech](https://developer.roku.com/docs/references/brightscript/components/rotexttospeech.md\"roTextToSpeech\").",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifAudioGuide",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudioguide.md"
+ }
+ ],
+ "name": "roAudioGuide",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudioguide.md"
+ },
+ "roaudiometadata": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roAudioMetadata"
+ }
+ ],
+ "description": "The roAudioMetadata component provides developers access to audio file metadata included in many audio files. This should enable some audiofiles to deliver the information needed to fill out an roSpringboard screen without passing the info in a separate xml feed. roAudioMetadata currently only works with local file URLs.\n\nThe component requires the use of a dynamically loaded library that is not part of the initially booted image. Therefore, an entry must be added to the manifest of any applications that use the roAudioMetadata component so it can be loaded when the channel is launched. Here's the manifest entry:\n\n_requires\\_audiometadata=1_\n\nThis object is created without any arguments:\n\n`CreateObject(\"roAudioMetadata\")`\n\n**Example**\n\n```\nREM printAA() is from generalUtils.brs in our sample apps\nREM and used to print an associative Array\n\nSub SaveCoverArtFile(filename As String)\n meta = CreateObject(\"roAudioMetadata\")\n meta.SetUrl(filename)\n print \"------------- GetTags() -------------------------\"\n tags = meta.GetTags()\n printAA(tags)\n print \"------------- GetAudioProperties() --------------\"\n properties = meta.GetAudioProperties()\n printAA(properties)\n print \"------------- GetCoverArt() ---------------------\"\n thumbnail = meta.GetCoverArt()\n if (thumbnail <> invalid) then\n if (thumbnail.bytes = invalid) then\n return\n end if\n imgtype = thumbnail.type\n image_ext=\"\"\n if (imgtype = \"image/jpeg\" or imgtype = \"jpg\") then\n image_ext = \"jpg\"\n else if (imgtype = \"image/png\" or imgtype = \"png\") then\n image_ext = \"png\"\n else\n image_ext = \"jpg\"\n end if\n tmp_img = \"tmp:/CoverArtImage\" + \".\" + image_ext\n if (tmp_img <> invalid) then\n DeleteFile(tmp_img)\n end if\n thumbnail.bytes.Writefile(tmp_img)\n end if\nEnd Sub\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifAudioMetadata",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudiometadata.md"
+ }
+ ],
+ "name": "roAudioMetadata",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudiometadata.md"
+ },
+ "roaudioplayer": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roAudioPlayer"
+ }
+ ],
+ "description": "The Audio Player object provides the ability to setup the playing of a series of audio streams. The object accepts an array of content meta-data objects, describing the audio and providing URLs for accessing each stream. The component understands the following streamformat values: \"mp3\", \"wma\", \"mp4\", \"hls\", \"es.aac-adts\", \"flac.\"\n\nThis object does not provide an interface to a screen. In order to get events both from the screen you are using and the Audio Player, you should use the same Message Port for both objects.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roAudioPlayer\")`\n\n**Example**\n\n```\nSub Main()\n audioPlayer = CreateObject(\"roAudioPlayer\")\n port = CreateObject(\"roMessagePort\")\n audioPlayer.SetMessagePort(port)\n song = CreateObject(\"roAssociativeArray\")\n song.url = \"http://www.theflute.co.uk/media/BachCPE_SonataAmin_1.wma\"\n audioplayer.addcontent(song)\n audioplayer.setloop(false)\n audioPlayer.play()\n while true\n msg = wait(0, port)\n if type(msg) = \"roAudioPlayerEvent\"\n if msg.isStatusMessage() then\n print \"roAudioPlayerEvent: \"; msg.getmessage()\n if msg.getmessage() = \"end of playlist\" return\n endif\n endif\n end while\nEnd Sub\n```",
+ "events": [
+ {
+ "name": "roAudioPlayerEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/roaudioplayerevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifAudioPlayer",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudioplayer.md"
+ },
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "name": "roAudioPlayer",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudioplayer.md"
+ },
+ "roaudioresource": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "dynamic"
+ }
+ ],
+ "returnType": "roAudioResource"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "string"
+ }
+ ],
+ "returnType": "roAudioResource"
+ }
+ ],
+ "description": "The roAudioResouce allows .wav files to be cached to memory and quickly played at any time. roAudioResource is intended to support short audio clips which need to be played with very little latency. The system caches the entire wav file in memory so that playback can begin very quickly.\n\nOn Roku \"Classic\" models, roAudioResource does not support mixing of sounds. So when you play a sound effect, any background music is paused while the sound effect plays and then resumes after the sound effect ends. On later models, sound effects are mixed with background music. See the [Hardware specifications document](/docs/specs/hardware.md#current-models) for a list of Current and Classic models.\n\nThis object is created with a filename parameter that is a path to the sound resource file:\n\n`CreateObject(\"roAudioResource\", filename)`\n\nThe filename must be the name of a local file and cannot be a URL. To use a URL, you may download the file to the application's \"tmp:\" file system using [roUrlTransfer](https://developer.roku.com/docs/references/brightscript/components/rourltransfer.md and pass a filename of the form \"tmp:/file.wav\" to CreateObject.\n\n```\nsound = CreateObject(\"roAudioResource\", \"pkg:/sounds/beep1.wav\")\nsound.Trigger(75)\n```\n\nAn object can also be created using the name of a system sound effect:\n\n* \"select\" - the sound effect to be played when a selection is made, e.g. when OK is pressed.\n* \"navsingle\" - the sound effect to be played when navigating a list or grid, e.g. when left or right is pressed.\n* \"navmulti\" - the sound effect to be played when paging through a list or grid, e.g. when rewind or fast-forward is pressed.\n* \"deadend\" - the sound effect to be played when a button press could not be processed.\n\nNote that system sound effects are played at the volume selected in the user's settings, or not played at all if the user has turned sound effects off, regardless of the volume value passed to Trigger.\n\n```\nsound = CreateObject(\"roAudioResource\", \"select\")\nsound.Trigger(50)\n```\n\nMult iple sounds can be mixed and played at the same time:\n\n```\nsound1 = CreateObject(\"roAudioResource\", \"pkg:/sounds/beep1.wav\")\nsound2 = CreateObject(\"roAudioResource\", \"select\")\nsound1.Trigger(50, 0)\nif sound2.maxSimulStreams() > 1\n sound2.Trigger(50, 1)\nend if\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifAudioResource",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudioresource.md"
+ }
+ ],
+ "name": "roAudioResource",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudioresource.md"
+ },
+ "robitmap": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "bitmapProps",
+ "type": "Object"
+ }
+ ],
+ "returnType": "roBitmap"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "filename",
+ "type": "String"
+ }
+ ],
+ "returnType": "roBitmap"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "string"
+ }
+ ],
+ "returnType": "roBitmap"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "dynamic"
+ }
+ ],
+ "returnType": "roBitmap"
+ }
+ ],
+ "description": "The roBitmap component contains image data and provides an interface (ifDraw2D) for drawing. Bitmaps can be used for a variety of purposes, such as for sprites, compositing, or as double buffers.\n\nIt stores four color channels: red, green, blue, and alpha, with 32-bits per pixel. They can be any arbitrary size up to 2048x2048. However, the maximum size bitmap uses 16MB of memory, so there are practical memory limitations which would compel smaller bitmap sizes. Coordinates (x,y) for 2D bitmaps have an origin (0,0) at the top left. roBitmap is always offscreen. The top roScreen is the only ifDraw2D surface which is displayed. roBitmap represents something that can be drawn onto, as well as something that can be drawn.\n\nDrawing operations into a roBitmap (or other surface with ifDraw2D interface, such as an [roScreen](https://developer.roku.com/docs/references/brightscript/components/roscreen.md\"roScreen\")) are clipped so the only the part that is within its bounds is rendered. X,Y coordinates that specify a location in a bitmap to render to (for example, as used by DrawObject() or DrawText() ) may be positive or negative. Negative implies that the left and top of the rendered object will be clipped.The same bitmap cannot be used as a source and a destination in a single DrawObject() call.\n\nThere are limitations when using the onscreen bitmap as a source. For example, Alpha blending may not work.\n\nAn empty roBitmap object can be created with CreateObject():\n\n`CreateObject(\"roBitmap\", bitmapProps As Object)`\n\nbitmapProps is an roAssociativeArray with Integers width (Integer), height (Integer), and AlphaEnable (Boolean), and name (String) parameters. The contents of an empty RoBitmap are initialized to zero (transparent black).\n\nExample: `CreateObject(\"roBitmap\", {width:10, height:10, AlphaEnable:false, name:\"MyBitmapName\"})`\n\nAn roBitmap can also load its image data from a file:\n\n`CreateObject(\"roBitmap\", String filename)`\n\n**Example**\n\n```\n' Draw three bitmaps as fast as we can\n'\nScreen=CreateObject(\"roScreen\")\nbm1=CreateObject(\"roBitmap\", \"pkg:/images/myphoto1.jpg\")\nbm2=CreateObject(\"roBitmap\", \"pkg:/images/myphoto2.jpg\")\nbm3=CreateObject(\"roBitmap\", \"pkg:/images/myphoto3.jpg\")\nbmarray=[bm1, bm2, bm3]\nWhile true\n For each bitmap in bmarray\n Screen.DrawObject(0,0, bitmap)\n Screen.Finish()\n End for\nEnd While\n```\n\n**Example: Double buffering with roBitmap**\n\n```\nscreen1=CreateObject(\"roScreen\")\noff=CreateObject(\"roBitmap\", {width:1280, height:720, AlphaEnable:false})\noff.Clear(white)\ndfDrawImage(off, \"pkg:/images/myimage.png\", 50, 50)\noff.DrawRect(150, 150, 200, 200, &hFF) ' black, alpha: all source\nscreen1.DrawObject(0, 0, off)\nScreen1.Finish()\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifDraw2D",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifdraw2d.md"
+ }
+ ],
+ "name": "roBitmap",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/robitmap.md"
+ },
+ "roboolean": {
+ "constructors": [],
+ "description": "roBoolean is the object equivalent for intrinsic type Boolean.\n\nThis is useful in the following situations:\n\n* When an object is needed, instead of an intrinsic value. For example, \"roList\" maintains a list of objects. If an Boolean is added to roList, it will be automatically wrapped in an roBoolean by the language interpreter. When a function that expects a BrightScript Component as a parameter is passed a boolean, BrightScript automatically creates the equivalent BrightScript Component.\n* If any object exposes the ifBoolean interface, that object can be used in any expression that expects an intrinsic value.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifBoolean",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifboolean.md"
+ },
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roBoolean",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roboolean.md"
+ },
+ "robytearray": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roByteArray"
+ }
+ ],
+ "description": "The byte array component is used to contain and manipulate an arbitrary array of bytes.\n\nThis object contains functions to convert strings to or from a byte array, as well as to or from ascii hex or ascii base 64. Note that if you are converting a byte array to a string, and the byte array contains a zero, the string conversion will end at that point. roByteArray will autosize to become larger as needed. If you wish to turn off this behavior, then use the SetResize() function. If you read an uninitialized index, \"invalid\" is returned. roByteArray supports the [ifArray](https://developer.roku.com/docs/references/brightscript/interfaces/ifarray.md\"ifArray\") interface, and so can be accessed with the array \\[\\] operator. The byte array is always accessed as unsigned bytes when using this interface. roByteArray also supports the ifEnum interface, and so can be used with a \"for each\" statement.\n\n**Example**\n\n```\nba=CreateObject(\"roByteArray\")\nba.FromAsciiString(\"leasure.\")\nif ba.ToBase64String()<>\"bGVhc3VyZS4=\" then stop\n\nba=CreateObject(\"roByteArray\")\nba.fromhexstring(\"00FF1001\")\nif ba[0]<>0 or ba[1]<>255 or ba[2]<>16 or ba[3]<>1 then stop\n\nba=CreateObject(\"roByteArray\")\nfor x=0 to 4000\n ba.push(x)\nend for\n\nba.WriteFile(\"tmp:/ByteArrayTestFile\")\nba2=CreateObject(\"roByteArray\")\nba2.ReadFile(\"tmp:/ByteArrayTestFile\")\nif ba.Count()<>ba2.Count() then stop\nfor x=0 to 4000\n if ba[x]<>ba2[x] then stop\nend for\n\nba2.ReadFile(\"tmp:/ByteArrayTestFile\", 10, 100)\nif ba2.count()<>100 then stop\nfor x=10 to 100\n if ba2[x-10]<>x then stop\nend for\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarray.md"
+ },
+ {
+ "name": "ifArrayGet",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayget.md"
+ },
+ {
+ "name": "ifArraySet",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayset.md"
+ },
+ {
+ "name": "ifByteArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifbytearray.md"
+ },
+ {
+ "name": "ifEnum",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifenum.md"
+ }
+ ],
+ "name": "roByteArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/robytearray.md"
+ },
+ "rocaptionrenderer": {
+ "constructors": [],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe roCaptionRenderer component provides a mechanism for BrightScript channels to render closed captions in video played back with the roVideoPlayer. Prior to the v 5.2 Roku firmware, captions could only be rendered in roVideoScreen.\n\nPrior to the 5.2 Roku OS version, closed captions could only be rendered in roVideoScreen. Now channels that use roVideoPlayer embedded in an roScreen or roImageCanvas can also take advantage of Roku's closed captioning support. roCaptionRenderer supports two different modes, which is set using the [SetMode()](https://developer.roku.com/docs/references/brightscript/interfaces/ifcaptionrenderer.mdsetmodemode-as-integer-as-void \"SetMode()\") method. Depending on the mode set, and the type of screen being used, the BrightScript channel needs to do different levels of work to render captions. These different workflows are highlighted in the tables below:\n\n**Model 1**\n\n| roScreen | roImageCanvas |\n| --- | --- |\n| Call [SetScreen()](https://developer.roku.com/docs/references/brightscript/interfaces/ifcaptionrenderer.mdsetscreenscreen-as-object-as-void \"SetScreen()\") | Call [SetScreen()](https://developer.roku.com/docs/references/brightscript/interfaces/ifcaptionrenderer.mdsetscreenscreen-as-object-as-void \"SetScreen()\") |\n| Call [UpdateCaption()](https://developer.roku.com/docs/references/brightscript/interfaces/ifcaptionrenderer.mdupdatecaption-as-void \"UpdateCaption()\") | |\n\n**Model 2**\n\n| roScreen | roImageCanvas |\n| --- | --- |\n| All caption rendering is done by the channel's BrightScript code | All caption rendering is done by the channel's BrightScript code |\n\nBrightScript channels do not create roCaptionRenderer instances directly using CreateObject(). Instead, when an roVideoPlayer is created, it contains an roCaptionRenderer. BrightScript channels call [ifVideoPlayer.GetCaptionRenderer()](https://developer.roku.com/docs/references/brightscript/interfaces/ifvideoplayer.mdgetcaptionrenderer-as-object \"ifVideoPlayer.GetCaptionRenderer()\") to get the caption renderer associated with their video player.\n\n**Example**\n\n```\nFunction Main() as void\n mode = 1\n fonts = CreateObject(\"roFontRegistry\")\n fonts.Register(\"pkg:/fonts/vSHandprinted.otf\")\n font = fonts.GetFont(\"vSHandprinted\", 28, 500, false)\n screen = CreateObject(\"roScreen\", true)\n port = CreateObject(\"roMessagePort\")\n screen.Clear(&h00)\n screen.SwapBuffers()\n screen.SetMessagePort(port)\n timer = CreateObject(\"roTimespan\")\n screenSize = {}\n screenSize.width = screen.GetWidth()\n screenSize.height = screen.GetHeight()\n\n player = CreateObject(\"roVideoPlayer\")\n player.SetContentList([\n {\n Stream : { url :\"http://ecn.channel9.msdn.com/o9/content/smf/smoothcontent/elephantsdream/Elephants_Dream_1024-h264-st-aac.ism/manifest\" }\n StreamFormat : \"ism\"\n TrackIDAudio: \"audio_eng\"\n TrackIDSubtitle: \"ism/textstream_eng\"\n }\n ])\n\n captions = player.GetCaptionRenderer()\n if (mode = 1)\n captions.SetScreen(screen)\n endif\n captions.SetMode(mode)\n captions.SetMessagePort(port)\n captions.ShowSubtitle(true)\n\n player.play()\n\n while true\n msg = wait(250, port)\n if type(msg) = \"roCaptionRendererEvent\"\n if msg.isCaptionText()\n print \"isCaptionText\"\n if msg.GetMessage() <> invalid and msg.GetMessage() <> \"\"\n DrawCaptionString(screen, screenSize, msg.GetMessage(), font)\n timer.Mark()\n else if timer.TotalSeconds() > 2\n ClearCaptionString(screen)\n endif\n else if msg.isCaptionUpdateRequest()\n print \"isCaptionUpdateRequest()\"\n UpdateCaptions(screen, captions)\n end if\n endif\n end while\nEnd Function\n\nFunction UpdateCaptions(screen as object, captions as object) as Void\n screen.Clear(&h00)\n captions.UpdateCaption()\n screen.SwapBuffers()\nEnd Function\n\nFunction DrawCaptionString(screen as object, screenSize as object, caption as String, font as object) as Void\n screen.Clear(&h00)\n textHeight = font.GetOneLineHeight()\n textWidth = font.GetOneLineWidth(caption, screenSize.width)\n x = (screenSize.width - textWidth) / 2\n y = screenSize.height - textHeight\n screen.DrawText(caption, x, y, &hd5d522ff, font)\n screen.SwapBuffers()\nEnd Function\n\nFunction ClearCaptionString(screen as object) as void\n screen.Clear(&h00)\n screen.SwapBuffers()\nEnd Function\n```",
+ "events": [
+ {
+ "name": "roCaptionRendererEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/event/rocaptionrendererevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifCaptionRenderer",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifcaptionrenderer.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roCaptionRenderer",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rocaptionrenderer.md"
+ },
+ "rochannelstore": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roChannelStore"
+ }
+ ],
+ "description": "The roChannelStore component allows the application to perform a purchase of an In-Channel Product or upgrade a channel. Most of the purchase flow, screens and messaging associated with the financial transaction are handled by the Roku OS outside of control or monitoring by BrightScript code. The BrightScript code merely initiates the purchase and receives a final result. This will engender trust with users and give them confidence that they are dealing with the Roku Channel Store.\n\nThe roChannelStore component allows purchasing only those In-Channel Products which are associated with the running channel. Please see [Adding in-channel products](/docs/developer-program/roku-pay/quickstart/in-channel-products.md \"Adding in-channel products\") for details on how to create an In-Channel Product and associate it with a channel. After one or Products are created, GetCatalog() can be used to retrieve a list of Products and their attributes. DoOrder() can be called to initiate a purchase of one or more of the Products.\n\nThe roChannelStore object has a FakeServer() method that will enable you to test the purchase flow scenarios without actually making a real transaction in the Roku channel store. This will be useful in the development of your channel, but should never be used in the actual channel you publish.\n\nThis object is created without any arguments:\n\n`CreateObject(\"roChannelStore\")`\n\n> Because [ifChannelStore.DoOrder()](https://developer.roku.com/docs/references/brightscript/interfaces/ifchannelstore.mddoorder-as-boolean \"ifChannelStore.DoOrder()\") needs to read the product type returned by GetCatalog(), only one instance of roChannelStore should ever be used for a complete purchase flow - you should never create a separate roChannelStore object to complete a purchase that was initiated by a different instance of roChannelStore.",
+ "events": [
+ {
+ "name": "roChannelStoreEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rochannelstoreevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifChannelStore",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifchannelstore.md"
+ },
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "name": "roChannelStore",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rochannelstore.md"
+ },
+ "rocoderegistrationscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roCodeRegistrationScreen"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Code Registration Screen is designed to present the user a registration code, and the information required to instruct the user on how to register with a service provider. This screen is designed for a rendezvous registration process, where the user is presented a code and the URL for a registration site. The user goes to the site and enters their code, which causes the device and the account to be linked. In the background, the script is polling for completion and the screen is closed to display an activation successful screen when done.\n\n**Diagram: roCodeRegistrationScreen**\n\n![Diagram: roCodeRegistrationScreen](https://image.roku.com/ZHZscHItMTc2/roCodeRegistrationScreenImage1.png \"roCodeRegistrationScreenImage1\")\n\n**Example**\n\n```\nFunction ShowMessageDialog() As Void\n port = CreateObject(\"roMessagePort\")\n screen = CreateObject(\"roCodeRegistrationScreen\")\n screen.SetMessagePort(port)\n screen.SetTitle(\"[Registration screen title]\")\n screen.AddParagraph(\"[Registration screen paragraphs are justified to right and left edges]\")\n screen.AddFocalText(\" \", \"spacing-dense\")\n screen.AddFocalText(\"From your computer,\", \"spacing-dense\")\n screen.AddFocalText(\"go to mysite.com/roku\", \"spacing-dense\")\n screen.AddFocalText(\"and enter this code:\", \"spacing-dense\")\n screen.AddFocalText(\" \", \"spacing-dense\")\n screen.SetRegistrationCode(\"retrieving code...\")\n screen.AddParagraph(\"[Registration screen paragraphs are justified to right and left edges and may continue on multiple lines]\")\n screen.AddButton(0, \"get a new code\")\n screen.AddButton(1, \"back\")\n screen.Show()\n sleep (10000) 'simulate fetching registration code from webapi\n screen.SetRegistrationCode(\"ABC7TG\")\n screen.Show()\n while true\n dlgMsg = wait(0, dialog.GetMessagePort())\n exit while\n end while\n End Function\n```\n\n**Image: roCodeRegistrationScreen example results**\n\n![cdregistscrn1](https://image.roku.com/ZHZscHItMTc2/cdregistscrn1.jpg \"cdregistscrn1\")\n\n![cdregistscrn2](https://image.roku.com/ZHZscHItMTc2/cdregistscrn2.jpg \"cdregistscrn2\")",
+ "events": [
+ {
+ "name": "roCodeRegistrationScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rocoderegistrationscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifCodeRegistrationScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iifCodeRegistrationScreen.md"
+ },
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roCodeRegistrationScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rocoderegistrationscreen.md"
+ },
+ "rocompositor": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roCompositor"
+ }
+ ],
+ "description": "The roCompositor allows the composition and animation of multiple roBitmaps and roRegions.\n\nThis object can create and manage roSprites in a z-ordered list. The sprites can be of arbitrary size and can be thought of as planes. The compositor can manage collision detection between the sprites, support scrolling the sprite bitmap source, and support animated sprites (multi-frame sprites with frame-flipping animation). You may have multiple roCompositor components, and they can composite onto the same or separate bitmaps. That said, the most common scenario is to have a single roCompositor.\n\n**Example: Scrolling a bitmap**\n\n```\nLibrary \"v30/bslCore.brs\"\nFunction main()\n black=&hFF'RGBA\n screen=CreateObject(\"roScreen\")\n compositor=CreateObject(\"roCompositor\")\n compositor.SetDrawTo(screen, black)\n http = CreateObject(\"roUrlTransfer\")\n http.SetMessagePort(CreateObject(\"roMessagePort\"))\n http.SetUrl(\"http://rokudev.roku.com/rokudev/examples/scroll/VeryBigPng.png\")\n http.AsyncGetToFile(\"tmp:/VeryBigPng.png\")\n wait(0, http.GetPort())\n bigbm=CreateObject(\"roBitmap\",\"tmp:/VeryBigPng.png\")\n region=CreateObject(\"roRegion\", bigbm, 0, 0, 1280, 720)\n region.SetWrap(True)\n\n view_sprite=compositor.NewSprite(0, 0, region)\n compositor.draw()\n screen.SwapBuffers()\n msgport = CreateObject(\"roMessagePort\")\n screen.SetMessagePort(msgport)\n codes = bslUniversalControlEventCodes()\n While True\n msg=wait(0, msgport) ' wait for a button\n print \"Msg: \"; type(msg); \" event: \"; msg.GetInt()\n If type(msg)=\"roUniversalControlEvent\" Then\n If msg.GetInt()=codes.BUTTON_UP_PRESSED Then\n Zip(screen, view_sprite, compositor, 0,-4) 'up\n Else If msg.GetInt()=codes.BUTTON_DOWN_PRESSED Then\n Zip(screen, view_sprite, compositor, 0,+4) ' down\n Else If msg.GetInt()=codes.BUTTON_RIGHT_PRESSED Then\n Zip(screen, view_sprite, compositor, +4,0) ' right\n Else If msg.GetInt()=codes.BUTTON_LEFT_PRESSED Then\n Zip(screen, view_sprite, compositor, -4, 0) ' left\n Else If msg.GetInt() = codes.BUTTON_BACK_PRESSED ' back button\n Exit While\n End If\n End If\n End While\nEnd Function\nFunction Zip(screen, view_sprite, compositor, xd, yd)\n For x=1 To 60\n view_sprite.OffsetRegion(xd, yd, 0, 0)\n compositor.draw()\n screen.SwapBuffers()\n End For\nEnd Function\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifCompositor",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifcompositor.md"
+ }
+ ],
+ "name": "roCompositor",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rocompositor.md"
+ },
+ "rodatagramsocket": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roDataGramSocket"
+ }
+ ],
+ "description": "The roDataGramSocket component enables Brightscript apps to send and receive UDP packets. The interface is modeled on and works much like standard Berkeley sockets.\n\nThis object is created without any arguments:\n\n`CreateObject(\"roDataGramSocket\")`\n\n**Example**\n\n```\n' UDP 2-way peer-to-peer asynchronous comm on port 54321\n' periodically sends out a message to a specific address and port\n' prints any message it receives\nFunction UDPPeer()\n msgPort = createobject(\"roMessagePort\")\n udp = createobject(\"roDatagramSocket\")\n udp.setMessagePort(msgPort) 'notifications for udp come to msgPort\n addr = createobject(\"roSocketAddress\")\n addr.setPort(54321)\n udp.setAddress(addr) ' bind to all host addresses on port 54321\n addr.SetHostName(\"10.1.1.1\")\n udp.setSendToAddress(addr) ' peer IP and port\n udp.notifyReadable(true)\n timeout = 1 * 10 * 1000 ' ten seconds in milliseconds\n deviceName = Createobject(\"roDeviceInfo\").GetFriendlyName()\n message = \"Datagram from \" + deviceName\n udp.sendStr(message)\n continue = udp.eOK()\n While continue\n event = wait(timeout, msgPort)\n If type(event)=\"roSocketEvent\"\n If event.getSocketID()=udp.getID()\n If udp.isReadable()\n message = udp.receiveStr(512) ' max 512 characters\n print \"Received message: '\"; message; \"'\"\n End If\n End If\n Else If event=invalid\n print \"Timeout\"\n udp.sendStr(message) ' periodic send\n End If\n End While\n udp.close() ' would happen automatically as udp goes out of scope\n\nEnd Function\n```\n\n> GetDeviceUniqueId() was deprecated in Spring OS 2019.",
+ "events": [
+ {
+ "name": "roSocketEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifappinfo.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifSocket",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocket.md"
+ },
+ {
+ "name": "ifSocketAsync",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketasync.md"
+ },
+ {
+ "name": "ifSocketCastOption",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketcastoption.md"
+ },
+ {
+ "name": "ifSocketOption",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketoption.md"
+ },
+ {
+ "name": "ifSocketStatus",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketstatus.md"
+ }
+ ],
+ "name": "roDataGramSocket",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rodatagramsocket.md"
+ },
+ "rodatetime": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roDateTime"
+ }
+ ],
+ "description": "The roDateTime provides an interface to obtain the current date/time for the player and manipulate date/times.\n\nThis component provides several options for obtaining attributes about the date/time. All times are GMT unless they are converted to the system timezone with a call to the method: toLocalTime().\n\nThis object is created with no parameters:\n\n`CreateObject(\"roDateTime\")`\n\nThe date/time of the object is set to the current system time when the object is created. The date/time represented by the object can be changed by calling Mark(), FromSeconds(), or FromISO8601String().\n\n**Example**\n\n```\ndate = CreateObject(\"roDateTime\")\nprint \"The date is now \"; date.AsDateString(\"long-date\")\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifDateTime",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifdatetime.md"
+ }
+ ],
+ "name": "roDateTime",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rodatetime.md"
+ },
+ "rodevicecrypto": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roDeviceCrypto"
+ }
+ ],
+ "description": "The roDeviceCrypto component enables you to encrypt and decrypt data on a device using a key that is unique per channel, device, or model. Using a channel key for example, you can encrypt data for a channel so that it may only be decrypted by that same channel. In this case, you could provision credentials or an API key from the cloud to devices securely. With a device key for example, you could implement a secure-storage like algorithm.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifDeviceCrypto",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifdevicecrypto.md"
+ }
+ ],
+ "name": "roDeviceCrypto",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rodevicecrypto.md"
+ },
+ "rodeviceinfo": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roDeviceInfo"
+ }
+ ],
+ "description": "The Device Info provides an interface to obtain attributes about the device.\n\nThese attributes are not changeable by the script, but may be queried to obtain values for the player. It is common for scripts to need access to the serial number and model info for negotiating with backend services.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roDeviceInfo\")`\n\n**Example**\n\n```\ndi = CreateObject(\"roDeviceInfo\")\nprint di.GetModel()\nprint di.GetVersion()\nprint di.GetChannelClientId()\n```\n\n**Output**\n\nThe output from the above code would like the following:\n\n```\n N1000\n 999.99E99999X\n 20E825000036\n```",
+ "events": [
+ {
+ "name": "roDeviceInfoEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rodeviceinfoevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifDeviceInfo",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifdeviceinfo.md"
+ },
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "name": "roDeviceInfo",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rodeviceinfo.md"
+ },
+ "rodouble": {
+ "constructors": [],
+ "description": "roDouble is the object equivalent for intrinsic type 'Double'.\n\nIt is a legacy object name, corresponding to the intrinsic Double object. Applications should use Double literal values and/or Double-typed variables directly.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifDouble",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifdouble.md"
+ },
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roDouble",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rodouble.md"
+ },
+ "roevpcipher": {
+ "constructors": [],
+ "description": "The EVP Cipher component provides an interface to the OpenSSL EVP library of symmetric cipher commands. The EVP library provides a high-level interface to cryptographic functions to implement digital \"envelopes\".\n\nThese commands allow data to be encrypted or decrypted using various block and stream ciphers using keys based on passwords or explicitly provided.\n\nSome of the ciphers do not have large keys and others have security implications if not used correctly. A beginner is advised to just use a strong block cipher in CBC mode such as bf or des3. All the block ciphers normally use PKCS#5 padding also known as standard block padding. If padding is disabled then the input data must be a multiple of the cipher block length.\n\n> For additional information on the OpenSSL library of symmetric ciphers see: [https://www.openssl.org/docs/manmaster/man1/enc.html](https://www.openssl.org/docs/manmaster/man1/enc.html).\n\n**List of supported ciphers**\n\n| Name | Cipher | Key size (bits) | Block size (bits) |\n| --- | --- | --- | --- |\n| bf-cbc | Blowfish in CBC mode | 128 | 64 |\n| bf | Alias for bf-cbc | 128 | 64 |\n| bf-cfb | Blowfish in CFB mode | 128 | 64 |\n| bf-ecb | Blowfish in ECB mode | 128 | 64 |\n| bf-ofb | Blowfish in OFB mode | 128 | 64 |\n| des-cbc | DES in CBC mode | 56 | 64 |\n| des | Alias for des-cbc | 56 | 64 |\n| des-cfb | DES in CBC mode | 56 | 64 |\n| des-ecb | DES in ECB mode | 56 | 64 |\n| des-ofb | DES in OFB mode | 56 | 64 |\n| des-ede-cbc | Two key triple DES EDE in CBC mode | 80 | 64 |\n| des-ede | Two key triple DES EDE in ECB mode | 80 | 64 |\n| des-ede-cfb | Two key triple DES EDE in CFB mode | 80 | 64 |\n| des-ede-ofb | Two key triple DES EDE in OFB mode | 80 | 64 |\n| des-ede3-cbc | Three key triple DES EDE in CBC mode | 112 | 64 |\n| des-ede3 | Three key triple DES EDE in ECB mode | 112 | 64 |\n| des3 | Alias for des-ede3-cbc | 112 | 64 |\n| des-ede3-cfb | Three key triple DES EDE in CFB mode | 112 | 64 |\n| des-ede3-ofb | Three key triple DES EDE in OFB mode | 112 | 64 |\n| desx | DESX algorithm | approx. 119 | 64 |\n| desx-cbc | DESX in CBC mode | approx. 119 | 64 |\n| aes-\\[128/192/256\\]-cbc | 128/192/256 bit AES in CBC mode | 128,192,256 | 128 |\n| aes-\\[128/192/256\\] | Alias for aes-\\[128/192/256\\]-cbc | 128,192,256 | 128 |\n| aes-\\[128/192/256\\]-cfb | 128/192/256 bit AES in 128 bit CFB mode | 128,192,256 | 128 |\n| aes-\\[128/192/256\\]-cfb1 | 128/192/256 bit AES in 1 bit CFB mode | 128,192,256 | 128 |\n| aes-\\[128/192/256\\]-cfb8 | 128/192/256 bit AES in 8 bit CFB mode | 128,192,256 | 128 |\n| aes-\\[128/192/256\\]-ecb | 128/192/256 bit AES in ECB mode | 128,192,256 | 128 |\n| aes-\\[128/192/256\\]-ofb | 128/192/256 bit AES in OFB mode | 128,192,256 | 128 |",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifEVPCipher",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifevpcipher.md"
+ }
+ ],
+ "name": "roEVPCipher",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roevpcipher.md"
+ },
+ "roevpdigest": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roEVPDigest"
+ }
+ ],
+ "description": "The EVP Digest component provides an interface to the OpenSSL EVP library of message digest algorithms. The EVP library provides a high-level interface to cryptographic hash functions.\n\nroEVPDigest processes an arbitrary amount of data and generates a hash of the data, using a selected algorithm.\n\n> For additional information on the OpenSSL library of message digest algorithms see: [http://www.openssl.org/docs/apps/dgst.html](http://www.openssl.org/docs/apps/dgst.html)\n\n**List of Supported Digest Algorithms**\n\n* md5 - MD5 message digest algorithm (default)\n* sha1 - SHA-1 message digest algorithm\n* sha224 - SHA-2, 224 bit variant\n* sha256 - SHA-2, 256 bit variant\n* sha384 - SHA-2, 384 bit variant\n* sha512 - SHA-2, 512 bit variant\n\n**Example: SHA1 Message Digest with roEVPDigest**\n\n```\nba = CreateObject(\"roByteArray\")\n' ...populate bytearray...\ndigest = CreateObject(\"roEVPDigest\")\ndigest.Setup(\"sha1\")\nresult = digest.Process(ba)\nprint result\n```\n\n**Example: MD5 Message Digest with roEVPDigest**\n\n```\nba1 = CreateOjbect(\"roByteArray\")\n' ...populate ba1...\nba2 = CreateObject(\"roByteArray\")\nba2.FromAsciiString(somestring)\ndigest = CreateObject(\"roEVPDigest\")\ndigest.Setup(\"md5\")\ndigest.Update(ba1)\ndigest.Update(ba2)\nresult = digest.Final()\nprint result\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifEVPDigest",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifevpdigest.md"
+ }
+ ],
+ "name": "roEVPDigest",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roevpdigest.md"
+ },
+ "rofilesystem": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roFileSystem"
+ }
+ ],
+ "description": "The roFilesystem component implements common filesystem inspection and modificationroutines.\n\nAll paths are matched case-insensitively, regardless of the case-sensitivity of the underlying filesystem. The supported character set is limited to only those characters supported by vfat filesystems (valid Windows characters). The usbplayer sample application is a good example of roFileSystem usage. USB devices with VFAT, NTFS, HFS, and HFS Plus filesystems are supported. The USB filesystems are currently mounted read only.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roFileSystem\")`",
+ "events": [
+ {
+ "name": "roFileSystemEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rofilesystemevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifFileSystem",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iffilesystem.md"
+ },
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "name": "roFileSystem",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rofilesystem.md"
+ },
+ "rofloat": {
+ "constructors": [],
+ "description": "roFloat is the object equivalent for intrinsic type 'Float'.\n\nThis is useful in the following situations:\n\n* If any object exposes the ifFloat interface, that object can be used in any expression that expects an intrinsic value.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifFloat",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iffloat.md"
+ },
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roFloat",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rofloat.md"
+ },
+ "rofont": {
+ "constructors": [],
+ "description": "roFont represents a particular font, from a font-family (eg. Arial), with a particular pixel size (e.g 20), and a particular boldness or italicness.\n\nIt is used in conjunction with [roFontRegistry](https://developer.roku.com/docs/references/brightscript/components/rofontregistry.md\"roFontRegistry\") to create and manage fonts. Font files are registered with roFontRegistry and then various methods in roFontRegistry can be used to create roFont objects. Applications should not create roFonts with CreateObject() but should always use roFontRegistry to create them. roFont objects in turn can be used with [ifDraw2D.DrawText](https://developer.roku.com/docs/references/brightscript/interfaces/ifdraw2d.mddrawtextrgba-as-integer-x-as-integer-y-as-integer-text-as-string-font-as-object-as-boolean \"ifDraw2D.DrawText\") to draw text on the screen or into bitmaps.\n\n**Example**\n\n```\nscreen = CreateObject(\"roScreen\")\nwhite = &hFFFFFFFF\nblue = &h0000FFFF\nfont_registry = CreateObject(\"roFontRegistry\")\nfont = font_registry.GetDefaultFont()\n\n' Draw white text in a blue rectangle\ntext = \"Hello world\"\nw = font.GetOneLineWidth(text, screen.GetWidth())\nh = font.GetOneLineHeight()\nx = 200\ny = 100\nborder = 8\nscreen.DrawRect(x, y, w + 2*border, h + 2*border, blue)\nscreen.DrawText(text, x+border, y+border, white, font)\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifFont",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iffont.md"
+ }
+ ],
+ "name": "roFont",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rofont.md"
+ },
+ "rofontmetrics": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "font",
+ "type": "String"
+ }
+ ],
+ "returnType": "roFontMetrics"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "dynamic"
+ }
+ ],
+ "returnType": "roFontMetrics"
+ }
+ ],
+ "deprecatedDescription": "This class is deprecated. Developers should use [roFont](/docs/references/brightscript/components/roFont.md \"roFont\") methods (GetOneLineHeight and GetOneLineWidth).\n",
+ "description": "> This class is deprecated. Developers should use [roFont](https://developer.roku.com/docs/references/brightscript/components/roFont.md\"roFont\") methods (GetOneLineHeight and GetOneLineWidth).\n\nThe roFontMetrics object allows you to get display size information for a specific font returned by the roFontRegistry.Get() method.\n\nIn order to use this object, you must first initialize the roFontMetrics object with a font name that had been previously registered with the roFontRegistry, then the total rendered size of strings in that font can be returned by roFontMetrics.Size().\n\nThis object is created with a string that represents the font to use in its size calculations:\n\n`CreateObject(\"roFontMetrics\", String font)`\n\n**Example: Simple use of roFontRegistry and roFontMetrics to render a string on the roImageCanvas**\n\n```\nhelloString = \"Hello ImageCanvas\"\n\nfontReg = CreateObject(\"roFontRegistry\")\nfontReg.Register(\"pkg:/fonts/LCDMono.ttf\")\nfont = fontReg.Get(\"LCDMono\",36,50,false) ' 36pt, 50 is normal\n ' weight, no italics\n\nfontMetrics = CreateObject(\"roFontMetrics\", font)\nstringSize = fontMetrics.size(helloString)\n\ncanvasItem = { \n Text:helloString\n TextAttrs:{Color:\"#FFCCCCCC\", Font:font, \n HAlign:\"HCenter\",\n VAlign:\"VCenter\", Direction:\"LeftToRight\"}\n TargetRect:{x:390,y:357, w:stringSize.w,h:stringSize.h}\n}\n\ncanvas = CreateObject(\"roImageCanvas\")\nport = CreateObject(\"roMessagePort\")\ncanvas.SetMessagePort(m.port)\n'Set opaque background\ncanvas.SetLayer(0, {Color:\"#FF000000\", CompositionMode:\"Source\"})\ncanvas.SetRequireAllImagesToDraw(true)\ncanvas.SetLayer(1, canvasItem)\ncanvas.Show()\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifFontMetrics",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iffontmetrics.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roFontMetrics",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rofontmetrics.md"
+ },
+ "rofontregistry": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roFontRegistry"
+ }
+ ],
+ "description": "The roFontRegistry object allows you to create roFont objects, either using the default font or using fonts in TrueType or OpenType files packaged with your application.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roFontRegistry\")`\n\n**Example**\n\n```\nreg = CreateObject(\"roFontRegistry\")\nfont = reg.GetDefaultFont(30, false, false)\nscreen = CreateObject(\"roScreen\")\nscreen.DrawText(\"hello world\", 100, 100, &hFFFFFFFF, font)\n```\n\n**Example using a font file**\n\n```\nreg.Register(\"pkg:/fonts/myfont.ttf\")\nfont = reg.GetFont(\"MyFont\", 30, false, false)\nscreen = CreateObject(\"roScreen\")\nscreen.DrawText(\"hello world\", 100, 100, &hFFFFFFFF, font)\n```\n\nFont files can quickly get very large, so be conscious of the size of the font files you include with your application. You should be able to find very good font files that are 50k or less. Anything larger is probably too big. The customvideoplayer sample application is a good example of usage.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifFontRegistry",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iffontregistry.md"
+ }
+ ],
+ "name": "roFontRegistry",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rofontregistry.md"
+ },
+ "rofunction": {
+ "constructors": [],
+ "description": "roFunction is the object equivalent for intrinsic type Function.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifFunction",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iffunction.md"
+ },
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roFunction",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rofunction.md"
+ },
+ "rogridscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roGridScreen"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Grid Screen provides a graphical display of poster art from multiple content categories from within a single screen.\n\nUsers can browse within a category list by scrolling horizonally and between category lists by scrolling vertically. There is an optional callout box in the lower right corner of the screen that can display details about the focused item without leaving the screen. Each item in the grid screen is represented by an image (aka poster), so any type of item that can be visually represented by an image can be displayed in the poster screen. It is used to show lists of data to users and common patterns include content categories, movies, podcasts, pictures, and search results. The initial release of roGridScreen only enabled the default list style, \"portrait\", using the following art sizes:\n\n* Artwork sizes: SD=110x150; HD=210x270\n\nIt also required grid posters to be .jpg files.\n\nLater Roku OS versions added mixed aspect ratio grids, and the [ifGridScreen](https://developer.roku.com/docs/references/brightscript/interfaces/ifgridscreen.md\"ifGridScreen\") interface [SetListPosterStyles()](https://developer.roku.com/docs/references/brightscript/interfaces/ifgridscreen.mdsetlistposterstylesstyles-as-object-as-void \"SetListPosterStyles()\") to set the aspect ratio of each row in the grid. If you want a mixed aspect ratio grid, you must call SetListPosterStyles() before you call [SetContentList()](https://developer.roku.com/docs/references/brightscript/interfaces/ifgridscreen.mdsetcontentlistrowindex-as-integer-contentlist-as-object-as-void \"SetContentList()\"), to avoid possible distortion of the graphic images in the grid.\n\n**Since Roku OS version 2.8**\n\nFile types of .png and .gif files are now supported, though they are converted internally to .jpg by the roGridScreen so they have a performance penalty.\n\nIn v2.8, there are now multiple grid styles that are specified in the SetGridStyle()method below. It's also worth going back and reviewing the appManager theme parameters in [roAppManager](https://developer.roku.com/docs/references/brightscript/components/roappmanager.md\"roAppManager\"), as v2.8 adds some new grid parameters. The border around the focused poster screen can be customized with the GridScreenFocusBorder images in png format. PNG files can have a transparent color value that you will need to allow the focused poster image to show through the border image. The corresponding offsets should be negative offsets that would be up and to the left of the top left corner of the poster image. The width of the borders should be the absolute values of the offsets and the rest of the image should be transparent inside. The GridScreenDescriptionImage is also positioned relative to the top left corner of the focused image. It can be positioned up and to the left with negative x and y offsets, below and to the right with positive offsets, or in the other corners with mixed signed x and y offsets. It's recommended that you include a \"callout\" tip pointing to the focused image in the GridScreenDescriptionImage.\n\n**Diagram: roGridScreen**\n\n![Diagram: roGridScreen](https://image.roku.com/ZHZscHItMTc2/roGridScreen.png \"roGridScreen\")\n\nThis object is created with no parameters:\n\n`CreateObject(\"roGridScreen\")`\n\n**Example**\n\n```\nFunction Main()\n port = CreateObject(\"roMessagePort\")\n grid = CreateObject(\"roGridScreen\")\n grid.SetMessagePort(port)\n rowTitles = CreateObject(\"roArray\", 10, true)\n for j = 0 to 10\n rowTitles.Push(\"[Row Title \" + j.toStr() + \" ] \")\n end for\n grid.SetupLists(rowTitles.Count())\n grid.SetListNames(rowTitles)\n for j = 0 to 10\n list = CreateObject(\"roArray\", 10, true)\n for i = 0 to 10\n o = CreateObject(\"roAssociativeArray\")\n o.ContentType = \"episode\"\n o.Title = \"[Title\" + i.toStr() + \"]\"\n o.ShortDescriptionLine1 = \"[ShortDescriptionLine1]\"\n o.ShortDescriptionLine2 = \"[ShortDescriptionLine2]\"\n o.Description = \"\"\n o.Description = \"[Description] \"\n o.Rating = \"NR\"\n o.StarRating = \"75\"\n o.ReleaseDate = \"[ For additional information on the OpenSSL HMAC functions, please see: [http://www.openssl.org/docs/crypto/hmac.html](http://www.openssl.org/docs/crypto/hmac.html)\n\n**Supported Digest Algorithms**\n\nThe supported digest algorithms are the same as those supported by [roEVPDigest](https://developer.roku.com/docs/references/brightscript/components/roevpdigest.md\"roEVPDigest\").\n\n**Example**\n\n```\nhmac = CreateObject(\"roHMAC\")\nsignature_key = CreateObject(\"roByteArray\")\nsignature_key.fromAsciiString(getKey())\nIf hmac.setup(\"sha1\", signature_key) = 0\n message = CreateObject(\"roByteArray\")\n message.fromAsciiString(getMessage())\n result = hmac.process(message)\n print result.toBase64String()\nEnd If\n\n\nhmac = CreateObject(\"roHMAC\")\nsignature_key = CreateObject(\"roByteArray\")\nsignature_key.fromAsciiString(getKey())\nIf hmac.setup(\"sha1\", signature_key) = 0\n message1 = CreateObject(\"roByteArray\")\n message1.fromAsciiString(getMessage1())\n hmac.update(message1)\n message2 = CreateObject(\"roByteArray\")\n message2.fromAsciiString(getMessage2())\n hmac.update(message2)\n result = hmac.final()\n print result.toBase64String()\nEnd If\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifHMAC",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhmac.md"
+ }
+ ],
+ "name": "roHMAC",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rohmac.md"
+ },
+ "rohttpagent": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roHttpAgent"
+ }
+ ],
+ "description": "All SceneGraph nodes can use the roHttpAgent component to support cookies, custom HTTP headers, and support secure HTTP file transfer protocols, such as passing certificates to the server as part of a URL transfer. An roHttpAgent component object is created by default for all SceneGraph nodes for this purpose. The roHttpAgent object supports the [ifHttpAgent](https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md\"ifHttpAgent\") interface used by many BrightScript components to allow secure HTTP file transfer protocols. Child nodes of a SceneGraph node automatically inherit the parent roHttpAgent object, unless a new roHttpAgent object is created, or an existing roHttpAgent is set for a child node. There are two roSGNode [ifSGNodeHttpAgentAccess](https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodehttpagentaccess.md\"ifSGNodeHttpAgentAccess\") interface methods that allow a specific roHttpAgent object to be selected and set for a specific SceneGraph node.\n\nAn roHttpAgent object is created automatically for all SceneGraph nodes, or can be created with no parameters:\n\n`CreateObject(\"roHttpAgent\")`\n\n> SceneGraph Audio and Video nodes always create a new roHttpAgent object and do not share it, and can use a different mechanism for HTTPS and cookie support, that involves setting certificates and cookies as Content Meta-Data attributes for the node ContentNode node.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ }
+ ],
+ "name": "roHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rohttpagent.md"
+ },
+ "roimagecanvas": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roImageCanvas"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe roImageCanvas component provides an interface to render graphic elements at specific spots on the screen.\n\nAlthough it is not intended to be a full-fledged graphics component for high-performance gaming, it does provide a simple interface for building custom animations out of arrays of images displayed on the screen.\n\nAn item (graphical element) may be one of three types: image, text, or colored rectangle. The item type is determined by the [Content Meta-data](/docs/developer-program/getting-started/architecture/content-metadata.md \"Content Meta-data\") fields set on the item.",
+ "events": [
+ {
+ "name": "roImageCanvasEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/roimagecanvasevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifImageCanvas",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifimagecanvas.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roImageCanvas",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roimagecanvas.md"
+ },
+ "roimagemetadata": {
+ "constructors": [],
+ "description": "The roImageMetadata component provides developers access to image file metadata included in many .jpg EXIF headers.\n\nroImageMetadata currently only works with local file Urls.\n\nThis object is created without any arguments:\n\n`CreateObject(\"roImageMetadata\")`",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifImageMetadata",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifimagemetadata.md"
+ }
+ ],
+ "name": "roImageMetadata",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roimagemetadata.md"
+ },
+ "roinput": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roInput"
+ }
+ ],
+ "description": "An roInput object can be used to receive events sent from a network client using the External Control Protocol (ECP), as described in [External Control API](/docs/developer-program/debugging/external-control-api.md \"External Control API\").\n\n> The [supports\\_input\\_launch manifest flag](/docs/developer-program/getting-started/architecture/channel-manifest.md#launch-requirement-attributes) must be set for channels to accept deep linking parameters when already running. This flag enables deep linking into content without relaunching the channel. See the [Deep Linking sample channel](https://github.com/rokudev/deep-Linking-samples) for how to use roInput to handle deep links into content while the channel is already running.\n\nRefer to [External Control Service Commands](/docs/developer-program/debugging/external-control-api.md#external-control-service-commands \"External Control Service Commands\") for information about the ECP input command.\n\nThis object is created without any arguments:\n\n`CreateObject(\"roInput\")`\n\n**Example**\n\nThe following prints information received from an external device in JSON format. If the external device sends the following input command:\n\n```\ncurl -d '' ':8060/input?my_event=My%20Test&x=100&y=200&action=start'\n```\n\nThe following will be printed:\n\n```\n{\"action\":\"start\",\"my_event\":\"My Test\",\"x\":\"100\",\"y\":\"200\"}\n```\n\n**roInput Example**\n\n```\nmsgPort = CreateObject(\"roMessagePort\")\n\ninput = CreateObject(\"roInput\")\ninput.SetMessagePort(msgPort)\n\nprint \"Waiting for messages...\"\nwhile true\n msg = wait(0, msgPort)\n if type(msg) = \"roInputEvent\"\n if msg.IsInput()\n info = msg.GetInfo()\n print \"Received input: \"; FormatJSON(info)\n end if\n end if\nend while\n```",
+ "events": [
+ {
+ "name": "roInputEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/roinputevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifInput",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifinput.md"
+ }
+ ],
+ "name": "roInput",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roinput.md"
+ },
+ "roint": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roInt"
+ }
+ ],
+ "description": "roInt is the object equivalent for intrinsic type Integer.\n\nThis is useful in the following situations:\n\n* When an object is needed, instead of an intrinsic value. For example, \"roList\" maintains a list of objects. If an Integer is added to roList, it will be automatically wrapped in an roInt by the language interpreter. When a function that expects a BrightScript Component as a parameter is passed an int, BrightScript automatically creates the equivalent BrightScript Component.\n* If any object exposes the ifInt interface, that object can be used in any expression that expects an intrinsic value. For example, in this way an roTouchEvent can be used as an integer whose value is the userid of the roTouchEvent.\n\n> If o is an roInt, then the following statements have the following effects\n> \n> print o ' prints o.GetInt()\n> \n> i%=o ' assigns the integer i% the value of o.GetInt()\n> \n> k=o 'presumably k is dynamic typed, so it becomes another reference to the roInt o\n> \n> o=5 'this is NOT the same as o.SetInt(5). Instead it releases o, and 'changes the type of o to Integer (o is dynamically typed). And assigns it to 5.\n\n**Example**\n\n```\nBrightScript> o=CreateObject(\"roInt\")\nBrightScript> o.SetInt(555)\nBrightScript> print o\n555\nBrightScript> print o.GetInt()\n555\nBrightScript> print o-55\n500\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifInt",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifint.md"
+ },
+ {
+ "name": "ifIntOps",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifintops.md"
+ },
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roInt",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roint.md"
+ },
+ "roinvalid": {
+ "constructors": [],
+ "description": "roInvalid is the object equivalent for intrinsic type 'Invalid'.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roInvalid",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roinvalid.md"
+ },
+ "rokeyboardscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roKeyboardScreen"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Keyboard Screen is designed to allow the user to enter an alpha-numeric string for searching, username/password registration or other purposes.\n\nThis component is generally used as part of a sequence of screens and the results are displayed on the subsequent screen in the sequence. In the case of a search screen, results are displayed on the roPosterScreen and categories may be used to segregate TV and Movie results.\n\n**Diagram: roKeyboardScreen**\n\n![**Diagram: roKeyboardScreen**](https://image.roku.com/ZHZscHItMTc2/roKeyboardScreenImage1.png \"roKeyboardScreenImage1\")\n\n**Example**\n\n```\nSub Main()\n screen = CreateObject(\"roKeyboardScreen\")\n port = CreateObject(\"roMessagePort\")\n screen.SetMessagePort(port)\n screen.SetTitle(\"Search Screen\")\n screen.SetText(\"default\")\n screen.SetDisplayText(\"enter text to search\")\n screen.SetMaxLength(8)\n screen.AddButton(1, \"finished\")\n screen.AddButton(2, \"back\")\n screen.Show()\n\n while true\n msg = wait(0, screen.GetMessagePort())\n print \"message received\"\n if type(msg) = \"roKeyboardScreenEvent\"\n if msg.isScreenClosed()\n return\n else if msg.isButtonPressed() then\n print \"Evt:\"; msg.GetMessage ();\" idx:\"; msg.GetIndex()\n if msg.GetIndex() = 1\n searchText = screen.GetText()\n print \"search text: \"; searchText\n return\n endif\n endif\n endif\n end while\nEnd Sub\n```\n\n**Image: roKeyboardScreen example results**\n\n![Image: roKeyboardScreen example results](https://image.roku.com/ZHZscHItMTc2/roKeyboardScreenImage2.png \"roKeyboardScreenImage2\")",
+ "events": [
+ {
+ "name": "roKeyboardScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rokeyboardscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifKeyboardScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifkeyboardscreen.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roKeyboardScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rokeyboardscreen.md"
+ },
+ "rolist": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roList"
+ }
+ ],
+ "description": "The list object implements the interfaces: ifList, ifArray, ifEnum and therefore can behave like an array that can dynamically add members. The array operator \\[ \\] can be used to access any element in the ordered list.\n\n**Example**\n\nImplementation:\n\n```\nlist = CreateObject(\"roList\")\nlist.AddTail(\"a\")\nlist.AddTail(\"b\")\nlist.AddTail(\"c\")\nlist.AddTail(\"d\")\nlist.ResetIndex()\nx= list.GetIndex()\nwhile x <> invalid\n print x\n x = list.GetIndex()\nend while\n\n\nprint list[2]\n```\n\nOutput:\n\n```\na\nb\nc\nd\nc \n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarray.md"
+ },
+ {
+ "name": "ifArrayGet",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayget.md"
+ },
+ {
+ "name": "ifArraySet",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayset.md"
+ },
+ {
+ "name": "ifEnum",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifenum.md"
+ },
+ {
+ "name": "ifList",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iflist.md"
+ },
+ {
+ "name": "ifListToArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iflisttoarray.md"
+ }
+ ],
+ "name": "roList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rolist.md"
+ },
+ "rolistscreen": {
+ "constructors": [],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe List Screen provides a graphical display of content in a vertical list within a single screen.\n\nUsers can browse the content by scrolling the text list vertically. The vertical list is displayed on the left side of the screen and the poster is displayed on the right side of the screen. As the user scrolls through the content, the poster is updated with the poster art of the focused list item. There is an optional short description text below the poster that can display the description of the focused item and gets updated as the user scrolls the list.\n\nThe poster art uses the following art sizes:\n\n```\n Artwork sizes: SD=136x124; HD=250x250\n```\n\nroListScreen has a default dark highlight for the focused list item. The highlight can be customized by including a .png file with the following dimensions:\n\n```\n Highlight sizes: SD=304x38; HD=511x54\n```\n\n![List Screen Draft](https://image.roku.com/ZHZscHItMTc2/roListScreen.png \"roListScreen\")",
+ "events": [
+ {
+ "name": "roListScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rolistscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifListScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iflistscreen.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roListScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rolistscreen.md"
+ },
+ "rolocalization": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roLocalization"
+ }
+ ],
+ "description": "The roLocalization object provides functions to assist in localization. This object provides functions to assist in localization.\n\nIt is created with no parameters:\n\n`CreateObject(\"roLocalization\")`\n\n**Example**\n\n```\nloc = CreateObject(\"roLocalization\")\nimage = loc.GetLocalizedAsset(\"images\", \"splash.png\")\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifLocalization",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iflocalization.md"
+ }
+ ],
+ "name": "roLocalization",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rolocalization.md"
+ },
+ "rolonginteger": {
+ "constructors": [],
+ "description": "roLongInteger is the object name corresponding to the intrinsic LongInteger object.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifLongInt",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iflongint.md"
+ },
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roLongInteger",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rolonginteger.md"
+ },
+ "romessagedialog": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roMessageDialog"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Message Dialog displays a formatted, multi-line text message to the user. The dialog may optionally be displayed with a busy animation to indicate progress on a long running operation. The dialog will automatically handle formatting of text and resize to fit. It may also display buttons to get user acknowledgment or a selection choice.\n\nThe following example shows an roMessageDialog with a single done button. When the title, text and button are added, the dialog automatically formats and resizes the dialog as needed for display when Show() is called.\n\n**Diagram: roMessageDialog**\n\n![Diagram: roMessageDialog](https://image.roku.com/ZHZscHItMTc2/roMessageDialog.png \"roMessageDialog\")\n\n**Example**\n\nThe following code example creates a message dialog and displays it to the user. Note that dialogs are not full screen and that the previous screen is dimmed and displays in the background. When the user presses the message dialog button, the dialog is dismissed and the previous screen comes to the foreground. Since dialog.EnableBackButton(true) is also called, the message dialog is dismissed when the remote control's back button is pressed as well. You can of course add additional buttons to your message dialogs that do things other than dismiss the dialog. You would simply need to implement button specific event handling code for these cases in the dlgMsg.isButtonPressed() code block.\n\n```\nFunction ShowMessageDialog() As Void\n port = CreateObject(\"roMessagePort\")\n dialog = CreateObject(\"roMessageDialog\")\n dialog.SetMessagePort(port)\n dialog.SetTitle(\"[Message dialog title]\")\n dialog.SetText(\"[Message dialog text............]\")\n\n dialog.AddButton(1, \"[button text]\")\n dialog.EnableBackButton(true)\n dialog.Show()\n While True\n dlgMsg = wait(0, dialog.GetMessagePort())\n If type(dlgMsg) = \"roMessageDialogEvent\"\n if dlgMsg.isButtonPressed()\n if dlgMsg.GetIndex() = 1\n exit while\n end if\n else if dlgMsg.isScreenClosed()\n exit while\n end if\n end if\n end while\nEnd Function\n```\n\n**Image: roMessageDialog example results**\n\n![roMessageDialog example results](https://image.roku.com/ZHZscHItMTc2/roMessageDialogimage2.png \"roMessageDialogimage2\")",
+ "events": [
+ {
+ "name": "roMessageDialogEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/romessagedialogevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifMessageDialog",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifmessagedialog.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roMessageDialog",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/romessagedialog.md"
+ },
+ "romessageport": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roMessagePort"
+ }
+ ],
+ "description": "A Message Port is the place messages ([events](/docs/developer-program/core-concepts/event-loops.md)) are sent.\n\nWhen using BrightScript, you would not call these functions directly. Instead, use the \"Wait\" BrightScript statement.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roMessagePort\")`",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifmessageport.md"
+ }
+ ],
+ "name": "roMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/romessageport.md"
+ },
+ "romicrophone": {
+ "constructors": [],
+ "description": "The roMicrophone API allows channel applications to receive audio data from the user’s microphone-supported remote control device or mobile phone. When a user initiates recording on their remote control device or mobile phone (via the Roku Mobile App) for the first time within the application, the application will request the user’s permission for the application to access the microphone by displaying a UI dialog box.\n\nThe application will only receive microphone access if the permission is granted by the user.\n\n![microphone-access](https://image.roku.com/ZHZscHItMTc2/microphone-access.jpg \"microphone-access\")\n\nAfter the permission is granted, whenever a user activates the microphone, the application will display a notice informing the user that the microphone is currently being used by the application.\n\nFrom the settings menu (Settings > Privacy > Microphone), the user can revoke microphone permissions from individual applications, at which time the particular application will not be able to access the microphone unless the user re-enables microphone permissions.\n\nFrom the settings menu, the user may also:\n\n* (a) enable universal microphone access permissions for all applications (thereby eliminating the need to request microphone permission on an application by application basis), and\n* (b) prohibit all applications from accessing the microphone.\n\n![microphone-setting](https://image.roku.com/ZHZscHItMTc2/microphone-setting.jpg \"microphone-setting\")\n\nWhen integrating the roMicrophone API, you acknowledge and agree to the following:\n\n* (i) that you will notify your users of your collection, use, and disclosure of any voice recordings or other derived data that you receive through the roMicrophone API;\n* (ii) you will not modify, circumvent, obscure, or otherwise diminish the notices provided by the roMicrophone API to users when they activate or enable microphone recording from their remote control device or mobile phone;\n* (iii) you will not collect any information from, or otherwise activate, the microphone on any remote control device or mobile phone using the roMicrophone API feature without receiving the requisite permissions from the user;\n* (iv) you have and will maintain a legally adequate privacy policy;\n* (v) you have and will maintain all necessary rights and consents from users to use the roMicrophone API features; and\n* (vi) your use of the roMicrophone API features will comply with all applicable laws, rules, and regulations.\n\nYOU FURTHER AGREE YOU WILL NOT USE THE roMicrophone API AND FEATURES IN CONNECTION WITH CONTENT OR CHANNELS DIRECTED TOWARD CHILDREN OR IN CONNECTION WITH USERS KNOWN TO BE CHILDREN. If Roku discovers or determines that you are using the roMicrophone API and features in connection with content or channels directed toward children or with users known to be children, Roku reserves the right to disable or otherwise limit your access to the roMicrophone API feature and related functionality.\n\nYOU MAY NOT ENABLE THE roMicrophone API FEATURES IF YOU DO NOT AGREE TO ABOVE. PLEASE CONTACT ROKU FOR FURTHER INFORMATION. Implementation\n\nThe application should display a focusable button or indicator in the UI that the user selects by pressing and holding the OK button. In response to the OK press event, the application can call:\n\n* [StartRecording()](https://developer.roku.com/docs/references/brightscript/interfaces/ifmicrophone.md\"StartRecording\") - to receive streamed audio data from the microphone asynchronously or\n* [RecordToFile()](https://developer.roku.com/docs/references/brightscript/interfaces/ifmicrophone.md\"RecordToFile()\") - to have the audio data directly captured to a WAV format output file.\n\n> Roku OS will display a HUD to let the user initially consent to be recorded and to subsequently be informed when the microphone is being used. Recording is performed as long as the user holds down the OK button, or until a limit is reached or if an error should occur.",
+ "events": [
+ {
+ "name": "roMicrophoneEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/romicrophoneevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifMicrophone",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifmicrophone.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "name": "roMicrophone",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/romicrophone.md"
+ },
+ "roonelinedialog": {
+ "constructors": [],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe One Line Dialog is a special type of dialog optimized for single line text.\n\nUnlike the message dialog ([roMessageDialog](https://developer.roku.com/docs/references/brightscript/components/roMessageDialog.md\"roMessageDialog\")) which displays formatted multi-line messages, roOneLineDialog displays a single line of text centered for the user.\n\nThis dialog is optimized for rendering of single-line text strings. It is generally used for displaying text to indicate that an operation is in progress. When the operation completes, the dialog is destroyed and the message dialog disappears.",
+ "events": [
+ {
+ "name": "roOneLineDialogEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/roonelinedialogevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifGetMessagePort.md"
+ },
+ {
+ "name": "ifOneLineDialog",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifonelinedialog.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roOneLineDialog",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roonelinedialog.md"
+ },
+ "roparagraphscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roParagraphScreen"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Paragraph Screen provides a way to display text and selection choices to the user.\n\nThis type of screen is frequently used for implementing wizard functionality to guide the user through a specific task. The caller may specify header text which is displayed at the top of the screen and one or more paragraphs of text on the screen. In addition, one or more buttons may be added to the screen to get user input or allow navigation. The screen is designed to automatically format the text, headings and buttons and create the photo-fit for them on screen. Some care must be taken to not provide too much text or clipping may occur.\n\n![roParagraphScreen image](https://image.roku.com/ZHZscHItMTc2/roParagraphScreenImage1.png \"roParagraphScreenImage1\")\n\nThis object is created with no parameters:\n\n`CreateObject(\"roParagraphScreen\")`\n\n**Example**\n\n```\nFunction ShowParagraphScreen() As Void\n port = CreateObject(\"roMessagePort\")\n screen = CreateObject(\"roParagraphScreen\")\n screen.SetMessagePort(port)\n screen.SetTitle(\"[Screen Title]\")\n screen.AddHeaderText(\"[Header Text]\")\n screen.AddParagraph(\"[Paragraph text 1 - Text in the paragraph screen is justified to the right and left edges]\")\n screen.AddParagraph(\"[Paragraph text 2 - Multiple paragraphs may be added to the screen by simply making additional calls]\")\n screen.AddButton(1, \"[button text 1]\")\n screen.AddButton(2, \"[button text 2]\")\n screen.Show()\n while true\n msg = wait(0, screen.GetMessagePort())\n if type(msg) = \" roParagraphScreenEvent\"\n exit while\n endif\n end while\nEnd Function\n```\n\n**Image: roParagraphScreen example results**\n\n![Image: roParagraphScreen example results](https://image.roku.com/ZHZscHItMTc2/roParagraphScreenImage2.png \"roParagraphScreenImage2\")",
+ "events": [
+ {
+ "name": "roParagraphScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/roparagraphscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifParagraphScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifparagraphscreen.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roParagraphScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roparagraphscreen.md"
+ },
+ "ropath": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "string"
+ }
+ ],
+ "returnType": "roPath"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "dynamic"
+ }
+ ],
+ "returnType": "roPath"
+ }
+ ],
+ "description": "The roPath component provides developers an easy way to create valid file system paths.\n\nThe roPath component is a convenience class that implements [ifString](https://developer.roku.com/docs/references/brightscript/interfaces/ifstring.md\"ifString\") while providing additional validation and path inspection functionality. See [File System](docs/developer-program/getting-started/architecture/file-system.md \"File System\") for more information about valid path names.\n\nThis object is created with a string that represents the initial path:\n\n`CreateObject(\"roPath\", \"ext1:/vid\")`\n\n**Example**\n\n```\npath = CreateObject(\"roPath\", filename)\nparts = path.Split()\nif parts.phy = \"tmp:\" then print \"this is a temp file\"\nif parts.extension = \".bmp\" then print \"this is a bitmap file\"\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifPath",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifpath.md"
+ },
+ {
+ "name": "ifString",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifstring.md"
+ }
+ ],
+ "name": "roPath",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/ropath.md"
+ },
+ "ropinentrydialog": {
+ "constructors": [],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Pin Entry Dialog is designed to allow the user to enter a numeric PIN for purchasing content.\n\nUsers establish a PIN on the partner's website for purchasing transactions. The roPinEntryDialog allows the script to present the user with a pop-up, modal dialog for PIN entry and then the script can subsequently call the API's to conclude the purchase transaction. When the last digit is entered, focus jumps to the first button.\n\n**Image: roPinEntryDialog sample**\n\n![roPinEntryDialog](https://image.roku.com/ZHZscHItMTc2/roPinEntryDialog.png \"roPinEntryDialog\")",
+ "events": [
+ {
+ "name": "roPinEntryDialogEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/ropinentrydialogevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifPinEntryDialog",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifpinentrydialog.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roPinEntryDialog",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/ropinentrydialog.md"
+ },
+ "roposterscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roPosterScreen"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roPosterScreen\")`\n\nThe Poster Screen provides a graphical display of poster art for content selection or can be used as a submenu to provide hierarchical structure to the application.\n\nIn some cases, applications may wish to present a flat single-level list of titles in a queue, but the Poster Screen can also be used at multiple levels in the application to provide hierarchical browsing. It also provides an optional \"filter banner\" for displaying categories representing filtered subsets of the data or categorized groups.\n\nEach item in the poster screen is represented by an image (aka poster), so any type of item that can be visually represented by an image can be displayed in the poster screen. It is used to show lists of data to users and common patterns include content categories, movies, podcasts, and search results.\n\nJust below the overhang is the filter banner. It allows a method of easily selecting or filtering content based on categories. The categories are set by the developer during screen initialization, and the script is notified when a new category is highlighted or selected. Based on the event notification, the script can set the desired content in the view. The filter banner is optional.\n\n**Diagram: roPosterScreen (flat-category)**\n\n![Diagram: roPosterScreen (flat-category)](https://image.roku.com/ZHZscHItMTc2/roPosterScreenImage1.png \"roPosterScreenImage1\")\n\nShortDescriptionLine1 from the content metadata. Generally the category title.\n\nShortDescriptionLine2 from the content metadata. Generally a description for the category.\n\n**Diagram: roPosterScreen (arced-landscape)**\n\n![Diagram: roPosterScreen (arced-landscape](https://image.roku.com/ZHZscHItMTc2/roPosterScreenImage2.png \"roPosterScreenImage2\")\n\n**Diagram: roPosterScreen (arced-portrait)**\n\n![Diagram: roPosterScreen (arced-portrait)](https://image.roku.com/ZHZscHItMTc2/roPosterScreenImage3.png \"roPosterScreenImage3\")\n\n**Diagram: roPosterScreen (flat-episodic)**\n\n![Diagram: roPosterScreen (flat-episodic)](https://image.roku.com/ZHZscHItMTc2/roPosterScreenImage4.png \"roPosterScreenImage4\")\n\nTV content is often displayed as a series of episodes within a season. The flat-episodic screen type provides a standard way to display episodic content, such as a TV series.\n\nThere is also a flat-episodic-16x9-episodic screen type to display episodic content with 16x9 images.\n\nThe paragraph text allows the user to view the synopsis for the currently selected episode. As the user scrolls right/left to select a new episode, the paragraph text and the short description lines are updated to reflect the description of the highlighted episode\n\nIn order to see poster art in the side posters instead of episode numbers, please ensure that the SDPosterUrl and HDPosterUrl are defined for the content and that episodeNumber is not defined for that content. EpisodeNumber overrides the poster URL.\n\n**Example**\n\n```\nFunction Main()\n port = CreateObject(\"roMessagePort\")\n poster = CreateObject(\"roPosterScreen\")\n poster.SetBreadcrumbText(\"[location1]\", \"[location2]\")\n poster.SetMessagePort(port)\n list = CreateObject(\"roArray\", 10, true)\n For i = 0 To 10\n o = CreateObject(\"roAssociativeArray\")\n o.ContentType = \"episode\"\n o.Title = \"[Title]\"\n o.ShortDescriptionLine1 = \"[ShortDescriptionLine1]\"\n o.ShortDescriptionLine2 = \"[ShortDescriptionLine2]\"\n o.Description = \"\"\n o.Description = \"[Description] \"\n o.Rating = \"NR\"\n o.StarRating = \"75\"\n o.ReleaseDate = \"[ Please see the PCRE documentation ([http://www.pcre.org/](http://www.pcre.org/)) for documentation on the PCRE library used for regular expression matching. See the [perlre documentation](http://perldoc.perl.org/perlre.html) for complete documentation of the possible regular expressions this library can parse and match. In general, most Perl compatible regular expressions are supported.\n\nThis object is created with a string that represents the matching-pattern and a string to indicate flags that modify the behavior of the matching operation(s):\n\n`CreateObject(\"roRegex\", \"[a-z]+\", \"i\")`\n\nThe match string (\"\\[a-z\\]+\" in the example above, which matches all lowercase letters) can include most Perl compatible regular expressions documented in the PCRE documentation ([http://www.pcre.org/](http://www.pcre.org/)).\n\nAny combination of the following behavior flags (\"i\" in the example above which modifies to match upper and lowercase letters) is supported:\n\n* \"i\" Case insensitive match\n* \"m\" Multiline mode. The start of line \"^\" and end of line \"$\" constructs match immediately following or before any newline in the subject string as well as the very start and end of the string. Normally, just the start and end of the string would match.\n* \"s\" Sets dot-all mode that includes newline in the \".\\*\" regular expression. This modifier is equivalent to Perl's /s modifier.\n* \"x\" Sets extended mode that ignores whitespace characters except when escaped or inside a character class. Characters between an unescaped # outside a character a character class and the next newline character, inclusive, are also ignored. This modifier is equivalent to Perl's /x modifier.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifRegex",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifregex.md"
+ }
+ ],
+ "name": "roRegex",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roregex.md"
+ },
+ "roregion": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "bitmap",
+ "type": "Object"
+ },
+ {
+ "isRequired": true,
+ "name": "x",
+ "type": "Integer"
+ },
+ {
+ "isRequired": true,
+ "name": "y",
+ "type": "Integer"
+ },
+ {
+ "isRequired": true,
+ "name": "width",
+ "type": "Integer"
+ },
+ {
+ "isRequired": true,
+ "name": "height",
+ "type": "Integer"
+ }
+ ],
+ "returnType": "roRegion"
+ }
+ ],
+ "description": "The roRegion component is used to represent a subsection of a bitmap.\n\nThe region is specified with an x,y, width, and height as well as a time field for use with animated sprites and a wrap field which causes the region to wrap during scrolling. The roRegion is a common parameter used by the drawing functions of [roBitmap](https://developer.roku.com/docs/references/brightscript/components/robitmap.md\"roBitmap\"). Wrap and Time are used by [roCompositor](https://developer.roku.com/docs/references/brightscript/components/roCompositor.md\"roCompositor\"). roRegion is also used to specify a pretranslation (x,y) for the draw, rotate, and scale operation. The pretranslation is normally used to specify the center of the region. The scaling operation is controlled by the scalemode specified in the region.\n\nThis object is created with parameters to initialize the x,y coordinates, width, height. If time and wrap are desired, use the SetTime() and SetWrap().\n\n`CreateObject(\"roRegion\", Object bitmap, Integer x, Integer y,Integer width, Integer height)`",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifRegion",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifregion.md"
+ }
+ ],
+ "name": "roRegion",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roregion.md"
+ },
+ "roregistry": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roRegistry"
+ }
+ ],
+ "description": "The Registry is an area of non-volatile storage where a small number of persistent settings can be stored.\n\nThe Registry provides a means for an application to write and read small amounts of data such as settings, scores, etc. The data persists even if the user exits the application and even if the player is rebooted. Registry data is removed only when the application explicitly removes it, the user uninstalls the application, which remove the registry for the application, or the user performs a factory reset, which removes the registry for all applications.\n\nAccess to the registry is available through the roRegistry object. This object is created with no parameters:\n\n`CreateObject(\"roRegistry\")`\n\nThere is a separate registry for each [developer ID](/docs/developer-program/publishing/packaging-channels.md#step-3-run-the-genkey-utility-to-create-a-signing-key \"developer ID\"). This allows multiple applications to use the registry without being able to read or modify the registry from other applications. If desired, a single registry can be shared across multiple applications by using the same developer ID to package the applications. This is the conventional way that an \"application suite\" with shared preferences and other shared information should work. Each registry is divided into sections which are specified by the developer for organization and grouping of attributes. Methods in ifRegistry are provided to list the sections in the registry and to provide access to the data in each section.\n\n> The maximum size of each zlib-compressed application registry is **16K bytes**. Channels should minimize the amount of data stored in the registry and the frequency in which they update it.\n> \n> Use the **ifRegistry.GetSpaceAvailable()** function to check the number of bytes available in the registry.\n\nThe Registry also supports the use of a special transient registry section. A registry section named \"Transient\" can be used to store attributes that have the lifetime of a single boot. Within a specific boot session, these values will be persistent to the application and stored as any other registry value. Whenever the user reboots the Roku Streaming Player, all \"Transient\" registry sections are removed and the values no longer persist. This technique is useful for caching data to minimize network access, yet still ensuring that this data is always fresh after a system reboot.\n\nThe registry is encrypted, and updates are relatively performance intensive and should be used sparingly. Note that all writes to the registry are delayed, and not committed to non-volatile storage until ifRegistry.Flush() or ifRegistrySection.Flush() is explicitly called. The platform may choose opportune times to flush data on its own, but no application is technically correct unless it explicitly calls Flush() at appropriate times. Flushing the registry is a relatively time-consuming operation, so it should be done as infrequently as possible. The Registry data is stored in a fault tolerant manner by preserving a backup for each write which is automatically rolled-back in the event of a failure.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifRegistry",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifregistry.md"
+ }
+ ],
+ "name": "roRegistry",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roregistry.md"
+ },
+ "roregistrysection": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "section",
+ "type": "String"
+ }
+ ],
+ "returnType": "roRegistrySection"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "string"
+ }
+ ],
+ "returnType": "roRegistrySection"
+ }
+ ],
+ "description": "A Registry Section enables the organization of settings within the registry. Different registry sections may have their own keys with the same name. In other words, key names are scoped within the registry section to which they belong.\n\nThis object must be supplied with a \"section\" name on creation. If no such section exists, it will be created. Section names are case sensitive, so sections named \"Settings\" and \"settings\" are two different sections.\n\n`CreateObject(\"roRegistrySection\", section as String)`\n\n**Example: Get and set some user authentication in the registry**\n\n```\nFunction GetAuthData() As Dynamic\n sec = CreateObject(\"roRegistrySection\", \"Authentication\")\n if sec.Exists(\"UserRegistrationToken\")\n return sec.Read(\"UserRegistrationToken\")\n endif\n return invalid\nEnd Function\n\nFunction SetAuthData(userToken As String) As Void\n sec = CreateObject(\"roRegistrySection\", \"Authentication\")\n sec.Write(\"UserRegistrationToken\", userToken)\n sec.Flush()\nEnd Function\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifRegistrySection",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifregistrysection.md"
+ }
+ ],
+ "name": "roRegistrySection",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roregistrysection.md"
+ },
+ "rorsa": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roRSA"
+ }
+ ],
+ "description": "The RSA component provides an interface to the OpenSSL RSA library of signing algorithms.\n\nThis component can be used to sign/verify using RSA.\n\nTypically, you would use the roEVPDigest component to create a message digest, then use roRSA to sign it.\n\n**Example: RSA signing using SHA1**\n\n```\nba = CreateObject(\"roByteArray\")\n\n' ...populate bytearray...\n\ndigest = CreateObject(\"roEVPDigest\")\ndigest.Setup(\"sha1\")\nhashString = digest.Process(ba)\nhashBA = CreateObject(\"roByteArray\")\nhashBA.FromHexString(hashString)\nrsa = CreateObject(\"roRSA\")\n\n' ... save private key to tmp:/privateKey.txt\n\nrsa.SetPrivateKey(\"tmp:/privateKey.txt\")\nrsa.SetDigestAlgorithm(\"sha1\")\nsignature = rsa.Sign(hashBA)\n```\n\n**Example: RSA verification using SHA1**\n\n```\nrsa = CreateObject(\"roRSA\")\nrsa.SetPublicKey(:tmp:/publicKey.txt\")\nrsa.SetDigestAlgorithm(\"sha1\")\n\n' see hashBA and signature from above example\n\nresult = rsa.Verify(hashBA, signature)\nif (result = 1)\n print \"Verified\"\nelse\n print \"Not verified, result = \" ; result\nend if\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifRSA",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifrsa.md"
+ }
+ ],
+ "name": "roRSA",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rorsa.md"
+ },
+ "roscreen": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "boolean"
+ },
+ {
+ "isRequired": true,
+ "name": "param2",
+ "type": "integer"
+ },
+ {
+ "isRequired": true,
+ "name": "param3",
+ "type": "integer"
+ }
+ ],
+ "returnType": "roScreen"
+ },
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "boolean"
+ }
+ ],
+ "returnType": "roScreen"
+ },
+ {
+ "params": [],
+ "returnType": "roScreen"
+ }
+ ],
+ "description": "The roScreen component provides a full screen drawing surface that can be stacked and that you can receive input events from.\n\nYou will need at least one roScreen component in your 2D game application to draw on and get events from. The origin (0,0) is the top left corner of the screen. The pixels are always RGBA 32 bits. Multiple roScreen components stack, and like other screen components only the top screen is viewable and gets events. An roScreen that is not the top most screen can still be drawn to.\n\n> Once an roScreen is created, the display stack enters \"Game Mode\", and other screen components cannot be used. Screensavers will also be disabled and will appear as a black screen in its place. Other screen components cannot be intermixed with roScreens as the roScreen display stack is maintained independently from the main screen component display stack. When the final roScreen component is closed, other screen components can be used again.\n\nWhen the roScreen constructor is called, an optional double buffer flag, and an optional resolution can be passed. If the screen is double buffered, two buffers are fully allocated when CreateObject() succeeds. If the screen is single buffered only one buffer is allocated and the \"front\" and \"back\" buffers in method descriptions below are the same buffer. When a screen is created with a different resolution than the output display, it is scaled automatically to the output display resolution.\n\nTo maintain proper aspect ratio, and take care of the different pixel aspect ratio in HD vs SD; there is a fixed set of bitmap resolutions that are allowed to be created for screens:\n\n**HD mode screensizes**\n\n* 1280x720PAR=1:1 (default for HD)\n* 854x480 PAR=1:1 useful for higher performance HD games, also for 640x480 games\n* 940x480 PAR=1.1:1 used for displaying a RokuSD (720x480) games\n\n**SD mode screensizes**\n\n* 720x480 PAR=1.1:1 (default for SD)\n* 640x480 PAR=1:1 (used for 640x480 games)\n* 854x626 PAR=1:1 (used for 854x480 HD games)\n\nThe screen dimensions correspond to the drawable area that applications see. The dimensions were chosen so that applications do not need to compensate for screen aspect ratio or pixel aspect ratio.\n\nIt's likely that when porting games from other platforms, the active game area may be smaller and correspond to more traditional dimensions. In this case, the application can supply letterbox or pillarbox artwork and use an [roRegion](https://developer.roku.com/docs/references/brightscript/components/roregion.md\"roRegion\") to define the active area. The roRegion will translate and clip graphics to the proper area for the game. Similarly, roRegions are used to describe the left and right pillars for an SD game in HD mode, or the upper and lower letterbox regions for an HD game in SD mode.\n\nGames that require more performance should use smaller dimensions. Games should run in HD and SD mode. The screensizes HD 854x480 paired with SD 854x626 and HD 940x480 paired with SD 720x480 were designed for this purpose.\n\nThe game creates a single active game roRegion to do all graphics operations in. roRegions for pillar or letter boxes are used to fill the rest of the screen area depending on if the app is in HD or SD mode. Please refer to the dfSetupDisplayRegions() function in [v30/bslDefender.brs](https://developer.roku.com/docs/references/brightscript/language/component-architecture.mdv30bslcorebrs \"v30/bslDefender.brs\") for help in setting up the drawable regions in screen scaling.\n\nThere are some useful rules of thumb to be aware of to get the best performance when rendering your games:\n\n* Alpha enabled regions are expensive to render\n\nIt is a requirement that the destination be alpha enabled in order for non-rectangular sprites to be properly rendered with transparency. However the sprite used for a background would typically have all pixels be fully nontransparent. Since alpha blending is expensive, a quick way to blit the background in this scenario is to first disable alpha on the screen, manually draw the background, and then enable alpha for the screen before drawing the rest of the sprites.\n\n* Use smaller resolution images wherever possible. Scaling a large image down at run time is expensive with no benefit to the user\n* Rendering text with DrawText() is expensive\n\nFortunately, many of these calls are redundant and can be eliminated. The static text for a particular level can be drawn on the background once and this newly created background can be used for refreshing the screen. This will eliminate almost all text redraws.\n\nA screen can be created with one of three constructors. If it is created with no parameters, the screen will be single buffered, and its output resolution will match the current display resolution (if the current resolution is specified in the manifest file ui\\_resolutions entry, otherwise the size will be 720p).\n\n`CreateObject(\"roScreen\")`\n\nIf a single parameter is passed, it is a Boolean that indicates if the screen is double buffered or not. See SwapBuffers():\n\n`CreateObject(\"roScreen\", true) ' double buffered screen`\n\nIf four parameters are passed, the last two specify the screen's resolution. The dimensions must be one of the screen sizes specified above:\n\n`CreateObject(\"roScreen\", true, 720, 480) ' db & SD res`\n\n**Example: Display an image**\n\n```\nScreen=CreateObject(\"roScreen\")\ndfDrawImage(screen, \"myphoto.jpg\",0,0)\nScreen.Finish()\n```\n\n**Example: Alpha blending**\n\n```\nwhite=&hFFFFFFFF\nscreen0=CreateObject(\"roScreen\")\nscreen0.SetAlphaEnable(true)\nscreen0.Clear(white)\nscreen0.DrawRect(100,100, screen0.GetWidth()-200, screen0.GetHeight()-200, &h80)\n' &h80 is black with a 50% alpha mix (RGBA)\nscreen0.finish()\n```",
+ "events": [
+ {
+ "name": "roUniversalControlEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rouniversalcontrolevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifDraw2D",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifdraw2d.md"
+ },
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifscreen.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "name": "roScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roscreen.md"
+ },
+ "rosearchhistory": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roSearchHistory"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Search History object implements the system wide storage of search terms for use in implementing the roSearchScreen.\n\nAs the user searches for content, recent searches are placed into the search history. This allows the user to easily re-execute these commands later without typing on the keyboard. The initial list of recent searches is displayed on the roSearchScreen to assist the user in finding content to watch. This history is used system wide, so that the user can find references to their search in multiple types of content.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roSearchHistory\")`\n\n**Example**\n\n```\nhistory = CreateObject(\"roSearchHistory\")\nlist = history.GetAsArray()\nprint \"There are \"; list.Count(); \" items in the history\"\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifSearchHistory",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsearchhistory.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roSearchHistory",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosearchhistory.md"
+ },
+ "rosearchscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roSearchScreen"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Search Screen provides a standard way to allow users to enter text for searching.\n\nThis screen features a simplified keyboard (a-z, 0-9) designed to provide just the keys necessary to perform case-insensitive searches without punctuation.\n\nIdeally, the user would enter a search string and the backend service would perform that query in a case-insensitive manner ignoring special characters like punctuation. The script is notified as each key is pressed so that a progress disclosure search can be performed if supported by the back-end service. In addition, the script can control the text displayed on the screen and will receive events when the text entry is complete.\n\nIn addition to entering search strings, this screen features a list that can be used to display search results or show the most recent searches. It's desirable for the screen to maintain a list of recent searches for the user to allow them to easily repeat a recent query without typing. In some implementations, it may be desirable to use this list to show a progressive set of results after each character while the user is typing.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roSearchScreen\")`\n\n**Example**\n\n```\nREM ******************************************************\nREM Main routine - example of search screen usage\nREM ******************************************************\nSub Main()\n print \"start\"\n 'toggle the search suggestions vs. search history behavior\n 'this allow you to generate both versions of the example below\n displayHistory = false\n history = CreateObject(\"roArray\", 1, true)\n 'prepopulate the search history with sample results\n history.Push(\"seinfeld\")\n history.Push(\"fraiser\")\n history.Push(\"cheers\")\n port = CreateObject(\"roMessagePort\")\n screen = CreateObject(\"roSearchScreen\")\n 'commenting out SetBreadcrumbText() hides breadcrumb on screen\n screen.SetBreadcrumbText(\"\", \"search\")\n screen.SetMessagePort(port)\n if displayHistory\n screen.SetSearchTermHeaderText(\"Recent Searches:\")\n screen.SetSearchButtonText(\"search\")\n screen.SetClearButtonText(\"clear history\")\n screen.SetClearButtonEnabled(true) 'defaults to true\n screen.SetSearchTerms(history)\n else\n screen.SetSearchTermHeaderText(\"Suggestions:\")\n screen.SetSearchButtonText(\"search\")\n screen.SetClearButtonEnabled(false)\n endif\n print \"Doing show screen...\"\n screen.Show()\n print \"Waiting for a message from the screen...\"\n ' search screen main event loop\n done = false\n while done = false\n msg = wait(0, screen.GetMessagePort())\n if type(msg) = \"roSearchScreenEvent\"\n if msg.isScreenClosed()\n print \"screen closed\"\n done = true\n else if msg.isCleared()\n print \"search terms cleared\"\n history.Clear()\n else if msg.isPartialResult()\n print \"partial search: \"; msg.GetMessage()\n if not displayHistory\n screen.SetSearchTerms(GenerateSearchSuggestions(msg.GetMessage()))\n endif\n else if msg.isFullResult()\n print \"full search: \"; msg.GetMessage()\n history.Push(msg.GetMessage())\n if displayHistory\n screen.AddSearchTerm(msg.GetMessage())\n end if\n 'uncomment to exit the screen after a full search result:\n 'done = true\n else\n print \"Unknown event: \"; msg.GetType(); \" msg: \"; msg.GetMessage()\n endif\n endif\n endwhile\n print \"Exiting...\"\nEnd Sub\n\nFunction GenerateSearchSuggestions(partSearchText As String) As Object\n availableContent = [\n \"ghost in the shell\"\n \"parasite dolls\"\n \"final fantasy\"\n \"ninja scroll\"\n \"space ghost\"\n \"hellboy\"\n \"star wars\"\n \"terminator\"\n \"house of cards\"\n \"dexter\"\n ]\n suggestions = []\n if partSearchText <> \"\"\n partSearchText = LCase(partSearchText)\n for each available in availableContent\n if available.Instr(partSearchText) >= 0\n suggestions.Push(available)\n end if\n end for\n end if\n return suggestions\nEnd Function\n```\n\n**Image: roSearchScreen example results (search suggestions)**\n\n![Image: roSearchScreen example results (search suggestions)](https://image.roku.com/ZHZscHItMTc2/roSearchScreen.png \"roSearchScreen\")",
+ "events": [
+ {
+ "name": "roSearchScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rosearchscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifSearchScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsearchscreen.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roSearchScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosearchscreen.md"
+ },
+ "rosgnode": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "string"
+ }
+ ],
+ "returnType": "roSGNode"
+ }
+ ],
+ "description": "The roSGNode object is the BrightScript equivalent of SceneGraph XML file node creation. To create an roSGNode object for a specific node class, call:\n\n`CreateObject(\"roSGNode\", \"nodetype\")`\n\nWhere nodetype is a string specifying the node class to be created. For example, the following creates an object of the SceneGraph Poster node class:\n\n`CreateObject(\"roSGNode\", \"Poster\")`\n\nReference information on all SceneGraph node classes can be found in [SceneGraph API Reference](https://developer.roku.com/docs/references/scenegraph/node.md.\n\nPrior to creating an roSGScreen object and calling its `show()` function, creating roSGNode objects and using their interfaces is not guaranteed to work correctly. If you need to create some roSGNode objects and/or use roSGNode interfaces prior to calling an roSGScreen object `show()` function, you can use an roSGScreen object `createScene()` function to create an instance of a SceneGraph XML component that does any required setup and initialization prior to the roSGScreen object being displayed.\n\nIn addition, roSGNode implements the ifAssociativeArray interface as a wrapper for ifSGNodeFIeld so that the convenient node.field notation may be using for setting, getting, and observing fields.",
+ "events": [
+ {
+ "name": "roSGNodeEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rosgnodeevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifAssociativeArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifassociativearray.md"
+ },
+ {
+ "name": "ifSGNodeBoundingRect",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodeboundingrect.md"
+ },
+ {
+ "name": "ifSGNodeChildren",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodechildren.md"
+ },
+ {
+ "name": "ifSGNodeDict",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodedict.md"
+ },
+ {
+ "name": "ifSGNodeField",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodefield.md"
+ },
+ {
+ "name": "ifSGNodeFocus",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodefocus.md"
+ },
+ {
+ "name": "ifSGNodeHttpAgentAccess",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsgnodehttpagentaccess.md"
+ }
+ ],
+ "name": "roSGNode",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosgnode.md"
+ },
+ "rosgscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roSGScreen"
+ }
+ ],
+ "description": "The roSGScreen object is a SceneGraph canvas that displays the contents of a SceneGraph Scene node instance. The object is created by calling:\n\n`CreateObject(\"roSGScreen\")`\n\n`CreateScene()` takes one argument, the name of the scene component. A channel will typically extend Scene to define its own channel specific Scene type (such as MyScene, etc.) This Scene component name is passed to `CreateScene().`\n\n**roSGScreen typical usage example**\n\n```\nscreen = CreateObject(\"roSGScreen\")\nscene = screen.CreateScene(\"Scene\")\nscreen.show()\n```",
+ "events": [
+ {
+ "name": "roSGScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rosgscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifSgScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsgscreen.md"
+ }
+ ],
+ "name": "roSGScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosgscreen.md"
+ },
+ "roslideshow": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roSlideShow"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Slide Show screen provides the ability to setup a photo slide show to playback a series of images.\n\nImages may be jpg, png or gif files. The developer can control the sequencing and timing of the slideshow. The object is designed to accept an array of [Content Meta-Data](/docs/developer-program/getting-started/architecture/content-metadata.md \"Content Meta-Data\") objects, describing the images and providing URLs for accessing each image. TextOverlayUL, TextOverlayUR, and TextOverlayBody are content meta-data properties used to display a text overlay.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roSlideShow\")`",
+ "events": [
+ {
+ "name": "roSlideShowEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/roslideshowevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifSlideShow",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifslideshow.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roSlideShow",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roslideshow.md"
+ },
+ "rosocketaddress": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roSocketAddress"
+ }
+ ],
+ "description": "The roSocketAddress is used by the roStreamSocket and roDataGramSocket components for TCP and UDP traffic respectively.\n\nThis object is created without any arguments:\n\n`CreateObject(\"roSocketAddress\")`\n\nMethods in [ifSocketAddress](https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketaddress.md\"ifSocketAddress\") are used to assign an IP address to the object. roSocketAddress currently supports only IPV4 addresses.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifSocketAddress",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketaddress.md"
+ }
+ ],
+ "name": "roSocketAddress",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosocketaddress.md"
+ },
+ "rospringboardscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roSpringboardScreen"
+ }
+ ],
+ "description": "The Springboard Screen shows detailed information about an individual piece of content and provides options for actions that may be taken on that content.\n\nThe detailed description of the content is displayed with poster art for the title. Artwork may be displayed portrait or landscape orientation depending on the ContentType set in the [Content Meta-Data](/docs/developer-program/getting-started/architecture/content-metadata.md \"Content Meta-Data\").\n\nThe caller may add one or more buttons to the screen with actions such as Play, Resume, Purchase or More Info. The script is notified via an event when a button is selected and it is the responsibility of the script writer to handle that event as desired and perform the requested action.\n\n![worddav-button-actions](https://image.roku.com/ZHZscHItMTc2/worddav3570180012b8208f098d035b989f8fa8.png \"worddav3570180012b8208f098d035b989f8fa8\")\n\nThis object is created with no parameters:\n\n`CreateObject(\"roSpringboardScreen\")`\n\n* Orientation for artwork is based on ContentType setting and may be portrait or landscape.\n \n* The audio springboard is capable of adding a progress bar.\n \n* If the ContentType is audio, the album art dimensions are:\n \n\n```\n SD: 124 x 112\n HD: 188 x 188\n```\n\n* If the ContentType is episode, the album art dimensions are:\n\n```\n SD: 180 x 122\n HD: 264 x 198\n```\n\n* If the ContentType is any other value, the album art dimensions are:\n\n```\n SD: 112 x 142\n HD: 148 x 212\n```\n\n* Up to 5 user-defined buttons may be displayed. Buttons are displayed in the order they are added and always appear in a fixed region of the screen\n \n* The description text will be formatted and justified (right and left edges) to fit between the margins. When the maximum length is reached, the text will be clipped and terminated with an ellipsis. The font is variable pitch, so the maximum number of characters is dependent on the text. The spacing is approximately 85 characters per line x 4 lines = 340 characters. The fonts and character spacing for HD and SD are similar, and display approximately the same number of characters, but the relationship is not exactly 1:1.\n \n* The star rating can show either community StarRating (red) or UserStarRating (yellow). If both values are set, the control will display the UserStarRating. If ratings are not desired, it can be removed by calling SetStaticRatingEnabled(false), providing more space to display actor names.\n \n* The Length attribute will display a formatted string or show length. If the value is zero, this field will display 0m, if the attribute is not set/missing then this field will not be displayed.\n \n\n**Example**\n\nThe following example shows the process of creating an roSpringboardScreen, setting up the content meta-data, showing the screen and waiting for an event. This example is simplified for clarity and it's assumed the real-world applications will use techniques like getting data from web services using roUrlTransfer.\n\n![springboard-audio](https://image.roku.com/ZHZscHItMTc2/springboard-audio.png \"springboard-audio\")\n\n```\nFunction Main()\n port = CreateObject(\"roMessagePort\")\n springBoard = CreateObject(\"roSpringboardScreen\")\n springBoard.SetBreadcrumbText(\"[location 1]\", \"[location2]\")\n springBoard.SetMessagePort(port)\n o = CreateObject(\"roAssociativeArray\")\n o.ContentType = \"episode\"\n o.Title = \"[Title]\"\n o.ShortDescriptionLine1 = \"[ShortDescriptionLine1]\"\n o.ShortDescriptionLine2 = \"[ShortDescriptionLine2]\"\n o.Description = \"\"\n For i = 1 To 15\n o.Description = o.Description + \"[Description] \"\n End For\n o.SDPosterUrl = \"\"\n o.HDPosterUrl = \"\"\n o.Rating = \"NR\"\n o.StarRating = \"75\"\n o.ReleaseDate = \"[mm/dd/yyyy]\"\n o.Length = 5400\n o.Categories = CreateObject(\"roArray\", 10, true)\n o.Categories.Push(\"[Category1]\")\n o.Categories.Push(\"[Category2]\")\n o.Categories.Push(\"[Category3]\")\n o.Actors = CreateObject(\"roArray\", 10, true)\n o.Actors.Push(\"[Actor1]\")\n o.Actors.Push(\"[Actor2]\")\n o.Actors.Push(\"[Actor3]\")\n o.Director = \"[Director]\"\n springBoard.SetContent(o)\n springBoard.Show()\n While True\n msg = wait(0, port)\n If msg.isScreenClosed() Then\n Return -1\n Elseif msg.isButtonPressed()\n print \"msg: \"; msg.GetMessage(); \"idx: \"; msg.GetIndex()\n Endif\n End While\nEnd Function\n```\n\nThe following screen is displayed when this code is executed:\n\n![worddav-code-displayed](https://image.roku.com/ZHZscHItMTc2/worddav256ada1e0e0cdc53d79428655ca7702b.png \"worddav256ada1e0e0cdc53d79428655ca7702b\")",
+ "events": [
+ {
+ "name": "roSpringboardScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rospringboardscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ },
+ {
+ "name": "ifSpringboardScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifspringboardscreen.md"
+ }
+ ],
+ "name": "roSpringboardScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rospringboardscreen.md"
+ },
+ "rosprite": {
+ "constructors": [],
+ "description": "The roSprite object cannot be created directly with a CreateObject() call. It must be associated with a managing roCompositor object. This association is implicitly created by creating an roSprite object with the roCompositor methods NewSprite() or NewAnimatedSprite().",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifSprite",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsprite.md"
+ }
+ ],
+ "name": "roSprite",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosprite.md"
+ },
+ "rostreamsocket": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roStreamSocket"
+ }
+ ],
+ "description": "The roStreamSocket component enables BrightScript apps to accept and connect to TCP streams as well as send and receive data with them. The interface is modeled on and works much like standard Berkeley sockets.\n\nThis object is created without any arguments:\n\n`CreateObject(\"roStreamSocket\")`\n\n**Example: Open TCP Connection to Server**\n\n```\nsendAddress = CreateObject(\"roSocketAddress\")\nsendAddress.SetAddress(\"www.google.com:80\")\nsocket = CreateObject(\"roStreamSocket\")\nsocket.setSendToAddress(sendAddress)\nIf socket.Connect()\n Print \"Connected Successfully\"\nEnd If\n```\n\n**Example: Echo Server**\n\n```\nfunction main()\n messagePort = CreateObject(\"roMessagePort\")\n connections = {}\n buffer = CreateObject(\"roByteArray\")\n buffer[512] = 0\n tcpListen = CreateObject(\"roStreamSocket\")\n tcpListen.setMessagePort(messagePort)\n addr = CreateObject(\"roSocketAddress\")\n addr.setPort(54321)\n tcpListen.setAddress(addr)\n tcpListen.notifyReadable(true)\n tcpListen.listen(4)\n if not tcpListen.eOK()\n print \"Error creating listen socket\"\n stop\n end if\n while True\n event = wait(0, messagePort)\n if type(event) = \"roSocketEvent\"\n changedID = event.getSocketID()\n if changedID = tcpListen.getID() and tcpListen.isReadable()\n ' New\n newConnection = tcpListen.accept()\n if newConnection = Invalid\n print \"accept failed\"\n else\n print \"accepted new connection \" newConnection.getID()\n newConnection.notifyReadable(true)\n newConnection.setMessagePort(messagePort)\n connections[Stri(newConnection.getID())] = newConnection\n end if\n else\n ' Activity on an open connection\n connection = connections[Stri(changedID)]\n closed = False\n if connection.isReadable()\n received = connection.receive(buffer, 0, 512)\n print \"received is \" received\n if received > 0\n print \"Echo input: '\"; buffer.ToAsciiString(); \"'\"\n ' If we are unable to send, just drop data for now.\n ' You could use notifywritable and buffer data, but that is\n ' omitted for clarity.\n connection.send(buffer, 0, received)\n else if received=0 ' client closed\n closed = True\n end if\n end if\n if closed or not connection.eOK()\n print \"closing connection \" changedID\n connection.close()\n connections.delete(Stri(changedID))\n end if\n end if\n end if\n end while\n\n print \"Main loop exited\"\n tcpListen.close()\n for each id in connections\n connections[id].close()\n end for\nEnd Function\n```",
+ "events": [
+ {
+ "name": "roSocketEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rosocketevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifSocket",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocket.md"
+ },
+ {
+ "name": "ifSocketAsync",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketasync.md"
+ },
+ {
+ "name": "ifSocketConnection",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketconnection.md"
+ },
+ {
+ "name": "ifSocketConnectionOption",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketconnectionoption.md"
+ },
+ {
+ "name": "ifSocketConnectionStatus",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketconnectionstatus.md"
+ },
+ {
+ "name": "ifSocketStatus",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsocketstatus.md"
+ }
+ ],
+ "name": "roStreamSocket",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rostreamsocket.md"
+ },
+ "rostring": {
+ "constructors": [],
+ "description": "roString is the object equivalent for intrinsic type 'String'.\n\nThis is useful in the following situations:\n\n* When an object is needed, instead of an intrinsic value. For example, \"roList\" maintains a list of objects. If an String is added to roList, it will be automatically wrapped in an roString by the language interpreter. When a function that expects a BrightScript Component as a parameter is passed a string, BrightScript automatically creates the equivalent BrightScript Component.\n \n* If any object exposes the ifString interface, that object can be used in any expression that expects an intrinsic value.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifString",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifstring.md"
+ },
+ {
+ "name": "ifStringOps",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifstringops.md"
+ },
+ {
+ "name": "ifToStr",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftostr.md"
+ }
+ ],
+ "name": "roString",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rostring.md"
+ },
+ "rosystemlog": {
+ "constructors": [],
+ "description": "The roSystemLog component enables the application to receive events from the Roku Streaming Player that are intended for reporting errors and trends, rather than trigger a response to a user action.\n\nAll of the log event messages are sent to the roMessagePort that is registered on the [roSystemLogEvent](https://developer.roku.com/docs/references/brightscript/events/rosystemlogevent.md\"roSystemLogEvent\") object. See roSystemLogEvent for details on the messages.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roSystemLog\")`\n\nThe roSystemLog component requires specific Design Patterns in your BrightScript Application. Take care to:\n\n* Use one roMessagePort throughout the application (instead of creating a new roMessagePort for each screen).\n* Create one roSystemLog instance at startup that remains for the entire lifetime of the application.\n* Pass the global roMessagePort referenced in the first bullet point to SetMessagePort() on the roSystemLog component.\n* Enable the desired log types using EnableType().\n* Handle the [roSystemLogEvents](https://developer.roku.com/docs/references/brightscript/events/rosystemlogevent.md\"roSystemLogEvents\") in all message loops.",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifSystemLog",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsystemlog.md"
+ }
+ ],
+ "name": "roSystemLog",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosystemlog.md"
+ },
+ "rotextscreen": {
+ "constructors": [],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nroTextScreen provides a way of displaying large amounts of scrollable text.\n\nThis type of screen can be used to display help text, credits, license agreements, or other large amounts of text that require scrolling.\n\nThe interface allows you to set the text and specify zero or more buttons.\n\nIf no buttons are specified, then the user can exit the screen by pressing BACK or OK.",
+ "events": [
+ {
+ "name": "roTextScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rotextscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ },
+ {
+ "name": "ifTextScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftextscreen.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roTextScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rotextscreen.md"
+ },
+ "rotexttospeech": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roTextToSpeech"
+ }
+ ],
+ "description": "> Please note this component is only available on the following devices: Roku Streaming Stick (3600X), Roku Express (3700X) and Express+ (3710X), Roku Premiere (4620X) and Premiere+ (4630X), Roku Ultra (4640X), and any Roku TV running Roku OS version 7.2 and later.\n\nThe roTextToSpeech component provides text to speech capabilities to applications.\n\nAn roTextToSpeech component object is created with no parameters:\n\n`CreateObject(\"roTextToSpeech\")`",
+ "events": [
+ {
+ "name": "roTextToSpeechEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rotexttospeechevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ },
+ {
+ "name": "ifTextToSpeech",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftexttospeech.md"
+ }
+ ],
+ "name": "roTextToSpeech",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rotexttospeech.md"
+ },
+ "rotexturemanager": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roTextureManager"
+ }
+ ],
+ "description": "The Texture Manager provides a set of API's for managing an roBitmap cache.\n\n**Example: Requesting an roBitmap from the roTextureManager**\n\n```\nSub Main()\n mgr = CreateObject(\"roTextureManager\")\n msgport = CreateObject(\"roMessagePort\")\n mgr.SetMessagePort(msgport)\n\n request = CreateObject(\"roTextureRequest\",\"pkg:/assets/comet.jpg\")\n mgr.RequestTexture(request)\n\n msg=wait(0, msgport)\n if type(msg)=\"roTextureRequestEvent\" then\n print \"request id\";msg.GetId()\n print \"request state:\";msg.GetState()\n print \"request URI:\";msg.GetURI()\n state = msg.GetState()\n if state = 3 then\n bitmap = msg.GetBitmap()\n if type(bitmap)<>\"roBitmap\" then\n print \"Unable to create robitmap\"\n stop ' stop exits to the debugger\n end if\n end if\n end if\nEnd Sub\n```",
+ "events": [
+ {
+ "name": "roTextureRequestEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rotexturerequestevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ },
+ {
+ "name": "ifTextureManager",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftexturemanager.md"
+ }
+ ],
+ "name": "roTextureManager",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rotexturemanager.md"
+ },
+ "rotexturerequest": {
+ "constructors": [
+ {
+ "params": [
+ {
+ "isRequired": true,
+ "name": "param1",
+ "type": "string"
+ }
+ ],
+ "returnType": "roTextureRequest"
+ }
+ ],
+ "description": "An roTextureRequest is used to make requests to the roTextureManager.\n\nAn roTextureRequest object is created using the CreateObject() method and passing it a URI string:\n\n`CreateObject(\"roTextureRequest\", \"pkg:/assets/comet.jpg\")`\n\n**Example: Requesting a URL from the roTextureManager**\n\n```\nSub Main()\n mgr = CreateObject(\"roTextureManager\")\n msgport = CreateObject(\"roMessagePort\")\n mgr.SetMessagePort(msgport)\n\n request = CreateObject(\"roTextureRequest\",\"http://192.168.1.10/ball.png\")\n mgr.RequestTexture(request)\n\n msg=wait(0, msgport)\n if type(msg)=\"roTextureRequestEvent\" then\n print \"request id\";msg.GetId()\n print \"request state:\";msg.GetState()\n print \"request URI:\";msg.GetURI()\n state = msg.GetState()\n if state = 3 then\n bitmap = msg.GetBitmap()\n if type(bitmap)<>\"roBitmap\" then\n print \"Unable to create robitmap\"\n stop ' stop exits to the debugger\n end if\n end if\n end if\nEnd Sub\n```\n\n**Example: Requesting a scaled image from the roTextureManager**\n\n```\nSub Main()\n mgr = CreateObject(\"roTextureManager\")\n msgport = CreateObject(\"roMessagePort\")\n mgr.SetMessagePort(msgport)\n\n request = CreateObject(\"roTextureRequest\",\"pkg:/assets/ball.png\")\n request.SetSize(100, 100)\n request.SetScaleMode(1)\n mgr.RequestTexture(request)\nEnd Sub\n```\n\n**Example: Making an HTTPS request from the roTextureManager**\n\n```\nSub Main()\n mgr = CreateObject(\"roTextureManager\")\n msgport = CreateObject(\"roMessagePort\")\n mgr.SetMessagePort(msgport)\n\n request = CreateObject(\"roTextureRequest\",\"https://192.168.1.10/ball.png\")\n request.SetCertificatesFile(\"common:/certs/ca-bundle.crt\")\n request.InitClientCertificates()\n\n mgr.RequestTexture(request)\nEnd Sub\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifTextureRequest",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftexturerequest.md"
+ }
+ ],
+ "name": "roTextureRequest",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rotexturerequest.md"
+ },
+ "rotimespan": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roTimespan"
+ }
+ ],
+ "description": "The Timespan object provides an interface to a simple timer for tracking the duration of activities. It's useful for tracking how an action has taken or if a specified time has elapsed from some starting event.\n\n**Example: Timing an activity**\n\n```\nREM ******************************************************\nREM Compute the number of millisecs to perform a task\nREM ******************************************************\ntimer = CreateObject(\"roTimespan\")\ntimer.Mark()\nDoTimeConsumingTask()\nPrint \"Task took: \" + timer.TotalMilliseconds().ToStr()\n\nREM ******************************************************\nREM Compute how many seconds until rental expires\nREM ******************************************************\nFunction secondsLeft(String expirationDate) As Integer\n str = expirationDate\n if str = invalid return -1\n ts = CreateObject(\"roTimespan\")\n seconds = ts.GetSecondsToISO8601Date(str)\n print \"Expires: \" + str + \" secs: \" + Stri(seconds)\n return seconds\nEnd Function\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifTimespan",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iftimespan.md"
+ }
+ ],
+ "name": "roTimespan",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rotimespan.md"
+ },
+ "rourltransfer": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roUrlTransfer"
+ }
+ ],
+ "description": "A roUrlTransfer object transfers data to or from remote servers specified by URLs. It can perform mutual authentication with a web server.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roUrlTransfer\")`\n\nIf using HTTPS, the developer must specify a certificate file by calling SetCertificatesFile() with a .pem file that includes the certificate authority cert (like Verisign, Thawte, etc., or your own with OpenSSL) that signed the web server certificate. This must be called before making a request. The developer can also use the Roku standard cert bundle (which contains certificates for most common signing authorities) stored in common:/certs/ca-bundle.crt; or download the CA certificate [here](https://github.com/rokudev/ca-certificate/blob/master/ca-bundle.crt).\n\nThe web server can authenticate that the requested connection is from a Roku Streaming Player and that the request is from your application by taking the following actions:\n\n* Add the Roku CA certificate to the web server's certificate authorities keychain, download the CA certificate.\n* Configure your web server to reject any connection that does not have a valid client certificate.\n* Check the X-Roku-Reserved-Dev-Id header in the request. It should contain the Developer ID of your application. If it does not, another application on the Roku is attempting to access the server, and the request is rejected.\n\n**Example**\n\nIn order for your web server to perform the steps above to authenticate your Roku Streaming Player, your application needs to call the following functions before performing any https requests:\n\n```\nobject.SetCertificatesFile(\"common:/certs/ca-bundle.crt\")\nobject.AddHeader(\"X-Roku-Reserved-Dev-Id\", \"\")\nobject.InitClientCertificates()\n```",
+ "events": [
+ {
+ "name": "roUrlEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rourlevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ },
+ {
+ "name": "ifUrlTransfer",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifurltransfer.md"
+ }
+ ],
+ "name": "roUrlTransfer",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rourltransfer.md"
+ },
+ "rovideoplayer": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roVideoPlayer"
+ }
+ ],
+ "description": "The roVideoPlayer component implements a video player with more programmatic control, but less user control than the roVideoScreen component.\n\nThe roVideoPlayer can be used in conjunction with the roImageCanvas to do graphical overlays, windowed video, zoom, and programmatic control of playlists and trick play. When using with the roImageCanvas, you can put the roVideoPlayer is at a lower z-order layer than other imageCanvas layers and implement overlays on top of the playing video.\n\nUnlike the roVideoScreen component roVideoPlayer does not have automatic trick play modes and built in controls to support that trick play. Any trick play requires the developer to build his own controls using buttons on the roImageCanvas.\n\nNote that all the video playback notes under roVideoScreen apply to the roVideoPlayer. The customvideoplayer sample application is a good example of roVideoPlayer usage.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roVideoPlayer\")`",
+ "events": [
+ {
+ "name": "roVideoPlayerEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rovideoplayerevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ },
+ {
+ "name": "ifVideoPlayer",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifvideoplayer.md"
+ }
+ ],
+ "name": "roVideoPlayer",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rovideoplayer.md"
+ },
+ "rovideoscreen": {
+ "constructors": [
+ {
+ "params": [],
+ "returnType": "roVideoScreen"
+ }
+ ],
+ "deprecatedDescription": "This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n\nBeginning July 1st, 2017, any new channels using this component will be rejected during certification.\n\nBeginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n",
+ "description": "> This component is deprecated and will be removed from Roku OS on January 1st, 2019.\n> \n> Beginning July 1st, 2017, any new channels using this component will be rejected during certification.\n> \n> Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.\n\nThe Video Screen object implements the video playback portion of the user interface.\n\nThis object is created with no parameters:\n\n`CreateObject(\"roVideoScreen\")`\n\nThe API's to the video screen allow the developer to setup a fully featured playback environment with minimal coding. The developer is responsible for initial playback setup and providing the required data (e.g. StreamURLs, SteamsBitrates, etc.) as part of the [Content Meta-Data](/docs/developer-program/getting-started/architecture/content-metadata.md \"Content Meta-Data\"). Once created and displayed, the screen will respond to events and manage the playback experience for the user.\n\nThe roVideoScreen is designed for streaming content. The preferred implementation should provide multiple bitrates (ideally four) of video to provide a high quality user experience under a variety of network conditions. Using the StreamBitrates and StreamURLs provided in the content meta-data for the item, the roVideoScreen will automatically monitor and select the best stream based on the users measured bandwidth. If network performance changes, the system will adapt and rebuffer to stream at a different bandwidth if necessary. Note that the StreamURLs, StreamBitrates, StreamQualities and StreamStickyHttpRedirects are all arrays that are aligned with each other. For example, the first stream listed would be the 0th element of all of these arrays.\n\nThe bitrates should represent the actual bitrate of the stream. The bitrate is used for both the display of the dots as well as the stream selection algorithm. The dots work a follows; If the stream bitrate equals:\n\n* 0 = no dots\n* < 500 Kbps= 1 dot\n* < 800 Kbps = 2 dots\n* <1.1 Mbps = 3 dots\n* > \\= 1.1 Mbps = 4 dots\n \n\nThe dots are displayed automatically based on the bitrate of the stream selected unless there is a single stream and the bitrate is set to zero, then it won't show any dots. The StreamQuality attribute is used to select streams and indicates if a stream is HD or not. If the attribute for HDBranded is set to true and the stream is HD, the HD icon will show beside the quality dots. If the StreamQuality is set to HD, and the user display type is set to SD, the HD stream will not be selected.\n\nThe roVideoScreen automatically provides trick mode for all supported content types. There are two type of trick modes supported; scene based selection and time-based selection. If BIF image files are provided for a title, scene-based trick modes will appear. (See the BIF File format Documentation for more information) The user will be presented with the images and progress bar needed for SEEK, FF, REW within a stream. The following image shows how trick modes are rendered with BIF files:\n\n![IMAGE](https://image.roku.com/ZHZscHItMTc2/worddavdc8a50b63d70082736fbebee19c18eff.png \"worddavdc8a50b63d70082736fbebee19c18eff\")\n\nThe FF/REW functionality provides three speeds; slow, medium and fast. At slower speeds, the system displays the current frame in the center of the screen and additional frames on the side for contextual information. At higher speeds, the side frames disappear and only the center image is displayed. The I-frames within the video do not need to precisely align with the time stamp of the image frames in the BIF file. When the user stops and selects a frame, the video playback begins at the first I-frame less than or equal to the time position of the selected frame.\n\nWhen BIF images are not available, the system will default to a time based trick play behavior. The user control is still the same, but only the progress bar is displayed and the user will not see individual scenes within the video. This mode is the default, so if images are not available for an individual title, the system will always provide this functionality by default.\n\nThe system will only seek to locations on an I-Frame boundary. Window Media (WMA9 or VC-1) uses the simple index object to determine the I-frame locations and H.264 uses the MOOV atom to determine the correct offsets. If the BIF images are at a consistent time intervals which do not align to I-Frame boundaries, the system will use the nearest I-Frame less than or equal to the time of the BIF image. MP4 or Windows Media are the preferred formats.\n\n**Important Notes on Video Playback**\n\n* The dimensions vary on a title-by-title basis depending on the source material and the target aspect ratio for the encode (e.g. 4:3 or 16:9). Content is always encoded at full width and the height is adjusted. For example, a 1.66 aspect ratio source is encoded as a 720x432 video and displayed as letterboxed for a 4:3 display.\n \n* The frame rate used for encoding is dependent on the source material. Film content is generally 23.976 fps, while video content is generally at 29.97.\n \n* For typical streaming video applications, we recommend a range of 384Kbps to 4.5Mbps. For USB playback, we recommend that you stay under 8.0 Mbps. This provides a good balance between quality and support for a wide number of users. In some cases lower and higher bitrates have been used, but this frequently results in poor quality or limits the % of the installed base that can view this encoding.\n \n* It is critical that the StreamURLs, StreamBitrates, StreamQualities and StreamStickyHttpRedirects arrays are all aligned with each other. For example, the first stream listed would be the 0th element of all of these arrays. You may have multiple streams in the arrays and the system will automatically pick the most appropriate stream based on the users available bandwidth and video settings.\n \n* The StreamQualities array identifies streams as either SD or HD. If the user is configured for SD the system will not select HD streams for playback.\n \n* The optional StreamStartTimeOffset is the offset into the stream which is considered to be the new origin of playback.\n \n* Live – declares the video as live and replaces the time remaining text in the progress bar with \"live\".\n \n* HLS Http Live Streaming support is included in the Roku OS (Introduced in Roku OS2.6). We currently support version 3 of the Http Live Streaming protocol (Pantos – Draft submitted to IETF November 19, 2010 [http://tools.ietf.org/html/draft-pantos-http-live-streaming-05](http://tools.ietf.org/html/draft-pantos-http-live-streaming-05) ). When using HLS, the StreamUrls and StreamQualities array should each have exactly one element. If the HLS stream has only a single bitrate stream, the StreamBitrates array should contain one element specifying that bitrate. If the stream contains more than one variant stream at multiple bitrates, the StreamBitrates array should contain one element with a value of zero. Please see the Video Encoding Guide for information about creating HLS .m3u8 files and segmented .ts files from your current h264 encoded video or distributing live video over HLS to the Roku box.\n \n* In addition to the support for version 2 of the HLS Pantos draft spec, the Roku box supports .m3u8 files that are compressed via deflate or gzip.\n \n * The HTTP response for a query that returns a gzip-compressed file must contain the header: Content-Encoding: gzip\n * The HTTP response for a query that returns a deflate-compressed file must contain the header: Content-Encoding: deflate\n* \"Trick Modes\" and seeking work a little differently with HLS streams. There are a couple of ways that seeking works with HLS and they are different than other streams.\n \n One way of seeking uses the \"target duration\" specified in the .m3u8 file. The first segment in an m3u8 file is assigned a time offset:\n \n T = G \\* N\n \n where G is the \"target duration\" value and N is the sequence number of the segment. Each subsequent segment is assigned a time offset equal to T (the time offset of the first segment) plus the duration value of all earlier segments. The duration of a segment is determined by the EXTINF line before that segment.\n \n* Smooth Streaming (since v4.7) and later by setting the StreamFormat to \"ism\" and setting the streamURL to the MANIFEST url.\n \n * The player type (ContentMetaData.StreamFormat) is \"ism\"\n * The stream URL is the URL that points to the manifest\n * Only H.264 and/or AAC encoding formats are currently supported.\n * Only direct PlayReady licensing is supported. Indirect licensing is currently unsupported. That is, for decryption to work, the ProtectionHeader must be available in the manifest and the LA\\_URL should contain a valid URL to an accessible PlayReady license server.\n * If there are multiple audio tracks, a track will be chosen based on the StreamIndex.Language attribute in the manifest. If the StreamIndex.Language attribute is not populated, the audio track will be chosen arbitrarily. To select a specific audio track before playback, set the ContentMetaData.TrackIDAudio field to the desired track's StreamIndex.Name attribute.\n * If there are multiple video tracks, a track will be chosen arbitrarily. To select a specific video track before playback, set the ContentMetaData.TrackIDVideo field to the desired track's StreamIndex.Name attribute.\n* Standard PlayReady SDK 2.0 Direct License Acquisition Over-the-Air (since v4.8) works by reading the Rights Management Protection Header in the Smooth Streaming Manifest Url. The Roku OS retrieves the license from the PlayReady license server at the license acquisition url endpoint in the Protection Header.\n \n\n```\n#EXT-X_TARGETDURATION:10\n#EXT-X-MEDIA-SEQUENCE:37\n#EXTINF:10\nurl1\n#EXTINF:8\nurl2\n#EXTINF:10\nurl3\n```\n\nThe segment url1 has a time offset of 370, url2 is 380, and url3 is 388. Note that if no TARGETDURATION is specified, the default is 1, so the first segment in the file will have a nonzero time offset (equal to the target duration). The PlayStart content-meta data value allows direct seeking to an offset that is valid within the window of data in the current .m3u8 file.\n\nThere is a second way to seek in an HLS stream. If the m3u8 file has #EXT-X-PROGRAM-DATE-TIME entries, you can seek to a particular date/time by passing a value equal to a modified Unix epoch value. The modified epoch is 1/1/2004 rather than the standard Unix epoch of 1/1/1970. A Unix time value can be converted to an HLS seek time by subtracting 1072915200 (the number of seconds between 1/1/1970 and 1/1/2004). Once again, setting the PlayStart content meta data value allows direct seeking to a specific time offset.\n\nFor example, to seek to the segment marked with the date/time of 7/4/2010 11:30, set PlayStart to 205327800. An example shell expression showing this arithmetic is:\n\n```\n% expr `date -d \"7/4/2010Z11:30:00.000\" +%s` - 1072915200\n205327800\n```\n\nIn BrightScript, the same calculation might be:\n\n```\ndt = CreateObject(\"roDateTime\")\ndt.fromISO8601String(\"7/4/2010T11:30:00.000\")\nitemContentMetaData.PlayStart = dt. asSeconds() - 1072915200 '205327800\n```\n\n1. In Roku OS version 2.6, we've introduced support for SRT files. Please see the content meta-data parameter SubtitleUrl for pointing to a matching SRT file for your video content.\n \n2. In Roku OS version 2.7, we've introduced 1080p support. Please see the content meta-data parameter FullHD for specifying 1080p resolution. Playback at 1080p resolution will only occur when the user has set the display type to HDTV 1080p. Another content meta-data parameter, FrameRate, specifies the frames per second of the video. Valid values are 24 and 30. If the user's display type is set to 1080p and FullHD for the content is false or not set, HD playback will be at 720p resolution. If the user's display type is set to HDTV 720p and FullHD content is set to 1080p resolution, the box will downscale the content to 720p resolution.\n \n\n**Example**\n\n```\n'**********************************************************************\n' This example function is passed an associative array representing a ' piece of content (e.g. a TV episode) There are other attributes\n' (title, description, etc.) but this example focuses on showing\n' attributes required for initiating playback. It creates a video\n' screen, sets the content and starts playback by calling Show()\n'**********************************************************************\nFunction showVideoScreen(episode As Object)\n if type(episode) <> \"roAssociativeArray\" then\n print \"invalid data passed to showVideoScreen\"\n return -1\n endif\n port = CreateObject(\"roMessagePort\")\n screen = CreateObject(\"roVideoScreen\")\n ' Note: HDBranded controls whether the \"HD\" logo is displayed for a\n ' title. This is separate from IsHD because its possible to\n' have an HD title where you don't want to show the HD logo\n' branding for the title. Set these two as appropriate for\n' your content\n episode.HDBranded = false\n episode.IsHD = false\n ' Note: The preferred way to specify stream info in v2.6 is to use\n' the Stream roAssociativeArray content meta data parameter.\n\nepisode.Stream = { url:\"http://myserver.mydomain.com/mycontent.mp4\",\nbitrate:2000\nquality:false\ncontentid:\"mycontent-2000\"\n}\nepisode.StreamFormat: \"mp4\"\n ' now just tell the screen about the title to be played, set the\n ' message port for where you will receive events and call show to\n ' begin playback. You should see a buffering screen and then\n ' playback will start immediately when we have enough data buffered.\n screen.SetContent(episode)\n screen.SetMessagePort(port)\n screen.Show()\n ' Wait in a loop on the message port for events to be received.\n ' We will just quit the loop and return to the calling function\n ' when the users terminates playback, but there are other things\n ' you could do here like monitor playback position and see events\n ' from the streaming player. Look for status messages from the video\n ' player for status and failure events that occur during playback\n while true\n msg = wait(0, port)\n\n if type(msg) = \"roVideoScreenEvent\" then\n print \"showVideoScreen | msg = \"; msg.GetMessage() \" | index = \"; msg.GetIndex()\n if msg.isScreenClosed()\n print \"Screen closed\"\n exit while\n else if msg.isStatusMessage()\n print \"status message: \"; msg.GetMessage()\n else if msg.isPlaybackPosition()\n print \"playback position: \"; msg.GetIndex()\n else if msg.isFullResult()\n print \"playback completed\"\n exit while\n else if msg.isPartialResult()\n print \"playback interrupted\"\n exit while\n else if msg.isRequestFailed()\n print \"request failed - error: \"; msg.GetIndex();\" - \"; msg.GetMessage()\n exit while\n end if\n end if\n end while\nEnd Function\n```",
+ "events": [
+ {
+ "name": "roVideoScreenEvent",
+ "url": "https://developer.roku.com/docs/references/brightscript/events/rovideoscreenevent.md"
+ }
+ ],
+ "interfaces": [
+ {
+ "name": "ifGetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifgetmessageport.md"
+ },
+ {
+ "name": "ifHttpAgent",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifhttpagent.md"
+ },
+ {
+ "name": "ifSetMessagePort",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifsetmessageport.md"
+ },
+ {
+ "name": "ifVideoScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifvideoscreen.md"
+ }
+ ],
+ "isDeprecated": true,
+ "name": "roVideoScreen",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rovideoscreen.md"
+ },
+ "roxmlelement": {
+ "constructors": [],
+ "description": "roXMLElement is used to contain an XML tree.\n\nFor instance,\n\n```\nthis is some text\n```\n\nWould parse such that:\n\n```\n Name = \"tag1\"\n Attributes = invalid\n Body = roString with \"this is some text\"\n```\n\n**Example**\n\n```\n \n```\n\nWould parse such that:\n\n```\n Name = \"emptytag\"\n Attributes = roAssociativeArray, with one entry { caveman: \"barney\" }\n Body = invalid\n```\n\nIf the tag contains other tags, body will be of type roXMLList.\n\nTo generate XML, create an roXMLElement, then use functions like SetName(), AddAttribute(), SetBody(), AddElementWithBody(), AddElement(), AddBodyElement(), and AddText() functions to build the XML object hierarchy.\n\nThen call GenXML() to return the XML as a string.\n\nGenXML() takes one parameter (boolean) that indicates whether the generated xml should have the tag at the top.\n\n**Example: Subroutine to print out the contents of an roXMLElement tree**\n\n```\nPrintXML(root, 0)\n\nSub PrintXML(element As Object, depth As Integer)\n print tab(depth*3);\"Name: \";element.GetName()\n if not element.GetAttributes().IsEmpty() then\n print tab(depth*3);\"Attributes: \";\n for each a in element.GetAttributes()\n print a;\"=\";left(element.GetAttributes()[a], 20);\n if element.GetAttributes().IsNext() then print \", \";\n end for\n print\n end if\n if element.GetText()<>invalid then\n print tab(depth*3);\"Contains Text: \";left(element.GetText(), 40)\n end if\n if element.GetChildElements()<>invalid\n print tab(depth*3);\"Contains roXMLList:\"\n for each e in element.GetChildElements()\n PrintXML(e, depth+1)\n end for\n end if\n print\nend sub\n```\n\n**Example: Generating XML**\n\n```\nroot.SetName(\"myroot\")\nroot.AddAttribute(\"key1\", \"value1\")\nroot.AddAttribute(\"key2\", \"value2\")\nne = root.AddBodyElement()\nne.SetName(\"sub\")\nne.SetBody(\"this is the sub1 text\")\nne = root.AddBodyElement()\nne.SetName(\"subelement2\")\nne.SetBody(\"more sub text\")\nne.AddAttribute(\"k\", \"v\")\nne = root.AddElement(\"subelement3\")\nne.SetBody(\"more sub text 3\")\nroot.AddElementWithBody(\"sub\", \"another sub (#4)\")\nPrintXML(root, 0)\nprint root.GenXML(false)\n```",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifXMLElement",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifxmlelement.md"
+ }
+ ],
+ "name": "roXMLElement",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roxmlelement.md"
+ },
+ "roxmllist": {
+ "constructors": [],
+ "description": "Contains a list of roXML objects.\n\nNormally roXMLList objects are not created via CreateObject(), but are returned from various ifXMLElement functions such as GetChildElements() and GetBod",
+ "events": [],
+ "interfaces": [
+ {
+ "name": "ifList",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iflist.md"
+ },
+ {
+ "name": "ifListToArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/iflisttoarray.md"
+ },
+ {
+ "name": "ifXMLList",
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifxmllist.md"
+ }
+ ],
+ "name": "roXMLList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roxmllist.md"
+ }
+ },
+ "interfaces": {
+ "AppManagerTheme": {
+ "implementers": [],
+ "methods": [],
+ "name": "AppManagerTheme",
+ "properties": [
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Li Pa Po Se Sp Te. Example: #E0DFDF",
+ "name": "BackgroundColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Li Pa Po Se Sp Te. Example: #FF00FF",
+ "name": "BreadcrumbDelimiter",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Li Pa Po Se Sp Te. Example: #FF00FF",
+ "name": "BreadcrumbTextLeft",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Li Pa Po Se Sp Te. Example: #FF00FF",
+ "name": "BreadcrumbTextRight",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Di Se Sp. Example: #FF00FF",
+ "name": "ButtonHighlightColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Di Se Sp. Example: #0033FF",
+ "name": "ButtonMenuHighlightText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Di Se Sp. Example: #B0B0B0",
+ "name": "ButtonMenuNormalOverlayText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Di Se Sp. Example: #686868",
+ "name": "ButtonMenuNormalText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Di Se Sp. Example: #FF00FF",
+ "name": "ButtonNormalColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Po. Example: #00FF00",
+ "name": "CounterSeparator",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Po. Example: #FF0000",
+ "name": "CounterTextLeft",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Po. Example: #0000FF",
+ "name": "CounterTextRight",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Must be a grayscale value. Screen types: Di. Example: #808080",
+ "name": "DialogBodyText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Must be a grayscale value. Screen types: Di. Example: #363636",
+ "name": "DialogTitleText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Po. Example: #FF00FF",
+ "name": "EpisodeSynopsisText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Po. Example: #FF00FF",
+ "name": "FilterBannerActiveColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set HD Filter Banner Active/Focus Highlighter. Screen types: Po. Example: pkg:/images/Filter\\_ActiveHint\\_HD.png",
+ "name": "FilterBannerActiveHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set SD Filter Banner Active/Focus Highlighter. Screen types: Po. Example: pkg:/images/Filter\\_ActiveHint\\_SD43.png",
+ "name": "FilterBannerActiveSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Po. Example: #FF00FF",
+ "name": "FilterBannerInactiveColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set HD Filter Banner Inactive Highlighter. Screen types: Po. Example: pkg:/images/Filter\\_InactiveHint\\_HD.png",
+ "name": "FilterBannerInactiveHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set SD Filter Banner Inactive Highlighter. Screen types: Po. Example: pkg:/images/Filter\\_ActiveHint\\_SD43.png",
+ "name": "FilterBannerInactiveSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Po. Example: #FF00FF",
+ "name": "FilterBannerSideColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set HD Filter Banner Background Image. Screen types: Po. Example: pkg:/images/Filter\\_ActiveHint\\_HD.png",
+ "name": "FilterBannerSliceHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set SD Filter Banner Background Image. Screen types: Po. Example: pkg:/images/Filter\\_ActiveHint\\_SD43.png",
+ "name": "FilterBannerSliceSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value Must be a grayscale value. Screen types: Gr. Example: #363636",
+ "name": "GridScreenBackgroundColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "String representing point \"(x, y)\" that is the offset from the upper left corner of the focused HD image. Set to the negative width & height of border. Screen types: Gr. Example: (-25,-25)",
+ "name": "GridScreenBorderOffsetHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "String representing point \"(x, y)\" that is the offset from the upper left corner of the focused SD image. Set to the negative width & height of border. Screen types: Gr. Example: (-20,-20)",
+ "name": "GridScreenBorderOffsetSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr. Example: #FF005B",
+ "name": "GridScreenDescriptionDateColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set HD Description callout background image on Grid. Screen types: Gr. Example: pkg:/images/Description\\_Background\\_HD.ng",
+ "name": "GridScreenDescriptionImageHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set SD Description callout background image on Grid. Screen types: Gr. Example: pkg:/images/Description\\_Background\\_SD43.ng",
+ "name": "GridScreenDescriptionImageSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "String representing point \"(x, y)\" that is the offset from the upper left corner of the focused HD image. Negative values have the description above and to the left of the focused image. Screen types: Gr. Example: (190,255)",
+ "name": "GridScreenDescriptionOffsetHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "String representing point \"(x, y)\" that is the offset from the upper left corner of the focused SD image. Negative values have the description above and to the left of the focused image. Screen types: Gr. Example: (125,170)",
+ "name": "GridScreenDescriptionOffsetSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr. Example: #5B005B",
+ "name": "GridScreenDescriptionRuntimeColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr. Example: #606000",
+ "name": "GridScreenDescriptionSynopsisColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr. Example: #00FFFF",
+ "name": "GridScreenDescriptionTitleColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set HD Focus image on Active Grid Poster. Screen types: Gr. Example: pkg:/images/Border\\_16x9\\_HD.png",
+ "name": "GridScreenFocusBorderHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set SD Focus image on Active Grid Poster. Screen types: Gr. Example: pkg:/images/Border\\_16x9\\_SD43.png",
+ "name": "GridScreenFocusBorderSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Must be a grayscale value. Screen types: Gr. Example: #FFFFFF",
+ "name": "GridScreenListNameColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Logo formatted for display in the overhang. Screen types: Gr. Example: pkg:/images/gridlogoHD.png",
+ "name": "GridScreenLogoHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display. Range 0 to 1280. Screen types: Gr. Example: 592",
+ "name": "GridScreenLogoOffsetHD\\_X",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display. Range 0 to 720. Screen types: Gr. Example: 31",
+ "name": "GridScreenLogoOffsetHD\\_Y",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display. Range 0 to 720. Screen types: Gr. Example: 324",
+ "name": "GridScreenLogoOffsetSD\\_X",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display. Range 0 to 480. Screen types: Gr. Example: 21",
+ "name": "GridScreenLogoOffsetSD\\_Y",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Logo formatted for display in the overhang. Screen types: Gr. Example: pkg:/images/gridlogoSD.png",
+ "name": "GridScreenLogoSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Must be a grayscale value. Screen types: Gr. Example: #808080",
+ "name": "GridScreenMessageColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "The HD overhang height. Default: \"69\". Screen types: Gr. Example: 75",
+ "name": "GridScreenOverhangHeightHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "The SD overhang height. Default: \"49\". Screen types: Gr. Example: 55",
+ "name": "GridScreenOverhangHeightSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URI for the overhang slice (thin piece of top of screen border). Screen types: Gr. Example: pkg:/images/gridoverhangHD.png",
+ "name": "GridScreenOverhangSliceHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URI for the overhang slice (thin piece of top of screen border). Screen types: Gr. Example: pkg:/images/gridoverhangSD.png",
+ "name": "GridScreenOverhangSliceSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Must be a grayscale value. Screen types: Gr. Example: #CCCCCC",
+ "name": "GridScreenRetrievingColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set HD highlight image. Screen types: Gr Li Po. Example: pkg:/images/listitem\\_highlight\\_hd.png",
+ "name": "ListItemHighlightHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URL to set SD highlight image. Screen types: Gr Li Po. Example: pkg:/images/listitem\\_highlight\\_sd.png",
+ "name": "ListItemHighlightSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Li Po. Example: #CCCC00",
+ "name": "ListItemHighlightText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Gr Li Po. Example: #CCCC00",
+ "name": "ListItemText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Li. Example: #CCCC00",
+ "name": "ListScreenDescriptionText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Li. Example: #CC0000",
+ "name": "ListScreenTitleColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Small application logo formatted for display in overhang top left. Screen types: Co Ke Li Pa Po Se Sp Te. Example: pkg:/images/co\\_logo\\_sd.png",
+ "name": "OverhangPrimaryLogoHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films.Range 0 to 1280. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 25",
+ "name": "OverhangPrimaryLogoOffsetHD\\_X",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films.Range 0 to 720. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 50",
+ "name": "OverhangPrimaryLogoOffsetHD\\_Y",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films.Range 0 to 720. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 25",
+ "name": "OverhangPrimaryLogoOffsetSD\\_X",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films.Range 0 to 480. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 50",
+ "name": "OverhangPrimaryLogoOffsetSD\\_Y",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Small application logo formatted for display in overhang top left. Screen types: Co Ke Li Pa Po Se Sp Te. Example: pkg:/images/co\\_logo\\_sd.png",
+ "name": "OverhangPrimaryLogoSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Small application logo formatted for display in overhang top left. Screen types: Co Ke Li Pa Po Se Sp Te. Example: pkg:/images/co\\_logo\\_hd.png",
+ "name": "OverhangSecondaryLogoHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films. Range 0 to 1280. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 25",
+ "name": "OverhangSecondaryLogoOffsetHD\\_X",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films. Range 0 to 720. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 50",
+ "name": "OverhangSecondaryLogoOffsetHD\\_Y",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films. Range 0 to 720. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 25",
+ "name": "OverhangSecondaryLogoOffsetSD\\_X",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Offset in pixels from the top-left origin of the display films. Range 0 to 480. Screen types: Co Ke Li Pa Po Se Sp Te. Example: 50",
+ "name": "OverhangSecondaryLogoOffsetSD\\_Y",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Small application logo formatted for display in overhang top left. Screen types: Co Ke Li Pa Po Se Sp Te. Example: pkg:/images/co\\_logo\\_sd.png",
+ "name": "OverhangSecondaryLogoSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URI for the overhang slice (thin piece of border at the top of the screen in HD size). Screen types: Co Ke Li Pa Po Se Sp Te. Example: pkg:/images/overhang\\_hd.png",
+ "name": "OverhangSliceHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "URI for the overhang slice (thin piece of top of screen border). Screen types: Co Ke Li Pa Po Se Sp Te. Example: pkg:/images/overhang\\_sd.png",
+ "name": "OverhangSliceSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Co Pa Te. Example: #FF00FF",
+ "name": "ParagraphBodyText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Co Pa Te. Example: #FF00FF",
+ "name": "ParagraphHeaderText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Po. Example: #FF00FF",
+ "name": "PosterScreenLine1Text",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Po. Example: #FF00FF",
+ "name": "PosterScreenLine2Text",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Co. Example: #FF00FF",
+ "name": "RegistrationCodeColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Co. Example: #FF00FF",
+ "name": "RegistrationFocalColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Co. Example: #10FF80",
+ "name": "RegistrationFocalRectColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Position and size of the HD focal rectangle. Four integer: (x,y,width,height). Screen types: Co. Example: (228,360,120,82)",
+ "name": "RegistrationFocalRectHD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Position and size of the SD focal rectangle. Four integer: (x,y,width,height). Screen types: Co. Example: (172,220,90,76)",
+ "name": "RegistrationFocalRectSD",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardActorColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardAlbumColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Album Label. Screen types: Sp. Example: on",
+ "name": "SpringboardAlbumLabel",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardAlbumLabelColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "boolean string. Screen types: Sp. Example: true",
+ "name": "SpringboardAllow6Buttons",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardArtistColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Artist Label. Screen types: Sp. Example: by",
+ "name": "SpringboardArtistLabel",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardArtistLabelColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardDirectorColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardDirectorLabelColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardDirectorPrefixText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Director Label. Screen types: Sp. Example: Written by",
+ "name": "SpringboardDirectorText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardGenreColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardRuntimeColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardSynopsisColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Sp. Example: #FF00FF",
+ "name": "SpringboardTitleText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Must be a grayscale value. Screen types: Te. Example: #808080",
+ "name": "TextScreenBodyBackgroundColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Te. Example: #363636",
+ "name": "TextScreenBodyText",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Te. Example: #CC0000",
+ "name": "TextScreenScrollBarColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "HTML HEX Color Value. Screen types: Te. Example: #00CC00",
+ "name": "TextScreenScrollThumbColor",
+ "type": "string"
+ },
+ {
+ "default": "invalid",
+ "description": "Theme type. Generic-dark is the only valid value. Otherwise the default theme applies. Screen types: . Example: generic-dark",
+ "name": "ThemeType",
+ "type": "string"
+ }
+ ]
+ },
+ "ifappinfo": {
+ "implementers": [
+ {
+ "description": "Returns information about the application",
+ "name": "roAppInfo",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roappinfo.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Returns the app's developer ID, or the keyed developer ID, if the application is sideloaded.",
+ "name": "GetDevID",
+ "params": [],
+ "returnDescription": "Channel's Developer ID",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns the app's channel ID.",
+ "name": "GetID",
+ "params": [],
+ "returnDescription": "Channel ID; e.g., \"12345\" or \"dev\"",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns the subtitle value from the manifest.",
+ "name": "GetSubtitle",
+ "params": [],
+ "returnDescription": "Possible subtitle configuration",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns the title value from the manifest.",
+ "name": "GetTitle",
+ "params": [],
+ "returnDescription": "Title of the channel",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns the named manifest value, or an empty string if the entry is does not exist.",
+ "name": "GetValue",
+ "params": [
+ {
+ "default": null,
+ "description": "The manifest value to be returned.",
+ "isRequired": true,
+ "name": "key",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "Manifest value; empty string",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns the conglomerate version number from the manifest, as formatted major\\_version + minor\\_version + build\\_version.",
+ "name": "GetVersion",
+ "params": [],
+ "returnDescription": "Channel version number. e.g. \"1.2.3\"",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns true if the application is sideloaded, i.e. the channel ID is \"dev\".",
+ "name": "IsDev",
+ "params": [],
+ "returnDescription": "True/ False",
+ "returnType": "Boolean"
+ }
+ ],
+ "name": "ifAppInfo",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifappinfo.md"
+ },
+ "ifappmanager": {
+ "implementers": [
+ {
+ "description": "Returns information about the application",
+ "name": "roAppManager",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roappmanager.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Clears a previously set attribute and reverts to its default value.",
+ "name": "ClearThemeAttribute",
+ "params": [
+ {
+ "default": null,
+ "description": "The theme attribute to be cleared.",
+ "isRequired": true,
+ "name": "attributeName",
+ "type": "String"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Returns the user's screensaver wait time setting in number of minutes, or zero if the screensaver is disabled.",
+ "name": "GetScreensaverTimeout",
+ "params": [],
+ "returnDescription": "The number of minutes set for the screensaver wait time.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Returns an [roTimespan](https://developer.roku.com/docs/references/brightscript/components/rotimespan.md\"roTimespan\") object, which is \"marked\" when the user clicked on the application button on the home screen.Calling the TotalMilliseconds() method on the returned roTimespan object returns the total number of milliseconds since the application started.",
+ "name": "GetUptime",
+ "params": [],
+ "returnDescription": "An [roTimespan](/docs/references/brightscript/components/rotimespan.md \"roTimespan\") object.",
+ "returnType": "Object"
+ },
+ {
+ "description": "This method returns true if a channel with the specified channelID and the minimum version required is installed.",
+ "name": "IsAppInstalled",
+ "params": [
+ {
+ "default": null,
+ "description": "The unique id of the channel.",
+ "isRequired": true,
+ "name": "channelID",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "description": "The minimum version number of the channel to be used for the query.",
+ "isRequired": true,
+ "name": "version",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "A boolean indicating whether the specified channel is installed.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Launches the channel with the specified channelID and the specified version, with the playback experience upon launching the channel based on the provided params.",
+ "name": "LaunchApp",
+ "params": [
+ {
+ "default": null,
+ "description": "The unique ID of the channel to be launched.",
+ "isRequired": true,
+ "name": "channelID",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "description": "The minimum version of the channel required to launch the channel. If the specified version (or later) is not being used, the channel is not launched. To skip the version check, pass an empty string.",
+ "isRequired": true,
+ "name": "version",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "description": "Key-value pairs specifying the playback experience upon launching the channel. For example, if deep linking parameters are passed into the method, the content ID specifies the content to be played upon launching the channel, and the mediaType determines whether the content is launched directly into playback, launched into playback using bookmarks, or an episode selection screen for the content is displayed). To launch the channel store springboard of a channel, use the **ShowChannelStoreSpringboard()** method. You can also do this by passing a channelID of \"11\" is passed into this method (`LaunchApp(\"11\", \"\", params)`). In this case, the params field would include a content ID (`params = {contentID: \"myAwesomeMovie_123\"}`).",
+ "isRequired": true,
+ "name": "params",
+ "type": "roAssociative Array"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Enables or disables automatic Audio Guide and override any manifest setting.This is useful for channels that want to temporarily turn off automatic Audio Guide for specific screens.",
+ "name": "SetAutomaticAudioGuideEnabled",
+ "params": [
+ {
+ "default": null,
+ "description": "A flag indicating whether to enable or disable the automatic audio guide.",
+ "isRequired": true,
+ "name": "enabled",
+ "type": "Boolean"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Updates video or audio [content metadata](/docs/developer-program/getting-started/architecture/content-metadata.md) during playback. This method takes a subset of content metadata parameters to be updated. These values override any previously ones sent to the Roku Media Player, and they are used until this function is called again or until the [**roAppManager**](https://developer.roku.com/docs/references/brightscript/components/roappmanager.md instance is deleted.",
+ "name": "SetNowPlayingContentMetaData",
+ "params": [
+ {
+ "default": null,
+ "description": "The video or audio [content metadata](/docs/developer-program/getting-started/architecture/content-metadata.md) parameters to be updated (for example, the title and contentType)",
+ "isRequired": true,
+ "name": "contentMetaData",
+ "type": "roAssociativeArray"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Sets a group of theme attributes for the application.",
+ "name": "SetTheme",
+ "params": [
+ {
+ "default": null,
+ "description": "The attributeArray is an [roAssociativeArray](https://developer.roku.com/docs/references/brightscript/components/roassociativearray.md\"roAssociativeArray\") of attribute/value pairs. The program may create the roAssociativeArray at runtime or read it from an XML file using the [roXMLElement](https://developer.roku.com/docs/references/brightscript/components/roxmlelement.md\"roXMLElement\") object. Existing values for attributes will be overwritten by the values provided. Any values set by a previous SetTheme or SetThemeAttribute call, but not included in the array currently provided by with the subsequent call will remain unchanged. See [roAppManager](https://developer.roku.com/docs/references/brightscript/components/roappmanager.md\"roAppManager\") the list of valid attributes.",
+ "isRequired": true,
+ "name": "attributeArray",
+ "type": "Object"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Set an individual theme attribute for the application.",
+ "name": "SetThemeAttribute",
+ "params": [
+ {
+ "default": null,
+ "description": "The attributeName is the name of one of the settable theme attributes and the value is the desired setting. If the attributeName is not valid, no action is performed.",
+ "isRequired": true,
+ "name": "attributeName",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "description": "This attributeValue will override the default value for that attribute or modify the value provided by a previous SetTheme or SetThemeAttribute call to the new value provided.",
+ "isRequired": true,
+ "name": "attributeValue",
+ "type": "String"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "This method allows a channel to tell Roku when the user is signed in or signed out of the channelIf the channel is removed, the Roku OS will call SetUserSignedIn(false) on the channel's behalf.",
+ "name": "SetUserSignedIn",
+ "params": [
+ {
+ "default": null,
+ "description": "Set to true to indicate that the user is signed in; set to false to indicate the user is signed out.",
+ "isRequired": true,
+ "name": "signedIn",
+ "type": "Boolean"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Launches the channel store springboard of the specified channel. The channel store springboard contains detailed information about the channel, including ratings, version, date of last update, developer name, and a description.",
+ "name": "ShowChannelStoreSpringboard",
+ "params": [
+ {
+ "default": null,
+ "description": "The unique ID of the channel to be launched.",
+ "isRequired": true,
+ "name": "channelID",
+ "type": "String"
+ }
+ ],
+ "returnType": "Void"
+ }
+ ],
+ "name": "ifAppManager",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifappmanager.md"
+ },
+ "ifarray": {
+ "implementers": [
+ {
+ "description": "An array stores an indexed collection of BrightScript objects. Each entry of an array can be a different type, or they may all of the same type",
+ "name": "roArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roarray.md"
+ },
+ {
+ "description": "The byte array component is used to contain and manipulate an arbitrary array of bytes",
+ "name": "roByteArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/robytearray.md"
+ },
+ {
+ "description": "The list object implements the interfaces: ifList, ifArray, ifEnum and therefore can behave like an array that can dynamically add members",
+ "name": "roList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rolist.md"
+ },
+ {
+ "description": "Contains a list of roXML objects",
+ "name": "roXMLList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roxmllist.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Appends the entries in one **roArray** to another. If the passed array contains entries that have not been set to a value, they are not appended.",
+ "name": "Append",
+ "params": [
+ {
+ "default": null,
+ "description": "The **roArray** to be appended to the target array.",
+ "isRequired": true,
+ "name": "array",
+ "type": "Object"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Deletes all the entries in the array.",
+ "name": "Clear",
+ "params": [],
+ "returnType": "Void"
+ },
+ {
+ "description": "Returns the length of the array, which is one more than the index of highest entry.",
+ "name": "Count",
+ "params": [],
+ "returnDescription": "The length of the array.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Deletes the indicated array entry, and shifts all entries up. This decreases the array length by one.",
+ "name": "Delete",
+ "params": [
+ {
+ "default": null,
+ "isRequired": true,
+ "name": "index",
+ "type": "Integer"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the specified array entry has been removed. If the entry was successfully deleted, returns true. If index is out of range, returns false and does not change the array.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Returns the last (highest index) array entry without removing it. If the array is empty, returns invalid",
+ "name": "Peek",
+ "params": [],
+ "returnDescription": "Invalid",
+ "returnType": "Dynamic"
+ },
+ {
+ "description": "Returns the last entry (highest index) from the array and removes it from the array. If the array is empty, returns invalid and does not change the array.",
+ "name": "Pop",
+ "params": [],
+ "returnDescription": "The last (highest index) array entry.",
+ "returnType": "Dynamic"
+ },
+ {
+ "description": "Adds the specified value to the end of the array.",
+ "name": "Push",
+ "params": [
+ {
+ "default": null,
+ "description": "The value to be added to the beginning of the array.",
+ "isRequired": true,
+ "name": "tvalue",
+ "type": "Dynamic"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Removes the first entry (zero index) from the beginning of the array and shifts the other entries up. This method is similar to the [Pop method](#pushtvalue-as-dynamic-as-void), but removes the first entry in the array instead of the last.",
+ "name": "Shift",
+ "params": [],
+ "returnDescription": "The first entry (zero index) removed from the array.",
+ "returnType": "Dynamic"
+ },
+ {
+ "description": "Adds the specified value to the beginning of the array (at the zero index) and shifts the other entries down. This method is similar to the [Push method](#push-as-dynamic), but removes the first entry in the array instead of the last.",
+ "name": "Unshift",
+ "params": [
+ {
+ "default": null,
+ "description": "The value to be added to the beginning of the array.",
+ "isRequired": true,
+ "name": "tvalue",
+ "type": "Dynamic"
+ }
+ ],
+ "returnType": "Void"
+ }
+ ],
+ "name": "ifArray",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarray.md"
+ },
+ "ifarrayget": {
+ "description": "The ifArrayGet interface supports the array indexing operator \\[ \\]\n\n(See [Array Operator](https://developer.roku.com/docs/references/brightscript/language/expressions-variables-types.mdeffects-of-type-conversions-on-accuracy \"Array Operator\"))",
+ "implementers": [
+ {
+ "description": "An array stores an indexed collection of BrightScript objects. Each entry of an array can be a different type, or they may all of the same type",
+ "name": "roArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roarray.md"
+ },
+ {
+ "description": "The byte array component is used to contain and manipulate an arbitrary array of bytes",
+ "name": "roByteArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/robytearray.md"
+ },
+ {
+ "description": "The list object implements the interfaces: ifList, ifArray, ifEnum and therefore can behave like an array that can dynamically add members",
+ "name": "roList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rolist.md"
+ },
+ {
+ "description": "Contains a list of roXML objects",
+ "name": "roXMLList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roxmllist.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Returns an array entry based on the provided index.",
+ "name": "GetEntry",
+ "params": [
+ {
+ "default": null,
+ "description": "The index of the array entry to be returned.",
+ "isRequired": true,
+ "name": "index",
+ "type": "Integer"
+ }
+ ],
+ "returnDescription": "The array entry corresponding to the provided index, or invalid if the entry has not been set.",
+ "returnType": "Dynamic"
+ }
+ ],
+ "name": "ifArrayGet",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayget.md"
+ },
+ "ifarrayjoin": {
+ "implementers": [
+ {
+ "description": "Returns information about the application",
+ "name": "roArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roarray.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Creates a string by joining all array elements together separated by the specified separator. All elements must be of type string; otherwise, an empty string is returned",
+ "name": "Join",
+ "params": [
+ {
+ "default": null,
+ "description": "The string used to separate elements in an array.",
+ "isRequired": true,
+ "name": "separator",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "A String containing the array elements.",
+ "returnType": "String"
+ }
+ ],
+ "name": "ifArrayJoin",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayjoin.md"
+ },
+ "ifarrayset": {
+ "description": "The ifArraySet interface supports the array indexing operator \\[\\].\n\n(See ArrayOperator)",
+ "implementers": [
+ {
+ "description": "An array stores an indexed collection of BrightScript objects. Each entry of an array can be a different type, or they may all of the same type",
+ "name": "roArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roarray.md"
+ },
+ {
+ "description": "The byte array component is used to contain and manipulate an arbitrary array of bytes",
+ "name": "roByteArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/robytearray.md"
+ },
+ {
+ "description": "The list object implements the interfaces: ifList, ifArray, ifEnum and therefore can behave like an array that can dynamically add members",
+ "name": "roList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rolist.md"
+ },
+ {
+ "description": "Contains a list of roXML objects",
+ "name": "roXMLList",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roxmllist.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Sets an entry at a given index to the passed value. If index is beyond the bounds of the array, the array is expanded to accommodate it.",
+ "name": "SetEntry",
+ "params": [
+ {
+ "default": null,
+ "description": "The entry to be updated.",
+ "isRequired": true,
+ "name": "index",
+ "type": "Integer"
+ },
+ {
+ "default": null,
+ "description": "The new value for the specified entry.",
+ "isRequired": true,
+ "name": "tvalue",
+ "type": "Dynamic"
+ }
+ ],
+ "returnType": "Void"
+ }
+ ],
+ "name": "ifArraySet",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayset.md"
+ },
+ "ifarraysort": {
+ "implementers": [
+ {
+ "description": "Returns information about the application",
+ "name": "roArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roarray.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Reverses the order of elements in an array.",
+ "name": "Reverse",
+ "params": [],
+ "returnType": "Void"
+ },
+ {
+ "description": "Performs a stable sort on an array.",
+ "name": "Sort",
+ "params": [
+ {
+ "default": null,
+ "description": "Items are arbitrarily grouped by comparable type of number or string, and are sorted within the group with a logical comparison. If \"r\" is included in flags, a reverse sort is performed. If \"i\" is included in flags, a case-insensitive sort is performed. If invalid flags are specified, the sort is not performed.",
+ "isRequired": true,
+ "name": "flags",
+ "type": "Dynamic"
+ }
+ ]
+ },
+ {
+ "description": "Performs a stable sort of an array of associative arrays by value of a common field.",
+ "name": "SortBy",
+ "params": [
+ {
+ "default": null,
+ "description": "The field to be used for sorting.",
+ "isRequired": true,
+ "name": "fieldName",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "description": "Items are arbitrarily grouped by comparable type of number or string, and are sorted within the group with a logical comparison. If \"r\" is included in flags, a reverse sort is performed. If \"i\" is included in flags, a case-insensitive sort is performed. If invalid flags are specified, the sort is not performed.",
+ "isRequired": true,
+ "name": "flags",
+ "type": "Dynamic"
+ }
+ ]
+ }
+ ],
+ "name": "ifArraySort",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifarraysort.md"
+ },
+ "ifassociativearray": {
+ "implementers": [
+ {
+ "description": "An associative array allows objects to be associated with string keys",
+ "name": "roAssociativeArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roassociativearray.md"
+ },
+ {
+ "description": "The roSGNode object is the BrightScript equivalent of SceneGraph XML file node creation",
+ "name": "roSGNode",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rosgnode.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Adds a new entry to the array associating the supplied value with the supplied key string. Only one value may be associated with a key. If the key is already associated with a value, the existing value is discarded.",
+ "name": "AddReplace",
+ "params": [
+ {
+ "default": null,
+ "description": "The key to be added to the associative array.",
+ "isRequired": true,
+ "name": "key",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "description": "The value of the key to be added to the associative array.",
+ "isRequired": true,
+ "name": "value",
+ "type": "Dynamic"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Appends an associative array to this calling object. If any key in the **aa** parameter is already associated with a value in the calling object, the current value is discarded and is replaced with the value provided in the **aa** parameter.",
+ "name": "Append",
+ "params": [
+ {
+ "default": null,
+ "description": "The associative array to be appended to the calling object.",
+ "isRequired": true,
+ "name": "aa",
+ "type": "Object"
+ }
+ ]
+ },
+ {
+ "description": "Remove all key/values from the associative array.",
+ "name": "Clear",
+ "params": [],
+ "returnType": "Void"
+ },
+ {
+ "description": "Returns the number of keys in the associative array.",
+ "name": "Count",
+ "params": [],
+ "returnDescription": "The number of keys in the associative array.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Deletes an entry from an associative array based on the key.",
+ "name": "Delete",
+ "params": [
+ {
+ "default": null,
+ "description": "The key associated with the entry to be deleted.",
+ "isRequired": true,
+ "name": "key",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "A flag indicating whether an entry is associated with the specified key exists. If there is no associated object then false is returned. If there is such an object then true is returned.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Looks for an entry in the associative array associated with the specified key.",
+ "name": "DoesExist",
+ "params": [
+ {
+ "default": null,
+ "description": "The key associated with the entry to be checked.",
+ "isRequired": true,
+ "name": "key",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "A flag indicating whether an entry is associated with the specified key exists. If there is no associated object then false is returned. If there is such an object then true is returned.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Returns an array containing the associative array key/value pairs in lexicographical order of key.",
+ "name": "Items",
+ "params": [],
+ "returnDescription": "An array of associative array keys/value pairs.",
+ "returnType": "Object"
+ },
+ {
+ "description": "Returns an array containing the associative array keys in lexicographical order.",
+ "name": "Keys",
+ "params": [],
+ "returnDescription": "An array of associative array keys.",
+ "returnType": "Object"
+ },
+ {
+ "description": "Returns the value in the array associated with the specified key. The key comparison is case-insensitive, unless the **SetModeCaseSensitive()** method has been called.",
+ "name": "Lookup",
+ "params": [
+ {
+ "default": null,
+ "description": "The key associated with the value to be retrieved from the associative array.",
+ "isRequired": true,
+ "name": "key",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "Returns the value in the array associated with the specified key. If there is no value associated with the key, the type \"invalid\" is returned.",
+ "returnType": "Dynamic"
+ },
+ {
+ "description": "Same as the [Lookup()](#lookupkey-as-string-as-dynamic) method except that the key comparison is always case insensitive, regardless of the case mode.",
+ "name": "LookupCI",
+ "params": [
+ {
+ "default": null,
+ "description": "The key (case-insensitive) associated with the value to be retrieved from the associative array.",
+ "isRequired": true,
+ "name": "key",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "Returns the value in the array associated with the specified key. If there is no value associated with the key, the type \"invalid\" is returned.",
+ "returnType": "Dynamic"
+ },
+ {
+ "description": "Makes all subsequent associative array lookups case sensitive (by default, lookups are case insensitive).",
+ "name": "SetModeCaseSensitive",
+ "params": [],
+ "returnType": "Void"
+ }
+ ],
+ "name": "ifAssociativeArray",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifassociativearray.md"
+ },
+ "ifaudioguide": {
+ "description": "> Please note this component is only available on the following devices: Roku Streaming Stick (3600X), Roku Express (3700X) and Express+ (3710X), Roku Premiere (4620X) and Premiere+ (4630X), Roku Ultra (4640X), and any Roku TV running Roku OS version 7.5 and later.",
+ "implementers": [
+ {
+ "description": "Returns information about the application",
+ "name": "roAudioGuide",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudioguide.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Interrupts and stops any current text to speech spoken string, to be used when the application does not want the text to speech to continue.",
+ "name": "Flush",
+ "params": []
+ },
+ {
+ "description": "Returns an ID for the spoken string to notify observer callbacks about a specific spoken string. This ID can be used with the [roTextToSpeechEvent](https://developer.roku.com/docs/references/brightscript/events/rotexttospeechevent.md\"roTextToSpeechEvent\").This method will automatically split up text to reduce lag. Due to this automatic splitting, the roTextToSpeechEvent 0 (\"Started speech\") event for the returned ID may not be sent until later than expected. The roTextToSpeechEvents 1 (\"Speech has completed\") and 2 (\"Speech has been flushed\") events are sent at the expected times.",
+ "name": "Say",
+ "params": [
+ {
+ "default": null,
+ "description": "The string to be spoken.",
+ "isRequired": true,
+ "name": "text",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "description": "Set to true to make the Audio Guide immediately stop speaking any other speech before speaking. Set to false to make the Audio Guide wait until any current speech is done before speaking.",
+ "isRequired": true,
+ "name": "flushSpeech",
+ "type": "Boolean"
+ },
+ {
+ "default": null,
+ "description": "Set to true to ignore calls to the say() method with the same text. Set to false to speak when calls to the say() method are sent with the same text.",
+ "isRequired": true,
+ "name": "dontRepeat",
+ "type": "Boolean"
+ }
+ ],
+ "returnDescription": "An ID associated with the spoken string to be used to notify observer callbacks.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "If Audio Guide is enabled, causes text to speech to continue to suppress any application background sound for the amount of time specified by duration (in milliseconds).This can be used to add clarity for longer spoken text that may have pauses that might otherwise allow application background sound to be heard. This method does nothing if Audio Guide is currently disabled.",
+ "name": "Silence",
+ "params": [
+ {
+ "default": null,
+ "description": "The number of milliseconds to suppress application background sounds.",
+ "isRequired": true,
+ "name": "duration",
+ "type": "Integer"
+ }
+ ],
+ "returnDescription": "The number of milliseconds that the background sound has been silenced.",
+ "returnType": "Integer"
+ }
+ ],
+ "name": "ifAudioGuide",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudioguide.md"
+ },
+ "ifaudiometadata": {
+ "implementers": [
+ {
+ "description": "This component provides developers access to audio file metadata included in many audio files",
+ "name": "roAudioMetadata",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudiometadata.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Returns an associative array with a simple set of audio properties.",
+ "name": "GetAudioProperties",
+ "params": [],
+ "returnDescription": "An associative array that may be set to one of the following values (these are values that may involve reading a larger portion of the file and thus may take longer to retrieve than tags):",
+ "returnType": "Object"
+ },
+ {
+ "description": "Returns the cover art, if available.",
+ "name": "GetCoverArt",
+ "params": [],
+ "returnDescription": "An associative array with two entries: \"bytes\" and \"type\".",
+ "returnType": "Object"
+ },
+ {
+ "description": "Returns an associative array that contains a simple set of tags that are common to most audio formats.",
+ "name": "GetTags",
+ "params": [],
+ "returnDescription": "An associative array that may be set to one of the following values:",
+ "returnType": "Object"
+ },
+ {
+ "description": "Sets the URL to the audio file. Only file URLs are initially supported",
+ "name": "SetUrl",
+ "params": [
+ {
+ "default": null,
+ "description": "The URL of the audio file.",
+ "isRequired": true,
+ "name": "url",
+ "type": "String"
+ }
+ ],
+ "returnType": "Void"
+ }
+ ],
+ "name": "ifAudioMetaData",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudiometadata.md"
+ },
+ "ifaudioplayer": {
+ "implementers": [
+ {
+ "description": "The Audio Player object provides the ability to setup the playing of a series of audio streams",
+ "name": "roAudioMetadata",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudiometadata.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Adds a new ContentMetaData item to the end of the content list for the Audio Player.",
+ "name": "AddContent",
+ "params": [
+ {
+ "default": null,
+ "description": "The new ContentMetaData item to be added to the content list.",
+ "isRequired": true,
+ "name": "contentItem",
+ "type": "Object"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Clears the content list.",
+ "name": "ClearContent",
+ "params": [],
+ "returnType": "Void"
+ },
+ {
+ "description": "Puts the Audio Player into pause mode. It is an error to Pause if player is not in play mode.",
+ "name": "Pause",
+ "params": [],
+ "returnDescription": "A flag indicating whether the Audio Player was successfully set to pause mode.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Puts the Audio Player into play mode starting at the current item in the Content List. This will stop any currently playing content.",
+ "name": "Play",
+ "params": [],
+ "returnDescription": "A flag indicating whether the Audio Player was successfully set to play mode.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Puts the Audio Player into play mode starting from the pause point. It is an error to Resume if the player is not in pause mode.",
+ "name": "Resume",
+ "params": [],
+ "returnDescription": "A flag indicating whether the Audio Player was successfully set to play mode.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Set the start point of playback for the current item to offsetMs milliseconds.",
+ "name": "Seek",
+ "params": [
+ {
+ "default": null,
+ "description": "The offset to be used to determine the start point of the current content item.",
+ "isRequired": true,
+ "name": "offsetMs",
+ "type": "Integer"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the Audio Player was successfully set to the specified offset.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Sets the content list to be played by the Audio Player.",
+ "name": "SetContentList",
+ "params": [
+ {
+ "default": null,
+ "isRequired": true,
+ "name": "contentList",
+ "type": "Object"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Enables/disables the automatic replaying of the Content List.",
+ "name": "SetLoop",
+ "params": [
+ {
+ "default": null,
+ "description": "Set to true to have the Audio Player automatically begin playing the first item in the content list after playing the last item. Set to false to have the Audio Player stop after playing the last item in the content list.",
+ "isRequired": true,
+ "name": "enable",
+ "type": "Boolean"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Sets the next item in the Content List to be played.",
+ "name": "SetNext",
+ "params": [
+ {
+ "default": null,
+ "description": "Item is the zero-based index of the item in the content list. This item will be played after the currently playing item finishes.",
+ "isRequired": true,
+ "name": "item",
+ "type": "Integer"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Specifies the timedMetaData keys that the channel is interested in receiving from the timedMetaData event.",
+ "name": "SetTimedMetaDataForKeys",
+ "params": [
+ {
+ "default": null,
+ "isRequired": true,
+ "name": "keys"
+ }
+ ]
+ },
+ {
+ "description": "Stops the Audio Player from playing or pausing and cleanup.",
+ "name": "Stop",
+ "params": [],
+ "returnDescription": "A flag indicating whether the Audio Player was successfully stopped.",
+ "returnType": "Boolean"
+ }
+ ],
+ "name": "ifAudioPlayer",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudioplayer.md"
+ },
+ "ifaudioresource": {
+ "implementers": [
+ {
+ "description": "The roAudioResouce allows .wav files to be cached to memory and quickly played at any time",
+ "name": "roAudioResource",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roaudioresource.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Returns an [roAssociativeArray](https://developer.roku.com/docs/references/brightscript/components/roassociativearray.md\"roAssociativeArray\") array containing the indicated metadata parameters about the audio resource.",
+ "name": "GetMetaData",
+ "params": [],
+ "returnDescription": "An associative array with the following integer values:",
+ "returnType": "Object"
+ },
+ {
+ "description": "Checks whether this audio resource is currently playing.",
+ "name": "IsPlaying",
+ "params": [],
+ "returnDescription": "A flag indicating whether the calling audio resource is playing.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Returns the device-dependent maximum number of audio streams that can be mixed together and presented simultaneously.",
+ "name": "MaxSimulStreams",
+ "params": [],
+ "returnDescription": "Typically, 1-2.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Stops playing the audio resource. If the resource is not currently playing, has no effect.",
+ "name": "Stop",
+ "params": [],
+ "returnType": "Void"
+ },
+ {
+ "description": "This method triggers the start of the audio resource sound playback. The effect of Trigger(volume) is identical to Trigger(volume, 0).",
+ "name": "Trigger",
+ "params": [
+ {
+ "default": null,
+ "description": "The volume is a number between 0 and 100 (percentage of full volume). A value of 50 should be used for normal volume.",
+ "isRequired": true,
+ "name": "volume",
+ "type": "Integer"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Triggers the start of the audio resource sound playback. This method will interrupt any playing sound when the index is the same. It will mix with any playing sound if the index is different.",
+ "name": "Trigger",
+ "params": [
+ {
+ "default": null,
+ "description": "The volume is a number between 0 and 100 (percentage of full volume). 50 should be used for normal volume.",
+ "isRequired": true,
+ "name": "volume",
+ "type": "Integer"
+ },
+ {
+ "default": null,
+ "description": "The index is a value between 0 and [MaxSimulStreams()](#maxsimulstreams-as-integer) allowing for multiple sounds to be mixed.",
+ "isRequired": true,
+ "name": "index",
+ "type": "Integer"
+ }
+ ],
+ "returnType": "Void"
+ }
+ ],
+ "name": "ifAudioResource",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifaudioresource.md"
+ },
+ "ifboolean": {
+ "description": "Interface equivalent for intrinsic type Boolean.",
+ "implementers": [
+ {
+ "description": "Object equivalent for intrinsic type Boolean",
+ "name": "roBoolean",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/roboolean.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Gets the boolean value stored in the calling boolean object.",
+ "name": "GetBoolean",
+ "params": [],
+ "returnDescription": "The boolean value stored in the calling boolean object.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Sets the calling boolean object to the specified true/false value.",
+ "name": "SetBoolean",
+ "params": [
+ {
+ "default": null,
+ "description": "True/false.",
+ "isRequired": true,
+ "name": "value",
+ "type": "Boolean"
+ }
+ ],
+ "returnType": "Void"
+ }
+ ],
+ "name": "ifBoolean",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifboolean.md"
+ },
+ "ifbytearray": {
+ "implementers": [
+ {
+ "description": "The byte array component is used to contain and manipulate an arbitrary array of bytes",
+ "name": "roByteArray",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/robytearray.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "Appends the contents of the Byte Array to the specified file.",
+ "name": "AppendFile",
+ "params": [
+ {
+ "default": null,
+ "description": "The path to the file to be appended to the ByteArray.",
+ "isRequired": true,
+ "name": "path",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the file was successfully appended to the calling ByteArray.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Appends the contents of the Byte Array to the specified file.",
+ "name": "AppendFile",
+ "params": [
+ {
+ "default": null,
+ "description": "The path to the file to be appended to the Byte Array.",
+ "isRequired": true,
+ "name": "path",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "isRequired": true,
+ "name": "start"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the file was successfully appended to the calling ByteArray."
+ },
+ {
+ "description": "Sets the contents of the Byte Array to the specified string using UTF-8 encoding. Any data currently in the Byte Array is discarded.",
+ "name": "FromAsciiString",
+ "params": [
+ {
+ "default": null,
+ "description": "The string to which the ByteArray is to be set.",
+ "isRequired": true,
+ "name": "s",
+ "type": "String"
+ }
+ ]
+ },
+ {
+ "description": "Sets the contents of the Byte Array to the specified value. Any data currently in the Byte Array is discarded.",
+ "name": "FromBase64String",
+ "params": [
+ {
+ "default": null,
+ "description": "A valid base-64 encoding",
+ "isRequired": true,
+ "name": "s",
+ "type": "String"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Sets the contents of the Byte Array to the specified value. Any data currently in the Byte Array is discarded.",
+ "name": "FromHexString",
+ "params": [
+ {
+ "default": null,
+ "description": "An even number of hexadecimal digits. The string must contain valid hexadecimal digits, or the result is undefined",
+ "isRequired": true,
+ "name": "hexstring",
+ "type": "String"
+ }
+ ],
+ "returnType": "Void"
+ },
+ {
+ "description": "Calculates a CRC-32 of the contents of the Byte Array.",
+ "name": "GetCRC32",
+ "params": [],
+ "returnDescription": "The calculated CRC-32 checksum.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Calculates a CRC-32 of a subset of bytes within the Byte Array.",
+ "name": "GetCRC32",
+ "params": [
+ {
+ "default": null,
+ "description": "The starting index of the subset of bytes to be used in the CRC-32 calculation.",
+ "isRequired": true,
+ "name": "start",
+ "type": "Integer"
+ },
+ {
+ "default": null,
+ "description": "The length of the bytes to be included.",
+ "isRequired": true,
+ "name": "length",
+ "type": "Integer"
+ }
+ ],
+ "returnDescription": "The calculated CRC-32 checksum.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Returns the signed byte at the specified zero-based index in the Byte ArrayUse the [ifArrayGet.GetEntry()](https://developer.roku.com/docs/references/brightscript/interfaces/ifarrayget.mdgetentryindex-as-integer-as-dynamic) method or the \\[ \\] array operator to read an unsigned byte in the Byte Array.",
+ "name": "GetSignedByte",
+ "params": [
+ {
+ "default": null,
+ "description": "The index of the signed byte to be returned.",
+ "isRequired": true,
+ "name": "index",
+ "type": "Integer"
+ }
+ ],
+ "returnDescription": "The signed byte at the specified zero-based index in the Byte Array.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Returns the signed long (four bytes) starting at the specified zero-based index in the Byte Array.",
+ "name": "GetSignedLong",
+ "params": [
+ {
+ "default": null,
+ "description": "The index of the ByteArray from which to start retrieving the signed long.",
+ "isRequired": true,
+ "name": "index",
+ "type": "Integer"
+ }
+ ],
+ "returnDescription": "A signed long.",
+ "returnType": "Integer"
+ },
+ {
+ "description": "Returns true if the CPU architecture is little-endian.",
+ "name": "IsLittleEndianCPU",
+ "params": [],
+ "returnDescription": "A flag indicating whether the CPU architecture is little-endian.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Reads the specified file into the Byte Array. Any data currently in the Byte Array is discarded.",
+ "name": "ReadFile",
+ "params": [
+ {
+ "default": null,
+ "description": "The path to the file to be read.",
+ "isRequired": true,
+ "name": "path",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the bytes were successfully read into the Byte Array.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Reads the specified file into the Byte Array. Any data currently in the Byte Array is discarded.",
+ "name": "ReadFile",
+ "params": [
+ {
+ "default": null,
+ "description": "The path to the file to be read.",
+ "isRequired": true,
+ "name": "path",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "isRequired": true,
+ "name": "start"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the bytes were successfully read into the Byte Array."
+ },
+ {
+ "description": "If the size of the Byte Array is less than min\\_size, expands the Byte Array to min\\_size. Also sets the auto-resize attribute of the Byte Array to the specified value.",
+ "name": "SetResize",
+ "params": [
+ {
+ "default": null,
+ "isRequired": true,
+ "name": "min"
+ }
+ ]
+ },
+ {
+ "description": "Returns the contents of the Byte Array as a string. The contents must be valid UTF-8 (or ASCII subset), or the result is undefined",
+ "name": "ToAsciiString",
+ "params": [],
+ "returnDescription": "A String containing the contents of the ByteArray.",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns a base-64 string representing the contents of the Byte Array.",
+ "name": "ToBase64String",
+ "params": [],
+ "returnDescription": "A base-64 string representing the contents of the Byte Array.",
+ "returnType": "String"
+ },
+ {
+ "description": "Returns a hexadecimal string representing the contents of the Byte Array, two digits per byte.",
+ "name": "ToHexString",
+ "params": [],
+ "returnDescription": "A hexadecimal string.",
+ "returnType": "String"
+ },
+ {
+ "description": "Writes the bytes contained in the Byte Array to the specified file.",
+ "name": "WriteFile",
+ "params": [
+ {
+ "default": null,
+ "description": "The path to the file to which the bytes are to be written.",
+ "isRequired": true,
+ "name": "path",
+ "type": "String"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the bytes were successfully written to the file.",
+ "returnType": "Boolean"
+ },
+ {
+ "description": "Writes a subset of the bytes contained in the Byte Array to the specified file.",
+ "name": "WriteFile",
+ "params": [
+ {
+ "default": null,
+ "description": "The path to the file to which the bytes are to be written.",
+ "isRequired": true,
+ "name": "path",
+ "type": "String"
+ },
+ {
+ "default": null,
+ "isRequired": true,
+ "name": "start"
+ }
+ ],
+ "returnDescription": "A flag indicating whether the bytes were successfully written to the file."
+ }
+ ],
+ "name": "ifByteArray",
+ "properties": [],
+ "url": "https://developer.roku.com/docs/references/brightscript/interfaces/ifbytearray.md"
+ },
+ "ifcaptionrenderer": {
+ "description": "> This component is no longer updated and will be deprecated on January 1st, 2019.Beginning July 1st, 2017, any new channels using this component will be rejected during certification.Beginning January 1st, 2018, any updates to existing channels using this component will be rejected during certification.",
+ "implementers": [
+ {
+ "description": "Returns information about the application",
+ "name": "roCaptionRenderer",
+ "url": "https://developer.roku.com/docs/references/brightscript/components/rocaptionrenderer.md"
+ }
+ ],
+ "methods": [
+ {
+ "description": "The ChangeSubtitleTrack function is used to change the caption source after playback has begun.",
+ "name": "ChangeSubtitleTrack",
+ "params": [
+ {
+ "default": null,
+ "description": "One of the 608 channels or ttml text tracks to be selected. The 608 channels are specified as 'eia608/' where is 1, 2, 3, or 4. The ttml text tracks are specified as 'ism/