This commit is contained in:
johnathan 2025-07-21 16:23:48 +08:00
parent 280e321614
commit 1203906072
14 changed files with 63 additions and 513 deletions

View File

@ -8,7 +8,7 @@ Azon Seeker is a browser extension designed to collect and manage product inform
## Features
- 🛒 **Collect Amazon Product Data:** Easily gather product details and reviews from Amazon pages.
- 🛒 **Collect Product Data:** Easily gather product details and reviews from Amazon and other websites.
- 📦 **Import/Export:** Supports importing and exporting data in Excel format for further analysis.
- ☁️ **Cloud Export:** Export your data to the cloud for backup or sharing.
- 📊 **Data Table:** View, filter, and manage collected data in a user-friendly table.
@ -51,3 +51,23 @@ pnpm dev
1. Open the browser extension page.
2. Toggle on development mode.
3. Load the extension using the `extension/` folder.
## Build
### 1. Make Sure Setup Successfully
Following the step of setup
### 2. Build Project
```shell
pnpm run build
```
### 3. Pack Extension
```shell
pnpm run pack:7z
```
After the build is completed, the extension package will be generated in `build/extension.7z`

View File

@ -22,7 +22,6 @@
"start:firefox": "web-ext run --source-dir ./extension-firefox --target=firefox-desktop",
"clear": "rimraf --glob extension/dist extension/manifest.json extension.* ",
"clear-firefox": "rimraf --glob extension-firefox/dist extension-firefox/manifest.json extension.*",
"test": "vitest test",
"typecheck": "tsc --noEmit",
"prepare": "husky"
},
@ -61,7 +60,6 @@
"unplugin-vue-components": "^28.8.0",
"unplugin-vue-markdown": "^29.1.0",
"vite": "^7.0.4",
"vitest": "^3.2.4",
"vue": "^3.5.17",
"vue-demi": "^0.14.10",
"vue-router": "^4.5.1",

488
pnpm-lock.yaml generated
View File

