Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
7a2300b
chore: upgrade all deps to latest and migrate deprecated packages
mortezaPRK Jul 4, 2026
60c1ff2
fix: i18n missing keys, Node 18 tsconfig ref, replace set_node_mem.sh…
mortezaPRK Jul 4, 2026
3e681d5
chore: revert linter-only formatting changes from upgraded @antfu/esl…
mortezaPRK Jul 5, 2026
ba8398d
chore: revert linter-only import reordering in certificate-key-parser…
mortezaPRK Jul 5, 2026
bb25069
chore: revert more linter-only formatting changes
mortezaPRK Jul 5, 2026
6f7d383
chore: revert linter-only formatting in roboto-base64.d.ts (indent + …
mortezaPRK Jul 5, 2026
7afa487
fix(tsconfig): expand root tsconfig for Vite 8 OXC tsconfig resolver
mortezaPRK Jul 6, 2026
18af9c5
chore: fix lint and build after deps upgrade
mortezaPRK Jul 6, 2026
efa9a04
restore: revert incorrectly-reverted source files to upstream state
mortezaPRK Jul 6, 2026
ce9c4ae
fix(typecheck): fix vue-tsc --noEmit errors for all non-crypto tools
mortezaPRK Jul 6, 2026
01f0329
READY
mortezaPRK Jul 6, 2026
0c71605
revert added default
mortezaPRK Jul 6, 2026
a585a09
make sure null won't break progress for hf
mortezaPRK Jul 6, 2026
537f6c2
reslve ambigious default import for affected packages (used publint to
mortezaPRK Jul 6, 2026
714e341
fix background removal from hf
mortezaPRK Jul 6, 2026
8cbab25
remove unneeded type
mortezaPRK Jul 6, 2026
39d2496
comment on treeshake config
mortezaPRK Jul 6, 2026
74e954b
merge: integrate sharevb #418 toolchain upgrade into PR #415
mortezaPRK Jul 6, 2026
f68db9f
fix(typecheck): fix post-merge type errors
mortezaPRK Jul 6, 2026
cbd012b
chore: remove esm-potrace-wasm patch (no longer needed in v0.5.0)
mortezaPRK Jul 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions auto-imports.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -319,10 +319,12 @@ declare module 'vue' {
readonly controlledComputed: UnwrapRef<typeof import('@vueuse/core')['controlledComputed']>
readonly controlledRef: UnwrapRef<typeof import('@vueuse/core')['controlledRef']>
readonly createApp: UnwrapRef<typeof import('vue')['createApp']>
readonly createDisposableDirective: UnwrapRef<typeof import('@vueuse/core')['createDisposableDirective']>
readonly createEventHook: UnwrapRef<typeof import('@vueuse/core')['createEventHook']>
readonly createGlobalState: UnwrapRef<typeof import('@vueuse/core')['createGlobalState']>
readonly createInjectionState: UnwrapRef<typeof import('@vueuse/core')['createInjectionState']>
readonly createReactiveFn: UnwrapRef<typeof import('@vueuse/core')['createReactiveFn']>
readonly createRef: UnwrapRef<typeof import('@vueuse/core')['createRef']>
readonly createReusableTemplate: UnwrapRef<typeof import('@vueuse/core')['createReusableTemplate']>
readonly createSharedComposable: UnwrapRef<typeof import('@vueuse/core')['createSharedComposable']>
readonly createTemplatePromise: UnwrapRef<typeof import('@vueuse/core')['createTemplatePromise']>
Expand Down Expand Up @@ -359,6 +361,7 @@ declare module 'vue' {
readonly onBeforeUpdate: UnwrapRef<typeof import('vue')['onBeforeUpdate']>
readonly onClickOutside: UnwrapRef<typeof import('@vueuse/core')['onClickOutside']>
readonly onDeactivated: UnwrapRef<typeof import('vue')['onDeactivated']>
readonly onElementRemoval: UnwrapRef<typeof import('@vueuse/core')['onElementRemoval']>
readonly onErrorCaptured: UnwrapRef<typeof import('vue')['onErrorCaptured']>
readonly onKeyStroke: UnwrapRef<typeof import('@vueuse/core')['onKeyStroke']>
readonly onLongPress: UnwrapRef<typeof import('@vueuse/core')['onLongPress']>
Expand All @@ -385,11 +388,10 @@ declare module 'vue' {
readonly refAutoReset: UnwrapRef<typeof import('@vueuse/core')['refAutoReset']>
readonly refDebounced: UnwrapRef<typeof import('@vueuse/core')['refDebounced']>
readonly refDefault: UnwrapRef<typeof import('@vueuse/core')['refDefault']>
readonly refManualReset: UnwrapRef<typeof import('@vueuse/core')['refManualReset']>
readonly refThrottled: UnwrapRef<typeof import('@vueuse/core')['refThrottled']>
readonly refWithControl: UnwrapRef<typeof import('@vueuse/core')['refWithControl']>
readonly resolveComponent: UnwrapRef<typeof import('vue')['resolveComponent']>
readonly resolveRef: UnwrapRef<typeof import('@vueuse/core')['resolveRef']>
readonly resolveUnref: UnwrapRef<typeof import('@vueuse/core')['resolveUnref']>
readonly shallowReactive: UnwrapRef<typeof import('vue')['shallowReactive']>
readonly shallowReadonly: UnwrapRef<typeof import('vue')['shallowReadonly']>
readonly shallowRef: UnwrapRef<typeof import('vue')['shallowRef']>
Expand Down Expand Up @@ -441,8 +443,10 @@ declare module 'vue' {
readonly useCloned: UnwrapRef<typeof import('@vueuse/core')['useCloned']>
readonly useColorMode: UnwrapRef<typeof import('@vueuse/core')['useColorMode']>
readonly useConfirmDialog: UnwrapRef<typeof import('@vueuse/core')['useConfirmDialog']>
readonly useCountdown: UnwrapRef<typeof import('@vueuse/core')['useCountdown']>
readonly useCounter: UnwrapRef<typeof import('@vueuse/core')['useCounter']>
readonly useCssModule: UnwrapRef<typeof import('vue')['useCssModule']>
readonly useCssSupports: UnwrapRef<typeof import('@vueuse/core')['useCssSupports']>
readonly useCssVar: UnwrapRef<typeof import('@vueuse/core')['useCssVar']>
readonly useCssVars: UnwrapRef<typeof import('vue')['useCssVars']>
readonly useCurrentElement: UnwrapRef<typeof import('@vueuse/core')['useCurrentElement']>
Expand Down Expand Up @@ -526,12 +530,14 @@ declare module 'vue' {
readonly usePreferredDark: UnwrapRef<typeof import('@vueuse/core')['usePreferredDark']>
readonly usePreferredLanguages: UnwrapRef<typeof import('@vueuse/core')['usePreferredLanguages']>
readonly usePreferredReducedMotion: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedMotion']>
readonly usePreferredReducedTransparency: UnwrapRef<typeof import('@vueuse/core')['usePreferredReducedTransparency']>
readonly usePrevious: UnwrapRef<typeof import('@vueuse/core')['usePrevious']>
readonly useRafFn: UnwrapRef<typeof import('@vueuse/core')['useRafFn']>
readonly useRefHistory: UnwrapRef<typeof import('@vueuse/core')['useRefHistory']>
readonly useResizeObserver: UnwrapRef<typeof import('@vueuse/core')['useResizeObserver']>
readonly useRoute: UnwrapRef<typeof import('vue-router')['useRoute']>
readonly useRouter: UnwrapRef<typeof import('vue-router')['useRouter']>
readonly useSSRWidth: UnwrapRef<typeof import('@vueuse/core')['useSSRWidth']>
readonly useScreenOrientation: UnwrapRef<typeof import('@vueuse/core')['useScreenOrientation']>
readonly useScreenSafeArea: UnwrapRef<typeof import('@vueuse/core')['useScreenSafeArea']>
readonly useScriptTag: UnwrapRef<typeof import('@vueuse/core')['useScriptTag']>
Expand All @@ -558,6 +564,7 @@ declare module 'vue' {
readonly useThrottleFn: UnwrapRef<typeof import('@vueuse/core')['useThrottleFn']>
readonly useThrottledRefHistory: UnwrapRef<typeof import('@vueuse/core')['useThrottledRefHistory']>
readonly useTimeAgo: UnwrapRef<typeof import('@vueuse/core')['useTimeAgo']>
readonly useTimeAgoIntl: UnwrapRef<typeof import('@vueuse/core')['useTimeAgoIntl']>
readonly useTimeout: UnwrapRef<typeof import('@vueuse/core')['useTimeout']>
readonly useTimeoutFn: UnwrapRef<typeof import('@vueuse/core')['useTimeoutFn']>
readonly useTimeoutPoll: UnwrapRef<typeof import('@vueuse/core')['useTimeoutPoll']>
Expand Down
1 change: 1 addition & 0 deletions env.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/// <reference types="vite/client" />
/// <reference types="vite-svg-loader" />
/// <reference types="vite-plugin-pwa/client" />

interface ImportMetaEnv {
VITE_PLAUSIBLE_API_HOST: string;
Expand Down
155 changes: 155 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
import antfu from '@antfu/eslint-config';
import tsPlugin from '@typescript-eslint/eslint-plugin';
import autoImportGlobals from './.eslintrc-auto-import.json' with { type: 'json' };

const antfuConfig = antfu(
{
unocss: true,
vue: true,
typescript: true,
markdown: false,
ignores: ['src/libs/*', 'components.d.ts'],
},
{
linterOptions: {
// TODO: re-enable when all eslint-disable comments updated to new rule names
reportUnusedDisableDirectives: 'off',
},
languageOptions: {
globals: Object.fromEntries(
Object.keys(autoImportGlobals.globals).map(k => [k, 'readonly']),
),
},
rules: {
'curly': ['error', 'all'],
'style/semi': ['error', 'always'],
'no-use-before-define': 'off',
'@typescript-eslint/no-use-before-define': ['error', { allowNamedExports: true, functions: false }],
'vue/no-empty-component-block': ['error'],
'import/order': 'off',
// TODO: enable import/export sorting and formatting gradually in a dedicated PR
'perfectionist/sort-imports': 'off',
'perfectionist/sort-named-imports': 'off',
'perfectionist/sort-named-exports': 'off',
'import/consistent-type-specifier-style': 'off',
'antfu/consistent-list-newline': 'off',
'style/indent-binary-ops': 'off',
'style/member-delimiter-style': 'off',
'no-restricted-imports': ['error', {
paths: [{
name: '@vueuse/core',
importNames: ['useClipboard'],
message: 'Please use local useCopy from src/composable/copy.ts instead of useClipboard.',
}],
}],
// TODO: gradually enable these rules in follow-up PRs once existing
// violations are fixed — they were newly introduced by @antfu/eslint-config v9
'regexp/no-unused-capturing-group': 'off',
'regexp/no-super-linear-backtracking': 'off',
'regexp/no-misleading-capturing-group': 'off',
'regexp/optimal-quantifier-concatenation': 'off',
'regexp/no-useless-assertions': 'off',
'regexp/no-potentially-useless-backreference': 'off',
'regexp/no-obscure-range': 'off',
'regexp/strict': 'off',
'regexp/no-useless-flag': 'off',
'regexp/no-empty-lookarounds-assertion': 'off',
'regexp/no-empty-group': 'off',
'regexp/no-empty-alternative': 'off',
'regexp/negation': 'off',
'regexp/no-dupe-characters-character-class': 'off',
'regexp/no-trivially-nested-quantifier': 'off',
'regexp/no-useless-character-class': 'off',
'regexp/no-useless-escape': 'off',
'regexp/no-useless-lazy': 'off',
'regexp/no-useless-non-capturing-group': 'off',
'regexp/prefer-character-class': 'off',
'regexp/prefer-d': 'off',
'regexp/prefer-range': 'off',
'regexp/prefer-w': 'off',
'regexp/sort-flags': 'off',
'regexp/use-ignore-case': 'off',
'unicorn/prefer-dom-node-text-content': 'off',
'unicorn/new-for-builtins': 'off',
'antfu/no-top-level-await': 'off',
'node/prefer-global/buffer': 'off',
'ts/method-signature-style': 'off',
'ts/no-unused-expressions': 'off',
'ts/no-namespace': 'off',
'ts/ban-ts-comment': 'off',
'jsonc/no-dupe-keys': 'off',
'vue/no-required-prop-with-default': 'off',
'vue/no-side-effects-in-computed-properties': 'off',
'vue/return-in-computed-property': 'off',
'@typescript-eslint/naming-convention': 'off',
'@typescript-eslint/prefer-ts-expect-error': 'off',
'@typescript-eslint/no-namespace': 'off',
'test/no-identical-title': 'off',
'test/consistent-test-it': 'off',
'test/prefer-lowercase-title': 'off',
'no-irregular-whitespace': 'off',
'style/max-statements-per-line': 'off',
'style/no-trailing-spaces': 'off',
'style/type-annotation-spacing': 'off',
'style/indent': 'off',
'style/no-tabs': 'off',
'style/eol-last': 'off',
'style/quotes': 'off',
'style/comma-dangle': 'off',
'style/comma-spacing': 'off',
'style/key-spacing': 'off',
'style/object-curly-spacing': 'off',
'style/space-before-blocks': 'off',
'style/space-before-function-paren': 'off',
'style/no-extra-parens': 'off',
'style/no-multi-spaces': 'off',
'style/operator-linebreak': 'off',
'style/quote-props': 'off',
'style/semi-spacing': 'off',
'style/generator-star-spacing': 'off',
'style/jsx-curly-brace-presence': 'off',
'style/jsx-one-expression-per-line': 'off',
'style/type-generic-spacing': 'off',
'jsonc/indent': 'off',
'jsonc/object-curly-newline': 'off',
'jsonc/object-curly-spacing': 'off',
'ts/consistent-type-definitions': 'off',
'ts/no-import-type-side-effects': 'off',
'ts/no-wrapper-object-types': 'off',
'ts/prefer-namespace-keyword': 'off',
'e18e/prefer-array-some': 'off',
'e18e/prefer-date-now': 'off',
'e18e/prefer-nullish-coalescing': 'off',
'e18e/prefer-object-has-own': 'off',
'e18e/prefer-regex-test': 'off',
'antfu/consistent-chaining': 'off',
'import/newline-after-import': 'off',
'vue/no-ref-as-operand': 'off',
'unused-imports/no-unused-vars': ['warn', {
vars: 'all',
varsIgnorePattern: '^_',
args: 'after-used',
argsIgnorePattern: '^_',
caughtErrors: 'none',
}],
},
},
{
// Shim .d.ts files use no-semicolon style — don't enforce semi there
// TODO: align these files to project style in a follow-up PR
files: ['**/*.d.ts'],
rules: {
'style/semi': 'off',
},
},
);

// Re-register @typescript-eslint plugin under its legacy name as a standalone
// config entry so inline eslint-disable comments using the old name don't
// produce "Definition not found" errors after @antfu/eslint-config v9 renamed
// the plugin to 'ts/'.
// TODO: migrate all eslint-disable comments in source files to use 'ts/' prefix
export default [
{ plugins: { '@typescript-eslint': tsPlugin } },
...await antfuConfig,
];
17 changes: 16 additions & 1 deletion locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1870,6 +1870,12 @@ tools:
tag-dkim-policy: DKIM Policy
tag-spf-policy: SPF Policy
tag-identifiers: Identifiers
dns-propagation-tester:
title: DNS Propagation Tester
description: A simple tool for testing DNS propagation across different servers.
dns-tester:
title: DNS Tester
description: A simple tool for testing DNS resolution, whois queries, and other DNS-related tasks.
dns-queries:
title: DNS Queries
description: Perform DNS Queries (over HTTPS)
Expand Down Expand Up @@ -3154,6 +3160,9 @@ tools:
spline: Spline
stacked: Stacked
cutout: Cutout
powershell-memo:
title: Powershell Cheatsheet
description: Powershell is a powerful scripting language and command-line shell designed for system administration and automation.
power-converter:
title: Power Converter
description: Convert values between power units
Expand Down Expand Up @@ -3241,6 +3250,9 @@ tools:
title-error-while-decrypting: Error while decrypting
label-your-text-decrypted: 'Your text decrypted:'
placeholder-your-string-decrypted: Your string decrypted
running-pace-calculator:
title: Running Pace Calculator
description: Calculate your running pace, estimate your finish times for popular races, break down splits, and find your training zones.
rune-converter:
title: Rune converter
description: Convert Text to Runes and vice-versa
Expand Down Expand Up @@ -5676,6 +5688,9 @@ tools:
hmac-using-sha-512: HMAC using SHA-512
hmac-using-sha-384: HMAC using SHA-384
hmac-using-sha-256: HMAC using SHA-256
https-tester:
title: HTTPS Tester
description: Validate HTTPS certificate, HSTS and 302 redirection
htpasswd-generator:
title: Htpasswd/htaccess generator
description: htpassword/htaccess user/password generator
Expand Down Expand Up @@ -8668,7 +8683,7 @@ tools:
Downloads Remove Background models from HuggingFace. Processing is done in
your browser
texts:
label-rmbg-1-4-cpu-wasm: RMBG‑1.4 (CPU/WASM)
label-rmbg-1-4-cpu-wasm: MODNet (CPU/WASM)
label-modnet-webgpu: MODNet (WebGPU)
label-transparent: Transparent
label-solid-color: Solid Color
Expand Down
3 changes: 3 additions & 0 deletions node_mem.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { totalmem } from 'os';
const memMb = Math.floor(totalmem() / 1024 / 1024);
process.stdout.write(`--max-old-space-size=${memMb - 1024}`);
Loading