-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 84ab985
Showing
33 changed files
with
5,857 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
# Logs | ||
logs | ||
*.log | ||
npm-debug.log* | ||
yarn-debug.log* | ||
yarn-error.log* | ||
pnpm-debug.log* | ||
lerna-debug.log* | ||
|
||
node_modules | ||
.output | ||
stats.html | ||
stats-*.json | ||
.wxt | ||
web-ext.config.ts | ||
|
||
# Editor directories and files | ||
.vscode/* | ||
!.vscode/extensions.json | ||
.idea | ||
.DS_Store | ||
*.suo | ||
*.ntvs* | ||
*.njsproj | ||
*.sln | ||
*.sw? |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
{ | ||
"recommendations": ["Vue.volar"] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
# 界面 | ||
![alt text](assets/image.png) | ||
![alt text](assets/image-1.png) |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
import { defineExtensionMessaging } from '@webext-core/messaging'; | ||
import { HistoryItem, HistorySearchQuery, CleanTask } from '../types'; | ||
|
||
interface ProtocolMap { | ||
search(query: HistorySearchQuery): HistoryItem[]; | ||
delete(urls: Array<string>): void; | ||
clean(task: CleanTask): string; | ||
} | ||
|
||
export const { sendMessage, onMessage } = defineExtensionMessaging<ProtocolMap>(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
import { storage } from 'wxt/storage'; | ||
import { TimeItem, DomainItem, RegexItem, GroupItem } from '@/common/types' | ||
|
||
|
||
export const timeStorage = storage.defineItem<Array<TimeItem>>( | ||
'local:timeItems', | ||
{ | ||
version: 1, | ||
defaultValue: [ | ||
{ | ||
id: '1', | ||
name: '一年', | ||
year: 1, | ||
month: 0, | ||
day: 0, | ||
hour: 0, | ||
minute: 0, | ||
}, | ||
{ | ||
id: '2', | ||
name: '一月', | ||
year: 0, | ||
month: 1, | ||
day: 0, | ||
hour: 0, | ||
minute: 0, | ||
}, | ||
{ | ||
id: '3', | ||
name: '一周', | ||
year: 0, | ||
month: 0, | ||
day: 7, | ||
hour: 0, | ||
minute: 0, | ||
}, | ||
{ | ||
id: '4', | ||
name: '一天', | ||
year: 0, | ||
month: 0, | ||
day: 1, | ||
hour: 0, | ||
minute: 0, | ||
}, | ||
{ | ||
id: '5', | ||
name: '一小时', | ||
year: 0, | ||
month: 0, | ||
day: 0, | ||
hour: 1, | ||
minute: 0, | ||
}, | ||
{ | ||
id: '6', | ||
name: '一分钟', | ||
year: 0, | ||
month: 0, | ||
day: 0, | ||
hour: 0, | ||
minute: 1, | ||
}, | ||
], | ||
}, | ||
); | ||
|
||
|
||
export const domainStorage = storage.defineItem<DomainItem[]>( | ||
'local:domainItems', | ||
{ | ||
version: 1, | ||
defaultValue: [ | ||
{ | ||
id: '1', | ||
name: 'Test', | ||
domain: 'test.com', | ||
}, | ||
], | ||
}, | ||
); | ||
|
||
|
||
export const regexStorage = storage.defineItem<RegexItem[]>( | ||
'local:regexItems', | ||
{ | ||
version: 1, | ||
defaultValue: [ | ||
{ | ||
id: '2', | ||
name: 'Test', | ||
regex: '^test$', | ||
}, | ||
], | ||
}, | ||
); | ||
|
||
|
||
export const groupStorage = storage.defineItem<GroupItem[]>( | ||
'local:groupItems', | ||
{ | ||
version: 1, | ||
defaultValue: [ | ||
{ | ||
id: '3', | ||
name: 'Test', | ||
idList: ['1', '2'], | ||
}, | ||
], | ||
}, | ||
); | ||
|
||
|
||
export const cleanConfStorage = storage.defineItem<string>( | ||
'local:cleanConf', | ||
{ | ||
version: 1, | ||
defaultValue: '{"timeId":"","timeType":"within","filterId":[]}', | ||
}, | ||
); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import { History } from 'webextension-polyfill'; | ||
|
||
export interface HistoryItem extends History.HistoryItem {} | ||
export interface HistorySearchQuery extends History.SearchQueryType {} | ||
|
||
|
||
export interface TimeItem { | ||
id: string; | ||
name: string; | ||
year: number; | ||
month: number; | ||
day: number; | ||
hour: number; | ||
minute: number; | ||
} | ||
|
||
|
||
export interface DomainItem { | ||
id: string; | ||
name: string; | ||
domain: string; | ||
} | ||
|
||
export interface RegexItem { | ||
id: string; | ||
name: string; | ||
regex: string; | ||
} | ||
|
||
|
||
export interface GroupItem{ | ||
id: string; | ||
name: string; | ||
idList: string[]; | ||
} | ||
|
||
export type TimeType = 'within' | 'outside'; | ||
|
||
export interface CleanTask{ | ||
timeId: string; | ||
timeType: TimeType; | ||
filterId: string[]; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
<script lang="ts" setup> | ||
import { ref } from 'vue'; | ||
defineProps({ | ||
msg: String, | ||
}); | ||
const count = ref(0); | ||
</script> | ||
|
||
<template> | ||
<h1>{{ msg }}</h1> | ||
|
||
<div class="card"> | ||
<button type="button" @click="count++">count is {{ count }}</button> | ||
<p> | ||
Edit | ||
<code>components/HelloWorld.vue</code> to test HMR | ||
</p> | ||
</div> | ||
|
||
<p> | ||
Install | ||
<a href="https://github.com/vuejs/language-tools" target="_blank">Volar</a> | ||
in your IDE for a better DX | ||
</p> | ||
<p class="read-the-docs">Click on the WXT and Vue logos to learn more</p> | ||
</template> | ||
|
||
<style scoped> | ||
.read-the-docs { | ||
color: #888; | ||
} | ||
</style> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
import { onMessage } from "../common/message"; | ||
import { HistorySearchQuery, HistoryItem } from "~/common/types" | ||
import { timeStorage, domainStorage, regexStorage, groupStorage } from '@/common/storage' | ||
import * as _ from 'lodash' | ||
|
||
export default defineBackground(() => { | ||
console.log('Hello background!', { id: browser.runtime.id }); | ||
|
||
|
||
onMessage('search', async (query) => { | ||
console.log('Search:', query); | ||
const results = await browser.history.search(query.data); | ||
console.log('Results:', results); | ||
return results; | ||
}); | ||
|
||
onMessage('delete', async (urls) => { | ||
console.log('Delete:', urls); | ||
urls.data.forEach(async (url) => { | ||
await browser.history.deleteUrl({ url }); | ||
}) | ||
}) | ||
|
||
onMessage('clean', async (paylod) => { | ||
console.log(paylod.data) | ||
const task = paylod.data; | ||
const timeItems = _.values(await timeStorage.getValue()) | ||
const timeItem =_.find(timeItems, (timeItem) => { | ||
return timeItem.id == task.timeId | ||
}) | ||
if(timeItem == undefined){ | ||
return "时间范围不存在" | ||
} | ||
|
||
const offset = new Date().getTime() - timeItem.year * 365 * 24 * 60 * 60 * 1000 - timeItem.month * 30 * 24 * 60 * 60 * 1000 - timeItem.day * 24 * 60 * 60 * 1000 - timeItem.hour * 60 * 60 * 1000 - timeItem.minute * 60 * 1000 | ||
if(task.filterId.length == 0){ | ||
if(task.timeType == 'within'){ | ||
const results = await browser.history.deleteRange({ | ||
startTime: offset, | ||
endTime: new Date().getTime() | ||
}) | ||
return "删除成功" | ||
}else{ | ||
const results = await browser.history.deleteRange({ | ||
startTime: 0, | ||
endTime: offset | ||
}) | ||
return "删除成功" | ||
} | ||
} | ||
|
||
const domainItems = _.values(await domainStorage.getValue()) | ||
const regexItems = _.values(await regexStorage.getValue()) | ||
const groupItems = _.values(await groupStorage.getValue()) | ||
let filterId = _.cloneDeep(task.filterId) | ||
const groupFilter = _.filter(groupItems, (groupItem) => { | ||
return _.includes(filterId, groupItem.id) | ||
}) | ||
console.log(groupFilter) | ||
groupFilter.forEach((groupItem) => { | ||
_.values(groupItem.idList).forEach((id) => { | ||
filterId.push(id) | ||
}) | ||
}) | ||
console.log(filterId) | ||
// filter id remove duplicate | ||
filterId = _.uniq(filterId) | ||
|
||
const domainFilter = _.filter(domainItems, (domainItem) => { | ||
return _.includes(filterId, domainItem.id) | ||
}).map((domainItem) => { | ||
return domainItem.domain | ||
}) | ||
|
||
|
||
const regexFilter = _.filter(regexItems, (regexItem) => { | ||
return _.includes(filterId, regexItem.id) | ||
}).map((regexItem) => { | ||
return new RegExp(regexItem.regex) | ||
}) | ||
|
||
console.log(domainFilter) | ||
console.log(regexFilter) | ||
|
||
const results = await browser.history.search({ | ||
text: "", | ||
startTime: task.timeType == 'within' ? offset : 0, | ||
endTime: task.timeType == 'within' ? new Date().getTime() : offset, | ||
maxResults: 1000000 | ||
}); | ||
console.log('Results:', results); | ||
|
||
results.forEach(async (historyItem) => { | ||
let deleteFlag = false | ||
if(domainFilter.length > 0){ | ||
const urlObj = new URL(historyItem.url!); | ||
const urlDomain = urlObj.hostname; | ||
for(let i = 0; i < domainFilter.length; i++){ | ||
if(urlDomain.endsWith(domainFilter[i])){ | ||
deleteFlag = true | ||
break | ||
} | ||
} | ||
} | ||
if(!deleteFlag && regexFilter.length > 0){ | ||
for(let i = 0; i < regexFilter.length; i++){ | ||
if(regexFilter[i].test(historyItem.url!)){ | ||
deleteFlag = true | ||
break | ||
} | ||
} | ||
} | ||
if(deleteFlag){ | ||
await browser.history.deleteUrl({ url: historyItem.url! }); | ||
} | ||
}) | ||
|
||
|
||
return "删除成功" | ||
}) | ||
|
||
}); |
Oops, something went wrong.