joshuakgoldberg 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,20 @@
1
+ # Development
2
+
3
+ ## Setup
4
+
5
+ ```shell
6
+ pnpm i
7
+ gh auth refresh --scopes read:user
8
+ ```
9
+
10
+ ## Running Builds
11
+
12
+ ```shell
13
+ GH_TOKEN=$(gh auth token) pnpm run build
14
+ ```
15
+
16
+ ### Adding New Projects
17
+
18
+ ```shell
19
+ GH_TOKEN=$(gh auth token) pnpm run add any-number of-repository-names
20
+ ```
@@ -0,0 +1 @@
1
+ github: JoshuaKGoldberg
@@ -0,0 +1,13 @@
1
+ description: Prepares the repo for a typical CI job
2
+
3
+ name: Prepare
4
+ runs:
5
+ steps:
6
+ - uses: pnpm/action-setup@v2
7
+ - uses: actions/setup-node@v3
8
+ with:
9
+ cache: pnpm
10
+ node-version: "18"
11
+ - run: pnpm install --frozen-lockfile
12
+ shell: bash
13
+ using: composite
@@ -0,0 +1,21 @@
1
+ jobs:
2
+ build:
3
+ runs-on: ubuntu-latest
4
+ steps:
5
+ - uses: actions/checkout@v3
6
+ - uses: ./.github/actions/prepare
7
+ - env:
8
+ SPONSORS_PAT: ${{ secrets.SPONSORS_PAT }}
9
+ run: GH_TOKEN=$SPONSORS_PAT pnpm build
10
+ - uses: EndBug/add-and-commit@v9
11
+
12
+ name: Build README.md
13
+
14
+ on:
15
+ push:
16
+ branches:
17
+ - main
18
+ repository_dispatch:
19
+ types:
20
+ - webhook
21
+ workflow_dispatch:
@@ -0,0 +1 @@
1
+ pnpm-lock.yaml
package/.prettierrc ADDED
@@ -0,0 +1,3 @@
1
+ {
2
+ "useTabs": true
3
+ }
package/LICENSE.md ADDED
@@ -0,0 +1,20 @@
1
+ # MIT License
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ 'Software'), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,372 @@
1
+ ## Hi, I'm Josh! 💖
2
+
3
+ <!--
4
+ Fun fact: the entirety of this README.md is auto-generated!
5
+ See https://github.com/JoshuaKGoldberg/JoshuaKGoldberg.
6
+ -->
7
+
8
+ [![Follow on Bluesky](https://img.shields.io/badge/Follow-Bluesky-3B82F6.svg)](https://staging.bsky.app/profile/joshuakgoldberg.com)
9
+ [![Follow on Mastodon](https://img.shields.io/badge/Follow-Mastodon-5A47DC.svg)](https://fosstodon.org/@JoshuaKGoldberg)
10
+ [![Follow on Twitch](https://img.shields.io/badge/Follow-Twitch-9147FF.svg)](https://twitch.tv/JoshuaKGoldberg)
11
+ [![Follow on Twitter](https://img.shields.io/badge/Follow-Twitter-1DA1F2.svg)](https://twitter.com/JoshuaKGoldberg)
12
+ [![Subscribe on YouTube](https://img.shields.io/badge/Subscribe-YouTube-FF0000.svg)](https://youtube.com/@JoshuaKGoldberg)
13
+
14
+ [![Email Me](https://img.shields.io/badge/Email-github@joshuakgoldberg.com-007735.svg)](mailto:me@joshuakgoldberg.com)
15
+ [![Sponsor on GitHub](https://img.shields.io/badge/Sponsor-GitHub-6cc644.svg)](https://github.com/sponsors/joshuakgoldberg)
16
+
17
+ I'm an independent full time open source developer.
18
+
19
+ I work on projects in the TypeScript ecosystem, most notably [typescript-eslint](https://typescript-eslint.io): the tooling that enables ESLint and Prettier to run on TypeScript code.
20
+ I'm also the author of O'Reilly's [_Learning TypeScript_ book](https://www.learningtypescript.com), a Microsoft MVP for developer technologies, and an active conference speaker.
21
+
22
+ My personal projects range from static analysis to meta-languages to recreating retro games in the browser.
23
+ Also cats. 🐱
24
+
25
+ ---
26
+
27
+ ## Thanks to my Sponsors
28
+
29
+ Because I'm independent, I rely on sponsors to fund my work.
30
+ They deserve our sincere appreciation and gratitude.
31
+
32
+ <table width="100%">
33
+ <thead>
34
+ <tr>
35
+ <th width="33%">Gold Sponsors (&gt;=$25/mo)</th>
36
+ <th width="33%">Silver Sponsors (&gt;=$10/mo)</th>
37
+ <th width="33%">Bronze Sponsors (&gt;=$5/mo)</th>
38
+ </tr>
39
+ </thead>
40
+ <tbody>
41
+ <tr align="center">
42
+ <td >
43
+ <a href="https://github.com/Loops-so">
44
+ <img alt="Loops" src="https://github.com/Loops-so.png?size=100" />
45
+ </a>
46
+ <a href="https://github.com/beyang">
47
+ <img alt="Beyang Liu" src="https://github.com/beyang.png?size=100" />
48
+ </a>
49
+ </td>
50
+ <td >
51
+ <a href="https://github.com/thomasballinger">
52
+ <img alt="Tom Ballinger" src="https://github.com/thomasballinger.png?size=50" />
53
+ </a>
54
+ <a href="https://github.com/rwaskiewicz">
55
+ <img alt="Ryan Waskiewicz" src="https://github.com/rwaskiewicz.png?size=50" />
56
+ </a>
57
+ <a href="https://github.com/nickytonline">
58
+ <img alt="Nick Taylor" src="https://github.com/nickytonline.png?size=50" />
59
+ </a>
60
+ <a href="https://github.com/kitsonk">
61
+ <img alt="Kitson Kelly" src="https://github.com/kitsonk.png?size=50" />
62
+ </a>
63
+ <a href="https://github.com/kienankb">
64
+ <img alt="kienan" src="https://github.com/kienankb.png?size=50" />
65
+ </a>
66
+ <a href="https://github.com/KernelGamut32">
67
+ <img alt="Allen Sanders" src="https://github.com/KernelGamut32.png?size=50" />
68
+ </a>
69
+ <a href="https://github.com/Jolg42">
70
+ <img alt="Joël Galeran" src="https://github.com/Jolg42.png?size=50" />
71
+ </a>
72
+ <a href="https://github.com/jennjunod">
73
+ <img alt="Jenn Junod" src="https://github.com/jennjunod.png?size=50" />
74
+ </a>
75
+ <a href="https://github.com/indeedeng">
76
+ <img alt="Indeed Engineering" src="https://github.com/indeedeng.png?size=50" />
77
+ </a>
78
+ <a href="https://github.com/IanVS">
79
+ <img alt="Ian VanSchooten" src="https://github.com/IanVS.png?size=50" />
80
+ </a>
81
+ <a href="https://github.com/FarazPatankar">
82
+ <img alt="Faraz Patankar" src="https://github.com/FarazPatankar.png?size=50" />
83
+ </a>
84
+ <a href="https://github.com/eps1lon">
85
+ <img alt="Sebastian Silbermann" src="https://github.com/eps1lon.png?size=50" />
86
+ </a>
87
+ <a href="https://github.com/AkiraBrand">
88
+ <img alt="Akira " src="https://github.com/AkiraBrand.png?size=50" />
89
+ </a>
90
+ </td>
91
+ <td >
92
+ <a href="https://github.com/usmangenx">
93
+ <img alt="Muhammad Usman Javed" src="https://github.com/usmangenx.png?size=50" />
94
+ </a>
95
+ <a href="https://github.com/sindresorhus">
96
+ <img alt="Sindre Sorhus" src="https://github.com/sindresorhus.png?size=50" />
97
+ </a>
98
+ <a href="https://github.com/seveibar">
99
+ <img alt="Severin Ibarluzea" src="https://github.com/seveibar.png?size=50" />
100
+ </a>
101
+ <a href="https://github.com/santoshyadavdev">
102
+ <img alt="Santosh Yadav" src="https://github.com/santoshyadavdev.png?size=50" />
103
+ </a>
104
+ <a href="https://github.com/kevinctofel">
105
+ <img alt="Kevin C. Tofel" src="https://github.com/kevinctofel.png?size=50" />
106
+ </a>
107
+ <a href="https://github.com/jram930">
108
+ <img alt="Jared Ramsey" src="https://github.com/jram930.png?size=50" />
109
+ </a>
110
+ <a href="https://github.com/johnnyreilly">
111
+ <img alt="John Reilly" src="https://github.com/johnnyreilly.png?size=50" />
112
+ </a>
113
+ <a href="https://github.com/ElianCodes">
114
+ <img alt="Elian ☕️" src="https://github.com/ElianCodes.png?size=50" />
115
+ </a>
116
+ <a href="https://github.com/danfry1">
117
+ <img alt="Daniel Fry" src="https://github.com/danfry1.png?size=50" />
118
+ </a>
119
+ <a href="https://github.com/bmish">
120
+ <img alt="Bryan Mishkin" src="https://github.com/bmish.png?size=50" />
121
+ </a>
122
+ </td>
123
+ </tr>
124
+ </tbody>
125
+ </table>
126
+
127
+ > 💚 Motivated to support my work, or just want your image here?
128
+ > See my [GitHub Sponsors profile](https://github.com/sponsors/JoshuaKGoldberg).
129
+ > Thanks!
130
+
131
+ ## What I'm Working On
132
+
133
+ ### Biggest Projects
134
+
135
+ If you work with TypeScript, you may have used one of the open source projects I support:
136
+
137
+ <table width="100%">
138
+ <thead>
139
+ <th span="col">Project ⚙️</th>
140
+ <th span="col">Description 📝</th>
141
+ <th span="col">Role 🧑‍🏭</th>
142
+ <th span="col">Stars ⭐</th>
143
+ </thead>
144
+ <tbody>
145
+ <tr>
146
+ <th span="row"><a href="https://github.com/typescript-eslint/typescript-eslint">typescript-eslint</a></th>
147
+ <td>✨ Monorepo for all the tooling which enables ESLint to support TypeScript</td>
148
+ <td>Maintainer</td>
149
+ <td><img alt="Stars: typescript-eslint" src="https://img.shields.io/github/stars/typescript-eslint/typescript-eslint" /></td>
150
+ </tr>
151
+ <tr>
152
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/TypeStat">TypeStat</a></th>
153
+ <td>Converts JavaScript to TypeScript and TypeScript to better TypeScript.</td>
154
+ <td>Creator & maintainer</td>
155
+ <td><img alt="Stars: TypeStat" src="https://img.shields.io/github/stars/JoshuaKGoldberg/TypeStat" /></td>
156
+ </tr>
157
+ </tbody>
158
+ </table>
159
+
160
+ ### Developer Tooling
161
+
162
+ I work on assorted projects in the JavaScript/TypeScript ecosystem that make it easier to write high quality applications.
163
+
164
+ <table width="100%">
165
+ <thead>
166
+ <th span="col">Project ⚙️</th>
167
+ <th span="col">Description 📝</th>
168
+ <th span="col">Role 🧑‍🏭</th>
169
+ <th span="col">Stars ⭐</th>
170
+ </thead>
171
+ <tbody>
172
+ <tr>
173
+ <th span="row"><a href="https://github.com/dmnd/dedent">dedent</a></th>
174
+ <td>⬅️ ES6 string tag that strips indentation from multi-line strings.</td>
175
+ <td>Adoptive maintainer</td>
176
+ <td><img alt="Stars: dedent" src="https://img.shields.io/github/stars/dmnd/dedent" /></td>
177
+ </tr>
178
+ <tr>
179
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/template-typescript-node-package">template-typescript-node-package</a></th>
180
+ <td>A quickstart-friendly TypeScript template with comprehensive formatting, linting, releases, testing, and other great tooling built-in.</td>
181
+ <td>Creator & maintainer</td>
182
+ <td><img alt="Stars: template-typescript-node-package" src="https://img.shields.io/github/stars/JoshuaKGoldberg/template-typescript-node-package" /></td>
183
+ </tr>
184
+ <tr>
185
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/eslint-plugin-expect-type">eslint-plugin-expect-type</a></th>
186
+ <td>ESLint plugin with $ExpectType, $ExpectError, and $ExpectTypeSnapshot type assertions</td>
187
+ <td>Adoptive maintainer</td>
188
+ <td><img alt="Stars: eslint-plugin-expect-type" src="https://img.shields.io/github/stars/JoshuaKGoldberg/eslint-plugin-expect-type" /></td>
189
+ </tr>
190
+ <tr>
191
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/prettier-plugin-curly">prettier-plugin-curly</a></th>
192
+ <td>Prettier plugin to enforce consistent brace style for all control statements.</td>
193
+ <td>Creator & maintainer</td>
194
+ <td><img alt="Stars: prettier-plugin-curly" src="https://img.shields.io/github/stars/JoshuaKGoldberg/prettier-plugin-curly" /></td>
195
+ </tr>
196
+ <tr>
197
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/refined-saved-replies">refined-saved-replies</a></th>
198
+ <td>A Chrome extension for GitHub's Saved Replies that adds replies from a repository's .github/replies.yml.</td>
199
+ <td>Creator & maintainer</td>
200
+ <td><img alt="Stars: refined-saved-replies" src="https://img.shields.io/github/stars/JoshuaKGoldberg/refined-saved-replies" /></td>
201
+ </tr>
202
+ <tr>
203
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/mock-react-redux">mock-react-redux</a></th>
204
+ <td>🎭 Mocks out Redux actions and selectors for clean React Jest tests.</td>
205
+ <td>Creator & maintainer</td>
206
+ <td><img alt="Stars: mock-react-redux" src="https://img.shields.io/github/stars/JoshuaKGoldberg/mock-react-redux" /></td>
207
+ </tr>
208
+ <tr>
209
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/ts-function-inliner">ts-function-inliner</a></th>
210
+ <td>TypeScript transformation that inlines calls to small functions. ⚡️</td>
211
+ <td>Creator & maintainer</td>
212
+ <td><img alt="Stars: ts-function-inliner" src="https://img.shields.io/github/stars/JoshuaKGoldberg/ts-function-inliner" /></td>
213
+ </tr>
214
+ <tr>
215
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/ts-api-utils">ts-api-utils</a></th>
216
+ <td>Utility functions for working with TypeScript's API. Successor to the wonderful ajafff/tsutils.</td>
217
+ <td>Creator & maintainer</td>
218
+ <td><img alt="Stars: ts-api-utils" src="https://img.shields.io/github/stars/JoshuaKGoldberg/ts-api-utils" /></td>
219
+ </tr>
220
+ <tr>
221
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/console-fail-test">console-fail-test</a></th>
222
+ <td>Gently fails test runs if the console was used during them. ✋</td>
223
+ <td>Creator & maintainer</td>
224
+ <td><img alt="Stars: console-fail-test" src="https://img.shields.io/github/stars/JoshuaKGoldberg/console-fail-test" /></td>
225
+ </tr>
226
+ <tr>
227
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/all-contributors-auto-action">all-contributors-auto-action</a></th>
228
+ <td>Fills in missing allcontributors entries for a repository. 👪</td>
229
+ <td>Creator & maintainer</td>
230
+ <td><img alt="Stars: all-contributors-auto-action" src="https://img.shields.io/github/stars/JoshuaKGoldberg/all-contributors-auto-action" /></td>
231
+ </tr>
232
+ <tr>
233
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/are-docs-informative">are-docs-informative</a></th>
234
+ <td>Checks whether a documentation description introduces any new information.</td>
235
+ <td>Creator & maintainer</td>
236
+ <td><img alt="Stars: are-docs-informative" src="https://img.shields.io/github/stars/JoshuaKGoldberg/are-docs-informative" /></td>
237
+ </tr>
238
+ <tr>
239
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/tidelift-me-up">tidelift-me-up</a></th>
240
+ <td>Finds your npm packages that are eligible for Tidelift funding. 💸</td>
241
+ <td>Creator & maintainer</td>
242
+ <td><img alt="Stars: tidelift-me-up" src="https://img.shields.io/github/stars/JoshuaKGoldberg/tidelift-me-up" /></td>
243
+ </tr>
244
+ <tr>
245
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/should-semantic-release">should-semantic-release</a></th>
246
+ <td>Checks whether a semantic release should be run for a commit.</td>
247
+ <td>Creator & maintainer</td>
248
+ <td><img alt="Stars: should-semantic-release" src="https://img.shields.io/github/stars/JoshuaKGoldberg/should-semantic-release" /></td>
249
+ </tr>
250
+ <tr>
251
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/sentences-per-line">sentences-per-line</a></th>
252
+ <td>Contributed markdownlint rule for one sentence per line.</td>
253
+ <td>Creator & maintainer</td>
254
+ <td><img alt="Stars: sentences-per-line" src="https://img.shields.io/github/stars/JoshuaKGoldberg/sentences-per-line" /></td>
255
+ </tr>
256
+ <tr>
257
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/github-sponsors-to-markdown">github-sponsors-to-markdown</a></th>
258
+ <td>Creates a Markdown table summarizing your GitHub sponsors.</td>
259
+ <td>Creator & maintainer</td>
260
+ <td><img alt="Stars: github-sponsors-to-markdown" src="https://img.shields.io/github/stars/JoshuaKGoldberg/github-sponsors-to-markdown" /></td>
261
+ </tr>
262
+ <tr>
263
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/all-contributors-for-repository">all-contributors-for-repository</a></th>
264
+ <td>Generates an allcontributors list for an existing repository. 👪</td>
265
+ <td>Creator & maintainer</td>
266
+ <td><img alt="Stars: all-contributors-for-repository" src="https://img.shields.io/github/stars/JoshuaKGoldberg/all-contributors-for-repository" /></td>
267
+ </tr>
268
+ <tr>
269
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/tidelift-me-up-site">tidelift-me-up-site</a></th>
270
+ <td>Find your npm packages eligible for Tidelift funding. 💸</td>
271
+ <td>Creator & maintainer</td>
272
+ <td><img alt="Stars: tidelift-me-up-site" src="https://img.shields.io/github/stars/JoshuaKGoldberg/tidelift-me-up-site" /></td>
273
+ </tr>
274
+ <tr>
275
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/sinon-timers-repeatable">sinon-timers-repeatable</a></th>
276
+ <td>A version of Sinon's `useFakeTimers` that you can call multiple times in a test.</td>
277
+ <td>Creator & maintainer</td>
278
+ <td><img alt="Stars: sinon-timers-repeatable" src="https://img.shields.io/github/stars/JoshuaKGoldberg/sinon-timers-repeatable" /></td>
279
+ </tr>
280
+ </tbody>
281
+ </table>
282
+
283
+ ### Emoji Shenanigans
284
+
285
+ I also have an interest in making web apps more delightful
286
+ These projects will help you add emoji delighters to your page quickly.
287
+
288
+ <table width="100%">
289
+ <thead>
290
+ <th span="col">Project ⚙️</th>
291
+ <th span="col">Description 📝</th>
292
+ <th span="col">Role 🧑‍🏭</th>
293
+ <th span="col">Stars ⭐</th>
294
+ </thead>
295
+ <tbody>
296
+ <tr>
297
+ <th span="row"><a href="https://github.com/omnidan/node-emoji">node-emoji</a></th>
298
+ <td>😏 simple emoji support for node.js projects</td>
299
+ <td>Junior maintainer</td>
300
+ <td><img alt="Stars: node-emoji" src="https://img.shields.io/github/stars/omnidan/node-emoji" /></td>
301
+ </tr>
302
+ <tr>
303
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/Emojisplosion">Emojisplosion</a></th>
304
+ <td>💥 Blasts 😄 emoji 😊 like 🎆 fireworks 🎇 all up in your 💻 HTML 📄 page. 😍</td>
305
+ <td>Creator & maintainer</td>
306
+ <td><img alt="Stars: Emojisplosion" src="https://img.shields.io/github/stars/JoshuaKGoldberg/Emojisplosion" /></td>
307
+ </tr>
308
+ <tr>
309
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/Konamimojisplosion">Konamimojisplosion</a></th>
310
+ <td>Connects konami-code-js to emojisplosion for a glorious easter egg. 🎉 ✨ 🎆</td>
311
+ <td>Creator & maintainer</td>
312
+ <td><img alt="Stars: Konamimojisplosion" src="https://img.shields.io/github/stars/JoshuaKGoldberg/Konamimojisplosion" /></td>
313
+ </tr>
314
+ <tr>
315
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/typedoc-plugin-konamimojisplosion">typedoc-plugin-konamimojisplosion</a></th>
316
+ <td>TypeDoc plugin to quickly integrate konamimojisplosion into your docs site. 🎉 ✨ 🎆</td>
317
+ <td>Creator & maintainer</td>
318
+ <td><img alt="Stars: typedoc-plugin-konamimojisplosion" src="https://img.shields.io/github/stars/JoshuaKGoldberg/typedoc-plugin-konamimojisplosion" /></td>
319
+ </tr>
320
+ <tr>
321
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/astro-konamimojisplosion">astro-konamimojisplosion</a></th>
322
+ <td>Astro integration to quickly integrate konamimojisplosion into your site. 🎉 ✨ 🎆</td>
323
+ <td>Creator & maintainer</td>
324
+ <td><img alt="Stars: astro-konamimojisplosion" src="https://img.shields.io/github/stars/JoshuaKGoldberg/astro-konamimojisplosion" /></td>
325
+ </tr>
326
+ </tbody>
327
+ </table>
328
+
329
+ ### Just For Fun
330
+
331
+ These projects I do because I think they're fascinating and/or fun, if not particularly useful:
332
+
333
+ <table width="100%">
334
+ <thead>
335
+ <th span="col">Project ⚙️</th>
336
+ <th span="col">Description 📝</th>
337
+ <th span="col">Role 🧑‍🏭</th>
338
+ <th span="col">Stars ⭐</th>
339
+ </thead>
340
+ <tbody>
341
+ <tr>
342
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/Old-Deleted-FullScreenMario">FullScreenMario</a></th>
343
+ <td>An HTML5 remake of the original Super Mario Brothers - expanded for wide screens.</td>
344
+ <td>Creator</td>
345
+ <td><img alt="Stars: FullScreenMario" src="https://img.shields.io/github/stars/JoshuaKGoldberg/Old-Deleted-FullScreenMario" /></td>
346
+ </tr>
347
+ <tr>
348
+ <th span="row"><a href="https://github.com/FullScreenShenanigans/FullScreenPokemon">FullScreenPokemon</a></th>
349
+ <td>A free HTML5 remake of the original Pokemon, expanded for modern browsing.</td>
350
+ <td>Creator & maintainer</td>
351
+ <td><img alt="Stars: FullScreenPokemon" src="https://img.shields.io/github/stars/FullScreenShenanigans/FullScreenPokemon" /></td>
352
+ </tr>
353
+ <tr>
354
+ <th span="row"><a href="https://github.com/FullScreenShenanigans/EightBittr">EightBittr</a></th>
355
+ <td>Bare-bones, highly modular game engine for 2D 8-bit games.</td>
356
+ <td>Creator & maintainer</td>
357
+ <td><img alt="Stars: EightBittr" src="https://img.shields.io/github/stars/FullScreenShenanigans/EightBittr" /></td>
358
+ </tr>
359
+ <tr>
360
+ <th span="row"><a href="https://github.com/JoshuaKGoldberg/ChooseYourFramework">ChooseYourFramework</a></th>
361
+ <td>Choosing a modern JavaScript UI framework, Pokemon-style.</td>
362
+ <td>Creator & maintainer</td>
363
+ <td><img alt="Stars: ChooseYourFramework" src="https://img.shields.io/github/stars/JoshuaKGoldberg/ChooseYourFramework" /></td>
364
+ </tr>
365
+ <tr>
366
+ <th span="row"><a href="https://github.com/budgielang/Budgie">Budgie</a></th>
367
+ <td>A unified syntax that compiles into your favorite OOP languages. 🦜</td>
368
+ <td>Creator & maintainer</td>
369
+ <td><img alt="Stars: Budgie" src="https://img.shields.io/github/stars/budgielang/Budgie" /></td>
370
+ </tr>
371
+ </tbody>
372
+ </table>
package/add/index.js ADDED
@@ -0,0 +1,50 @@
1
+ import chalk from "chalk";
2
+ import fs from "node:fs/promises";
3
+ import prettier from "prettier";
4
+ import { writeFile } from "../shared/writeFile.js";
5
+
6
+ const owner = "JoshuaKGoldberg";
7
+ const repos = Array.from(new Set(process.argv.slice(2).sort()));
8
+
9
+ if (!repos.length) {
10
+ throw new Error("No repositories provided.");
11
+ }
12
+
13
+ const existingKey = "Developer Tooling";
14
+ const existingFile = JSON.parse(await fs.readFile("./projects.json"));
15
+ const existingProjects = existingFile[existingKey].projects;
16
+ const existingProjectNames = new Set(
17
+ existingProjects.map((project) => project.repo)
18
+ );
19
+
20
+ const newRepos = repos.filter((repo) => {
21
+ const newLocal = existingProjectNames.has(repo);
22
+ if (newLocal) {
23
+ console.warn(chalk.yellow(`Repo ${repo} already exists...`));
24
+ return false;
25
+ }
26
+
27
+ console.info(chalk.blue(`Repo ${repo} does not already exist.`));
28
+ return true;
29
+ });
30
+
31
+ if (!newRepos.length) {
32
+ console.log(chalk.green("Nothing to update. Bailing."));
33
+ } else {
34
+ await writeFile(
35
+ "./projects.json",
36
+ JSON.stringify({
37
+ ...existingFile,
38
+ [existingKey]: {
39
+ ...existingFile[existingKey],
40
+ projects: [
41
+ ...existingProjects,
42
+ ...newRepos.map((repo) => ({ owner, repo })),
43
+ ],
44
+ },
45
+ }),
46
+ "json"
47
+ );
48
+
49
+ await import("../build/index.js");
50
+ }
@@ -0,0 +1,47 @@
1
+ import path from "node:path";
2
+ import url from "node:url";
3
+
4
+ import * as emoji from "node-emoji";
5
+ import { Octokit } from "octokit";
6
+ import { writeFile } from "../shared/writeFile.js";
7
+
8
+ export async function buildProjects() {
9
+ const projectsFile = path.join(
10
+ url.fileURLToPath(import.meta.url),
11
+ "../../projects.json"
12
+ );
13
+ const { default: projectsData } = await import(projectsFile, {
14
+ assert: { type: "json" },
15
+ });
16
+ const octokit = new Octokit({
17
+ auth: process.env.GH_TOKEN,
18
+ });
19
+
20
+ for (const { projects } of Object.values(projectsData)) {
21
+ await processProjects(projects);
22
+ }
23
+
24
+ async function processProjects(projects) {
25
+ projects.sort((a, b) => b.stars - a.stars);
26
+
27
+ for (const project of projects) {
28
+ await processProject(project);
29
+ }
30
+ }
31
+
32
+ async function processProject(project) {
33
+ const { owner, repo } = project;
34
+ const response = await octokit.rest.repos.get({ owner, repo });
35
+
36
+ project.description = emoji.emojify(response.data.description);
37
+ project.stars = response.data.stargazers_count;
38
+
39
+ if (project.more) {
40
+ await processProjects(project.more);
41
+ }
42
+ }
43
+
44
+ await writeFile(projectsFile, JSON.stringify(projectsData), "json");
45
+
46
+ return projectsData;
47
+ }
@@ -0,0 +1,37 @@
1
+ export async function buildProjectsTable({ description, projects, title }) {
2
+ return `
3
+ ### ${title}
4
+
5
+ ${description.replaceAll(". ", "\n")}
6
+
7
+ <table width="100%">
8
+ <thead>
9
+ <th span="col">Project ⚙️</th>
10
+ <th span="col">Description 📝</th>
11
+ <th span="col">Role 🧑‍🏭</th>
12
+ <th span="col">Stars ⭐</th>
13
+ </thead>
14
+ <tbody>
15
+ ${projects
16
+ .map(
17
+ ({
18
+ description,
19
+ owner,
20
+ repo,
21
+ name = repo,
22
+ role = "Creator & maintainer",
23
+ }) =>
24
+ `
25
+ <tr>
26
+ <th span="row"><a href="https://github.com/${owner}/${repo}">${name}</a></th>
27
+ <td>${description}</td>
28
+ <td>${role}</td>
29
+ <td><img alt="Stars: ${name}" src="https://img.shields.io/github/stars/${owner}/${repo}" /></td>
30
+ </tr>
31
+ `.trim()
32
+ )
33
+ .join("\n\t\t")}
34
+ </tbody>
35
+ </table>
36
+ `.trimStart();
37
+ }
@@ -0,0 +1,14 @@
1
+ import { buildProjects } from "./buildProjects.js";
2
+ import { buildProjectsTable } from "./buildProjectsTable.js";
3
+
4
+ export async function buildProjectsTables() {
5
+ const projectsData = await buildProjects();
6
+
7
+ return (
8
+ await Promise.all(
9
+ Object.entries(projectsData).map(([title, section]) =>
10
+ buildProjectsTable({ ...section, title })
11
+ )
12
+ )
13
+ ).join("\n");
14
+ }
@@ -0,0 +1,30 @@
1
+ import { githubSponsorsToMarkdown } from "github-sponsors-to-markdown";
2
+
3
+ export async function buildSponsorsTable() {
4
+ return await githubSponsorsToMarkdown({
5
+ login: "JoshuaKGoldberg",
6
+ tiers: {
7
+ Platinum: {
8
+ label: "Platinum Sponsors (&gt;=$100/mo)",
9
+ minimum: 100,
10
+ size: 150,
11
+ },
12
+ Gold: {
13
+ label: "Gold Sponsors (&gt;=$25/mo)",
14
+ minimum: 25,
15
+ size: 100,
16
+ },
17
+ Silver: {
18
+ label: "Silver Sponsors (&gt;=$10/mo)",
19
+ minimum: 10,
20
+ size: 50,
21
+ },
22
+ Bronze: {
23
+ label: "Bronze Sponsors (&gt;=$5/mo)",
24
+ minimum: 5,
25
+ size: 50,
26
+ },
27
+ },
28
+ verbose: true,
29
+ });
30
+ }
package/build/index.js ADDED
@@ -0,0 +1,50 @@
1
+ import fs from "node:fs/promises";
2
+ import prettier from "prettier";
3
+ import { buildSponsorsTable } from "./buildSponsorsTable.js";
4
+ import { buildProjectsTables } from "./buildProjectsTables.js";
5
+ import { writeFile } from "../shared/writeFile.js";
6
+
7
+ const content = `
8
+ ## Hi, I'm Josh! 💖
9
+
10
+ <!--
11
+ Fun fact: the entirety of this README.md is auto-generated!
12
+ See https://github.com/JoshuaKGoldberg/JoshuaKGoldberg.
13
+ -->
14
+
15
+ [![Follow on Bluesky](https://img.shields.io/badge/Follow-Bluesky-3B82F6.svg)](https://staging.bsky.app/profile/joshuakgoldberg.com)
16
+ [![Follow on Mastodon](https://img.shields.io/badge/Follow-Mastodon-5A47DC.svg)](https://fosstodon.org/@JoshuaKGoldberg)
17
+ [![Follow on Twitch](https://img.shields.io/badge/Follow-Twitch-9147FF.svg)](https://twitch.tv/JoshuaKGoldberg)
18
+ [![Follow on Twitter](https://img.shields.io/badge/Follow-Twitter-1DA1F2.svg)](https://twitter.com/JoshuaKGoldberg)
19
+ [![Subscribe on YouTube](https://img.shields.io/badge/Subscribe-YouTube-FF0000.svg)](https://youtube.com/@JoshuaKGoldberg)
20
+
21
+ [![Email Me](https://img.shields.io/badge/Email-github@joshuakgoldberg.com-007735.svg)](mailto:me@joshuakgoldberg.com)
22
+ [![Sponsor on GitHub](https://img.shields.io/badge/Sponsor-GitHub-6cc644.svg)](https://github.com/sponsors/joshuakgoldberg)
23
+
24
+ I'm an independent full time open source developer.
25
+
26
+ I work on projects in the TypeScript ecosystem, most notably [typescript-eslint](https://typescript-eslint.io): the tooling that enables ESLint and Prettier to run on TypeScript code.
27
+ I'm also the author of O'Reilly's [_Learning TypeScript_ book](https://www.learningtypescript.com), a Microsoft MVP for developer technologies, and an active conference speaker.
28
+
29
+ My personal projects range from static analysis to meta-languages to recreating retro games in the browser.
30
+ Also cats. 🐱
31
+
32
+ ---
33
+
34
+ ## Thanks to my Sponsors
35
+
36
+ Because I'm independent, I rely on sponsors to fund my work.
37
+ They deserve our sincere appreciation and gratitude.
38
+
39
+ ${await buildSponsorsTable()}
40
+
41
+ > 💚 Motivated to support my work, or just want your image here?
42
+ > See my [GitHub Sponsors profile](https://github.com/sponsors/JoshuaKGoldberg).
43
+ > Thanks!
44
+
45
+ ## What I'm Working On
46
+
47
+ ${await buildProjectsTables()}
48
+ `.trimStart();
49
+
50
+ await writeFile("./README.md", content, "markdown");
package/package.json ADDED
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "joshuakgoldberg",
3
+ "version": "0.0.1",
4
+ "description": "[![Email Me](https://img.shields.io/badge/Email-github@joshuakgoldberg.com-007735.svg)](mailto:me@joshuakgoldberg.com) [![Follow on Mastodon](https://img.shields.io/badge/Follow-Mastodon-5A47DC.svg)](https://fosstodon.org/@JoshuaKGoldberg) [![Follow on Twitch](https://img.shields.io/badge/Follow-Twitch-9147FF.svg)](https://twitch.tv/JoshuaKGoldberg) [![Follow on Twitter](https://img.shields.io/badge/Follow-Twitter-1DA1F2.svg)](https://twitter.com/JoshuaKGoldberg) [![Sponsor on GitHub](https://img.shields.io/badge/Sponsor-GitHub-6cc644.svg)](https://github.com/sponsors/joshuakgoldberg)",
5
+ "type": "module",
6
+ "scripts": {
7
+ "add": "node add/index.js",
8
+ "build": "node build/index.js"
9
+ },
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/JoshuaKGoldberg/JoshuaKGoldberg.git"
13
+ },
14
+ "keywords": [],
15
+ "author": "",
16
+ "license": "MIT",
17
+ "bugs": {
18
+ "url": "https://github.com/JoshuaKGoldberg/JoshuaKGoldberg/issues"
19
+ },
20
+ "homepage": "https://github.com/JoshuaKGoldberg/JoshuaKGoldberg#readme",
21
+ "dependencies": {
22
+ "chalk": "^5.3.0",
23
+ "github-sponsors-to-markdown": "^0.0.7",
24
+ "node-emoji": "^2.0.2",
25
+ "octokit": "^2.0.14",
26
+ "prettier": "^2.8.7"
27
+ },
28
+ "packageManager": "pnpm@8.6.0",
29
+ "engines": {
30
+ "node": ">=18"
31
+ }
32
+ }
package/projects.json ADDED
@@ -0,0 +1,228 @@
1
+ {
2
+ "Biggest Projects": {
3
+ "description": "If you work with TypeScript, you may have used one of the open source projects I support:",
4
+ "projects": [
5
+ {
6
+ "description": "✨ Monorepo for all the tooling which enables ESLint to support TypeScript",
7
+ "owner": "typescript-eslint",
8
+ "repo": "typescript-eslint",
9
+ "role": "Maintainer",
10
+ "stars": 13741
11
+ },
12
+ {
13
+ "description": "Converts JavaScript to TypeScript and TypeScript to better TypeScript.",
14
+ "owner": "JoshuaKGoldberg",
15
+ "repo": "TypeStat",
16
+ "stars": 958
17
+ }
18
+ ]
19
+ },
20
+ "Developer Tooling": {
21
+ "description": "I work on assorted projects in the JavaScript/TypeScript ecosystem that make it easier to write high quality applications.",
22
+ "projects": [
23
+ {
24
+ "owner": "dmnd",
25
+ "repo": "dedent",
26
+ "role": "Adoptive maintainer",
27
+ "description": "⬅️ ES6 string tag that strips indentation from multi-line strings.",
28
+ "stars": 745
29
+ },
30
+ {
31
+ "description": "A quickstart-friendly TypeScript template with comprehensive formatting, linting, releases, testing, and other great tooling built-in.",
32
+ "owner": "JoshuaKGoldberg",
33
+ "repo": "template-typescript-node-package",
34
+ "stars": 316
35
+ },
36
+ {
37
+ "description": "ESLint plugin with $ExpectType, $ExpectError, and $ExpectTypeSnapshot type assertions",
38
+ "owner": "JoshuaKGoldberg",
39
+ "repo": "eslint-plugin-expect-type",
40
+ "role": "Adoptive maintainer",
41
+ "stars": 64
42
+ },
43
+ {
44
+ "description": "Prettier plugin to enforce consistent brace style for all control statements.",
45
+ "owner": "JoshuaKGoldberg",
46
+ "repo": "prettier-plugin-curly",
47
+ "stars": 31
48
+ },
49
+ {
50
+ "description": "A Chrome extension for GitHub's Saved Replies that adds replies from a repository's .github/replies.yml.",
51
+ "owner": "JoshuaKGoldberg",
52
+ "repo": "refined-saved-replies",
53
+ "stars": 21
54
+ },
55
+ {
56
+ "description": "🎭 Mocks out Redux actions and selectors for clean React Jest tests.",
57
+ "owner": "JoshuaKGoldberg",
58
+ "repo": "mock-react-redux",
59
+ "stars": 20
60
+ },
61
+ {
62
+ "description": "TypeScript transformation that inlines calls to small functions. ⚡️",
63
+ "owner": "JoshuaKGoldberg",
64
+ "repo": "ts-function-inliner",
65
+ "stars": 20
66
+ },
67
+ {
68
+ "description": "Utility functions for working with TypeScript's API. Successor to the wonderful ajafff/tsutils.",
69
+ "owner": "JoshuaKGoldberg",
70
+ "repo": "ts-api-utils",
71
+ "stars": 15
72
+ },
73
+ {
74
+ "description": "Gently fails test runs if the console was used during them. ✋",
75
+ "owner": "JoshuaKGoldberg",
76
+ "repo": "console-fail-test",
77
+ "stars": 10
78
+ },
79
+ {
80
+ "owner": "JoshuaKGoldberg",
81
+ "repo": "all-contributors-auto-action",
82
+ "description": "Fills in missing allcontributors entries for a repository. 👪",
83
+ "stars": 9
84
+ },
85
+ {
86
+ "owner": "JoshuaKGoldberg",
87
+ "repo": "are-docs-informative",
88
+ "description": "Checks whether a documentation description introduces any new information.",
89
+ "stars": 7
90
+ },
91
+ {
92
+ "owner": "JoshuaKGoldberg",
93
+ "repo": "tidelift-me-up",
94
+ "description": "Finds your npm packages that are eligible for Tidelift funding. 💸",
95
+ "stars": 6
96
+ },
97
+ {
98
+ "description": "Checks whether a semantic release should be run for a commit.",
99
+ "owner": "JoshuaKGoldberg",
100
+ "repo": "should-semantic-release",
101
+ "stars": 5
102
+ },
103
+ {
104
+ "description": "Contributed markdownlint rule for one sentence per line.",
105
+ "owner": "JoshuaKGoldberg",
106
+ "repo": "sentences-per-line",
107
+ "stars": 5
108
+ },
109
+ {
110
+ "description": "Creates a Markdown table summarizing your GitHub sponsors.",
111
+ "owner": "JoshuaKGoldberg",
112
+ "repo": "github-sponsors-to-markdown",
113
+ "stars": 4
114
+ },
115
+ {
116
+ "owner": "JoshuaKGoldberg",
117
+ "repo": "all-contributors-for-repository",
118
+ "description": "Generates an allcontributors list for an existing repository. 👪",
119
+ "stars": 3
120
+ },
121
+ {
122
+ "owner": "JoshuaKGoldberg",
123
+ "repo": "tidelift-me-up-site",
124
+ "description": "Find your npm packages eligible for Tidelift funding. 💸",
125
+ "stars": 3
126
+ },
127
+ {
128
+ "description": "A version of Sinon's `useFakeTimers` that you can call multiple times in a test.",
129
+ "owner": "JoshuaKGoldberg",
130
+ "repo": "sinon-timers-repeatable",
131
+ "stars": 1
132
+ }
133
+ ]
134
+ },
135
+ "Emoji Shenanigans": {
136
+ "description": "I also have an interest in making web apps more delightful. These projects will help you add emoji delighters to your page quickly.",
137
+ "projects": [
138
+ {
139
+ "description": "😏 simple emoji support for node.js projects",
140
+ "owner": "omnidan",
141
+ "repo": "node-emoji",
142
+ "role": "Junior maintainer",
143
+ "stars": 1224
144
+ },
145
+ {
146
+ "description": "💥 Blasts 😄 emoji 😊 like 🎆 fireworks 🎇 all up in your 💻 HTML 📄 page. 😍",
147
+ "owner": "JoshuaKGoldberg",
148
+ "repo": "Emojisplosion",
149
+ "stars": 82
150
+ },
151
+ {
152
+ "description": "Connects konami-code-js to emojisplosion for a glorious easter egg. 🎉 ✨ 🎆",
153
+ "owner": "JoshuaKGoldberg",
154
+ "repo": "Konamimojisplosion",
155
+ "stars": 9
156
+ },
157
+ {
158
+ "description": "TypeDoc plugin to quickly integrate konamimojisplosion into your docs site. 🎉 ✨ 🎆",
159
+ "owner": "JoshuaKGoldberg",
160
+ "repo": "typedoc-plugin-konamimojisplosion",
161
+ "stars": 3
162
+ },
163
+ {
164
+ "description": "Astro integration to quickly integrate konamimojisplosion into your site. 🎉 ✨ 🎆",
165
+ "owner": "JoshuaKGoldberg",
166
+ "repo": "astro-konamimojisplosion",
167
+ "stars": 1
168
+ }
169
+ ]
170
+ },
171
+ "Just For Fun": {
172
+ "description": "These projects I do because I think they're fascinating and/or fun, if not particularly useful:",
173
+ "projects": [
174
+ {
175
+ "description": "An HTML5 remake of the original Super Mario Brothers - expanded for wide screens.",
176
+ "name": "FullScreenMario",
177
+ "owner": "JoshuaKGoldberg",
178
+ "repo": "Old-Deleted-FullScreenMario",
179
+ "role": "Creator",
180
+ "stars": 2993
181
+ },
182
+ {
183
+ "description": "A free HTML5 remake of the original Pokemon, expanded for modern browsing.",
184
+ "owner": "FullScreenShenanigans",
185
+ "repo": "FullScreenPokemon",
186
+ "stars": 205
187
+ },
188
+ {
189
+ "description": "Bare-bones, highly modular game engine for 2D 8-bit games.",
190
+ "owner": "FullScreenShenanigans",
191
+ "repo": "EightBittr",
192
+ "stars": 69
193
+ },
194
+ {
195
+ "description": "Choosing a modern JavaScript UI framework, Pokemon-style.",
196
+ "owner": "JoshuaKGoldberg",
197
+ "repo": "ChooseYourFramework",
198
+ "stars": 65
199
+ },
200
+ {
201
+ "description": "A unified syntax that compiles into your favorite OOP languages. 🦜",
202
+ "more": [
203
+ {
204
+ "description": "A natural language layer on top of Budgie. 🦜",
205
+ "owner": "budgielang",
206
+ "repo": "NBudgie",
207
+ "stars": 2
208
+ },
209
+ {
210
+ "description": "Converts TypeScript code to Budgie. 🦜",
211
+ "owner": "budgielang",
212
+ "repo": "ts-budgie",
213
+ "stars": 2
214
+ },
215
+ {
216
+ "description": "Compiles C# code to General Language Syntax (GLS).",
217
+ "owner": "budgielang",
218
+ "repo": "CS-Budgie",
219
+ "stars": 1
220
+ }
221
+ ],
222
+ "owner": "budgielang",
223
+ "repo": "Budgie",
224
+ "stars": 59
225
+ }
226
+ ]
227
+ }
228
+ }
package/renovate.json ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "automerge": true,
4
+ "internalChecksFilter": "strict",
5
+ "labels": ["dependencies"],
6
+ "stabilityDays": 3
7
+ }
@@ -0,0 +1,13 @@
1
+ import fs from "node:fs/promises";
2
+ import prettier from "prettier";
3
+
4
+ let config;
5
+
6
+ export async function writeFile(filePath, contents, parser) {
7
+ config ??= await prettier.resolveConfig("./projects.json");
8
+
9
+ await fs.writeFile(
10
+ filePath,
11
+ await prettier.format(contents, { parser, ...config })
12
+ );
13
+ }