Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
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
1 change: 1 addition & 0 deletions src/Exceptionless.Web/ClientApp/.npmrc
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
engine-strict=true
legacy-peer-deps=true
8 changes: 8 additions & 0 deletions src/Exceptionless.Web/ClientApp/.oxfmtrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"printWidth": 160,
"singleQuote": true,
"trailingComma": "none",
"endOfLine": "lf",
"ignorePatterns": []
}
11 changes: 11 additions & 0 deletions src/Exceptionless.Web/ClientApp/.oxlintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"$schema": "./node_modules/oxlint/configuration_schema.json",
"plugins": ["typescript", "import"],
"categories": {
"correctness": "warn"
},
"rules": {
"no-unused-vars": "off"
},
"ignorePatterns": [".agents/", "build/", ".svelte-kit/", "dist/", "src/lib/generated/", "src/lib/features/shared/components/ui/"]
}
8 changes: 7 additions & 1 deletion src/Exceptionless.Web/ClientApp/eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { includeIgnoreFile } from '@eslint/compat';
import js from '@eslint/js';
import pluginQuery from '@tanstack/eslint-plugin-query';
import prettier from 'eslint-config-prettier';
import oxlint from 'eslint-plugin-oxlint';
import perfectionist from 'eslint-plugin-perfectionist';
// For more info, see https://github.com/storybookjs/eslint-plugin-storybook#configuration-flat-config-format
import storybook from 'eslint-plugin-storybook';
Expand Down Expand Up @@ -34,6 +35,9 @@ export default ts.config(
parserOptions: {
parser: ts.parser
}
},
rules: {
'no-useless-assignment': 'off'
}
},
{
Expand All @@ -54,5 +58,7 @@ export default ts.config(
'perfectionist/sort-svelte-attributes': 'off'
}
},
storybook.configs['flat/recommended']
storybook.configs['flat/recommended'],
// Must be last — disables ESLint rules already covered by oxlint
oxlint.buildFromOxlintConfigFile('./.oxlintrc.json')
);
3,411 changes: 2,159 additions & 1,252 deletions src/Exceptionless.Web/ClientApp/package-lock.json

Large diffs are not rendered by default.

