# JavaScript Coding Conventions ## Overview This document provides guidelines for code formatting to developers contributing to SilverStripe. It applies to all JavaScript files in the `framework/` and `cms/` modules. In 2016, SilverStripe started a rewrite of its CMS interface in [ES6](https://en.wikipedia.org/wiki/ECMAScript) and [ReactJS](http://facebook.github.io/react/). Code written prior to this rewrite might not follow these conventions, and is placed in a `legacy/` folder structure. ## NPM Packages SilverStripe authored npm dependencies are posted under the [silverstripe npm](https://www.npmjs.com/org/silverstripe) organisation. ## Browser support Check our [requirements](/getting_started/server_requirements) documentation. ## Conventions We follow the [AirBnB JavaScript Conventions](https://github.com/airbnb/javascript), as well as the [AirBnB React Conventions](https://github.com/airbnb/javascript/tree/master/react). A lot of their rules can be validated via [ESLint](http://eslint.org/), and can be checked locally via `yarn run lint`. ## Spelling All symbols and documentation should use UK-English spelling (e.g. "behaviour" instead of "behavior"), except when necessitated by third party conventions (e.g using "color" for CSS styles). ## File and Folder Naming - All frontend files (CSS, JavaScript, images) should be placed in a `client/` folder on the top level of the module - Frontend files relating to the `framework` CMS UI should be placed in `admin/client` - File names should follow the [AirBnB Naming Conventions](https://github.com/airbnb/javascript#naming-conventions) - The `client/src/components` folder should contain only React [presentational components](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.r635clean). These components should be self-contained, and shouldn't know about Redux state. - The `client/src/containers` folder should contain only React [container components](https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0#.r635clean) - React classes in `client/src/components` and `client/src/containers` should have one folder per component, alongside a `README.md` and SCSS files where applicable. - The `client/src/state` folder should contain [Redux](http://redux.js.org/) actions, action types and reducers. Each set of these should be kept in a folder named the same as its [reducer state key](http://redux.js.org/docs/basics/Reducers.html). - JavaScript tests should be named after the module/class they're testing, with their file name suffixed with `-tests.js`. - JavaScript tests should be placed in a `tests/` subfolder alongside the module code. ## Related * [PHP Coding Conventions](/contributing/php_coding_conventions) * [CSS Coding Conventions](/contributing/css_coding_conventions)