├── .nvmrc ├── scripts ├── copyFiles ├── test.js ├── start.js └── build.js ├── public ├── robots.txt ├── favicon.ico ├── manifest.json └── index.html ├── src ├── views │ ├── comments.graphql │ ├── bugs.graphql │ ├── githubInfo.graphql │ └── Projects │ │ └── index.jsx ├── data │ ├── cargo.yaml │ ├── clippy.yaml │ ├── rust-analyser.yaml │ ├── servo.yaml │ ├── machine-learning.yml │ ├── rust.yaml │ ├── webdevelopmenttools.yaml │ ├── rust-cookbook.yaml │ ├── bugbot.yml │ ├── rust-bindgen.yaml │ ├── applicationservices.yaml │ ├── rustfmt.yaml │ ├── ff-build.yaml │ ├── a11y.yaml │ ├── loader.js │ ├── gfx.yaml │ ├── mozillavpn.yaml │ ├── mozregression.yaml │ ├── ff-infra.yaml │ ├── sumo.yaml │ ├── thunderbird.yaml │ ├── firefox-sync.yaml │ ├── common-voice.yaml │ ├── thunderbird-android.yaml │ ├── automation.yaml │ ├── webextensions.yaml │ ├── webcompat.yaml │ ├── bugzilla.yaml │ ├── internals.yaml │ ├── seamonkey.yaml │ ├── searchfox.yaml │ ├── firefox-frontend.yaml │ ├── multi-account-containers.yaml │ ├── mdn.yaml │ ├── firefox-ios.yml │ ├── pontoon.yaml │ ├── fenix.yaml │ ├── treeherder.yaml │ ├── webplatform.yaml │ ├── spidermonkey.yaml │ ├── firefox-focus.yaml │ ├── data.yaml │ ├── addons.yaml │ ├── taskcluster.yaml │ ├── releng.yaml │ └── firefox-devtools.yaml ├── utils │ ├── assignmentFilters.js │ ├── isStringEqualIgnoreCase.js │ ├── extractWhiteboardTags.js │ ├── sort.js │ ├── extractWhiteboardTags.test.js │ └── constants.js ├── index.jsx ├── setupTests.js ├── images │ ├── projectIcons │ │ ├── pontoon.svg │ │ ├── mdn.svg │ │ ├── webextensions.svg │ │ ├── mozillavpn.svg │ │ ├── rust.svg │ │ ├── servo.svg │ │ ├── multi-account-containers.svg │ │ ├── spidermonkey.svg │ │ ├── taskcluster.svg │ │ ├── webcompat.svg │ │ └── thunderbird.svg │ └── icons.test.js ├── index.css ├── App │ ├── routes.jsx │ └── index.jsx ├── components │ ├── Sidebar │ │ ├── KotlinIcon.jsx │ │ ├── HtmlIcon.jsx │ │ ├── JavaIcon.jsx │ │ ├── GoIcon.jsx │ │ ├── index.jsx │ │ ├── RustIcon.jsx │ │ └── PerlIcon.jsx │ ├── Spinner │ │ └── index.jsx │ ├── AppBar │ │ └── index.jsx │ ├── FontStager │ │ ├── index.jsx │ │ └── index.css │ ├── ErrorPanel │ │ ├── ErrorBox.jsx │ │ └── index.jsx │ ├── SearchBox │ │ └── index.jsx │ ├── DataTable │ │ └── index.jsx │ ├── ProjectIntroductionCard │ │ └── index.jsx │ ├── ProjectCard │ │ └── index.jsx │ └── Dashboard │ │ └── index.jsx ├── fragmentTypes.json ├── App.css ├── logo.svg └── theme.jsx ├── codetribute-data-flow.png ├── .gitignore ├── config ├── jest │ ├── cssTransform.js │ ├── babelTransform.js │ └── fileTransform.js ├── pnpTs.js ├── getHttpsConfig.js ├── paths.js ├── modules.js ├── env.js └── webpackDevServer.config.js ├── renovate.json ├── contribute.json ├── netlify.toml ├── .taskcluster.yml ├── .github └── workflows │ └── codeql-analysis.yml ├── package.json └── README.md /.nvmrc: -------------------------------------------------------------------------------- 1 | lts/gallium 2 | -------------------------------------------------------------------------------- /scripts/copyFiles: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | cp contribute.json build 4 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-frontend-infra/codetribute/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /src/views/comments.graphql: -------------------------------------------------------------------------------- 1 | query comments($id: Int!){ 2 | comments(id: $id){ 3 | text 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /codetribute-data-flow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mozilla-frontend-infra/codetribute/HEAD/codetribute-data-flow.png -------------------------------------------------------------------------------- /src/data/cargo.yaml: -------------------------------------------------------------------------------- 1 | name: Cargo 2 | summary: Cargo is Rust's build system 3 | icon: ship 4 | repositories: 5 | - rust-lang/cargo: E-Easy 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | *.swp 4 | .idea/ 5 | *.log 6 | .Rhistory 7 | .env 8 | .eslintcache 9 | .DS_Store 10 | TODO.txt 11 | -------------------------------------------------------------------------------- /src/utils/assignmentFilters.js: -------------------------------------------------------------------------------- 1 | export const unassigned = ({ assignee }) => assignee === '-'; 2 | export const assigned = ({ assignee }) => assignee !== '-'; 3 | -------------------------------------------------------------------------------- /src/data/clippy.yaml: -------------------------------------------------------------------------------- 1 | name: Clippy 2 | summary: Clippy is linter for Rust code 3 | icon: clippy 4 | repositories: 5 | - rust-lang/rust-clippy: good first issue 6 | -------------------------------------------------------------------------------- /src/data/rust-analyser.yaml: -------------------------------------------------------------------------------- 1 | name: Rust Analyser 2 | summary: A Rust compiler front-end for IDEs 3 | icon: server 4 | repositories: 5 | - rust-lang/rust-analyser: good first issue 6 | -------------------------------------------------------------------------------- /src/index.jsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client'; 2 | import App from './App'; 3 | 4 | const root = createRoot(document.getElementById('root')); 5 | root.render(); 6 | -------------------------------------------------------------------------------- /src/data/servo.yaml: -------------------------------------------------------------------------------- 1 | name: Servo 2 | summary: Servo is a modern, high-performance browser engine designed for both application and embedded use. 3 | repositories: 4 | - servo/servo: E-easy 5 | -------------------------------------------------------------------------------- /src/data/machine-learning.yml: -------------------------------------------------------------------------------- 1 | name: Machine Learning 2 | summary: Tools, libraries and projects about or using machine learning. 3 | icon: wrench 4 | repositories: 5 | - mozilla/bugbug: good-first-bug 6 | -------------------------------------------------------------------------------- /src/data/rust.yaml: -------------------------------------------------------------------------------- 1 | name: Rust 2 | summary: Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. 3 | repositories: 4 | - rust-lang/rust: E-easy 5 | -------------------------------------------------------------------------------- /src/data/webdevelopmenttools.yaml: -------------------------------------------------------------------------------- 1 | name: Web Development Tools 2 | summary: Tools and libraries for backend and frontend web development. 3 | icon: wrench 4 | repositories: 5 | - web-push-libs/web-push: good-first-bug 6 | -------------------------------------------------------------------------------- /src/data/rust-cookbook.yaml: -------------------------------------------------------------------------------- 1 | name: The Rust Cookbook 2 | summary: Work on bite-sized examples to get folks cooking with Rust 3 | icon: book-open-page-variant 4 | repositories: 5 | - rust-lang-nursery/rust-cookbook: easy 6 | -------------------------------------------------------------------------------- /src/data/bugbot.yml: -------------------------------------------------------------------------------- 1 | name: BugBot 2 | summary: | 3 | A Mozilla release management tool to send reminders to Firefox developers and 4 | improve Bugzilla metadata 5 | icon: robot 6 | repositories: 7 | - mozilla/bugbot: good-first-bug 8 | -------------------------------------------------------------------------------- /src/utils/isStringEqualIgnoreCase.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Return true if two string is equal, case insensitive. 3 | */ 4 | 5 | const isStringEqualIgnoreCase = (a, b) => a.toLowerCase() === b.toLowerCase(); 6 | 7 | export default isStringEqualIgnoreCase; 8 | -------------------------------------------------------------------------------- /src/data/rust-bindgen.yaml: -------------------------------------------------------------------------------- 1 | name: Rust bindgen 2 | summary: Tool for automatically generating Rust bindings for C/C++ APIs 3 | icon: vector-combine 4 | repositories: 5 | - rust-lang/rust-bindgen: 6 | - 'E-easy' 7 | - 'help wanted' 8 | - 'good first issue' 9 | -------------------------------------------------------------------------------- /src/setupTests.js: -------------------------------------------------------------------------------- 1 | // jest-dom adds custom jest matchers for asserting on DOM nodes. 2 | // allows you to do things like: 3 | // expect(element).toHaveTextContent(/react/i) 4 | // learn more: https://github.com/testing-library/jest-dom 5 | import '@testing-library/jest-dom'; 6 | -------------------------------------------------------------------------------- /src/data/applicationservices.yaml: -------------------------------------------------------------------------------- 1 | name: Application Services 2 | summary: Application Services is a platform for building cross-platform browser components using Rust 3 | icon: cloud-sync 4 | repositories: 5 | - mozilla/application-services: ['good-first-issue', 'good-second-issue', 'help-wanted'] 6 | -------------------------------------------------------------------------------- /src/data/rustfmt.yaml: -------------------------------------------------------------------------------- 1 | name: Rustfmt 2 | summary: Rustfmt is the automatic code formatter for Rust code 3 | icon: format-indent-increase 4 | repositories: 5 | - rust-lang/rustfmt: 6 | - 'community driven' 7 | - 'E-help-wanted' 8 | - 'E-easy' 9 | - 'E-medium' 10 | - 'good first issue' 11 | -------------------------------------------------------------------------------- /src/data/ff-build.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox - Development Build System Environment 2 | summary: The harnesses tools surrounding the building of Firefox. 3 | icon: package-variant 4 | introduction: | 5 | The development environment (aka build system) supports the building of Firefox. 6 | products: 7 | - "Firefox Build System" 8 | -------------------------------------------------------------------------------- /src/data/a11y.yaml: -------------------------------------------------------------------------------- 1 | name: Accessibility 2 | summary: Accessibility is about making things work for everyone. The majority of our team's engineering work is performed on the accessibility engine which sits inside gecko, the guts of the Firefox browser's web platform. 3 | icon: human 4 | products: 5 | - Core: ['Disability Access APIs'] 6 | - Firefox: ['Disability Access'] 7 | -------------------------------------------------------------------------------- /src/images/projectIcons/pontoon.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Codetribute", 3 | "name": "Codetribute", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /config/jest/cssTransform.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // This is a custom Jest transformer turning style imports into empty objects. 4 | // http://facebook.github.io/jest/docs/en/webpack.html 5 | 6 | module.exports = { 7 | process() { 8 | return 'module.exports = {};'; 9 | }, 10 | getCacheKey() { 11 | // The output is always the same. 12 | return 'cssTransform'; 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /src/data/loader.js: -------------------------------------------------------------------------------- 1 | const importer = require.context('./', true, /\.(yml|yaml)/); 2 | const keys = [...new Set([...importer.keys()])]; 3 | 4 | export default keys.reduce((prev, cur) => { 5 | const fileName = cur.replace(/\.(yaml|yml)/, '').replace('./', ''); 6 | 7 | return { 8 | ...prev, 9 | [fileName]: { 10 | ...importer(cur), 11 | fileName, 12 | }, 13 | }; 14 | }, {}); 15 | -------------------------------------------------------------------------------- /src/data/gfx.yaml: -------------------------------------------------------------------------------- 1 | name: Graphics 2 | summary: Get involved with the [Graphics](https://wiki.mozilla.org/Platform/GFX/Contribute) team 3 | icon: image-search 4 | products: 5 | - Core: ['Graphics', 'GFX: Color Management', 'Canvas: WebGL', 'Canvas: 2D', 'ImageLib', 'Graphics', 'Graphics: Layers', 'Graphics: Text', 'Graphics: WebRender', 'Panning and Zooming'] 6 | repositories: 7 | - servo/webrender: ['help-wanted', 'difficulty: easy'] 8 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', 5 | sans-serif; 6 | -webkit-font-smoothing: antialiased; 7 | -moz-osx-font-smoothing: grayscale; 8 | } 9 | 10 | code { 11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', 12 | monospace; 13 | } 14 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base", 4 | ":maintainLockFilesWeekly", 5 | ":prNotPending", 6 | ":unpublishSafe" 7 | ], 8 | "reviewers": [ 9 | "djmitche" 10 | ], 11 | "dependencyDashboard": true, 12 | "prConcurrentLimit": 2, 13 | "pinVersions": false, 14 | "packageRules": [ 15 | { 16 | "updateTypes": ["minor", "patch", "lockFileMaintenance"], 17 | "automerge": true 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/data/mozillavpn.yaml: -------------------------------------------------------------------------------- 1 | name: Mozilla VPN 2 | summary: | 3 | Mozilla VPN is a fast, secure and easy to use cross-platform VPN service. 4 | introduction: | 5 | Mozilla VPN is a fast, secure and easy to use cross-platform VPN service. 6 | 7 | You can learn more on 8 | [our official website](https://www.mozilla.org/en-US/products/vpn) 9 | repositories: 10 | - mozilla-mobile/mozilla-vpn-client: 11 | - 'good first issue' 12 | - 'Contributions Welcome' 13 | -------------------------------------------------------------------------------- /src/App/routes.jsx: -------------------------------------------------------------------------------- 1 | import { lazy } from 'react'; 2 | 3 | const routes = [ 4 | { 5 | component: lazy(() => import('../views/Projects/index')), 6 | path: '/', 7 | exact: true, 8 | }, 9 | { 10 | component: lazy(() => import('../views/Project/index')), 11 | path: '/projects/:project', 12 | }, 13 | { 14 | component: lazy(() => import('../views/Languages/index')), 15 | path: '/languages/:language', 16 | }, 17 | ]; 18 | 19 | export default routes; 20 | -------------------------------------------------------------------------------- /src/data/mozregression.yaml: -------------------------------------------------------------------------------- 1 | name: mozregression 2 | summary: | 3 | mozregression is an interactive regression range finder for Firefox and other 4 | Mozilla products. 5 | introduction: | 6 | mozregression is an interactive regression range finder for Firefox and other 7 | Mozilla products. It uses a binary search algorithm for quickly determining a 8 | changeset range corresponding to when a problem was introduced. 9 | products: 10 | - Testing: 11 | - "mozregression" 12 | 13 | -------------------------------------------------------------------------------- /src/components/Sidebar/KotlinIcon.jsx: -------------------------------------------------------------------------------- 1 | import React, { PureComponent } from 'react'; 2 | 3 | export default class KotlinIcon extends PureComponent { 4 | render() { 5 | const { className, size, fill } = this.props; 6 | 7 | return ( 8 | 12 | 13 | 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/views/bugs.graphql: -------------------------------------------------------------------------------- 1 | query Bugs($goodFirst: BugSearch!, $mentored: BugSearch!, $paging: Paging) { 2 | goodFirst: bugs(search: $goodFirst, paging: $paging) { 3 | ...Bugs 4 | } 5 | mentored: bugs(search: $mentored, paging: $paging) { 6 | ...Bugs 7 | } 8 | } 9 | 10 | fragment Bugs on BugPager { 11 | edges { 12 | node { 13 | assignedTo { 14 | name 15 | } 16 | component 17 | lastChanged 18 | id 19 | keywords 20 | summary 21 | whiteboard 22 | product 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/images/projectIcons/mdn.svg: -------------------------------------------------------------------------------- 1 | 2 | MDN Logo 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/data/ff-infra.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox - Development Infrastructure 2 | summary: All the linting tools, code analysis, editor integration, source documentation infrastructure that supports Firefox developers. 3 | icon: package-variant 4 | introduction: | 5 | These tools are a vital part of the developer support system for Firefox. 6 | 7 | They help provide the linting and code analysis tools that reduce errors in the 8 | code and provide consistent formatting. They also help with editor integration, 9 | generating source documentation and more. 10 | products: 11 | - "Developer Infrastructure" 12 | -------------------------------------------------------------------------------- /src/data/sumo.yaml: -------------------------------------------------------------------------------- 1 | name: Mozilla Support / Kitsune 2 | summary: Kitsune is the platform that powers support.mozilla.org (SUMO), the platform for Mozilla product support. 3 | introduction: | 4 | ## About Kitsune 5 | 6 | Kitsune is a web application based on Django, a Python web application framework. 7 | 8 | ## How Do I Get Started? 9 | 10 | Explore our documentation (https://mozilla.github.io/kitsune/) to learn about getting started. 11 | products: 12 | - support.mozilla.org 13 | repositories: 14 | - mozilla/sumo : ['good-first-bug', 'pr-welcome'] 15 | - mozilla/kitsune : ['good-first-bug'] 16 | -------------------------------------------------------------------------------- /src/data/thunderbird.yaml: -------------------------------------------------------------------------------- 1 | name: Thunderbird 2 | summary: Thunderbird is a free and open-source cross-platform email client, news client, RSS and chat client. 3 | introduction: | 4 | The Thunderbird project's website is at https://thunderbird.net 5 | Our Matrix support channel is `#thunderbird:mozilla.org`, and our development channel is `#maildev:mozilla.org` at [Matrix](https://wiki.mozilla.org/Matrix) 6 | You can find information on how to contribute to Thunderbird at https://thunderbird.net/get-involved 7 | products: 8 | - Calendar 9 | - Chat Core 10 | - Thunderbird 11 | - MailNews Core 12 | -------------------------------------------------------------------------------- /src/data/firefox-sync.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox Sync 2 | summary: | 3 | Firefox Sync is a set of software components and specifications that 4 | synchronize data between multiple Mozilla product instances. 5 | icon: sync 6 | products: 7 | - Cloud Services: 8 | - 'Firefox Sync: Backend' 9 | - 'Firefox Sync: Build' 10 | - 'Firefox Sync: Crypto' 11 | - 'Firefox Sync: UI' 12 | - 'Server: Sync' 13 | - Firefox: 14 | - 'Sync' 15 | - Android Background Services: 16 | - 'Android Sync' 17 | repositories: 18 | - mozilla-services/syncstorage-rs: 19 | - 'community' 20 | - 'good first bug' 21 | -------------------------------------------------------------------------------- /src/data/common-voice.yaml: -------------------------------------------------------------------------------- 1 | name: Common Voice 2 | summary: Common Voice is part of Mozilla's initiative to help teach machines how real people speak. 3 | introduction: | 4 | ## About Common Voice 5 | 6 | Common Voice is a publicly available voice dataset, powered by the voices of 7 | volunteer contributors around the world. People who want to build voice 8 | applications can use the dataset to train machine learning models. 9 | 10 | repositories: 11 | - common-voice/common-voice: ["Good First Issue", "Help Wanted", "Open for Community Contributors"] 12 | - common-voice/cv-sentence-extractor: ["good first issue", "help wanted"] 13 | -------------------------------------------------------------------------------- /src/data/thunderbird-android.yaml: -------------------------------------------------------------------------------- 1 | name: Thunderbird Android 2 | summary: | 3 | Thunderbird for Android is an open source email app for Android 4 | introduction: | 5 | The Thunderbird project's website is at https://thunderbird.net 6 | Our Matrix support channel is `#thunderbird:mozilla.org`, and our development 7 | channel is `#tb-mobile-dev:mozilla.org` at 8 | [Matrix](https://wiki.mozilla.org/Matrix) 9 | 10 | You can find information on how to contribute to Thunderbird at 11 | https://thunderbird.net/get-involved 12 | repositories: 13 | - thunderbird/thunderbird-android: 14 | - 'good first issue' 15 | - 'status: help wanted' 16 | -------------------------------------------------------------------------------- /src/components/Spinner/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { PureComponent } from 'react'; 2 | import { withStyles } from '@material-ui/core/styles'; 3 | import CircularProgress from '@material-ui/core/CircularProgress'; 4 | import classNames from 'classnames'; 5 | 6 | export default 7 | @withStyles({ 8 | center: { 9 | textAlign: 'center', 10 | }, 11 | }) 12 | class Spinner extends PureComponent { 13 | render() { 14 | const { classes, className } = this.props; 15 | 16 | return ( 17 |
18 | 19 |
20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/fragmentTypes.json: -------------------------------------------------------------------------------- 1 | { 2 | "__schema": { 3 | "types": [ 4 | { 5 | "kind": "UNION", 6 | "name": "SearchResultItem", 7 | "possibleTypes": [ 8 | { 9 | "name": "Issue" 10 | }, 11 | { 12 | "name": "PullRequest" 13 | }, 14 | { 15 | "name": "Repository" 16 | }, 17 | { 18 | "name": "User" 19 | }, 20 | { 21 | "name": "Organization" 22 | }, 23 | { 24 | "name": "MarketplaceListing" 25 | } 26 | ] 27 | } 28 | ] 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /config/jest/babelTransform.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const babelJest = require('babel-jest'); 4 | 5 | const hasJsxRuntime = (() => { 6 | if (process.env.DISABLE_NEW_JSX_TRANSFORM === 'true') { 7 | return false; 8 | } 9 | 10 | try { 11 | require.resolve('react/jsx-runtime'); 12 | return true; 13 | } catch (e) { 14 | return false; 15 | } 16 | })(); 17 | 18 | module.exports = babelJest.createTransformer({ 19 | presets: [ 20 | [ 21 | require.resolve('babel-preset-react-app'), 22 | { 23 | runtime: hasJsxRuntime ? 'automatic' : 'classic', 24 | }, 25 | ], 26 | ], 27 | babelrc: false, 28 | configFile: false, 29 | }); 30 | -------------------------------------------------------------------------------- /src/data/automation.yaml: -------------------------------------------------------------------------------- 1 | name: Test Automation 2 | icon: test-tube 3 | products: 4 | - Testing 5 | repositories: 6 | - armenzg/mozilla_ci_tools: mentored 7 | - automatedtester/automation-services-bot: mentored 8 | - automatedtester/powerball-platform: mentored 9 | - automatedtester/unittest-zero: mentored 10 | - davehunt/flynnid: mentored 11 | - mozilla/coversheet: mentored 12 | - mozilla/mozdownload: mentored 13 | - mozilla/nightlytt: mentored 14 | - mozilla/grcov: good-first-bug 15 | - mozilla/libmozevent: good-first-bug 16 | - mozilla/code-coverage: good-first-bug 17 | - mozilla/coverage-crawler: good-first-bug 18 | - mozilla/code-review: good-first-bug 19 | - mozilla/wpt-api: 'good first issue' 20 | -------------------------------------------------------------------------------- /src/data/webextensions.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox - WebExtensions 2 | summary: APIs to build Firefox extensions and themes. 3 | introduction: | 4 | ## About WebExtensions 5 | 6 | The WebExtensions API is a cross-browser API for developing extensions and themes that can modify the capability of a browser. 7 | 8 | ## How Do I Get Started? 9 | 10 | To get started with contributing to the WebExtensions API, see https://wiki.mozilla.org/Add-ons/Contribute#Contribute_to_the_WebExtensions_API. 11 | 12 | ## How Do I Get Help? 13 | 14 | We are available on [Matrix](https://wiki.mozilla.org/Matrix) in the [Add-ons](https://chat.mozilla.org/#/room/#addons:mozilla.org) room. 15 | 16 | products: 17 | - WebExtensions 18 | -------------------------------------------------------------------------------- /src/views/githubInfo.graphql: -------------------------------------------------------------------------------- 1 | query githubInfo($searchQuery: String!, $type: SearchType!) { 2 | search(first: 100, type: $type, query: $searchQuery){ 3 | nodes { 4 | ... on Issue { 5 | title 6 | body 7 | updatedAt 8 | repository { 9 | name 10 | } 11 | url 12 | labels(last:5) { 13 | nodes { 14 | name 15 | } 16 | } 17 | assignees(last:1) { 18 | nodes { 19 | login 20 | } 21 | } 22 | } 23 | ...on Repository { 24 | nameWithOwner 25 | primaryLanguage { 26 | name 27 | } 28 | } 29 | } 30 | } 31 | } 32 | 33 | -------------------------------------------------------------------------------- /src/App.css: -------------------------------------------------------------------------------- 1 | .App { 2 | text-align: center; 3 | } 4 | 5 | .App-logo { 6 | height: 40vmin; 7 | pointer-events: none; 8 | } 9 | 10 | @media (prefers-reduced-motion: no-preference) { 11 | .App-logo { 12 | animation: App-logo-spin infinite 20s linear; 13 | } 14 | } 15 | 16 | .App-header { 17 | background-color: #282c34; 18 | min-height: 100vh; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | font-size: calc(10px + 2vmin); 24 | color: white; 25 | } 26 | 27 | .App-link { 28 | color: #61dafb; 29 | } 30 | 31 | @keyframes App-logo-spin { 32 | from { 33 | transform: rotate(0deg); 34 | } 35 | to { 36 | transform: rotate(360deg); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /config/pnpTs.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const { resolveModuleName } = require('ts-pnp'); 4 | 5 | exports.resolveModuleName = ( 6 | typescript, 7 | moduleName, 8 | containingFile, 9 | compilerOptions, 10 | resolutionHost 11 | ) => { 12 | return resolveModuleName( 13 | moduleName, 14 | containingFile, 15 | compilerOptions, 16 | resolutionHost, 17 | typescript.resolveModuleName 18 | ); 19 | }; 20 | 21 | exports.resolveTypeReferenceDirective = ( 22 | typescript, 23 | moduleName, 24 | containingFile, 25 | compilerOptions, 26 | resolutionHost 27 | ) => { 28 | return resolveModuleName( 29 | moduleName, 30 | containingFile, 31 | compilerOptions, 32 | resolutionHost, 33 | typescript.resolveTypeReferenceDirective 34 | ); 35 | }; 36 | -------------------------------------------------------------------------------- /src/data/webcompat.yaml: -------------------------------------------------------------------------------- 1 | name: webcompat.com 2 | summary: | 3 | webcompat.com makes it easy to report and view web compatibility problems for 4 | any part of the web. 5 | introduction: | 6 | What is Web Compatibility? 7 | 8 | Web compatibility is about making sure web sites work the same way across all 9 | browsers and devices. 10 | 11 | Sometimes sites have bugs or policies that prevent them from working well in 12 | every browser. Sometimes browser vendors have implemented features in different 13 | ways. We work to help web developers and site owners identify and fix such 14 | issues, or raise the issues to browser vendors or standards bodies to be fixed. 15 | repositories: 16 | - webcompat/webcompat.com: 17 | - 'prio: good first bug' 18 | - 'prio: good next bug' 19 | -------------------------------------------------------------------------------- /src/components/AppBar/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { withStyles } from '@material-ui/core/styles'; 3 | import AppBar from '@material-ui/core/AppBar'; 4 | import classNames from 'classnames'; 5 | 6 | @withStyles((theme) => ({ 7 | root: { 8 | background: `linear-gradient(45deg, ${theme.palette.primary.main}, 9 | ${theme.palette.secondary.main} 10 | 90%)`, 11 | paddingTop: theme.spacing(1), 12 | }, 13 | })) 14 | class CustomAppBar extends Component { 15 | render() { 16 | const { children, classes, className, ...props } = this.props; 17 | 18 | return ( 19 | 20 | {children} 21 | 22 | ); 23 | } 24 | } 25 | 26 | export default CustomAppBar; 27 | -------------------------------------------------------------------------------- /src/components/Sidebar/HtmlIcon.jsx: -------------------------------------------------------------------------------- 1 | import React, { PureComponent } from 'react'; 2 | 3 | export default class HtmlIcon extends PureComponent { 4 | render() { 5 | const { className, size, fill } = this.props; 6 | 7 | return ( 8 | 13 | 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/images/projectIcons/webextensions.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/images/icons.test.js: -------------------------------------------------------------------------------- 1 | import fs from 'fs-extra'; 2 | import { join, extname, basename } from 'path'; 3 | 4 | describe('project icons', () => { 5 | it('should have svg extensions', async () => { 6 | const extensions = fs 7 | .readdirSync(join('src', 'images', 'projectIcons')) 8 | .map(extname); 9 | 10 | expect(extensions.every((ext) => ext === '.svg')).toEqual(true); 11 | }); 12 | it('should have the same name as its configuration file', () => { 13 | const iconNames = fs 14 | .readdirSync(join('src', 'images', 'projectIcons')) 15 | .map((file) => basename(file, '.svg')); 16 | const projectNames = fs 17 | .readdirSync(join('src', 'data')) 18 | .map((file) => basename(file, '.yaml')); 19 | 20 | expect(iconNames.every((name) => projectNames.includes(name))).toEqual( 21 | true 22 | ); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/data/bugzilla.yaml: -------------------------------------------------------------------------------- 1 | name: Bugzilla 2 | summary: Bugzilla is server software designed to help you manage software development, BMO, the Mozilla custom version, is used to track not only bugs and feature requests but also many other tasks across various teams 3 | products: 4 | - Bugzilla: ['Administration', 'Attachments & Requests', 'Bug Import/Export & Moving', 'Bugzilla-General', 'bugzilla.org', 'Creating/Changing Bugs', 'Documentation', 'Email Notifications', 'Extensions', 'QA Test Scripts', 'Query/Bug Lists', 'Testing Suite', 'User Accounts', 'User Interface', 'WebService', 'Whining'] 5 | - bugzilla.mozilla.org: ['Administration', 'API', 'Bugzilla Tweaks', 'Developer Box', 'Extensions: AntiSpam', 'Extensions: BMO', 'Extensions: ComponentWatching', 'Extensions: MyDashboard', 'Extensions: Needinfo', 'Extensions: UserProfile', 'General', 'rbbz', 'Sandstone/Mozilla Skin', 'User Interface'] 6 | -------------------------------------------------------------------------------- /contribute.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Codetribute", 3 | "description": "A site for connecting contributors to Mozilla's open-source projects.", 4 | "repository": { 5 | "url": "https://github.com/mozilla-frontend-infra/codetribute", 6 | "license": "MPL2" 7 | }, 8 | "participate": { 9 | "home": "https://github.com/mozilla-frontend-infra/codetribute", 10 | "docs": "https://github.com/mozilla-frontend-infra/codetribute/blob/main/README.md", 11 | "irc": "irc://irc.mozilla.org/#frontend-infra", 12 | "irc-contacts": [ 13 | "hassan", 14 | "Eli", 15 | "dustin" 16 | ] 17 | }, 18 | "bugs": { 19 | "list": "https://github.com/mozilla-frontend-infra/codetribute/issues" 20 | }, 21 | "urls": { 22 | "prod": "https://www.codetribute.mozilla.org" 23 | }, 24 | "keywords": [ 25 | "javascript", 26 | "react", 27 | "graphql", 28 | "github", 29 | "bugzilla" 30 | ] 31 | } 32 | -------------------------------------------------------------------------------- /src/components/FontStager/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import FoutStager from 'react-fout-stager'; 3 | import './index.css'; 4 | 5 | /** 6 | * Responsible for loading the application typefaces progressively 7 | * using FOUT stage techniques. 8 | */ 9 | export default class FontStager extends Component { 10 | render() { 11 | return ( 12 | 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/data/internals.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox - Platform (Core) 2 | summary: The core of the platform on which Firefox is built. 3 | icon: package-variant 4 | products: 5 | - Core: ['General', 'Document Navigation', 'XPCOM', 'Embedding: APIs', 'Embedding: GRE Core', 'Embedding: Mac', 'Embedding: Packaging', 'Embedding: GTK Widget', 'File Handling', 'Find Backend', 'Gecko Profiler', 'History (Global)', 'Image Blocking', 'Installer', 'IPC', 'MFBT', 'Plug-ins', 'Preferences: Backend', 'Print Preview', 'Printing: Output', 'Printing: Setup', 'Profile: BackEnd', 'Profile: Migration', 'Profile: Roaming', 'RDF', 'Rewriting and Analysis', 'Security', 'Security: CAPS', 'Security: PSM', 'Security: S/MIME', 'Security: UI', 'Serializers', 'SQL', 'String', 'XBL', 'XTF', 'XUL', 'Widget', 'Widget: Android', 'Widget: BeOS', 'Widget: Cocoa', 'Widget: Gtk', 'Widget: OS/2', 'Widget: Photon', 'Widget: Qt', 'Widget: Win32', 'XP Toolkit/Widgets: XUL', 'XP Toolkit/Widgets: Menus', 'Identity', 'Localization'] 6 | - NSPR 7 | - NSS 8 | -------------------------------------------------------------------------------- /src/utils/extractWhiteboardTags.js: -------------------------------------------------------------------------------- 1 | // Find whiteboard tags of the form: 2 | // [lang=js][lang=xul] 3 | // [lang=js,xul] 4 | // [lang=js/xul] 5 | export default (whiteboard) => { 6 | if (!whiteboard) { 7 | return []; 8 | } 9 | 10 | const re = /(\w+)=(\w+)[,|/]\s?(\w+)/; 11 | // find all element within square bracket starting with lang with as little 12 | // string as possible inside 13 | const keywords = (whiteboard.match(/\[lang=.+?\]/g) || []).reduce( 14 | (acc, item) => { 15 | // remove the square brackets 16 | const itemWithoutBracket = item.slice(1, -1); 17 | const items = itemWithoutBracket.match(re); 18 | 19 | // if there is no comma or / 20 | if (!items) { 21 | return [...acc, itemWithoutBracket]; 22 | } 23 | 24 | // items=["lang=js/xul","lang","js","xul"] 25 | // so start looping from 3rd element 26 | return [ 27 | ...acc, 28 | ...items.slice(2).map((element) => `${items[1]}=${element}`), 29 | ]; 30 | }, 31 | [] 32 | ); 33 | 34 | return keywords; 35 | }; 36 | -------------------------------------------------------------------------------- /src/utils/sort.js: -------------------------------------------------------------------------------- 1 | import { compareAsc, parseISO, isDate } from 'date-fns'; 2 | import { or } from 'ramda'; 3 | 4 | /** 5 | * Return a negative number if the reference element occurs before 6 | * the compare element; positive if the reference element occurs 7 | * after the compare element; 0 if they are equivalent. 8 | */ 9 | const sort = (referenceElement, compareElement) => { 10 | if ( 11 | typeof referenceElement === 'number' && 12 | typeof compareElement === 'number' 13 | ) { 14 | const diff = referenceElement - compareElement; 15 | 16 | if (diff === 0) { 17 | return 0; 18 | } 19 | 20 | return diff < 0 ? -1 : 1; 21 | } 22 | 23 | const reference = isDate(referenceElement) 24 | ? parseISO(referenceElement) 25 | : referenceElement; 26 | const compare = isDate(compareElement) 27 | ? parseISO(compareElement) 28 | : compareElement; 29 | 30 | if (isDate(referenceElement) || isDate(compareElement)) { 31 | return compareAsc(reference, compare); 32 | } 33 | 34 | return or(reference, '').localeCompare(compare); 35 | }; 36 | 37 | export default sort; 38 | -------------------------------------------------------------------------------- /src/data/seamonkey.yaml: -------------------------------------------------------------------------------- 1 | name: SeaMonkey 2 | summary: SeaMonkey is an all-in-one Internet application suite that includes the Browser, Mail, Web-authoring and irc components. 3 | introduction: | 4 | The SeaMonkey project is at https://www.seamonkey-project.org. 5 | 6 | Our Matrix channel is `#seamonkey:mozilla.org` on [Matrix](https://wiki.mozilla.org/Matrix) 7 | 8 | products: 9 | - SeaMonkey: ['General', 'Security', 'Build Config', 'OS Integration', 'Preferences', 10 | 'Website', 'Composer', 'Help Viewer', 'Bookmarks & History', 'Installer', 11 | 'Search', 'Session Restore', 'Tabbed Browser', 'Help Documentation', 12 | 'Testing Infrastructure', 'Autocomplete', 'Download & File Handling', 13 | 'Feed Discovery and Preview', 'Find in Page', 'Location Bar', 14 | 'MailNews: Account Configuration', 'MailNews: Address Book & Contacts', 15 | 'MailNews: Backend', 'MailNews: Composition', 'MailNews: General', 16 | 'MailNews: Message Display', 'Page Info', 'Passwords & Permissions', 17 | 'Project Organization', 'Release Engineering', 'Sidebar', 18 | 'Startup & Profiles', 'Sync UI', 'Themes', 'UI Design'] 19 | -------------------------------------------------------------------------------- /src/utils/extractWhiteboardTags.test.js: -------------------------------------------------------------------------------- 1 | import extractWhiteboardTags from './extractWhiteboardTags'; 2 | 3 | describe('extract whiteboard tags', () => { 4 | it('should extract languages from [lang=js][lang=xul]', () => { 5 | const result = extractWhiteboardTags('[lang=js][lang=xul]'); 6 | 7 | expect(result).toEqual(['lang=js', 'lang=xul']); 8 | }); 9 | it('should extract languages from [lang=js][lang=xul][good-first-bug]', () => { 10 | const result = extractWhiteboardTags('[lang=js][lang=xul][good-first-bug]'); 11 | 12 | expect(result).toEqual(['lang=js', 'lang=xul']); 13 | }); 14 | it('should extract languages from [lang=js,xul]', () => { 15 | const result = extractWhiteboardTags('[lang=js,xul]'); 16 | 17 | expect(result).toEqual(['lang=js', 'lang=xul']); 18 | }); 19 | it('should extract languages from [lang=js/xul]', () => { 20 | const result = extractWhiteboardTags('[lang=js/xul]'); 21 | 22 | expect(result).toEqual(['lang=js', 'lang=xul']); 23 | }); 24 | it('should extract languages from [lang=js, xul]', () => { 25 | const result = extractWhiteboardTags('[lang=js, xul]'); 26 | 27 | expect(result).toEqual(['lang=js', 'lang=xul']); 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /src/data/searchfox.yaml: -------------------------------------------------------------------------------- 1 | name: Searchfox 2 | summary: | 3 | Searchfox is a source code indexing tool for Mozilla Firefox and Thunderbird. 4 | icon: magnify 5 | introduction: | 6 | ## About Searchfox 7 | 8 | [Searchfox](https://searchfox.org/) is a source code indexing tool for Mozilla 9 | Firefox and Thunderbird. 10 | 11 | ## How do I Get Started 12 | 13 | * Clone the [mozsearch](https://github.com/mozsearch/mozsearch) repository 14 | * Follow the [README](https://github.com/mozsearch/mozsearch/blob/master/README.md) 15 | document, to setup the development environment in docker, and start the local 16 | server with the test repository 17 | * Understand [how to file a bug and submit a patch](https://github.com/mozsearch/mozsearch/blob/master/CONTRIBUTING.md) 18 | 19 | ## How Do I Get Help 20 | 21 | The best place to talk about a bug or issue is in the comments. Don't be afraid 22 | to ask questions or describe how you are solving the problem. That way, anyone 23 | watching the bug can answer your questions or offer useful advice. 24 | 25 | Some bugs have an assigned mentor, and that person will usually be the one to 26 | reply. 27 | 28 | We are also available on [chat.mozilla.org](https://chat.mozilla.org/#/room/#searchfox:mozilla.org). 29 | 30 | products: 31 | - Webtools: ['Searchfox'] 32 | -------------------------------------------------------------------------------- /src/data/firefox-frontend.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox - Desktop Frontend 2 | summary: | 3 | Get involved with the [Firefox](https://wiki.mozilla.org/Firefox) Frontend 4 | team. 5 | icon: firefox-frontend 6 | introduction: | 7 | ## About Firefox Desktop Frontend 8 | 9 | The Firefox Desktop has many parts. The frontend team looks after the 10 | components that drive the user interface, as well as the interface itself. 11 | 12 | ## How Do I Get Started? 13 | 14 | See our 15 | [Contributor's Quick Reference guide](https://firefox-source-docs.mozilla.org/contributing/contribution_quickref.html) 16 | for how to get the source code and start developing. 17 | 18 | ## How Do I Get Help? 19 | 20 | The best place to talk about a bug or issue is in the comments. Don't be afraid 21 | to ask questions or describe how you are solving the problem. That way, anyone 22 | watching the bug can answer your questions or offer useful advice. Each bug has 23 | a mentor, and that person will usually be the one to reply. 24 | 25 | There is also help available on [Matrix](https://wiki.mozilla.org/Matrix) in 26 | the `#introduction:mozilla.org` channel. 27 | 28 | That's a great place to get quick help or work through issues with Mercurial or 29 | git as well. 30 | products: 31 | - Firefox 32 | - Toolkit 33 | - Cloud Services: 34 | - 'Firefox Sync: UI' 35 | -------------------------------------------------------------------------------- /src/images/projectIcons/mozillavpn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/utils/constants.js: -------------------------------------------------------------------------------- 1 | export const GOOD_FIRST_BUG = 'good-first-bug'; 2 | export const MENTORED_BUG = { 3 | fields: 'mentor', 4 | operators: 'IS_NOT_EMPTY', 5 | }; 6 | export const BUGZILLA_STATUSES = { 7 | NEW: 'NEW', 8 | UNCONFIRMED: 'UNCONFIRMED', 9 | ASSIGNED: 'ASSIGNED', 10 | REOPENED: 'REOPENED', 11 | }; 12 | export const BUGZILLA_PAGE_SIZE = 100; 13 | export const BUGZILLA_PAGE_NUMBER = 0; 14 | export const BUGZILLA_ORDER = 'changeddate DESC'; 15 | export const ASSIGNEE = { 16 | ANY: 'Any', 17 | UNASSIGNED: 'Unassigned', 18 | ASSIGNED: 'Assigned', 19 | }; 20 | export const ALL_PROJECTS = 'All'; 21 | export const BUGZILLA_SEARCH_OPTIONS = { 22 | statuses: Object.values(BUGZILLA_STATUSES), 23 | order: BUGZILLA_ORDER, 24 | }; 25 | export const BUGZILLA_PAGING_OPTIONS = { 26 | page: BUGZILLA_PAGE_NUMBER, 27 | pageSize: BUGZILLA_PAGE_SIZE, 28 | }; 29 | export const BUGZILLA_LANGUAGES = { 30 | 'C++': 'c++', 31 | CSS: 'css', 32 | HTML: 'html', 33 | Java: 'java', 34 | JavaScript: 'js', 35 | Kotlin: 'kotlin', 36 | Perl: 'perl', 37 | Python: 'py', 38 | Rust: 'rust', 39 | Shell: 'shell', 40 | XML: 'xml', 41 | XUL: 'xul', 42 | Go: 'go', 43 | }; 44 | export const BUGZILLA_UNASSIGNED = ['nobody@mozilla.org', '@bugzilla.bugs']; 45 | export const THIRD_PARTY_LINKS = [ 46 | { link: 'https://www.outreachy.org', label: 'Outreachy' }, 47 | ]; 48 | -------------------------------------------------------------------------------- /config/jest/fileTransform.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const camelcase = require('camelcase'); 5 | 6 | // This is a custom Jest transformer turning file imports into filenames. 7 | // http://facebook.github.io/jest/docs/en/webpack.html 8 | 9 | module.exports = { 10 | process(src, filename) { 11 | const assetFilename = JSON.stringify(path.basename(filename)); 12 | 13 | if (filename.match(/\.svg$/)) { 14 | // Based on how SVGR generates a component name: 15 | // https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6 16 | const pascalCaseFilename = camelcase(path.parse(filename).name, { 17 | pascalCase: true, 18 | }); 19 | const componentName = `Svg${pascalCaseFilename}`; 20 | return `const React = require('react'); 21 | module.exports = { 22 | __esModule: true, 23 | default: ${assetFilename}, 24 | ReactComponent: React.forwardRef(function ${componentName}(props, ref) { 25 | return { 26 | $$typeof: Symbol.for('react.element'), 27 | type: 'svg', 28 | ref: ref, 29 | key: null, 30 | props: Object.assign({}, props, { 31 | children: ${assetFilename} 32 | }) 33 | }; 34 | }), 35 | };`; 36 | } 37 | 38 | return `module.exports = ${assetFilename};`; 39 | }, 40 | }; 41 | -------------------------------------------------------------------------------- /src/data/multi-account-containers.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox Multi-Account Containers 2 | summary: The Firefox Multi-Account Containers extension lets you carve out a separate box for each of your online lives – no more opening a different browser just to check your work email. 3 | introduction: | 4 | ## About Multi-Account Containers 5 | 6 | Firefox Multi-Account Containers lets you keep parts of your online life 7 | separated into color-coded tabs. Cookies are separated by container, 8 | allowing you to use the web with multiple accounts and integrate Mozilla VPN 9 | for an extra layer of privacy. 10 | 11 | ## Contributing 12 | 13 | Everyone is welcome to contribute to Multi-Account Containers. To learn how 14 | to contribute a patch to Multi-Account Container, please 15 | [read our contributing guide][contributing]. 16 | 17 | You can also chat with us on [our Matrix room][matrix] or [our forum][forum]. 18 | 19 | This repository is governed by Mozilla's code of conduct and etiquette 20 | guidelines. For more details, 21 | [please read the Mozilla Community Participation Guidelines][cpg]. 22 | 23 | [contributing]: https://github.com/mozilla/multi-account-containers/blob/main/CONTRIBUTING.md 24 | [cpg]: https://www.mozilla.org/about/governance/policies/participation/ 25 | [enduser]: https://support.mozilla.org/en-US/kb/containers 26 | [matrix]: https://matrix.to/#/#containers:mozilla.org 27 | 28 | repositories: 29 | - mozilla/multi-account-containers: ['help wanted', 'good first issue'] 30 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | command = "yarn build" 3 | publish = "build" 4 | 5 | [build.environment] 6 | YARN_FLAGS = "--frozen-lockfile" 7 | YARN_VERSION = "1.22.19" 8 | NODE_VERSION = "16.18.1" 9 | SECRETS_SCAN_SMART_DETECTION_ENABLED = "false" # false positives during build time fail the build on netlify. Codetribute doesn't embed any secrets 10 | 11 | # Redirect HTTP to HTTPS 12 | # TODO: Delete when Codetribute successfully moves to codetribute.mozilla.org 13 | [[redirects]] 14 | from = "http://codetribute.netlify.com/*" 15 | to = "https://codetribute.netlify.com/:splat" 16 | status = 301 17 | force = true 18 | 19 | # Redirect HTTP to HTTPS 20 | [[redirects]] 21 | from = "http://codetribute.mozilla.org/*" 22 | to = "https://codetribute.mozilla.org/:splat" 23 | status = 301 24 | force = true 25 | 26 | # Rule for SPA 27 | [[redirects]] 28 | from = "/*" 29 | to = "/index.html" 30 | status = 200 31 | 32 | [[headers]] 33 | for = "/*" 34 | [headers.values] 35 | X-Frame-Options = "DENY" 36 | X-XSS-Protection = "1; mode=block" 37 | Content-Security-Policy = "default-src 'none'; connect-src 'self' https://bugzilla-graphql-gateway.herokuapp.com https://api.github.com/graphql; script-src 'self' 'unsafe-inline'; font-src 'self' data:; img-src 'self'; style-src https: 'unsafe-inline'; object-src 'none'; frame-ancestors 'self'" 38 | Strict-Transport-Security = "max-age=31536000; includeSubDomains;" 39 | Referrer-Policy = "no-referrer" 40 | X-Content-Type-Options = "nosniff" 41 | -------------------------------------------------------------------------------- /scripts/test.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // Do this as the first thing so that any code reading it knows the right env. 4 | process.env.BABEL_ENV = 'test'; 5 | process.env.NODE_ENV = 'test'; 6 | process.env.PUBLIC_URL = ''; 7 | 8 | // Makes the script crash on unhandled rejections instead of silently 9 | // ignoring them. In the future, promise rejections that are not handled will 10 | // terminate the Node.js process with a non-zero exit code. 11 | process.on('unhandledRejection', err => { 12 | throw err; 13 | }); 14 | 15 | // Ensure environment variables are read. 16 | require('../config/env'); 17 | 18 | 19 | const jest = require('jest'); 20 | const execSync = require('child_process').execSync; 21 | let argv = process.argv.slice(2); 22 | 23 | function isInGitRepository() { 24 | try { 25 | execSync('git rev-parse --is-inside-work-tree', { stdio: 'ignore' }); 26 | return true; 27 | } catch (e) { 28 | return false; 29 | } 30 | } 31 | 32 | function isInMercurialRepository() { 33 | try { 34 | execSync('hg --cwd . root', { stdio: 'ignore' }); 35 | return true; 36 | } catch (e) { 37 | return false; 38 | } 39 | } 40 | 41 | // Watch unless on CI or explicitly running all tests 42 | if ( 43 | !process.env.CI && 44 | argv.indexOf('--watchAll') === -1 && 45 | argv.indexOf('--watchAll=false') === -1 46 | ) { 47 | // https://github.com/facebook/create-react-app/issues/5210 48 | const hasSourceControl = isInGitRepository() || isInMercurialRepository(); 49 | argv.push(hasSourceControl ? '--watch' : '--watchAll'); 50 | } 51 | 52 | 53 | jest.run(argv); 54 | -------------------------------------------------------------------------------- /src/components/ErrorPanel/ErrorBox.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { RedBoxError } from 'redbox-react'; 3 | import ErrorStackParser from 'error-stack-parser'; 4 | import { withStyles } from '@material-ui/core/styles'; 5 | import CardContent from '@material-ui/core/CardContent'; 6 | 7 | export default 8 | @withStyles({ 9 | redbox: { 10 | width: '100%', 11 | color: 'white', 12 | textAlign: 'left', 13 | fontSize: 16, 14 | lineHeight: 1.2, 15 | overflow: 'auto', 16 | }, 17 | stack: { 18 | fontFamily: 'monospace', 19 | }, 20 | frame: { 21 | marginTop: '1em', 22 | }, 23 | }) 24 | class ErrorBox extends RedBoxError { 25 | render() { 26 | // The error is received as a property to initialize state.error, which may 27 | // be updated when it is mapped to the source map. 28 | const { classes } = this.props; 29 | const { error } = this.state; 30 | 31 | try { 32 | const frames = ErrorStackParser.parse(error); 33 | 34 | return ( 35 | 36 |
{this.renderFrames(frames)}
37 |
38 | ); 39 | } catch (err) { 40 | return ( 41 | 42 |
43 |
44 |
45 | Failed to parse stack trace. Stack trace information 46 | unavailable. 47 |
48 |
49 |
50 |
51 | ); 52 | } 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /.taskcluster.yml: -------------------------------------------------------------------------------- 1 | version: 1 2 | reporting: checks-v1 3 | policy: 4 | pullRequests: public 5 | tasks: 6 | $let: 7 | head_rev: 8 | $if: 'tasks_for == "github-pull-request"' 9 | then: ${event.pull_request.head.sha} 10 | else: ${event.after} 11 | repository: 12 | $if: 'tasks_for == "github-pull-request"' 13 | then: ${event.pull_request.head.repo.html_url} 14 | else: ${event.repository.html_url} 15 | in: 16 | $map: 17 | - name: yarn test 18 | image: node:16.18.1 19 | command: >- 20 | yarn --frozen-lockfile && 21 | yarn test 22 | - name: yarn build 23 | image: node:16.18.1 24 | command: >- 25 | yarn --frozen-lockfile && 26 | BUGZILLA_ENDPOINT=fake GITHUB_PERSONAL_API_TOKEN=fake yarn build 27 | - name: yarn lint 28 | image: node:16.18.1 29 | command: >- 30 | yarn --frozen-lockfile && 31 | yarn lint 32 | each(opts): 33 | provisionerId: 'proj-misc' 34 | workerType: 'ci' 35 | created: {$fromNow: ''} 36 | deadline: {$fromNow: '1 hour'} 37 | payload: 38 | maxRunTime: 3600 39 | image: "${opts.image}" 40 | env: 41 | CI: "true" 42 | command: 43 | - /bin/bash 44 | - '--login' 45 | - '-c' 46 | - >- 47 | git clone ${repository} repo && 48 | cd repo && 49 | git config advice.detachedHead false && 50 | git checkout ${head_rev} && 51 | ${opts.command} 52 | metadata: 53 | name: "${opts.name}" 54 | description: Codetribute CI 55 | owner: nobody@mozilla.com 56 | source: https://github.com/mozilla-frontend-infra/codetribute 57 | -------------------------------------------------------------------------------- /src/components/FontStager/index.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: Roboto400; 3 | src: 4 | url('~typeface-roboto/files/roboto-latin-400.woff2') format('woff2'), 5 | url('~typeface-roboto/files/roboto-latin-400.woff') format('woff'); 6 | font-weight: 400; 7 | font-style: normal; 8 | } 9 | @font-face { 10 | font-family: Roboto300; 11 | src: 12 | url('~typeface-roboto/files/roboto-latin-300.woff2') format('woff2'), 13 | url('~typeface-roboto/files/roboto-latin-300.woff') format('woff'); 14 | font-weight: 300; 15 | font-style: normal; 16 | } 17 | @font-face { 18 | font-family: Roboto500; 19 | src: 20 | url('~typeface-roboto/files/roboto-latin-500.woff2') format('woff2'), 21 | url('~typeface-roboto/files/roboto-latin-500.woff') format('woff'); 22 | font-weight: 500; 23 | font-style: normal; 24 | } 25 | 26 | /* 27 | The purpose of defining class stages is to 28 | re-render once a stage has been met. We start 29 | with the minimal default stage of sans-serif, 30 | and progressively re-render. 31 | */ 32 | html, body { 33 | font-family: sans-serif; 34 | font-weight: 400; 35 | -webkit-font-smoothing: antialiased; 36 | color: rgba(255, 255, 255, 0.7); 37 | } 38 | 39 | /* 40 | The defined stages now modify the display of 41 | elements once they are loaded. 42 | */ 43 | 44 | /* 45 | During primary stage we only load the Roboto font. 46 | Once it's loaded, update the body to use it. 47 | */ 48 | .font-stage-primary html, 49 | .font-stage-primary body { 50 | font-family: Roboto400, sans-serif; 51 | } 52 | 53 | /* Prevent the secondary fonts from being tree-shaken away */ 54 | .font-stage-secondary .roboto300 { 55 | font-family: Roboto300, sans-serif; 56 | } 57 | .font-stage-secondary .roboto500 { 58 | font-family: Roboto500, sans-serif; 59 | } 60 | -------------------------------------------------------------------------------- /src/components/Sidebar/JavaIcon.jsx: -------------------------------------------------------------------------------- 1 | import React, { PureComponent } from 'react'; 2 | 3 | export default class JavaIcon extends PureComponent { 4 | render() { 5 | const { className, fill, size } = this.props; 6 | 7 | return ( 8 | 13 | 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/data/mdn.yaml: -------------------------------------------------------------------------------- 1 | name: MDN Web Docs 2 | summary: Get involved with the [MDN Community](https://developer.mozilla.org/en-US/docs/MDN/Getting_started) 3 | introduction: | 4 | ## About MDN Web Docs 5 | 6 | MDN Web Docs is an evolving learning platform for Web technologies and software that power the Web, including HTML, CSS, JavaScript and the various web standards and APIs. 7 | 8 | ## Who Works on MDN? 9 | 10 | We are an open community of developers and writers building resources for a better Web, regardless of brand, browser, or platform. 11 | Anyone can contribute and each person who does makes us stronger. 12 | 13 | ## How Do I Get Started? 14 | 15 | You can just go ahead and pick one of the beginner-friendly tasks listed below. 16 | All the tasks listed below have mentors assigned to them and besides that, there is an extremely friendly and supportive community of contributors always willing to help. 17 | If you would like to know more about MDN and how to help out in general, check out our [Getting Started](https://developer.mozilla.org/en-US/docs/MDN/Getting_started) page. 18 | 19 | ## How Do I Get Help? 20 | 21 | The best place to get help are the [MDN Discourse channel](https://discourse.mozilla.org/c/mdn) or the `#mdn:mozilla.org` [Matrix](https://wiki.mozilla.org/Matrix) channel. 22 | 23 | products: 24 | - Developer Documentation: ['Accessibility', 'Add-ons', 'API: CSSOM', 'API: Device API', 'API: DOM', 'API: File API', 'API: HTML', 'API: IndexedDB', 'API: Miscellaneous', 'API: SVG', 'API: Web Animations', 'API: Web Audio', 'API: Web Sockets', 'API: Web Workers', 'API: WebRTC', 'Apps', 'CSS', 'Developer Tools', 'Emscripten', 'Games', 'General', 'HTML', 'JavaScript', 'Learning Area', 'Localization', 'Macros/Templates', 'Marketplace', 'MathML', 'MDN Meta Docs', 'Mozilla Platform', 'Protocols', 'Security', 'SVG'] 25 | -------------------------------------------------------------------------------- /src/data/firefox-ios.yml: -------------------------------------------------------------------------------- 1 | name: Firefox for iOS 2 | summary: Firefox mobile experience developed for the iOS platform. 3 | icon: cellphone 4 | introduction: | 5 | ## About Firefox for iOS 6 | 7 | Firefox for iOS is the Firefox mobile experience brought to iPhones and iPads, written in Swift. 8 | 9 | ## How Do I Get Started? 10 | 11 | Check out our list of [good first issues](https://github.com/mozilla-mobile/firefox-ios/issues?q=is%3Aissue+is%3Aopen+label%3A%22Contributor+OK+%F0%9F%A4%9D%22) on Github. 12 | Pick one that interests you and then follow [these instructions](https://github.com/mozilla-mobile/firefox-ios#building-the-code) to build the project. 13 | 14 | 15 | ### How Do I Write the Code? 16 | 17 | All of the code is in the [Github repository](https://github.com/mozilla-mobile/firefox-ios). 18 | To get started, fork that repository on GitHub, then clone the resulting forked repository to your computer. 19 | Before you change anything, run the tests to make sure everything is working. 20 | The repository's README file will describe how to set up and run tests. 21 | From there, follow the Github pull-request process: make your changes on a topic branch, and then create a pull request from that branch. 22 | The Internet is full of guides for this process, and of course we are happy to help as well. 23 | 24 | ## How Do I Get Help? 25 | 26 | The best place to talk about a bug or issue is in the comments. 27 | Don't be afraid to ask questions or describe how you are solving the problem. 28 | That way, anyone watching the bug can answer your questions or offer useful advice. 29 | 30 | We are also available on [matrix.io](https://chat.mozilla.org/#/room/#firefox-ios:mozilla.org) in the `#firefox-ios` channel in the mozilla.org community. 31 | That's a great place to get quick help or work through issues. 32 | 33 | repositories: 34 | - mozilla-mobile/firefox-ios : 'Contributor OK' 35 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 17 | 18 | 27 | Codetribute 28 | 29 | 30 | 31 |
32 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /src/data/pontoon.yaml: -------------------------------------------------------------------------------- 1 | name: Pontoon 2 | summary: Mozilla's Localization Platform 3 | introduction: | 4 | ## About Pontoon 5 | 6 | Pontoon is a localization platform used and developed by the Mozilla’s localization community. 7 | It is critical to shipping Firefox, mozilla.org, and many other Mozilla products to millions of users, all around the world. 8 | It is written in Javascript and Python and has lots of opportunities to help out. 9 | 10 | You can learn a bit about Pontoon in its [documentation](https://mozilla-pontoon.readthedocs.io/). 11 | 12 | ## Who Works on Pontoon? 13 | 14 | The team assigned to work on Pontoon at Mozilla is listed on 15 | [our people page](https://mozilla-pontoon.readthedocs.io/en/latest/dev/first-contribution.html#communicate-with-us). 16 | We also receive invaluable help from community members. 17 | You will likely see the names of team members listed as mentors in the bugs on this site. 18 | We are always excited to meet new Mozillians! 19 | 20 | ## How Do I Get Started? 21 | 22 | To help you get started with contributing, we wrote 23 | [The Guide to your First Contribution to Pontoon](https://mozilla-pontoon.readthedocs.io/en/latest/dev/first-contribution.html). 24 | It contains all the information you need to know to install Pontoon, populate its database, run tests, and send your contribution. 25 | 26 | ## How Do I Get Help? 27 | 28 | The best place to talk about a bug is in the comments. 29 | Don't be afraid to ask questions or describe how you are solving the problem. 30 | That way, anyone watching the bug can answer your questions or offer useful advice. 31 | Each bug has a mentor, and that person will usually be the one to reply. 32 | 33 | We are also available on [chat.mozilla.org](https://chat.mozilla.org/#/room/#pontoon:mozilla.org) in the `#pontoon` channel. 34 | That's a great place to get quick help or work through issues together. 35 | 36 | products: 37 | - Webtools: ['Pontoon'] 38 | -------------------------------------------------------------------------------- /src/components/Sidebar/GoIcon.jsx: -------------------------------------------------------------------------------- 1 | import React, { PureComponent } from 'react'; 2 | 3 | export default class GoIcon extends PureComponent { 4 | render() { 5 | const { className, fill, size } = this.props; 6 | 7 | return ( 8 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /config/getHttpsConfig.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const crypto = require('crypto'); 6 | const chalk = require('react-dev-utils/chalk'); 7 | const paths = require('./paths'); 8 | 9 | // Ensure the certificate and key provided are valid and if not 10 | // throw an easy to debug error 11 | function validateKeyAndCerts({ cert, key, keyFile, crtFile }) { 12 | let encrypted; 13 | try { 14 | // publicEncrypt will throw an error with an invalid cert 15 | encrypted = crypto.publicEncrypt(cert, Buffer.from('test')); 16 | } catch (err) { 17 | throw new Error( 18 | `The certificate "${chalk.yellow(crtFile)}" is invalid.\n${err.message}` 19 | ); 20 | } 21 | 22 | try { 23 | // privateDecrypt will throw an error with an invalid key 24 | crypto.privateDecrypt(key, encrypted); 25 | } catch (err) { 26 | throw new Error( 27 | `The certificate key "${chalk.yellow(keyFile)}" is invalid.\n${ 28 | err.message 29 | }` 30 | ); 31 | } 32 | } 33 | 34 | // Read file and throw an error if it doesn't exist 35 | function readEnvFile(file, type) { 36 | if (!fs.existsSync(file)) { 37 | throw new Error( 38 | `You specified ${chalk.cyan( 39 | type 40 | )} in your env, but the file "${chalk.yellow(file)}" can't be found.` 41 | ); 42 | } 43 | return fs.readFileSync(file); 44 | } 45 | 46 | // Get the https config 47 | // Return cert files if provided in env, otherwise just true or false 48 | function getHttpsConfig() { 49 | const { SSL_CRT_FILE, SSL_KEY_FILE, HTTPS } = process.env; 50 | const isHttps = HTTPS === 'true'; 51 | 52 | if (isHttps && SSL_CRT_FILE && SSL_KEY_FILE) { 53 | const crtFile = path.resolve(paths.appPath, SSL_CRT_FILE); 54 | const keyFile = path.resolve(paths.appPath, SSL_KEY_FILE); 55 | const config = { 56 | cert: readEnvFile(crtFile, 'SSL_CRT_FILE'), 57 | key: readEnvFile(keyFile, 'SSL_KEY_FILE'), 58 | }; 59 | 60 | validateKeyAndCerts({ ...config, keyFile, crtFile }); 61 | return config; 62 | } 63 | return isHttps; 64 | } 65 | 66 | module.exports = getHttpsConfig; 67 | -------------------------------------------------------------------------------- /src/components/SearchBox/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { withStyles } from '@material-ui/core/styles'; 3 | import { fade } from '@material-ui/core/styles/colorManipulator'; 4 | import MagnifyIcon from 'mdi-react/MagnifyIcon'; 5 | 6 | export default 7 | @withStyles((theme) => ({ 8 | root: { 9 | marginLeft: 15, 10 | marginRight: 15, 11 | marginTop: 25, 12 | background: theme.palette.common.white, 13 | borderRadius: 2, 14 | '&:hover': { 15 | background: fade(theme.palette.common.white, 0.9), 16 | }, 17 | }, 18 | search: { 19 | width: theme.spacing(6), 20 | height: '100%', 21 | paddingTop: 5, 22 | paddingLeft: 5, 23 | position: 'absolute', 24 | pointerEvents: 'none', 25 | alignItems: 'center', 26 | justifyContent: 'center', 27 | verticalAlign: 'text-bottom', 28 | '& svg': { 29 | fill: fade(theme.palette.common.black, 0.9), 30 | }, 31 | }, 32 | input: { 33 | width: `calc(100% - ${theme.spacing(6)}px)`, 34 | font: 'inherit', 35 | paddingTop: theme.spacing(1), 36 | paddingRight: theme.spacing(1), 37 | paddingBottom: theme.spacing(1), 38 | paddingLeft: theme.spacing(6), 39 | border: 0, 40 | display: 'block', 41 | whiteSpace: 'normal', 42 | background: 'none', 43 | margin: 0, // Reset for Safari 44 | color: fade(theme.palette.common.black, 0.5), 45 | '&:focus': { 46 | color: fade(theme.palette.common.black, 0.9), 47 | outline: 0, 48 | }, 49 | }, 50 | })) 51 | class Search extends Component { 52 | render() { 53 | const { classes, value, onChange, ...props } = this.props; 54 | 55 | return ( 56 |
57 |
58 | 59 |
60 | 70 |
71 | ); 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/components/DataTable/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { withStyles } from '@material-ui/core/styles'; 3 | import Table from '@material-ui/core/Table'; 4 | import TableBody from '@material-ui/core/TableBody'; 5 | import TableCell from '@material-ui/core/TableCell'; 6 | import TableHead from '@material-ui/core/TableHead'; 7 | import TableRow from '@material-ui/core/TableRow'; 8 | import TableSortLabel from '@material-ui/core/TableSortLabel'; 9 | 10 | @withStyles((theme) => ({ 11 | table: { 12 | marginTop: theme.spacing(3), 13 | width: '100%', 14 | overflowX: 'auto', 15 | }, 16 | })) 17 | class DataTable extends Component { 18 | handleHeaderClick = ({ target }) => { 19 | if (this.props.onHeaderClick) { 20 | this.props.onHeaderClick(target.id); 21 | } 22 | }; 23 | 24 | render() { 25 | const { 26 | classes, 27 | renderRow, 28 | sortByHeader, 29 | sortDirection, 30 | headers, 31 | items, 32 | } = this.props; 33 | const colSpan = (headers && headers.length) || 0; 34 | 35 | return ( 36 | 37 | {headers && ( 38 | 39 | 40 | {headers.map((header) => ( 41 | 42 | 47 | {header} 48 | 49 | 50 | ))} 51 | 52 | 53 | )} 54 | 55 | {items.length === 0 ? ( 56 | 57 | 58 | No items for this page. 59 | 60 | 61 | ) : ( 62 | items.map(renderRow) 63 | )} 64 | 65 |
66 | ); 67 | } 68 | } 69 | export default DataTable; 70 | -------------------------------------------------------------------------------- /src/data/fenix.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox for Android 2 | summary: Firefox for Android (internal code name "Fenix") is a browser for Android, based on Mozilla's GeckoView and Android Components. 3 | icon: target 4 | introduction: | 5 | ## About Fenix 6 | 7 | Firefox for Android (internal code name "Fenix") is a browser for Android, based on Mozilla's GeckoView and Android Components. 8 | 9 | ## How Do I Get Started? 10 | 11 | You will need a Bugzilla account. Some Fenix bugs also require a GitHub account to submit the PR. Comment in the bug to say that you are working on it, and ask any questions 12 | that you have at that time. 13 | Look at the other comments, look at the documentation and source code, and try to figure out as much as you can first. 14 | This helps you learn more about Fenix and understand better the bug you're fixing or feature you're adding. 15 | 16 | ### How Do I Write the Code? 17 | 18 | - First, follow the instructions in the [Firefox Contributors’ Quick Reference](https://firefox-source-docs.mozilla.org/contributing/contribution_quickref.html) to build the Firefox Android code on your own computer and test it in an Android emulator or device. 19 | - Start by looking for Bugzilla bugs marked with the `good-first-bug` keyword. 20 | - Comment on the bug if you would like to work on it. 21 | - When you open a pull request, please also attach a screenshot if there are UI changes, so UX can also do a visual review. 22 | - The first line of your commit messages should being with `Bug # - `, so your PR is auto-linked to the bug. 23 | 24 | ## How Do I Get Help? 25 | 26 | The best place to talk about a bug is in the comments. 27 | Don't be afraid to ask questions or describe how you are solving the problem. 28 | That way, anyone watching the bug can answer your questions or offer useful advice. 29 | Each bug has a mentor, and that person will usually be the one to reply. 30 | 31 | Join the [`#fenix:mozilla.org` channel](https://chat.mozilla.org/?#/room/#fenix:mozilla.org) on [Matrix](https://wiki.mozilla.org/Matrix) and get in contact with us. We're available Monday-Friday, during GMT and PST working hours. 32 | That's a great place to get quick help or work through bugs with Git or Kotlin. 33 | 34 | products: 35 | - Fenix 36 | - GeckoView 37 | -------------------------------------------------------------------------------- /src/images/projectIcons/rust.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/ProjectIntroductionCard/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import classNames from 'classnames'; 3 | import { withStyles } from '@material-ui/core/styles'; 4 | import Card from '@material-ui/core/Card'; 5 | import CardActions from '@material-ui/core/CardActions'; 6 | import CardContent from '@material-ui/core/CardContent'; 7 | import Typography from '@material-ui/core/Typography'; 8 | import Collapse from '@material-ui/core/Collapse'; 9 | import Button from '@material-ui/core/Button'; 10 | import Markdown from 'react-markdown'; 11 | 12 | export default 13 | @withStyles( 14 | (theme) => ({ 15 | cardAction: { 16 | position: 'absolute', 17 | bottom: 0, 18 | }, 19 | fadeout: { 20 | background: 'linear-gradient(to bottom, transparent 0%, white 42%)', 21 | right: 0, 22 | left: 0, 23 | bottom: 0, 24 | height: theme.spacing(13), 25 | position: 'absolute', 26 | }, 27 | card: { 28 | position: 'relative', 29 | }, 30 | }), 31 | { withTheme: true } 32 | ) 33 | class ProjectIntroductionCard extends Component { 34 | state = { open: false }; 35 | 36 | handleButtonClick = () => { 37 | this.setState({ 38 | open: !this.state.open, 39 | }); 40 | }; 41 | 42 | linkRenderer = (props) => ( 43 | 44 | {props.children} 45 | 46 | ); 47 | 48 | render() { 49 | const { classes, introduction, theme } = this.props; 50 | const { open } = this.state; 51 | const collapsedHeight = `${theme.spacing(28)}px`; 52 | 53 | return ( 54 | 55 | 56 | {!open &&
} 57 | 58 | 59 | {introduction} 60 | 61 | 62 | 66 | 69 | 70 | 71 | 72 | ); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/data/treeherder.yaml: -------------------------------------------------------------------------------- 1 | name: Treeherder 2 | summary: Dashboard for tracking Continous Integration builds and tests, performance data and intermittent test failures 3 | icon: pine-tree 4 | introduction: | 5 | ## About Treeherder 6 | Treeherder is a reporting dashboard for code submitted to Mozilla projects (such as the mozilla-central repository) that 7 | allows users to see the results of automatic builds and their respective tests. Treeherder also provides a set of APIs 8 | that can be used by other projects. It hosts smaller dashboards such as Perfherder, used for tracking performance data, 9 | and Intermittent Failures View, which is used to track intermittent test failures. The website can be found 10 | [here](https://treeherder.mozilla.org/). 11 | 12 | ## Who Works on Treeherder? 13 | Treeherder is composed of a small team that is distributed across the UK and the west coast of the US. 14 | 15 | ## How Do I Get Started? 16 | Select a bug in Bugzilla (we do not keep track of issues in Github, only in Bugzilla) that you'd like to work on. 17 | You may need to [create a new account](https://bugzilla.mozilla.org/createaccount.cgi). Comment in the bug or issue 18 | stating that you'd like to work on it. Please do as much research on your own first, including looking at existing 19 | bug comments and source code, before asking questions. Then follow the instructions in the Getting Started section 20 | of the [Treeherder docs](https://treeherder.readthedocs.io/index.html) to clone the Github repo and set up your local 21 | development environment. 22 | 23 | ### How Do I Write the Code? 24 | 25 | Once you have created your patch, submit a pull request with a commit message containing the bug number that you were 26 | assigned along with a description and summary of the change (example, Bug 123456 - Add breadcrumb component to clarify where users are in the app). 27 | This ensures an attachment with your patch is added to the bug in Bugzilla and your changes are clearly outlined in the Git log. 28 | Your code will need to be reviewed by one of the team members before it is merged. 29 | 30 | ## How Do I Get Help? 31 | 32 | You can ask for help in the [Matrix](https://wiki.mozilla.org/Matrix) channel `#treeherder:mozilla.org` or ask a question in the bug you'd like to work on. 33 | 34 | products: 35 | - Tree Management 36 | repositories: 37 | - mozilla/treeherder: ['good first issue', 'help wanted'] 38 | -------------------------------------------------------------------------------- /src/data/webplatform.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox - Platform (Web) 2 | summary: Web Platform consists of Networking, Layout, DOM & CSS Technology, Input Handling, and Media. 3 | icon: layers 4 | products: 5 | - Core: [ 6 | 'Audio/Video', 7 | 'Audio/Video: cubeb', 8 | 'Audio/Video: GMP', 9 | 'Audio/Video: MediaStreamGraph', 10 | 'Audio/Video: Playback', 11 | 'Audio/Video: Recording', 12 | 'CSS Parsing and Computation', 13 | 'CSS Transitions and Animations', 14 | 'DOM: Animation', 15 | 'DOM: Bindings (WebIDL)', 16 | 'DOM: Content Processes', 17 | 'DOM: Core & HTML', 18 | 'DOM: CSS Object Model', 19 | 'DOM: Device Interfaces', 20 | 'DOM: Drag & Drop', 21 | 'DOM: Editor', 22 | 'DOM: Events', 23 | 'DOM: File', 24 | 'DOM: Forms', 25 | 'DOM: HTML Parser', 26 | 'DOM: Navigation', 27 | 'DOM: Networking', 28 | 'DOM: Push Notifications', 29 | 'DOM: Security', 30 | 'DOM: Selection', 31 | 'DOM: Serializers', 32 | 'DOM: Service Workers', 33 | 'DOM: UI Events & Focus Handling', 34 | 'DOM: Web Authentication', 35 | 'DOM: Web Crypto', 36 | 'DOM: Web Payments', 37 | 'DOM: Window and Location', 38 | 'DOM: Workers', 39 | 'DOM: postMessage', 40 | 'Find Backend', 41 | 'General', 42 | 'Gecko Profiler', 43 | 'Keyboard: Navigation', 44 | 'Layout', 45 | 'Layout: Block and Inline', 46 | 'Layout: Columns', 47 | 'Layout: Flexbox', 48 | 'Layout: Floats', 49 | 'Layout: Form Controls', 50 | 'Layout: Generated Content, Lists, and Counters', 51 | 'Layout: Grid', 52 | 'Layout: Images, Video, and HTML Frames', 53 | 'Layout: Positioned', 54 | 'Layout: Ruby', 55 | 'Layout: Scrolling and Overflow', 56 | 'Layout: Tables', 57 | 'Layout: Text and Fonts', 58 | 'MathML', 59 | 'Networking', 60 | 'Networking: Cache', 61 | 'Networking: Cookies', 62 | 'Networking: DNS', 63 | 'Networking: File', 64 | 'Networking: Proxy', 65 | 'Networking: HTTP', 66 | 'Networking: JAR', 67 | 'Networking: WebSockets', 68 | 'Performance', 69 | 'Privacy: Anti-Tracking', 70 | 'Storage: IndexedDB', 71 | 'Storage: Cache API', 72 | 'Storage: QuotaManager', 73 | 'Storage: localStorage & sessionStorage', 74 | 'Storage: StorageManager', 75 | 'SVG', 76 | 'Web Audio', 77 | 'Web Painting', # XXX Should maybe be in gfx.yaml? It's half-layout / half-graphics... 78 | 'Web Replay', 79 | 'Web Speech', 80 | 'WebRTC', 81 | 'WebRTC: Audio/Video', 82 | 'WebRTC: Networking', 83 | 'WebRTC: Signaling', 84 | 'WebVR', 85 | 'XML', 86 | 'XSLT' 87 | ] 88 | -------------------------------------------------------------------------------- /src/data/spidermonkey.yaml: -------------------------------------------------------------------------------- 1 | name: SpiderMonkey 2 | summary: Get involved with SpiderMoney the JavaScript Engine team 3 | introduction: | 4 | ## About SpiderMonkey 5 | 6 | SpiderMonkey, Mozilla's JavaScript engine, is the component responsible for taking JavaScript code written by programmers, and executing it efficiently. 7 | 8 | SpiderMonkey is broken into a number of pieces: 9 | 10 | * **The core JavaScript engine**: Defines the most basic pieces of JavaScript, like the interpreter, data types, the parser etc. 11 | * **The JavaScript standard library**: These are all the extra pieces of JavaScript that make it the language people know as JavaScript. 12 | * **The JIT compilers**: SpiderMonkey has two JIT compilers, Baseline and IonMonkey which work in concert to provide fast execution of JavaScript quickly. 13 | 14 | ## How do I get Started 15 | 16 | To help you get started, you will want to: 17 | 18 | * Have a checkout of the Firefox source code 19 | * Make sure you can build and test [SpiderMonkey](https://firefox-source-docs.mozilla.org/js/build.html) 20 | * Understand [the basics of using Mercurial](https://mozilla-version-control-tools.readthedocs.io/en/latest/hgmozilla/firefoxworkflow.html) 21 | * Understand [how to submit a patch](https://docs.firefox-dev.tools/contributing/making-prs.html) 22 | * Read [this walkthrough](https://moz-conduit.readthedocs.io/en/latest/walkthrough.html) about how development works in Firefox. 23 | 24 | If you are working on a bug (in Bugzilla), you may need to [create a new account](https://bugzilla.mozilla.org/createaccount.cgi). 25 | 26 | Comment in the bug or issue to say that you are working on it, and ask any questions that you have at that time. People who work on SpiderMonkey are available on [Matrix](https://chat.mozilla.org) in the `#spidermonkey` channel, which can be a good way to get help. Please feel free to say 'Hi' 27 | 28 | We really appreciate it if you've done some of your own research: 29 | Look the other comments, look at the documentation and source code, and try to figure out as much as you can first. Don't worry if it isn't all clear though. SpiderMonkey is a complicated piece of software. 30 | 31 | ### Other Useful Links: 32 | 33 | * [New to SpiderMonkey](https://wiki.mozilla.org/JavaScript:New_to_SpiderMonkey) 34 | 35 | 36 | products: 37 | - Core: ['JavaScript Engine', 'JavaScript Engine: JIT', 'JavaScript: GC', 'JavaScript: Internationalization API', 'JavaScript: Standard Library', 'js-ctypes', 'XPConnect'] 38 | -------------------------------------------------------------------------------- /src/components/ProjectCard/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { withStyles } from '@material-ui/core/styles'; 3 | import { Link } from 'react-router-dom'; 4 | import Card from '@material-ui/core/Card'; 5 | import CardContent from '@material-ui/core/CardContent'; 6 | import Typography from '@material-ui/core/Typography'; 7 | import Markdown from 'react-markdown'; 8 | import ProjectIcon from '../ProjectIcon'; 9 | 10 | export default 11 | @withStyles((theme) => ({ 12 | card: { 13 | textAlign: 'center', 14 | position: 'relative', 15 | width: '100%', 16 | height: '100%', 17 | boxShadow: '0 1px 4px 0 rgba(0, 0, 0, 0.25)', 18 | minHeight: 250, 19 | '&:hover, &:focus': { 20 | transform: 'scale(1.05)', 21 | boxShadow: `0 1px 4px 0 ${theme.palette.primary.light}`, 22 | }, 23 | }, 24 | textAlign: { 25 | textAlign: 'center', 26 | }, 27 | projectSummary: { 28 | fontWeight: 300, 29 | padding: theme.spacing(2), 30 | }, 31 | projectIcon: { 32 | color: theme.palette.secondary.dark, 33 | }, 34 | link: { 35 | textDecoration: 'none', 36 | }, 37 | })) 38 | class ProjectCard extends Component { 39 | handleSummaryClick = (event) => { 40 | if (event.target.href) { 41 | event.stopPropagation(); 42 | } 43 | }; 44 | 45 | linkRenderer = (props) => ( 46 | 47 | {props.children} 48 | 49 | ); 50 | 51 | render() { 52 | const { 53 | classes, 54 | project: { icon, name, summary, fileName }, 55 | } = this.props; 56 | 57 | return ( 58 | 59 | 60 | 61 | 62 | 63 | {name} 64 | 65 | {summary && ( 66 | 72 | {summary} 73 | 74 | )} 75 | 76 | 77 | 78 | ); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/components/ErrorPanel/index.jsx: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import classNames from 'classnames'; 3 | import Markdown from 'react-markdown'; 4 | import { withStyles } from '@material-ui/core/styles'; 5 | import Accordion from '@material-ui/core/Accordion'; 6 | import AccordionDetails from '@material-ui/core/AccordionDetails'; 7 | import AccordionSummary from '@material-ui/core/AccordionSummary'; 8 | import Paper from '@material-ui/core/Paper'; 9 | import ChevronDownIcon from 'mdi-react/ChevronDownIcon'; 10 | import ErrorBox from './ErrorBox'; 11 | 12 | export default 13 | @withStyles((theme) => ({ 14 | paper: { 15 | padding: `0 ${theme.spacing(2)}px`, 16 | display: 'flex', 17 | justifyContent: 'space-between', 18 | }, 19 | pad: { 20 | paddingTop: 9, 21 | paddingBottom: 9, 22 | }, 23 | error: { 24 | backgroundColor: theme.palette.error.main, 25 | borderColor: theme.palette.error.light, 26 | marginBottom: theme.spacing(1), 27 | '& svg': { 28 | fill: theme.palette.common.white, 29 | }, 30 | }, 31 | disabled: { 32 | opacity: 1, 33 | }, 34 | heading: { 35 | fontSize: theme.typography.pxToRem(15), 36 | fontWeight: theme.typography.fontWeightRegular, 37 | }, 38 | errorText: { 39 | color: theme.palette.common.white, 40 | }, 41 | })) 42 | /** 43 | * Render an error in a panel. Will be expandable display stack traces 44 | * when in development 45 | */ 46 | class ErrorPanel extends Component { 47 | render() { 48 | const { classes, error } = this.props; 49 | const showStack = 50 | process.env.NODE_ENV === 'development' && error instanceof Error; 51 | const markdown = ( 52 | 56 | {typeof error === 'string' ? error : error.message} 57 | 58 | ); 59 | 60 | if (!showStack) { 61 | return ( 62 | 63 | {markdown} 64 | 65 | ); 66 | } 67 | 68 | return ( 69 | 70 | }> 73 | {markdown} 74 | 75 | 76 | 77 | 78 | 79 | ); 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /src/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/data/firefox-focus.yaml: -------------------------------------------------------------------------------- 1 | name: Firefox Focus 2 | summary: Firefox Focus is a privacy-focused browser from Mozilla, available for the Apple iPhone, iPad, iPod touch mobile devices and Android smartphones and tablets. 3 | introduction: | 4 | ## About Firefox Focus 5 | 6 | Firefox Focus is a privacy-focused browser from Mozilla, available for the Apple iPhone, iPad, iPod touch mobile devices and Android smartphones and tablets. 7 | 8 | ## How Do I Get Started? 9 | 10 | You will need a Github account. Comment in the bug or issue to say that you are working on it, and ask any questions 11 | that you have at that time. But do your research! 12 | Look the other comments, look at the documentation and source code, and try to figure out as much as you can first. 13 | This helps you learn more about Focus and understand better the bug you're fixing or feature you're adding. 14 | 15 | ### How Do I Write the Code? 16 | 17 | - Start by looking for issues marked with the `good first issue` label 18 | - You can find more challenging issues marked with the `help wanted` label 19 | - Join the `#focus-android:mozilla.org` or `#focus-ios:mozilla.org` channels on [Matrix](https://wiki.mozilla.org/Matrix) and get in contact with us. We're available Monday-Friday, during GMT and PST working hours. 20 | - Comment on the issue if you would like to work on it. 21 | - If you want to work on a new feature then always file an issue first so that all teams (product, ux, engineering) can comment on it and so that it can be assigned to a milestone. Pull requests for unsolicited features are unlikely to get merged. 22 | - When you open a pull request, please also include a screenshot if there are UI changes, so UX can also do a visual review. 23 | - Include a `Closes #` as part of your first commit message so it's auto-linked to the issue. 24 | 25 | ## How Do I Get Help? 26 | 27 | The best place to talk about an issue is in the comments. 28 | Don't be afraid to ask questions or describe how you are solving the problem. 29 | That way, anyone watching the bug can answer your questions or offer useful advice. 30 | Each issue has a mentor, and that person will usually be the one to reply. 31 | 32 | We are also available in the the `#focus-android:mozilla.org` or `#focus-ios:mozilla.org` channels on [Matrix](https://wiki.mozilla.org/Matrix). 33 | That's a great place to get quick help or work through issues with Git, Swift, or Java. 34 | repositories: 35 | - mozilla-mobile/focus-android: ['good first issue', 'help wanted'] 36 | - mozilla-mobile/focus-ios: ['good first issue', 'help wanted'] 37 | -------------------------------------------------------------------------------- /src/images/projectIcons/servo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /config/paths.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const path = require('path'); 4 | const fs = require('fs'); 5 | const getPublicUrlOrPath = require('react-dev-utils/getPublicUrlOrPath'); 6 | 7 | // Make sure any symlinks in the project folder are resolved: 8 | // https://github.com/facebook/create-react-app/issues/637 9 | const appDirectory = fs.realpathSync(process.cwd()); 10 | const resolveApp = relativePath => path.resolve(appDirectory, relativePath); 11 | 12 | // We use `PUBLIC_URL` environment variable or "homepage" field to infer 13 | // "public path" at which the app is served. 14 | // webpack needs to know it to put the right