Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stage-main Release candidate 10.1 #1942

Merged
merged 102 commits into from
Apr 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
4dfd3a8
fix the flexbox css properties to align the navigationTitle correctly
stefanhayden Dec 3, 2020
17fe894
Merge remote-tracking branch 'upstream/main' into navigationTitle-ali…
stefanhayden Feb 8, 2021
83b2b3b
When opening the script editor the cursor should be at the end of the…
stefanhayden Feb 10, 2021
03031b7
WIP everything is broken and nothing works
stefanhayden Feb 17, 2021
7a9175a
Remove the yellow badge from the summary so texters do not think they…
stefanhayden Feb 17, 2021
f6b1412
Since we don't show a badge for these we don't need the styles any more
stefanhayden Feb 18, 2021
4cee486
Update UTs. Update message if variable is 0 or undefined.
stefanhayden Feb 18, 2021
bd0c547
WIP. so much is broken
stefanhayden Feb 19, 2021
7694d72
clean up form.submit and GSSubmitButton
stefanhayden Feb 20, 2021
1a8bc2b
cleanup
stefanhayden Feb 20, 2021
bbd47c9
fix for uncontroled error from react
stefanhayden Feb 21, 2021
a3885c1
working on UTs
stefanhayden Feb 21, 2021
02524ee
UTs
stefanhayden Feb 21, 2021
991b5ef
UTs
stefanhayden Feb 21, 2021
dc721b8
skip this test for the moment
stefanhayden Feb 21, 2021
2316bce
CLeanup
stefanhayden Feb 21, 2021
9f3cc92
cleanup
stefanhayden Feb 21, 2021
b8139b4
wip
stefanhayden Feb 23, 2021
8bea95e
form cleanup and chartjs remove
stefanhayden Feb 23, 2021
f62797f
Clean up chart js
stefanhayden Feb 25, 2021
ed061d2
cleanup
stefanhayden Feb 25, 2021
9ec4c8f
Merge remote-tracking branch 'upstream/main' into sh/react-and-everyt…
stefanhayden Feb 25, 2021
d18ac59
fixing more form fields
stefanhayden Feb 25, 2021
711b1ae
cleanup
stefanhayden Feb 25, 2021
ed73f02
cleanup
stefanhayden Feb 25, 2021
a8da011
more <Form.Fields
stefanhayden Feb 25, 2021
fabba82
Bump Auth0 Lock to v11.28
marzvrover Feb 27, 2021
fbd8f16
fix people search when text filter is ANY
schuyler1d Mar 4, 2021
d4fff4a
people search oops: not role=any should filter role
schuyler1d Mar 4, 2021
dd4dba6
Upgrade uglifyjs-webpack-plugin to max 1.3.0
stefanhayden Mar 5, 2021
5b5eae8
missing GSTextField import
stefanhayden Mar 5, 2021
2167db6
trying to get cypress to pass
stefanhayden Mar 5, 2021
2ee3efc
allow data-test attr on raisedButton
stefanhayden Mar 5, 2021
24daff2
Love me cypress. I'm so nice.
stefanhayden Mar 5, 2021
772501a
click the button
stefanhayden Mar 5, 2021
0696833
but really. click the button
stefanhayden Mar 5, 2021
f584c7a
more people search oops
schuyler1d Mar 5, 2021
b987bd0
Merge remote-tracking branch 'stefanhayden/sh/react-and-everything-up…
schuyler1d Mar 5, 2021
0850841
react upgrade: move uglify to prod deps and hot-loader just for dev
schuyler1d Mar 5, 2021
9237c9a
Remove old react formal hack and fix texter manual assignment for Rea…
ibrand Mar 5, 2021
8fa2e0f
Merge remote-tracking branch 'origin/sh/react-and-everything-upgrade'…
schuyler1d Mar 5, 2021
2412439
Merge remote-tracking branch 'stefanhayden/sh/react-and-everything-up…
schuyler1d Mar 5, 2021
0f73954
react upgrade: move uglify to prod deps and hot-loader just for dev
schuyler1d Mar 5, 2021
7f71559
Remove old react formal hack and fix texter manual assignment for Rea…
ibrand Mar 5, 2021
d1bcffa
Fix button
stefanhayden Mar 10, 2021
47f46ac
fix cypress tests
stefanhayden Mar 10, 2021
23c42bf
Merge branch 'sh/react-and-everything-upgrade' of https://github.com/…
schuyler1d Mar 10, 2021
c77b286
Merge remote-tracking branch 'origin/sh/react-and-everything-upgrade'…
schuyler1d Mar 10, 2021
166599f
Merge branch 'sh/react-and-everything-upgrade' into stage-main-10-1
schuyler1d Mar 10, 2021
b4f7e40
Merge remote-tracking branch 'stefanhayden/stefan-scriptEditor-cursor…
schuyler1d Mar 10, 2021
e38313d
Merge remote-tracking branch 'stefanhayden/sh/no-yellow-badges' into …
schuyler1d Mar 10, 2021
e423512
Merge remote-tracking branch 'marzvrover/main' into stage-main-10-1
schuyler1d Mar 10, 2021
c05031c
Merge remote-tracking branch 'stefanhayden/navigationTitle-alignment'…
schuyler1d Mar 10, 2021
d6b8c80
Merge remote-tracking branch 'origin/main' into stage-main-10-1
schuyler1d Mar 10, 2021
96435a3
correctly use autocomplete with react-formal
stefanhayden Mar 16, 2021
be36357
action-handler mobilecommons-signup: support UMC_FIELDS for external_…
schuyler1d Mar 17, 2021
6dbc19a
remove console.log
schuyler1d Mar 17, 2021
2146886
campaign texting hours: change autocomplete=> menu fields as autocomp…
schuyler1d Mar 18, 2021
f7b544a
campaign after start: show contact load results
schuyler1d Mar 19, 2021
360f63d
Merge branch 'react-texting-hours' into stage-main-10-1b
schuyler1d Mar 19, 2021
753e5ee
merge campaign-contacts-results into stage-main-10-1
schuyler1d Mar 19, 2021
bfdee4f
Merge remote-tracking branch 'origin/mobilecommons-extrafields' into …
schuyler1d Mar 19, 2021
a08bf7a
typo: type.object
schuyler1d Mar 19, 2021
c0e8139
Merge remote-tracking branch 'origin/campaign-contacts-results' into …
schuyler1d Mar 19, 2021
f236dfa
typo: addFormField
schuyler1d Mar 19, 2021
0323438
Merge remote-tracking branch 'origin/react-texting-hours' into stage-…
schuyler1d Mar 19, 2021
466d804
allow file to be empty
schuyler1d Mar 19, 2021
626f515
Merge remote-tracking branch 'origin/campaign-contacts-results' into …
schuyler1d Mar 19, 2021
c4a46da
mobilize event shifter – fix filling in custom fields & zip
codygordon Mar 20, 2021
64c70e4
Merge branch 'main' of github.com:MoveOnOrg/Spoke into main
codygordon Mar 22, 2021
79ac765
campaign export all contacts even w/o assignment
codygordon Mar 22, 2021
2568c95
message review table overflow visible for long tags / truncate tags
codygordon Mar 23, 2021
62d28de
add a "saving" dialog to feedback to hide convo navigation
codygordon Mar 24, 2021
4108ec7
actually use custom feedback config items
codygordon Mar 24, 2021
ba1a77e
infill org-level feedback config if none on campaign is entered
codygordon Mar 24, 2021
7cee881
Update package.json
Frydafly Mar 25, 2021
1caea05
Update HOWTO_DEPLOYING_AWS_LAMBDA.md
Frydafly Mar 25, 2021
92184a5
implement ability to also suppress tags in msg review
codygordon Mar 28, 2021
06cd6e9
supply Apollo client singleton, because this is failing in UserEditDi…
schuyler1d Mar 30, 2021
8bebe6a
Merge remote-tracking branch 'origin/main' into stage-main-10-1
schuyler1d Mar 30, 2021
9e6067e
Merge remote-tracking branch 'origin/react-texting-hours' into stage-…
schuyler1d Mar 30, 2021
2641aa4
Merge branch 'stage-main-10-1' into stage-main-10-1b
schuyler1d Mar 30, 2021
81fa5f6
Merge remote-tracking branch 'wfp/export-all-contacts' into stage-mai…
schuyler1d Mar 30, 2021
5e1ed02
Merge remote-tracking branch 'wfp/assignment-feedback-fixes' into sta…
schuyler1d Mar 30, 2021
1505fc8
Merge remote-tracking branch 'wfp/suppress-tags' into stage-main-10-1c
schuyler1d Mar 30, 2021
1854cf8
Merge remote-tracking branch 'wfp/feedback-config' into stage-main-10-1c
schuyler1d Mar 30, 2021
aaa7730
Merge remote-tracking branch 'origin/Frydafly-patch-s3cmd-to-aws-cli'…
schuyler1d Mar 30, 2021
11aa3c4
Merge remote-tracking branch 'wfp/mobilize-shifter-fixes' into stage-…
schuyler1d Mar 30, 2021
bf7a5f7
Merge remote-tracking branch 'wfp/tag-overflow' into stage-main-10-1c
schuyler1d Mar 30, 2021
4036165
fix ActionHandler menu selection
schuyler1d Mar 31, 2021
ce19eda
react+react-formal upgrade: AutoComplete field does not fully work wi…
schuyler1d Apr 5, 2021
9501c5a
merge after react + react-formal upgrade fix in CampaignInteractionSt…
schuyler1d Apr 5, 2021
2a06304
fix typo
schuyler1d Apr 5, 2021
61675f8
Merge remote-tracking branch 'origin/react-texting-hours' into stage-…
schuyler1d Apr 5, 2021
ed7a31b
react-formal upgrade: fix GSTextField import
schuyler1d Apr 7, 2021
c63e732
Merge remote-tracking branch 'origin/react-texting-hours' into stage-…
schuyler1d Apr 7, 2021
57968ac
texter todos: gather unassigned checks into a single query instead of…
schuyler1d Apr 8, 2021
89472fe
fix: memoize slow ~20ms hot-path timezone check which was called ~100…
schuyler1d Apr 8, 2021
d30ae8d
Merge remote-tracking branch 'origin/memoize-timezonedst' into stage-…
schuyler1d Apr 8, 2021
1fe295e
Merge remote-tracking branch 'origin/todos-bulkunassignedquery' into …
schuyler1d Apr 8, 2021
ab7e624
bug: campaignOffsets needs to be split/integered w/ dst; turning off …
schuyler1d Apr 9, 2021
15436cd
Merge remote-tracking branch 'origin/memoize-timezonedst' into stage-…
schuyler1d Apr 9, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion .babelrc
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,10 @@
"polyfill": false,
"regenerator": true
}]
]
],
"env": {
"dev": {
"plugins":["react-hot-loader/babel"]
}
}
}
28 changes: 13 additions & 15 deletions __test__/components/AssignmentSummary.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import React from "react";
import { mount } from "enzyme";
import { StyleSheetTestUtils } from "aphrodite";
import injectTapEventPlugin from "react-tap-event-plugin";
import each from "jest-each";
import MuiThemeProvider from "material-ui/styles/MuiThemeProvider";
import { ApolloProvider } from "react-apollo";
Expand Down Expand Up @@ -80,7 +79,6 @@ describe("AssignmentSummary text", function t() {
});

