With bugs and problems, please try to describe the issue as detailed as possible to help us reproduce it. Don't forget to add the affected versions of the player (bitmovin.player.version
or playerInstance.version
) and UI (bitmovin.playerui.version
).
This project applies the GitFlow branching model. Please submit bugfix pull requests against the master
branch if they concern the current release, else against the develop
branch. Feature branches always go against the develop
branch.
Before creating a pull request, please
- make sure all guidelines are followed
- add an appropriate entry to the CHANGELOG
- make sure that
gulp lint
is free of warnings and errors - make sure your branch is free of merge conflicts
- Follow the
tslint
rules (gulp lint-ts
) - Put single(!) blank lines between functions, classes, interfaces, etc...
- Always add return values to functions (even if
void
) - No unused imports
- Class functions should be
private
by default,protected
orpublic
only when explicitly necessary (e.g. they are actually used from somewhere else) or where it strongly makes sense- A public method makes sense if it relates to core functionality of a component, e.g.
getText()
/setText(text)
on aLabel
(the label's purpose is to display text, so it makes sense to be accessible from outside) - A public method does not make sense if the function
doSomeMagicWhichNobodyUnderstands()
does specific things that are needed for the component to do what it does (e.g.renderText()
in a label which should be implicitly called bysetText(text)
but never explicitly from outside)
- A public method makes sense if it relates to core functionality of a component, e.g.
- Public functions should be documented with a description that explains what it does
- Every code block that does not obviously explain itself should be commented with an explanation of why and what it does
- Follow the
sass-lint
rules (gulp lint-sass
) - Browser specific hacks must be commented with an explanation why it is required and what it does
- Components are named in PascalCase and should be suffixed with their parent component's name
- Excluded from this rule are (a) direct children of base components (
Component
,Container
) and (b) components with extremely specialized functionality that do not conceptually extend the base class - Examples:
class CloseButton extends Button
class ToggleButton extends Button
class PlaybackToggleButton extends ToggleButton
class ButtonComponent extends Component
=>class Button extends Component
(exception (a))class ControlBarContainer extends Container
=>class ControlBar extends Container
(exception (a))class WatermarkClickOverlay extends ClickOverlay
=>class Watermark extends ClickOverlay
(exception (b))
- Excluded from this rule are (a) direct children of base components (
- Every component gets its own
.ts
and optionally.scss
file named after the component in lowercase- Example:
class CloseButton
=>closebutton.ts
,_closebutton.scss
- Example:
- Components always have a configuration interface that is either inherited from the parent or specifically defined for the component
- Specific config interfaces are named after the component plus
Config
suffix:Button
=>ButtonConfig
- Inherited config interface:
PlaybackToggleButton
uses the parent'sPlaybackToggleButtonConfig
- Config objects are only used from configuration from the outside and default configuration within the constructor
- Config objects must not be used to store internal state
- Specific config interfaces are named after the component plus
- Subcomponents can be defined in the same file as the main component
- A component is a subcomponent of a main component if the main component requires the subcomponent to fulfil its purpose and if the subcomponent is only used by the main component and no other
- Example:
SettingsPanel
(main component) consists of multipleSettingsPanelItem
subcomponents
- Components must not have any explicit relations with other components except generic framework components and subcomponents and must be useable independently of other components
- Example:
SettingsPanel
can use the typesButton
(generic framework component) andSettingsPanelItem
(subcomponent), but notWatermark
(SettingsPanel
would break ifWatermark
was removed)
- Example:
- Exported components must be registered into the global namespace in
main.ts
to make the accessible in JavaScript