diff --git a/config/eslint-config/package.json b/config/eslint-config/package.json index 9a18efa03..329025e29 100644 --- a/config/eslint-config/package.json +++ b/config/eslint-config/package.json @@ -41,7 +41,7 @@ "eslint-plugin-jest": "28.9.0", "eslint-plugin-jest-dom": "5.5.0", "eslint-plugin-jsx-a11y": "6.10.2", - "eslint-plugin-perfectionist": "3.9.1", + "eslint-plugin-perfectionist": "4.0.2", "eslint-plugin-playwright": "2.1.0", "eslint-plugin-react": "7.37.2", "eslint-plugin-react-hooks": "5.0.0", diff --git a/config/eslint-config/src/base.js b/config/eslint-config/src/base.js index 4226006dd..7f3938b4e 100644 --- a/config/eslint-config/src/base.js +++ b/config/eslint-config/src/base.js @@ -43,8 +43,8 @@ const configBase = [ customGroups: { type: {}, value: { - jeromefitz: '@jeromefitz/**', - 'jeromefitz-type': '@jeromefitz/**', + jeromefitz: '^@jeromefitz/.*$', + 'jeromefitz-type': '^@jeromefitz/.*$', 'server-only': 'server-only', }, }, @@ -64,7 +64,7 @@ const configBase = [ 'object', 'unknown', ], - internalPattern: ['@/**', '~**/**'], + internalPattern: ['^@/.*$', '^~.*/.*$'], newlinesBetween: 'always', order: 'asc', type: 'natural', diff --git a/package.json b/package.json index b324d9ae6..c1bae3ba6 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@semantic-release/commit-analyzer@13.0.0": "patches/@semantic-release__commit-analyzer@13.0.0.patch" }, "overrides": { - "@typescript-eslint/typescript-estree": "^8.3.0", + "@typescript-eslint/typescript-estree": "^8.15.0", "micromatch": "4.0.8" } } diff --git a/packages/conventional-gitmoji/src/types/releaseRule.types.ts b/packages/conventional-gitmoji/src/types/releaseRule.types.ts index 40b07ac57..985df46cb 100644 --- a/packages/conventional-gitmoji/src/types/releaseRule.types.ts +++ b/packages/conventional-gitmoji/src/types/releaseRule.types.ts @@ -1,5 +1,7 @@ import type { ICommit } from './commit.types.js' +type IReleaseRule = Partial> + // @todo(NICE-129) eslint // eslint-disable-next-line @typescript-eslint/consistent-type-definitions type IReleaseRuleProps = { @@ -15,6 +17,4 @@ type IReleaseRuleProps = { type?: ICommit value?: ICommit } - -type IReleaseRule = Partial> export type { IReleaseRule, IReleaseRuleProps } diff --git a/packages/notion/src/index.ts b/packages/notion/src/index.ts index f95683274..e74607b0b 100644 --- a/packages/notion/src/index.ts +++ b/packages/notion/src/index.ts @@ -15,6 +15,13 @@ import { getQuery, } from './queries/index.js' +// @todo(NICE-129) eslint +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +type ClientProps = { + custom: CustomProps + dataTypes: DataTypesProps +} + // @todo(NICE-129) eslint // eslint-disable-next-line @typescript-eslint/consistent-type-definitions type CredentialProps = { @@ -43,13 +50,6 @@ type DataTypesProps = { SLUG_BY_ROUTE: any } -// @todo(NICE-129) eslint -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -type ClientProps = { - custom: CustomProps - dataTypes: DataTypesProps -} - class Client extends _Client { #config?: any diff --git a/packages/notion/src/schema/index.ts b/packages/notion/src/schema/index.ts index 83c58ffc6..1b003349c 100644 --- a/packages/notion/src/schema/index.ts +++ b/packages/notion/src/schema/index.ts @@ -1,18 +1,6 @@ -type DatabaseType = - | 'BLOG' - | 'BOOKS' - | 'EPISODES' - | 'EVENTS' - | 'PAGES' - | 'PEOPLE' - | 'PODCASTS' - | 'SEO' - | 'SHOWS' - | 'VENUES' - -type DataTypes = 'LISTING' | 'LISTING_BY_DATE' | 'SLUG' | 'SLUG_BY_ROUTE' -type DataTypesObject = Record +type Blog = Record +type BlogPost = Default type DatabaseInfo = Partial< Record< DatabaseType, @@ -39,111 +27,21 @@ type DatabaseInfo = Partial< type Databases = Record -interface Relation { - database_id: string - synced_property_id?: string - synced_property_name: string -} - -type Direction = 'ascending' | 'descending' -interface SortItem { - direction: Direction - property: string -} -interface SortMock { - filter?: any[] - sorts: SortItem[] -} - -type RollupFunction = - | 'average' - | 'count_all' - | 'count_empty' - | 'count_not_empty' - | 'count_unique_values' - | 'count_values' - | 'max' - | 'median' - | 'min' - | 'percent_empty' - | 'percent_not_empty' - | 'range' - | 'show_original' - | 'sum' - -interface Rollup { - function?: RollupFunction - relation_property_id?: string - relation_property_name?: string - rollup_property_id?: string - rollup_property_name?: string -} +type DatabaseType = + | 'BLOG' + | 'BOOKS' + | 'EPISODES' + | 'EVENTS' + | 'PAGES' + | 'PEOPLE' + | 'PODCASTS' + | 'SEO' + | 'SHOWS' + | 'VENUES' -interface Property { - format?: - | 'baht' - | 'canadian_dollar' - | 'chilean_peso' - | 'colombian_peso' - | 'danish_krone' - | 'dirham' - | 'dollar' - | 'euro' - | 'forint' - | 'franc' - | 'hong_kong_dollar' - | 'koruna' - | 'krona' - | 'leu' - | 'lira' - | 'mexican_peso' - | 'new_taiwan_dollar' - | 'new_zealand_dollar' - | 'norwegian_krone' - | 'number' - | 'number_with_commas' - | 'percent' - | 'philippine_peso' - | 'pound' - | 'rand' - | 'real' - | 'ringgit' - | 'riyal' - | 'ruble' - | 'rupee' - | 'rupiah' - | 'shekel' - | 'won' - | 'yen' - | 'yuan' - | 'zloty' - init: boolean - key: string - notion: string - relation?: Relation - rollup?: Rollup - type: - | 'checkbox' - | 'created_by' - | 'created_time' - | 'date' - | 'email' - | 'files' - | 'formula' - | 'last_edited_by' - | 'last_edited_time' - | 'multi_select' - | 'number' - | 'people' - | 'phone_number' - | 'relation' - | 'rich_text' - | 'rollup' - | 'select' - | 'title' - | 'url' -} +type DataTypes = 'LISTING' | 'LISTING_BY_DATE' | 'SLUG' | 'SLUG_BY_ROUTE' +type DataTypesObject = Record interface Default { // authors: any dateCreated?: any @@ -158,9 +56,7 @@ interface Default { slug: any title: any } - -type BlogPost = Default -type Blog = Record +type Direction = 'ascending' | 'descending' interface Episode extends Default { dateRecorded: any @@ -183,7 +79,9 @@ interface Episode extends Default { socialSpotify: any type: any } + type Episodes = Record + interface Event extends Default { dateEvent: any relationEvents__People_Guest: any @@ -206,10 +104,59 @@ interface Event extends Default { socialWebsite: any ticketUrl: any } + type Events = Record +interface NotionAnnotations { + bold: boolean + code: boolean + color: string + italic: boolean + strikethrough: boolean + underline: boolean +} +interface NotionBlock { + created_time: string + has_children: string + // + heading_1?: NotionText[] + heading_2?: NotionText[] + heading_3?: NotionText[] + heading_4?: NotionText[] + heading_5?: NotionText[] + heading_6?: NotionText[] + id: string + image?: NotionImage + last_edited_time: string + object: string + paragraph?: NotionText[] + type: string +} + +interface NotionImage { + caption?: NotionText + external?: NotionUrl + file?: NotionUrl + type: string +} +interface NotionText { + annotations: NotionAnnotations + href: null | string + plain_text: string + text: NotionTextContent + type: string +} +interface NotionTextContent { + content: string + link: null | string +} +interface NotionUrl { + url: string +} + type Page = Default type Pages = Record +type People = Record interface Person extends Default { email: any nameFirst: any @@ -232,7 +179,6 @@ interface Person extends Default { relationPeople__Shows_Thanks: any relationPeople__Shows_Writer: any } -type People = Record interface Podcast extends Default { categories: any explicit: any @@ -249,8 +195,101 @@ interface Podcast extends Default { } type Podcasts = Record -type SeoPost = Default +interface Property { + format?: + | 'baht' + | 'canadian_dollar' + | 'chilean_peso' + | 'colombian_peso' + | 'danish_krone' + | 'dirham' + | 'dollar' + | 'euro' + | 'forint' + | 'franc' + | 'hong_kong_dollar' + | 'koruna' + | 'krona' + | 'leu' + | 'lira' + | 'mexican_peso' + | 'new_taiwan_dollar' + | 'new_zealand_dollar' + | 'norwegian_krone' + | 'number' + | 'number_with_commas' + | 'percent' + | 'philippine_peso' + | 'pound' + | 'rand' + | 'real' + | 'ringgit' + | 'riyal' + | 'ruble' + | 'rupee' + | 'rupiah' + | 'shekel' + | 'won' + | 'yen' + | 'yuan' + | 'zloty' + init: boolean + key: string + notion: string + relation?: Relation + rollup?: Rollup + type: + | 'checkbox' + | 'created_by' + | 'created_time' + | 'date' + | 'email' + | 'files' + | 'formula' + | 'last_edited_by' + | 'last_edited_time' + | 'multi_select' + | 'number' + | 'people' + | 'phone_number' + | 'relation' + | 'rich_text' + | 'rollup' + | 'select' + | 'title' + | 'url' +} +interface Relation { + database_id: string + synced_property_id?: string + synced_property_name: string +} +interface Rollup { + function?: RollupFunction + relation_property_id?: string + relation_property_name?: string + rollup_property_id?: string + rollup_property_name?: string +} +type RollupFunction = + | 'average' + | 'count_all' + | 'count_empty' + | 'count_not_empty' + | 'count_unique_values' + | 'count_values' + | 'max' + | 'median' + | 'min' + | 'percent_empty' + | 'percent_not_empty' + | 'range' + | 'show_original' + | 'sum' + type Seo = Record +type SeoPost = Default + interface Show extends Default { relationShows__Events: any relationShows__Events_Lineup: any @@ -281,8 +320,19 @@ interface Show extends Default { socialTwitter: string socialWebsite: string } + type Shows = Record +interface SortItem { + direction: Direction + property: string +} + +interface SortMock { + filter?: any[] + sorts: SortItem[] +} + interface Venue extends Default { addressCity: any addressLatitude: any @@ -299,58 +349,8 @@ interface Venue extends Default { socialTwitter: any socialWebsite: any } -type Venues = Record - -interface NotionAnnotations { - bold: boolean - code: boolean - color: string - italic: boolean - strikethrough: boolean - underline: boolean -} - -interface NotionTextContent { - content: string - link: null | string -} - -interface NotionText { - annotations: NotionAnnotations - href: null | string - plain_text: string - text: NotionTextContent - type: string -} -interface NotionUrl { - url: string -} - -interface NotionImage { - caption?: NotionText - external?: NotionUrl - file?: NotionUrl - type: string -} - -interface NotionBlock { - created_time: string - has_children: string - // - heading_1?: NotionText[] - heading_2?: NotionText[] - heading_3?: NotionText[] - heading_4?: NotionText[] - heading_5?: NotionText[] - heading_6?: NotionText[] - id: string - image?: NotionImage - last_edited_time: string - object: string - paragraph?: NotionText[] - type: string -} +type Venues = Record export type { Blog, diff --git a/packages/semantic/src/plugins/pluginOptions.types.ts b/packages/semantic/src/plugins/pluginOptions.types.ts index d555d3722..ac4633b8e 100644 --- a/packages/semantic/src/plugins/pluginOptions.types.ts +++ b/packages/semantic/src/plugins/pluginOptions.types.ts @@ -6,8 +6,8 @@ import type { } from './index.js' interface PluginOptions - extends GitPluginOptions, - GithubPluginOptions, + extends GithubPluginOptions, + GitPluginOptions, NPMPluginOptions { enableGit?: boolean enableGithub?: boolean diff --git a/packages/spotify/src/index.ts b/packages/spotify/src/index.ts index f713707c1..c8efe057c 100644 --- a/packages/spotify/src/index.ts +++ b/packages/spotify/src/index.ts @@ -19,7 +19,19 @@ import { URL, } from './constants/index.js' -type TimeRangeProps = 'long_term' | 'medium_term' | 'short_term' +// @todo(types) +export interface ClientOptions { + accessToken: string + /** Silently ignored in the browser */ + agent?: Agent + baseUrl?: string + clientId: string + clientSecret: string + fetch?: any + refreshToken: string + spotifyVersion?: string + timeoutMs?: number +} // type PlaiceholderImage = { // base64: string @@ -28,12 +40,18 @@ type TimeRangeProps = 'long_term' | 'medium_term' | 'short_term' // url: string // } -interface QueryProps { - ids?: string - limit?: number - offset?: number - time_range?: TimeRangeProps - withImages?: boolean +export interface RequestParameters { + accessToken?: string + body?: Record + method: Method + path: string + query?: QueryParams +} + +// @todo(NICE-129) eslint +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +type ClientProps = { + get: GetProps } interface CredentialProps { @@ -42,10 +60,6 @@ interface CredentialProps { refreshToken: string } -interface NowPlayingProps { - withImages?: boolean -} - // @todo(NICE-129) eslint // eslint-disable-next-line @typescript-eslint/consistent-type-definitions type GetProps = { @@ -54,55 +68,27 @@ type GetProps = { topTracks({ limit, offset, time_range, withImages }: QueryProps): any } -// @todo(NICE-129) eslint -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions -type ClientProps = { - get: GetProps -} - type Method = 'DELETE' | 'GET' | 'PATCH' | 'POST' -type QueryParams = Record | URLSearchParams - -type WithAccessToken

= { accessToken?: string } & P -export interface RequestParameters { - accessToken?: string - body?: Record - method: Method - path: string - query?: QueryParams +interface NowPlayingProps { + withImages?: boolean } +type QueryParams = Record | URLSearchParams -// @todo(types) -export interface ClientOptions { - accessToken: string - /** Silently ignored in the browser */ - agent?: Agent - baseUrl?: string - clientId: string - clientSecret: string - fetch?: any - refreshToken: string - spotifyVersion?: string - timeoutMs?: number +interface QueryProps { + ids?: string + limit?: number + offset?: number + time_range?: TimeRangeProps + withImages?: boolean } + +type TimeRangeProps = 'long_term' | 'medium_term' | 'short_term' + +type WithAccessToken

= P & { accessToken?: string } // @todo(types) class Client { static readonly defaultSpotifyVersion = API_VERSION - #accessToken: string - #agent: Agent | undefined - // - #clientId: string - #clientSecret: string - #fetch: any - #prefixUrl: string - #refreshToken: string - // @todo(NICE-129) eslint - // eslint-disable-next-line no-unused-private-class-members - #spotifyVersion: string - - #userAgent: string - // @todo(types) public readonly get: GetProps = { // @todo(types) @@ -163,6 +149,20 @@ class Client { }) }, } + #accessToken: string + #agent: Agent | undefined + // + #clientId: string + #clientSecret: string + #fetch: any + #prefixUrl: string + #refreshToken: string + + // @todo(NICE-129) eslint + // eslint-disable-next-line no-unused-private-class-members + #spotifyVersion: string + + #userAgent: string public constructor(options: ClientOptions) { this.#prefixUrl = @@ -178,6 +178,75 @@ class Client { this.#accessToken = options?.accessToken ?? '' } + // @todo(types) + public async request({ + accessToken, + body, + method, + path, + query, + }: any): Promise { + // @todo(logging) INFO => request start + const bodyAsJsonString = + !body || Object.entries(body).length === 0 ? undefined : JSON.stringify(body) + + const url = new _URL(`${this.#prefixUrl}${path}`) + if (query) { + for (const [key, value] of Object.entries(query)) { + if (value !== undefined) { + url.searchParams.append(key, String(value)) + } + } + } + + const accessTokenHeader = await this.accessTokenAsHeaders(accessToken) + const headers: any = { + ...accessTokenHeader, + // 'Spotify-Version': this.#spotifyVersion, + 'user-agent': this.#userAgent, + } + + if (bodyAsJsonString !== undefined) { + headers['content-type'] = 'application/json' + } + + // @todo(NICE-129) eslint + // eslint-disable-next-line no-useless-catch + try { + // @todo(timeout) + const response = await this.#fetch(url.toString(), { + agent: this.#agent, + body: bodyAsJsonString, + headers, + method, + }) + + /** + * @todo(error-handling) + * 204 = No Content + * 400+ = Server Issue, Gracefull Fallback w/in Application + */ + if (response?.status === 204 || response?.status > 400) { + // @todo(logging) buildRequestError(response, responseText) + return { status: response?.status } + } + + // @todo(logging) INFO => request success + return await response.json() + } catch (error: unknown) { + // if (!isSpotifyClientError(error)) { + // throw error + // } + + // @todo(logging) WARN => request fail + // if (isHTTPResponseError(error)) { + // // @todo(logging) DEBUG => response fail + // } + + throw error + } + } + // @todo(types) private async accessTokenAsHeaders(accessToken?: string) { const headers: Record = {} @@ -330,75 +399,6 @@ class Client { items, } } - - // @todo(types) - public async request({ - accessToken, - body, - method, - path, - query, - }: any): Promise { - // @todo(logging) INFO => request start - const bodyAsJsonString = - !body || Object.entries(body).length === 0 ? undefined : JSON.stringify(body) - - const url = new _URL(`${this.#prefixUrl}${path}`) - if (query) { - for (const [key, value] of Object.entries(query)) { - if (value !== undefined) { - url.searchParams.append(key, String(value)) - } - } - } - - const accessTokenHeader = await this.accessTokenAsHeaders(accessToken) - const headers: any = { - ...accessTokenHeader, - // 'Spotify-Version': this.#spotifyVersion, - 'user-agent': this.#userAgent, - } - - if (bodyAsJsonString !== undefined) { - headers['content-type'] = 'application/json' - } - - // @todo(NICE-129) eslint - // eslint-disable-next-line no-useless-catch - try { - // @todo(timeout) - const response = await this.#fetch(url.toString(), { - agent: this.#agent, - body: bodyAsJsonString, - headers, - method, - }) - - /** - * @todo(error-handling) - * 204 = No Content - * 400+ = Server Issue, Gracefull Fallback w/in Application - */ - if (response?.status === 204 || response?.status > 400) { - // @todo(logging) buildRequestError(response, responseText) - return { status: response?.status } - } - - // @todo(logging) INFO => request success - return await response.json() - } catch (error: unknown) { - // if (!isSpotifyClientError(error)) { - // throw error - // } - - // @todo(logging) WARN => request fail - // if (isHTTPResponseError(error)) { - // // @todo(logging) DEBUG => response fail - // } - - throw error - } - } } export default Client diff --git a/packages/utils/src/pubsub/index.ts b/packages/utils/src/pubsub/index.ts index 0d6e1edb0..1aa1bfa77 100644 --- a/packages/utils/src/pubsub/index.ts +++ b/packages/utils/src/pubsub/index.ts @@ -1,12 +1,12 @@ // swr-esque import _isArray from 'lodash/isArray.js' +type Callback = (data?: any) => void + interface Unsubscribe { unsubscribe(): void } -type Callback = (data?: any) => void - const pubsub = () => { const subscribers: Record = {} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ea27458a..1a536bf13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,7 +5,7 @@ settings: excludeLinksFromLockfile: false overrides: - '@typescript-eslint/typescript-estree': ^8.3.0 + '@typescript-eslint/typescript-estree': ^8.15.0 micromatch: 4.0.8 patchedDependencies: @@ -120,8 +120,8 @@ importers: specifier: 6.10.2 version: 6.10.2(eslint@9.15.0) eslint-plugin-perfectionist: - specifier: 3.9.1 - version: 3.9.1(eslint@9.15.0)(typescript@5.6.3) + specifier: 4.0.2 + version: 4.0.2(eslint@9.15.0)(typescript@5.6.3) eslint-plugin-playwright: specifier: 2.1.0 version: 2.1.0(eslint@9.15.0) @@ -1062,10 +1062,6 @@ packages: resolution: {integrity: sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.9.0': - resolution: {integrity: sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.14.0': resolution: {integrity: sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1097,16 +1093,8 @@ packages: resolution: {integrity: sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.3.0': - resolution: {integrity: sha512-y6sSEeK+facMaAyixM36dQ5NVXTnKWunfD1Ft4xraYqxP0lC0POJmIaL/mw72CUMqjY9qfyVfXafMeaUj0noWw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.9.0': - resolution: {integrity: sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.3.0': - resolution: {integrity: sha512-Mq7FTHl0R36EmWlCJWojIC1qn/ZWo2YiWYc1XVtasJ7FIgjo0MVv9rZWXEE7IK2CGrtwe1dVOxWwqXUdNgfRCA==} + '@typescript-eslint/typescript-estree@8.15.0': + resolution: {integrity: sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1136,12 +1124,6 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.9.0': - resolution: {integrity: sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1154,14 +1136,6 @@ packages: resolution: {integrity: sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.3.0': - resolution: {integrity: sha512-RmZwrTbQ9QveF15m/Cl28n0LXD6ea2CjkhH5rQ55ewz3H24w+AMCJHPVYaZ8/0HoG8Z3cLLFFycRXxeO2tz9FA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.9.0': - resolution: {integrity: sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1896,24 +1870,11 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - eslint-plugin-perfectionist@3.9.1: - resolution: {integrity: sha512-9WRzf6XaAxF4Oi5t/3TqKP5zUjERhasHmLFHin2Yw6ZAp/EP/EVA2dr3BhQrrHWCm5SzTMZf0FcjDnBkO2xFkA==} + eslint-plugin-perfectionist@4.0.2: + resolution: {integrity: sha512-zWdgyg2SdHqhp/P9d9vKwo5qD9is28xMAGzBslHqkZz5mVIikjyz1qvuJ4yS7Wrsf4KlbGorORefb4Kbe7Puzg==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - astro-eslint-parser: ^1.0.2 eslint: '>=8.0.0' - svelte: '>=3.0.0' - svelte-eslint-parser: ^0.41.1 - vue-eslint-parser: '>=9.0.0' - peerDependenciesMeta: - astro-eslint-parser: - optional: true - svelte: - optional: true - svelte-eslint-parser: - optional: true - vue-eslint-parser: - optional: true eslint-plugin-playwright@2.1.0: resolution: {integrity: sha512-wMbHOehofSB1cBdzz2CLaCYaKNLeTQ0YnOW+7AHa281TJqlpEJUBgTHbRUYOUxiXphfWwOyTPvgr6vvEmArbSA==} @@ -2860,12 +2821,13 @@ packages: napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-orderby@5.0.0: + resolution: {integrity: sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==} + engines: {node: '>=18'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -4862,7 +4824,7 @@ snapshots: dependencies: '@typescript-eslint/scope-manager': 8.14.0 '@typescript-eslint/types': 8.14.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.14.0 debug: 4.3.7 eslint: 9.15.0 @@ -4875,7 +4837,7 @@ snapshots: dependencies: '@typescript-eslint/scope-manager': 8.15.0 '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.15.0 debug: 4.3.7 eslint: 9.15.0 @@ -4899,14 +4861,9 @@ snapshots: '@typescript-eslint/types': 8.15.0 '@typescript-eslint/visitor-keys': 8.15.0 - '@typescript-eslint/scope-manager@8.9.0': - dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/visitor-keys': 8.9.0 - '@typescript-eslint/type-utils@8.14.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) '@typescript-eslint/utils': 8.14.0(eslint@9.15.0)(typescript@5.6.3) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) @@ -4918,7 +4875,7 @@ snapshots: '@typescript-eslint/type-utils@8.15.0(eslint@9.15.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) debug: 4.3.7 eslint: 9.15.0 @@ -4934,14 +4891,10 @@ snapshots: '@typescript-eslint/types@8.15.0': {} - '@typescript-eslint/types@8.3.0': {} - - '@typescript-eslint/types@8.9.0': {} - - '@typescript-eslint/typescript-estree@8.3.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.15.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.3.0 - '@typescript-eslint/visitor-keys': 8.3.0 + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/visitor-keys': 8.15.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -4960,7 +4913,7 @@ snapshots: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) eslint: 9.15.0 eslint-scope: 5.1.1 semver: 7.6.3 @@ -4973,7 +4926,7 @@ snapshots: '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0) '@typescript-eslint/scope-manager': 8.14.0 '@typescript-eslint/types': 8.14.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) eslint: 9.15.0 transitivePeerDependencies: - supports-color @@ -4984,24 +4937,13 @@ snapshots: '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0) '@typescript-eslint/scope-manager': 8.15.0 '@typescript-eslint/types': 8.15.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.15.0(typescript@5.6.3) eslint: 9.15.0 optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.9.0(eslint@9.15.0)(typescript@5.6.3)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.15.0) - '@typescript-eslint/scope-manager': 8.9.0 - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/typescript-estree': 8.3.0(typescript@5.6.3) - eslint: 9.15.0 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 @@ -5017,16 +4959,6 @@ snapshots: '@typescript-eslint/types': 8.15.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.3.0': - dependencies: - '@typescript-eslint/types': 8.3.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@8.9.0': - dependencies: - '@typescript-eslint/types': 8.9.0 - eslint-visitor-keys: 3.4.3 - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -5878,13 +5810,12 @@ snapshots: safe-regex-test: 1.0.3 string.prototype.includes: 2.0.1 - eslint-plugin-perfectionist@3.9.1(eslint@9.15.0)(typescript@5.6.3): + eslint-plugin-perfectionist@4.0.2(eslint@9.15.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/types': 8.9.0 - '@typescript-eslint/utils': 8.9.0(eslint@9.15.0)(typescript@5.6.3) + '@typescript-eslint/types': 8.15.0 + '@typescript-eslint/utils': 8.15.0(eslint@9.15.0)(typescript@5.6.3) eslint: 9.15.0 - minimatch: 9.0.5 - natural-compare-lite: 1.4.0 + natural-orderby: 5.0.0 transitivePeerDependencies: - supports-color - typescript @@ -6850,10 +6781,10 @@ snapshots: napi-build-utils@1.0.2: {} - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} + natural-orderby@5.0.0: {} + neo-async@2.6.2: {} nerf-dart@1.0.0: {}