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 lintis free of warnings and errors - make sure your branch is free of merge conflicts
- Follow the
tslintrules (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
privateby default,protectedorpubliconly 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-lintrules (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 Buttonclass ToggleButton extends Buttonclass PlaybackToggleButton extends ToggleButtonclass 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
.tsand optionally.scssfile 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
Configsuffix:Button=>ButtonConfig - Inherited config interface:
PlaybackToggleButtonuses 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 multipleSettingsPanelItemsubcomponents
- 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:
SettingsPanelcan use the typesButton(generic framework component) andSettingsPanelItem(subcomponent), but notWatermark(SettingsPanelwould break ifWatermarkwas removed)
- Example:
- Exported components must be registered into the global namespace in
main.tsto make the accessible in JavaScript