WebToPromt & RepoToPromt (gitreverse)

JavaScriptPublic
by zx-apiAug 15, 2026, 04:42 PMExpires: Never192 views
WebToPromt & RepoToPromt (gitreverse)
Raw
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