experiments in a post-browser web
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat(adblocker): migrate from @cliqz/adblocker-electron to @ghostery/adblocker-electron

+245 -162
+4 -5
app/page/page.js
··· 202 202 } 203 203 }); 204 204 205 - webview.addEventListener('new-window', async (e) => { 206 - DEBUG && console.log('[page] new-window:', e.url); 207 - e.preventDefault(); 208 - await api.window.open(e.url, { role: 'child-content', width: 1024, height: 768 }); 209 - }); 205 + // NOTE: The 'new-window' webview event was removed in Electron 22. 206 + // Popups from webview guests (window.open / target="_blank") are now handled 207 + // by setWindowOpenHandler on the guest webContents, attached via 208 + // did-attach-webview in backend/electron/ipc.ts. 210 209 211 210 webview.addEventListener('did-fail-load', (e) => { 212 211 if (e.errorCode === -3) return;
+1 -1
app/settings/settings.js
··· 700 700 const attrText = document.createElement('p'); 701 701 attrText.className = 'help-text'; 702 702 attrText.innerHTML = ` 703 - Ad blocking powered by <a href="https://github.com/nickshanks/adblocker" target="_blank" style="color: var(--link-color, #88f);">@cliqz/adblocker</a> (MPL-2.0).<br> 703 + Ad blocking powered by <a href="https://github.com/ghostery/adblocker" target="_blank" style="color: var(--link-color, #88f);">@ghostery/adblocker</a> (MPL-2.0).<br> 704 704 Filter lists: <a href="https://easylist.to/" target="_blank" style="color: var(--link-color, #88f);">EasyList</a> and <a href="https://easylist.to/easylist/easyprivacy.txt" target="_blank" style="color: var(--link-color, #88f);">EasyPrivacy</a>.<br><br> 705 705 Cookie consent handling by <a href="https://github.com/cavi-au/Consent-O-Matic" target="_blank" style="color: var(--link-color, #88f);">Consent-O-Matic</a> (MIT).<br> 706 706 Developed by Janus Bager Kristensen and Rolf Bagge, <a href="https://cavi.au.dk/" target="_blank" style="color: var(--link-color, #88f);">CAVI</a> - Center for Advanced Visualization and Interaction, Aarhus University.
+2 -2
backend/electron/adblocker.ts
··· 1 1 /** 2 2 * Ad Blocker Module for Electron 3 3 * 4 - * Provides native ad blocking using @cliqz/adblocker-electron. 4 + * Provides native ad blocking using @ghostery/adblocker-electron. 5 5 * This approach avoids webRequest API conflicts with browser extensions. 6 6 * 7 7 * Features: ··· 12 12 */ 13 13 14 14 import { session, Session } from 'electron'; 15 - import { ElectronBlocker, Request } from '@cliqz/adblocker-electron'; 15 + import { ElectronBlocker, Request } from '@ghostery/adblocker-electron'; 16 16 import fetch from 'cross-fetch'; 17 17 18 18 import { getProfileSession } from './session-partition.js';
+135 -19
backend/electron/ipc.ts
··· 1998 1998 } 1999 1999 }); 2000 2000 2001 - // Track JS window.open() from web content windows 2001 + // Handle window.open() / target="_blank" from <webview> guest webContents. 2002 + // The host BrowserWindow loads peek://app/page/index.html which contains a <webview>. 2003 + // Keystrokes and window.open() calls from web content go to the guest's webContents, 2004 + // NOT the host's. We use did-attach-webview to intercept when the guest attaches 2005 + // and set up a setWindowOpenHandler that routes popups through Peek's window system 2006 + // instead of letting Electron create raw default BrowserWindows. 2002 2007 if (url.startsWith('http://') || url.startsWith('https://')) { 2003 - win.webContents.setWindowOpenHandler((details: Electron.HandlerDetails) => { 2004 - // Track the URL that JS is trying to open 2005 - try { 2006 - const popupTrack = trackWindowLoad(details.url, { 2007 - source: 'window-open', 2008 - sourceId: url, 2009 - windowType: 'main', 2010 - }); 2011 - if (popupTrack.created) { 2012 - publish('system', PubSubScopes.GLOBAL, 'item:created', { 2013 - itemId: popupTrack.itemId, 2014 - itemType: 'url', 2015 - content: details.url 2016 - }); 2008 + win.webContents.on('did-attach-webview', (_event, guestWebContents) => { 2009 + console.log(`[webview-popup] Guest webContents attached to window ${win.id}, adding setWindowOpenHandler`); 2010 + 2011 + guestWebContents.setWindowOpenHandler(({ url: popupUrl }) => { 2012 + if (popupUrl.startsWith('http://') || popupUrl.startsWith('https://')) { 2013 + console.log(`[webview-popup] Intercepted popup from window ${win.id}: ${popupUrl}`); 2014 + 2015 + // Open asynchronously — create a proper Peek page container window. 2016 + // This runs outside the synchronous handler return. 2017 + (async () => { 2018 + try { 2019 + // Track the popup URL in history 2020 + try { 2021 + const popupTrack = trackWindowLoad(popupUrl, { 2022 + source: 'window-open', 2023 + sourceId: url, 2024 + windowType: 'main', 2025 + }); 2026 + if (popupTrack.created) { 2027 + publish('system', PubSubScopes.GLOBAL, 'item:created', { 2028 + itemId: popupTrack.itemId, 2029 + itemType: 'url', 2030 + content: popupUrl 2031 + }); 2032 + } 2033 + } catch (e) { 2034 + DEBUG && console.log('Failed to track webview popup:', e); 2035 + } 2036 + 2037 + // Inherit group mode from parent window if applicable 2038 + let groupMode: { groupId: string; groupName: string; color: string } | undefined = undefined; 2039 + const parentContext = getContextEntry('mode', win.id); 2040 + if (parentContext && parentContext.value === 'group' && parentContext.metadata) { 2041 + groupMode = { 2042 + groupId: parentContext.metadata.groupId as string, 2043 + groupName: parentContext.metadata.groupName as string, 2044 + color: parentContext.metadata.color as string, 2045 + }; 2046 + } 2047 + 2048 + // Get the source address from the parent window's registration 2049 + const parentInfo = getWindowInfo(win.id); 2050 + const source = parentInfo ? parentInfo.source : 'system'; 2051 + 2052 + // Build page container URL 2053 + const parentBounds = win.getBounds(); 2054 + const pageParams = new URLSearchParams({ 2055 + url: popupUrl, 2056 + x: String(parentBounds.x + 30), 2057 + y: String(parentBounds.y + 30), 2058 + width: String(1024), 2059 + height: String(768), 2060 + }); 2061 + const loadUrl = `peek://app/page/index.html?${pageParams.toString()}`; 2062 + 2063 + // Determine IZUI session state for transient detection 2064 + const coordinator = getIzuiCoordinator(); 2065 + const isTransient = coordinator.isTransient(); 2066 + coordinator.evaluateOnShow(); 2067 + 2068 + // Use profile-specific session for isolation 2069 + const profileSession = getProfileSession(); 2070 + 2071 + // Create the new BrowserWindow (page container) 2072 + const popupWin = new BrowserWindow({ 2073 + frame: false, 2074 + width: 1024, 2075 + height: 768, 2076 + x: parentBounds.x + 30, 2077 + y: parentBounds.y + 30, 2078 + show: isHeadless() ? false : true, 2079 + transparent: true, 2080 + webPreferences: { 2081 + preload: getPreloadPath(), 2082 + session: profileSession, 2083 + webviewTag: true, 2084 + }, 2085 + }); 2086 + 2087 + // Register in window manager with proper IZUI role 2088 + const popupParams: Record<string, unknown> = { 2089 + address: popupUrl, 2090 + transient: isTransient, 2091 + parentWindowId: win.id, 2092 + role: 'child-content', 2093 + }; 2094 + if (groupMode) { 2095 + popupParams.groupMode = groupMode; 2096 + } 2097 + registerWindow(popupWin.id, source, popupParams); 2098 + coordinator.pushWindow(popupWin.id); 2099 + 2100 + // Set mode context (inherit group mode or detect from URL) 2101 + if (groupMode) { 2102 + addContextEntry('mode', 'group', { 2103 + windowId: popupWin.id, 2104 + source, 2105 + metadata: { ...groupMode, url: popupUrl, inheritedFrom: win.id }, 2106 + }); 2107 + } else { 2108 + const detectedMode = detectModeFromUrl(popupUrl); 2109 + addContextEntry('mode', detectedMode, { 2110 + windowId: popupWin.id, 2111 + source, 2112 + metadata: { url: popupUrl }, 2113 + }); 2114 + } 2115 + 2116 + // Load the page container URL 2117 + await popupWin.loadURL(loadUrl); 2118 + 2119 + // Add ESC handler (also sets up did-attach-webview for the new window) 2120 + addEscHandler(popupWin); 2121 + 2122 + // Update dock visibility 2123 + updateDockVisibility(); 2124 + 2125 + console.log(`[webview-popup] Created Peek window ${popupWin.id} for popup: ${popupUrl}`); 2126 + } catch (e) { 2127 + console.error('[webview-popup] Failed to create popup window:', e); 2128 + } 2129 + })(); 2130 + 2131 + // Deny the default BrowserWindow creation 2132 + return { action: 'deny' }; 2017 2133 } 2018 - } catch (e) { 2019 - DEBUG && console.log('Failed to track setWindowOpenHandler:', e); 2020 - } 2021 - return { action: 'allow' }; 2134 + 2135 + // Allow non-http(s) URLs (e.g. about:blank) to open normally 2136 + return { action: 'allow' }; 2137 + }); 2022 2138 }); 2023 2139 } 2024 2140
+1 -1
package.json
··· 176 176 "rss": "node scripts/changelog-to-rss.js" 177 177 }, 178 178 "dependencies": { 179 - "@cliqz/adblocker-electron": "^1.34.0", 180 179 "@codemirror/commands": "^6.10.1", 181 180 "@codemirror/lang-markdown": "^6.5.0", 182 181 "@codemirror/language": "^6.12.1", ··· 184 183 "@codemirror/state": "^6.5.4", 185 184 "@codemirror/theme-one-dark": "^6.1.3", 186 185 "@codemirror/view": "^6.39.11", 186 + "@ghostery/adblocker-electron": "^2.13.4", 187 187 "@replit/codemirror-vim": "^6.3.0", 188 188 "archiver": "^7.0.0", 189 189 "better-sqlite3": "^12.5.0",
+1 -1
preload.js
··· 839 839 // ========== Bundled Web Extensions API ========== 840 840 841 841 /** 842 - * Adblocker API - Native ad blocking powered by @cliqz/adblocker-electron 842 + * Adblocker API - Native ad blocking powered by @ghostery/adblocker-electron 843 843 */ 844 844 api.adblocker = { 845 845 /**
+101 -133
yarn.lock
··· 37 37 languageName: node 38 38 linkType: hard 39 39 40 - "@cliqz/adblocker-content@npm:^1.34.0": 41 - version: 1.34.0 42 - resolution: "@cliqz/adblocker-content@npm:1.34.0" 43 - dependencies: 44 - "@cliqz/adblocker-extended-selectors": "npm:^1.34.0" 45 - checksum: 10c0/c25a6faac69c4b2514ca0eaff8ebb4abbcbea4859cb091158206e1d8851f36ff561c398d2f543191a4c59b632554a02088033cb2b0f0e20b8beb44b242ad52df 46 - languageName: node 47 - linkType: hard 48 - 49 - "@cliqz/adblocker-electron-preload@npm:^1.34.0": 50 - version: 1.34.0 51 - resolution: "@cliqz/adblocker-electron-preload@npm:1.34.0" 52 - dependencies: 53 - "@cliqz/adblocker-content": "npm:^1.34.0" 54 - peerDependencies: 55 - electron: ">11" 56 - checksum: 10c0/5bb28ac6c079d8feb51565d9ed8cff112795b198afcc35b158bd88f69a67dfe96fc3973f6dac67624a391d84f6e8c5ace6566363f11d99ab20d9dd036052e21a 57 - languageName: node 58 - linkType: hard 59 - 60 - "@cliqz/adblocker-electron@npm:^1.34.0": 61 - version: 1.34.0 62 - resolution: "@cliqz/adblocker-electron@npm:1.34.0" 63 - dependencies: 64 - "@cliqz/adblocker": "npm:^1.34.0" 65 - "@cliqz/adblocker-electron-preload": "npm:^1.34.0" 66 - tldts-experimental: "npm:^6.0.14" 67 - peerDependencies: 68 - electron: ">11" 69 - checksum: 10c0/8179caa67a41829f55cde11104cf1a2eb8ffe6f943f695fd3da5db2e3aaa52de0fbe53ae3a64e526c4514334ffa96b14ff69d16a22148cbea1a90de4b514bcd2 70 - languageName: node 71 - linkType: hard 72 - 73 - "@cliqz/adblocker-extended-selectors@npm:^1.34.0": 74 - version: 1.34.0 75 - resolution: "@cliqz/adblocker-extended-selectors@npm:1.34.0" 76 - checksum: 10c0/bc6a45e2ff8bb698906e331004467857c467c0abd669acc827f7cae22ece4cc4403fd095003f33016fa30275e938e8eee1ad17ebbf23c92cb8a4c5a2fd6440bb 77 - languageName: node 78 - linkType: hard 79 - 80 - "@cliqz/adblocker@npm:^1.34.0": 81 - version: 1.34.0 82 - resolution: "@cliqz/adblocker@npm:1.34.0" 83 - dependencies: 84 - "@cliqz/adblocker-content": "npm:^1.34.0" 85 - "@cliqz/adblocker-extended-selectors": "npm:^1.34.0" 86 - "@remusao/guess-url-type": "npm:^1.3.0" 87 - "@remusao/small": "npm:^1.2.1" 88 - "@remusao/smaz": "npm:^1.9.1" 89 - "@types/chrome": "npm:^0.0.278" 90 - "@types/firefox-webext-browser": "npm:^120.0.0" 91 - tldts-experimental: "npm:^6.0.14" 92 - checksum: 10c0/b23288bbf89f76e515516127cf5550a6739ca7d166bbd942128e46bd46b149b6b6a41cd44fe3607e0ef4197315a30a65aab9d89c2662e25b74367131873e71e5 93 - languageName: node 94 - linkType: hard 95 - 96 40 "@codemirror/autocomplete@npm:^6.0.0, @codemirror/autocomplete@npm:^6.7.1": 97 41 version: 6.20.0 98 42 resolution: "@codemirror/autocomplete@npm:6.20.0" ··· 568 512 languageName: node 569 513 linkType: hard 570 514 515 + "@ghostery/adblocker-content@npm:^2.13.4": 516 + version: 2.13.4 517 + resolution: "@ghostery/adblocker-content@npm:2.13.4" 518 + dependencies: 519 + "@ghostery/adblocker-extended-selectors": "npm:^2.13.4" 520 + checksum: 10c0/5434cef12a8b524247c1ac90e3d84612196f6a6ed6eb0d1a065e659557cd574b59c8be8a5a8dbc3988c6adf3e54cc52cb2453db582a359d54795d15084f56ff0 521 + languageName: node 522 + linkType: hard 523 + 524 + "@ghostery/adblocker-electron-preload@npm:^2.13.4": 525 + version: 2.13.4 526 + resolution: "@ghostery/adblocker-electron-preload@npm:2.13.4" 527 + dependencies: 528 + "@ghostery/adblocker-content": "npm:^2.13.4" 529 + peerDependencies: 530 + electron: ">11" 531 + checksum: 10c0/fdbf470d84e15fd131a8a0b95346b22d90f15f498c01cfd8869f2793961de25ef910727bdc4b19a6e18b2e22ba03db020f66ad74363a022a3dfc15a8b92656e6 532 + languageName: node 533 + linkType: hard 534 + 535 + "@ghostery/adblocker-electron@npm:^2.13.4": 536 + version: 2.13.4 537 + resolution: "@ghostery/adblocker-electron@npm:2.13.4" 538 + dependencies: 539 + "@ghostery/adblocker": "npm:^2.13.4" 540 + "@ghostery/adblocker-electron-preload": "npm:^2.13.4" 541 + tldts-experimental: "npm:^7.0.18" 542 + peerDependencies: 543 + electron: ">11" 544 + checksum: 10c0/94153ac431e108b84fced5eb52b58d30d4d8f6082e13c4a921223b198abddb119dd59890412f685267659be332b51b0a9d7f195e689cbb68c4490b646d85bfe4 545 + languageName: node 546 + linkType: hard 547 + 548 + "@ghostery/adblocker-extended-selectors@npm:^2.13.4": 549 + version: 2.13.4 550 + resolution: "@ghostery/adblocker-extended-selectors@npm:2.13.4" 551 + checksum: 10c0/9670324eca5cea8a78b94131674e08c98558ce5b46d3c2439eac373123086246b5e653b1255ccc4abc3ffb48517684e182dd632380d46d84f7147e90a2b61a40 552 + languageName: node 553 + linkType: hard 554 + 555 + "@ghostery/adblocker@npm:^2.13.4": 556 + version: 2.13.4 557 + resolution: "@ghostery/adblocker@npm:2.13.4" 558 + dependencies: 559 + "@ghostery/adblocker-content": "npm:^2.13.4" 560 + "@ghostery/adblocker-extended-selectors": "npm:^2.13.4" 561 + "@ghostery/url-parser": "npm:^1.3.0" 562 + "@remusao/guess-url-type": "npm:^2.1.0" 563 + "@remusao/small": "npm:^2.1.0" 564 + "@remusao/smaz": "npm:^2.2.0" 565 + tldts-experimental: "npm:^7.0.18" 566 + checksum: 10c0/9a6514504820fc5300a7e1af5fa14711c49824f1b7ce02da56a335e878b0a424af439b3259d8882c5f093fe462187bc3499b147c321076d47eaa5e83e99ea108 567 + languageName: node 568 + linkType: hard 569 + 570 + "@ghostery/url-parser@npm:^1.3.0": 571 + version: 1.3.1 572 + resolution: "@ghostery/url-parser@npm:1.3.1" 573 + dependencies: 574 + tldts-experimental: "npm:^7.0.8" 575 + checksum: 10c0/d619560085a95f43f7d72c01ce785b4ac991f27b7b0c4a5dc118a42313d9fdbe06ddb8be408f1087a4ab9c855dac3de116ddc2dbd34c78aacc439dd233a590e2 576 + languageName: node 577 + linkType: hard 578 + 571 579 "@humanfs/core@npm:^0.19.1": 572 580 version: 0.19.1 573 581 resolution: "@humanfs/core@npm:0.19.1" ··· 873 881 languageName: node 874 882 linkType: hard 875 883 876 - "@remusao/guess-url-type@npm:^1.3.0": 877 - version: 1.3.0 878 - resolution: "@remusao/guess-url-type@npm:1.3.0" 879 - checksum: 10c0/a9d5b63ad2f5822a744c24b9fd7867ee342eb403f28330bbdcc3522762ab61b566578830e5ab8e6c5c0d183a311461b34392e7f7b5f15db0d0b75498a7b52b9c 884 + "@remusao/guess-url-type@npm:^2.1.0": 885 + version: 2.1.0 886 + resolution: "@remusao/guess-url-type@npm:2.1.0" 887 + checksum: 10c0/b33d27cb14a1354a3af5d6ac59ada8069a0e093d9617a3d3aa905619783073325245d50f2f0678803779b7501c499fe3a1118cbb23a77f7e9fe1e139c3ab6218 880 888 languageName: node 881 889 linkType: hard 882 890 883 - "@remusao/small@npm:^1.2.1": 884 - version: 1.3.0 885 - resolution: "@remusao/small@npm:1.3.0" 886 - checksum: 10c0/f537492899e5ce2012eee97f98620873d244dc8d3902921deea20c1829249ee1ba545bf0fad34004bd31988127226285e2146f0101fc0fba78baf3ded8a16ce8 891 + "@remusao/small@npm:^2.1.0": 892 + version: 2.1.0 893 + resolution: "@remusao/small@npm:2.1.0" 894 + checksum: 10c0/79e915c59f052dce7735e38d0fcd49657f40947813b0eb1984a9ca632c88fce84c2fd62e61632354a61d1898f895f5a476b7d41d39e8f773a5c11e96ec7e6098 887 895 languageName: node 888 896 linkType: hard 889 897 890 - "@remusao/smaz-compress@npm:^1.10.0": 891 - version: 1.10.0 892 - resolution: "@remusao/smaz-compress@npm:1.10.0" 898 + "@remusao/smaz-compress@npm:^2.2.0": 899 + version: 2.2.0 900 + resolution: "@remusao/smaz-compress@npm:2.2.0" 893 901 dependencies: 894 - "@remusao/trie": "npm:^1.5.0" 895 - checksum: 10c0/594a849bcb9fb99e8e0f1104ddc31588c1046d7de6888e8beb602480e8b97c71c4b19efdc93fa0aa4f4716d001c232923d288225f22e6e9df3374f59e0ee5c20 902 + "@remusao/trie": "npm:^2.1.0" 903 + checksum: 10c0/116dbc7d345cc5c3be3a238301d4352c5103050e6b49dab33cfe1125af1f095cfe16f2d4363fe37c94f7cec3e36be1ce3c64e303074dc5439ab98cf585faaa11 896 904 languageName: node 897 905 linkType: hard 898 906 899 - "@remusao/smaz-decompress@npm:^1.10.0": 900 - version: 1.10.0 901 - resolution: "@remusao/smaz-decompress@npm:1.10.0" 902 - checksum: 10c0/e9a73f772910ce46cf792d24d88ee77cdb0d9ae922c92f36b9ee2db7b89a2d8ed367f4c5141f7dbe6365baef7f7b239ed5e78e43f884e6cc268c7d6e8cb867d8 907 + "@remusao/smaz-decompress@npm:^2.2.0": 908 + version: 2.2.0 909 + resolution: "@remusao/smaz-decompress@npm:2.2.0" 910 + checksum: 10c0/b835f1f8f272fdb9ec6229adf98d50725df35fe9d7d4b155146b0139c93cf35d772cf01f4a5b27dad291971fae93831cb10fd72e2f95f0a1d6e78eae677d1569 903 911 languageName: node 904 912 linkType: hard 905 913 906 - "@remusao/smaz@npm:^1.9.1": 907 - version: 1.10.0 908 - resolution: "@remusao/smaz@npm:1.10.0" 914 + "@remusao/smaz@npm:^2.2.0": 915 + version: 2.2.0 916 + resolution: "@remusao/smaz@npm:2.2.0" 909 917 dependencies: 910 - "@remusao/smaz-compress": "npm:^1.10.0" 911 - "@remusao/smaz-decompress": "npm:^1.10.0" 912 - checksum: 10c0/eb50af2fe73da99e4ddd3cb73aed3a7e1da943dcd717a1e965076d31f4319196176c812a559ff0fd40ae51146d163dd7103d59ef418d2b4b0417b75561700d46 918 + "@remusao/smaz-compress": "npm:^2.2.0" 919 + "@remusao/smaz-decompress": "npm:^2.2.0" 920 + checksum: 10c0/d2e6424662de6128786020055789e1ee0c2eb352f2967f9bb0902f168b60c1eef40f5c76443c14ded1eff0987f14c849a6188d6d2a8e858a7e3b2004bb39fd87 913 921 languageName: node 914 922 linkType: hard 915 923 916 - "@remusao/trie@npm:^1.5.0": 917 - version: 1.5.0 918 - resolution: "@remusao/trie@npm:1.5.0" 919 - checksum: 10c0/31c584790b292c22db9a8573dbeffae65a51c3d1b669a6633c58c469a455f0d3450ea071c388ecbfbec2f96339fc2ce8f2702391df23fc72ca9860724ea32bc0 924 + "@remusao/trie@npm:^2.1.0": 925 + version: 2.1.0 926 + resolution: "@remusao/trie@npm:2.1.0" 927 + checksum: 10c0/d5dbbe5eba140713c960037e20f7f76a0409aad76537513129c8a23ae34f20382f259f261f30419ce2993eb78207518cb4f136e80f20c1d62861c318c06f8296 920 928 languageName: node 921 929 linkType: hard 922 930 ··· 986 994 languageName: node 987 995 linkType: hard 988 996 989 - "@types/chrome@npm:^0.0.278": 990 - version: 0.0.278 991 - resolution: "@types/chrome@npm:0.0.278" 992 - dependencies: 993 - "@types/filesystem": "npm:*" 994 - "@types/har-format": "npm:*" 995 - checksum: 10c0/8544ecaa52a6c1e4cb037a2abca711519ce9eff8862c487667028341b6d4843cbd7beb9adf393045feace35f3f932f0557e81561e5b74fd18a477a1219b911f0 996 - languageName: node 997 - linkType: hard 998 - 999 997 "@types/debug@npm:^4.1.6": 1000 998 version: 4.1.12 1001 999 resolution: "@types/debug@npm:4.1.12" ··· 1012 1010 languageName: node 1013 1011 linkType: hard 1014 1012 1015 - "@types/filesystem@npm:*": 1016 - version: 0.0.36 1017 - resolution: "@types/filesystem@npm:0.0.36" 1018 - dependencies: 1019 - "@types/filewriter": "npm:*" 1020 - checksum: 10c0/3ebec32f0494b0a2612187d148e9f253ff55672c53f566d9a1e6d891eb6e2372df93c252b594b2775bc53e6660c4c37fdb05dc1b26e72b60a31010da8e1f7317 1021 - languageName: node 1022 - linkType: hard 1023 - 1024 - "@types/filewriter@npm:*": 1025 - version: 0.0.33 1026 - resolution: "@types/filewriter@npm:0.0.33" 1027 - checksum: 10c0/363ef9a658a961ceae04f52934562e4ebdcdc3a2564dd8544f593d77113c16574938b6ba4fea0bee418c37bda0668c1e03dfedb6adf00d55853f51fb3a59247b 1028 - languageName: node 1029 - linkType: hard 1030 - 1031 - "@types/firefox-webext-browser@npm:^120.0.0": 1032 - version: 120.0.5 1033 - resolution: "@types/firefox-webext-browser@npm:120.0.5" 1034 - checksum: 10c0/77338ed752351f74d72142c6399e6f5bb3a34acb5d3f559c0e9179fb271272de6ce514827afe6d99c798a42109bbc64d442cf8d999cf486e668dd933722fcb73 1035 - languageName: node 1036 - linkType: hard 1037 - 1038 1013 "@types/fs-extra@npm:9.0.13, @types/fs-extra@npm:^9.0.11": 1039 1014 version: 9.0.13 1040 1015 resolution: "@types/fs-extra@npm:9.0.13" 1041 1016 dependencies: 1042 1017 "@types/node": "npm:*" 1043 1018 checksum: 10c0/576d4e9d382393316ed815c593f7f5c157408ec5e184521d077fcb15d514b5a985245f153ef52142b9b976cb9bd8f801850d51238153ebd0dc9e96b7a7548588 1044 - languageName: node 1045 - linkType: hard 1046 - 1047 - "@types/har-format@npm:*": 1048 - version: 1.2.16 1049 - resolution: "@types/har-format@npm:1.2.16" 1050 - checksum: 10c0/77e952bc219db0c1f0588cab3b95865bc343b922e8423a76fbbd6a757c40709a256933fa415eb8fefda6ea5897c8e3dd3191bb8a82b37c13d9232467d31ae485 1051 1019 languageName: node 1052 1020 linkType: hard 1053 1021 ··· 1168 1136 version: 0.0.0-use.local 1169 1137 resolution: "Peek@workspace:." 1170 1138 dependencies: 1171 - "@cliqz/adblocker-electron": "npm:^1.34.0" 1172 1139 "@codemirror/commands": "npm:^6.10.1" 1173 1140 "@codemirror/lang-markdown": "npm:^6.5.0" 1174 1141 "@codemirror/language": "npm:^6.12.1" ··· 1177 1144 "@codemirror/theme-one-dark": "npm:^6.1.3" 1178 1145 "@codemirror/view": "npm:^6.39.11" 1179 1146 "@electron/rebuild": "npm:^4.0.2" 1147 + "@ghostery/adblocker-electron": "npm:^2.13.4" 1180 1148 "@playwright/test": "npm:^1.57.0" 1181 1149 "@replit/codemirror-vim": "npm:^6.3.0" 1182 1150 "@types/archiver": "npm:^6.0.0" ··· 6256 6224 languageName: node 6257 6225 linkType: hard 6258 6226 6259 - "tldts-core@npm:^6.1.86": 6260 - version: 6.1.86 6261 - resolution: "tldts-core@npm:6.1.86" 6262 - checksum: 10c0/8133c29375f3f99f88fce5f4d62f6ecb9532b106f31e5423b27c1eb1b6e711bd41875184a456819ceaed5c8b94f43911b1ad57e25c6eb86e1fc201228ff7e2af 6227 + "tldts-core@npm:^7.0.23": 6228 + version: 7.0.23 6229 + resolution: "tldts-core@npm:7.0.23" 6230 + checksum: 10c0/b3d936a75b5f65614c356a58ef37563681c6224187dcce9f57aac76d92aae83b1a6fe6ab910f77472b35456bc145a8441cb3e572b4850be43cb4f3465e0610ec 6263 6231 languageName: node 6264 6232 linkType: hard 6265 6233 6266 - "tldts-experimental@npm:^6.0.14": 6267 - version: 6.1.86 6268 - resolution: "tldts-experimental@npm:6.1.86" 6234 + "tldts-experimental@npm:^7.0.18, tldts-experimental@npm:^7.0.8": 6235 + version: 7.0.23 6236 + resolution: "tldts-experimental@npm:7.0.23" 6269 6237 dependencies: 6270 - tldts-core: "npm:^6.1.86" 6271 - checksum: 10c0/5004191612b6ab66da72a7115f56ce4bf3633ff1321ed9cafd5ee836531153ddae60fc8a7880ff01c1a871b5771e328c096c0c17cf71fdbfb24cbb668855fcb7 6238 + tldts-core: "npm:^7.0.23" 6239 + checksum: 10c0/57ebe153ff3cbea273987fe439feff4485ff5006ca7e483099fd86068a7c98b5d3d0577b0fb899cb96aeedff48fed8be058471c2737e52a73f4085278ebd9722 6272 6240 languageName: node 6273 6241 linkType: hard 6274 6242