Reddit Enhancement Suite (RES) is a suite of modules that enhances your Reddit browsing experience.
For general documentation, visit the Reddit Enhancement Suite Wiki.
Hi there! Thanks for checking out RES on GitHub. A few important notes:
-
RES is licensed under GPLv3, which means you're technically free to do whatever you wish in terms of redistribution as long as you maintain GPLv3 licensing. However, I ask out of courtesy that should you choose to release your own, separate distribution of RES, you please name it something else entirely. Unfortunately, I have run into problems in the past with people redistributing under the same name, and causing me tech support headaches.
-
I ask that you please do not distribute your own binaries of RES (e.g. with bugfixes, etc). The version numbers in RES are important references for tech support so that we can replicate bugs that users report using the same version they are, and when you distribute your own - you run the risk of polluting/confusing that. In addition, if a user overwrites his/her extension with your distributed copy, it may not properly retain their RES settings/data depending on the developer ID used, etc.
I can't stop you from doing any of this. I'm just asking out of courtesy because I already spend a great deal of time providing tech support and chasing down bugs, and it's much harder when people think I'm the support guy for a separate branch of code.
Thanks!
Steve Sobel steve@honestbleeps.com
Thinking about contributing to RES? Awesome! We just ask that you follow a few simple guidelines:
-
RES has grown quite large, so we do have to pick and choose what features we should add. Code bloat is always a concern, and RES is already rather hefty. If you're unsure if your feature would appeal to a wide audience, please post about it on /r/Enhancement or contact @honestbleeps directly to ask.
-
There are a few features we have made a conscious choice not to add to RES, so make sure whatever you'd like to contribute isn't on that list.
-
It would be greatly appreciated if you could stick to a few style guidelines:
- please use tabs for indentation
- please use spaces in your
if
statements, e.g.if (foo === bar)
, notif(foo===bar)
- please use single quotes
'
and not double quotes"
for strings - please comment your code!
- please consider using
npm run lint
(see below) to verify your code style
- If you're adding new modules or hosts, see below.
.github/
: Github templatesbuild/
: Files handling automated browser deploymentschangelog/
: Release changelogschrome/
: Chrome-specific RES filesdist/
: build outputedge/
: Microsoft Edge-specific RES filesexamples/
: example code for new hosts/modulesfirefox/
: Firefox-specific RES filesimages/
: Images for RES logo and CSS iconslib/
: all RES codelib/core/
: core RES codelib/css/
: RES csslib/environment/
: RES environment codelib/images/
: RES imageslib/modules/
: RES moduleslib/templates/
: RES templateslib/utils/
: RES utilitieslib/vendor/
: RES vendor librarieslocales
: RES i18n translationsnode/
: Node filessafari/
: Safari-specific RES filestests/
: integration testsutils/
: Misc RES utilitiesCHANGELOG.md
: self-explanatoryREADME.md
: YOU ARE HERE, unless you're browsing on GitHubpackage.json
: package info, dependencieswebpack.config.babel.js
: build script**/__tests__
: unit tests
background.entry.js
: the "background page" for RES, necessary for Chrome extensionsenvironment.js
: specific environment settings for Chromemanifest.json
: the project manifestoptions.html
: options page for chrome extensions
edge.entry.js
: shim to allow chrome extension code usageenvironment.js
: Edge-specific overrides of the Chrome environmentmanifest.json
: the project manifest
background.entry.js
: the "background page" for RES, necessary for Firefox extensionsenvironment.js
: specific environment settings for Firefoxpackage.json
: the project manifest for the Firefox add-on
Info.plist
: the project manifestbackground-safari.html
: the "background html page" for RES, necessary for Safari extensionsbackground.entry.js
: the "background page" for RES, necessary for Safari extensionsenvironment.js
: specific environment settings for Safari
First time installation:
- Install git.
- Install node.js (version >= 6).
- Install Python 2 (not version 3). On Windows, please install the "Add python.exe to path" feature on the customize screen.
- Navigate to your RES folder.
- Run
npm install
.
Once done, you can build the extension by running npm start
. This will also start a watch task that will rebuild RES when you make changes (see Advanced Usage for more details).
To load the extension into your browser, see the sections below.
npm start [-- <browsers>]
will clean dist/
, then build RES (dev mode), and start a watch task that will rebuild RES when you make changes. Only changed files will be rebuilt.
npm run once [-- <browsers>]
will clean dist/
, then build RES (dev mode) a single time.
npm run build [-- <browsers>]
will clean dist/
, then build RES (release mode). Each build output will be compressed to a .zip file in dist/zip/
.
<browsers>
is a comma-separated list of browsers to target, e.g. chrome,firefox,safari,node
. all
will build all targets. By default, chrome
will be targeted.
npm run lint
will verify the code style (and point out any errors) of all .js
files in lib/
(except lib/vendor/
) using ESLint, as well as all .scss
files with sass-lint.
npm run lint-fix
will autofix any fixable lint issues.
npm run flow
will run Flow type checking, and start the Flow server so future runs will complete faster. Use npm run flow -- stop
to stop the server, or npm run flow -- check
to run Flow once without starting the server.
npm test
will run unit tests (in __tests__
directories) using Ava.
npm run test-integration -- <browsers>
will run integration tests (in tests/
) using Nightwatch.js.
Currently just chrome
and firefox
can be targeted.
To run integration tests locally, you must change selenium_host
, selenium_port
, username
, and access_key
in nightwatch.conf.js
to correspond to your Selenium server.
- Go to
Menu->Tools->Extensions
and tick theDeveloper Mode
checkbox - Choose
Load unpacked extension
and point it to the/dist/chrome
folder (not the/chrome
folder). Make sure you only have one RES version running at a time. - Any time you make changes to the script, you must go back to the
Menu->Tools->Extensions
page andReload
the extension.
- Go to
about:flags
and tick theEnable extension developer features
checkbox. - Choose
Load extension
on the extensions menu and select the/dist/edge
folder (not the/edge
folder). - Any time you make changes to the extension, you must go back to the
Menu->Extensions
page, go to the extensions settings andReload
the extension.
- Install jpm using
npm
:npm install -g jpm
- Navigate to the
/dist/firefox
folder (not the/firefox
folder) and run the commandjpm run
, which should launch a new Firefox browser using a temporary profile with only RES installed.
- Open the
Preferences
by going toSafari->Preferences
or pressing⌘,
, then go toAdvanced
and check the checkbox forShow Develop menu in menu bar
. - Navigate to
Develop->Show Extension Builder
to open the extensions builder. Add a new extension by pressing the+
in the bottom left and choosingAdd Extension
. - Navigate to the
/dist/RES.safariextension
folder (not the/safari
folder) for RES and select it. - If you are using Safari 9+, you should be able to install the extension without enrolling in the Apple Developer Program; however, the extension will be auto-uninstalled when you quit Safari.
If you use an older version of Safari or find the auto-uninstall annoying, you need to purchase a proper certificate by signing up for the Apple Developer Program (currently $99/yr).
In addition to building your own version of RES, you can download older (or current) builds of RES for testing purposes.
(Almost) every commit to master is quickly archived away at http://allthefoxes.me; if you would like access to this database, please contact /u/allthefoxes on reddit or email fox@allthefoxes.me.
All that is asked is that you have at least one previous contribution to RES.
See examples/module.js
for an example.
Create a new .js
file in lib/modules
.
It will automatically be loaded when the build script is restarted.
All modules must now have i18n implementations. Please see here for details.
Please be sure that they support CORS so the sites do not need to be added as additional permissions, which has caused headaches in the past.
See examples/host.js
for an example.
Create a new .js
file in lib/modules/hosts
.
It will automatically be loaded when the build script is restarted.
Create a new Sass partial under lib/css/modules/
(with a leading underscore, e.g. _myPartial.scss
).
Import the file in lib/css/res.scss
(i.e. @import 'modules/myPartial';
—do not include the underscore or file extension).
Body classes will be automatically added for boolean and enum options with the property bodyClass: true
, in the form .res-moduleId-optionKey
for boolean options (only when they're enabled), and .res-moduleId-optionKey-optionValue
for enums.
This is the preferred way to create optional CSS; do not use addCSS()
unless absolutely necessary (i.e. variable color, size, etc.).