271 Commits

Author SHA1 Message Date
Renovate Bot
8774d0cdde chore(deps): update browserslist to 4.28.1 2025-12-04 20:47:21 +01:00
ff88b3ee45 Merge pull request #220 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.48.1
2025-12-04 16:46:27 +01:00
d9bc212e86 Merge pull request #218 from Mastermindzh/renovate/eslint-eslintrc-3.x-lockfile
chore(deps): update @eslint/eslintrc to 3.3.3
2025-12-04 14:53:26 +01:00
Renovate Bot
94f3c9ae4c chore(deps): update typescript-eslint monorepo to 8.48.1 2025-12-02 12:58:49 +01:00
Renovate Bot
4a49fb0082 chore(deps): update @eslint/eslintrc to 3.3.3 2025-11-28 20:41:54 +01:00
cfbff8f732 Merge pull request #217 from Mastermindzh/renovate/prettier-plugin-packagejson-2.x-lockfile
chore(deps): update prettier-plugin-packagejson to 2.5.20
2025-11-28 14:04:39 +01:00
ef1832fffa Merge pull request #216 from Mastermindzh/renovate/font-awesome
chore(deps): update @fortawesome/react-fontawesome to 3.1.1
2025-11-28 14:04:15 +01:00
af38304658 Merge pull request #214 from Mastermindzh/renovate/stylelint-16.x-lockfile
chore(deps): update stylelint to 16.26.1
2025-11-28 14:03:45 +01:00
b59942d8d4 Merge pull request #209 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.48.0
2025-11-28 13:55:23 +01:00
Renovate Bot
b93f82d349 chore(deps): update stylelint to 16.26.1 2025-11-28 12:47:49 +01:00
Renovate Bot
328073c73b chore(deps): update prettier-plugin-packagejson to 2.5.20 2025-11-28 12:47:14 +01:00
Renovate Bot
a6ff47ca52 chore(deps): update @fortawesome/react-fontawesome to 3.1.1 2025-11-28 12:46:49 +01:00
Renovate Bot
201a3be9f7 chore(deps): update typescript-eslint monorepo to 8.48.0 2025-11-27 20:55:57 +01:00
a9e82df72d Merge pull request #215 from Mastermindzh/renovate/prettier-3.x-lockfile
chore(deps): update prettier to 3.7.1
2025-11-27 13:36:09 +01:00
7e76d79d21 Merge pull request #207 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.15.3
2025-11-27 13:23:05 +01:00
6e5e8b1907 Merge pull request #213 from Mastermindzh/renovate/eslint-plugin-jest-29.x-lockfile
chore(deps): update eslint-plugin-jest to 29.2.1
2025-11-27 13:22:20 +01:00
Renovate Bot
fc6cf611c3 chore(deps): update prettier to 3.7.1 2025-11-27 12:46:34 +01:00
Renovate Bot
54589c54c0 chore(deps): update eslint-plugin-jest to 29.2.1 2025-11-27 12:46:07 +01:00
Renovate Bot
9a25760290 chore(deps): update @swc/core to 1.15.3 2025-11-27 12:45:41 +01:00
b5b49c7315 Merge pull request #210 from Mastermindzh/renovate/sass-1.x-lockfile
chore(deps): update sass to 1.94.2
2025-11-27 10:08:34 +01:00
2bba58f60c Merge pull request #212 from Mastermindzh/renovate/rimraf-6.x-lockfile
chore(deps): update rimraf to 6.1.2
2025-11-27 09:59:09 +01:00
3795ae9245 Merge pull request #211 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.2.7
2025-11-27 09:58:50 +01:00
752f37900f Merge pull request #208 from Mastermindzh/renovate/eslint-compat-2.x
chore(deps): update @eslint/compat to 2.0.0
2025-11-27 08:59:45 +01:00
Renovate Bot
c480a55235 chore(deps): update sass to 1.94.2 2025-11-20 12:44:45 +01:00
Renovate Bot
ee158ac814 chore(deps): update rimraf to 6.1.2 2025-11-19 20:48:05 +01:00
Renovate Bot
7db8cf733c chore(deps): update lint-staged to 16.2.7 2025-11-19 20:47:40 +01:00
Renovate Bot
4fde590302 chore(deps): update @eslint/compat to 2.0.0 2025-11-14 20:47:55 +01:00
b956abd9be Merge pull request #198 from Mastermindzh/renovate/sass-embedded-1.x-lockfile
chore(deps): update sass-embedded to 1.93.3
2025-11-13 13:20:13 +01:00
Renovate Bot
5f75a66e7a chore(deps): update sass-embedded to 1.93.3 2025-11-12 12:49:32 +01:00
fbf7ba33c9 Merge pull request #194 from Mastermindzh/renovate/eslint-compat-1.x-lockfile
chore(deps): update @eslint/compat to 1.4.1
2025-11-12 12:00:35 +01:00
857a45f4a7 Merge pull request #200 from Mastermindzh/renovate/globals-16.x-lockfile
chore(deps): update globals to 16.5.0
2025-11-12 11:56:06 +01:00
279a15c4d1 Merge pull request #196 from Mastermindzh/renovate/rimraf-6.x-lockfile
chore(deps): update rimraf to 6.1.0
2025-11-12 11:55:08 +01:00
f79643a746 Merge pull request #203 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.46.4
2025-11-12 11:51:55 +01:00
2e389402f8 Merge pull request #204 from Mastermindzh/renovate/eslint-plugin-jest-29.x-lockfile
chore(deps): update eslint-plugin-jest to 29.1.0
2025-11-12 11:51:12 +01:00
a0ae0e3228 Merge pull request #197 from Mastermindzh/renovate/sass-1.x-lockfile
chore(deps): update sass to 1.94.0
2025-11-12 11:50:04 +01:00
e3258a2fd3 Merge pull request #205 from Mastermindzh/renovate/autoprefixer-10.x-lockfile
chore(deps): update autoprefixer to 10.4.22
2025-11-12 11:48:32 +01:00
e055fbe753 Merge pull request #206 from Mastermindzh/renovate/browserslist-4.x-lockfile
chore(deps): update browserslist to 4.28.0
2025-11-12 11:43:40 +01:00
7a0ac1caeb Merge pull request #201 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.10.1
2025-11-12 11:42:32 +01:00
Renovate Bot
6539292ec1 chore(deps): update @types/node to 24.10.1 2025-11-12 04:46:34 +01:00
Renovate Bot
708ecd3097 chore(deps): update browserslist to 4.28.0 2025-11-11 21:01:48 +01:00
Renovate Bot
fbf4335dfc chore(deps): update sass to 1.94.0 2025-11-11 04:54:29 +01:00
Renovate Bot
b38f382cfa chore(deps): update autoprefixer to 10.4.22 2025-11-11 04:51:12 +01:00
Renovate Bot
fa41d7ea58 chore(deps): update eslint-plugin-jest to 29.1.0 2025-11-10 20:49:41 +01:00
Renovate Bot
53e8706b2f chore(deps): update typescript-eslint monorepo to 8.46.4 2025-11-10 20:48:57 +01:00
Renovate Bot
2b43c50113 chore(deps): update rimraf to 6.1.0 2025-11-10 12:47:01 +01:00
Renovate Bot
343083d97b chore(deps): update globals to 16.5.0 2025-11-10 12:46:31 +01:00
Renovate Bot
23eb5ecca3 chore(deps): update @eslint/compat to 1.4.1 2025-11-10 12:44:55 +01:00
7651ad85bd Merge pull request #195 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.15.1
2025-11-10 11:01:09 +01:00
Renovate Bot
61a9132a5c chore(deps): update @swc/core to 1.15.1 2025-11-08 20:37:04 +01:00
85af1d1eef Merge pull request #202 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.46.3
2025-11-04 10:54:22 +01:00
01ff9667ee Merge pull request #199 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.39.1
2025-11-04 10:40:11 +01:00
Renovate Bot
93f6e5dbfd chore(deps): update eslint monorepo to 9.39.1 2025-11-04 04:44:07 +01:00
Renovate Bot
066fcc160e chore(deps): update typescript-eslint monorepo to 8.46.3 2025-11-03 20:45:33 +01:00
47347eee43 Merge pull request #193 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.9.2
2025-10-29 11:29:22 +01:00
697313cc14 Merge pull request #190 from Mastermindzh/renovate/browserslist-4.x-lockfile
chore(deps): update browserslist to 4.27.0
2025-10-29 09:36:56 +01:00
7616dc4a55 Merge pull request #192 from Mastermindzh/renovate/react-monorepo
chore(deps): update eslint-plugin-react-hooks to 7.0.1
2025-10-29 09:33:24 +01:00
d22ef2749d Merge pull request #191 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.21
2025-10-29 09:32:57 +01:00
Renovate Bot
a3b5ae7dc8 chore(deps): update @types/node to 24.9.2 2025-10-28 19:53:40 +01:00
Renovate Bot
fdb26b4847 chore(deps): update browserslist to 4.27.0 2025-10-28 03:44:57 +01:00
Renovate Bot
073246f6fc chore(deps): update eslint-plugin-react-hooks to 7.0.1 2025-10-24 20:41:50 +02:00
Renovate Bot
da2542cc52 chore(deps): update @swc/core to 1.13.21 2025-10-24 20:41:34 +02:00
c0b3678e63 Merge pull request #187 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.2.6
2025-10-24 15:32:56 +02:00
7e25d4110a Merge pull request #189 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.9.1
2025-10-24 15:32:18 +02:00
2a104273cb Merge pull request #188 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.46.2
2025-10-24 15:22:24 +02:00
Renovate Bot
2de323dbd3 chore(deps): update lint-staged to 16.2.6 2025-10-22 20:45:06 +02:00
Renovate Bot
94c6b52b46 chore(deps): update @types/node to 24.9.1 2025-10-21 04:42:08 +02:00
Renovate Bot
a2cbeb8108 chore(deps): update typescript-eslint monorepo to 8.46.2 2025-10-20 20:50:02 +02:00
2548976368 Merge pull request #186 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.38.0
2025-10-20 11:20:02 +02:00
841af5c01c Merge pull request #185 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.8.1
2025-10-20 11:18:21 +02:00
Renovate Bot
8d5f6722bb chore(deps): update eslint monorepo to 9.38.0 2025-10-18 04:45:02 +02:00
Renovate Bot
fdeb11e1ef chore(deps): update @types/node to 24.8.1 2025-10-17 04:45:49 +02:00
533f5b0d40 Merge pull request #184 from Mastermindzh/content/what-is-architecture-really
content: what is architecture really - first blog post in a series ab…
2025-10-14 22:55:15 +02:00
1790b2763d chore: updated the date of the latest article to today 2025-10-14 17:21:25 +02:00
d1637ab59b build(package-lock): updated package-lock to be in sync with package.json 2025-10-14 17:08:51 +02:00
b53d579b27 content: what is architecture really - first blog post in a series about software architecture 2025-10-14 17:02:19 +02:00
29d5da925d Merge pull request #183 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.46.1
2025-10-14 16:35:12 +02:00
Renovate Bot
dcce5de7dc chore(deps): update typescript-eslint monorepo to 8.46.1 2025-10-14 12:35:42 +02:00
28523be412 Merge pull request #182 from Mastermindzh/renovate/markdownlint-0.x
chore(deps): update markdownlint to 0.39.0
2025-10-14 11:26:30 +02:00
08ecb725ba Merge pull request #181 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.7.2
2025-10-14 11:25:26 +02:00
ef9d6902a2 Merge pull request #180 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.2.4
2025-10-14 10:43:03 +02:00
Renovate Bot
7e424489de chore(deps): update markdownlint to 0.39.0 2025-10-13 12:50:07 +02:00
Renovate Bot
6adaef44f1 chore(deps): update @types/node to 24.7.2 2025-10-11 20:46:44 +02:00
Renovate Bot
d0c0e67d1a chore(deps): update lint-staged to 16.2.4 2025-10-11 12:48:36 +02:00
297e55a28b Merge pull request #177 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.46.0
2025-10-10 14:08:28 +02:00
Renovate Bot
b2bebf7ad1 chore(deps): update typescript-eslint monorepo to 8.46.0 2025-10-10 04:45:53 +02:00
47d69ef868 Merge pull request #178 from Mastermindzh/renovate/major-react-monorepo
chore(deps): update eslint-plugin-react-hooks to 7.0.0
2025-10-09 22:40:57 +02:00
62074372cd Merge pull request #179 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.7.1
2025-10-09 22:38:58 +02:00
Renovate Bot
cd73a8e529 chore(deps): update @types/node to 24.7.1 2025-10-09 20:47:49 +02:00
7ddb11e48b Merge pull request #172 from Mastermindzh/renovate/font-awesome
chore(deps): update font awesome
2025-10-09 09:43:22 +02:00
025267500d Merge pull request #168 from Mastermindzh/renovate/commitlint-monorepo
chore(deps): update commitlint monorepo to 20.1.0
2025-10-09 09:42:18 +02:00
ed7c06ed3a Merge pull request #170 from Mastermindzh/renovate/typescript-5.x-lockfile
chore(deps): update typescript to 5.9.3
2025-10-09 09:41:34 +02:00
Renovate Bot
8bd8bd9c70 chore(deps): update eslint-plugin-react-hooks to 7.0.0 2025-10-09 04:47:20 +02:00
Renovate Bot
587f259793 chore(deps): update font awesome 2025-10-06 20:50:23 +02:00
Renovate Bot
829c5b17b6 chore(deps): update commitlint monorepo to 20.1.0 2025-10-06 20:50:04 +02:00
Renovate Bot
024a145259 chore(deps): update typescript to 5.9.3 2025-10-06 20:49:44 +02:00
4359926604 Merge pull request #169 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.7.0
2025-10-06 14:23:58 +02:00
72b4c2598e Merge pull request #171 from Mastermindzh/renovate/browserslist-4.x-lockfile
chore(deps): update browserslist to 4.26.3
2025-10-06 14:22:58 +02:00
eacb97ff99 Merge pull request #174 from Mastermindzh/renovate/stylelint-16.x-lockfile
chore(deps): update stylelint to 16.25.0
2025-10-06 14:21:56 +02:00
db38601960 Merge pull request #175 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.37.0
2025-10-06 14:21:12 +02:00
339489eb54 Merge pull request #173 from Mastermindzh/renovate/major-react-monorepo
chore(deps): update eslint-plugin-react-hooks to 6.1.1
2025-10-06 13:03:12 +02:00
Renovate Bot
06234dfb46 chore(deps): update @types/node to 24.7.0 2025-10-06 12:50:05 +02:00
Renovate Bot
c902c98e9b chore(deps): update browserslist to 4.26.3 2025-10-06 04:46:07 +02:00
Renovate Bot
38d02cec06 chore(deps): update eslint monorepo to 9.37.0 2025-10-04 04:46:06 +02:00
Renovate Bot
b34d598900 chore(deps): update stylelint to 16.25.0 2025-10-03 20:35:41 +02:00
Renovate Bot
d93a6ada5b chore(deps): update eslint-plugin-react-hooks to 6.1.0 2025-10-02 04:47:00 +02:00
6cd353a79f Merge pull request #167 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.45.0
2025-09-30 12:02:34 +02:00
4dd6a31659 Merge pull request #166 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.6.0
2025-09-30 12:02:03 +02:00
Renovate Bot
a2e467ee78 chore(deps): update typescript-eslint monorepo to 8.45.0 2025-09-29 20:50:10 +02:00
Renovate Bot
2c6972b55a chore(deps): update @types/node to 24.6.0 2025-09-29 20:49:54 +02:00
b5822ddd9c Merge pull request #165 from Mastermindzh/renovate/stylelint-config-recommended-scss-16.x-lockfile
chore(deps): update stylelint-config-recommended-scss to 16.0.2
2025-09-29 11:32:39 +02:00
964e47ba79 Merge pull request #163 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.2.3
2025-09-29 09:15:23 +02:00
0dea2d7b02 Merge pull request #164 from Mastermindzh/renovate/jest-monorepo
chore(deps): update jest monorepo to 30.2.0
2025-09-29 08:59:58 +02:00
2bccb24e15 Merge pull request #162 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.20
2025-09-29 08:55:37 +02:00
Renovate Bot
063c3a8fa6 chore(deps): update stylelint-config-recommended-scss to 16.0.2 2025-09-29 04:45:04 +02:00
Renovate Bot
ecc6d0a176 chore(deps): update lint-staged to 16.2.3 2025-09-28 20:45:04 +02:00
Renovate Bot
d0a99c3b09 chore(deps): update jest monorepo to 30.2.0 2025-09-28 12:36:02 +02:00
Renovate Bot
54aa37b8c5 chore(deps): update @swc/core to 1.13.20 2025-09-27 12:37:06 +02:00
e4e37e4dd0 Merge pull request #161 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.2.1
2025-09-26 09:32:38 +02:00
2e5592b1bd Merge pull request #160 from Mastermindzh/renovate/major-commitlint-monorepo
chore(deps): update commitlint monorepo to 20.0.0 (major)
2025-09-26 09:32:12 +02:00
1c5fdbc7a9 Merge pull request #159 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.19
2025-09-26 09:31:47 +02:00
Renovate Bot
906bdce9ac chore(deps): update lint-staged to 16.2.1 2025-09-25 23:14:50 +02:00
Renovate Bot
d81ef2ff92 chore(deps): update commitlint monorepo to 20.0.0 2025-09-25 15:11:31 +02:00
Renovate Bot
addd01ada7 chore(deps): update @swc/core to 1.13.19 2025-09-25 15:10:54 +02:00
73d65869d4 Merge pull request #155 from Mastermindzh/renovate/sass-1.x-lockfile
chore(deps): update sass to 1.93.2
2025-09-25 10:57:51 +02:00
dec54ce281 Merge pull request #158 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.2.0
2025-09-25 10:57:28 +02:00
4f59091d95 Merge pull request #154 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.36.0
2025-09-25 10:47:23 +02:00
2af6acb2a3 Merge pull request #157 from Mastermindzh/renovate/eslint-compat-1.x-lockfile
chore(deps): update @eslint/compat to 1.4.0
2025-09-25 10:43:05 +02:00
24f264680a Merge pull request #156 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.44.1
2025-09-25 10:42:06 +02:00
Renovate Bot
287b5ff082 chore(deps): update sass to 1.93.2 2025-09-24 15:10:40 +02:00
Renovate Bot
a81e277a5e chore(deps): update lint-staged to 16.2.0 2025-09-24 15:10:23 +02:00
Renovate Bot
3042abfa97 chore(deps): update eslint monorepo to 9.36.0 2025-09-24 15:10:05 +02:00
Renovate Bot
2cd288f0fe chore(deps): update @eslint/compat to 1.4.0 2025-09-24 15:09:48 +02:00
Renovate Bot
e59b6275b2 chore(deps): update typescript-eslint monorepo to 8.44.1 2025-09-24 15:09:31 +02:00
1e1a0988ff Merge pull request #153 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.5.2
2025-09-24 08:51:21 +02:00
f82f439ca5 Merge pull request #152 from Mastermindzh/renovate/browserslist-4.x-lockfile
chore(deps): update browserslist to 4.26.2
2025-09-24 08:50:28 +02:00
Renovate Bot
7e1ba3fb19 chore(deps): update @types/node to 24.5.2 2025-09-18 04:39:22 +02:00
Renovate Bot
176db956d1 chore(deps): update browserslist to 4.26.2 2025-09-16 12:39:22 +02:00
cf520c46dc Merge pull request #150 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.5.0
2025-09-16 09:16:10 +02:00
bc0e4a1982 Merge pull request #151 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.44.0
2025-09-16 09:13:19 +02:00
ff76ceca3e Merge pull request #149 from Mastermindzh/renovate/browserslist-4.x-lockfile
chore(deps): update browserslist to 4.26.0
2025-09-16 09:11:49 +02:00
Renovate Bot
280e66fe42 chore(deps): update @types/node to 24.5.0 2025-09-16 04:46:08 +02:00
Renovate Bot
993ebca517 chore(deps): update typescript-eslint monorepo to 8.44.0 2025-09-15 20:38:13 +02:00
Renovate Bot
ed7d9b65f3 chore(deps): update browserslist to 4.26.0 2025-09-15 20:37:57 +02:00
20c05e9eea Merge pull request #148 from Mastermindzh/renovate/stylelint-config-recommended-scss-16.x-lockfile
chore(deps): update stylelint-config-recommended-scss to 16.0.1
2025-09-15 09:20:12 +02:00
Renovate Bot
fe1e5de56f chore(deps): update stylelint-config-recommended-scss to 16.0.1 2025-09-11 20:50:16 +02:00
7a7cd336e6 Merge pull request #147 from Mastermindzh/renovate/globals-16.x-lockfile
chore(deps): update globals to 16.4.0
2025-09-10 09:39:56 +02:00
Renovate Bot
e21f5e8d4c chore(deps): update globals to 16.4.0 2025-09-10 04:41:55 +02:00
b3f4587df8 Merge pull request #146 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.43.0
2025-09-09 11:53:29 +02:00
Renovate Bot
bfa53651db chore(deps): update typescript-eslint monorepo to 8.43.0 2025-09-08 20:42:16 +02:00
15d927febd Merge pull request #144 from Mastermindzh/renovate/sass-1.x-lockfile
chore(deps): update sass to 1.92.1
2025-09-08 14:19:23 +02:00
Renovate Bot
e90d95b1e2 chore(deps): update sass to 1.92.1 2025-09-08 12:41:55 +02:00
c1592d1d5a Merge pull request #145 from Mastermindzh/renovate/stylelint-16.x-lockfile
chore(deps): update stylelint to 16.24.0
2025-09-08 09:32:42 +02:00
0e6d3de292 Merge pull request #143 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.35.0
2025-09-08 09:28:33 +02:00
Renovate Bot
3c2ea09726 chore(deps): update stylelint to 16.24.0 2025-09-07 20:43:22 +02:00
Renovate Bot
23d87d13b3 chore(deps): update eslint monorepo to 9.35.0 2025-09-05 20:35:25 +02:00
f34aa1a43a Merge pull request #142 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.3.1
2025-09-04 14:37:22 +02:00
Renovate Bot
43bdfef332 chore(deps): update @types/node to 24.3.1 2025-09-04 12:42:09 +02:00
ddd9d5b69e Merge pull request #140 from Mastermindzh/renovate/font-awesome
fix(deps): update font awesome to 7.0.1
2025-09-04 11:06:31 +02:00
03ed5dc411 Merge pull request #141 from Mastermindzh/renovate/sass-1.x-lockfile
chore(deps): update sass to 1.92.0
2025-09-04 11:06:05 +02:00
9db4f4a2d1 Merge pull request #139 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.42.0
2025-09-04 11:05:13 +02:00
Renovate Bot
fd88a753de chore(deps): update typescript-eslint monorepo to 8.42.0 2025-09-03 20:39:19 +02:00
Renovate Bot
a28c4fed8c chore(deps): update sass to 1.92.0 2025-09-03 20:39:03 +02:00
Renovate Bot
99bab4b66b fix(deps): update font awesome to 7.0.1 2025-09-03 20:38:50 +02:00
1d326acff7 Merge pull request #138 from Mastermindzh/renovate/jest-monorepo
chore(deps): update jest monorepo to 30.1.3
2025-09-03 17:12:14 +02:00
Renovate Bot
a27ef97e48 chore(deps): update jest monorepo to 30.1.3 2025-09-02 20:48:53 +02:00
567851895d Merge pull request #137 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.1.6
2025-09-02 08:59:51 +02:00
Renovate Bot
6e84cdc667 chore(deps): update lint-staged to 16.1.6 2025-09-01 20:47:20 +02:00
e6527d6e4d Merge pull request #136 from Mastermindzh/renovate/font-awesome
fix(deps): update @fortawesome/react-fontawesome to 3.0.2
2025-09-01 13:04:48 +02:00
Renovate Bot
2844a07d3e fix(deps): update @fortawesome/react-fontawesome to 3.0.2 2025-09-01 12:47:31 +02:00
e8ffeefaf8 Merge pull request #134 from Mastermindzh/renovate/browserslist-4.x-lockfile
chore(deps): update browserslist to 4.25.4
2025-09-01 11:34:30 +02:00
c333789cdb Merge pull request #135 from Mastermindzh/renovate/jest-monorepo
chore(deps): update jest monorepo to 30.1.2
2025-09-01 11:02:10 +02:00
Renovate Bot
859bc53ade chore(deps): update jest monorepo to 30.1.2 2025-09-01 04:40:21 +02:00
Renovate Bot
8221062b49 chore(deps): update browserslist to 4.25.4 2025-08-31 04:37:16 +02:00
6506e1d91e ci(husky): removed 2 deprecated lines pointing to the husky location 2025-08-28 08:24:48 +02:00
1c25f5ef05 ci(gh-jobs): jobs now run on PR to master too 2025-08-28 08:23:25 +02:00
d2488c8c1b Merge pull request #133 from Mastermindzh/renovate/gatsby-monorepo
fix(deps): update gatsby monorepo
2025-08-28 08:15:26 +02:00
9493a7b977 Merge pull request #132 from Mastermindzh/renovate/jest-monorepo
chore(deps): update jest monorepo to 30.1.1
2025-08-28 08:15:05 +02:00
Renovate Bot
d905036905 fix(deps): update gatsby monorepo 2025-08-28 01:33:32 +02:00
Renovate Bot
abab9ed263 chore(deps): update jest monorepo to 30.1.1 2025-08-27 17:36:13 +02:00
afeec5c499 Merge pull request #131 from Mastermindzh/renovate/jest-monorepo
chore(deps): update jest monorepo to 30.1.0
2025-08-27 17:33:14 +02:00
1da2b0fcf7 Merge pull request #130 from Mastermindzh/renovate/font-awesome
fix(deps): update @fortawesome/react-fontawesome to 3.0.1
2025-08-27 17:32:42 +02:00
Renovate Bot
aa6c0449a3 chore(deps): update jest monorepo to 30.1.0 2025-08-27 09:35:20 +02:00
Renovate Bot
38ab029ae2 fix(deps): update @fortawesome/react-fontawesome to 3.0.1 2025-08-27 09:35:00 +02:00
bdc4f5637f Merge pull request #129 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.41.0
2025-08-26 09:16:37 +02:00
909be554cc Merge pull request #128 from Mastermindzh/renovate/sass-1.x-lockfile
chore(deps): update sass to 1.91.0
2025-08-26 09:16:15 +02:00
Renovate Bot
1b698ff528 chore(deps): update typescript-eslint monorepo to 8.41.0 2025-08-26 01:32:32 +02:00
Renovate Bot
aad305d005 chore(deps): update sass to 1.91.0 2025-08-26 01:32:17 +02:00
9ae4290fe3 Merge pull request #127 from Mastermindzh/renovate/concurrently-9.x-lockfile
chore(deps): update concurrently to 9.2.1
2025-08-25 23:25:44 +02:00
Renovate Bot
ecb106c4c3 chore(deps): update concurrently to 9.2.1 2025-08-25 17:35:43 +02:00
1b299da29a ci(tests): reset snapshots since FA renders differently 2025-08-25 11:52:54 +02:00
070c5097d1 Merge pull request #126 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.34.0
2025-08-25 11:49:42 +02:00
912ab1e261 Merge pull request #124 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.5
2025-08-25 11:48:24 +02:00
ebe2caa94e Merge pull request #100 from Mastermindzh/renovate/major-font-awesome
fix(deps): update font awesome (major)
2025-08-25 11:47:21 +02:00
Renovate Bot
1612836a1f fix(deps): update font awesome 2025-08-25 09:34:52 +02:00
Renovate Bot
c9a3153643 chore(deps): update eslint monorepo to 9.34.0 2025-08-25 09:34:21 +02:00
Renovate Bot
5b4e802e6c chore(deps): update @swc/core to 1.13.5 2025-08-25 09:33:43 +02:00
636614930d Merge pull request #114 from Mastermindzh/renovate/eslint-compat-1.x-lockfile
chore(deps): update @eslint/compat to 1.3.2
2025-08-25 09:13:25 +02:00
1e76f0bbdd Merge pull request #115 from Mastermindzh/renovate/stylelint-config-recommended-scss-16.x
chore(deps): update stylelint-config-recommended-scss to 16.0.0
2025-08-25 09:12:17 +02:00
d1d747b011 Merge pull request #118 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.33.0
2025-08-25 09:09:05 +02:00
cbe81a5dc9 Merge pull request #116 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.3.0
2025-08-25 09:08:39 +02:00
c73ec86056 Merge pull request #117 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.1.5
2025-08-25 09:06:17 +02:00
2822cd8718 Merge pull request #120 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.40.0
2025-08-25 08:59:22 +02:00
e52ec71782 Merge pull request #119 from Mastermindzh/renovate/browserslist-4.x-lockfile
chore(deps): update browserslist to 4.25.3
2025-08-20 09:10:05 +02:00
6adc3fd57d Merge pull request #123 from Mastermindzh/renovate/font-awesome
fix(deps): update @fortawesome/react-fontawesome to 0.2.5
2025-08-20 08:59:44 +02:00
Renovate Bot
f0a3d10a1d fix(deps): update @fortawesome/react-fontawesome to 0.2.5 2025-08-20 03:58:16 +02:00
Renovate Bot
42bc5be209 chore(deps): update browserslist to 4.25.3 2025-08-19 12:06:49 +02:00
Renovate Bot
d68b3e51c4 chore(deps): update typescript-eslint monorepo to 8.40.0 2025-08-18 20:03:50 +02:00
Renovate Bot
4984dddc6b chore(deps): update lint-staged to 16.1.5 2025-08-17 12:04:57 +02:00
Renovate Bot
f1fd7f1c82 chore(deps): update @types/node to 24.3.0 2025-08-15 12:02:17 +02:00
Renovate Bot
96f224619c chore(deps): update eslint monorepo to 9.33.0 2025-08-09 06:34:11 +02:00
Renovate Bot
e3caf67f09 chore(deps): update stylelint-config-recommended-scss to 16.0.0 2025-08-08 12:49:07 +02:00
Renovate Bot
65b81509f9 chore(deps): update @eslint/compat to 1.3.2 2025-08-08 12:48:40 +02:00
d94d664f2f Merge pull request #111 from Mastermindzh/renovate/eslint-plugin-prettier-5.x-lockfile
chore(deps): update eslint-plugin-prettier to 5.5.4
2025-08-08 10:03:34 +02:00
aee00a1d89 Merge pull request #112 from Mastermindzh/renovate/gatsby-monorepo
fix(deps): update gatsby to 5.14.6
2025-08-08 09:59:05 +02:00
04b1f0c1bb Merge pull request #113 from Mastermindzh/renovate/stylelint-16.x-lockfile
chore(deps): update stylelint to 16.23.1
2025-08-08 09:58:32 +02:00
Renovate Bot
58d37e4941 chore(deps): update stylelint to 16.23.1 2025-08-07 20:41:24 +02:00
Renovate Bot
2740ec31e8 fix(deps): update gatsby to 5.14.6 2025-08-06 20:49:12 +02:00
Renovate Bot
709b0f21cf chore(deps): update eslint-plugin-prettier to 5.5.4 2025-08-06 12:44:31 +02:00
c73fa4773e Merge pull request #106 from Mastermindzh/renovate/typescript-5.x-lockfile
chore(deps): update typescript to 5.9.2
2025-08-06 11:04:44 +02:00
e8fb994aaf Merge pull request #109 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.39.0
2025-08-06 11:04:25 +02:00
51859f5fdb Merge pull request #110 from Mastermindzh/renovate/sass-1.x-lockfile
chore(deps): update sass to 1.90.0
2025-08-06 10:59:05 +02:00
0117b60f24 Merge pull request #107 from Mastermindzh/renovate/lint-staged-16.x-lockfile
chore(deps): update lint-staged to 16.1.4
2025-08-06 09:23:40 +02:00
Renovate Bot
fec5843cff chore(deps): update sass to 1.90.0 2025-08-06 04:45:13 +02:00
Renovate Bot
d723b29c4f chore(deps): update typescript-eslint monorepo to 8.39.0 2025-08-05 20:44:18 +02:00
Renovate Bot
f0fbd541ea chore(deps): update typescript to 5.9.2 2025-08-05 20:43:58 +02:00
Renovate Bot
917ab7d901 chore(deps): update lint-staged to 16.1.4 2025-08-05 20:43:42 +02:00
a56058027e Merge pull request #108 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.2.0
2025-08-05 12:49:27 +02:00
Renovate Bot
f128512bfd chore(deps): update @types/node to 24.2.0 2025-08-04 12:44:51 +02:00
64ce161623 Merge pull request #105 from Mastermindzh/renovate/stylelint-16.x-lockfile
chore(deps): update stylelint to 16.23.0
2025-07-30 13:22:58 +02:00
Renovate Bot
4f39d58d3b chore(deps): update stylelint to 16.23.0 2025-07-29 20:44:17 +02:00
abdfc5c100 Merge pull request #104 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.3
2025-07-29 13:03:34 +02:00
Renovate Bot
6f3a81e694 chore(deps): update @swc/core to 1.13.3 2025-07-29 12:45:18 +02:00
779c26cc9f Merge pull request #103 from Mastermindzh/renovate/eslint-monorepo
chore(deps): update eslint monorepo to 9.32.0
2025-07-28 09:40:05 +02:00
Renovate Bot
037bfc816d chore(deps): update eslint monorepo to 9.32.0 2025-07-25 20:58:10 +02:00
28591fe51c Merge pull request #102 from Mastermindzh/renovate/font-awesome
fix(deps): update @fortawesome/react-fontawesome to 0.2.3
2025-07-24 12:04:54 +02:00
05a571b8b2 Merge pull request #101 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.2
2025-07-24 10:09:07 +02:00
Renovate Bot
b5b805e8eb fix(deps): update @fortawesome/react-fontawesome to 0.2.3 2025-07-23 20:54:49 +02:00
Renovate Bot
8b88c801cd chore(deps): update @swc/core to 1.13.2 2025-07-23 12:37:47 +02:00
a79549758b Merge pull request #99 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.1.0
2025-07-22 21:16:50 +02:00
Renovate Bot
c63a9e0743 chore(deps): update @types/node to 24.1.0 2025-07-22 20:37:25 +02:00
7459a71ea1 Merge pull request #98 from Mastermindzh/renovate/jest-monorepo
chore(deps): update jest monorepo to 30.0.5
2025-07-22 20:03:09 +02:00
Renovate Bot
d48c4c078e chore(deps): update jest monorepo to 30.0.5 2025-07-22 12:37:29 +02:00
08eef25094 Merge pull request #97 from Mastermindzh/renovate/typescript-eslint-monorepo
chore(deps): update typescript-eslint monorepo to 8.38.0
2025-07-22 01:40:36 +02:00
Renovate Bot
ce84bbdd51 chore(deps): update typescript-eslint monorepo to 8.38.0 2025-07-21 20:49:06 +02:00
4ab8ccd715 Merge pull request #93 from Mastermindzh/renovate/eslint-plugin-prettier-5.x-lockfile
chore(deps): update eslint-plugin-prettier to 5.5.3
2025-07-21 09:06:46 +02:00
72acf4ab9e Merge pull request #95 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.1
2025-07-21 09:06:07 +02:00
Renovate Bot
dc871724cd chore(deps): update eslint-plugin-prettier to 5.5.3 2025-07-20 23:08:43 +02:00
Renovate Bot
2047bc4424 chore(deps): update @swc/core to 1.13.1 2025-07-20 23:08:30 +02:00
1b08ff5443 Merge pull request #96 from Mastermindzh/renovate/prettier-plugin-packagejson-2.x-lockfile
chore(deps): update prettier-plugin-packagejson to 2.5.19
2025-07-20 22:45:37 +02:00
d650f7e643 Merge pull request #94 from Mastermindzh/renovate/node-24.x-lockfile
chore(deps): update @types/node to 24.0.15
2025-07-20 22:43:49 +02:00
3dd9b4c13b Merge pull request #92 from Mastermindzh/renovate/eslint-config-prettier-10.x-lockfile
chore(deps): update eslint-config-prettier to 10.1.8
2025-07-20 22:43:14 +02:00
Renovate Bot
cc470236e0 chore(deps): update prettier-plugin-packagejson to 2.5.19 2025-07-20 16:06:18 +02:00
Renovate Bot
8976100b00 chore(deps): update @types/node to 24.0.15 2025-07-19 02:52:09 +02:00
Renovate Bot
5679236b48 chore(deps): update eslint-config-prettier to 10.1.8 2025-07-18 20:50:20 +02:00
87979429dc Merge pull request #91 from Mastermindzh/renovate/stylelint-16.x-lockfile
chore(deps): update stylelint to 16.22.0
2025-07-18 13:51:47 +02:00
Renovate Bot
b9721ffdc6 chore(deps): update stylelint to 16.22.0 2025-07-18 13:20:04 +02:00
7c2233700f Merge pull request #81 from Mastermindzh/snyk-fix-fed777eff9597bb5c635f2c6581f95b5
[Snyk] Security upgrade prismjs from 1.29.0 to 1.30.0
2025-07-18 11:47:12 +02:00
7981e30496 Merge pull request #89 from Mastermindzh/renovate/husky-9.x
chore(deps): update husky to 9.1.7
2025-07-18 11:46:53 +02:00
848aaf890b Merge pull request #88 from Mastermindzh/renovate/node-19.x
chore(deps): update node.js to v19.9.0
2025-07-18 11:46:05 +02:00
c37b3fa824 Merge pull request #87 from Mastermindzh/renovate/swc-monorepo
chore(deps): update @swc/core to 1.13.0
2025-07-18 11:45:34 +02:00
Renovate Bot
b76ac17824 chore(deps): update husky to 9.1.7 2025-07-18 10:21:03 +02:00
Renovate Bot
7b5df78a2f chore(deps): update node.js to v19.9.0 2025-07-18 10:20:40 +02:00
Renovate Bot
682bf161a9 chore(deps): update @swc/core to 1.13.0 2025-07-18 10:20:23 +02:00
31597d25a6 Merge pull request #86 from Mastermindzh/feat/update
Feat/update
2025-07-16 19:51:51 +02:00
a7710a4c32 Merge branch 'feat/update' of github.com:Mastermindzh/rickvanlieshout.com into feat/update 2025-07-16 19:34:01 +02:00
1cb3ea2532 content: updated resume 2025-07-16 19:29:28 +02:00
0ad80becd6 content: updated the resume 2025-07-16 19:08:46 +02:00
02e4c01bd0 fix: updated sass to use @use instead of @import 2025-07-16 11:44:05 +02:00
a83befd5b2 chore: formatted, prettified, legacy deps 2025-07-16 10:52:08 +02:00
7c93cd76d9 chore: update 2025-07-15 17:28:41 +02:00
snyk-bot
6a9b948601 fix: package.json & package-lock.json to reduce vulnerabilities
The following vulnerabilities are fixed with an upgrade:
- https://snyk.io/vuln/SNYK-JS-PRISMJS-9055448
2025-03-14 07:41:49 +00:00
112 changed files with 8429 additions and 12310 deletions