@ -109,9 +109,6 @@ importers:
vite:
specifier: ^7.0.4
version: 7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0)
vitest:
specifier: ^3.2.4
version: 3.2.4(@types/node@22.16.4)(happy-dom@8.9.0)(jsdom@26.1.0)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0)
vue:
specifier: ^3.5.17
version: 3.5.17(typescript@5.8.3)
@ -1089,18 +1086,6 @@ packages:
cpu: [x64]
os: [win32]
'@types/chai@5.2.2':
resolution:
{
integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==,
}
'@types/deep-eql@4.0.2':
resolution:
{
integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==,
}
'@types/estree@1.0.8':
resolution:
{
@ -1217,56 +1202,6 @@ packages:
vite: ^5.0.0 || ^6.0.0 || ^7.0.0
vue: ^3.2.25
'@vitest/expect@3.2.4':
resolution:
{
integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==,
}
'@vitest/mocker@3.2.4':
resolution:
{
integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==,
}
peerDependencies:
msw: ^2.4.9
vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
peerDependenciesMeta:
msw:
optional: true
vite:
optional: true
'@vitest/pretty-format@3.2.4':
resolution:
{
integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==,
}
'@vitest/runner@3.2.4':
resolution:
{
integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==,
}
'@vitest/snapshot@3.2.4':
resolution:
{
integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==,
}
'@vitest/spy@3.2.4':
resolution:
{
integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==,
}
'@vitest/utils@3.2.4':
resolution:
{
integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==,
}
'@vue/babel-helper-vue-transform-on@1.4.0':
resolution:
{
@ -1588,13 +1523,6 @@ packages:
}
engines: { node: '>= 0.4' }
assertion-error@2.0.1:
resolution:
{
integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==,
}
engines: { node: '>=12' }
async-function@1.0.0:
resolution:
{
@ -1775,13 +1703,6 @@ packages:
}
engines: { node: '>=18' }
cac@6.7.14:
resolution:
{
integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==,
}
engines: { node: '>=8' }
call-bind-apply-helpers@1.0.2:
resolution:
{
@ -1823,13 +1744,6 @@ packages:
integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==,
}
chai@5.2.1:
resolution:
{
integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==,
}
engines: { node: '>=18' }
chainsaw@0.1.0:
resolution:
{
@ -1857,13 +1771,6 @@ packages:
}
engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 }
check-error@2.1.1:
resolution:
{
integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==,
}
engines: { node: '>= 16' }
cheerio-select@2.1.0:
resolution:
{
@ -2119,12 +2026,6 @@ packages:
}
engines: { node: '>= 6' }
css.escape@1.5.1:
resolution:
{
integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==,
}
cssstyle@4.6.0:
resolution:
{
@ -2246,13 +2147,6 @@ packages:
integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==,
}
deep-eql@5.0.2:
resolution:
{
integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==,
}
engines: { node: '>=6' }
deep-extend@0.6.0:
resolution:
{
@ -2457,12 +2351,6 @@ packages:
}
engines: { node: '>= 0.4' }
es-module-lexer@1.7.0:
resolution:
{
integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==,
}
es-object-atoms@1.1.1:
resolution:
{
@ -2673,13 +2561,6 @@ packages:
}
engines: { node: '>=8.3.0' }
expect-type@1.2.2:
resolution:
{
integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==,
}
engines: { node: '>=12.0.0' }
exsolve@1.0.7:
resolution:
{
@ -3046,12 +2927,6 @@ packages:
integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==,
}
happy-dom@8.9.0:
resolution:
{
integrity: sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==,
}
has-bigints@1.1.0:
resolution:
{
@ -3107,13 +2982,6 @@ packages:
}
engines: { node: '>= 0.4' }
he@1.2.0:
resolution:
{
integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==,
}
hasBin: true
highlight.js@11.11.1:
resolution:
{
@ -3943,12 +3811,6 @@ packages:
}
engines: { node: '>=18' }
loupe@3.1.4:
resolution:
{
integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==,
}
lru-cache@10.4.3:
resolution:
{
@ -4148,18 +4010,6 @@ packages:
integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==,
}
node-fetch@2.7.0:
resolution:
{
integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==,
}
engines: { node: 4.x || >=6.0.0 }
peerDependencies:
encoding: ^0.1.0
peerDependenciesMeta:
encoding:
optional: true
node-forge@1.3.1:
resolution:
{
@ -4413,13 +4263,6 @@ packages:
integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==,
}
pathval@2.0.1:
resolution:
{
integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==,
}
engines: { node: '>= 14.16' }
pend@1.2.0:
resolution:
{
@ -5193,12 +5036,6 @@ packages:
}
engines: { node: '>= 0.4' }
siginfo@2.0.0:
resolution:
{
integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==,
}
signal-exit@4.1.0:
resolution:
{
@ -5301,18 +5138,6 @@ packages:
integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==,
}
stackback@0.0.2:
resolution:
{
integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==,
}
std-env@3.9.0:
resolution:
{
integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==,
}
stop-iteration-iterator@1.1.0:
resolution:
{
@ -5549,18 +5374,6 @@ packages:
integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==,
}
tinybench@2.9.0:
resolution:
{
integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==,
}
tinyexec@0.3.2:
resolution:
{
integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==,
}
tinyexec@1.0.1:
resolution:
{
@ -5574,27 +5387,6 @@ packages:
}
engines: { node: '>=12.0.0' }
tinypool@1.1.1:
resolution:
{
integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==,
}
engines: { node: ^18.0.0 || >=20.0.0 }
tinyrainbow@2.0.0:
resolution:
{
integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==,
}
engines: { node: '>=14.0.0' }
tinyspy@4.0.3:
resolution:
{
integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==,
}
engines: { node: '>=14.0.0' }
tldts-core@6.1.86:
resolution:
{
@ -5629,12 +5421,6 @@ packages:
}
engines: { node: '>=16' }
tr46@0.0.3:
resolution:
{
integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==,
}
tr46@5.1.1:
resolution:
{
@ -5925,14 +5711,6 @@ packages:
peerDependencies:
vue: ^3.0.11
vite-node@3.2.4:
resolution:
{
integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==,
}
engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 }
hasBin: true
vite@7.0.4:
resolution:
{
@ -5976,37 +5754,6 @@ packages:
yaml:
optional: true
vitest@3.2.4:
resolution:
{
integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==,
}
engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 }
hasBin: true
peerDependencies:
'@edge-runtime/vm': '*'
'@types/debug': ^4.1.12
'@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
'@vitest/browser': 3.2.4
'@vitest/ui': 3.2.4
happy-dom: '*'
jsdom: '*'
peerDependenciesMeta:
'@edge-runtime/vm':
optional: true
'@types/debug':
optional: true
'@types/node':
optional: true
'@vitest/browser':
optional: true
'@vitest/ui':
optional: true
happy-dom:
optional: true
jsdom:
optional: true
vooks@0.2.12:
resolution:
{
@ -6090,12 +5837,6 @@ packages:
integrity: sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==,
}
webidl-conversions@3.0.1:
resolution:
{
integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==,
}
webidl-conversions@7.0.0:
resolution:
{
@ -6109,13 +5850,6 @@ packages:
integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==,
}
whatwg-encoding@2.0.0:
resolution:
{
integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==,
}
engines: { node: '>=12' }
whatwg-encoding@3.1.1:
resolution:
{
@ -6123,13 +5857,6 @@ packages:
}
engines: { node: '>=18' }
whatwg-mimetype@3.0.0:
resolution:
{
integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==,
}
engines: { node: '>=12' }
whatwg-mimetype@4.0.0:
resolution:
{
@ -6144,12 +5871,6 @@ packages:
}
engines: { node: '>=18' }
whatwg-url@5.0.0:
resolution:
{
integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==,
}
when-exit@2.1.4:
resolution:
{
@ -6212,14 +5933,6 @@ packages:
engines: { node: '>= 8' }
hasBin: true
why-is-node-running@2.3.0:
resolution:
{
integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==,
}
engines: { node: '>=8' }
hasBin: true
widest-line@5.0.0:
resolution:
{
@ -6908,12 +6621,6 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.45.1':
optional: true
'@types/chai@5.2.2':
dependencies:
'@types/deep-eql': 4.0.2
'@types/deep-eql@4.0.2': {}
'@types/estree@1.0.8': {}
'@types/fs-extra@11.0.4':
@ -6977,48 +6684,6 @@ snapshots:
vite: 7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0)
vue: 3.5.17(typescript@5.8.3)
'@vitest/expect@3.2.4':
dependencies:
'@types/chai': 5.2.2
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.2.1
tinyrainbow: 2.0.0
'@vitest/mocker@3.2.4(vite@7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.17
optionalDependencies:
vite: 7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0)
'@vitest/pretty-format@3.2.4':
dependencies:
tinyrainbow: 2.0.0
'@vitest/runner@3.2.4':
dependencies:
'@vitest/utils': 3.2.4
pathe: 2.0.3
strip-literal: 3.0.0
'@vitest/snapshot@3.2.4':
dependencies:
'@vitest/pretty-format': 3.2.4
magic-string: 0.30.17
pathe: 2.0.3
'@vitest/spy@3.2.4':
dependencies:
tinyspy: 4.0.3
'@vitest/utils@3.2.4':
dependencies:
'@vitest/pretty-format': 3.2.4
loupe: 3.1.4
tinyrainbow: 2.0.0
'@vue/babel-helper-vue-transform-on@1.4.0': {}
'@vue/babel-plugin-jsx@1.4.0(@babel/core@7.28.0)':
@ -7285,8 +6950,6 @@ snapshots:
get-intrinsic: 1.3.0
is-array-buffer: 3.0.5
assertion-error@2.0.1: {}
async-function@1.0.0: {}
async-validator@4.2.5: {}
@ -7384,8 +7047,6 @@ snapshots:
dependencies:
run-applescript: 7.0.0
cac@6.7.14: {}
call-bind-apply-helpers@1.0.2:
dependencies:
es-errors: 1.3.0
@ -7409,14 +7070,6 @@ snapshots:
caniuse-lite@1.0.30001727: {}
chai@5.2.1:
dependencies:
assertion-error: 2.0.1
check-error: 2.1.1
deep-eql: 5.0.2
loupe: 3.1.4
pathval: 2.0.1
chainsaw@0.1.0:
dependencies:
traverse: 0.3.9
@ -7434,8 +7087,6 @@ snapshots:
chalk@5.4.1: {}
check-error@2.1.1: {}
cheerio-select@2.1.0:
dependencies:
boolbase: 1.0.0
@ -7606,9 +7257,6 @@ snapshots:
css-what@6.2.2: {}
css.escape@1.5.1:
optional: true
cssstyle@4.6.0:
dependencies:
'@asamuzakjp/css-color': 3.2.0
@ -7667,8 +7315,6 @@ snapshots:
decimal.js@10.6.0: {}
deep-eql@5.0.2: {}
deep-extend@0.6.0: {}
deep-is@0.1.4: {}
@ -7823,8 +7469,6 @@ snapshots:
es-errors@1.3.0: {}
es-module-lexer@1.7.0: {}
es-object-atoms@1.1.1:
dependencies:
es-errors: 1.3.0
@ -7995,8 +7639,6 @@ snapshots:
unzipper: 0.10.14
uuid: 8.3.2
expect-type@1.2.2: {}
exsolve@1.0.7: {}
extend-shallow@2.0.1:
@ -8212,19 +7854,6 @@ snapshots:
growly@1.3.0: {}
happy-dom@8.9.0:
dependencies:
css.escape: 1.5.1
he: 1.2.0
iconv-lite: 0.6.3
node-fetch: 2.7.0
webidl-conversions: 7.0.0
whatwg-encoding: 2.0.0
whatwg-mimetype: 3.0.0
transitivePeerDependencies:
- encoding
optional: true
has-bigints@1.1.0: {}
has-flag@3.0.0: {}
@ -8249,9 +7878,6 @@ snapshots:
dependencies:
function-bind: 1.1.2
he@1.2.0:
optional: true
highlight.js@11.11.1: {}
hosted-git-info@2.8.9: {}
@ -8697,8 +8323,6 @@ snapshots:
strip-ansi: 7.1.0
wrap-ansi: 9.0.0
loupe@3.1.4: {}
lru-cache@10.4.3: {}
lru-cache@11.1.0: {}
@ -8818,11 +8442,6 @@ snapshots:
nice-try@1.0.5: {}
node-fetch@2.7.0:
dependencies:
whatwg-url: 5.0.0
optional: true
node-forge@1.3.1: {}
node-notifier@10.0.1:
@ -8980,8 +8599,6 @@ snapshots:
pathe@2.0.3: {}
pathval@2.0.1: {}
pend@1.2.0: {}
picocolors@1.1.1: {}
@ -9440,8 +9057,6 @@ snapshots:
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
siginfo@2.0.0: {}
signal-exit@4.1.0: {}
slice-ansi@5.0.0:
@ -9498,10 +9113,6 @@ snapshots:
sprintf-js@1.0.3: {}
stackback@0.0.2: {}
std-env@3.9.0: {}
stop-iteration-iterator@1.1.0:
dependencies:
es-errors: 1.3.0
@ -9642,10 +9253,6 @@ snapshots:
through@2.3.8: {}
tinybench@2.9.0: {}
tinyexec@0.3.2: {}
tinyexec@1.0.1: {}
tinyglobby@0.2.14:
@ -9653,12 +9260,6 @@ snapshots:
fdir: 6.4.6(picomatch@4.0.3)
picomatch: 4.0.3
tinypool@1.1.1: {}
tinyrainbow@2.0.0: {}
tinyspy@4.0.3: {}
tldts-core@6.1.86: {}
tldts@6.1.86:
@ -9675,9 +9276,6 @@ snapshots:
dependencies:
tldts: 6.1.86
tr46@0.0.3:
optional: true
tr46@5.1.1:
dependencies:
punycode: 2.3.1
@ -9890,27 +9488,6 @@ snapshots:
evtd: 0.2.4
vue: 3.5.17(typescript@5.8.3)
vite-node@3.2.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
cac: 6.7.14
debug: 4.4.1
es-module-lexer: 1.7.0
pathe: 2.0.3
vite: 7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0)
transitivePeerDependencies:
- '@types/node'
- jiti
- less
- lightningcss
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- yaml
vite@7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
esbuild: 0.25.6
@ -9926,49 +9503,6 @@ snapshots:
tsx: 4.20.3
yaml: 2.8.0
vitest@3.2.4(@types/node@22.16.4)(happy-dom@8.9.0)(jsdom@26.1.0)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0):
dependencies:
'@types/chai': 5.2.2
'@vitest/expect': 3.2.4
'@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
'@vitest/spy': 3.2.4
'@vitest/utils': 3.2.4
chai: 5.2.1
debug: 4.4.1
expect-type: 1.2.2
magic-string: 0.30.17
pathe: 2.0.3
picomatch: 4.0.3
std-env: 3.9.0
tinybench: 2.9.0
tinyexec: 0.3.2
tinyglobby: 0.2.14
tinypool: 1.1.1
tinyrainbow: 2.0.0
vite: 7.0.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0)
vite-node: 3.2.4(@types/node@22.16.4)(sass-embedded@1.89.2)(tsx@4.20.3)(yaml@2.8.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.16.4
happy-dom: 8.9.0
jsdom: 26.1.0
transitivePeerDependencies:
- jiti
- less
- lightningcss
- msw
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- yaml
vooks@0.2.12(vue@3.5.17(typescript@5.8.3)):
dependencies:
evtd: 0.2.4
@ -10055,25 +9589,14 @@ snapshots:
webextension-polyfill@0.12.0: {}
webidl-conversions@3.0.1:
optional: true
webidl-conversions@7.0.0: {}
webpack-virtual-modules@0.6.2: {}
whatwg-encoding@2.0.0:
dependencies:
iconv-lite: 0.6.3
optional: true
whatwg-encoding@3.1.1:
dependencies:
iconv-lite: 0.6.3
whatwg-mimetype@3.0.0:
optional: true
whatwg-mimetype@4.0.0: {}
whatwg-url@14.2.0:
@ -10081,12 +9604,6 @@ snapshots:
tr46: 5.1.1
webidl-conversions: 7.0.0
whatwg-url@5.0.0:
dependencies:
tr46: 0.0.3
webidl-conversions: 3.0.1
optional: true
when-exit@2.1.4: {}
when@3.7.7: {}
@ -10145,11 +9662,6 @@ snapshots:
dependencies:
isexe: 2.0.0
why-is-node-running@2.3.0:
dependencies:
siginfo: 2.0.0
stackback: 0.0.2
widest-line@5.0.0:
dependencies:
string-width: 7.2.0

View File

@ -27,7 +27,7 @@ const formItemRule: FormItemRule = {
trigger: ['submit', 'blur'],
message: props.validateMessage,
validator: () => {
return props.matchPattern.exec(modelValue.value) !== null;
return modelValue.value.match(props.matchPattern) !== null;
},
};
@ -81,7 +81,7 @@ defineExpose({
</script>
<template>
<div class="ids-input">
<div class="id-input">
<div class="header">
<span>
<n-button @click="fileDialog.open()" :disabled="disabled" round size="small">

View File

@ -4,7 +4,7 @@ import { uploadImage } from '~/logic/upload-image';
import { detailItems, reviewItems, searchItems } from '~/storages/amazon';
import { createGlobalState } from '@vueuse/core';
import { useAmazonService } from '~/page-worker/services/amazon';
import { LanchTaskBaseOptions, WorkerComposable } from '../interfaces/common';
import { taskOptionBase, WorkerComposable } from '../interfaces/common';
import { AmazonPageWorker } from '../interfaces/amazon';
/** Settings interface for the Amazon page worker */
@ -175,7 +175,7 @@ function buildAmazonPageWorker(): WorkerComposable<AmazonPageWorker, AmazonPageW
/**
* Task wrapper: commit changes at the end of each progress step
*/
const taskWrapper2 = <T extends (input: any, options?: LanchTaskBaseOptions) => Promise<void>>(
const taskWrapper2 = <T extends (input: any, options?: taskOptionBase) => Promise<void>>(
func: T,
) => {
clearAllCaches();

View File

@ -8,7 +8,7 @@ import {
import { isForbiddenUrl } from '~/env';
import { BaseWorker } from './base';
import { AmazonPageWorker, AmazonPageWorkerEvents } from '../interfaces/amazon';
import { LanchTaskBaseOptions } from '../interfaces/common';
import { taskOptionBase } from '../interfaces/common';
/**
* AmazonPageWorkerImpl can run on background & sidepanel & popup,
@ -230,7 +230,7 @@ class AmazonPageWorkerImpl
public async runSearchPageTask(
keywordsList: string[],
options: LanchTaskBaseOptions = {},
options: taskOptionBase = {},
): Promise<void> {
const { progress } = options;
let remains = [...keywordsList];
@ -249,7 +249,7 @@ class AmazonPageWorkerImpl
public async runDetailPageTask(
asins: string[],
options: LanchTaskBaseOptions & { aplus?: boolean; extra?: boolean } = {},
options: taskOptionBase & { aplus?: boolean; extra?: boolean } = {},
): Promise<void> {
const { progress } = options;
const remains = [...asins];
@ -267,7 +267,7 @@ class AmazonPageWorkerImpl
public async runReviewPageTask(
asins: string[],
options: LanchTaskBaseOptions & { recent?: boolean } = {},
options: taskOptionBase & { recent?: boolean } = {},
): Promise<void> {
const { progress } = options;
const remains = [...asins];

View File

@ -2,7 +2,7 @@ import { Tabs } from 'webextension-polyfill';
import { withErrorHandling } from '../utils/error-handler';
import { HomedepotDetailPageInjector } from '../web-injectors/homedepot';
import { BaseWorker } from './base';
import { LanchTaskBaseOptions } from '../interfaces/common';
import { taskOptionBase } from '../interfaces/common';
import { HomedepotEvents, HomedepotWorker } from '../interfaces/homedepot';
class HomedepotWorkerImpl
@ -62,7 +62,7 @@ class HomedepotWorkerImpl
async runDetailPageTask(
OSMIDs: string[],
options: LanchTaskBaseOptions & { review?: boolean } = {},
options: taskOptionBase & { review?: boolean } = {},
): Promise<void> {
const { progress, review } = options;
const remains = [...OSMIDs];

View File

@ -1,4 +1,4 @@
import { LanchTaskBaseOptions, Listener } from './common';
import { taskOptionBase, Listener } from './common';
export interface AmazonPageWorkerEvents {
/** The event is fired when worker collected links to items on the Amazon search page. */
@ -53,7 +53,7 @@ export interface AmazonPageWorker extends Listener<AmazonPageWorkerEvents> {
* @param keywordsList - The keywords list to search for on Amazon.
* @param options The Options Specify Behaviors.
*/
runSearchPageTask(keywordsList: string[], options?: LanchTaskBaseOptions): Promise<void>;
runSearchPageTask(keywordsList: string[], options?: taskOptionBase): Promise<void>;
/**
* Browsing item detail pages and collect target information.
@ -62,7 +62,7 @@ export interface AmazonPageWorker extends Listener<AmazonPageWorkerEvents> {
*/
runDetailPageTask(
asins: string[],
options?: LanchTaskBaseOptions & { aplus?: boolean; extra?: boolean },
options?: taskOptionBase & { aplus?: boolean; extra?: boolean },
): Promise<void>;
/**
@ -72,7 +72,7 @@ export interface AmazonPageWorker extends Listener<AmazonPageWorkerEvents> {
*/
runReviewPageTask(
asins: string[],
options?: LanchTaskBaseOptions & { recent?: boolean },
options?: taskOptionBase & { recent?: boolean },
): Promise<void>;
/**

View File

@ -2,7 +2,7 @@ import type Emittery from 'emittery';
export type Listener<T> = Pick<Emittery<T>, 'on' | 'off' | 'once'>;
export interface LanchTaskBaseOptions {
export interface taskOptionBase {
progress?: (remains: string[]) => Promise<void> | void;
}
@ -21,9 +21,9 @@ export interface LowesWorker {
readonly channel: Emittery<LowesEvents>;
/**
* Browsing goods detail page and collect target information
* Browsing item detail page and collect target information
*/
runDetailPageTask(urls: string[], options?: LanchTaskBaseOptions): Promise<void>;
runDetailPageTask(urls: string[], options?: taskOptionBase): Promise<void>;
/**
* Stop the worker.

View File

@ -1,4 +1,4 @@
import { LanchTaskBaseOptions, Listener } from './common';
import { taskOptionBase, Listener } from './common';
export interface HomedepotEvents {
/** The event is fired when detail items collect */
@ -17,7 +17,7 @@ export interface HomedepotWorker extends Listener<HomedepotEvents> {
*/
runDetailPageTask(
OSMIDs: string[],
options?: LanchTaskBaseOptions & { review?: boolean },
options?: taskOptionBase & { review?: boolean },
): Promise<void>;
/**

View File

@ -0,0 +1,20 @@
import { taskOptionBase, Listener } from './common';
export interface HomedepotEvents {
/**The event is fired when detail base info collected */
['detail-base-info-collect']: { item: LowesDetailItem };
/**The event is fired when error occur */
['error']: { message: string };
}
export interface HomedepotWorker extends Listener<HomedepotEvents> {
/**
* Browsing item detail page and collect target information
*/
runDetailPageTask(urls: string[], options: taskOptionBase): Promise<void>;
/**
* Stop the worker.
*/
stop(): Promise<void>;
}

View File

@ -113,7 +113,7 @@ const handleInterrupt = () => {
<div class="detail-page-entry">
<header-title>Amazon Detail</header-title>
<div class="interative-section">
<ids-input v-model="detailAsinInput" :disabled="worker.isRunning.value" ref="asin-input" />
<id-input v-model="detailAsinInput" :disabled="worker.isRunning.value" ref="asin-input" />
<optional-button
v-if="!worker.isRunning.value"
round

View File

@ -65,7 +65,7 @@ const handleInterrupt = () => {
<div class="review-page-entry">
<header-title>Amazon Review</header-title>
<div class="interative-section">
<ids-input v-model="reviewAsinInput" :disabled="worker.isRunning.value" ref="asin-input" />
<id-input v-model="reviewAsinInput" :disabled="worker.isRunning.value" ref="asin-input" />
<optional-button
v-if="!worker.isRunning.value"
round

View File

@ -63,7 +63,7 @@ const handleInterrupt = () => {
<div class="homedepot-sidepanel">
<header-title>Homedepot</header-title>
<div class="interative-section">
<ids-input
<id-input
v-model="detailInputText"
:disabled="worker.isRunning.value"
ref="id-input"