Skip to content

Commit 59c8989

Browse files
committed
feat: Add global debugging utilities and improve head element management
1 parent 22fe359 commit 59c8989

File tree

4 files changed

+138
-19
lines changed

4 files changed

+138
-19
lines changed

SeamlessRouter.umd.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Download the ready-to-use UMD version from the project root:
3232
<script data-keep data-skip src="SeamlessRouter.umd.min.js"></script>
3333
```
3434

35-
**File size**: ~43.4KB (minified) | ~11.8KB gzipped
35+
**File size**: ~45.8KB (minified) | ~12.3KB gzipped
3636

3737
#### Development Build
3838
```bash

src/core/AdvancedRouter.ts

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export class AdvancedRouter {
5151
}
5252
}
5353

54-
/**
54+
/**
5555
* Внедрить CSS стили для анимаций
5656
*/
5757
private injectAnimationStyles(): void {
@@ -62,6 +62,8 @@ export class AdvancedRouter {
6262

6363
const style = document.createElement('style');
6464
style.id = 'router-animation-styles';
65+
style.setAttribute('data-keep', '');
66+
style.setAttribute('data-skip', '');
6567
style.textContent = this.createAnimationStyles();
6668
document.head.appendChild(style);
6769
}
@@ -319,25 +321,55 @@ export class AdvancedRouter {
319321
private updateHead(newHead: HTMLHeadElement): void {
320322
const oldHead = document.head;
321323

322-
// Обновляем title
324+
// Собираем все элементы из нового head, которые нужно сохранить
325+
const elementsToKeep = new Set<Element>();
326+
327+
// 1. Сначала находим элементы, которые должны остаться (с data-keep или data-skip)
328+
Array.from(oldHead.children).forEach(element => {
329+
if (element.hasAttribute('data-keep') || element.hasAttribute('data-skip')) {
330+
elementsToKeep.add(element);
331+
}
332+
});
333+
334+
// 2. Удаляем все старые элементы, кроме тех что нужно сохранить
335+
Array.from(oldHead.children).forEach(element => {
336+
if (!elementsToKeep.has(element)) {
337+
oldHead.removeChild(element);
338+
}
339+
});
340+
341+
// 3. Добавляем все новые элементы, кроме тех что уже есть с data-keep/data-skip
342+
Array.from(newHead.children).forEach(newElement => {
343+
// Проверяем, есть ли уже такой элемент с data-keep/data-skip
344+
const shouldSkip = newElement.hasAttribute('data-skip');
345+
const shouldKeep = newElement.hasAttribute('data-keep');
346+
347+
if (shouldSkip) {
348+
// Элементы с data-skip не добавляем
349+
return;
350+
}
351+
352+
if (shouldKeep) {
353+
// Для элементов с data-keep проверяем, не добавлен ли уже
354+
const existingElement = oldHead.querySelector(`[data-keep][id="${newElement.id}"]`) ||
355+
oldHead.querySelector(`[data-keep][src="${newElement.getAttribute('src')}"]`);
356+
if (!existingElement) {
357+
oldHead.appendChild(newElement.cloneNode(true));
358+
}
359+
} else {
360+
// Обычные элементы добавляем всегда
361+
oldHead.appendChild(newElement.cloneNode(true));
362+
}
363+
});
364+
365+
// 4. Убедимся, что title всегда обновляется
323366
const newTitle = newHead.querySelector('title');
324367
const oldTitle = oldHead.querySelector('title');
325368
if (newTitle && oldTitle) {
326369
oldTitle.textContent = newTitle.textContent;
370+
} else if (newTitle && !oldTitle) {
371+
oldHead.appendChild(newTitle.cloneNode(true));
327372
}
328-
329-
// Обновляем meta теги
330-
const metaTagsToUpdate = ['description', 'keywords', 'viewport'];
331-
metaTagsToUpdate.forEach(name => {
332-
const newMeta = newHead.querySelector(`meta[name="${name}"]`);
333-
const oldMeta = oldHead.querySelector(`meta[name="${name}"]`);
334-
335-
if (newMeta && oldMeta) {
336-
oldMeta.setAttribute('content', newMeta.getAttribute('content') || '');
337-
} else if (newMeta && !oldMeta) {
338-
oldHead.appendChild(newMeta.cloneNode(true));
339-
}
340-
});
341373
}
342374

343375
/**

src/index.ts

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,93 @@ initGlobalSandbox();
1515
// Инициализируем роутер асинхронно
1616
router.init().then(() => {
1717
console.log('✅ AdvancedRouter fully initialized');
18+
19+
// Добавляем глобальные функции для управления из консоли
20+
if (typeof window !== 'undefined') {
21+
// Очистить весь кэш роутера
22+
(window as any).clearRouterCache = () => {
23+
router.clearCache();
24+
console.log('🧹 Router cache cleared');
25+
return 'Router cache cleared successfully';
26+
};
27+
28+
// Очистить очередь предзагрузки
29+
(window as any).clearPrefetchQueue = () => {
30+
router.clearPrefetchQueue();
31+
console.log('🧹 Prefetch queue cleared');
32+
return 'Prefetch queue cleared successfully';
33+
};
34+
35+
// Очистить историю навигации
36+
(window as any).clearNavigationHistory = () => {
37+
router.clearNavigationHistory();
38+
console.log('🧹 Navigation history cleared');
39+
return 'Navigation history cleared successfully';
40+
};
41+
42+
// Очистить кэш Service Worker
43+
(window as any).clearServiceWorkerCache = async () => {
44+
const result = await router.clearServiceWorkerCache();
45+
console.log('🧹 Service Worker cache cleared:', result);
46+
return `Service Worker cache cleared: ${result}`;
47+
};
48+
49+
// Получить статистику кэша
50+
(window as any).getCacheStats = () => {
51+
const stats = router.getCacheManager().getStats();
52+
console.log('📊 Cache stats:', stats);
53+
return stats;
54+
};
55+
56+
// Получить статистику предзагрузки
57+
(window as any).getPrefetchStats = () => {
58+
const stats = router.getPrefetchManager().getStats();
59+
console.log('📊 Prefetch stats:', stats);
60+
return stats;
61+
};
62+
63+
// Получить все URL в кэше
64+
(window as any).getCachedUrls = () => {
65+
const urls = router.getCacheManager().getUrls();
66+
console.log('📋 Cached URLs:', urls);
67+
return urls;
68+
};
69+
70+
// Очистить ВСЁ (комплексная очистка)
71+
(window as any).clearAllRouterData = async () => {
72+
console.log('🧹 Starting comprehensive router data cleanup...');
73+
74+
router.clearCache();
75+
console.log('✅ Router cache cleared');
76+
77+
router.clearPrefetchQueue();
78+
console.log('✅ Prefetch queue cleared');
79+
80+
router.clearNavigationHistory();
81+
console.log('✅ Navigation history cleared');
82+
83+
try {
84+
const swResult = await router.clearServiceWorkerCache();
85+
console.log('✅ Service Worker cache cleared:', swResult);
86+
} catch (error) {
87+
console.warn('⚠️ Could not clear Service Worker cache:', error);
88+
}
89+
90+
console.log('🎉 All router data cleared successfully');
91+
return 'All router data cleared successfully';
92+
};
93+
94+
console.log('🔧 Global router management functions added to window object');
95+
console.log('📋 Available functions:');
96+
console.log(' - clearRouterCache() - Clear router cache');
97+
console.log(' - clearPrefetchQueue() - Clear prefetch queue');
98+
console.log(' - clearNavigationHistory() - Clear navigation history');
99+
console.log(' - clearServiceWorkerCache() - Clear Service Worker cache');
100+
console.log(' - clearAllRouterData() - Clear ALL router data');
101+
console.log(' - getCacheStats() - Get cache statistics');
102+
console.log(' - getPrefetchStats() - Get prefetch statistics');
103+
console.log(' - getCachedUrls() - Get all cached URLs');
104+
}
18105
}).catch(error => {
19106
console.error('❌ Failed to initialize AdvancedRouter:', error);
20107
});

0 commit comments

Comments
 (0)