wormclaude 1.0.235 → 1.0.237

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.
@@ -4,7 +4,7 @@
4
4
  // puppeteer-core kullanır (Chromium İNDİRMEZ) → sistemde kurulu Chrome/Edge'i çalıştırır.
5
5
  import fs from 'node:fs';
6
6
  import path from 'node:path';
7
- import { pageFile, assetFile, relHref, ASSET_EXT, PAGE_EXT } from './clone.js';
7
+ import { pageFile, assetFile, relHref, mirrorRootAssets, ASSET_EXT, PAGE_EXT } from './clone.js';
8
8
  // Sistemde kurulu Chrome/Edge'i bul (puppeteer kendi Chromium'unu indirmesin)
9
9
  export function findChrome() {
10
10
  const win = [
@@ -168,7 +168,23 @@ export async function cloneSiteRendered(startUrl, outDir, opts = {}) {
168
168
  continue;
169
169
  }
170
170
  const bare = abs.href.replace(/#.*$/, '');
171
- const local = assetMap.get(bare) || pageMap.get(bare);
171
+ let local = assetMap.get(bare) || pageMap.get(bare);
172
+ // HTML'de referans EDİLEN ama network'te yakalanmayan same-origin asset'leri açıkça indir.
173
+ // (Örn. polyfills `nomodule` script'ini modern headless Chrome yüklemez → yakalanmaz → 404.)
174
+ if (!local && abs.host === host && (ASSET_EXT.test(abs.pathname) || abs.pathname.includes('/_next/'))) {
175
+ try {
176
+ const resp = await fetch(bare);
177
+ if (resp.ok) {
178
+ const buf = Buffer.from(await resp.arrayBuffer());
179
+ const dest = assetFile(abs, assetsDir);
180
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
181
+ fs.writeFileSync(dest, buf);
182
+ assetMap.set(bare, dest);
183
+ local = dest;
184
+ }
185
+ }
186
+ catch { /* yoksay */ }
187
+ }
172
188
  if (local) {
173
189
  const rel = relHref(pg.file, local);
174
190
  html = html.split(`"${ref}"`).join(`"${rel}"`).split(`'${ref}'`).join(`'${rel}'`);
@@ -177,5 +193,6 @@ export async function cloneSiteRendered(startUrl, outDir, opts = {}) {
177
193
  fs.mkdirSync(path.dirname(pg.file), { recursive: true });
178
194
  fs.writeFileSync(pg.file, html);
179
195
  }
196
+ mirrorRootAssets(root); // /_next/ vb. kök-mutlak yollar statik sunucuda çözülsün (SPA çalışsın)
180
197
  return { pages: rendered.length, assets: assetMap.size, outDir: root, pageFiles: rendered.map((p) => p.file), errors: errors.slice(0, 30) };
181
198
  }
package/dist/clone.js CHANGED
@@ -31,6 +31,34 @@ export function assetFile(u, assetsDir) {
31
31
  rel += '.bin';
32
32
  return path.join(assetsDir, rel);
33
33
  }
34
+ // Next.js/Nuxt/Vite/Astro SPA'ların JS RUNTIME'ı chunk'ları /_next/ gibi KÖK-MUTLAK yoldan yükler;
35
+ // statik HTML rewrite bunu düzeltemez (yol JS'in içinde). Kök-mutlak asset dizinlerini _assets/<host>/'tan
36
+ // klon KÖKÜNE aynala → statik sunucuda /_next/... kökten çözülür, SPA çalışır (yoksa "client-side exception").
37
+ export function mirrorRootAssets(root) {
38
+ const assetsDir = path.join(root, '_assets');
39
+ let hostDirs = [];
40
+ try {
41
+ hostDirs = fs.readdirSync(assetsDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
42
+ }
43
+ catch {
44
+ return;
45
+ }
46
+ for (const dir of ['_next', '_nuxt', '_astro', 'assets']) {
47
+ const dst = path.join(root, dir);
48
+ if (fs.existsSync(dst))
49
+ continue;
50
+ for (const h of hostDirs) {
51
+ const src = path.join(assetsDir, h, dir);
52
+ try {
53
+ if (fs.existsSync(src) && fs.statSync(src).isDirectory()) {
54
+ fs.cpSync(src, dst, { recursive: true });
55
+ break;
56
+ }
57
+ }
58
+ catch { }
59
+ }
60
+ }
61
+ }
34
62
  export function relHref(fromFile, toFile) {
35
63
  let r = path.relative(path.dirname(fromFile), toFile).replace(/\\/g, '/');
36
64
  if (!r.startsWith('.'))
@@ -184,5 +212,6 @@ export async function cloneSite(startUrl, outDir, opts = {}) {
184
212
  fs.mkdirSync(path.dirname(pg.file), { recursive: true });
185
213
  fs.writeFileSync(pg.file, html);
186
214
  }
215
+ mirrorRootAssets(root); // /_next/ vb. kök-mutlak yollar statik sunucuda çözülsün (SPA çalışsın)
187
216
  return { pages: rawPages.length, assets: [...assetCache.values()].filter(Boolean).length, outDir: root, pageFiles: rawPages.map((p) => p.file), errors: errors.slice(0, 30) };
188
217
  }
package/dist/theme.js CHANGED
@@ -16,4 +16,4 @@ export const theme = {
16
16
  synType: '#a78bfa', // tip/sınıf adları, sabitler
17
17
  synProp: '#e0e0e0', // özellik/anahtar adları
18
18
  };
19
- export const VERSION = '1.0.235';
19
+ export const VERSION = '1.0.237';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wormclaude",
3
- "version": "1.0.235",
3
+ "version": "1.0.237",
4
4
  "description": "WormClaude CLI - uncensored security+code assistant (ink TUI, Claude-style)",
5
5
  "type": "module",
6
6
  "bin": {