View File

@@ -4,16 +4,16 @@ name: default
steps:
- name: install
image: node:19.4.0
image: node:19.9.0
commands:
- npm install
- name: test
image: node:19.4.0
image: node:19.9.0
commands:
- npm run test:coverage
- name: build
image: node:19.4.0
image: node:19.9.0
commands:
- npm run build

View File

@@ -1,4 +0,0 @@
*.*
!*.ts
!*.tsx
/public/

View File

@@ -1,53 +0,0 @@
{
"env": {
"browser": true
},
"extends": [
"plugin:import/typescript",
"plugin:import/errors",
"airbnb-typescript",
"@mastermindzh/eslint-config",
"prettier"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.json"
},
"plugins": [
"react",
"jest",
"@typescript-eslint",
"simple-import-sort",
"prettier"
],
"rules": {
"import/no-extraneous-dependencies": [
"error",
{
"devDependencies": [
"**/*.test.ts",
"**/*.test.tsx",
"**/internal/**/*.ts"
]
}
],
"@typescript-eslint/no-unused-vars": ["off"],
"@typescript-eslint/no-use-before-define": ["off"],
"@typescript-eslint/quotes": ["error", "double"],
"@typescript-eslint/naming-convention": ["error", {
"format": ["camelCase", "UPPER_CASE", "snake_case", "PascalCase"],
"leadingUnderscore": "allow",
"selector": "parameter"
}],
"react/static-property-placement": ["off"],
"react/prop-types": ["off"],
"no-shadow": "off",
"@typescript-eslint/no-shadow": ["error"]
},
"settings": {
"import/resolver": {
"typescript": {}
}
}
}