126 changes: 67 additions & 59 deletions src/Exceptionless.Web/ClientApp/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,23 @@
"name": "exceptionless",
"version": "8.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "cross-env NODE_OPTIONS=--trace-warnings vite dev",
"dev:api": "cross-env ASPNETCORE_URLS=https://be.exceptionless.io/ vite dev",
"build": "vite build",
"preview": "vite preview",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "npm run lint:prettier && npm run lint:eslint",
"lint": "npm run lint:oxfmt && npm run lint:prettier && npm run lint:oxlint && npm run lint:eslint",
"lint:oxfmt": "oxfmt --check .",
"lint:prettier": "prettier --check **/*.svelte",
"lint:oxlint": "oxlint",
"lint:eslint": "eslint . --concurrency=auto",
"lint:prettier": "prettier --check .",
"format": "npm run format:prettier && npm run format:eslint",
"format": "npm run format:oxfmt && npm run format:prettier && npm run format:eslint",
"format:oxfmt": "oxfmt --write .",
"format:prettier": "prettier --write **/*.svelte",
"format:eslint": "eslint . --fix --concurrency=auto",
"format:prettier": "prettier --write .",
"generate-models": "node scripts/generate-api.mjs",
"generate-templates": "swagger-typescript-api generate-templates -o api-templates",
"test:e2e": "playwright test",
Expand All @@ -24,79 +28,83 @@
"build-storybook": "storybook build",
"upgrade": "ncu -i"
},
"devDependencies": {
"@chromatic-com/storybook": "^5.0.1",
"@eslint/compat": "^2.0.2",
"@eslint/js": "^9.39.2",
"@iconify-json/lucide": "^1.2.90",
"@playwright/test": "^1.58.2",
"@storybook/addon-a11y": "^10.2.8",
"@storybook/addon-docs": "^10.2.8",
"@storybook/addon-svelte-csf": "^5.0.11",
"@storybook/sveltekit": "^10.2.8",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.52.0",
"@sveltejs/vite-plugin-svelte": "^6.2.4",
"@tailwindcss/vite": "^4.1.18",
"@tanstack/eslint-plugin-query": "^5.91.4",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/svelte": "^5.3.1",
"@types/eslint": "^9.6.1",
"@types/node": "^25.2.3",
"@types/throttle-debounce": "^5.0.2",
"cross-env": "^10.1.0",
"eslint": "^9.39.2",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-perfectionist": "^5.5.0",
"eslint-plugin-storybook": "^10.2.8",
"eslint-plugin-svelte": "^3.15.0",
"jsdom": "^28.1.0",
"prettier": "^3.8.1",
"prettier-plugin-svelte": "^3.4.1",
"prettier-plugin-tailwindcss": "^0.7.2",
"storybook": "^10.2.8",
"svelte": "^5.51.2",
"svelte-check": "^4.4.0",
"swagger-typescript-api": "^13.2.18",
"tslib": "^2.8.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.56.0",
"vite": "^7.3.1",
"vitest": "4.0.18",
"vitest-websocket-mock": "^0.5.0",
"zod": "^4.3.6"
},
"dependencies": {
"@exceptionless/browser": "^3.1.0",
"@exceptionless/fetchclient": "^0.44.0",
"@internationalized/date": "^3.11.0",
"@lucide/svelte": "^0.564.0",
"@tanstack/svelte-form": "^1.28.3",
"@tanstack/svelte-query": "^6.0.18",
"@internationalized/date": "^3.12.0",
"@lucide/svelte": "^0.577.0",
"@tanstack/svelte-form": "^1.28.5",
"@tanstack/svelte-query": "^6.1.3",
"@tanstack/svelte-query-devtools": "^6.0.4",
"@tanstack/svelte-table": "^9.0.0-alpha.10",
"@types/d3-scale": "^4.0.9",
"@types/d3-shape": "^3.1.8",
"bits-ui": "^2.15.5",
"bits-ui": "^2.16.3",
"clsx": "^2.1.1",
"d3-scale": "^4.0.2",
"dompurify": "^3.3.1",
"dompurify": "^3.3.3",
"kit-query-params": "^0.0.26",
"layerchart": "^2.0.0-next.44",
"layerchart": "^2.0.0-next.46",
"mode-watcher": "^1.1.0",
"oidc-client-ts": "^3.4.1",
"oidc-client-ts": "^3.5.0",
"pretty-ms": "^9.3.0",
"runed": "^0.37.1",
"shiki": "^3.22.0",
"svelte-sonner": "^1.0.7",
"shiki": "^4.0.2",
"svelte-sonner": "^1.1.0",
"svelte-time": "^2.1.0",
"tailwind-merge": "^3.4.1",
"tailwind-merge": "^3.5.0",
"tailwind-variants": "^3.2.2",
"tailwindcss": "^4.1.18",
"tailwindcss": "^4.2.2",
"throttle-debounce": "^5.0.2",
"tw-animate-css": "^1.4.0"
},
"type": "module",
"devDependencies": {
"@chromatic-com/storybook": "^5.0.2",
"@eslint/compat": "^2.0.3",
"@eslint/js": "^10.0.1",
"@iconify-json/lucide": "^1.2.98",
"@playwright/test": "^1.58.2",
"@storybook/addon-a11y": "^10.3.0",
"@storybook/addon-docs": "^10.3.0",
"@storybook/addon-svelte-csf": "^5.0.12",
"@storybook/sveltekit": "^10.3.0",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.55.0",
"@sveltejs/vite-plugin-svelte": "^7.0.0",
"@tailwindcss/vite": "^4.2.2",
"@tanstack/eslint-plugin-query": "^5.91.5",
"@testing-library/jest-dom": "^6.9.1",
"@testing-library/svelte": "^5.3.1",
"@types/eslint": "^9.6.1",
"@types/node": "^25.5.0",
"@types/throttle-debounce": "^5.0.2",
"cross-env": "^10.1.0",
"eslint": "^10.0.3",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-oxlint": "^1.56.0",
"eslint-plugin-perfectionist": "^5.7.0",
"eslint-plugin-storybook": "^10.3.0",
"eslint-plugin-svelte": "^3.15.2",
"globals": "^17.4.0",
"jsdom": "^29.0.0",
"oxfmt": "^0.41.0",
"oxlint": "^1.56.0",
"prettier": "^3.8.1",
"prettier-plugin-svelte": "^3.5.1",
"prettier-plugin-tailwindcss": "^0.7.2",
"storybook": "^10.3.0",
"svelte": "^5.54.0",
"svelte-check": "^4.4.5",
"swagger-typescript-api": "^13.6.5",
"tslib": "^2.8.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.57.1",
"vite": "^8.0.1",
"vite-plugin-oxlint": "^2.0.1",
"vitest": "^4.1.0",
"vitest-websocket-mock": "^0.5.0",
"zod": "^4.3.6"
},
"overrides": {
"storybook": "$storybook"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ export { type SignupFormData, SignupSchema } from '$generated/schemas';
// In dev mode, allow addresses like test@localhost (no TLD required)
export const LoginSchema = dev
? GeneratedLoginSchema.extend({
email: string().min(1, 'Email is required').regex(/^[^\s@]+@[^\s@]+$/, 'Please enter a valid email address')
email: string()
.min(1, 'Email is required')
.regex(/^[^\s@]+@[^\s@]+$/, 'Please enter a valid email address')
})
: GeneratedLoginSchema;
export type LoginFormData = Infer<typeof GeneratedLoginSchema>;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,10 @@
<form.Field name="password">
{#snippet children(field)}
<Field.Field data-invalid={ariaInvalid(field)}>
<Field.Label for={field.name}>Password <Muted class="float-right"><A href={resolve('/(auth)/forgot-password')} tabindex={6}>Forgot password?</A></Muted></Field.Label>
<Field.Label for={field.name}
>Password <Muted class="float-right"><A href={resolve('/(auth)/forgot-password')} tabindex={6}>Forgot password?</A></Muted
></Field.Label
>
Comment on lines +101 to +104
<Input
id={field.name}
name={field.name}
Expand Down
3 changes: 2 additions & 1 deletion src/Exceptionless.Web/ClientApp/vite.config.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { sveltekit } from '@sveltejs/kit/vite';
import tailwindcss from '@tailwindcss/vite';
import { svelteTesting } from '@testing-library/svelte/vite';
import oxlint from 'vite-plugin-oxlint';
import { defineConfig } from 'vitest/config';

const aspNetConfig = getAspNetConfig();
Expand All @@ -11,7 +12,7 @@ export default defineConfig({
sourcemap: true,
target: 'esnext'
},
plugins: [tailwindcss(), sveltekit()],
plugins: [tailwindcss(), sveltekit(), oxlint()],
server: {
hmr: aspNetConfig.hmr,
host: true,
Expand Down
Loading