Skip to content

Commit e70eacf

Browse files
authored
Update linting rules (#90)
1 parent 9f9329d commit e70eacf

File tree

20 files changed

+191
-158
lines changed

20 files changed

+191
-158
lines changed

.eslintrc.cjs

Lines changed: 0 additions & 20 deletions
This file was deleted.

eslint.config.mjs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import typescriptEslint from '@typescript-eslint/eslint-plugin'
2+
import stylistic from '@stylistic/eslint-plugin'
3+
import globals from 'globals'
4+
import tsParser from '@typescript-eslint/parser'
5+
import path from 'node:path'
6+
import { fileURLToPath } from 'node:url'
7+
import js from '@eslint/js'
8+
import { FlatCompat } from '@eslint/eslintrc'
9+
10+
const __filename = fileURLToPath(import.meta.url)
11+
const __dirname = path.dirname(__filename)
12+
const compat = new FlatCompat({
13+
baseDirectory: __dirname,
14+
recommendedConfig: js.configs.recommended,
15+
allConfig: js.configs.all,
16+
})
17+
18+
export default [
19+
...compat.extends('eslint:recommended', 'plugin:@typescript-eslint/recommended'),
20+
{
21+
plugins: {
22+
'@typescript-eslint': typescriptEslint,
23+
'@stylistic': stylistic,
24+
},
25+
26+
languageOptions: {
27+
globals: {
28+
...globals.browser,
29+
...globals.node,
30+
},
31+
32+
parser: tsParser,
33+
},
34+
35+
rules: {
36+
quotes: ['error', 'single'],
37+
'no-trailing-spaces': ['error'],
38+
'object-curly-spacing': ['error', 'always'],
39+
'comma-dangle': ['error', 'always-multiline'],
40+
semi: ['error', 'never'],
41+
'@typescript-eslint/no-non-null-assertion': ['off'],
42+
'@typescript-eslint/ban-ts-comment': ['off'],
43+
'@typescript-eslint/no-explicit-any': ['off'],
44+
'@stylistic/no-extra-semi': ['error'],
45+
'@stylistic/arrow-parens': ['error'],
46+
'@stylistic/space-infix-ops': ['error'],
47+
},
48+
},
49+
]

package.json

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,12 @@
1818
"test": "npm run test --workspaces --if-present"
1919
},
2020
"devDependencies": {
21-
"@typescript-eslint/eslint-plugin": "^7.10.0",
22-
"@typescript-eslint/parser": "^7.10.0",
23-
"eslint": "^8.56.0"
21+
"@eslint/eslintrc": "^3.1.0",
22+
"@eslint/js": "^9.9.1",
23+
"@stylistic/eslint-plugin": "^2.6.4",
24+
"@typescript-eslint/eslint-plugin": "^8.3.0",
25+
"@typescript-eslint/parser": "^8.3.0",
26+
"eslint": "^9.9.1",
27+
"globals": "^15.9.0"
2428
}
2529
}

packages/alpine/src/index.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { Form } from './types.js'
66
export { client }
77