View File

@@ -5,6 +5,9 @@ on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
release:
@@ -26,8 +29,3 @@ jobs:
- name: Run tests
run: npm run test
# - name: Release
# env:
# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
# run: npm run semantic-release

View File

@@ -1,6 +1,3 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npx --no-install commitlint --edit "$1"
npm run lint:staged
npm run test

View File

@@ -1,2 +0,0 @@
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

1
.npmrc Normal file
View File

@@ -0,0 +1 @@
legacy-peer-deps=true

3
.nvmrc
View File

@@ -1 +1,2 @@
19.8.1
v22.12.0

View File

@@ -1,3 +1,4 @@
module.exports = {
...require("@mastermindzh/prettier-config")
...require("@mastermindzh/prettier-config"),
trailingComma: "all",
};

22
.prettierrc.json Normal file
View File

@@ -0,0 +1,22 @@
{
"printWidth": 100,
"useTabs": false,
"tabWidth": 2,
"singleQuote": false,
"jsxSingleQuote": false,
"quoteProps": "as-needed",
"trailingComma": "all",
"bracketSpacing": true,
"bracketSameLine": false,
"arrowParens": "always",
"requirePragma": false,
"insertPragma": false,
"proseWrap": "preserve",
"htmlWhitespaceSensitivity": "css",
"endOfLine": "lf",
"semi": true,
"singleAttributePerLine": false,
"embeddedLanguageFormatting": "auto",
"vueIndentScriptAndStyle": false,
"experimentalTernaries": false
}

View File

@@ -9,13 +9,16 @@
"font-weight-notation": "named-where-possible",
"function-url-no-scheme-relative": true,
"function-url-quotes": "always",
"max-empty-lines": 1,
"no-descending-specificity": true,
"no-duplicate-selectors": true,
"order/order": ["custom-properties", "declarations"],
"order/order": [
[
"custom-properties",
"declarations"
]
],
"order/properties-alphabetical-order": true,
"property-no-unknown": [true, { "ignoreProperties": ["/^lost-/"] }],
"string-quotes": "double",
"value-keyword-case": "lower"
}
}

View File

