WebToPromt & RepoToPromt (gitreverse)
JavaScriptPublicby zx-apiAug 15, 2026, 04:42 PMExpires: Never192 views
1/**
2 * Name: gitreverse-scraper.js
3 * Deskripsi: Scraper untuk mendapatkan prompt AI create website/repo dari GitReverse
4 *
5 * Sumber: https://whatsapp.com/channel/0029VbDLqe7EquiSF4STU13o/299
6 * Credt By Zx
7**/
8function extractSlug(url) {
9 try {
10 const { hostname, pathname } = new URL(url);
11 const cleanPath = pathname.replace(/\/+$/, ''); // buang trailing slash
12 const slug = (hostname + cleanPath)
13 .replace(/^www\./, '')
14 .replace(/[^a-zA-Z0-9]/g, '-')
15 .replace(/-+/g, '-')
16 .replace(/^-|-$/g, '')
17 .toLowerCase();
18 return slug;
19 } catch {
20 throw new Error(`URL tidak valid: ${url}`);
21 }
22}
23
24async function webtopromt(targetUrl) {
25 const siteSlug = extractSlug(targetUrl);
26
27 const res = await fetch(`https://www.gitreverse.com/api/reverse-website`, {
28 method: 'POST',
29 headers: { 'Content-Type': 'application/json' },
30 body: JSON.stringify({ siteSlug, targetUrl, stream: true }),
31 });
32
33 if (!res.ok) {
34 throw new Error(`HTTP ${res.status}: ${res.statusText}`);
35 }
36
37 const text = await res.text();
38
39 const dataLines = text
40 .split('\n')
41 .filter(line => line.startsWith('data: '))
42 .map(line => line.slice(6)); // buang prefix "data: "
43
44 for (const dataStr of dataLines) {
45 try {
46 const data = JSON.parse(dataStr);
47 if (data.prompt) {
48 return {
49 prompt: data.prompt,
50 designPath: data.designPath || null,
51 fromCache: data.fromCache ?? false,
52 };
53 }
54 } catch {
55 }
56 }
57
58 throw new Error('Tidak ditemukan prompt dalam response SSE');
59}
60
61async function repotopromt(repoUrl) {
62 // Terima format "owner/repo" atau full URL GitHub
63 let cleanRepo = repoUrl
64 .replace(/^https?:\/\/(www\.)?github\.com\//, '')
65 .replace(/\/+$/, '');
66
67 console.log(`๐ Scraping repo prompt...`);
68 console.log(` Repo: ${cleanRepo}`);
69
70 const res = await fetch(`https://www.gitreverse.com/api/reverse-prompt`, {
71 method: 'POST',
72 headers: { 'Content-Type': 'application/json' },
73 body: JSON.stringify({ repoUrl: cleanRepo }),
74 });
75
76 if (!res.ok) {
77 throw new Error(`HTTP ${res.status}: ${res.statusText}`);
78 }
79
80 const data = await res.json();
81 if (!data.prompt) {
82 throw new Error('Tidak ditemukan prompt dalam response');
83 }
84
85 return { prompt: data.prompt };
86}
87
88/**
89async function main() {
90 const args = process.argv.slice(2);
91
92 if (args.length === 0) {
93 console.log(`
94โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
95โ GitReverse - AI Prompt Generator โ
96โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฃ
97โ โ
98โ Usage: โ
99โ node gitreverse-scraper.js <url-or-repo> โ
100โ node gitreverse-scraper.js --website <url> โ
101โ node gitreverse-scraper.js --repo <owner/repo> โ
102โ node gitreverse-scraper.js --json <url-or-repo> โ
103โ โ
104โ Examples: โ
105โ node gitreverse-scraper.js https://pastebin.com/ โ
106โ node gitreverse-scraper.js --repo shahednur/RideZen โ
107โ node gitreverse-scraper.js --json https://linear.app โ
108โ โ
109โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
110`);
111 process.exit(0);
112 }
113
114 let mode = 'auto'; // auto | website | repo
115 let outputJson = false;
116 let target = null;
117
118 for (let i = 0; i < args.length; i++) {
119 if (args[i] === '--website') mode = 'website';
120 else if (args[i] === '--repo') mode = 'repo';
121 else if (args[i] === '--json') outputJson = true;
122 else target = args[i];
123 }
124
125 if (!target) {
126 console.error('โ Error: URL atau repo tidak diberikan.');
127 process.exit(1);
128 }
129
130 try {
131 let result;
132
133 if (
134 mode === 'repo' ||
135 (mode === 'auto' && (
136 target.includes('github.com') ||
137 /^[a-zA-Z0-9_-]+\/[a-zA-Z0-9_.-]+$/.test(target)
138 ))
139 ) {
140 result = await repotopromt(target);
141 } else {
142 if (!/^https?:\/\//.test(target)) {
143 target = 'https://' + target;
144 }
145 result = await webtopromt(target);
146 }
147
148 if (outputJson) {
149 console.log(JSON.stringify(result, null, 2));
150 } else {
151 console.log('\nโ
PROMPT AI:\n');
152 console.log('โ'.repeat(60));
153 console.log(result.prompt);
154 console.log('โ'.repeat(60));
155 if (result.designPath) {
156 console.log(`\n๐จ Design System: https://www.gitreverse.com${result.designPath}`);
157 }
158 if (result.fromCache) {
159 console.log('๐ฆ (dari cache)');
160 }
161 }
162 } catch (err) {
163 console.error(`\nโ Error: ${err.message}`);
164 process.exit(1);
165 }
166}
167
168module.exports = { webtopromt, repotopromt, extractSlug };
169
170if (require.main === module) {
171 main();
172}
173*/173 linesยท4,886 charsยท5.2 KB
WwrapยทFfullscreen