88
export default function (Alpine: TAlpine) {
9-
Alpine.magic('form', (el) => <Data extends Record<string, unknown>>(method: RequestMethod|(() => RequestMethod), url: string|(() => string), inputs: Data, config: ValidationConfig = {}): Data&Form<Data> => {
9+
Alpine.magic('form', (el) => <Data extends Record<string, unknown>>(method: RequestMethod | (() => RequestMethod), url: string | (() => string), inputs: Data, config: ValidationConfig = {}): Data & Form<Data> => {
1010
/**
1111
* The original data.
1212
*/
@@ -31,7 +31,7 @@ export default function (Alpine: TAlpine) {
3131
/**
3232
* The validator instance.
3333
*/
34-
const validator = createValidator(client => client[resolveMethod(method)](resolveUrl(url), form.data(), config), originalData)
34+
const validator = createValidator((client) => client[resolveMethod(method)](resolveUrl(url), form.data(), config), originalData)
3535
.on('validatingChanged', () => {
3636
form.validating = validator.validating()
3737
})
@@ -77,7 +77,7 @@ export default function (Alpine: TAlpine) {
7777
/**
7878
* Create a new form instance.
7979
*/
80-
const createForm = (): Data&Form<Data> => ({
80+
const createForm = (): Data & Form<Data> => ({
8181
...cloneDeep(inputs),
8282
data() {
8383
const newForm = cloneDeep(form)
@@ -135,9 +135,9 @@ export default function (Alpine: TAlpine) {
135135

136136
if (names.length === 0) {
137137
// @ts-expect-error
138-
originalInputs.forEach(name => (form[name] = original[name]))
138+
originalInputs.forEach((name) => (form[name] = original[name]))
139139
} else {
140-
names.forEach(name => set(form, name, get(original, name)))
140+
names.forEach((name) => set(form, name, get(original, name)))
141141
}
142142

143143
validator.reset(...names)
@@ -163,7 +163,7 @@ export default function (Alpine: TAlpine) {
163163
/**
164164
* The form instance.
165165
*/
166-
const form = Alpine.reactive(createForm()) as Data&Form<Data>
166+
const form = Alpine.reactive(createForm()) as Data & Form<Data>
167167

168168
syncWithDom(el, resolveMethod(method), resolveUrl(url), form)
169169

packages/alpine/src/types.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@ export interface Form<Data extends Record<string, unknown>> {
44
processing: boolean,
55
validating: boolean,
66
touched(name: string): boolean,
7-
touch(name: string|NamedInputEvent|Array<string>): Data&Form<Data>,
7+
touch(name: string | NamedInputEvent | Array<string>): Data & Form<Data>,
88
data(): Data,
99
errors: Record<string, string>,
1010
hasErrors: boolean,
1111
valid(name: string): boolean,
1212
invalid(name: string): boolean,
13-
validate(name?: string|NamedInputEvent|ValidationConfig, config?: ValidationConfig): Data&Form<Data>,
14-
setErrors(errors: SimpleValidationErrors|ValidationErrors): Data&Form<Data>
15-
forgetError(name: string|NamedInputEvent): Data&Form<Data>
16-
setValidationTimeout(duration: number): Data&Form<Data>,
13+
validate(name?: string | NamedInputEvent | ValidationConfig, config?: ValidationConfig): Data & Form<Data>,
14+
setErrors(errors: SimpleValidationErrors | ValidationErrors): Data & Form<Data>
15+
forgetError(name: string | NamedInputEvent): Data & Form<Data>
16+
setValidationTimeout(duration: number): Data & Form<Data>,
1717
submit(config?: Config): Promise<unknown>,
18-
reset(...keys: string[]): Data&Form<Data>,
19-
validateFiles(): Data&Form<Data>,
18+
reset(...keys: string[]): Data & Form<Data>,
19+
validateFiles(): Data & Form<Data>,
2020
}

packages/core/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
},
3636
"devDependencies": {
3737
"@types/lodash-es": "^4.17.12",
38-
"@types/node": "^20.1.0",
38+
"@types/node": "^22.5.0",
3939
"typescript": "^5.0.0",
40-
"vitest": "^1.6.0"
40+
"vitest": "^2.0.5"
4141
}
4242
}

packages/core/src/client.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ const request = (userConfig: Config = {}): Promise<unknown> => {
8383

8484
(config.onStart ?? (() => null))()
8585

86-
return axiosClient.request(config).then(async response => {
86+
return axiosClient.request(config).then(async (response) => {
8787
if (config.precognitive) {
8888
validatePrecognitionResponse(response)
8989
}
@@ -104,7 +104,7 @@ const request = (userConfig: Config = {}): Promise<unknown> => {
104104
?? ((response) => response)
105105

106106
return statusHandler(payload) ?? payload
107-
}, error => {
107+
}, (error) => {
108108
if (isNotServerGeneratedError(error)) {
109109
return Promise.reject(error)
110110
}
@@ -202,7 +202,7 @@ const isNotServerGeneratedError = (error: unknown): boolean => {
202202
/**
203203
* Resolve the handler for the given HTTP response status.
204204
*/
205-
const resolveStatusHandler = (config: Config, code: number): StatusHandler|undefined => ({
205+
const resolveStatusHandler = (config: Config, code: number): StatusHandler | undefined => ({
206206
401: config.onUnauthorized,
207207
403: config.onForbidden,
208208
404: config.onNotFound,
@@ -237,13 +237,13 @@ export const isFile = (value: unknown): boolean => (typeof File !== 'undefined'
237237
/**
238238
* Resolve the url from a potential callback.
239239
*/
240-
export const resolveUrl = (url: string|(() => string)): string => typeof url === 'string'
240+
export const resolveUrl = (url: string | (() => string)): string => typeof url === 'string'
241241
? url
242242
: url()
243243

244244
/**
245245
* Resolve the method from a potential callback.
246246
*/
247-
export const resolveMethod = (method: RequestMethod|(() => RequestMethod)): RequestMethod => typeof method === 'string'
247+
export const resolveMethod = (method: RequestMethod | (() => RequestMethod)): RequestMethod => typeof method === 'string'
248248
? method.toLowerCase() as RequestMethod
249249
: method()

packages/core/src/types.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ export type ValidationErrors = Record<string, Array<string>>
66

77
export type SimpleValidationErrors = Record<string, string>
88

9-
export type Config = AxiosRequestConfig&{
9+
export type Config = AxiosRequestConfig & {
1010
precognitive?: boolean,
11-
validate?: Iterable<string>|ArrayLike<string>,
12-
fingerprint?: string|null,
13-
onBefore?: () => boolean|undefined,
11+
validate?: Iterable<string> | ArrayLike<string>,
12+
fingerprint?: string | null,
13+
onBefore?: () => boolean | undefined,
1414
onStart?: () => void,
1515
onSuccess?: (response: AxiosResponse) => unknown,
1616
onPrecognitionSuccess?: (response: AxiosResponse) => unknown,
@@ -24,15 +24,15 @@ export type Config = AxiosRequestConfig&{
2424
}
2525

2626
interface RevalidatePayload {
27-
data: Record<string, unknown>|null,
27+
data: Record<string, unknown> | null,
2828
touched: Array<string>,
2929
}
3030

31-
export type ValidationConfig = Config&{
32-
onBeforeValidation?: (newRequest: RevalidatePayload, oldRequest: RevalidatePayload) => boolean|undefined,
31+
export type ValidationConfig = Config & {
32+
onBeforeValidation?: (newRequest: RevalidatePayload, oldRequest: RevalidatePayload) => boolean | undefined,
3333
}
3434

35-
export type RequestFingerprintResolver = (config: Config, axios: AxiosInstance) => string|null
35+
export type RequestFingerprintResolver = (config: Config, axios: AxiosInstance) => string | null
3636

3737
export type SuccessResolver = (response: AxiosResponse) => boolean
3838

@@ -43,21 +43,21 @@ export interface Client {
4343
put(url: string, data?: Record<string, unknown>, config?: Config): Promise<unknown>,
4444
delete(url: string, data?: Record<string, unknown>, config?: Config): Promise<unknown>,
4545
use(axios: AxiosInstance): Client,
46-
fingerprintRequestsUsing(callback: RequestFingerprintResolver|null): Client,
46+
fingerprintRequestsUsing(callback: RequestFingerprintResolver | null): Client,
4747
determineSuccessUsing(callback: SuccessResolver): Client,
4848
axios(): AxiosInstance,
4949
}
5050

5151
export interface Validator {
5252
touched(): Array<string>,
53-
validate(input?: string|NamedInputEvent|ValidationConfig, value?: unknown, config?: ValidationConfig): Validator,
54-
touch(input: string|NamedInputEvent|Array<string>): Validator,
53+
validate(input?: string | NamedInputEvent | ValidationConfig, value?: unknown, config?: ValidationConfig): Validator,
54+
touch(input: string | NamedInputEvent | Array<string>): Validator,
5555
validating(): boolean,
5656
valid(): Array<string>,
5757
errors(): ValidationErrors,
58-
setErrors(errors: ValidationErrors|SimpleValidationErrors): Validator,
58+
setErrors(errors: ValidationErrors | SimpleValidationErrors): Validator,
5959
hasErrors(): boolean,
60-
forgetError(error: string|NamedInputEvent): Validator,
60+
forgetError(error: string | NamedInputEvent): Validator,
6161
reset(...names: string[]): Validator,
6262
setTimeout(duration: number): Validator,
6363
on(event: keyof ValidatorListeners, callback: () => void): Validator,
@@ -71,7 +71,7 @@ export interface ValidatorListeners {
7171
validatedChanged: Array<() => void>,
7272
}
7373

74-
export type RequestMethod = 'get'|'post'|'patch'|'put'|'delete'
74+
export type RequestMethod = 'get' | 'post' | 'patch' | 'put' | 'delete'
7575

7676
export type ValidationCallback = (client: {
7777
get(url: string, data?: Record<string, unknown>, config?: ValidationConfig): Promise<unknown>,

0 commit comments

Comments
 (0)