-
Notifications
You must be signed in to change notification settings - Fork 5
/
pewpew.html
230 lines (216 loc) · 20.6 KB
/
pewpew.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
---
title: "github-pewpew: pew pew needless GitHub repos and more!"
description: "Clean up your unused repos and more from your terminal. Created by Adrián Mato."
---
<!DOCTYPE html>
<html>
<head>
<title>{{page.title}}</title>
<meta name="description" content="{{page.description }}">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="preload" href="{{" /assets/pewpew/styles/inter-var-latin.woff2" | relative_url }}" as="font"
type="font/woff2" crossorigin="anonymous" />
<link rel="preload" as="style" href="{{" /assets/pewpew/styles/main.css" | relative_url }}">
<link rel="stylesheet" href="{{" /assets/pewpew/styles/main.css" | relative_url }}">
<link rel="manifest" href="{{" /assets/pewpew/favicon/manifest.json" | relative_url }}">
<link rel="apple-touch-icon" sizes="180x180" href="{{" /assets/pewpew/favicon/apple-touch-icon.png" | relative_url
}}">
<link rel="icon" type="image/png" sizes="32x32" href="{{" /assets/pewpew/favicon/favicon-32x32.png" | relative_url
}}">
<link rel="icon" type="image/png" sizes="16x16" href="{{" /assets/pewpew/favicon/favicon-16x16.png" | relative_url
}}">
<link rel="mask-icon" href="{{" /assets/pewpew/favicon/mask-icon.svg" | relative_url }}">
<meta property="og:title" content="{{page.title}}" />
<meta property="og:description" content="{{page.description }}" />
<meta property="og:image" content="{{" /assets/pewpew/og.png?2" | absolute_url }}" />
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:url" content="{{ site.url }}/pewpew" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="github-pewpew" />
<meta property="og:locale" content="en_US" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:site" content="@adrianmg" />
<meta name="twitter:title" content="{{page.title}}" />
<meta name="twitter:description" content="{{page.description }}" />
<meta name="twitter:image" content="{{" /assets/pewpew/og.png?2" | absolute_url }}" />
<meta name="twitter:url" content="{{ site.url }}/pewpew" />
</head>
<body>
<div class="container">
<img class="logo" srcset="{{" /assets/pewpew/logo.webp" | relative_url }} 1x, {{"/assets/pewpew/logo@2x.webp" |
relative_url }} 2x" width="152" height="142" alt="github-pewpew logo" />
<div class="margin">
<h1>Pew pew needless GitHub repos!</h1>
<h3>Clean up your unused repos and codespaces via CLI.</h3>
</div>
<ul class="cta margin">
<li>
<code data="npm i -g github-pewpew">
<span>$ npm i -g github-pewpew</span>
<svg class="copy" xmlns="http://www.w3.org/2000/svg" width="22" height="22">
<path
d="M7.833 16.435H6c-1.013 0-1.833-.836-1.833-1.866V4.616c0-1.032.82-1.866 1.833-1.866h7.333c1.013 0 1.834.835 1.834 1.866v1.71m-5.5.157H17c1.013 0 1.833.834 1.833 1.865V18.3c0 1.032-.82 1.867-1.833 1.867H9.667c-1.013 0-1.834-.835-1.834-1.867V8.348c0-1.03.82-1.865 1.834-1.865Z"
stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
</svg>
<svg class="check" width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 6 9 17l-5-5" stroke="currentColor" stroke-width="2" stroke-linecap="round"
stroke-linejoin="round" />
</svg>
</code>
</li>
<li>
<a class="github" href="https://github.com/adrianmg/github-pewpew">
<svg width="16" height="16" aria-hidden="true" viewBox="0 0 16 16">
<path fill-rule="evenodd"
d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z">
</path>
</svg>
<span>View on GitHub</span>
</a>
</li>
</ul>
<section class="preview">
<div class="cli">
<div class="header">
<svg width="52" height="12" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="6" cy="6" r="6" />
<circle cx="26" cy="6" r="6" />
<circle cx="46" cy="6" r="6" />
</svg>
</div>
<div id="cli" class="content">
<p>➜</p>
</div>
</div>
</section>
<section class="features margin">
<h2>Have you ever had too much fun playing with the GitHub API?</h2>
<h3>Me too! This little tool cleans up repos and more quickly.</h3>
<dl>
<div class="card">
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M7 11V7a5 5 0 1 1 10 0v4" stroke="url(#a)" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round" />
<path d="M19 11H5a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7a2 2 0 0 0-2-2Z"
stroke="url(#b)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
<defs>
<linearGradient id="a" x1="12" y1="2" x2="12" y2="11" gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
<linearGradient id="b" x1="12" y1="11" x2="12" y2="22" gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
</defs>
</svg>
<dt>GitHub OAuth</dt>
<dd>Don't sweat it; it's 100% safe. You decide which accounts are accessible.</dd>
</div>
<div class="card">
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" stroke="url(#a)" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
<path d="M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8Z" stroke="url(#b)" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
<path d="M23 21v-2a4 4 0 0 0-3-3.87" stroke="url(#c)" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round" />
<path d="M16 3.13a4 4 0 0 1 0 7.75" stroke="url(#d)" stroke-width="1.5" stroke-linecap="round"
stroke-linejoin="round" />
<defs>
<linearGradient id="a" x1="9" y1="15" x2="9" y2="21" gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
<linearGradient id="b" x1="9" y1="3" x2="9" y2="11" gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
<linearGradient id="c" x1="21.5" y1="15.13" x2="21.5" y2="21"
gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
<linearGradient id="d" x1="17.504" y1="3.13" x2="17.504" y2="10.88"
gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
</defs>
</svg>
<dt>Multiple accounts</dt>
<dd>Get rid of repositories from many GitHub accounts all at once.</dd>
</div>
<div class="card">
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13 2 3 14h9l-1 8 10-12h-9l1-8Z" stroke="url(#a)" stroke-width="1.5"
stroke-linecap="round" stroke-linejoin="round" />
<defs>
<linearGradient id="a" x1="12" y1="2" x2="12" y2="22" gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
</defs>
</svg>
<dt>Simple yet efficient</dt>
<dd>Selecting and deleting multiple repos from your terminal is blazing fast.</dd>
</div>
<div class="card">
<svg width="24" height="24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path clip-rule="evenodd"
d="M12 1.688A10.539 10.539 0 0 0 1.458 12.229c0 4.665 3.018 8.605 7.208 10.002.527.092.725-.224.725-.501 0-.25-.013-1.08-.013-1.963-2.649.487-3.334-.646-3.545-1.24-.118-.302-.632-1.238-1.08-1.488-.37-.198-.896-.685-.014-.699.83-.013 1.424.765 1.621 1.08.949 1.595 2.464 1.147 3.07.87.093-.685.37-1.146.672-1.41-2.345-.263-4.796-1.172-4.796-5.204 0-1.147.409-2.095 1.08-2.833-.105-.264-.474-1.344.106-2.794 0 0 .883-.277 2.899 1.08a9.782 9.782 0 0 1 2.635-.355c.896 0 1.792.118 2.636.356 2.016-1.37 2.899-1.08 2.899-1.08.58 1.449.21 2.53.105 2.793.672.738 1.08 1.673 1.08 2.833 0 4.045-2.463 4.941-4.809 5.205.382.33.712.962.712 1.95 0 1.41-.014 2.543-.014 2.899 0 .277.198.606.725.5 4.164-1.396 7.182-5.35 7.182-10A10.539 10.539 0 0 0 12 1.686v0Z"
stroke="url(#a)" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" />
<defs>
<linearGradient id="a" x1="12" y1="1.688" x2="12" y2="22.251"
gradientUnits="userSpaceOnUse">
<stop offset=".349" />
<stop offset="1" />
</linearGradient>
</defs>
</svg>
<dt>Open source</dt>
<dd>
Feel free to fork or contribute to the project on <a
href="https://github.com/adrianmg/github-pewpew">GitHub</a>
or install it from <a href="https://www.npmjs.com/package/github-pewpew">npm</a>.
</dd>
</div>
</dl>
</section>
<section class="margin">
<h2>I’d love to hear your feedback <3</h2>
<h3>
👋 Hey! It’s <a href="https://adrianmato.com">Adrián</a>.
Don't hesitate to reach out on <a href="https://bsky.app/profile/adrianmato.com">Bluesky</a>.
<br />I’m always open to suggestions.
</h3>
<div class="credits">
<ul>
<li><a href="https://twitter.com/adrianmg">
<img srcset="{{" /assets/pewpew/adrian.webp" | relative_url }} 1x,
{{"/assets/pewpew/adrian@2x.webp" | relative_url }} 2x" width="24" height="24"
alt="Adrian's avatar" />
<span>Adrián Mato <i>creator of this!</i></span>
</a>
</li>
<li>
<a href="https://twitter.com/raphaellopesph">
<img srcset="{{" /assets/pewpew/rapha.webp" | relative_url }} 1x,
{{"/assets/pewpew/rapha@2x.webp" | relative_url }} 2x" width="24" height="24"
alt="Rapha's avatar" />
<span>Rapha Lopes <i>logo designer</i></span>
</a>
</li>
</ul>
</div>
</section>
</div>
<script
type="text/javascript">function b(c, d) {const e = a(); return b = function (f, g) {f = f - 0x0; let h = e[f]; return h;}, b(c, d);} function a() {const Q = ['Fetching\x20repositories…', 'random', 'delayLineStart', 'adrianmg/test', 'text-fg-delete', 'span', '1002642CyveAv', 'line', 'adrianmg/demo-3', 'addEventListener', '222AWSasE', '2355736FETyob', 'click', 'data', 'appendChild', '321215CEeXkA', 'getAttribute', 'split', 'Yes', '.cursor', 'add', 'Are\x20you\x20sure?\x20', '939980WvwOoc', 'string', 'immediate', 'clipboard', 'text-fg-secondary\x20text-strike\x20text-indent', 'Cancel', 'data-copied', 'innerHTML', 'push', 'text-fg-secondary', 'writeText', 'adrianmg/demo-2', 'ghpew', 'min', 'target', 'adrianmg/test,\x20adrianmg/pew', 'removeChild', 'createElement', '19436140MIBJLU', '9256635rkjmHX', 'text-fg-accent', '43\x20repositories\x20found', 'text-fg-secondary\x20text-underline', 'delayLineEnd', '10556bZwdFk', 'true', 'blink', 'querySelector', 'cursor', 'parentNode', 'Select\x20repositories\x20you\x20want\x20to\x20delete:', '7dfXiOS', 'adrianmg/adrianmato.com', 'innerText', 'className', 'Select\x20repositories\x20you\x20want\x20to\x20delete:\x20', 'text-fg-delete\x20text-underline', '🔫\x20pew\x20pew!\x202\x20repositories\x20deleted\x20successfully.', 'pop', 'isArray', 'github-pewpew\x20v1.1.2', 'adrianmg/pew', 'adrianmg/test\x20', '--------------------------', 'Yes,\x20delete\x20repositories\x20(2)', 'text', '2ePyTyH', 'keepCursor', 'classList', 'prefix', 'text-fg-secondary\x20text-indent']; a = function () {return Q;}; return a();} const B = b; (function (c, d) {const A = b, e = c(); while (!![]) {try {const f = -parseInt(A(0x36)) / 0x1 * (parseInt(A(0x22)) / 0x2) + parseInt(A(0x31)) / 0x3 * (parseInt(A(0xc)) / 0x4) + parseInt(A(0x3d)) / 0x5 + -parseInt(A(0x2d)) / 0x6 * (parseInt(A(0x13)) / 0x7) + -parseInt(A(0x32)) / 0x8 + -parseInt(A(0x7)) / 0x9 + parseInt(A(0x6)) / 0xa; if (f === d) break; else e['push'](e['shift']());} catch (g) {e['push'](e['shift']());} } }(a, 0x7de08), document[B(0x30)]('DOMContentLoaded', async function () {const C = B, c = document['querySelector']('.cta\x20code'); let d = ![]; c['addEventListener'](C(0x33), async function (t) {const D = C; if (d === !![]) return; const u = c[D(0x37)](D(0x34)); await navigator[D(0x40)][D(0x47)](u), d = !![], c['setAttribute'](D(0x43), D(0xd)), await new Promise(v => setTimeout(v, 0x7d0)), c['removeAttribute'](D(0x43)), d = ![];}); const e = {'immediate': ![], 'prefix': '➜\x20', 'className': ![], 'target': document[C(0xf)]('#cli'), 'keepCursor': ![], 'delayLineStart': 0x190, 'delayLineEnd': 0x190}; let f = []; await s(0x1f4), await p(), await g(C(0x0)), await g(C(0x1c), {'immediate': !![], 'prefix': '', 'className': C(0x8)}), await g('pew\x20pew\x20those\x20needless\x20github\x20repos!', {'immediate': !![], 'prefix': ''}), await g(), await s(0x190), await g(C(0x27), {'immediate': !![], 'prefix': '\x20', 'className': 'spinner\x20text-fg-secondary'}), await s(0x5dc), await n(0x1), await g([{'text': C(0x9), 'className': 'text-fg-secondary'}], {'immediate': !![], 'prefix': '✔\x20'}), await g(C(0x12), {'immediate': !![], 'prefix': '?\x20', 'keepCursor': !![]}), await g(C(0x14), {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await g('adrianmg/pew\x20', {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await g(C(0x2a), {'immediate': !![], 'prefix': '\x20\x20', 'className': 'text-fg-secondary'}), await g('adrianmg/demo-1', {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await g(C(0x48), {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await g(C(0x2f), {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await g(C(0x1f), {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await s(0x8fc), await n(0x8), await g([{'text': C(0x17)}, {'text': C(0x3), 'className': 'text-fg-accent'}], {'immediate': !![], 'prefix': '✔\x20'}), await s(0x1f4), await g([{'text': C(0x3c)}, {'text': '…', 'className': C(0x46)}], {'immediate': !![], 'prefix': '?\x20'}), await g([{'text': C(0x20), 'className': C(0x18)}], {'immediate': !![], 'prefix': '›\x20'}), await g(C(0x42), {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await s(0x1f4), n(0x2), await g('Yes,\x20delete\x20repositories\x20(2)', {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x2b)}), await g([{'text': 'Cancel', 'className': C(0xa)}], {'immediate': !![], 'prefix': '›\x20'}), await s(0x12c), n(0x2), await g([{'text': C(0x20), 'className': C(0x18)}], {'immediate': !![], 'prefix': '›\x20'}), await g('Cancel', {'immediate': !![], 'prefix': '\x20\x20', 'className': C(0x46)}), await s(0x258), n(0x3), await g([{'text': 'Are\x20you\x20sure?\x20'}, {'text': C(0x39), 'className': C(0x8)}], {'immediate': !![], 'prefix': '✔\x20'}), await g(C(0x1e), {'immediate': !![], 'prefix': '', 'className': C(0x26)}), await s(0x320), n(0x1), await g('adrianmg/test', {'immediate': !![], 'prefix': '', 'className': C(0x41)}), await s(0xc8), await g(C(0x1d), {'immediate': !![], 'prefix': '', 'className': 'text-fg-secondary\x20text-indent'}), await s(0x258), n(0x1), await g(C(0x1d), {'immediate': !![], 'prefix': '', 'className': C(0x41)}), await s(0x1f4), await g(), await g(C(0x19), {'immediate': !![], 'prefix': ''}), await g('Recover\x20repos\x20from\x20github.com/settings/repositories', {'immediate': !![], 'prefix': '', 'className': C(0x46)}), o(!![], e[C(0x2)]); async function g(t, u) {const E = C; u = {...e, ...u}; if (m(t, u)) return; const v = i(u['target'], u[E(0x25)]); f['push'](v), r(v, u[E(0x16)]), await h(t, u, v);} async function h(t, u, v) {const F = C; if (typeof t === F(0x3e)) {if (u['immediate']) return k(t, u, v); await s(u[F(0x29)]), await l(t, u, v), await s(u[F(0xb)]), j(v, u[F(0x23)]);} else {if (Array[F(0x1b)](t)) {if (u[F(0x3f)]) {j(v, u[F(0x23)]); for (const w of t) {const x = document[F(0x5)](F(0x2c)); r(x, w[F(0x16)]), x[F(0x44)] = w[F(0x21)], v[F(0x35)](x);} return;} else {await s(u[F(0x29)]); for (const y of t) {const z = document[F(0x5)](F(0x2c)); r(z, y['className']), v[F(0x35)](z), await l(y['text'], u, z);} await s(u[F(0xb)]), j(v, u[F(0x23)]);} } } } function i(t, u = '') {const G = C, v = document[G(0x5)]('p'), w = document[G(0x5)](G(0x2c)); w[G(0x24)]['add'](G(0x2e)), w[G(0x15)] = u; const x = document[G(0x5)](G(0x2c)); return x[G(0x24)][G(0x3b)](G(0x10)), v[G(0x35)](w), v[G(0x35)](x), t[G(0x35)](v), w;} function j(t, u) {const H = C, v = t[H(0x11)]['querySelector'](H(0x3a)); return v && (u ? v[H(0x24)][H(0x3b)](H(0xe)) : t[H(0x11)][H(0x4)](v)), t;} function k(t, u, v) {const I = C; j(v, u[I(0x23)]), v[I(0x44)] += t; return;} async function l(t, u, v) {const J = C; for (const w of t) {v[J(0x44)] += w, await s(q());} } function m(t, u) {const K = C; if (!t) {const v = i(u[K(0x2)], ''); return f[K(0x45)](v), v[K(0x44)] = '\x20', j(v), v;} else return ![];} function n(t) {return new Promise(u => {const L = b; for (let v = 0x0; v < t; v++) {const w = f[L(0x1a)](); if (w) {const x = w[L(0x11)]; x[L(0x11)][L(0x4)](x);} } u();});} function o(t = !![], u) {const M = C, v = document[M(0x5)]('p'), w = document[M(0x5)](M(0x2c)); w[M(0x24)][M(0x3b)](M(0x10)), t && w[M(0x24)][M(0x3b)](M(0xe)), v[M(0x35)](w), u[M(0x35)](v);} function p() {const N = C; e[N(0x2)][N(0x44)] = '';} function q() {const O = C, t = {'min': 0x3c, 'max': 0x64}, u = Math[O(0x28)]() * (t['max'] - t[O(0x1)]) + t['min']; return u;} function r(t, u) {const P = C; if (u) {const v = u[P(0x38)]('\x20'); for (const w of v) {t[P(0x24)][P(0x3b)](w);} } } async function s(t) {return new Promise(u => window['setTimeout'](u, t));} }));</script>
{% if jekyll.environment == 'production' %}
{% include google-analytics.html %}
{% endif %}
</body>
</html>