Home

Awesome

BrighterScript

A superset of Roku's BrightScript language. Compiles to standard BrightScript.

build status coverage status monthly downloads npm version license Slack

Overview

The BrighterScript language provides new features and syntax enhancements to Roku's BrightScript language. Because the language is a superset of BrightScript, the parser and associated tools (VSCode integration, cli, etc...) work with standard BrightScript (.brs) files. This means you will get benefits (as described in the following section) from using the BrighterScript compiler, whether your project contains BrighterScript (.bs) files or not. The BrighterScript language transpiles to standard BrightScript, so your code is fully compatible with all roku devices.

Help!

[!IMPORTANT] We are currently seeking testers for two major rewrites:

If you're interested in helping, please visit the GitHub discussion links above for more information and instructions on how to get involved.

Features

BrighterScript adds several new features to the BrightScript language such as namespaces, classes, import statements, and more. Take a look at the language specification docs for more information.

BrighterScript Language Specification

Why use the BrighterScript compiler/CLI?

Why use the BrighterScript language?

Who uses Brighterscript?

<br/> <p align="center"> <a href="https://www.fubo.tv/"> <img height="38" src="https://user-images.githubusercontent.com/2544493/192530108-eb470b85-e687-4575-af69-254aab13428c.png"> </a>&nbsp;&nbsp;&nbsp; <a href="mailto:chris@inverted-solutions.com"> <img height="38" src="https://user-images.githubusercontent.com/2544493/197794500-2bac4903-ed00-463a-b243-24c68fba7962.png"> </a>&nbsp;&nbsp;&nbsp; <a href="https://www.applicaster.com/"> <img height="38" src="https://user-images.githubusercontent.com/2544493/192591901-20441fc8-3c6c-45ea-8851-b22430e6fb8e.png"> </a>&nbsp;&nbsp;&nbsp; <a href="https://www.redspace.com/"> <img height="38" src="https://user-images.githubusercontent.com/2544493/195908446-8d9652f8-9877-426f-b3c6-09119d788fd8.png"> </a>&nbsp;&nbsp;&nbsp; <br/><br/> <a href="https://tantawowa.com/"> <img height="38" src="https://user-images.githubusercontent.com/2544493/197795138-2ec870db-71fe-49e3-a014-692a3f31e6aa.png"> </a>&nbsp;&nbsp;&nbsp; <a href="https://www.miraclechannel.ca/corcoplus"> <img height="38" src="https://user-images.githubusercontent.com/2544493/192593254-f2a32cd4-0482-40de-830d-c1d09690c46b.png"> </a>&nbsp;&nbsp;&nbsp; <a href="https://digitalpictureframe.tv"> <img height="38" src="https://s3.us-east-1.wasabisys.com/tv.digitalpictureframe.assets/logo-wide.png"> </a>&nbsp;&nbsp;&nbsp; <a href="https://www.haystack.tv/"> <img height="38" src="https://user-images.githubusercontent.com/2544493/192610056-d1b5a382-edf4-47b9-a6a5-d2d3ee9094cb.png"> </a>&nbsp;&nbsp;&nbsp; </p> <br/>

The BrighterScript project is used to power the popular Brightscript Language VSCode extension, the maestro framework, and more.

Contact us if you use BrighterScript in 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:

We want to honor BrightScript, the language that BrighterScript is based off of, and could think of no better way than to use most of its name in our name.

Installation

npm

npm install brighterscript -g

Usage

Basic Usage

If your project structure exactly matches Roku's, and you run the command from the root of your project, then you can do the following:

bsc

That's it! It will find all files in your BrightScript project, check for syntax and static analysis errors, and if there were no errors, it will produce a zip at ./out/project.zip

Advanced Usage

If you need to configure bsc, you can do so in two ways:

  1. Using command line arguments. This tool can be fully configured using command line arguments. To see a full list, run bsc --help in your terminal.
  2. Using a bsconfig.json file. See the available options below. By default, bsc looks for a bsconfig.json file at the same directory that bsc is executed. If you want to store your bsconfig.json file somewhere else, then you should provide the --project argument and specify the path to your bsconfig.json file.

Examples

  1. Your project resides in a subdirectory of your workspace folder.

    bsc --root-dir ./rokuSourceFiles
    
  2. Run the compiler in watch mode

    bsc --watch
    
  3. Run the compiler in watch mode, and redeploy to the roku on every change

    bsc --watch --deploy --host 192.168.1.10 --password secret_password
    
  4. Use a bsconfig.json file not located at cwd

    bsc --project ./some_folder/bsconfig.json
    
  5. Run the compiler as a linter only (watch mode supported)

    bsc --create-package false --copy-to-staging false
    

bsconfig.json

Overview

The presence of a bsconfig.json file in a directory indicates that the directory is the root of a BrightScript project. The bsconfig.json file specifies the root files and the compiler options required to compile the project. Here is a minimal example, which is recommended for new projects:

{
    "rootDir": "src",
    "files": [
        "**/*"
    ],
    "stagingFolderPath": "dist",
    "retainStagingFolder": true,
    //this flag tells BrighterScript that for every xml file, try to import a .bs file with the same name and location
    "autoImportComponentScript": true,
    "sourceMap": true
}

More information on the config file format may be found in the bsconfig.json documentation.

Suppressing compiler messages

The BrighterScript compiler emits errors and warnings when it encounters potentially invalid code. Errors and warnings may also be emitted by compiler plugins, such as by the BrighterScript linter. These messages can be suppressed if needed; see the documentation.

ropm support

In order for BrighterScript-transpiled projects to work as ropm modules, they need a reference to bslib (the BrightScript runtime library for BrighterScript features) in their package. As ropm and brighterscript become more popular, this could result in many duplicate copies of bslib.brs.

To encourage reducing code duplication, BrighterScript has built-in support for loading bslib from ropm. Here's how it works:

  1. if your program does not use ropm, or does use ropm but does not directly reference bslib, then the BrighterScript compiler will copy bslib to "pkg:/source/bslib.brs" at transpile-time.
  2. if your program uses ropm and has installed bslib as a dependency, then the BrighterScript compiler will not emit a copy of bslib at pkg:/source/bslib.brs, and will instead use the path to the version from ropm pkg:/source/roku_modules/bslib/bslib.brs.

Installing bslib in your ropm-enabled project

bslib is published to npm under the name @rokucommunity/bslib. If you use NodeJS version 12 or above, we recommend installing @rokucommunity/bslib with the bslib alias, as it produces smaller transpiled code (i.e. emits bslib_ prefix instead of rokucommunity_bslib_). Here's the command to install bslib under the bslib alias using the ropm CLI.

ropm install bslib@npm:@rokucommunity/bslib

bslib support on NodeJS versions less than 12

npm aliases only work in NodeJS version 12 and above. If you're using a NodeJS version less than 12, you will need to install @rokucommunity/bslib directly without the alias. BrighterScript recognizes this pattern as well, it's just not preferred (for the reasons mentioned previously). Here's the command for that:

ropm install @rokucommunity/bslib

Language Server Protocol

This project also contributes a class that aligns with Microsoft's Language Server Protocol, which makes it easy to integrate BrightScript and BrighterScript with any IDE that supports the protocol. We won't go into more detail here, but you can use the LanguageServer class from this project to integrate into your IDE. The vscode-BrightScript-language extension uses this LanguageServer class to bring BrightScript and BrighterScript language support to Visual Studio Code.

Changelog

Click here to view the changelog.

Special Thanks

Special thanks to the brs project for its fantastic work on its blazing fast BrightScript parser which was used as the foundation for the BrighterScript parser.