diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6850857ea..380667478 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -45,9 +45,9 @@ Regardless of whether you're fixing bugs or implementing new features, there's a 1. Create a fork of this repo if you haven't already 1. Send us a [pull request](https://github.com/rokucommunity/brs/pulls)! -### Adding a component +### Adding a Node component -For guidelines on adding a component to `brs`, see [this doc](docs/AddingComponents.md). +For guidelines on adding a Node component to `brs`, see [this doc](docs/AddingComponents.md). ## What We Look For in a Pull Request diff --git a/docs/AddingComponents.md b/docs/AddingComponents.md index 6c074f905..f87c2dc79 100644 --- a/docs/AddingComponents.md +++ b/docs/AddingComponents.md @@ -1,22 +1,22 @@ -## Guidelines for adding components to `brs` +## Guidelines for adding node components to `brs` -This is aimed to be a quick guide for adding a component to `brs`. Note that this may not be comprehensive in all cases, but is a general plan of attack. Here are the steps you should take: +This is aimed to be a quick guide for adding a node component to `brs`. Note that this may not be comprehensive in all cases, but is a general plan of attack. Here are the steps you should take: -1. Find the documentation for your component on [Roku's developer docs](https://developer.roku.com). For example, the documentation for the `Group` component can be found [here](https://developer.roku.com/en-gb/docs/references/scenegraph/layout-group-nodes/group.md). -1. Create a file in the [components directory](https://github.com/rokucommunity/brs/tree/master/src/brsTypes/components) called `.ts`. +1. Find the documentation for your component on [Roku's developer docs](https://developer.roku.com). For example, the documentation for the `Group` component can be found [here](https://developer.roku.com/docs/references/scenegraph/layout-group-nodes/group.md). +1. Create a file in the [nodes directory](https://github.com/rokucommunity/brs/tree/master/src/brsTypes/nodes) called `.ts`. 1. Copy the following code and paste it into your new file: ``` import { FieldModel } from "./RoSGNode"; - import { AAMember } from "./RoAssociativeArray"; + import { AAMember } from "../components/RoAssociativeArray"; - export class extends { + export class extends { readonly defaultFields: FieldModel[] = [ // Add built-in fields here. // The fields can be found on the Roku docs. ]; - constructor(initializedFields: AAMember[] = [], readonly name: string = "") { + constructor(initializedFields: AAMember[] = [], readonly name: string = "") { super([], name); this.registerDefaultFields(this.defaultFields); @@ -25,10 +25,10 @@ This is aimed to be a quick guide for adding a component to `brs`. Note that thi } ``` -1. Replace all `` and `` from above with your component name. Add any built-in fields and/or class functions that the Roku docs specify. -1. Add a constructor definition to the [component factory](https://github.com/rokucommunity/brs/blob/main/src/brsTypes/components/ComponentFactory.ts). This will allow instances of your new component to be created dynamically when it is encountered in XML or BrightScript code. -1. Add a test case for your Typescript class in [the components test directory](https://github.com/rokucommunity/brs/tree/master/test/brsTypes/components). Use the existing component test files in that directory as a model for what your test should look like. +1. Replace all `` and `` from above with your node name. Add any built-in fields and/or class functions that the Roku docs specify. +1. Add a constructor definition to the [node factory](https://github.com/rokucommunity/brs/blob/main/src/brsTypes/nodes/NodeFactory.ts). This will allow instances of your new node to be created dynamically when it is encountered in XML or BrightScript code. +1. Add a test case for your Typescript class in [the nodes test directory](https://github.com/rokucommunity/brs/tree/master/test/brsTypes/nodes). Use the existing component test files in that directory as a model for what your test should look like. 1. Add an end-to-end test case. - - Create a file in [the end-to-end directory](https://github.com/rokucommunity/brs/tree/master/test/e2e) called `.brs`. In the file, write BrightScript code that exercises your component functionality. - - Add an XML file to the [the components test directory](https://github.com/rokucommunity/brs/tree/master/test/brsTypes/components) that uses your component. + - Create a file in [the end-to-end directory](https://github.com/rokucommunity/brs/tree/master/test/e2e) called `.brs`. In the file, write BrightScript code that exercises your node functionality. + - Add an XML file to the [the components test directory](https://github.com/rokucommunity/brs/tree/master/test/brsTypes/components) that uses your node. - Add a test block to [BrsComponents.test.js](https://github.com/rokucommunity/brs/blob/main/test/e2e/BrsComponents.test.js). In this block, verify that the code from your XML and Brightscript files is behaving as expected. diff --git a/src/brsTypes/Callable.ts b/src/brsTypes/Callable.ts index 0d235dd50..2fb469869 100644 --- a/src/brsTypes/Callable.ts +++ b/src/brsTypes/Callable.ts @@ -3,7 +3,7 @@ import * as Brs from "."; import * as Expr from "../parser/Expression"; import { Scope } from "../interpreter/Environment"; import { Location } from "../lexer"; -import { tryCoerce } from "./coercion"; +import { tryCoerce } from "./Coercion"; import { generateArgumentMismatchError } from "../interpreter/ArgumentMismatch"; /** An argument to a BrightScript `function` or `sub`. */ diff --git a/src/brsTypes/coercion.ts b/src/brsTypes/Coercion.ts similarity index 100% rename from src/brsTypes/coercion.ts rename to src/brsTypes/Coercion.ts diff --git a/src/brsTypes/components/BrsObjects.ts b/src/brsTypes/components/BrsObjects.ts index e17aad40e..b144c4da1 100644 --- a/src/brsTypes/components/BrsObjects.ts +++ b/src/brsTypes/components/BrsObjects.ts @@ -4,7 +4,7 @@ import { RoArray } from "./RoArray"; import { RoList } from "./RoList"; import { RoByteArray } from "./RoByteArray"; import { RoDateTime } from "./RoDateTime"; -import { Timespan } from "./Timespan"; +import { RoTimespan } from "./RoTimespan"; import { createNodeByType } from "./RoSGNode"; import { RoRegex } from "./RoRegex"; import { RoXMLElement } from "./RoXMLElement"; @@ -91,7 +91,7 @@ export const BrsObjects = new BrsObjectsMap([ ["roList", (_: Interpreter) => new RoList([])], ["roByteArray", (_: Interpreter) => new RoByteArray()], ["roDateTime", (_: Interpreter) => new RoDateTime()], - ["roTimespan", (_: Interpreter) => new Timespan()], + ["roTimespan", (_: Interpreter) => new RoTimespan()], ["roDeviceInfo", (_: Interpreter) => new RoDeviceInfo()], [ "roSGNode", diff --git a/src/brsTypes/components/RoSGNode.ts b/src/brsTypes/components/RoSGNode.ts index 072afa12e..af17bb1fd 100644 --- a/src/brsTypes/components/RoSGNode.ts +++ b/src/brsTypes/components/RoSGNode.ts @@ -21,7 +21,7 @@ import { RoAssociativeArray } from "./RoAssociativeArray"; import { RoArray } from "./RoArray"; import { AAMember } from "./RoAssociativeArray"; import { ComponentDefinition, ComponentNode } from "../../componentprocessor"; -import { ComponentFactory, BrsComponentName } from "./ComponentFactory"; +import { NodeFactory, BrsNodeType } from "../nodes/NodeFactory"; import { Environment } from "../../interpreter/Environment"; import { roInvalid } from "./RoInvalid"; import type * as MockNodeModule from "../../extensions/MockNode"; @@ -1757,10 +1757,10 @@ export function createNodeByType(interpreter: Interpreter, type: BrsString): RoS return new mock.MockNode(maybeMock, type.value); } - // If this is a built-in component, then return it. - let component = ComponentFactory.createComponent(type.value as BrsComponentName); - if (component) { - return component; + // If this is a built-in node component, then return it. + let node = NodeFactory.createComponent(type.value as BrsNodeType); + if (node) { + return node; } let typeDef = interpreter.environment.nodeDefMap.get(type.value.toLowerCase()); @@ -1783,11 +1783,8 @@ export function createNodeByType(interpreter: Interpreter, type: BrsString): RoS // Start from the "basemost" component of the tree. typeDef = typeDefStack.pop(); - // If this extends a built-in component, create it. - let node = ComponentFactory.createComponent( - typeDef!.extends as BrsComponentName, - type.value - ); + // If this extends a built-in node component, create it. + let node = NodeFactory.createComponent(typeDef!.extends as BrsNodeType, type.value); // Default to Node as parent. if (!node) { diff --git a/src/brsTypes/components/Timespan.ts b/src/brsTypes/components/RoTimespan.ts similarity index 97% rename from src/brsTypes/components/Timespan.ts rename to src/brsTypes/components/RoTimespan.ts index 3aae49e31..f83427559 100644 --- a/src/brsTypes/components/Timespan.ts +++ b/src/brsTypes/components/RoTimespan.ts @@ -8,7 +8,7 @@ import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import customParseFormat from "dayjs/plugin/customParseFormat"; -export class Timespan extends BrsComponent implements BrsValue { +export class RoTimespan extends BrsComponent implements BrsValue { readonly kind = ValueKind.Object; private markTime = Date.now(); diff --git a/src/brsTypes/index.ts b/src/brsTypes/index.ts index c4fb6ddcf..eb4da4b0c 100644 --- a/src/brsTypes/index.ts +++ b/src/brsTypes/index.ts @@ -34,13 +34,12 @@ export * from "./BrsInterface"; export * from "./Callable"; export * from "./components/BrsComponent"; export * from "./components/RoDeviceInfo"; -export * from "./components/ComponentFactory"; export * from "./components/RoArray"; export * from "./components/RoList"; export * from "./components/RoByteArray"; export * from "./components/RoDateTime"; export * from "./components/RoAssociativeArray"; -export * from "./components/Timespan"; +export * from "./components/RoTimespan"; export * from "./components/BrsObjects"; export * from "./components/RoRegex"; export * from "./components/RoXMLElement"; @@ -53,23 +52,24 @@ export * from "./components/RoLongInteger"; export * from "./components/RoInvalid"; export * from "./components/RoSGNodeEvent"; export * from "./components/RoSGNode"; -export * from "./components/Group"; -export * from "./components/Scene"; -export * from "./components/MiniKeyboard"; -export * from "./components/TextEditBox"; -export * from "./components/LayoutGroup"; -export * from "./components/Rectangle"; -export * from "./components/Label"; -export * from "./components/Font"; -export * from "./components/Poster"; -export * from "./components/ArrayGrid"; -export * from "./components/MarkupGrid"; -export * from "./components/ContentNode"; -export * from "./components/Timer"; export * from "./components/RoAppInfo"; export * from "./components/RoPath"; +export * from "./nodes/NodeFactory"; +export * from "./nodes/Group"; +export * from "./nodes/Scene"; +export * from "./nodes/MiniKeyboard"; +export * from "./nodes/TextEditBox"; +export * from "./nodes/LayoutGroup"; +export * from "./nodes/Rectangle"; +export * from "./nodes/Label"; +export * from "./nodes/Font"; +export * from "./nodes/Poster"; +export * from "./nodes/ArrayGrid"; +export * from "./nodes/MarkupGrid"; +export * from "./nodes/ContentNode"; +export * from "./nodes/Timer"; export * from "./Boxing"; -export * from "./coercion"; +export * from "./Coercion"; /** * Determines whether or not the given value is a number. diff --git a/src/brsTypes/components/ArrayGrid.ts b/src/brsTypes/nodes/ArrayGrid.ts similarity index 96% rename from src/brsTypes/components/ArrayGrid.ts rename to src/brsTypes/nodes/ArrayGrid.ts index 04c5eed72..a6f261a24 100644 --- a/src/brsTypes/components/ArrayGrid.ts +++ b/src/brsTypes/nodes/ArrayGrid.ts @@ -1,5 +1,5 @@ -import { FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; import { Group } from "./Group"; export class ArrayGrid extends Group { diff --git a/src/brsTypes/components/ContentNode.ts b/src/brsTypes/nodes/ContentNode.ts similarity index 98% rename from src/brsTypes/components/ContentNode.ts rename to src/brsTypes/nodes/ContentNode.ts index b8505dab8..be044789f 100644 --- a/src/brsTypes/components/ContentNode.ts +++ b/src/brsTypes/nodes/ContentNode.ts @@ -1,10 +1,10 @@ -import { FieldModel, Field, RoSGNode } from "./RoSGNode"; +import { FieldModel, Field, RoSGNode } from "../components/RoSGNode"; import { BrsType, toAssociativeArray } from ".."; import { ValueKind, BrsString, BrsBoolean } from "../BrsType"; import { Interpreter } from "../../interpreter"; import { Int32 } from "../Int32"; import { Callable, StdlibArgument } from "../Callable"; -import { RoArray } from "./RoArray"; +import { RoArray } from "../components/RoArray"; export class ContentNode extends RoSGNode { readonly defaultFields: FieldModel[] = [ diff --git a/src/brsTypes/components/Font.ts b/src/brsTypes/nodes/Font.ts similarity index 78% rename from src/brsTypes/components/Font.ts rename to src/brsTypes/nodes/Font.ts index 7d2971d72..61de3be9b 100644 --- a/src/brsTypes/components/Font.ts +++ b/src/brsTypes/nodes/Font.ts @@ -1,5 +1,5 @@ -import { RoSGNode, FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { RoSGNode, FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; export class Font extends RoSGNode { readonly defaultFields: FieldModel[] = [ diff --git a/src/brsTypes/components/Group.ts b/src/brsTypes/nodes/Group.ts similarity index 91% rename from src/brsTypes/components/Group.ts rename to src/brsTypes/nodes/Group.ts index 1e7c93e0e..342c10896 100644 --- a/src/brsTypes/components/Group.ts +++ b/src/brsTypes/nodes/Group.ts @@ -1,5 +1,5 @@ -import { RoSGNode, FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { RoSGNode, FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; export class Group extends RoSGNode { readonly defaultFields: FieldModel[] = [ diff --git a/src/brsTypes/components/Label.ts b/src/brsTypes/nodes/Label.ts similarity index 92% rename from src/brsTypes/components/Label.ts rename to src/brsTypes/nodes/Label.ts index 60d73ebfc..94267f76b 100644 --- a/src/brsTypes/components/Label.ts +++ b/src/brsTypes/nodes/Label.ts @@ -1,5 +1,5 @@ -import { FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; import { Group } from "./Group"; export class Label extends Group { diff --git a/src/brsTypes/components/LayoutGroup.ts b/src/brsTypes/nodes/LayoutGroup.ts similarity index 85% rename from src/brsTypes/components/LayoutGroup.ts rename to src/brsTypes/nodes/LayoutGroup.ts index a45030ce7..90cc2ba4e 100644 --- a/src/brsTypes/components/LayoutGroup.ts +++ b/src/brsTypes/nodes/LayoutGroup.ts @@ -1,5 +1,5 @@ -import { FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; import { Group } from "./Group"; export class LayoutGroup extends Group { diff --git a/src/brsTypes/components/MarkupGrid.ts b/src/brsTypes/nodes/MarkupGrid.ts similarity index 95% rename from src/brsTypes/components/MarkupGrid.ts rename to src/brsTypes/nodes/MarkupGrid.ts index 941fa0d6d..af4c4778e 100644 --- a/src/brsTypes/components/MarkupGrid.ts +++ b/src/brsTypes/nodes/MarkupGrid.ts @@ -1,5 +1,5 @@ -import { FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; import { ArrayGrid } from "./ArrayGrid"; export class MarkupGrid extends ArrayGrid { diff --git a/src/brsTypes/components/MiniKeyboard.ts b/src/brsTypes/nodes/MiniKeyboard.ts similarity index 90% rename from src/brsTypes/components/MiniKeyboard.ts rename to src/brsTypes/nodes/MiniKeyboard.ts index c8a0f3df1..57393318a 100644 --- a/src/brsTypes/components/MiniKeyboard.ts +++ b/src/brsTypes/nodes/MiniKeyboard.ts @@ -1,6 +1,6 @@ -import { FieldModel } from "./RoSGNode"; +import { FieldModel } from "../components/RoSGNode"; import { Group } from "./Group"; -import { AAMember } from "./RoAssociativeArray"; +import { AAMember } from "../components/RoAssociativeArray"; import { BrsString } from "../BrsType"; import { TextEditBox } from "./TextEditBox"; diff --git a/src/brsTypes/components/ComponentFactory.ts b/src/brsTypes/nodes/NodeFactory.ts similarity index 51% rename from src/brsTypes/components/ComponentFactory.ts rename to src/brsTypes/nodes/NodeFactory.ts index 29445a34f..f416dee65 100644 --- a/src/brsTypes/components/ComponentFactory.ts +++ b/src/brsTypes/nodes/NodeFactory.ts @@ -13,10 +13,9 @@ import { Scene, MiniKeyboard, TextEditBox, - BrsComponent, } from ".."; -export enum BrsComponentName { +export enum BrsNodeType { Node = "Node", Group = "Group", LayoutGroup = "LayoutGroup", @@ -34,61 +33,61 @@ export enum BrsComponentName { } // TODO: update with more components as they're implemented. -export class ComponentFactory { - private static additionalComponents = new Map RoSGNode>(); +export class NodeFactory { + private static additionalNodes = new Map RoSGNode>(); /** - * Adds additional components types to the factory, so other software can extend brs if necessary. + * Adds additional node/component types to the factory, so other software can extend brs if necessary. * This would allow other software using this to add other node/component types at runtime * For example, adding custom implementations of the built-in types, or * adding additional types (PinPad, BusySpinner, etc) that aren't here yet * * @static - * @param types Array of pairs of [componentTypeName, construction function], such that when a given componentType is requested, the construction function is called and returns one of those components + * @param types Array of pairs of [nodeTypeName, construction function], such that when a given nodeType is requested, the construction function is called and returns one of those components */ - public static addComponentTypes(types: [string, (name: string) => RoSGNode][]) { - types.forEach(([componentType, ctor]) => { - this.additionalComponents.set(componentType.toLowerCase(), ctor); + public static addNodeTypes(types: [string, (name: string) => RoSGNode][]) { + types.forEach(([nodeType, ctor]) => { + this.additionalNodes.set(nodeType.toLowerCase(), ctor); }); } public static createComponent( - componentType: BrsComponentName | string, - componentName?: string + nodeType: BrsNodeType | string, + nodeName?: string ): RoSGNode | undefined { - let name = componentName || componentType; - const additionalCtor = this.additionalComponents.get(componentType?.toLowerCase()); + let name = nodeName || nodeType; + const additionalCtor = this.additionalNodes.get(nodeType?.toLowerCase()); if (additionalCtor) { return additionalCtor(name); } - switch (componentType) { - case BrsComponentName.Group: + switch (nodeType) { + case BrsNodeType.Group: return new Group([], name); - case BrsComponentName.LayoutGroup: + case BrsNodeType.LayoutGroup: return new LayoutGroup([], name); - case BrsComponentName.Node: + case BrsNodeType.Node: return new RoSGNode([], name); - case BrsComponentName.Rectangle: + case BrsNodeType.Rectangle: return new Rectangle([], name); - case BrsComponentName.Label: + case BrsNodeType.Label: return new Label([], name); - case BrsComponentName.Font: + case BrsNodeType.Font: return new Font([], name); - case BrsComponentName.Poster: + case BrsNodeType.Poster: return new Poster([], name); - case BrsComponentName.ArrayGrid: + case BrsNodeType.ArrayGrid: return new ArrayGrid([], name); - case BrsComponentName.MarkupGrid: + case BrsNodeType.MarkupGrid: return new MarkupGrid([], name); - case BrsComponentName.ContentNode: + case BrsNodeType.ContentNode: return new ContentNode(name); - case BrsComponentName.Timer: + case BrsNodeType.Timer: return new Timer([], name); - case BrsComponentName.Scene: + case BrsNodeType.Scene: return new Scene([], name); - case BrsComponentName.MiniKeyboard: + case BrsNodeType.MiniKeyboard: return new MiniKeyboard([], name); - case BrsComponentName.TextEditBox: + case BrsNodeType.TextEditBox: return new TextEditBox([], name); default: return; @@ -96,17 +95,14 @@ export class ComponentFactory { } /** - * Checks to see if the given component type can be resolved by the Factory + * Checks to see if the given node type can be resolved by the Factory * That is, if it is a built in type or has been added at run time. * * @static - * @param componentType The name of component to resolve + * @param nodeType The name of node to resolve * @returns {boolean} true if that type is resolvable/constructable, false otherwise */ - public static canResolveComponentType(componentType: BrsComponentName | string): boolean { - return ( - this.additionalComponents.has(componentType?.toLowerCase()) || - componentType in BrsComponentName - ); + public static canResolveComponentType(nodeType: BrsNodeType | string): boolean { + return this.additionalNodes.has(nodeType?.toLowerCase()) || nodeType in BrsNodeType; } } diff --git a/src/brsTypes/components/Poster.ts b/src/brsTypes/nodes/Poster.ts similarity index 92% rename from src/brsTypes/components/Poster.ts rename to src/brsTypes/nodes/Poster.ts index 58a001c02..1622de230 100644 --- a/src/brsTypes/components/Poster.ts +++ b/src/brsTypes/nodes/Poster.ts @@ -1,5 +1,5 @@ -import { FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; import { Group } from "./Group"; export class Poster extends Group { diff --git a/src/brsTypes/components/Rectangle.ts b/src/brsTypes/nodes/Rectangle.ts similarity index 84% rename from src/brsTypes/components/Rectangle.ts rename to src/brsTypes/nodes/Rectangle.ts index 80451a4f7..847efc8a3 100644 --- a/src/brsTypes/components/Rectangle.ts +++ b/src/brsTypes/nodes/Rectangle.ts @@ -1,5 +1,5 @@ -import { FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; import { Group } from "./Group"; export class Rectangle extends Group { diff --git a/src/brsTypes/components/Scene.ts b/src/brsTypes/nodes/Scene.ts similarity index 85% rename from src/brsTypes/components/Scene.ts rename to src/brsTypes/nodes/Scene.ts index f36039bfa..1cd6b5ebf 100644 --- a/src/brsTypes/components/Scene.ts +++ b/src/brsTypes/nodes/Scene.ts @@ -1,6 +1,6 @@ -import { FieldModel } from "./RoSGNode"; +import { FieldModel } from "../components/RoSGNode"; import { Group } from "./Group"; -import { AAMember } from "./RoAssociativeArray"; +import { AAMember } from "../components/RoAssociativeArray"; export class Scene extends Group { readonly defaultFields: FieldModel[] = [ diff --git a/src/brsTypes/components/TextEditBox.ts b/src/brsTypes/nodes/TextEditBox.ts similarity index 89% rename from src/brsTypes/components/TextEditBox.ts rename to src/brsTypes/nodes/TextEditBox.ts index af6323689..589483b07 100644 --- a/src/brsTypes/components/TextEditBox.ts +++ b/src/brsTypes/nodes/TextEditBox.ts @@ -1,6 +1,6 @@ -import { FieldModel } from "./RoSGNode"; +import { FieldModel } from "../components/RoSGNode"; import { Group } from "./Group"; -import { AAMember } from "./RoAssociativeArray"; +import { AAMember } from "../components/RoAssociativeArray"; export class TextEditBox extends Group { readonly defaultFields: FieldModel[] = [ diff --git a/src/brsTypes/components/Timer.ts b/src/brsTypes/nodes/Timer.ts similarity index 79% rename from src/brsTypes/components/Timer.ts rename to src/brsTypes/nodes/Timer.ts index 25b9886c2..aa0df66af 100644 --- a/src/brsTypes/components/Timer.ts +++ b/src/brsTypes/nodes/Timer.ts @@ -1,5 +1,5 @@ -import { RoSGNode, FieldModel } from "./RoSGNode"; -import { AAMember } from "./RoAssociativeArray"; +import { RoSGNode, FieldModel } from "../components/RoSGNode"; +import { AAMember } from "../components/RoAssociativeArray"; export class Timer extends RoSGNode { readonly defaultFields: FieldModel[] = [ diff --git a/src/parser/ComponentScopeResolver.ts b/src/parser/ComponentScopeResolver.ts index 66bd1214d..c498a5f95 100644 --- a/src/parser/ComponentScopeResolver.ts +++ b/src/parser/ComponentScopeResolver.ts @@ -1,7 +1,7 @@ import { ComponentDefinition, ComponentScript } from "../componentprocessor"; import * as Stmt from "./Statement"; import pSettle from "p-settle"; -import { ComponentFactory } from "../brsTypes"; +import { NodeFactory } from "../brsTypes"; export class ComponentScopeResolver { private readonly excludedNames: string[] = ["init"]; @@ -76,8 +76,8 @@ export class ComponentScopeResolver { let currentComponent: ComponentDefinition | undefined = component; while (currentComponent.extends) { - // If this is a built-in component, then no work is needed and we can return. - if (ComponentFactory.canResolveComponentType(currentComponent.extends)) { + // If this is a built-in node component, then no work is needed and we can return. + if (NodeFactory.canResolveComponentType(currentComponent.extends)) { return Promise.resolve(); } diff --git a/test/brsTypes/components/RoTimespan.test.js b/test/brsTypes/components/RoTimespan.test.js index 878cd3c78..4ce1bebb6 100644 --- a/test/brsTypes/components/RoTimespan.test.js +++ b/test/brsTypes/components/RoTimespan.test.js @@ -1,5 +1,5 @@ const brs = require("../../../lib"); -const { Timespan, Int32, BrsString, BrsInvalid } = brs.types; +const { RoTimespan, Int32, BrsString, BrsInvalid } = brs.types; const { Interpreter } = require("../../../lib/interpreter"); const lolex = require("lolex"); @@ -9,7 +9,7 @@ describe("Timespan", () => { beforeEach(() => { clock = lolex.install({ now: 1547072370937 }); - ts = new Timespan(); + ts = new RoTimespan(); }); afterAll(() => { diff --git a/test/brsTypes/components/ArrayGrid.test.js b/test/brsTypes/nodes/ArrayGrid.test.js similarity index 100% rename from test/brsTypes/components/ArrayGrid.test.js rename to test/brsTypes/nodes/ArrayGrid.test.js diff --git a/test/brsTypes/components/ContentNode.test.js b/test/brsTypes/nodes/ContentNode.test.js similarity index 100% rename from test/brsTypes/components/ContentNode.test.js rename to test/brsTypes/nodes/ContentNode.test.js diff --git a/test/brsTypes/components/Font.test.js b/test/brsTypes/nodes/Font.test.js similarity index 100% rename from test/brsTypes/components/Font.test.js rename to test/brsTypes/nodes/Font.test.js diff --git a/test/brsTypes/components/Group.test.js b/test/brsTypes/nodes/Group.test.js similarity index 100% rename from test/brsTypes/components/Group.test.js rename to test/brsTypes/nodes/Group.test.js diff --git a/test/brsTypes/components/Label.test.js b/test/brsTypes/nodes/Label.test.js similarity index 100% rename from test/brsTypes/components/Label.test.js rename to test/brsTypes/nodes/Label.test.js diff --git a/test/brsTypes/components/LayoutGroup.test.js b/test/brsTypes/nodes/LayoutGroup.test.js similarity index 100% rename from test/brsTypes/components/LayoutGroup.test.js rename to test/brsTypes/nodes/LayoutGroup.test.js diff --git a/test/brsTypes/components/MarkupGrid.test.js b/test/brsTypes/nodes/MarkupGrid.test.js similarity index 100% rename from test/brsTypes/components/MarkupGrid.test.js rename to test/brsTypes/nodes/MarkupGrid.test.js diff --git a/test/brsTypes/components/MiniKeyboard.test.js b/test/brsTypes/nodes/MiniKeyboard.test.js similarity index 100% rename from test/brsTypes/components/MiniKeyboard.test.js rename to test/brsTypes/nodes/MiniKeyboard.test.js diff --git a/test/brsTypes/components/ComponentFactory.test.js b/test/brsTypes/nodes/NodeFactory.test.js similarity index 62% rename from test/brsTypes/components/ComponentFactory.test.js rename to test/brsTypes/nodes/NodeFactory.test.js index dc2fd1534..c7f092761 100644 --- a/test/brsTypes/components/ComponentFactory.test.js +++ b/test/brsTypes/nodes/NodeFactory.test.js @@ -1,18 +1,18 @@ const brs = require("../../../lib"); -const { ComponentFactory, RoSGNode, Callable, ValueKind } = brs.types; +const { NodeFactory, RoSGNode, Callable, ValueKind } = brs.types; -describe("ComponentFactory", () => { +describe("NodeFactory", () => { describe("createComponent", () => { it("returns a properly constructed built in Node with default name", () => { - const component = ComponentFactory.createComponent("Rectangle"); - expect(component.nodeSubtype).toBe("Rectangle"); - expect(component.name).toBe("Rectangle"); - expect(component.constructor.name).toBe("Rectangle"); + const node = NodeFactory.createComponent("Rectangle"); + expect(node.nodeSubtype).toBe("Rectangle"); + expect(node.name).toBe("Rectangle"); + expect(node.constructor.name).toBe("Rectangle"); }); it("returns a properly constructed built in Node with custom name", () => { - const component = ComponentFactory.createComponent("Poster", "Foo"); - expect(component.nodeSubtype).toBe("Foo"); - expect(component.constructor.name).toBe("Poster"); + const node = NodeFactory.createComponent("Poster", "Foo"); + expect(node.nodeSubtype).toBe("Foo"); + expect(node.constructor.name).toBe("Poster"); }); }); @@ -42,7 +42,7 @@ describe("ComponentFactory", () => { } it("adds a new Component to be constructed", () => { - ComponentFactory.addComponentTypes([ + NodeFactory.addNodeTypes([ [ "Foo", (name) => { @@ -50,10 +50,10 @@ describe("ComponentFactory", () => { }, ], ]); - const component = ComponentFactory.createComponent("Foo"); - expect(component.nodeSubtype).toBe("Foo"); - expect(component.name).toBe("Foo"); - expect(component.constructor.name).toBe("Foo"); + const node = NodeFactory.createComponent("Foo"); + expect(node.nodeSubtype).toBe("Foo"); + expect(node.name).toBe("Foo"); + expect(node.constructor.name).toBe("Foo"); }); }); }); diff --git a/test/brsTypes/components/Poster.test.js b/test/brsTypes/nodes/Poster.test.js similarity index 100% rename from test/brsTypes/components/Poster.test.js rename to test/brsTypes/nodes/Poster.test.js diff --git a/test/brsTypes/components/Rectangle.test.js b/test/brsTypes/nodes/Rectangle.test.js similarity index 100% rename from test/brsTypes/components/Rectangle.test.js rename to test/brsTypes/nodes/Rectangle.test.js diff --git a/test/brsTypes/components/Scene.test.js b/test/brsTypes/nodes/Scene.test.js similarity index 100% rename from test/brsTypes/components/Scene.test.js rename to test/brsTypes/nodes/Scene.test.js diff --git a/test/brsTypes/components/TextEditBox.test.js b/test/brsTypes/nodes/TextEditBox.test.js similarity index 100% rename from test/brsTypes/components/TextEditBox.test.js rename to test/brsTypes/nodes/TextEditBox.test.js diff --git a/test/brsTypes/components/Timer.test.js b/test/brsTypes/nodes/Timer.test.js similarity index 100% rename from test/brsTypes/components/Timer.test.js rename to test/brsTypes/nodes/Timer.test.js diff --git a/test/e2e/CustomComponents.test.js b/test/e2e/CustomComponents.test.js index 3dc3d8eb0..be5574ba1 100644 --- a/test/e2e/CustomComponents.test.js +++ b/test/e2e/CustomComponents.test.js @@ -33,7 +33,7 @@ describe("Extending custom components", () => { let outputStreams; beforeAll(() => { - brs.types.ComponentFactory.addComponentTypes([["Foo", (name) => new Foo([], name)]]); + brs.types.NodeFactory.addNodeTypes([["Foo", (name) => new Foo([], name)]]); brs.types.extendBrsObjects([["Foo", (_interpreter) => new Foo()]]); outputStreams = createMockStreams();