@justdanielndev/status-page 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.prettierrc.cjs +1 -0
- package/.upptimerc.yml +42 -0
- package/CHANGELOG.md +791 -0
- package/LICENSE +21 -0
- package/README.md +46 -0
- package/cypress/fixtures/example.json +5 -0
- package/cypress/integration/incident.spec.js +9 -0
- package/cypress/integration/live-status.spec.js +12 -0
- package/cypress/plugins/index.js +17 -0
- package/cypress/support/commands.js +25 -0
- package/cypress/support/index.js +20 -0
- package/cypress.json +4 -0
- package/i18n.yml +61 -0
- package/init-tests.ts +12 -0
- package/jest.config.js +4 -0
- package/package.json +78 -0
- package/post-process.ts +61 -0
- package/pre-process.ts +32 -0
- package/release.config.js +1 -0
- package/rollup.config.js +116 -0
- package/src/client.js +18 -0
- package/src/components/ActiveIncidents.svelte +79 -0
- package/src/components/ActiveScheduled.svelte +96 -0
- package/src/components/Graph.svelte +76 -0
- package/src/components/History.svelte +84 -0
- package/src/components/Incident.svelte +161 -0
- package/src/components/Incidents.svelte +83 -0
- package/src/components/LiveStatus.svelte +190 -0
- package/src/components/Loading.svelte +37 -0
- package/src/components/Nav.svelte +88 -0
- package/src/components/Scheduled.svelte +72 -0
- package/src/components/Summary.svelte +54 -0
- package/src/routes/_error.svelte +41 -0
- package/src/routes/_layout.svelte +110 -0
- package/src/routes/error.svelte +27 -0
- package/src/routes/history/[number].svelte +17 -0
- package/src/routes/incident/[number].svelte +13 -0
- package/src/routes/index.svelte +48 -0
- package/src/routes/rate-limit-exceeded.svelte +88 -0
- package/src/server.js +25 -0
- package/src/service-worker.js +15 -0
- package/src/template.html +34 -0
- package/src/utils/createOctokit.js +67 -0
- package/static/global.css +203 -0
- package/static/logo-192.png +0 -0
- package/static/logo-512.png +0 -0
- package/static/manifest.json +20 -0
- package/static/themes/dark.css +26 -0
- package/static/themes/light.css +26 -0
- package/static/themes/night.css +26 -0
- package/static/themes/ocean.css +26 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Octokit } from "@octokit/rest";
|
|
2
|
+
import config from "../data/config.json";
|
|
3
|
+
|
|
4
|
+
let { apiBaseUrl, userContentBaseUrl } = config["status-website"] || {};
|
|
5
|
+
if (!apiBaseUrl) apiBaseUrl = "https://api.github.com";
|
|
6
|
+
if (!userContentBaseUrl) userContentBaseUrl = "https://raw.githubusercontent.com";
|
|
7
|
+
|
|
8
|
+
const userAgent = config.userAgent;
|
|
9
|
+
|
|
10
|
+
export const createOctokit = () => {
|
|
11
|
+
let token = "";
|
|
12
|
+
if (
|
|
13
|
+
typeof window !== "undefined" &&
|
|
14
|
+
"localStorage" in window &&
|
|
15
|
+
localStorage.getItem("personal-access-token")
|
|
16
|
+
)
|
|
17
|
+
token = localStorage.getItem("personal-access-token");
|
|
18
|
+
|
|
19
|
+
const baseUrl = apiBaseUrl;
|
|
20
|
+
return new Octokit({
|
|
21
|
+
baseUrl,
|
|
22
|
+
userAgent,
|
|
23
|
+
auth: token || undefined,
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const handleError = (error) => {
|
|
28
|
+
if (error.message === "Bad credentials") {
|
|
29
|
+
window.location.href = config.path + "/error";
|
|
30
|
+
} else if ((error.message || "").indexOf("rate limit exceeded") > -1) {
|
|
31
|
+
window.location.href = config.path + "/rate-limit-exceeded";
|
|
32
|
+
} else {
|
|
33
|
+
window.location.href = config.path + "/error";
|
|
34
|
+
console.log(error.message);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Memoize a GitHub API response in local storage
|
|
40
|
+
* @param {string} key - Local storage cache key
|
|
41
|
+
* @param {Function} fn - Function that returns the result
|
|
42
|
+
*/
|
|
43
|
+
export const cachedResponse = async (key, fn) => {
|
|
44
|
+
try {
|
|
45
|
+
if (typeof window !== "undefined") {
|
|
46
|
+
if ("localStorage" in window && typeof document !== "undefined" && "domain" in document) {
|
|
47
|
+
const data = localStorage.getItem(key);
|
|
48
|
+
if (data) {
|
|
49
|
+
const item = JSON.parse(data);
|
|
50
|
+
if (
|
|
51
|
+
new Date().getTime() - new Date(item.createdAt || "").getTime() >
|
|
52
|
+
(document.domain === "localhost"
|
|
53
|
+
? config["status-website"].localhostCacheTime || 3600000
|
|
54
|
+
: config["status-website"].productionCacheTime || 120000)
|
|
55
|
+
) {
|
|
56
|
+
localStorage.removeItem(key);
|
|
57
|
+
} else {
|
|
58
|
+
return item.data;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
} catch (error) {}
|
|
64
|
+
const i = await fn();
|
|
65
|
+
localStorage.setItem(key, JSON.stringify({ data: i, createdAt: new Date() }));
|
|
66
|
+
return i;
|
|
67
|
+
};
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
body {
|
|
2
|
+
margin: 0;
|
|
3
|
+
font-family: Roboto, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Cantarell,
|
|
4
|
+
Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
|
|
5
|
+
line-height: 1.5;
|
|
6
|
+
padding-bottom: 2.5rem;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
h1,
|
|
10
|
+
h2,
|
|
11
|
+
h3,
|
|
12
|
+
h4,
|
|
13
|
+
h5,
|
|
14
|
+
h6 {
|
|
15
|
+
margin: 0 0 0.5em 0;
|
|
16
|
+
font-weight: 400;
|
|
17
|
+
line-height: 1.2;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
h1 {
|
|
21
|
+
font-size: 2em;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
a {
|
|
25
|
+
color: inherit;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@media (min-width: 400px) {
|
|
29
|
+
body {
|
|
30
|
+
font-size: 16px;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.container {
|
|
35
|
+
max-width: 800px;
|
|
36
|
+
margin: 0 auto;
|
|
37
|
+
padding: 0 2rem;
|
|
38
|
+
box-sizing: border-box;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
article {
|
|
42
|
+
padding: 1rem 1.25rem;
|
|
43
|
+
position: relative;
|
|
44
|
+
border-radius: 0.2rem;
|
|
45
|
+
border: 1px solid;
|
|
46
|
+
}
|
|
47
|
+
article.link a::after {
|
|
48
|
+
content: "";
|
|
49
|
+
position: absolute;
|
|
50
|
+
left: 0;
|
|
51
|
+
right: 0;
|
|
52
|
+
top: 0;
|
|
53
|
+
bottom: 0;
|
|
54
|
+
}
|
|
55
|
+
article + article {
|
|
56
|
+
margin-top: 0.5rem;
|
|
57
|
+
}
|
|
58
|
+
article + h3 {
|
|
59
|
+
margin-top: 1rem;
|
|
60
|
+
}
|
|
61
|
+
h3 {
|
|
62
|
+
opacity: 0.75;
|
|
63
|
+
}
|
|
64
|
+
h4 {
|
|
65
|
+
font-weight: bold;
|
|
66
|
+
}
|
|
67
|
+
article.down {
|
|
68
|
+
border-left: 0.2rem solid;
|
|
69
|
+
}
|
|
70
|
+
article.degraded {
|
|
71
|
+
border-left: 0.2rem solid;
|
|
72
|
+
}
|
|
73
|
+
article.up {
|
|
74
|
+
border-left: 0.2rem solid;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.f {
|
|
78
|
+
display: flex;
|
|
79
|
+
justify-content: space-between;
|
|
80
|
+
align-items: center;
|
|
81
|
+
flex-wrap: wrap;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
section + h2 {
|
|
85
|
+
margin-top: 2rem;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.tag {
|
|
89
|
+
display: inline-block;
|
|
90
|
+
padding: 0.33rem 0.5rem;
|
|
91
|
+
border-radius: 0.2rem;
|
|
92
|
+
font-size: 70%;
|
|
93
|
+
vertical-align: middle;
|
|
94
|
+
margin-top: -0.2rem;
|
|
95
|
+
margin-left: 0.5rem;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
dl {
|
|
99
|
+
margin-bottom: 1.5rem;
|
|
100
|
+
}
|
|
101
|
+
dl dt {
|
|
102
|
+
font-weight: bold;
|
|
103
|
+
}
|
|
104
|
+
dl dd {
|
|
105
|
+
margin: 0 0 1rem 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
nav {
|
|
109
|
+
border-bottom: 1px solid;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
[aria-current] {
|
|
113
|
+
border-bottom: 2px solid;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
a.error-button {
|
|
117
|
+
border: 0.1rem solid;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* Theming */
|
|
121
|
+
|
|
122
|
+
.submit-button {
|
|
123
|
+
background: #01a3a4;
|
|
124
|
+
color: #fff;
|
|
125
|
+
border-color: transparent;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
body {
|
|
129
|
+
background: var(--body-background-color);
|
|
130
|
+
color: var(--body-text-color);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
code {
|
|
134
|
+
color: var(--code-color);
|
|
135
|
+
background: var(--code-background-color);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
article {
|
|
139
|
+
background: var(--card-background-color);
|
|
140
|
+
border-color: var(--card-border-color);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
article.down {
|
|
144
|
+
border-left-color: var(--down-border-left-color) !important;
|
|
145
|
+
color: var(--down-color-color);
|
|
146
|
+
}
|
|
147
|
+
article.down-active {
|
|
148
|
+
background: var(--down-background-color);
|
|
149
|
+
border-color: var(--down-border-left-color);
|
|
150
|
+
}
|
|
151
|
+
article.degraded {
|
|
152
|
+
border-left-color: var(--degraded-border-left-color) !important;
|
|
153
|
+
color: var(--degraded-color-color);
|
|
154
|
+
}
|
|
155
|
+
article.up {
|
|
156
|
+
border-left-color: var(--up-border-left-color) !important;
|
|
157
|
+
color: var(--up-color-color);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.tag {
|
|
161
|
+
color: var(--tag-color);
|
|
162
|
+
}
|
|
163
|
+
.tag.closed,
|
|
164
|
+
.tag.up {
|
|
165
|
+
background: var(--tag-up-background-color) !important;
|
|
166
|
+
}
|
|
167
|
+
.tag.open,
|
|
168
|
+
.tag.down {
|
|
169
|
+
background: var(--tag-down-background-color) !important;
|
|
170
|
+
}
|
|
171
|
+
.tag.degraded {
|
|
172
|
+
background: var(--tag-degraded-background-color) !important;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.changed + section .data {
|
|
176
|
+
background: var(--change-background-color);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
nav {
|
|
180
|
+
border-bottom-color: var(--nav-border-bottom-color);
|
|
181
|
+
background: var(--nav-background-color);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
[aria-current] {
|
|
185
|
+
border-bottom-color: var(--nav-current-border-bottom-color);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
a.error-button {
|
|
189
|
+
border-color: var(--error-button-border-color);
|
|
190
|
+
background: var(--error-button-background-color);
|
|
191
|
+
color: var(--error-button-color);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.submit-button {
|
|
195
|
+
background: var(--submit-button-background-color);
|
|
196
|
+
color: var(--submit-button-color);
|
|
197
|
+
border-color: var(--submit-button-border-color);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
article .graph {
|
|
201
|
+
opacity: var(--graph-opacity);
|
|
202
|
+
filter: var(--graph-filter);
|
|
203
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"background_color": "#ffffff",
|
|
3
|
+
"theme_color": "#333333",
|
|
4
|
+
"name": "Upptime",
|
|
5
|
+
"short_name": "Upptime",
|
|
6
|
+
"display": "minimal-ui",
|
|
7
|
+
"start_url": "/",
|
|
8
|
+
"icons": [
|
|
9
|
+
{
|
|
10
|
+
"src": "logo-192.png",
|
|
11
|
+
"sizes": "192x192",
|
|
12
|
+
"type": "image/png"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"src": "logo-512.png",
|
|
16
|
+
"sizes": "512x512",
|
|
17
|
+
"type": "image/png"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--body-background-color: #001716;
|
|
3
|
+
--body-text-color: #f0ffff;
|
|
4
|
+
--card-background-color: #002b29;
|
|
5
|
+
--nav-background-color: #002b29;
|
|
6
|
+
--nav-border-bottom-color: #015450;
|
|
7
|
+
--nav-current-border-bottom-color: #1abc9c;
|
|
8
|
+
--card-border-color: #015450;
|
|
9
|
+
--down-border-left-color: #eb3b5a;
|
|
10
|
+
--down-background-color: #6b1020;
|
|
11
|
+
--degraded-border-left-color: #f7b731;
|
|
12
|
+
--up-border-left-color: #20bf6b;
|
|
13
|
+
--tag-color: #002b29;
|
|
14
|
+
--tag-up-background-color: #20bf6b;
|
|
15
|
+
--tag-down-background-color: #eb3b5a;
|
|
16
|
+
--tag-degraded-background-color: #f7b731;
|
|
17
|
+
--change-background-color: #f7b731;
|
|
18
|
+
--error-button-border-color: #1a46ad;
|
|
19
|
+
--error-button-background-color: #3867d6;
|
|
20
|
+
--error-button-color: #ffffff;
|
|
21
|
+
--submit-button-border-color: #1a46ad;
|
|
22
|
+
--submit-button-background-color: #3867d6;
|
|
23
|
+
--submit-button-color: #ffffff;
|
|
24
|
+
--graph-opacity: 1;
|
|
25
|
+
--graph-filter: none;
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--body-background-color: #f0f7f7;
|
|
3
|
+
--body-text-color: #002626;
|
|
4
|
+
--card-background-color: #ffffff;
|
|
5
|
+
--nav-background-color: #ffffff;
|
|
6
|
+
--nav-border-bottom-color: #d8e8e4;
|
|
7
|
+
--nav-current-border-bottom-color: #1abc9c;
|
|
8
|
+
--card-border-color: #d8e8e4;
|
|
9
|
+
--down-border-left-color: #eb3b5a;
|
|
10
|
+
--down-background-color: #ffd0d2;
|
|
11
|
+
--degraded-border-left-color: #f7b731;
|
|
12
|
+
--up-border-left-color: #20bf6b;
|
|
13
|
+
--tag-color: #ffffff;
|
|
14
|
+
--tag-up-background-color: #20bf6b;
|
|
15
|
+
--tag-down-background-color: #eb3b5a;
|
|
16
|
+
--tag-degraded-background-color: #f7b731;
|
|
17
|
+
--change-background-color: #f7b731;
|
|
18
|
+
--error-button-border-color: #1a46ad;
|
|
19
|
+
--error-button-background-color: #3867d6;
|
|
20
|
+
--error-button-color: #ffffff;
|
|
21
|
+
--submit-button-border-color: #1a46ad;
|
|
22
|
+
--submit-button-background-color: #3867d6;
|
|
23
|
+
--submit-button-color: #ffffff;
|
|
24
|
+
--graph-opacity: 1;
|
|
25
|
+
--graph-filter: none;
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--body-background-color: #0d1117;
|
|
3
|
+
--body-text-color: #c9d1d9;
|
|
4
|
+
--card-background-color: #30363D;
|
|
5
|
+
--nav-background-color: #161b22;
|
|
6
|
+
--nav-border-bottom-color: #161b22;
|
|
7
|
+
--nav-current-border-bottom-color: #1abc9c;
|
|
8
|
+
--card-border-color: #30363D;
|
|
9
|
+
--down-border-left-color: #eb3b5a;
|
|
10
|
+
--down-background-color: #6b1020;
|
|
11
|
+
--degraded-border-left-color: #f7b731;
|
|
12
|
+
--up-border-left-color: #22993D;
|
|
13
|
+
--tag-color: #0d1117;
|
|
14
|
+
--tag-up-background-color: #22993D;
|
|
15
|
+
--tag-down-background-color: #F03A17;
|
|
16
|
+
--tag-degraded-background-color: #f7b731;
|
|
17
|
+
--change-background-color: #f7b731;
|
|
18
|
+
--error-button-border-color: #1a46ad;
|
|
19
|
+
--error-button-background-color: #3867d6;
|
|
20
|
+
--error-button-color: #ffffff;
|
|
21
|
+
--submit-button-border-color: #1a46ad;
|
|
22
|
+
--submit-button-background-color: #3867d6;
|
|
23
|
+
--submit-button-color: #ffffff;
|
|
24
|
+
--graph-opacity: 1;
|
|
25
|
+
/* --graph-filter: brightness(0.35) sepia(1) hue-rotate(88deg) saturate(8); */
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--body-background-color: #011945;
|
|
3
|
+
--body-text-color: #f0ffff;
|
|
4
|
+
--card-background-color: #0d2f6e;
|
|
5
|
+
--nav-background-color: #0d2f6e;
|
|
6
|
+
--nav-border-bottom-color: #002d80;
|
|
7
|
+
--nav-current-border-bottom-color: #1abc9c;
|
|
8
|
+
--card-border-color: #002d80;
|
|
9
|
+
--down-border-left-color: #eb3b5a;
|
|
10
|
+
--down-background-color: #6b1020;
|
|
11
|
+
--degraded-border-left-color: #f7b731;
|
|
12
|
+
--up-border-left-color: #20bf6b;
|
|
13
|
+
--tag-color: #0d2f6e;
|
|
14
|
+
--tag-up-background-color: #20bf6b;
|
|
15
|
+
--tag-down-background-color: #eb3b5a;
|
|
16
|
+
--tag-degraded-background-color: #f7b731;
|
|
17
|
+
--change-background-color: #f7b731;
|
|
18
|
+
--error-button-border-color: #1a46ad;
|
|
19
|
+
--error-button-background-color: #3867d6;
|
|
20
|
+
--error-button-color: #ffffff;
|
|
21
|
+
--submit-button-border-color: #1a46ad;
|
|
22
|
+
--submit-button-background-color: #3867d6;
|
|
23
|
+
--submit-button-color: #ffffff;
|
|
24
|
+
--graph-opacity: 1;
|
|
25
|
+
--graph-filter: none;
|
|
26
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"moduleResolution": "node",
|
|
4
|
+
"target": "esnext",
|
|
5
|
+
"module": "commonjs",
|
|
6
|
+
"lib": ["dom", "esnext"],
|
|
7
|
+
"strict": true,
|
|
8
|
+
"sourceMap": true,
|
|
9
|
+
"declaration": true,
|
|
10
|
+
"esModuleInterop": true,
|
|
11
|
+
"allowSyntheticDefaultImports": true,
|
|
12
|
+
"experimentalDecorators": true,
|
|
13
|
+
"emitDecoratorMetadata": true,
|
|
14
|
+
"declarationDir": "./dist",
|
|
15
|
+
"outDir": "./dist",
|
|
16
|
+
"typeRoots": ["node_modules/@types", "@types"]
|
|
17
|
+
},
|
|
18
|
+
"include": ["src", "tooling"],
|
|
19
|
+
"exclude": ["node_modules"]
|
|
20
|
+
}
|