@@ -4,6 +4,7 @@
"disqus",
"fontawesome",
"fortawesome",
"frontliners",
"frontmatter",
"gitops",
"homelab",

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -18,18 +18,26 @@ template: "page"
**Open-source aficionado**<br />
_Always_<br />
A fair share of my private work is done through open-source media. I don't have a portfolio but I have a [Github](https://github.com/mastermindzh) where I share most things.
A fair share of my private work is done through open-source media. I don't have a portfolio but I have a [Github](https://github.com/mastermindzh) where I share most things. If you're interested in what else I do, or why, let me know and I'll share a detailed description.
**CTO at Frontliners (previously INFORIT)**<br />
_2018 - Now_<br />
At Frontliners I am responsible for the entire technical architecture of the new TFX stack that I launched shortly after 2018. This involves setting up and maintaining a modern event-based microservice architecture on a Kubernetes-based SaaS cloud solution and migrating to modern programming languages such as dotnetcore and React.
At Frontliners I am responsible for the entire technical architecture of the new TFX stack that I launched shortly after 2018. This involves setting up and maintaining a modern event-based microservice architecture on a Kubernetes-based SaaS cloud solution and migrating to modern programming languages such as dotnetcore, Supabase and React. We've delivered a few smaller pieces of software but mainly focus on building a next-gen Transport Management System called TFX.
The other main responsibility I have is creating and maintaining a coherent team of lead developers by sharing knowledge, making decisions, and empowering leads to explore technologies outside of their comfort zone.
The other main responsibility I have is creating and maintaining, and hiring, a coherent team of (lead) engineers by sharing knowledge, making decisions, and empowering them to explore technologies outside of their comfort zone.
This includes everything from platform to e2e engineering.
During my time at Frontliners, the company has grown from 5-7 in-house developers on a single product to 35-40 technical engineers on multiple projects.
At Frontliners I also help with the recruitment of new employees, setting up and maintaining agile strategies including proper test management, and general software development.
During my time at Frontliners, we've grown from 5-7 in-house developers to 10, full-sized, SCRUM teams.
The teams I manage will be listed below. Some of the core concepts they work with will also be listed.
Apart from the last one I also play an active role in them:
Most relevant technologies used: dotnetcore, React, Angular, Kafka, RabbitMQ, Mongo, PostgreSQL, Growthbook, Docker & Kubernetes
- 4 Full-fledged (6-8 people) Scrum development teams working on the latest product.
- day-to-day management of people done by "Chapter leads"
- React, Docker, .NET 9+ (core), Mongo, Kafka, Debezium, DDD, CQRS
- Business Integration team (Supabase, Kysely, PostgreSQL)
- Platform team (Kubernetes, Terraform, ArgoCD, CI/CD pipelines, Vault, Keycloak, etc...)
- Legacy team (ASP.NET, MSSQL, MongoDB, Elasticsearch)
- Legacy team (Clarion, SQL-Sybase)
**Hanflex employee**<br />
_September 2015 - July 2018_<br />
@@ -64,6 +72,7 @@ Building an interactive and fully customizable dashboard on top of VAA's existin
I'll list some of the training courses I've had whilst working.
Some of these have (official) certificates, some don't, but all have brought value and knowledge.
- Domain Driven Design [Vijfhart](./DDD-vijfhart.pdf)
- Young Executive Program (YEP) - [De Baak](https://debaak.nl/trainingen/young-executives-program)
- Hiring & interview training ([icm.nl](https://www.icm.nl/opleidingen-en-trainingen/hrm/selectiegesprekken-voeren/))
- Conversation techniques & de-escalation ([TIJDwinst.com](https://gesprekstechnieken.com/cursus-gesprekstechnieken/)](<https://gesprekstechnieken.com/cursus-gesprekstechnieken/>)).

View File

@@ -102,7 +102,7 @@ First, let's add a script to the `package.json` that will do our commit for us:
```json
{
"scripts": {
"commit": "git-cz",
"commit": "git-cz"
}
}
```
@@ -138,14 +138,7 @@ module.exports = {
"subject-full-stop": [2, "never", "."],
"type-case": [2, "always", "lower-case"],
"type-empty": [2, "never"],
"type-enum": [
2,
"always",
[
"first type",
"second type",
],
],
"type-enum": [2, "always", ["first type", "second type"]],
},
prompt: {
questions: {
@@ -155,7 +148,6 @@ module.exports = {
},
},
};
```
As you can see we have configured a whole bunch of things, but there are 2 things that matter for now:
@@ -234,8 +226,7 @@ module.exports = {
emoji: "💎",
},
refactor: {
description:
"A code change that neither fixes a bug nor adds a feature",
description: "A code change that neither fixes a bug nor adds a feature",
title: "Code Refactoring",
emoji: "📦",
},
@@ -274,12 +265,10 @@ module.exports = {
},
},
scope: {
description:
"What is the scope of this change (e.g. component or file name)",
description: "What is the scope of this change (e.g. component or file name)",
},
subject: {
description:
"Write a short, imperative tense description of the change",
description: "Write a short, imperative tense description of the change",
},
body: {
description: "Provide a longer description of the change",
@@ -377,7 +366,7 @@ First, let's add some npm scripts again:
"release": "standard-version",
"release:minor": "standard-version --release-as minor",
"release:patch": "standard-version --release-as patch",
"release:major": "standard-version --release-as major",
"release:major": "standard-version --release-as major"
}
}
```

View File

@@ -14,7 +14,6 @@ description: "Flashing the LSI-9211 used to be way more difficult, luckily the E
socialImage: ./media/flash-result.jpg
---
I've been building a new storage-oriented server for a while now and have yet again decided to go with (3 +1 backup) LSI 9211 raid controllers.
The reason I keep going for these specific raid controllers is quite simple. The card can theoretically support (8x500MB) 4GB/s in throughput divided over 8 drives (2x SFF-8087) which is near the maximum for consumer hard drives.

View File

@@ -31,7 +31,7 @@ But then there's another kind.
The kind that settles into your bones. The kind that haunts you during the quiet hours. The kind that never finds a conclusion.
That kind is not absence. It's ***gone***. Irrevocable, final, cruel. A door slammed shut that you still find yourself knocking on, long after youve forgotten why you started.
That kind is not absence. It's **_gone_**. Irrevocable, final, cruel. A door slammed shut that you still find yourself knocking on, long after youve forgotten why you started.
It never opens. And still, you try the handle every now and then.
@@ -39,13 +39,13 @@ It never opens. And still, you try the handle every now and then.
Losing a loved one doesnt stay in one room of your house though, it isn't one door that is locked. It leaks under doors and through cracks. You find it in the most unexpected places.
You're sipping coffee with someone, and they mention a trip they took. Suddenly, you're remembering the trip *you* never took. The one you'd planned. The one that cancer took from you.
You're sipping coffee with someone, and they mention a trip they took. Suddenly, you're remembering the trip _you_ never took. The one you'd planned. The one that cancer took from you.
They talk about a shared playlist. You remember the song you danced to in the rain, soaking wet but laughing anyway. The same song you now skip every time it comes on because it hurts too much
Someone laughs about chipped mugs. You think of the one she cracked and called "vintage," and how it's still at the back of your cabinet. Untouched. Sacred.
Its like walking through a museum where only *you* know whats behind the glass.
Its like walking through a museum where only _you_ know whats behind the glass.
> They talk, they laugh, the world goes on,<br />
> Yet I sit with shadows, from dusk to dawn. <br />
@@ -56,9 +56,9 @@ Its like walking through a museum where only *you* know whats behind the g
<img src="/media/the-flashback-no-one-sees.png" alt="A foggy bathroom mirror with a red lipstick kiss at the center, surrounded by a shadowy, intimate atmosphere.">
</figure>
These are what I call *mind pops*. Short for Involuntary Autobiographical Memory Chains. I wrote a journal-like book once, and later a smaller one. I wanted to share them. I tried. But I was never brave enough to.
These are what I call _mind pops_. Short for Involuntary Autobiographical Memory Chains. I wrote a journal-like book once, and later a smaller one. I wanted to share them. I tried. But I was never brave enough to.
Mind pops come uninvited. And they come *hard*.
Mind pops come uninvited. And they come _hard_.
Here are some examples from my book:
- The eyeliner she never quite got even.
@@ -77,7 +77,7 @@ Theyre not just memories. Theyre grenades. Quiet ones. You never know when
## Unfair doesnt even begin to cover it
We grow up believing that the world has some kind of order to it. That bad things happen, sure—but not *this* bad. Not *this* unfair.
We grow up believing that the world has some kind of order to it. That bad things happen, sure—but not _this_ bad. Not _this_ unfair.
You lose someone who made life feel infinite. You watch them disappear into the haze of hospital lights and soft-spoken specialists.
Cancer doesnt care if youre young. Or kind.<br />
@@ -99,11 +99,11 @@ For a long time, no one knew. Most don't, still.
People see the version of you they expect: Smiling. Joking. Coping. Existing.<br />
But behind the eyes, youre unraveling. Constantly. Because grief doesnt pause.<br />
Not ***really***.
Not **_really_**.
Sharing this is hard. Not because I dont want to, but because it makes you so vulnerable. Because as you're writing or speaking, memories pop up uninvited. They derail your words. They choke your sentences. They just pop in... bastards...
And even when you manage to share, others often dont understand. They compare. They say things like “I lost someone too,” but its different. This kind of grief? This kind of loss? Its heavier. It cuts deeper. And hearing it treated like its the same as all the rest—*that* makes you angry.
And even when you manage to share, others often dont understand. They compare. They say things like “I lost someone too,” but its different. This kind of grief? This kind of loss? Its heavier. It cuts deeper. And hearing it treated like its the same as all the rest—_that_ makes you angry.
Heres something I once wrote, when I thought no one would ever read it:
@@ -135,19 +135,19 @@ If I eat alone, at a restaurant, I order what she wouldve. (who do I kid, I s
And I wrote a song. Its unfinished though—like she was.
**🎵 (Refrain)**<br />
*A strand of blonde hair, as delicate as sun,*<br />
*A mystery found, in silence it's spun.*<br />
*But memory, like a fleeting breeze,*<br />
*Fades away as a haze, in the time we seize.*<br /><br />
_A strand of blonde hair, as delicate as sun,_<br />
_A mystery found, in silence it's spun._<br />
_But memory, like a fleeting breeze,_<br />
_Fades away as a haze, in the time we seize._<br /><br />
**🎶(Verse)**<br />
*Days pass like rustling leaves,*<br />
*Stories fade, like quiet thieves.*<br />
*How swiftly memory slips away,*<br />
*Like an old melody, lost in the fray.*<br />
_Days pass like rustling leaves,_<br />
_Stories fade, like quiet thieves._<br />
_How swiftly memory slips away,_<br />
_Like an old melody, lost in the fray._<br />
*A mysterious gate, in the labyrinth of the mind,*<br />
*Locked and hidden, what secrets behind?*
_A mysterious gate, in the labyrinth of the mind,_<br />
_Locked and hidden, what secrets behind?_
As I'm writing this blog however, I have a sudden urge to add sound to the lyrics, it'll still be unfinished, but a little farther along.
I used both a piano and a viola to give it a more interesting sound than just the piano.
@@ -175,7 +175,7 @@ She once told me something that still echoes today:
> "You have to grieve me, for a while... and then you move on. <br />
> You find someone else to love. Someone who makes you feel something again. <br /> You deserve that."
I shook my head. *"I cant. I **wont**. Not because I dont want to feel again. But because abstinence, to me, feels like remembering you as you are. Eternal."* <br />
I shook my head. _"I cant. I **wont**. Not because I dont want to feel again. But because abstinence, to me, feels like remembering you as you are. Eternal."_ <br />
We both cried after that. For different reasons, I think.
### My words weren't true though
@@ -192,7 +192,7 @@ I know grief isnt rational. It doesnt follow clean lines.<br />
And maybe thats what hurts most of all—knowing I tried, and still came back to the same place. <br />
Alone, but full of someone who isnt here.
One day... *maybe*.
One day... _maybe_.
## Why Im finally speaking
@@ -227,12 +227,12 @@ Ive met people over the years whove carried this same grief. And some of t
On the edge.
Wondering if theres peace on the other side of absence.<br />
Let me say this clearly: I have never thought of taking that road for myself. If anything, I would *ask* for eternal life. Even with the grief.<br />
Let me say this clearly: I have never thought of taking that road for myself. If anything, I would _ask_ for eternal life. Even with the grief.<br />
But if you are someone who has stood on that edge:
**Dont. Please.**
The pain is real. The grief is heavy. But life—*even broken life*—has light in it still. And sometimes, all you need is one person willing to sit with you in the dark.
The pain is real. The grief is heavy. But life—_even broken life_—has light in it still. And sometimes, all you need is one person willing to sit with you in the dark.
Let me be that person for a moment. Just long enough to remind you: the door might be closed, but the room isnt empty.
@@ -241,7 +241,7 @@ Whatever you do, don't pass on the pain.
## What help looks like
Over the past two years, Ive slowly—*achingly*—learned to live with it.
Over the past two years, Ive slowly—_achingly_—learned to live with it.
And honestly, I'm happier now than I've ever been since.
Ive had friends. Real ones. Some with the training to guide me through the murk. Others who simply sat there while I unraveled, trying their best.
@@ -252,7 +252,7 @@ They had always been there, I just didn't allow them to be there for me before.
Ive learned that grief isnt a wall to climb or a puzzle to solve. Its a landscape.
You dont conquer it.<br />
You *walk it*. One aching step at a time.<br />
You _walk it_. One aching step at a time.<br />
And if you're lucky... you dont walk it alone.
### To those who held me together
@@ -287,7 +287,7 @@ Still holding her memory, but not drowning in it.
## Before I finally sign off
This entire blog was something I never thought I could write.
And what comes next,this next part, is something I swore I *never* would share.
And what comes next,this next part, is something I swore I _never_ would share.
But here we are.
@@ -353,4 +353,4 @@ A happy one">
If youve read this far—thank you.
That alone means more than you know.
*- Rick, mastermindzh, lycan, xxxroosjexxx, and other alias' you might know me from.*
_- Rick, mastermindzh, lycan, xxxroosjexxx, and other alias' you might know me from._

View File

@@ -44,7 +44,7 @@ One of the most satisfying aspects of IaC is the ability to automate even the sm
Setting up UptimeKuma is straightforward, you can simply use our old friend Docker:
```docker run -d --name uptime-kuma -v ./data/uptimekuma:/app/data -p 3001:3001 louislam/uptime-kuma```
`docker run -d --name uptime-kuma -v ./data/uptimekuma:/app/data -p 3001:3001 louislam/uptime-kuma`
And access the Dashboard by navigating to <http://localhost:3001> to configure your monitors.
But that isn't automatic enough for me, I like to put my things in compose files for home usage.
@@ -65,8 +65,8 @@ labels:
This actually does 2 things:
- creates a group with the *key/id* `monitoring` and the name `Monitoring`
- Adds a monitor with the *key/id* `uptime_kuma` to UptimeKuma with the type `http`, name `Kuma status monitoring`, and url `http://${HOST_IP}:3001`
- creates a group with the _key/id_ `monitoring` and the name `Monitoring`
- Adds a monitor with the _key/id_ `uptime_kuma` to UptimeKuma with the type `http`, name `Kuma status monitoring`, and url `http://${HOST_IP}:3001`
Adding these labels, whilst AutoKuma is running and configured to pick up labels starting with `kuma` is enough for monitors to show up (after restarting the containers).
All in all, my `docker-compose.yml` file for both UptimeKuma and AutoKuma now looks like this:

View File

@@ -0,0 +1,138 @@
---
title: What is Software Architecture (Really)?
date: "2025-10-14"
template: "post"
category: "software-architecture"
tags:
- "software architecture"
- "software development"
- "engineering culture"
- "team dynamics"
- "people management"
- "team maturity"
- "frontliners"
- "adaptability"
description: "Software architecture isnt a fixed design or a set of diagrams, its the evolving set of decisions that guide how a system behaves and grows with its team."
socialImage: ./media/compass.png
---
## A new category on rickvanlieshout.com: Software Architecture
This new category is about the *real* side of software architecture.
Not buzzwords, not picture-perfect diagrams, but the messy, human part of designing systems that actually work.
Ive spent many years working with different kinds of architectures, from tightly coupled monoliths to sprawling microservice landscapes. Along the way, Ive learned that architecture isnt about doing things the “right” way, its about understanding *why* youre doing them in the first place, and how they fit into your team and products reality.
Note that this applies both to enterprise systems as well as open-source initiatives.
## What software architecture actually is
Software architecture is the set of decisions that define how a system behaves, evolves, and is understood over time.
Its not the framework, not the diagram, and not the shiny technology you picked. Its the *reasoning* behind those things, and how they hold up when the system changes.
If software design is about the details, like how classes interact, how APIs are structured, and how code is organized, architecture is about direction.
Its the compass that helps the team navigate change without losing its bearings.
Good architecture provides just enough structure for a team to move fast, without locking them into a corner. Its the scaffolding around the code, the **shared mental model** that keeps complexity in check.
But architecture doesnt exist in isolation. The same design that works beautifully in one place can fail completely in another, which brings us to the one factor most people overlook: **context.**
## Why context always matters
Theres no single best architecture, only architectures that make sense in a specific context.
A perfect design on paper might fail completely when you drop it into the wrong environment. The right architecture depends on your product stage, your constraints, and, most importantly, your team.
At Frontliners, weve seen this up close.
We took on the task of replacing a monolith that had been in production for more than 25 years. It was deeply intertwined with the business, used everywhere, and full of edge cases that only existed because of decades of real-world use.
To make matters worse, these edge cases are often only known to some users, others just "follow what they've been taught".
We didnt have a large or deeply experienced team at the time, but we did have a strong sense of purpose.
We knew we wanted to modernize, to move toward something distributed and scalable, but we also knew we couldnt do it all at once. That meant making tough decisions, again and again, weighing what we could achieve now against what would still make sense later. This is especially true from a technical perspective as during this tumultuous time we've switched both CPO and CEO multiple times. They all offered new and shiny things, and tech was left trying to realize them within increasingly shorter timelines.
We focused on the people we had, their strengths, their limits, their growth potential, and built an architecture that could *grow* with them.
It wasnt perfect, but it gave us some momentum, and that momentum led us to something sustainable.
Still, even with the best intentions, its easy to lose perspective once youve found a path that seems to work. The next challenge we faced wasnt technical at all, it was cultural.
## When good principles turn into dogma
During our early microservices phase, we fell into a trap many teams do.
We started creating “rules” that sounded right, but didnt always fit reality.
Things like *“you can only do X”* or *“you can NEVER depend on another service”*.
And whilst I, as the architect or CTO, never called these "rules" (rather: guidelines), when they were communicated between layers of old <> new developers they often turned into "rules".
Rules like that can be comforting because they feel like control, but theyre often just fear in disguise.
Take something like route calculation. When you have hundreds of parameters and thousands of routes, you cant pre-compute every possible scenario. Sometimes you need to depend on another service, and thats fine. Architecture should adapt to problems, not deny their existence.
The problem wasnt the technology, it mostly never is, it was the mindset.
Without a clear product goal, people cling to certainty. Those “rules” gave us a sense of safety, but they also made change harder. We eventually had to tear those walls down and rebuild our way of thinking, together.
That rebuilding forced us to look inward and ask hard questions about who we were as a team. Because architecture isnt just about systems, its about people.
## Architecture and team maturity: balancing trade-offs
Every architecture exists in the shadow of the team that builds it.
A highly mature, cross-functional team can handle complexity. A newer or smaller team cannot, no matter how good the intentions are.
If your architecture outpaces your teams ability to understand or maintain it, its not a good architecture for you.
Progress sometimes means taking two steps forward and one step back. You might accept a short-term compromise, a “bad” thing, to enable the next leap forward.
And thats okay.
Because architecture isnt a competition, its a conversation. The best systems evolve through collaboration, not commandments.
Let the team make mistakes, learn, and recover. If you enforce every decision from above, youll gain consistency, but lose creativity and ownership.
Every engineer should be part of that conversation. They dont have to think about architecture every day, but they should *care* about it. Curiosity and challenge keep architecture alive.
Yet even with a healthy mindset, time changes everything. The longer a team works in the same system, the easier it becomes to stop questioning it.
## Choice blindness and the value of fresh eyes
As teams settle into a certain way of working, patterns start to feel “normal.”
Pain points fade into the background, awkward workarounds become invisible (even desired!). Over time, everyone forgets that things could be different. I call this *choice blindness*, when familiarity blinds you to your own design decisions.
Thats why new hires are so valuable.
They dont carry the same assumptions. They look at your system and ask the uncomfortable questions:
“Why does this work like that?”
“Is that rule still needed?”
“Has the context changed since we made that decision?”
Sometimes those questions sting. But theyre essential, because context *does* change.
Teams evolve, products evolve, constraints evolve, and what once was a good choice might be holding you back now.
Helping teams see those patterns and guide that evolution is what good architects do best.
## The role of the architect
An architects job therefore isnt to dictate (though they are often given that power), its to clarify.
They connect the big picture to the teams day-to-day, make trade-offs explicit, and keep people aligned. The most valuable skill an architect has isnt technical, its adaptability.
A good architecture isnt static. It bends with the product, the people, and the business.
And that adaptability only exists when the team is part of the conversation.
Architecture thats understood by everyone lasts longer, because it belongs to everyone.
And that shared ownership matters, because architecture isnt something you finish, its something you *continually* shape.
## Architecture is ongoing, not final
Architecture is never done. Its a living process that shifts with each decision, sprint, and release.
That constant evolution can look chaotic from the outside. To stakeholders or customers, it might even seem like were changing direction all the time.
But thats exactly what makes a system resilient, it changes with its context.
You cant plan your way to perfection, you can only *evolve* your way there.
The key is communication. When we explain *why* were making architectural changes, and how they serve the product long-term, that “technical mess” starts to look like healthy adaptation.
A system that never changes is a dead one.
Thats something we learned first-hand. At Frontliners, we saw how both people and systems evolve, and how one without the other simply doesnt work.
## Wrapping up
At Frontliners, we started with a thirty-year-old monolith and a small, still-growing team.
We worked through complexity, limitations, and doubt. We made decisions that werent perfect, but they kept us moving.
Now, we have the right people and the right balance.
Were building something sustainable and great. What helped us wasnt just the technical architecture, but its *ability to change with its context*.
That, to me, is what software architecture really is.
In the next article, well look at how these ideas translate into structure, comparing **monoliths, distributed monoliths, and microservices**, and when each one actually makes sense in the real world.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

65
eslint.config.js Normal file
View File

@@ -0,0 +1,65 @@
const mastermindzhConfig = require("@mastermindzh/eslint-config");
const typescriptEslint = require("@typescript-eslint/eslint-plugin");
const typescriptParser = require("@typescript-eslint/parser");
const importPlugin = require("eslint-plugin-import");
const reactPlugin = require("eslint-plugin-react");
module.exports = [
// Global ignores (replaces .eslintignore)
{
ignores: [
"dist/**",
"build/**",
"public/**",
".cache/**",
"node_modules/**",
"*.config.js",
"*.config.ts",
],
},
...mastermindzhConfig,
{
// Only lint TypeScript files (matching your .eslintignore pattern)
files: ["**/*.ts", "**/*.tsx"],
languageOptions: {
parser: typescriptParser,
parserOptions: {
project: "./tsconfig.json",
},
},
plugins: {
"@typescript-eslint": typescriptEslint,
import: importPlugin,
react: reactPlugin,
},
// Your project-specific rules
rules: {
// Import rules
"import/no-extraneous-dependencies": [
"error",
{
devDependencies: ["**/*.test.ts", "**/*.test.tsx", "**/internal/**/*.ts"],
},
],
// TypeScript rules
"@typescript-eslint/no-unused-vars": "off",
"@typescript-eslint/no-use-before-define": "off",
// Use the correct rule name for quotes
quotes: ["error", "double"],
"@typescript-eslint/naming-convention": [
"error",
{
format: ["camelCase", "UPPER_CASE", "snake_case", "PascalCase"],
leadingUnderscore: "allow",
selector: "parameter",
},
],
// React rules
"react/static-property-placement": "off",
"react/prop-types": "off",
// Shadow rules
"no-shadow": "off",
"@typescript-eslint/no-shadow": "error",
},
},
];

View File

@@ -1,18 +1,10 @@
import path from "path";
const templates = Object.freeze({
indexTemplate: path.resolve(
"./src/templates/IndexTemplate/IndexTemplate.tsx",
),
notFoundTemplate: path.resolve(
"./src/templates/NotFoundTemplate/NotFoundTemplate.tsx",
),
categoryTemplate: path.resolve(
"./src/templates/CategoryTemplate/CategoryTemplate.tsx",
),
categoriesTemplate: path.resolve(
"./src/templates/CategoriesTemplate/CategoriesTemplate.tsx",
),
indexTemplate: path.resolve("./src/templates/IndexTemplate/IndexTemplate.tsx"),
notFoundTemplate: path.resolve("./src/templates/NotFoundTemplate/NotFoundTemplate.tsx"),
categoryTemplate: path.resolve("./src/templates/CategoryTemplate/CategoryTemplate.tsx"),
categoriesTemplate: path.resolve("./src/templates/CategoriesTemplate/CategoriesTemplate.tsx"),
tagTemplate: path.resolve("./src/templates/TagTemplate/TagTemplate.tsx"),
tagsTemplate: path.resolve("./src/templates/TagsTemplate/TagsTemplate.tsx"),
pageTemplate: path.resolve("./src/templates/PageTemplate/PageTemplate.tsx"),

View File

@@ -99,7 +99,7 @@ const createPages: GatsbyNode["createPages"] = async ({ graphql, actions }) => {
const path = utils.concat(
constants.routes.categoryRoute,
"/",
utils.toKebabCase(category.fieldValue)
utils.toKebabCase(category.fieldValue),
);
for (let page = 0; page < total; page += 1) {

View File

@@ -28,7 +28,7 @@ const onCreateNode: GatsbyNode["onCreateNode"] = ({ node, actions, getNode }) =>
if (tags) {
const value = tags.map((tag) =>
utils.concat(constants.routes.tagRoute, "/", utils.toKebabCase(tag), "/")
utils.concat(constants.routes.tagRoute, "/", utils.toKebabCase(tag), "/"),
);
createNodeField({ node, name: "tagSlugs", value });
@@ -39,7 +39,7 @@ const onCreateNode: GatsbyNode["onCreateNode"] = ({ node, actions, getNode }) =>
constants.routes.categoryRoute,
"/",
utils.toKebabCase(category),
"/"
"/",
);
createNodeField({ node, name: "categorySlug", value });

View File

@@ -7,7 +7,8 @@ import { compilerOptions } from "../../tsconfig.json";
const onCreateWebpackConfig = (
(options: Pick<CompilerOptions, "paths">) =>
({ actions }: CreateWebpackConfigArgs) => {
({ actions, getConfig }: CreateWebpackConfigArgs) => {
// Keep existing TS path aliases in webpack
actions.setWebpackConfig({
resolve: {
alias: Object.entries(options.paths || []).reduce(
@@ -19,6 +20,28 @@ const onCreateWebpackConfig = (
),
},
});
// Workaround: Gatsby's webpack ESLint plugin is incompatible with ESLint v9+ options
// on some environments. Remove the plugin from the webpack pipeline during development
// to prevent build failures like "Invalid Options: Unknown options: extensions, useEslintrc".
// We still keep linting via npm scripts.
try {
const config = getConfig();
if (config?.plugins?.length) {
const beforeCount = config.plugins.length;
config.plugins = config.plugins.filter((plugin: any) => {
const name = plugin?.constructor?.name;
return name !== "ESLintWebpackPlugin" && name !== "ESLintPlugin";
});
const afterCount = config.plugins.length;
// Only replace when we've actually modified the plugins array
if (afterCount !== beforeCount) {
actions.replaceWebpackConfig(config);
}
}
} catch {
// noop if Gatsby changes internals, don't crash the build
}
}
)(compilerOptions);

View File

@@ -5,19 +5,7 @@ const gatsby = jest.requireActual("gatsby");
export default {
...gatsby,
graphql: jest.fn(),
Link: jest
.fn()
.mockImplementation(
({
activeClassName,
activeStyle,
getProps,
innerRef,
ref,
replace,
to,
...rest
}) =>
Link: jest.fn().mockImplementation(({ to, ...rest }) =>
React.createElement("a", {
...rest,
href: to,

View File

@@ -22,10 +22,7 @@ const jestConfig: Config.InitialOptions = {
"identity-obj-proxy",
"^gatsby-page-utils/(.*)$": "gatsby-page-utils/$1",
"^gatsby-core-utils/(.*)$": "gatsby-core-utils/dist/$1",
"^gatsby-plugin-utils/(.*)$": [
"gatsby-plugin-utils/dist/$1",
"gatsby-plugin-utils/$1",
],
"^gatsby-plugin-utils/(.*)$": ["gatsby-plugin-utils/dist/$1", "gatsby-plugin-utils/$1"],
},
transform: { "^.+\\.[jt]sx?$": ["@swc/jest", swc] },
setupFiles: ["<rootDir>/internal/testing/jest-setup.ts"],

18561
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -22,11 +22,12 @@
"commit": "git-cz",
"format": "npm run format:ts && npm run format:scss",
"format:scss": "stylelint \"src/**/*.scss\" --fix",
"format:ts": "eslint \"src\" --ext .tsx,.ts --fix && prettier --write .",
"format:ts": "eslint \"src/**/*.{ts,tsx}\" --fix && prettier --write .",
"install:legacy": "npm install --legacy-peer-deps",
"lint": "npm run lint:ts && npm run lint:scss",
"lint:scss": "stylelint \"src/**/*.scss\"",
"lint:staged": "lint-staged",
"lint:ts": "eslint \"src\" --ext .tsx,.ts && prettier --check .",
"lint:ts": "eslint \"src/**/*.{ts,tsx}\" && prettier --check .",
"prepare": "husky install",
"release": "standard-version",
"release:major": "standard-version --release-as major",
@@ -54,12 +55,12 @@
}
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.2",
"@fortawesome/fontawesome-svg-core": "^7.0.0",
"@fortawesome/free-solid-svg-icons": "^7.0.0",
"@fortawesome/react-fontawesome": "^3.0.0",
"classnames": "^2.5.1",
"disqus-react": "^1.1.6",
"gatsby": "^5.14.4",
"disqus-react": "^1.1.7",
"gatsby": "^5.14.5",
"gatsby-link": "^5.14.1",
"gatsby-plugin-catch-links": "^5.14.0",
"gatsby-plugin-feed": "^5.14.0",
@@ -84,7 +85,7 @@
"gatsby-source-filesystem": "^5.14.0",
"gatsby-transformer-remark": "^6.14.0",
"gatsby-transformer-sharp": "^5.14.0",
"prismjs": "^1.29.0",
"prismjs": "^1.30.0",
"react": "^18.3.1",
"react-cookie-consent": "^9.0.0",
"react-dom": "^18.3.1",
@@ -93,69 +94,68 @@
"reading-time": "^1.5.0"
},
"devDependencies": {
"@commitlint/config-conventional": "^17.8.1",
"@commitlint/cz-commitlint": "^19.6.1",
"@jest/globals": "^29.7.0",
"@mastermindzh/eslint-config": "^1.0.2",
"@mastermindzh/prettier-config": "^1.0.0",
"@semantic-release/exec": "6.0.3",
"@semantic-release/git": "10.0.1",
"@swc/core": "^1.10.4",
"@swc/jest": "^0.2.37",
"@commitlint/config-conventional": "^20.0.0",
"@commitlint/cz-commitlint": "^20.0.0",
"@eslint/compat": "^2.0.0",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.31.0",
"@jest/globals": "^30.0.4",
"@mastermindzh/eslint-config": "^3.1.0",
"@mastermindzh/prettier-config": "^1.1.0",
"@swc/core": "^1.12.14",
"@swc/jest": "^0.2.39",
"@types/gatsby-transformer-remark": "^2.9.4",
"@types/jest": "^29.5.14",
"@types/node": "^22.10.3",
"@types/jest": "^30.0.0",
"@types/node": "^24.0.14",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@types/react-helmet": "^6.1.6",
"@types/react-helmet": "^6.1.11",
"@types/react-test-renderer": "^18.3.1",
"@types/react-toggle": "^4.0.5",
"@typescript-eslint/eslint-plugin": "^5.62.0",
"@typescript-eslint/parser": "^5.62.0",
"autoprefixer": "^10.4.20",
"browserslist": "^4.24.3",
"@typescript-eslint/eslint-plugin": "^8.37.0",
"@typescript-eslint/parser": "^8.37.0",
"autoprefixer": "^10.4.21",
"browserslist": "^4.25.1",
"codecov": "^3.8.3",
"commitizen": "^4.3.1",
"commitlint": "^19.6.1",
"concurrently": "^9.1.2",
"eslint": "^8.57.1",
"eslint-config-airbnb": "^19.0.4",
"eslint-config-airbnb-typescript": "^17.1.0",
"eslint-config-prettier": "^8.10.0",
"eslint-config-react-app": "^7.0.1",
"eslint-import-resolver-typescript": "^3.7.0",
"eslint-plugin-flowtype": "^8.0.3",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jest": "^27.9.0",
"commitlint": "^20.0.0",
"concurrently": "^9.2.0",
"eslint": "^9.31.0",
"eslint-config-prettier": "^10.1.5",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-jest": "^29.0.1",
"eslint-plugin-jsx-a11y": "^6.10.2",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-react": "^7.37.3",
"eslint-plugin-react-hooks": "^4.6.2",
"eslint-plugin-simple-import-sort": "^10.0.0",
"husky": "^8.0.3",
"eslint-plugin-prettier": "^5.5.1",
"eslint-plugin-react": "^7.37.5",
"eslint-plugin-react-hooks": "^7.0.0",
"eslint-plugin-simple-import-sort": "^12.1.1",
"globals": "^16.3.0",
"husky": "^9.0.0",
"identity-obj-proxy": "3.0.0",
"jest": "^29.7.0",
"jest-cli": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest": "^30.0.4",
"jest-cli": "^30.0.4",
"jest-environment-jsdom": "^30.0.4",
"jest-svg-transformer": "^1.0.0",
"lint-staged": "^15.3.0",
"lint-staged": "^16.1.2",
"lost": "9.0.2",
"markdownlint": "^0.37.3",
"postcss": "^8.4.49",
"markdownlint": "^0.39.0",
"postcss": "^8.5.6",
"postcss-scss": "^4.0.9",
"prettier": "^2.8.8",
"prettier-plugin-packagejson": "^2.5.6",
"prettier": "^3.6.2",
"prettier-plugin-packagejson": "^2.5.18",
"react-test-renderer": "^18.3.1",
"rimraf": "^6.0.1",
"sass": "^1.83.0",
"sass": "^1.89.2",
"sass-embedded": "^1.93.2",
"source-map-support": "^0.5.21",
"standard-version": "^9.5.0",
"stylelint": "^16.12.0",
"stylelint-config-recommended-scss": "^14.1.0",
"stylelint-order": "^6.0.4",
"stylelint-scss": "^6.10.0",
"stylelint": "^16.21.1",
"stylelint-config-recommended-scss": "^16.0.0",
"stylelint-order": "^7.0.0",
"stylelint-scss": "^6.12.1",
"ts-node": "^10.9.2",
"typescript": "^5.7.2",
"typescript": "^5.8.3",
"unist-util-find": "3.0.0"
}
}

11
renovate.json Normal file
View File

@@ -0,0 +1,11 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"ignoreDeps": [
"react",
"react-dom",
"@types/react",
"@types/react-dom",
"@types/react-test-renderer",
"react-test-renderer"
]
}

View File

@@ -1,6 +1,6 @@
@charset "UTF-8";
@import "base/generic";
@use "base/generic";
.showInPrintView {
display: none;

View File

@@ -1,6 +1,6 @@
@charset "UTF-8";
@import "mixins/breakpoints";
@import "mixins/line-height";
@import "mixins/padding";
@import "mixins/margin";
@forward "mixins/breakpoints";
@forward "mixins/line-height";
@forward "mixins/padding";
@forward "mixins/margin";

View File

@@ -1,5 +1,5 @@
@import "../variables";
@import "../mixins";
@use "../variables" as *;
@use "../mixins" as *;
html {
font-size: $typographic-root-font-size;

View File

@@ -1,5 +1,5 @@
@charset "UTF-8";
@import "variables";
@import "mixins";
@import "base";
@use "variables";
@use "mixins";
@use "base";

View File

@@ -1,4 +1,4 @@
@import "../variables";
@use "../variables" as *;
@mixin breakpoint-xs {
@content;

View File

@@ -1,4 +1,4 @@
@import "../variables";
@use "../variables" as *;
@mixin line-height($number) {
line-height: #{$number * $typographic-leading + "px"};

View File

@@ -1,4 +1,4 @@
@import "../variables";
@use "../variables" as *;
@mixin margin-auto($number: 0) {
margin: #{$number * $typographic-leading + "px"} auto;

View File

@@ -1,4 +1,4 @@
@import "../variables";
@use "../variables" as *;
@mixin padding-left($number) {
padding-left: #{$number * $typographic-leading + "px"};

View File

@@ -1,4 +1,4 @@
@import "../../assets/scss/variables";
@use "../../assets/scss/variables" as *;
$shadow: 0px -1px 5px rgba(50, 50, 50, 0.75);

View File

@@ -1,5 +1,5 @@
@import "../../assets/scss/variables";
@import "../../assets/scss/mixins";
@use "../../assets/scss/variables" as *;
@use "../../assets/scss/mixins" as *;
.feed {
.item {

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Feed renders correctly 1`] = `
<div>

View File

@@ -3,7 +3,6 @@ import React from "react";
import * as styles from "./Icon.module.scss";
import { ICONS } from "@/constants";
interface Props {
name: keyof typeof ICONS;
icon: {

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Icon renders correctly 1`] = `
<svg

View File

@@ -1,11 +1,7 @@
import React, { FC } from "react";
import { graphql, StaticQuery } from "gatsby";
import {
GatsbyImage,
GatsbyImageProps,
IGatsbyImageData,
} from "gatsby-plugin-image";
import { GatsbyImage, GatsbyImageProps, IGatsbyImageData } from "gatsby-plugin-image";
import { FileSystemNode } from "gatsby-source-filesystem";
interface Props extends Omit<GatsbyImageProps, "image"> {
@@ -28,9 +24,7 @@ const Image: FC<Props> = ({ path, ...rest }: Props) => (
<StaticQuery
query={graphql`
query {
images: allFile(
filter: { ext: { regex: "/png|jpg|jpeg|webp|tif|tiff/" } }
) {
images: allFile(filter: { ext: { regex: "/png|jpg|jpeg|webp|tif|tiff/" } }) {
edges {
node {
absolutePath

View File

@@ -1,5 +1,5 @@
@import "../../assets/scss/variables";
@import "../../assets/scss/mixins";
@use "../../assets/scss/variables" as *;
@use "../../assets/scss/mixins" as *;
.layout {
lost-center: $layout-width;

View File

@@ -1,9 +1,9 @@
import React from "react";
import Helmet from "react-helmet";
import { useSiteMetadata } from "@/hooks";
import { CookieBar } from "../Cookiebar/CookieBar";
import * as styles from "./Layout.module.scss";
import { useSiteMetadata } from "@/hooks";
interface Props {
title: string;
@@ -20,7 +20,6 @@ const Layout: React.FC<Props> = ({
description,
socialImage = "",
noIndex = false,
slug,
}: Props) => {
const { author, url } = useSiteMetadata();
const metaImage = socialImage || author.photo;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Layout renders correctly 1`] = `
<div>

View File

@@ -1,5 +1,5 @@
@import "../../assets/scss/variables";
@import "../../assets/scss/mixins";
@use "../../assets/scss/variables" as *;
@use "../../assets/scss/mixins" as *;
.page {
@include margin-bottom(2);

View File

@@ -11,9 +11,7 @@ describe("Page", () => {
title: mocks.markdownRemark.frontmatter.title,
};
const tree = renderer
.create(<Page {...props}>{props.children}</Page>)
.toJSON();
const tree = renderer.create(<Page {...props}>{props.children}</Page>).toJSON();
expect(tree).toMatchSnapshot();
});
});

View File

@@ -1,8 +1,8 @@
import React, { useEffect, useRef } from "react";
import type { Nullable } from "@/types";
import { Helmet } from "react-helmet";
import * as styles from "./Page.module.scss";
import type { Nullable } from "@/types";
interface Props {
title?: string;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Page renders correctly 1`] = `
<div>

View File

@@ -1,7 +1,7 @@
@use "sass:color";
@import "../../assets/scss/variables";
@import "../../assets/scss/mixins";
@use "../../assets/scss/variables" as *;
@use "../../assets/scss/mixins" as *;
.pagination {
display: flex;

View File

@@ -1,8 +1,8 @@
import { PAGINATION } from "@/constants";
import classNames from "classnames";
import { Link } from "gatsby";
import React from "react";
import * as styles from "./Pagination.module.scss";
import { PAGINATION } from "@/constants";
type Props = {
prevPagePath: string;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Pagination renders correctly 1`] = `
<div

View File

@@ -1,5 +1,5 @@
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.author {
border-top: 1px solid $color-gray-border;

View File

@@ -11,9 +11,7 @@ const mockedUseStaticQuery = useStaticQuery as jest.Mock;
describe("Author", () => {
beforeEach(() => {
mockedStaticQuery.mockImplementationOnce(({ render }) =>
render(mocks.siteMetadata),
);
mockedStaticQuery.mockImplementationOnce(({ render }) => render(mocks.siteMetadata));
mockedUseStaticQuery.mockReturnValue(mocks.siteMetadata);
});

View File

@@ -1,6 +1,6 @@
import { useSiteMetadata } from "@/hooks";
import React from "react";
import * as styles from "./Author.module.scss";
import { useSiteMetadata } from "@/hooks";
const Author = () => {
const { author } = useSiteMetadata();
@@ -13,6 +13,7 @@ const Author = () => {
<strong>{author.name}</strong>
</a>
{typeof window !== "undefined" ? (
// eslint-disable-next-line no-undef
<span className="showInPrintView"> {window ? `@ ${window.location}` : ""}</span>
) : (
""

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Author renders correctly 1`] = `
<div>

View File

@@ -11,9 +11,7 @@ const mockedUseStaticQuery = useStaticQuery as jest.Mock;
describe("Comments", () => {
beforeEach(() => {
mockedStaticQuery.mockImplementationOnce(({ render }) =>
render(mocks.siteMetadata),
);
mockedStaticQuery.mockImplementationOnce(({ render }) => render(mocks.siteMetadata));
mockedUseStaticQuery.mockReturnValue(mocks.siteMetadata);
});

View File

@@ -1,3 +1,3 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Comments renders correctly 1`] = `null`;

View File

@@ -1,5 +1,5 @@
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.content {
@include margin-auto();

View File

@@ -1,8 +1,8 @@
import { Content } from "@/components/Post/Content";
import * as mocks from "@/mocks";
import { StaticQuery, useStaticQuery } from "gatsby";
import React from "react";
import renderer from "react-test-renderer";
import * as mocks from "@/mocks";
import { Content } from "@/components/Post/Content";
const mockedStaticQuery = StaticQuery as jest.Mock;
const mockedUseStaticQuery = useStaticQuery as jest.Mock;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Content renders correctly 1`] = `
[
@@ -72,16 +72,12 @@ exports[`Content renders correctly 1`] = `
className="svg-inline--fa fa-moon"
data-icon="moon"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 384 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
d="M223.5 32C100 32 0 132.3 0 256S100 480 223.5 480c60.6 0 115.5-24.2 155.8-63.4c5-4.9 6.3-12.5 3.1-18.7s-10.1-9.7-17-8.5c-9.8 1.7-19.8 2.6-30.1 2.6c-96.9 0-175.5-78.8-175.5-176c0-65.8 36-123.1 89.3-153.3c6.1-3.5 9.2-10.5 7.7-17.3s-7.3-11.9-14.3-12.5c-6.3-.5-12.6-.8-19-.8z"
d="M256 0C114.6 0 0 114.6 0 256S114.6 512 256 512c68.8 0 131.3-27.2 177.3-71.4 7.3-7 9.4-17.9 5.3-27.1s-13.7-14.9-23.8-14.1c-4.9 .4-9.8 .6-14.8 .6-101.6 0-184-82.4-184-184 0-72.1 41.5-134.6 102.1-164.8 9.1-4.5 14.3-14.3 13.1-24.4S322.6 8.5 312.7 6.3C294.4 2.2 275.4 0 256 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>
@@ -105,16 +101,12 @@ exports[`Content renders correctly 1`] = `
className="svg-inline--fa fa-sun"
data-icon="sun"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 576 512"
>
<path
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
d="M178.2-10.1c7.4-3.1 15.8-2.2 22.5 2.2l87.8 58.2 87.8-58.2c6.7-4.4 15.1-5.2 22.5-2.2S411.4-.5 413 7.3l20.9 103.2 103.2 20.9c7.8 1.6 14.4 7 17.4 14.3s2.2 15.8-2.2 22.5l-58.2 87.8 58.2 87.8c4.4 6.7 5.2 15.1 2.2 22.5s-9.6 12.8-17.4 14.3L433.8 401.4 413 504.7c-1.6 7.8-7 14.4-14.3 17.4s-15.8 2.2-22.5-2.2l-87.8-58.2-87.8 58.2c-6.7 4.4-15.1 5.2-22.5 2.2s-12.8-9.6-14.3-17.4L143 401.4 39.7 380.5c-7.8-1.6-14.4-7-17.4-14.3s-2.2-15.8 2.2-22.5L82.7 256 24.5 168.2c-4.4-6.7-5.2-15.1-2.2-22.5s9.6-12.8 17.4-14.3L143 110.6 163.9 7.3c1.6-7.8 7-14.4 14.3-17.4zM207.6 256a80.4 80.4 0 1 1 160.8 0 80.4 80.4 0 1 1 -160.8 0zm208.8 0a128.4 128.4 0 1 0 -256.8 0 128.4 128.4 0 1 0 256.8 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>

View File

@@ -1,5 +1,5 @@
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.meta {
.date {

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Meta renders correctly 1`] = `
<div>

View File

@@ -1,5 +1,5 @@
@import "../../assets/scss/variables";
@import "../../assets/scss/mixins";
@use "../../assets/scss/variables" as *;
@use "../../assets/scss/mixins" as *;
.post {

View File

@@ -11,9 +11,7 @@ const mockedUseStaticQuery = useStaticQuery as jest.Mock;
describe("Post", () => {
beforeEach(() => {
mockedStaticQuery.mockImplementationOnce(({ render }) =>
render(mocks.siteMetadata),
);
mockedStaticQuery.mockImplementationOnce(({ render }) => render(mocks.siteMetadata));
mockedUseStaticQuery.mockReturnValue(mocks.siteMetadata);
});

View File

@@ -1,4 +1,3 @@
import type { Node } from "@/types";
import React from "react";
import { Helmet } from "react-helmet";
import { useSiteMetadata } from "../../hooks";
@@ -8,6 +7,7 @@ import { Content } from "./Content";
import { Meta } from "./Meta";
import * as styles from "./Post.module.scss";
import { Tags } from "./Tags";
import type { Node } from "@/types";
interface Props {
post: Node;

View File

@@ -1,5 +1,5 @@
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.tags {
@include margin-bottom(0.5);

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Tags renders correctly 1`] = `
<div

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Post renders correctly 1`] = `
<div>
@@ -73,16 +73,12 @@ exports[`Post renders correctly 1`] = `
className="svg-inline--fa fa-moon"
data-icon="moon"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 384 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
d="M223.5 32C100 32 0 132.3 0 256S100 480 223.5 480c60.6 0 115.5-24.2 155.8-63.4c5-4.9 6.3-12.5 3.1-18.7s-10.1-9.7-17-8.5c-9.8 1.7-19.8 2.6-30.1 2.6c-96.9 0-175.5-78.8-175.5-176c0-65.8 36-123.1 89.3-153.3c6.1-3.5 9.2-10.5 7.7-17.3s-7.3-11.9-14.3-12.5c-6.3-.5-12.6-.8-19-.8z"
d="M256 0C114.6 0 0 114.6 0 256S114.6 512 256 512c68.8 0 131.3-27.2 177.3-71.4 7.3-7 9.4-17.9 5.3-27.1s-13.7-14.9-23.8-14.1c-4.9 .4-9.8 .6-14.8 .6-101.6 0-184-82.4-184-184 0-72.1 41.5-134.6 102.1-164.8 9.1-4.5 14.3-14.3 13.1-24.4S322.6 8.5 312.7 6.3C294.4 2.2 275.4 0 256 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>
@@ -106,16 +102,12 @@ exports[`Post renders correctly 1`] = `
className="svg-inline--fa fa-sun"
data-icon="sun"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 576 512"
>
<path
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
d="M178.2-10.1c7.4-3.1 15.8-2.2 22.5 2.2l87.8 58.2 87.8-58.2c6.7-4.4 15.1-5.2 22.5-2.2S411.4-.5 413 7.3l20.9 103.2 103.2 20.9c7.8 1.6 14.4 7 17.4 14.3s2.2 15.8-2.2 22.5l-58.2 87.8 58.2 87.8c4.4 6.7 5.2 15.1 2.2 22.5s-9.6 12.8-17.4 14.3L433.8 401.4 413 504.7c-1.6 7.8-7 14.4-14.3 17.4s-15.8 2.2-22.5-2.2l-87.8-58.2-87.8 58.2c-6.7 4.4-15.1 5.2-22.5 2.2s-12.8-9.6-14.3-17.4L143 401.4 39.7 380.5c-7.8-1.6-14.4-7-17.4-14.3s-2.2-15.8 2.2-22.5L82.7 256 24.5 168.2c-4.4-6.7-5.2-15.1-2.2-22.5s9.6-12.8 17.4-14.3L143 110.6 163.9 7.3c1.6-7.8 7-14.4 14.3-17.4zM207.6 256a80.4 80.4 0 1 1 160.8 0 80.4 80.4 0 1 1 -160.8 0zm208.8 0a128.4 128.4 0 1 0 -256.8 0 128.4 128.4 0 1 0 256.8 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>

View File

@@ -1,5 +1,5 @@
@import "../../assets/scss/variables";
@import "../../assets/scss/mixins";
@use "../../assets/scss/variables" as *;
@use "../../assets/scss/mixins" as *;
.header {
align-items: baseline;

View File

@@ -1,8 +1,8 @@
import { Image } from "@/components/Image";
import { Link, navigate } from "gatsby";
import React, { FunctionComponent } from "react";
import { ThemeSwitcher } from "../ThemeSwitcher/ThemeSwitcher";
import * as styles from "./PostHeader.module.scss";
import { Image } from "@/components/Image";
type Props = { author: { name: string; photo: string } };

View File

@@ -1,5 +1,5 @@
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.author {
.photo {

View File

@@ -5,7 +5,6 @@ import { Link } from "gatsby";
import * as styles from "./Author.module.scss";
import { Image } from "@/components/Image";
type Props = {
author: {
name: string;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Author renders correctly 1`] = `
<div>

View File

@@ -1,5 +1,5 @@
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.contacts {
@include margin-bottom(1);

View File

@@ -25,7 +25,7 @@ const Contacts: React.FC<Props> = ({ contacts }: Props) => (
<Icon name={name} icon={getIcon(name)} />
</a>
</li>
) : null
) : null,
)}
<li className={styles.item} key="keys">
<a className={styles.link} href="/keys.json" rel="noopener noreferrer" target="_blank">

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Contacts renders correctly 1`] = `
<div>

View File

@@ -1,7 +1,7 @@
@use "sass:color";
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.copyright {
color: $color-gray;

View File

@@ -6,8 +6,6 @@ type Props = {
copyright: string;
};
const Copyright = ({ copyright }: Props) => (
<div className={styles.copyright}>{copyright}</div>
);
const Copyright = ({ copyright }: Props) => <div className={styles.copyright}>{copyright}</div>;
export default Copyright;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Copyright renders correctly 1`] = `
<div>

View File

@@ -1,5 +1,5 @@
@import "../../../assets/scss/variables";
@import "../../../assets/scss/mixins";
@use "../../../assets/scss/variables" as *;
@use "../../../assets/scss/mixins" as *;
.menu {
.list {

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Menu renders correctly 1`] = `
<nav

View File

@@ -1,5 +1,5 @@
@import "../../assets/scss/variables";
@import "../../assets/scss/mixins";
@use "../../assets/scss/variables" as *;
@use "../../assets/scss/mixins" as *;
.sidebar {
width: 100%;

View File

@@ -11,9 +11,7 @@ const mockedUseStaticQuery = useStaticQuery as jest.Mock;
describe("Sidebar", () => {
beforeEach(() => {
mockedStaticQuery.mockImplementationOnce(({ render }) =>
render(mocks.siteMetadata),
);
mockedStaticQuery.mockImplementationOnce(({ render }) => render(mocks.siteMetadata));
mockedUseStaticQuery.mockReturnValue(mocks.siteMetadata);
});

View File

@@ -1,4 +1,3 @@
import { useSiteMetadata } from "@/hooks";
import React from "react";
import { ThemeSwitcher } from "../ThemeSwitcher/ThemeSwitcher";
import { Author } from "./Author";
@@ -6,6 +5,7 @@ import { Contacts } from "./Contacts";
import { Copyright } from "./Copyright";
import { Menu } from "./Menu";
import * as styles from "./Sidebar.module.scss";
import { useSiteMetadata } from "@/hooks";
type Props = {
isIndex?: boolean;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`Sidebar renders correctly 1`] = `
<div>
@@ -199,16 +199,12 @@ exports[`Sidebar renders correctly 1`] = `
className="svg-inline--fa fa-moon"
data-icon="moon"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 384 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
d="M223.5 32C100 32 0 132.3 0 256S100 480 223.5 480c60.6 0 115.5-24.2 155.8-63.4c5-4.9 6.3-12.5 3.1-18.7s-10.1-9.7-17-8.5c-9.8 1.7-19.8 2.6-30.1 2.6c-96.9 0-175.5-78.8-175.5-176c0-65.8 36-123.1 89.3-153.3c6.1-3.5 9.2-10.5 7.7-17.3s-7.3-11.9-14.3-12.5c-6.3-.5-12.6-.8-19-.8z"
d="M256 0C114.6 0 0 114.6 0 256S114.6 512 256 512c68.8 0 131.3-27.2 177.3-71.4 7.3-7 9.4-17.9 5.3-27.1s-13.7-14.9-23.8-14.1c-4.9 .4-9.8 .6-14.8 .6-101.6 0-184-82.4-184-184 0-72.1 41.5-134.6 102.1-164.8 9.1-4.5 14.3-14.3 13.1-24.4S322.6 8.5 312.7 6.3C294.4 2.2 275.4 0 256 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>
@@ -232,16 +228,12 @@ exports[`Sidebar renders correctly 1`] = `
className="svg-inline--fa fa-sun"
data-icon="sun"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 576 512"
>
<path
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
d="M178.2-10.1c7.4-3.1 15.8-2.2 22.5 2.2l87.8 58.2 87.8-58.2c6.7-4.4 15.1-5.2 22.5-2.2S411.4-.5 413 7.3l20.9 103.2 103.2 20.9c7.8 1.6 14.4 7 17.4 14.3s2.2 15.8-2.2 22.5l-58.2 87.8 58.2 87.8c4.4 6.7 5.2 15.1 2.2 22.5s-9.6 12.8-17.4 14.3L433.8 401.4 413 504.7c-1.6 7.8-7 14.4-14.3 17.4s-15.8 2.2-22.5-2.2l-87.8-58.2-87.8 58.2c-6.7 4.4-15.1 5.2-22.5 2.2s-12.8-9.6-14.3-17.4L143 401.4 39.7 380.5c-7.8-1.6-14.4-7-17.4-14.3s-2.2-15.8 2.2-22.5L82.7 256 24.5 168.2c-4.4-6.7-5.2-15.1-2.2-22.5s9.6-12.8 17.4-14.3L143 110.6 163.9 7.3c1.6-7.8 7-14.4 14.3-17.4zM207.6 256a80.4 80.4 0 1 1 160.8 0 80.4 80.4 0 1 1 -160.8 0zm208.8 0a128.4 128.4 0 1 0 -256.8 0 128.4 128.4 0 1 0 256.8 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>

View File

@@ -1,3 +1,4 @@
/* eslint-disable max-len */
const ICONS = {
twitter: {
path: "M25.312 6.375c-0.688 1-1.547 1.891-2.531 2.609 0.016 0.219 0.016 0.438 0.016 0.656 0 6.672-5.078 14.359-14.359 14.359-2.859 0-5.516-0.828-7.75-2.266 0.406 0.047 0.797 0.063 1.219 0.063 2.359 0 4.531-0.797 6.266-2.156-2.219-0.047-4.078-1.5-4.719-3.5 0.313 0.047 0.625 0.078 0.953 0.078 0.453 0 0.906-0.063 1.328-0.172-2.312-0.469-4.047-2.5-4.047-4.953v-0.063c0.672 0.375 1.453 0.609 2.281 0.641-1.359-0.906-2.25-2.453-2.25-4.203 0-0.938 0.25-1.797 0.688-2.547 2.484 3.062 6.219 5.063 10.406 5.281-0.078-0.375-0.125-0.766-0.125-1.156 0-2.781 2.25-5.047 5.047-5.047 1.453 0 2.766 0.609 3.687 1.594 1.141-0.219 2.234-0.641 3.203-1.219-0.375 1.172-1.172 2.156-2.219 2.781 1.016-0.109 2-0.391 2.906-0.781z",

View File

@@ -10,8 +10,7 @@ interface CategoriesQueryResult {
}
const useCategoriesList = () => {
const { allMarkdownRemark } = useStaticQuery<CategoriesQueryResult>(
graphql`
const { allMarkdownRemark } = useStaticQuery<CategoriesQueryResult>(graphql`
query CategoriesListQuery {
allMarkdownRemark(
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
@@ -22,8 +21,7 @@ const useCategoriesList = () => {
}
}
}
`
);
`);
return allMarkdownRemark.group ?? [];
};

View File

@@ -1,8 +1,7 @@
import { graphql, useStaticQuery } from "gatsby";
const useSiteMetadata = () => {
const { site } = useStaticQuery(
graphql`
const { site } = useStaticQuery(graphql`
query SiteMetaData {
site {
siteMetadata {
@@ -45,8 +44,7 @@ const useSiteMetadata = () => {
}
}
}
`
);
`);
return site.siteMetadata;
};

View File

@@ -10,8 +10,7 @@ interface TagsQueryResult {
}
const useTagsList = () => {
const { allMarkdownRemark } = useStaticQuery<TagsQueryResult>(
graphql`
const { allMarkdownRemark } = useStaticQuery<TagsQueryResult>(graphql`
query TagsListQuery {
allMarkdownRemark(
filter: { frontmatter: { template: { eq: "post" }, draft: { ne: true } } }
@@ -22,8 +21,7 @@ const useTagsList = () => {
}
}
}
`
);
`);
return allMarkdownRemark.group || [];
};

View File

@@ -6,7 +6,6 @@ import { StaticQuery, useStaticQuery } from "gatsby";
import CategoriesTemplate from "./CategoriesTemplate";
import * as mocks from "@/mocks";
const mockedStaticQuery = StaticQuery as jest.Mock;
const mockedUseStaticQuery = useStaticQuery as jest.Mock;

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`CategoriesTemplate renders correctly 1`] = `
<div>
@@ -200,16 +200,12 @@ exports[`CategoriesTemplate renders correctly 1`] = `
className="svg-inline--fa fa-moon"
data-icon="moon"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 384 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
d="M223.5 32C100 32 0 132.3 0 256S100 480 223.5 480c60.6 0 115.5-24.2 155.8-63.4c5-4.9 6.3-12.5 3.1-18.7s-10.1-9.7-17-8.5c-9.8 1.7-19.8 2.6-30.1 2.6c-96.9 0-175.5-78.8-175.5-176c0-65.8 36-123.1 89.3-153.3c6.1-3.5 9.2-10.5 7.7-17.3s-7.3-11.9-14.3-12.5c-6.3-.5-12.6-.8-19-.8z"
d="M256 0C114.6 0 0 114.6 0 256S114.6 512 256 512c68.8 0 131.3-27.2 177.3-71.4 7.3-7 9.4-17.9 5.3-27.1s-13.7-14.9-23.8-14.1c-4.9 .4-9.8 .6-14.8 .6-101.6 0-184-82.4-184-184 0-72.1 41.5-134.6 102.1-164.8 9.1-4.5 14.3-14.3 13.1-24.4S322.6 8.5 312.7 6.3C294.4 2.2 275.4 0 256 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>
@@ -233,16 +229,12 @@ exports[`CategoriesTemplate renders correctly 1`] = `
className="svg-inline--fa fa-sun"
data-icon="sun"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 576 512"
>
<path
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
d="M178.2-10.1c7.4-3.1 15.8-2.2 22.5 2.2l87.8 58.2 87.8-58.2c6.7-4.4 15.1-5.2 22.5-2.2S411.4-.5 413 7.3l20.9 103.2 103.2 20.9c7.8 1.6 14.4 7 17.4 14.3s2.2 15.8-2.2 22.5l-58.2 87.8 58.2 87.8c4.4 6.7 5.2 15.1 2.2 22.5s-9.6 12.8-17.4 14.3L433.8 401.4 413 504.7c-1.6 7.8-7 14.4-14.3 17.4s-15.8 2.2-22.5-2.2l-87.8-58.2-87.8 58.2c-6.7 4.4-15.1 5.2-22.5 2.2s-12.8-9.6-14.3-17.4L143 401.4 39.7 380.5c-7.8-1.6-14.4-7-17.4-14.3s-2.2-15.8 2.2-22.5L82.7 256 24.5 168.2c-4.4-6.7-5.2-15.1-2.2-22.5s9.6-12.8 17.4-14.3L143 110.6 163.9 7.3c1.6-7.8 7-14.4 14.3-17.4zM207.6 256a80.4 80.4 0 1 1 160.8 0 80.4 80.4 0 1 1 -160.8 0zm208.8 0a128.4 128.4 0 1 0 -256.8 0 128.4 128.4 0 1 0 256.8 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>

View File

@@ -6,15 +6,12 @@ import { StaticQuery, useStaticQuery } from "gatsby";
import CategoryTemplate from "./CategoryTemplate";
import * as mocks from "@/mocks";
const mockedStaticQuery = StaticQuery as jest.Mock;
const mockedUseStaticQuery = useStaticQuery as jest.Mock;
describe("CategoryTemplate", () => {
beforeEach(() => {
mockedStaticQuery.mockImplementationOnce(({ render }) =>
render(mocks.siteMetadata),
);
mockedStaticQuery.mockImplementationOnce(({ render }) => render(mocks.siteMetadata));
mockedUseStaticQuery.mockReturnValue(mocks.siteMetadata);
});

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`CategoryTemplate renders correctly 1`] = `
<div>
@@ -200,16 +200,12 @@ exports[`CategoryTemplate renders correctly 1`] = `
className="svg-inline--fa fa-moon"
data-icon="moon"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 384 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
d="M223.5 32C100 32 0 132.3 0 256S100 480 223.5 480c60.6 0 115.5-24.2 155.8-63.4c5-4.9 6.3-12.5 3.1-18.7s-10.1-9.7-17-8.5c-9.8 1.7-19.8 2.6-30.1 2.6c-96.9 0-175.5-78.8-175.5-176c0-65.8 36-123.1 89.3-153.3c6.1-3.5 9.2-10.5 7.7-17.3s-7.3-11.9-14.3-12.5c-6.3-.5-12.6-.8-19-.8z"
d="M256 0C114.6 0 0 114.6 0 256S114.6 512 256 512c68.8 0 131.3-27.2 177.3-71.4 7.3-7 9.4-17.9 5.3-27.1s-13.7-14.9-23.8-14.1c-4.9 .4-9.8 .6-14.8 .6-101.6 0-184-82.4-184-184 0-72.1 41.5-134.6 102.1-164.8 9.1-4.5 14.3-14.3 13.1-24.4S322.6 8.5 312.7 6.3C294.4 2.2 275.4 0 256 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>
@@ -233,16 +229,12 @@ exports[`CategoryTemplate renders correctly 1`] = `
className="svg-inline--fa fa-sun"
data-icon="sun"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 576 512"
>
<path
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
d="M178.2-10.1c7.4-3.1 15.8-2.2 22.5 2.2l87.8 58.2 87.8-58.2c6.7-4.4 15.1-5.2 22.5-2.2S411.4-.5 413 7.3l20.9 103.2 103.2 20.9c7.8 1.6 14.4 7 17.4 14.3s2.2 15.8-2.2 22.5l-58.2 87.8 58.2 87.8c4.4 6.7 5.2 15.1 2.2 22.5s-9.6 12.8-17.4 14.3L433.8 401.4 413 504.7c-1.6 7.8-7 14.4-14.3 17.4s-15.8 2.2-22.5-2.2l-87.8-58.2-87.8 58.2c-6.7 4.4-15.1 5.2-22.5 2.2s-12.8-9.6-14.3-17.4L143 401.4 39.7 380.5c-7.8-1.6-14.4-7-17.4-14.3s-2.2-15.8 2.2-22.5L82.7 256 24.5 168.2c-4.4-6.7-5.2-15.1-2.2-22.5s9.6-12.8 17.4-14.3L143 110.6 163.9 7.3c1.6-7.8 7-14.4 14.3-17.4zM207.6 256a80.4 80.4 0 1 1 160.8 0 80.4 80.4 0 1 1 -160.8 0zm208.8 0a128.4 128.4 0 1 0 -256.8 0 128.4 128.4 0 1 0 256.8 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>

View File

@@ -6,15 +6,12 @@ import { StaticQuery, useStaticQuery } from "gatsby";
import IndexTemplate from "./IndexTemplate";
import * as mocks from "@/mocks";
const mockedStaticQuery = StaticQuery as jest.Mock;
const mockedUseStaticQuery = useStaticQuery as jest.Mock;
describe("IndexTemplate", () => {
beforeEach(() => {
mockedStaticQuery.mockImplementationOnce(({ render }) =>
render(mocks.siteMetadata),
);
mockedStaticQuery.mockImplementationOnce(({ render }) => render(mocks.siteMetadata));
mockedUseStaticQuery.mockReturnValue(mocks.siteMetadata);
});

View File

@@ -1,4 +1,4 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`IndexTemplate renders correctly 1`] = `
<div>
@@ -200,16 +200,12 @@ exports[`IndexTemplate renders correctly 1`] = `
className="svg-inline--fa fa-moon"
data-icon="moon"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 384 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 512 512"
>
<path
d="M223.5 32C100 32 0 132.3 0 256S100 480 223.5 480c60.6 0 115.5-24.2 155.8-63.4c5-4.9 6.3-12.5 3.1-18.7s-10.1-9.7-17-8.5c-9.8 1.7-19.8 2.6-30.1 2.6c-96.9 0-175.5-78.8-175.5-176c0-65.8 36-123.1 89.3-153.3c6.1-3.5 9.2-10.5 7.7-17.3s-7.3-11.9-14.3-12.5c-6.3-.5-12.6-.8-19-.8z"
d="M256 0C114.6 0 0 114.6 0 256S114.6 512 256 512c68.8 0 131.3-27.2 177.3-71.4 7.3-7 9.4-17.9 5.3-27.1s-13.7-14.9-23.8-14.1c-4.9 .4-9.8 .6-14.8 .6-101.6 0-184-82.4-184-184 0-72.1 41.5-134.6 102.1-164.8 9.1-4.5 14.3-14.3 13.1-24.4S322.6 8.5 312.7 6.3C294.4 2.2 275.4 0 256 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>
@@ -233,16 +229,12 @@ exports[`IndexTemplate renders correctly 1`] = `
className="svg-inline--fa fa-sun"
data-icon="sun"
data-prefix="fas"
focusable="false"
role="img"
style={{}}
viewBox="0 0 512 512"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 576 512"
>
<path
d="M361.5 1.2c5 2.1 8.6 6.6 9.6 11.9L391 121l107.9 19.8c5.3 1 9.8 4.6 11.9 9.6s1.5 10.7-1.6 15.2L446.9 256l62.3 90.3c3.1 4.5 3.7 10.2 1.6 15.2s-6.6 8.6-11.9 9.6L391 391 371.1 498.9c-1 5.3-4.6 9.8-9.6 11.9s-10.7 1.5-15.2-1.6L256 446.9l-90.3 62.3c-4.5 3.1-10.2 3.7-15.2 1.6s-8.6-6.6-9.6-11.9L121 391 13.1 371.1c-5.3-1-9.8-4.6-11.9-9.6s-1.5-10.7 1.6-15.2L65.1 256 2.8 165.7c-3.1-4.5-3.7-10.2-1.6-15.2s6.6-8.6 11.9-9.6L121 121 140.9 13.1c1-5.3 4.6-9.8 9.6-11.9s10.7-1.5 15.2 1.6L256 65.1 346.3 2.8c4.5-3.1 10.2-3.7 15.2-1.6zM160 256a96 96 0 1 1 192 0 96 96 0 1 1 -192 0zm224 0a128 128 0 1 0 -256 0 128 128 0 1 0 256 0z"
d="M178.2-10.1c7.4-3.1 15.8-2.2 22.5 2.2l87.8 58.2 87.8-58.2c6.7-4.4 15.1-5.2 22.5-2.2S411.4-.5 413 7.3l20.9 103.2 103.2 20.9c7.8 1.6 14.4 7 17.4 14.3s2.2 15.8-2.2 22.5l-58.2 87.8 58.2 87.8c4.4 6.7 5.2 15.1 2.2 22.5s-9.6 12.8-17.4 14.3L433.8 401.4 413 504.7c-1.6 7.8-7 14.4-14.3 17.4s-15.8 2.2-22.5-2.2l-87.8-58.2-87.8 58.2c-6.7 4.4-15.1 5.2-22.5 2.2s-12.8-9.6-14.3-17.4L143 401.4 39.7 380.5c-7.8-1.6-14.4-7-17.4-14.3s-2.2-15.8 2.2-22.5L82.7 256 24.5 168.2c-4.4-6.7-5.2-15.1-2.2-22.5s9.6-12.8 17.4-14.3L143 110.6 163.9 7.3c1.6-7.8 7-14.4 14.3-17.4zM207.6 256a80.4 80.4 0 1 1 160.8 0 80.4 80.4 0 1 1 -160.8 0zm208.8 0a128.4 128.4 0 1 0 -256.8 0 128.4 128.4 0 1 0 256.8 0z"
fill="currentColor"
style={{}}
/>
</svg>
</div>

View File

@@ -6,15 +6,12 @@ import NotFoundTemplate from "./NotFoundTemplate";
import * as mocks from "@/mocks";
const mockedStaticQuery = StaticQuery as jest.Mock;
const mockedUseStaticQuery = useStaticQuery as jest.Mock;
describe("NotFoundTemplate", () => {
beforeEach(() => {
mockedStaticQuery.mockImplementationOnce(({ render }) =>
render(mocks.siteMetadata),
);
mockedStaticQuery.mockImplementationOnce(({ render }) => render(mocks.siteMetadata));
mockedUseStaticQuery.mockReturnValue(mocks.siteMetadata);
});

Some files were not shown because too many files have changed in this diff Show More