fix: remove all extraneous env vars (#39443)

pull/39445/head
Mrugesh Mohapatra 2020-08-21 03:59:27 +05:30 committed by GitHub
parent cdc1a63ca8
commit 33de8a03b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 54 additions and 285 deletions

View File

@ -14,8 +14,6 @@ const {
API_LOCATION: api,
FORUM_LOCATION: forum,
NEWS_LOCATION: news,
FORUM_PROXY: forumProxy,
NEWS_PROXY: newsProxy,
LOCALE: locale,
STRIPE_PUBLIC_KEY: stripePublicKey,
SERVICEBOT_ID: servicebotId,
@ -29,9 +27,7 @@ const locations = {
homeLocation: home,
apiLocation: api,
forumLocation: forum,
newsLocation: news,
forumProxy: forumProxy,
newsProxy: newsProxy
newsLocation: news
};
module.exports = Object.assign(locations, {

View File

@ -1,57 +1,73 @@
COMPOSE_PROJECT_NAME=freecodecamp
# ---------------------
# API
# ---------------------
# Database
MONGOHQ_URL='mongodb://localhost:27017/freecodecamp'
ALGOLIA_ADMIN_KEY=123abc
ALGOLIA_APP_ID=X5V7KWJ4RB
ALGOLIA_API_KEY=a45d2b80c97479bbda5cf5c55914230f
# Logging
SENTRY_DSN=dsn_from_sentry_dashboard
SENTRY_ENVIRONMENT='staging'
AUTH0_CLIENT_ID=stuff
AUTH0_CLIENT_SECRET=stuff
AUTH0_DOMAIN=stuff
# Auth0 - OAuth 2.0 Credentials
AUTH0_CLIENT_ID=client_id_from_auth0_dashboard
AUTH0_CLIENT_SECRET=client_secret_from_auth0_dashboard
AUTH0_DOMAIN=example.auth0.com
SESSION_SECRET=secretstuff
COOKIE_SECRET='this is a secret'
JWT_SECRET='a very long secret'
# Session, Cookie and JWT encryption strings
SESSION_SECRET=a_session_secret
COOKIE_SECRET=a_cookie_secret
JWT_SECRET=a_jwt_secret
# ---------------------
# Search
# ---------------------
# Indexing
ALGOLIA_ADMIN_KEY=admin_key_from_algolia_dashboard
GHOST_CLIENT_KEY=client_key_from_ghost_dashboard
# Client Search Bar
ALGOLIA_APP_ID=app_id_from_algolia_dashboard
ALGOLIA_API_KEY=api_key_from_algolia_dashboard
# ---------------------
# Donations
# ---------------------
# Stripe
STRIPE_CREATE_PLANS=true
STRIPE_PUBLIC_KEY=pk_from_stripe_dashboard
STRIPE_SECRET_KEY=sk_from_stripe_dashboard
SERVICEBOT_ID=servicebot_id_from_servicebot_dashboard
SERVICEBOT_HMAC_SECRET_KEY=secret_key_from_servicebot_dashboard
# PayPal
PAYPAL_SUPPORTERS=1703
PAYPAL_CLIENT_ID=id_from_paypal_dashboard
PAYPAL_SECRET=secret_from_paypal_dashboard
PAYPAL_VERIFY_WEBHOOK_URL='https://api.sandbox.paypal.com/v1/notifications/verify-webhook-signature'
PAYPAL_API_TOKEN_URL='https://api.sandbox.paypal.com/v1/oauth2/token'
PAYPAL_WEBHOOK_ID=webhook_id_from_paypal_dashboard
# ---------------------
# Build variants
# ---------------------
DEPLOYMENT_ENV='staging'
PEER=stuff
DEBUG=true
LOCAL_MOCK_AUTH=true
IMAGE_BASE_URL='https://s3.amazonaws.com/freecodecamp/images/'
FREECODECAMP_NODE_ENV='development'
# Language to build
LOCALE=english
# Show or hide WIP in progress challenges
SHOW_HIDDEN=true
# Application paths
HOME_LOCATION='http://localhost:8000'
API_LOCATION='http://localhost:3000'
FORUM_LOCATION='https://localhost/forum'
NEWS_LOCATION='https://localhost/news'
FORUM_PROXY='https://forum.localhost'
NEWS_PROXY='https://news.localhost'
# You can get a webhook proxy url from smee.io
# ---------------------
# Debugging Mode Keys
# ---------------------
PEER=stuff
DEBUG=true
LOCAL_MOCK_AUTH=true
# Webhook proxy url from smee.io for PayPal
WEBHOOK_PROXY_URL=''
LOCALE=english
# Docker Setup
DOCKER_HOST_LOCATION=localhost
GHOST_CLIENT_KEY=123abc
SENTRY_DSN=dsn_from_sentry_dashboard
SENTRY_ENVIRONMENT='staging'
# Set this to false to see what the production site will contain
SHOW_HIDDEN=true
COMPOSE_PROJECT_NAME=freecodecamp

View File

@ -1,73 +0,0 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`createRedirects matches the snapshot 1`] = `
"
#
# WARNING: The order of this list is very important.
#
# domain mappings
https://freecodecamp-dev.netlify.com/* https://www.freecodecamp.dev/:splat 301!
https://freecodecamp-org.netlify.com/* https://www.freecodecamp.org/:splat 301!
# pages
/about https://news.example.com/about 200
/academic-honesty https://news.example.com/academic-honesty 200
/code-of-conduct https://news.example.com/code-of-conduct 200
/copyright https://news.example.com/copyright-policy 200
/copyright-policy https://news.example.com/copyright-policy 200
/privacy https://news.example.com/privacy-policy 200
/privacy-policy https://news.example.com/privacy-policy 200
/shop https://news.example.com/shop 200
/software-resources-for-nonprofits https://news.example.com/software-resources-for-nonprofits 200
/sponsors https://news.example.com/sponsors 200
/support https://news.example.com/support 200
/terms https://news.example.com/terms-of-service 200
/terms-of-service https://news.example.com/terms-of-service 200
# applications
/forum/* https://forum.example.com/:splat 200
/news https://news.example.com/ 200
/news/* https://news.example.com/:splat 200
# auth redirects
/deprecated-signin https://api.example.com/signin 200!
/email-signin https://api.example.com/signin 200!
/login https://api.example.com/signin 200!
/logout https://api.example.com/signout 200!
/passwordless-change https://api.example.com/confirm-email 200!
/signin https://api.example.com/signin 200!
/signup https://api.example.com/signin 200!
# certification redirects
/:username/front-end-certification /certification/:username/legacy-front-end 301
/:username/data-visualization-certification /certification/:username/legacy-data-visualization 301
/:username/back-end-certification /certification/:username/legacy-back-end 301
/:username/full-stack-certification /certification/:username/full-stack 301
# unsubscribe redirects
/u/* https://api.example.com/u/:splat 200!
/ue/* https://api.example.com/ue/:splat 200!
/unsubscribe/* https://api.example.com/unsubscribe/:splat 200!
# misc redirects
/agile / 301
/all-stories / 301
/chat https://gitter.im/FreeCodeCamp/FreeCodeCamp 301
/donation/settings /donate 302
/field-guide/* / 301
/how-nonprofit-projects-work / 301
/learn-to-code /learn 301
/map /learn 200
/nonprofit-project-instructions / 301
/Nonprofits / 301
/nonprofits / 301
/nonprofits-form / 301
/pmi-acp-agile-project-managers / 301
/pmi-acp-agile-project-managers-form / 301
/stories / 301
/twitch https://twitch.tv/freecodecamp 301
/welcome / 200
"
`;

View File

@ -1,94 +0,0 @@
const apiPlaceholderRE = /#\{\{API\}\}/g;
const newsPlaceholderRE = /#\{\{NEWS\}\}/g;
const forumPlaceholderRE = /#\{\{FORUM\}\}/g;
exports.createRedirects = function createRedirects(locations) {
const { api, newsProxy, forumProxy } = locations;
if (!(api && newsProxy && forumProxy)) {
throw new Error(`One or more locations are missing, all are required.
api: ${api}
newsProxy: ${newsProxy}
forumProxy: ${forumProxy}
`);
}
return template
.replace(apiPlaceholderRE, api)
.replace(newsPlaceholderRE, newsProxy)
.replace(forumPlaceholderRE, forumProxy);
};
/* eslint-disable max-len */
const template = `
#
# WARNING: The order of this list is very important.
#
# domain mappings
https://freecodecamp-dev.netlify.com/* https://www.freecodecamp.dev/:splat 301!
https://freecodecamp-org.netlify.com/* https://www.freecodecamp.org/:splat 301!
# pages
/about #{{NEWS}}/about 200
/academic-honesty #{{NEWS}}/academic-honesty 200
/code-of-conduct #{{NEWS}}/code-of-conduct 200
/copyright #{{NEWS}}/copyright-policy 200
/copyright-policy #{{NEWS}}/copyright-policy 200
/privacy #{{NEWS}}/privacy-policy 200
/privacy-policy #{{NEWS}}/privacy-policy 200
/shop #{{NEWS}}/shop 200
/software-resources-for-nonprofits #{{NEWS}}/software-resources-for-nonprofits 200
/sponsors #{{NEWS}}/sponsors 200
/support #{{NEWS}}/support 200
/terms #{{NEWS}}/terms-of-service 200
/terms-of-service #{{NEWS}}/terms-of-service 200
# applications
/forum/* #{{FORUM}}/:splat 200
/news #{{NEWS}}/ 200
/news/* #{{NEWS}}/:splat 200
# auth redirects
/deprecated-signin #{{API}}/signin 200!
/email-signin #{{API}}/signin 200!
/login #{{API}}/signin 200!
/logout #{{API}}/signout 200!
/passwordless-change #{{API}}/confirm-email 200!
/signin #{{API}}/signin 200!
/signup #{{API}}/signin 200!
# certification redirects
/:username/front-end-certification /certification/:username/legacy-front-end 301
/:username/data-visualization-certification /certification/:username/legacy-data-visualization 301
/:username/back-end-certification /certification/:username/legacy-back-end 301
/:username/full-stack-certification /certification/:username/full-stack 301
# unsubscribe redirects
/u/* #{{API}}/u/:splat 200!
/ue/* #{{API}}/ue/:splat 200!
/unsubscribe/* #{{API}}/unsubscribe/:splat 200!
# misc redirects
/agile / 301
/all-stories / 301
/chat https://gitter.im/FreeCodeCamp/FreeCodeCamp 301
/donation/settings /donate 302
/field-guide/* / 301
/how-nonprofit-projects-work / 301
/learn-to-code /learn 301
/map /learn 200
/nonprofit-project-instructions / 301
/Nonprofits / 301
/nonprofits / 301
/nonprofits-form / 301
/pmi-acp-agile-project-managers / 301
/pmi-acp-agile-project-managers-form / 301
/stories / 301
/twitch https://twitch.tv/freecodecamp 301
/welcome / 200
`;
/* eslint-enable max-len */

View File

@ -1,58 +0,0 @@
/* global describe expect it */
const { createRedirects } = require('./create-redirects');
const testLocations = {
api: 'https://api.example.com',
newsProxy: 'https://news.example.com',
forumProxy: 'https://forum.example.com'
};
describe('createRedirects', () => {
it('is a function', () => {
expect(typeof createRedirects).toEqual('function');
});
it('returns a string', () => {
expect(typeof createRedirects(testLocations)).toEqual('string');
});
it('replaces instances of `#{{...}}` with the locations provided', () => {
expect.assertions(4);
const apiPlaceholderRE = /#\{\{API\}\}/;
const newsPlaceholderRE = /#\{\{NEWS\}\}/;
const forumPlaceholderRE = /#\{\{FORUM\}\}/;
const redirects = createRedirects(testLocations);
const hasApiPlaceholder = apiPlaceholderRE.test(redirects);
const hasNewsPlaceholder = newsPlaceholderRE.test(redirects);
const hasForumPlaceholder = forumPlaceholderRE.test(redirects);
expect(hasApiPlaceholder).toBe(false);
expect(hasNewsPlaceholder).toBe(false);
expect(hasForumPlaceholder).toBe(false);
const { forumProxy } = testLocations;
expect(redirects.includes(`${forumProxy}`)).toBe(true);
});
it('throws when any location is missing', () => {
expect.assertions(3);
const api = 'api';
const newsProxy = 'newsProxy';
const forumProxy = 'forumProxy';
const noApi = { forumProxy, newsProxy };
const noNews = { api, forumProxy };
const noForum = { api, newsProxy };
expect(() => createRedirects(noApi)).toThrow();
expect(() => createRedirects(noNews)).toThrow();
expect(() => createRedirects(noForum)).toThrow();
});
it('matches the snapshot', () =>
expect(createRedirects(testLocations)).toMatchSnapshot());
});

View File

@ -2,36 +2,18 @@ const fs = require('fs');
const path = require('path');
const debug = require('debug');
const env = require('../../../config/env');
const log = debug('fcc:tools:ensure-env');
const env = require('../../../config/env');
const { getChallengesForLang } = require('../../../curriculum/getChallenges');
const { createPathMigrationMap } = require('../seed/createPathMigrationMap');
const { createRedirects } = require('./create-redirects');
const log = debug('fcc:tools:ensure-env');
const { FREECODECAMP_NODE_ENV } = process.env;
const { apiLocation: api, locale, forumProxy, newsProxy } = env;
const apiPath = path.resolve(__dirname, '../../../api-server');
const clientPath = path.resolve(__dirname, '../../../client');
const clientStaticPath = path.resolve(clientPath, 'static');
const globalConfigPath = path.resolve(__dirname, '../../../config');
if (FREECODECAMP_NODE_ENV === 'production') {
const redirects = createRedirects({ api, newsProxy, forumProxy });
fs.writeFile(`${clientStaticPath}/_redirects`, redirects, function(err) {
if (err) {
log('Error');
console.error(err);
}
log('_redirects written');
});
} else {
log(`ignoring creation of redirect file in ${FREECODECAMP_NODE_ENV}`);
}
const { FREECODECAMP_NODE_ENV } = process.env;
const { locale } = env;
const migrationMapPath = `${apiPath}/server/resources/pathMigration.json`;
fs.access(migrationMapPath, err => {