describe("AssignmentSummary actions inUSA and NOT AllowSendAll", () => {
injectTapEventPlugin(); // prevents warning
function create(
unmessaged,
unreplied,
Expand Down Expand Up @@ -170,16 +168,20 @@ describe("AssignmentSummary actions inUSA and NOT AllowSendAll", () => {
const actions = create(0, 0, 0, 9, 0, false);
expect(
actions
.find(Badge)
.find(RaisedButton)
.at(0)
.prop("badgeContent")
).toBe(9);
.prop("label")
).toBe("Past 9 Messages");
});

it('renders "skipped messages (n)" with messaged', () => {
const actions = create(0, 0, 0, 0, 8, false);
expect(
actions
.find(RaisedButton)
.at(0)
.prop("label")
).toBe("Past Messages");
).toBe("Skipped 8 Messages");
});
});

Expand Down Expand Up @@ -242,7 +244,8 @@ it('renders "Send later" when there is a badTimezoneCount', () => {
unmessagedCount: 0,
unrepliedCount: 0,
badTimezoneCount: 4,
skippedMessagesCount: 0
skippedMessagesCount: 0,
pastMessagesCount: 0
}
})}
/>
Expand All @@ -251,28 +254,23 @@ it('renders "Send later" when there is a badTimezoneCount', () => {
expect(
actions
.find(Badge)
.at(1)
.at(0)
.prop("badgeContent")
).toBe(4);
expect(
actions
.find(RaisedButton)
.at(0)
.prop("label")
).toBe("Past Messages");
expect(
actions
.find(RaisedButton)
.at(1)
.prop("label")
).toBe("Send messages");
).toBe("Send later (outside timezone)");
});

