301 |
302 | `;
303 |
--------------------------------------------------------------------------------
/jest.config.js:
--------------------------------------------------------------------------------
1 | // For a detailed explanation regarding each configuration property, visit:
2 | // https://jestjs.io/docs/en/configuration.html
3 |
4 | module.exports = {
5 | // All imported modules in your tests should be mocked automatically
6 | // automock: false,
7 |
8 | // Stop running tests after `n` failures
9 | // bail: 0,
10 |
11 | // Respect "browser" field in package.json when resolving modules
12 | // browser: false,
13 |
14 | // The directory where Jest should store its cached dependency information
15 | // cacheDirectory: "/private/var/folders/nn/w0sql9795877_3l0qmfh__h40000gn/T/jest_dx",
16 |
17 | // Automatically clear mock calls and instances between every test
18 | clearMocks: true,
19 |
20 | // Indicates whether the coverage information should be collected while executing the test
21 | // collectCoverage: false,
22 |
23 | // An array of glob patterns indicating a set of files for which coverage information should be collected
24 | // collectCoverageFrom: undefined,
25 |
26 | // The directory where Jest should output its coverage files
27 | coverageDirectory: "coverage",
28 |
29 | // An array of regexp pattern strings used to skip coverage collection
30 | // coveragePathIgnorePatterns: [
31 | // "/node_modules/"
32 | // ],
33 |
34 | // A list of reporter names that Jest uses when writing coverage reports
35 | // coverageReporters: [
36 | // "json",
37 | // "text",
38 | // "lcov",
39 | // "clover"
40 | // ],
41 |
42 | // An object that configures minimum threshold enforcement for coverage results
43 | // coverageThreshold: undefined,
44 |
45 | // A path to a custom dependency extractor
46 | // dependencyExtractor: undefined,
47 |
48 | // Make calling deprecated APIs throw helpful error messages
49 | // errorOnDeprecated: false,
50 |
51 | // Force coverage collection from ignored files using an array of glob patterns
52 | // forceCoverageMatch: [],
53 |
54 | // A path to a module which exports an async function that is triggered once before all test suites
55 | // globalSetup: undefined,
56 |
57 | // A path to a module which exports an async function that is triggered once after all test suites
58 | // globalTeardown: undefined,
59 |
60 | // A set of global variables that need to be available in all test environments
61 | // globals: {},
62 |
63 | // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers.
64 | // maxWorkers: "50%",
65 |
66 | // An array of directory names to be searched recursively up from the requiring module's location
67 | // moduleDirectories: [
68 | // "node_modules"
69 | // ],
70 |
71 | // An array of file extensions your modules use
72 | // moduleFileExtensions: [
73 | // "js",
74 | // "json",
75 | // "jsx",
76 | // "ts",
77 | // "tsx",
78 | // "node"
79 | // ],
80 |
81 | // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module
82 | // moduleNameMapper: {},
83 |
84 | // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader
85 | // modulePathIgnorePatterns: [],
86 |
87 | // Activates notifications for test results
88 | // notify: false,
89 |
90 | // An enum that specifies notification mode. Requires { notify: true }
91 | // notifyMode: "failure-change",
92 |
93 | // A preset that is used as a base for Jest's configuration
94 | preset: "ts-jest",
95 |
96 | // Run tests from one or more projects
97 | // projects: undefined,
98 |
99 | // Use this configuration option to add custom reporters to Jest
100 | // reporters: undefined,
101 |
102 | // Automatically reset mock state between every test
103 | // resetMocks: false,
104 |
105 | // Reset the module registry before running each individual test
106 | // resetModules: false,
107 |
108 | // A path to a custom resolver
109 | // resolver: undefined,
110 |
111 | // Automatically restore mock state between every test
112 | // restoreMocks: false,
113 |
114 | // The root directory that Jest should scan for tests and modules within
115 | // rootDir: undefined,
116 |
117 | // A list of paths to directories that Jest should use to search for files in
118 | // roots: [
119 | // ""
120 | // ],
121 |
122 | // Allows you to use a custom runner instead of Jest's default test runner
123 | // runner: "jest-runner",
124 |
125 | // The paths to modules that run some code to configure or set up the testing environment before each test
126 | // setupFiles: [],
127 |
128 | // A list of paths to modules that run some code to configure or set up the testing framework before each test
129 | // setupFilesAfterEnv: [],
130 |
131 | // A list of paths to snapshot serializer modules Jest should use for snapshot testing
132 | // snapshotSerializers: [],
133 |
134 | // The test environment that will be used for testing
135 | // testEnvironment: "jest-environment-jsdom",
136 |
137 | // Options that will be passed to the testEnvironment
138 | // testEnvironmentOptions: {},
139 |
140 | // Adds a location field to test results
141 | // testLocationInResults: false,
142 |
143 | // The glob patterns Jest uses to detect test files
144 | // testMatch: [
145 | // "**/__tests__/**/*.[jt]s?(x)",
146 | // "**/?(*.)+(spec|test).[tj]s?(x)"
147 | // ],
148 |
149 | // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped
150 | testPathIgnorePatterns: [
151 | "/integration/",
152 | "/node_modules/"
153 | ],
154 |
155 | // The regexp pattern or array of patterns that Jest uses to detect test files
156 | // testRegex: [],
157 |
158 | // This option allows the use of a custom results processor
159 | // testResultsProcessor: undefined,
160 |
161 | // This option allows use of a custom test runner
162 | // testRunner: "jasmine2",
163 |
164 | // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href
165 | // testURL: "http://localhost",
166 |
167 | // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout"
168 | // timers: "real",
169 |
170 | // A map from regular expressions to paths to transformers
171 | // transform: undefined,
172 |
173 | // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
174 | // transformIgnorePatterns: [
175 | // "/node_modules/"
176 | // ],
177 |
178 | // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
179 | // unmockedModulePathPatterns: undefined,
180 |
181 | // Indicates whether each individual test should be reported during the run
182 | // verbose: undefined,
183 |
184 | // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode
185 | // watchPathIgnorePatterns: [],
186 |
187 | // Whether to use watchman for file crawling
188 | // watchman: true,
189 | };
190 |
--------------------------------------------------------------------------------
/static/typescript/ChecklistComponent.tsx:
--------------------------------------------------------------------------------
1 | import * as React from "react";
2 | import * as API from "./api";
3 | import { NavComponent } from "./NavComponent";
4 |
5 | interface ChecklistProps {
6 | checklistRef: API.ChecklistRef;
7 | }
8 |
9 | interface ChecklistState {
10 | checklist?: API.Checklist;
11 | me?: API.GitHubUser;
12 | loading: boolean;
13 | error?: any;
14 | }
15 |
16 | export class ChecklistComponent extends React.Component<
17 | ChecklistProps,
18 | ChecklistState
19 | > {
20 | constructor(props: ChecklistProps) {
21 | super(props);
22 |
23 | this.state = { loading: false };
24 |
25 | API.getChecklist(props.checklistRef)
26 | .then((data) => {
27 | if (data instanceof API.APIError) {
28 | if (data.errorType === "not_authed") {
29 | location.href = `/auth?return_to=${encodeURIComponent(
30 | location.pathname
31 | )}`;
32 | return;
33 | }
34 | throw data;
35 | }
36 | if (data.Checklist) {
37 | if (this.ensureCorrectStage(data.Checklist)) {
38 | return;
39 | }
40 | }
41 | this.setState({
42 | checklist: data.Checklist,
43 | me: data.Me,
44 | });
45 | })
46 | .catch((err) => {
47 | this.setState({ error: `${err}` });
48 | console.error(err);
49 | });
50 | }
51 |
52 | public render() {
53 | if (this.state.error) {
54 | return (
55 |
56 |
57 |