@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.
Files changed (52) hide show
  1. package/.prettierrc.cjs +1 -0
  2. package/.upptimerc.yml +42 -0
  3. package/CHANGELOG.md +791 -0
  4. package/LICENSE +21 -0
  5. package/README.md +46 -0
  6. package/cypress/fixtures/example.json +5 -0
  7. package/cypress/integration/incident.spec.js +9 -0
  8. package/cypress/integration/live-status.spec.js +12 -0
  9. package/cypress/plugins/index.js +17 -0
  10. package/cypress/support/commands.js +25 -0
  11. package/cypress/support/index.js +20 -0
  12. package/cypress.json +4 -0
  13. package/i18n.yml +61 -0
  14. package/init-tests.ts +12 -0
  15. package/jest.config.js +4 -0
  16. package/package.json +78 -0
  17. package/post-process.ts +61 -0
  18. package/pre-process.ts +32 -0
  19. package/release.config.js +1 -0
  20. package/rollup.config.js +116 -0
  21. package/src/client.js +18 -0
  22. package/src/components/ActiveIncidents.svelte +79 -0
  23. package/src/components/ActiveScheduled.svelte +96 -0
  24. package/src/components/Graph.svelte +76 -0
  25. package/src/components/History.svelte +84 -0
  26. package/src/components/Incident.svelte +161 -0
  27. package/src/components/Incidents.svelte +83 -0
  28. package/src/components/LiveStatus.svelte +190 -0
  29. package/src/components/Loading.svelte +37 -0
  30. package/src/components/Nav.svelte +88 -0
  31. package/src/components/Scheduled.svelte +72 -0
  32. package/src/components/Summary.svelte +54 -0
  33. package/src/routes/_error.svelte +41 -0
  34. package/src/routes/_layout.svelte +110 -0
  35. package/src/routes/error.svelte +27 -0
  36. package/src/routes/history/[number].svelte +17 -0
  37. package/src/routes/incident/[number].svelte +13 -0
  38. package/src/routes/index.svelte +48 -0
  39. package/src/routes/rate-limit-exceeded.svelte +88 -0
  40. package/src/server.js +25 -0
  41. package/src/service-worker.js +15 -0
  42. package/src/template.html +34 -0
  43. package/src/utils/createOctokit.js +67 -0
  44. package/static/global.css +203 -0
  45. package/static/logo-192.png +0 -0
  46. package/static/logo-512.png +0 -0
  47. package/static/manifest.json +20 -0
  48. package/static/themes/dark.css +26 -0
  49. package/static/themes/light.css +26 -0
  50. package/static/themes/night.css +26 -0
  51. package/static/themes/ocean.css +26 -0
  52. 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
+ }