Skip to content

Commit

Permalink
feat: init
Browse files Browse the repository at this point in the history
  • Loading branch information
snowraincloud committed Aug 26, 2024
0 parents commit 84ab985
Show file tree
Hide file tree
Showing 33 changed files with 5,857 additions and 0 deletions.
26 changes: 26 additions & 0 deletions .gitignore
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?
3 changes: 3 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}
3 changes: 3 additions & 0 deletions README.md
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.
Binary file added 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.
Binary file added assets/image.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/vue.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions common/message/index.ts
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>();
120 changes: 120 additions & 0 deletions common/storage/index.ts
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":[]}',
},
);
43 changes: 43 additions & 0 deletions common/types/index.ts
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[];
}
34 changes: 34 additions & 0 deletions components/HelloWorld.vue
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>
122 changes: 122 additions & 0 deletions entrypoints/background.ts
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 "删除成功"
})

});
Loading

0 comments on commit 84ab985

Please sign in to comment.