describe("contacts filters", () => {
// These are an attempt to confirm that the buttons will work.
// It would be better to simulate clicking them, but I can't
// get it to work right now because of 'react-tap-event-plugin'
// some hints are here https://github.com/mui-org/material-ui/issues/4200#issuecomment-217738345
// 'react-tap-event-plugin' was depricated

it("filters correctly in USA", () => {
window.NOT_IN_USA = 0;
Expand Down
72 changes: 46 additions & 26 deletions __test__/components/CampaignInteractionStepsForm.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import { r } from "../../src/server/models";
import { StyleSheetTestUtils } from "aphrodite";
import MuiThemeProvider from "material-ui/styles/MuiThemeProvider";
import { Card, CardHeader } from "material-ui/Card";
import GSTextField from "../../src/components/forms/GSTextField";
import GSScriptField from "../../src/components/forms/GSScriptField";
import CampaignInteractionStepsForm from "../../src/components/CampaignInteractionStepsForm";
import CampaignFormSectionHeading from "../../src/components/CampaignFormSectionHeading";
import {
Expand Down Expand Up @@ -76,23 +78,14 @@ describe("CampaignInteractionStepsForm", () => {
);

const interactionSteps = getInteractionSteps();
const scripts = component
.findWhere(
x => x.length && x.props()["data-test"] === "editorInteraction"
)
.hostNodes();
const scripts = component.find(GSScriptField);

expect(scripts.at(0).props().value).toEqual(interactionSteps[0].script);
});

it("rendered all the interaction steps", () => {
const interactionSteps = getInteractionSteps().map(step => step.script);

const scripts = component
.findWhere(
x => x.length && x.props()["data-test"] === "editorInteraction"
)
.hostNodes()
.map(script => script.props().value);
const scripts = component.find(GSScriptField).map(c => c.props().value);

expect(interactionSteps.sort()).toEqual(scripts.sort());
});
Expand Down Expand Up @@ -264,12 +257,15 @@ describe("CampaignInteractionStepsForm", () => {
const step1AnswerActionNodes = step1.findWhere(
node => node.props()["data-test"] === "actionSelect"
);

expect(step1AnswerActionNodes.last().props().value).toEqual(
expect(step1AnswerActionNodes.first().props().value).toEqual(
"red-handler"
);

expect(step1AnswerActionNodes.last().props().choices).toEqual([
{
value: "",
label: "",
},
{
value: "red-handler",
label: "Red Action"
Expand All @@ -292,11 +288,15 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionSelect"
);

expect(step2AnswerActionNodes.last().props().value).toEqual(
expect(step2AnswerActionNodes.first().props().value).toEqual(
"purple-handler"
);

expect(step2AnswerActionNodes.last().props().choices).toEqual([
{
value: "",
label: "",
},
{
value: "red-handler",
label: "Red Action"
Expand All @@ -319,9 +319,13 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionSelect"
);

expect(step3AnswerActionNodes.last().props().value).toEqual("");
expect(step3AnswerActionNodes.first().props().value).toEqual("");

expect(step3AnswerActionNodes.last().props().choices).toEqual([
{
value: "",
label: "",
},
{
value: "red-handler",
label: "Red Action"
Expand Down Expand Up @@ -455,11 +459,15 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionSelect"
);

expect(step1AnswerActionNodes.last().props().value).toEqual(
expect(step1AnswerActionNodes.first().props().value).toEqual(
"color-handler"
);

expect(step1AnswerActionNodes.last().props().choices).toEqual([
{
value: "",
label: "",
},
{
value: "color-handler",
label: "Color Action"
Expand All @@ -474,12 +482,12 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionDataAutoComplete"
);

expect(step1ClientChoiceNodes.last().props().value).toEqual({
expect(step1ClientChoiceNodes.first().props().value).toEqual({
label: "red",
value: "#FF0000"
});

expect(step1ClientChoiceNodes.last().props().choices).toEqual([
expect(step1ClientChoiceNodes.first().props().choices).toEqual([
{
label: "red",
value: "#FF0000"
Expand All @@ -500,11 +508,15 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionSelect"
);

expect(step2AnswerActionNodes.last().props().value).toEqual(
expect(step2AnswerActionNodes.first().props().value).toEqual(
"color-handler"
);

expect(step2AnswerActionNodes.last().props().choices).toEqual([
{
value: "",
label: ""
},
{
value: "color-handler",
label: "Color Action"
Expand All @@ -519,12 +531,12 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionDataAutoComplete"
);

expect(step2ClientChoiceNodes.last().props().value).toEqual({
expect(step2ClientChoiceNodes.first().props().value).toEqual({
label: "purple",
value: "#800080"
});

expect(step2ClientChoiceNodes.last().props().choices).toEqual([
expect(step2ClientChoiceNodes.first().props().choices).toEqual([
{
label: "red",
value: "#FF0000"
Expand All @@ -545,11 +557,15 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionSelect"
);

expect(step3AnswerActionNodes.last().props().value).toEqual(
expect(step3AnswerActionNodes.first().props().value).toEqual(
"pink-handler"
);

expect(step3AnswerActionNodes.last().props().choices).toEqual([
expect(step3AnswerActionNodes.first().props().choices).toEqual([
{
value: "",
label: ""
},
{
value: "color-handler",
label: "Color Action"
Expand All @@ -572,9 +588,13 @@ describe("CampaignInteractionStepsForm", () => {
node => node.props()["data-test"] === "actionSelect"
);

expect(step4AnswerActionNodes.last().props().value).toEqual("");
expect(step4AnswerActionNodes.first().props().value).toEqual("");

expect(step4AnswerActionNodes.last().props().choices).toEqual([
expect(step4AnswerActionNodes.first().props().choices).toEqual([
{
value: "",
label: ""
},
{
value: "color-handler",
label: "Color Action"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import {
createStartedCampaign
} from "../../test_helpers";

describe("ConversationPreviewModal", async () => {
describe.skip("ConversationPreviewModal", async () => {
let startedCampaign;
let optOutContact;
let optOut;
Expand Down
9 changes: 5 additions & 4 deletions __test__/components/forms/GSAutoComplete.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
import React from "react";
import { mount } from "enzyme";
import { StyleSheetTestUtils } from "aphrodite";
import AutoComplete from "material-ui/AutoComplete";

import yup from "yup";
import * as yup from "yup";

import Form from "react-formal";
import { GSAutoComplete, GSForm } from "../../../src/components/forms";
Expand Down Expand Up @@ -146,16 +147,16 @@ describe("GSAutoComplete", () => {
>
<Form.Field
name="colors"
type="autocomplete"
as={GSAutoComplete}
choices={colors}
hintText="What's your favorite color?"
/>
</GSForm>
</App>
);

gsAutoCompleteWrapper = formWrapper.find("GSAutoComplete");
autoCompleteWrapper = gsAutoCompleteWrapper.find("AutoComplete");
gsAutoCompleteWrapper = formWrapper.find(GSAutoComplete);
autoCompleteWrapper = gsAutoCompleteWrapper.find(AutoComplete);
});

it("the GSForm creates it and sets its properties", async () => {
Expand Down
12 changes: 9 additions & 3 deletions __test__/cypress/integration/basic-campaign-e2e.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ describe("End-to-end campaign flow", () => {
.first()
.click();
// Click first of the month
cy.get("body > div:nth-of-type(2) button:contains(1)")
.first()
cy.get("body > div:nth-of-type(2) button:not([disabled])")
.eq(3)
.click();

// Wait for modal to close then submit
Expand All @@ -59,6 +59,7 @@ describe("End-to-end campaign flow", () => {

// Upload Contacts
cy.get("#contact-upload").attachFile("two-contacts.csv"), { force: true };
cy.wait(400);
cy.get("button[data-test=submitContactsCsvUpload]").click();

// Assignments
Expand All @@ -70,10 +71,15 @@ describe("End-to-end campaign flow", () => {
.contains(`${texter.first_name} ${texter.last_name}`)
.click();
cy.get("input[data-test=autoSplit]").click();
cy.get("button[data-test=submitCampaignTextersForm]").click();
cy.wait(400);
cy.get("button[data-test=submitCampaignTextersForm]").click({
force: true
});
cy.wait(400);

// Interaction Steps
cy.get("textarea[data-test=editorInteraction]").click();
cy.wait(400);
cy.get(".DraftEditor-root").type(
"Hi {{}firstName{}} this is {{}texterFirstName{}}, how are you?"
);
Expand Down
2 changes: 1 addition & 1 deletion __test__/setup.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { configure } from "enzyme";
import Adapter from "enzyme-adapter-react-15";
import Adapter from "enzyme-adapter-react-16";

configure({ adapter: new Adapter() });

Expand Down
2 changes: 1 addition & 1 deletion docs/HOWTO-configure-auth0.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ callback(null, user, context);
<script src="https://cdn.auth0.com/js/base64.js"></script>
<script src="https://cdn.auth0.com/js/es5-shim.min.js"></script>
<![endif]-->
<script src="https://cdn.auth0.com/js/lock/11.11/lock.min.js"></script>
<script src="https://cdn.auth0.com/js/lock/11.28/lock.min.js"></script>
<script>
// Decode utf8 characters properly
var config = JSON.parse(decodeURIComponent(escape(window.atob('@@config@@'))));
Expand Down
15 changes: 4 additions & 11 deletions docs/HOWTO_DEPLOYING_AWS_LAMBDA.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,16 +130,9 @@ Create an RDS instance running Postgres 10.4 with the following settings:
aws_access_key_id = XXXXXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
4. Configure [s3cmd](https://github.com/s3tools/s3cmd)
1. Create an AWS user called `spoke_upload`. Create a new group for it with the `AmazonS3FullAccess` policy
2. Copy the credentials of the `spoke_upload` user to `~/.s3cfg`:
```
[default]
access_key = XXXXXXXXXXXXXXXXXX
secret_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
> _TODO_: figure out how to switch away from default profile in `package.json`'s `prod-static-upload` script using ENV vars
3. [Install s3cmd](https://s3tools.org/download)
4. Install the AWS CLI
- See instructions at [AWS Command Line Interface Version 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)
- On a mac, you can also use [homebrew](https://brew.sh/) command `brew install aws-cli`

### Create Production Environment File

Expand Down Expand Up @@ -170,7 +163,7 @@ Do **NOT** set:
- `"JOB_RUNNER": "lambda-async",`: This dispatches asynchronous tasks that occur after a web response to another Lambda invocation which improves performance and completion.
- `"AWS_ACCESS_AVAILABLE": "1",`: This replaces the AWS\_ key variables for S3 bucket support
- `STATIC_BASE_URL`: You will need to upload your ASSETS_DIR to an S3 bucket (or other static file site) and then set this to something like: `"https://s3.amazonaws.com/YOUR_BUCKET_AND_PATH/"` (don't forget the trailing '/')
- `S3_STATIC_PATH`: This will be the s3cmd upload path that corresponds to STATIC_BASE_URL. So if `STATIC_BASE_URL=https://s3.amazon.com/spoke.example.com/static/` then `S3_STATIC_PATH=s3://spoke.example.com/static/` You will also need a ~/.s3cfg file that has the s3 upload credentials. See `package.json`'s postinstall script and more specifically `prod-static-upload`.
- `S3_STATIC_PATH`: This will be the aws s3 upload path that corresponds to STATIC_BASE_URL. So if `STATIC_BASE_URL=https://s3.amazon.com/spoke.example.com/static/` then `S3_STATIC_PATH=s3://spoke.example.com/static/` You will also need a ~/.s3cfg file that has the s3 upload credentials. See `package.json`'s postinstall script and more specifically `prod-static-upload`.
- `"LAMBDA_DEBUG_LOG": "1",`: (ONLY FOR DEBUGGING) This will send more details of requests to the CloudWatch log. However, it will include the full request details, e.g. so do not use this in production.

For large production environments, it might also be a good idea to add `"SUPPRESS_MIGRATIONS": "1"` so that any time you update the schema with a version upgrade,
Expand Down
Loading