From 0c106dd71baa97372020dd3ac8a48b1a1eeca340 Mon Sep 17 00:00:00 2001 From: Dimitri POSTOLOV Date: Tue, 10 Dec 2024 20:44:35 +0700 Subject: [PATCH] upd upd upd upd upd upd upd package.json fix typecheck upd graphql-eslint fix lint try fix lockfile fixes fixes added v3 -> v4 test config (post-migration) to validate configuration added a migration and a migration testing for v3 -> v4 existing configs added more tests to v4 migration, fixed migration testing, added more snapshots reproduce issues with no-unreachable-types ok fix lint fix fixes lockfile fix refactor migration impl improve rules processing use new column to store migrated config, use new column --- .eslintrc.cjs | 22 +- .../tests/api/policy/policy-check.spec.ts | 161 ++ .../api/policy/policy-v4-upgrade.spec.ts | 1878 +++++++++++++++++ package.json | 7 +- .../2025.03.26T00-00-00.graphql-eslint.v4.ts | 141 ++ packages/migrations/src/run-pg-migrations.ts | 1 + ...T00-00-00.policy-eslint-v4-upgrade.test.ts | 262 +++ packages/migrations/test/root.ts | 1 + packages/services/policy/package.json | 6 +- packages/services/policy/src/api.ts | 8 +- packages/services/policy/src/policy.ts | 139 +- packages/services/policy/src/rules.ts | 41 +- packages/services/storage/src/db/types.ts | 1 + packages/services/storage/src/index.ts | 10 +- .../organization/billing/Billing.tsx | 1 + .../organization/billing/PlanSummary.tsx | 1 + .../billing/ProPlanBillingWarm.tsx | 1 + .../components/organization/members/list.tsx | 1 + .../project/settings/external-composition.tsx | 2 + .../target/history/errors-and-changes.tsx | 1 + .../web/app/src/components/ui/user-menu.tsx | 1 + .../app/src/pages/organization-members.tsx | 1 + .../app/src/pages/organization-settings.tsx | 2 + .../app/src/pages/target-checks-single.tsx | 1 + ...graphql-eslint__eslint-plugin@3.20.1.patch | 122 -- patches/eslint.patch | 13 + patches/eslint@8.57.1.patch | 26 - pnpm-lock.yaml | 969 ++++++--- rules/enforce-deps-in-dev.cjs | 21 + 29 files changed, 3258 insertions(+), 583 deletions(-) create mode 100644 integration-tests/tests/api/policy/policy-v4-upgrade.spec.ts create mode 100644 packages/migrations/src/actions/2025.03.26T00-00-00.graphql-eslint.v4.ts create mode 100644 packages/migrations/test/2025.03.26T00-00-00.policy-eslint-v4-upgrade.test.ts delete mode 100644 patches/@graphql-eslint__eslint-plugin@3.20.1.patch create mode 100644 patches/eslint.patch delete mode 100644 patches/eslint@8.57.1.patch diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 6e31851af6..89487eb1f3 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -5,13 +5,6 @@ const guildConfig = require('@theguild/eslint-config/base'); const { REACT_RESTRICTED_SYNTAX, RESTRICTED_SYNTAX } = require('@theguild/eslint-config/constants'); const path = require('path'); -const SCHEMA_PATH = './packages/services/api/src/modules/*/module.graphql.ts'; -const OPERATIONS_PATHS = [ - './packages/web/app/**/*.ts', - './packages/web/app/**/*.tsx', - './packages/web/app/**/*.graphql', -]; - const rulesToExtends = Object.fromEntries( Object.entries(guildConfig.rules).filter(([key]) => [ @@ -70,20 +63,25 @@ module.exports = { parser: '@graphql-eslint/eslint-plugin', plugins: ['@graphql-eslint'], parserOptions: { - schema: SCHEMA_PATH, - operations: OPERATIONS_PATHS, + graphQLConfig: { + schema: './packages/services/api/src/modules/*/module.graphql.ts', + documents: [ + './packages/web/app/**/*.ts', + './packages/web/app/**/*.tsx', + './packages/web/app/**/*.graphql', + ], + }, }, }, { // Setup processor for operations/fragments definitions on code-files - files: ['packages/web/app/**/*.tsx', 'packages/web/app/**/*.ts'], + files: ['packages/web/app/**/*.{ts,tsx}'], processor: '@graphql-eslint/graphql', }, { files: ['packages/web/app/**/*.graphql'], - plugins: ['@graphql-eslint'], rules: { - '@graphql-eslint/require-id-when-available': 'error', + '@graphql-eslint/require-selections': 'error', '@graphql-eslint/no-deprecated': 'error', }, }, diff --git a/integration-tests/tests/api/policy/policy-check.spec.ts b/integration-tests/tests/api/policy/policy-check.spec.ts index d58adc1bf5..92431f13aa 100644 --- a/integration-tests/tests/api/policy/policy-check.spec.ts +++ b/integration-tests/tests/api/policy/policy-check.spec.ts @@ -17,6 +17,167 @@ export const createPolicy = (level: RuleInstanceSeverityLevel): SchemaPolicyInpu describe('Schema policy checks', () => { describe('model: composite', () => { + it('no-unreachable-types issue: directives are not scanned/marked as unused', async () => { + const policyObject: SchemaPolicyInput = { + rules: [ + { + ruleId: 'no-unreachable-types', + severity: RuleInstanceSeverityLevel.Error, + }, + ], + }; + + const { tokens, policy } = await prepareProject(ProjectType.Federation); + await policy.setOrganizationSchemaPolicy(policyObject, true); + const cli = createCLI(tokens.registry); + + await cli.publish({ + sdl: /* GraphQL */ ` + type Query { + a: String! + } + `, + serviceName: 'a', + serviceUrl: 'https://api.com/a', + expect: 'latest-composable', + }); + + await cli.publish({ + sdl: /* GraphQL */ ` + type Query { + b: String! + } + `, + serviceName: 'b', + serviceUrl: 'https://api.com/b', + expect: 'latest-composable', + }); + + // In this example, the policy checks sees the "hasRole" directive in the schema + // because we are using composeDirective. + const rawMessage = await cli.check({ + sdl: /* GraphQL */ ` + extend schema + @link(url: "https://specs.apollo.dev/link/v1.0") + @link(url: "https://specs.apollo.dev/federation/v2.3", import: ["@composeDirective"]) + @link(url: "https://myspecs.dev/myDirective/v1.0", import: ["@hasRole"]) + @composeDirective(name: "@hasRole") + + scalar Unused + + scalar Used + + scalar UsedInInput + + directive @hasRole(role: Role!) on QUERY | MUTATION | FIELD_DEFINITION + + enum Role { + admin + user + } + + enum Permission { + read + write + create + delete + } + + type Query { + userRole(roleID: Int!): UserRole! @hasRole(role: admin) + scalar(input: UsedInInput!): Used + } + + type UserRole { + id: ID! + name: String! + } + `, + serviceName: 'c', + expect: 'rejected', + }); + const message = stripAnsi(rawMessage); + + expect(message).toContain(`Detected 2 errors`); + expect(message.split('\n').slice(1)).toEqual([ + '✖ Detected 2 errors', + '', + ' - Scalar type `Unused` is unreachable. (source: policy-no-unreachable-types)', + ' - Enum type `Permission` is unreachable. (source: policy-no-unreachable-types)', + '', + 'ℹ Detected 9 changes', + '', + ' Safe changes:', + ' - Type Permission was added', + ' - Type Role was added', + ' - Type Unused was added', + ' - Type Used was added', + ' - Type UsedInInput was added', + ' - Type UserRole was added', + ' - Field scalar was added to object type Query', + ' - Field userRole was added to object type Query', + ' - Directive hasRole was added', + '', + 'View full report:', + expect.any(String), + '', + ]); + + // But in this one, we are not using composeDirective, so the final compose directive + // is not visible by the policy checker, and the policy checker will not detect it. + // This is why it's being reported an unused, and also other related inputs/types. + const rawMessage2 = await cli.check({ + sdl: /* GraphQL */ ` + scalar Unused + + scalar Used + + scalar UsedInInput + + directive @hasRole(role: Role!) on QUERY | MUTATION | FIELD_DEFINITION + + enum Role { + admin + user + } + + enum Permission { + read + write + create + delete + } + + type Query { + userRole(roleID: Int!): UserRole! @hasRole(role: admin) + scalar(input: UsedInInput!): Used + } + + type UserRole { + id: ID! + name: String! + } + `, + serviceName: 'c', + expect: 'rejected', + }); + const message2 = stripAnsi(rawMessage2); + + expect(message2).toContain(`Detected 4 errors`); + expect(message2).toContain( + `Scalar type \`Unused\` is unreachable. (source: policy-no-unreachable-types)`, + ); + expect(message2).toContain( + `Directive \`hasRole\` is unreachable. (source: policy-no-unreachable-types)`, + ); + expect(message2).toContain( + `Enum type \`Role\` is unreachable. (source: policy-no-unreachable-types)`, + ); + expect(message2).toContain( + `Enum type \`Permission\` is unreachable. (source: policy-no-unreachable-types)`, + ); + }); + it('Federation project with policy with only warnings, should check only the part that was changed', async () => { const { tokens, policy } = await prepareProject(ProjectType.Federation); await policy.setOrganizationSchemaPolicy( diff --git a/integration-tests/tests/api/policy/policy-v4-upgrade.spec.ts b/integration-tests/tests/api/policy/policy-v4-upgrade.spec.ts new file mode 100644 index 0000000000..f64b86b825 --- /dev/null +++ b/integration-tests/tests/api/policy/policy-v4-upgrade.spec.ts @@ -0,0 +1,1878 @@ +import { ProjectType, RuleInstanceSeverityLevel, SchemaPolicyInput } from 'testkit/gql/graphql'; +import { prepareProject } from 'testkit/registry-models'; +import { GraphQLESLintRule, rules } from '@graphql-eslint/eslint-plugin'; +import { createCLI } from '../../../testkit/cli'; + +type Unpacked = T extends (infer U)[] ? U : T; +type ESLintLikeConfig = { + [Property in keyof typeof rules]?: + | [0 | 1 | 2] + | [ + 0 | 1 | 2, + (typeof rules)[Property] extends GraphQLESLintRule ? Unpacked : never, + ]; +}; + +const createPolicyFromESLint = (eslintConfig: ESLintLikeConfig): SchemaPolicyInput => { + const rules = Object.entries(eslintConfig).map(([ruleId, [severity, options]]) => ({ + ruleId, + severity: + severity === 0 + ? RuleInstanceSeverityLevel.Off + : severity === 1 + ? RuleInstanceSeverityLevel.Warning + : RuleInstanceSeverityLevel.Error, + configuration: options, + })); + + return { + rules, + }; +}; + +describe('v3 -> v4 config migration', () => { + const samples: ESLintLikeConfig[] = [ + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'require-description': [1, { EnumTypeDefinition: true }], + 'require-type-pattern-with-oneof': [1], + }, + {}, + { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition'], + values: true, + arguments: ['FieldDefinition'], + definitions: true, + }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + 'require-field-of-type-query-in-mutation-result': [1], + }, + { + 'require-deprecation-date': [1, { argumentName: 'deletionDate' }], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition'], + values: true, + arguments: ['FieldDefinition'], + definitions: false, + }, + ], + }, + { + 'input-name': [ + 2, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: false, + }, + ], + 'relay-arguments': [1, { includeBoth: false }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 2, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: false }, + ], + 'no-typename-prefix': [1], + 'no-unreachable-types': [1], + 'relay-connection-types': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'relay-arguments': [1, { includeBoth: false }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: false, listTypeCanWrapOnlyEdgeType: true }, + ], + 'naming-convention': [ + 1, + { + types: { style: 'PascalCase', forbiddenSuffixes: ['Failure'] }, + Argument: { + style: 'camelCase', + forbiddenPrefixes: ['userUuid'], + forbiddenSuffixes: ['UserId', 'userUuid'], + }, + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: { style: 'UPPER_CASE', ignorePattern: '^federation_' }, + InputValueDefinition: { style: 'camelCase', forbiddenSuffixes: ['UserId'] }, + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['post', 'put', 'mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription', 'subscribe'], + forbiddenSuffixes: ['Subscription'], + }, + 'FieldDefinition[parent.name.value=/.*(Error|Exception)/]': { + forbiddenPrefixes: ['message'], + forbiddenSuffixes: ['Message'], + }, + }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { + exceptions: { + types: [ + 'MonetaryAmount', + 'PageInfo', + 'MarketReturn', + 'InvestmentCategory', + 'SecurityHeadline', + 'ETFPrice', + 'StatementLink', + 'Eligibility', + 'Image', + 'StringKeyAsset', + ], + suffixes: ['CurrencyAmount', 'Error', 'Exception', 'Failure'], + }, + acceptedIdNames: ['id'], + acceptedIdTypes: ['ID'], + }, + ], + 'relay-connection-types': [1], + 'require-nullable-result-in-root': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + }, + { + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [1, { acceptedIdNames: ['id'], acceptedIdTypes: ['ID'] }], + 'require-description': [1, { types: true, rootField: true, DirectiveDefinition: true }], + 'no-unreachable-types': [1], + 'no-hashtag-description': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: false, + }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'no-hashtag-description': [1], + 'require-deprecation-date': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'description-style': [1, { style: 'block' }], + 'strict-id-in-types': [1, { acceptedIdTypes: ['ID'] }], + 'relay-connection-types': [1], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { + exceptions: { suffixes: ['Filter', 'Connection'] }, + acceptedIdNames: ['id', 'identity'], + acceptedIdTypes: ['ID'], + }, + ], + 'require-deprecation-reason': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + }, + { + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition', 'InterfaceTypeDefinition', 'InputObjectTypeDefinition'], + arguments: ['Field', 'FieldDefinition'], + definitions: false, + }, + ], + }, + { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition', 'InterfaceTypeDefinition', 'InputObjectTypeDefinition'], + values: true, + arguments: ['FieldDefinition', 'Field', 'DirectiveDefinition', 'Directive'], + definitions: false, + }, + ], + 'no-root-type': [1, { disallow: ['mutation', 'subscription'] }], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: true }, + ], + 'description-style': [1, { style: 'inline' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [1, { acceptedIdNames: ['id'], acceptedIdTypes: ['ID'] }], + 'require-description': [ + 1, + { + types: true, + rootField: true, + FieldDefinition: true, + EnumTypeDefinition: true, + DirectiveDefinition: true, + EnumValueDefinition: true, + OperationDefinition: true, + UnionTypeDefinition: true, + InputValueDefinition: true, + ObjectTypeDefinition: true, + ScalarTypeDefinition: true, + InterfaceTypeDefinition: true, + InputObjectTypeDefinition: true, + }, + ], + 'no-unreachable-types': [1], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-date': [1], + 'require-deprecation-reason': [1], + 'require-nullable-result-in-root': [1], + 'require-type-pattern-with-oneof': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + 'require-field-of-type-query-in-mutation-result': [1], + }, + { + 'naming-convention': [ + 1, + { + FieldDefinition: 'camelCase', + InputValueDefinition: { style: 'camelCase' }, + ObjectTypeDefinition: { style: 'PascalCase' }, + InputObjectTypeDefinition: { style: 'PascalCase', requiredSuffixes: ['Input'] }, + 'FieldDefinition[parent.name.value=Query]': { + style: 'camelCase', + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + style: 'camelCase', + forbiddenSuffixes: ['Mutation'], + }, + }, + ], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { exceptions: {}, acceptedIdNames: ['id'], acceptedIdTypes: ['ID'] }, + ], + 'require-description': [1, { OperationDefinition: true }], + 'no-unreachable-types': [1], + 'no-hashtag-description': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { 'strict-id-in-types': [1, { acceptedIdNames: ['id'], acceptedIdTypes: ['ID'] }] }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: false, + }, + ], + alphabetize: [1, { values: true, definitions: false }], + 'relay-arguments': [1, { includeBoth: false }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: false, shouldImplementNode: false, listTypeCanWrapOnlyEdgeType: false }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: { + style: 'PascalCase', + forbiddenPrefixes: ['Type', 'type'], + forbiddenSuffixes: ['Type', 'type'], + }, + Argument: 'camelCase', + FieldDefinition: 'camelCase', + EnumTypeDefinition: { + forbiddenPrefixes: ['enum', 'Enum'], + forbiddenSuffixes: ['enum', 'Enum'], + }, + FragmentDefinition: { + style: 'PascalCase', + forbiddenPrefixes: ['Fragment'], + forbiddenSuffixes: ['Fragment'], + }, + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + UnionTypeDefinition: { + style: 'PascalCase', + forbiddenPrefixes: ['union', 'Union'], + forbiddenSuffixes: ['union', 'Union'], + }, + InputValueDefinition: 'camelCase', + ObjectTypeDefinition: { forbiddenPrefixes: ['Type'], forbiddenSuffixes: ['Type'] }, + InterfaceTypeDefinition: { + style: 'PascalCase', + forbiddenPrefixes: ['interface', 'Interface'], + forbiddenSuffixes: ['interface', 'Interface'], + }, + InputObjectTypeDefinition: 'PascalCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get', 'list'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + requiredPrefixes: ['create', 'update', 'delete', 'terminate', 'add', 'remove'], + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'relay-connection-types': [1], + 'require-deprecation-reason': [1], + }, + { 'no-unreachable-types': [1] }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: false, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + alphabetize: [1, { definitions: false }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition', 'InterfaceTypeDefinition', 'InputObjectTypeDefinition'], + values: true, + arguments: ['FieldDefinition', 'Field', 'DirectiveDefinition'], + definitions: true, + }, + ], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: false }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + allowLeadingUnderscore: true, + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: [ + 'query', + 'create', + 'delete', + 'get', + 'is', + 'remove', + 'set', + 'update', + ], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: [ + 'mutation', + 'create', + 'delete', + 'get', + 'is', + 'remove', + 'set', + 'update', + ], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'require-description': [1, { rootField: true }], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: false, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'require-description': [ + 1, + { + types: true, + EnumTypeDefinition: true, + EnumValueDefinition: true, + UnionTypeDefinition: true, + InputValueDefinition: true, + ScalarTypeDefinition: true, + InterfaceTypeDefinition: true, + }, + ], + }, + { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition', 'InterfaceTypeDefinition', 'InputObjectTypeDefinition'], + values: true, + arguments: ['Field', 'Directive', 'DirectiveDefinition', 'FieldDefinition'], + definitions: true, + }, + ], + 'relay-arguments': [1, { includeBoth: true }], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + }, + { + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: false }, + ], + 'description-style': [1, { style: 'block' }], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-date': [1], + 'require-deprecation-reason': [1], + 'require-nullable-result-in-root': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: false, + }, + ], + 'no-typename-prefix': [1], + 'require-description': [ + 1, + { + types: true, + DirectiveDefinition: true, + ScalarTypeDefinition: true, + InterfaceTypeDefinition: true, + }, + ], + 'require-nullable-fields-with-oneof': [1], + }, + { 'require-deprecation-reason': [1] }, + { + 'require-description': [ + 1, + { + types: true, + DirectiveDefinition: true, + ScalarTypeDefinition: true, + InterfaceTypeDefinition: true, + }, + ], + }, + { alphabetize: [1, { definitions: false }] }, + { + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: true }, + ], + 'relay-connection-types': [1], + }, + { 'require-deprecation-reason': [1] }, + { + 'require-description': [ + 1, + { + types: true, + rootField: true, + FieldDefinition: true, + EnumTypeDefinition: true, + DirectiveDefinition: true, + EnumValueDefinition: true, + OperationDefinition: true, + UnionTypeDefinition: true, + InputValueDefinition: true, + ObjectTypeDefinition: true, + ScalarTypeDefinition: true, + InterfaceTypeDefinition: true, + InputObjectTypeDefinition: true, + }, + ], + }, + { + 'strict-id-in-types': [ + 1, + { + exceptions: { + types: ['Tag', 'Member', 'GeoPosition', 'Schedule'], + suffixes: ['Filter', 'Connection', 'Metric', 'Metrics', 'Value'], + }, + acceptedIdNames: ['id', 'identity', 'operationId'], + acceptedIdTypes: ['ID'], + }, + ], + }, + { + 'no-root-type': [1, { disallow: ['subscription'] }], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'description-style': [1, { style: 'block' }], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + }, + { 'strict-id-in-types': [0] }, + { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: false, + }, + ], + 'no-root-type': [1, { disallow: ['subscription'] }], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'PascalCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-unreachable-types': [1], + 'no-hashtag-description': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + }, + { + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: true }, + ], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: false, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + }, + { + 'input-name': [0], + alphabetize: [0], + 'relay-arguments': [0], + 'relay-page-info': [0], + 'relay-edge-types': [0], + 'naming-convention': [0], + 'no-typename-prefix': [0], + 'no-hashtag-description': [0], + 'relay-connection-types': [0], + 'require-deprecation-reason': [0], + 'no-scalar-result-type-on-mutation': [0], + 'unique-enum-value-names': [0], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'require-deprecation-reason': [1], + }, + { 'relay-page-info': [1], 'no-unreachable-types': [1] }, + { + 'no-root-type': [1, { disallow: ['subscription'] }], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'description-style': [1, { style: 'inline' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-date': [1], + 'require-deprecation-reason': [1], + 'require-type-pattern-with-oneof': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition', 'InterfaceTypeDefinition', 'InputObjectTypeDefinition'], + values: true, + arguments: ['FieldDefinition', 'Field', 'DirectiveDefinition'], + definitions: true, + }, + ], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: true }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: [ + 'query', + 'create', + 'delete', + 'get', + 'is', + 'remove', + 'set', + 'update', + ], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: [ + 'mutation', + 'create', + 'delete', + 'get', + 'is', + 'remove', + 'set', + 'update', + ], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'require-description': [1, { rootField: true }], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition', 'InterfaceTypeDefinition', 'InputObjectTypeDefinition'], + values: true, + arguments: ['FieldDefinition', 'Field', 'DirectiveDefinition', 'Directive'], + definitions: true, + }, + ], + 'no-root-type': [1, { disallow: ['mutation', 'subscription'] }], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + FragmentDefinition: { + style: 'PascalCase', + suffix: 'Fields', + requiredSuffixes: ['Fields'], + forbiddenPrefixes: ['Fragment'], + forbiddenSuffixes: ['Fragment'], + }, + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'EnumTypeDefinition,EnumTypeExtension': { + forbiddenPrefixes: ['Enum'], + forbiddenSuffixes: ['Enum'], + }, + 'UnionTypeDefinition,UnionTypeExtension': { + forbiddenPrefixes: ['Union'], + forbiddenSuffixes: ['Union'], + }, + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'ObjectTypeDefinition,ObjectTypeExtension': { + forbiddenPrefixes: ['Type'], + forbiddenSuffixes: ['Type'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'InterfaceTypeDefinition,InterfaceTypeExtension': { + forbiddenPrefixes: ['Interface'], + forbiddenSuffixes: ['Interface'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { + exceptions: { types: ['Error'], suffixes: ['Payload'] }, + acceptedIdNames: ['id', '_id'], + acceptedIdTypes: ['ID'], + }, + ], + 'no-unreachable-types': [1], + 'no-hashtag-description': [1], + 'require-deprecation-date': [1, { argumentName: 'deletionDate' }], + 'require-deprecation-reason': [1], + 'require-type-pattern-with-oneof': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + 'require-field-of-type-query-in-mutation-result': [1], + }, + { + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: true }, + ], + 'no-unreachable-types': [1], + 'relay-connection-types': [1], + 'require-deprecation-date': [1], + 'no-scalar-result-type-on-mutation': [1], + }, + { 'no-root-type': [1, { disallow: ['mutation'] }] }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: false, + }, + ], + 'no-typename-prefix': [1], + 'require-deprecation-reason': [1], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'require-deprecation-date': [1, { argumentName: 'deletionDate' }], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { 'no-unreachable-types': [0] }, + { alphabetize: [1, { definitions: false }] }, + { + 'require-description': [ + 1, + { + types: true, + FieldDefinition: false, + EnumTypeDefinition: false, + DirectiveDefinition: false, + OperationDefinition: false, + InputValueDefinition: false, + ScalarTypeDefinition: false, + InputObjectTypeDefinition: false, + }, + ], + 'require-deprecation-reason': [1], + }, + { 'no-unreachable-types': [1] }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: false, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'no-unreachable-types': [1], + 'require-deprecation-reason': [1], + }, + + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'PascalCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + }, + { + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: true }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 2, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'require-description': [ + 1, + { + types: true, + rootField: true, + FieldDefinition: true, + EnumTypeDefinition: true, + DirectiveDefinition: true, + OperationDefinition: true, + UnionTypeDefinition: true, + InputValueDefinition: true, + ObjectTypeDefinition: true, + ScalarTypeDefinition: true, + InterfaceTypeDefinition: true, + InputObjectTypeDefinition: true, + }, + ], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-reason': [1], + }, + { + 'naming-convention': [ + 1, + { + FieldDefinition: 'camelCase', + InputValueDefinition: { style: 'camelCase' }, + ObjectTypeDefinition: { style: 'PascalCase' }, + InputObjectTypeDefinition: { style: 'PascalCase', requiredSuffixes: ['Input'] }, + 'FieldDefinition[parent.name.value=Query]': { + style: 'camelCase', + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + style: 'camelCase', + forbiddenSuffixes: ['Mutation'], + }, + }, + ], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + }, + { + 'require-description': [ + 1, + { + types: true, + rootField: true, + FieldDefinition: true, + EnumTypeDefinition: true, + DirectiveDefinition: true, + EnumValueDefinition: true, + OperationDefinition: true, + UnionTypeDefinition: true, + InputValueDefinition: true, + ObjectTypeDefinition: true, + ScalarTypeDefinition: true, + InterfaceTypeDefinition: true, + InputObjectTypeDefinition: true, + }, + ], + }, + { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: true }, + ], + 'require-description': [ + 1, + { + types: true, + FieldDefinition: true, + EnumTypeDefinition: true, + InputValueDefinition: true, + ObjectTypeDefinition: true, + InputObjectTypeDefinition: true, + }, + ], + 'relay-connection-types': [1], + }, + { + 'no-root-type': [1, { disallow: ['subscription'] }], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'description-style': [1, { style: 'block' }], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: true, + }, + ], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: false }, + ], + 'naming-convention': [ + 1, + { types: 'PascalCase', FieldDefinition: 'camelCase', allowLeadingUnderscore: true }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { + exceptions: { + types: ['Aggregate', 'PageInfo', 'Color', 'Location', 'RGBA', 'RichText'], + suffixes: ['Connection', 'Edge'], + }, + acceptedIdNames: ['id'], + acceptedIdTypes: ['ID'], + }, + ], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'unique-enum-value-names': [1], + }, + { + 'no-root-type': [1, { disallow: ['subscription'] }], + 'relay-arguments': [1, { includeBoth: true }], + 'relay-page-info': [1], + 'description-style': [1, { style: 'inline' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-date': [1], + 'require-deprecation-reason': [1], + 'require-type-pattern-with-oneof': [1], + 'no-scalar-result-type-on-mutation': [1], + 'require-nullable-fields-with-oneof': [1], + 'unique-enum-value-names': [1], + }, + { + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get', 'list', 'fetch'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'require-description': [1, { types: true, rootField: true }], + 'no-unreachable-types': [1], + 'no-hashtag-description': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [0], + alphabetize: [0], + 'relay-arguments': [0], + 'relay-page-info': [0], + 'relay-edge-types': [0], + 'naming-convention': [0], + 'no-typename-prefix': [0], + 'no-hashtag-description': [0], + 'relay-connection-types': [0], + 'require-deprecation-reason': [0], + 'no-scalar-result-type-on-mutation': [0], + 'unique-enum-value-names': [0], + }, + { alphabetize: [1, { definitions: false }] }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: false, + }, + ], + 'relay-arguments': [1, { includeBoth: false }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: false, listTypeCanWrapOnlyEdgeType: false }, + ], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: { + style: 'UPPER_CASE', + ignorePattern: + '^(SuperAdmin|ElephantAdmin|Owner|Manager|Salesperson|Client|User|Inactive)', + }, + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { + exceptions: { + types: [ + 'CalendarIntegration', + 'PageInfo', + 'SuperAdminScope', + 'WebDomain', + 'ProfileItems', + 'BotSettings', + 'EmailEntry', + 'PhoneEntry', + 'TimeZoneOption', + 'JSONSchema', + 'JSONSchemaType', + 'JSONSchemaObject', + 'JSONSchemaArray', + 'JSONSchemaString', + 'JSONSchemaNumber', + 'JSONSchemaBoolean', + 'JSONSchemaNull', + 'Position', + 'SeatTierCounts', + 'TranscriptSentence', + 'TranscriptTimelineEntry', + 'SpeakerDetail', + ], + suffixes: ['Payload', 'Connection', 'Edge', 'Error', 'ZoomConfig', 'Attendee'], + }, + acceptedIdNames: ['id'], + acceptedIdTypes: ['ID'], + }, + ], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-date': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-unreachable-types': [1], + 'require-deprecation-reason': [1], + 'unique-enum-value-names': [1], + }, + { + 'input-name': [ + 1, + { + checkQueries: false, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: false, + }, + ], + alphabetize: [1, { values: true, definitions: false }], + 'relay-arguments': [1, { includeBoth: false }], + 'relay-page-info': [1], + 'relay-edge-types': [ + 1, + { withEdgeSuffix: true, shouldImplementNode: false, listTypeCanWrapOnlyEdgeType: true }, + ], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'no-typename-prefix': [1], + 'no-hashtag-description': [1], + 'relay-connection-types': [1], + 'require-deprecation-reason': [1], + 'no-scalar-result-type-on-mutation': [1], + 'unique-enum-value-names': [1], + }, + ]; + + for (const [index, sample] of samples.entries()) { + it(`check config sample #${index}`, async () => { + const policyObject = createPolicyFromESLint(sample); + const { policy, tokens } = await prepareProject(ProjectType.Single); + // Validates that the polict passes the config validations + const response = await policy.setOrganizationSchemaPolicy(policyObject, true); + expect(response.error).toEqual(null); + + const cli = createCLI(tokens.registry); + await cli.publish({ + sdl: /* GraphQL */ ` + """ + Main query entrypoint + """ + type Query { + """ + test + """ + foo: String! + } + `, + expect: 'latest-composable', + }); + + // Validates that the policy pass runtime check + await cli.check({ + sdl: /* GraphQL */ ` + type Query { + """ + test + """ + bar: String! + """ + test + """ + foo: String! + } + `, + expect: 'approved', + }); + }); + } +}); diff --git a/package.json b/package.json index 3a3a7fa7e9..a8e6760abd 100644 --- a/package.json +++ b/package.json @@ -65,10 +65,10 @@ "@graphql-codegen/typescript-operations": "4.5.1", "@graphql-codegen/typescript-resolvers": "4.4.4", "@graphql-codegen/urql-introspection": "3.0.0", - "@graphql-eslint/eslint-plugin": "3.20.1", + "@graphql-eslint/eslint-plugin": "4.4.0", "@graphql-inspector/cli": "4.0.3", "@manypkg/get-packages": "2.2.2", - "@next/eslint-plugin-next": "14.2.23", + "@next/eslint-plugin-next": "15.0.4", "@parcel/watcher": "2.5.0", "@sentry/cli": "2.40.0", "@swc/core": "1.10.6", @@ -123,9 +123,8 @@ "mjml-core@4.14.0": "patches/mjml-core@4.14.0.patch", "@apollo/federation@0.38.1": "patches/@apollo__federation@0.38.1.patch", "@theguild/editor@1.2.5": "patches/@theguild__editor@1.2.5.patch", - "eslint@8.57.1": "patches/eslint@8.57.1.patch", - "@graphql-eslint/eslint-plugin@3.20.1": "patches/@graphql-eslint__eslint-plugin@3.20.1.patch", "got@14.4.7": "patches/got@14.4.7.patch", + "eslint": "patches/eslint.patch", "slonik@30.4.4": "patches/slonik@30.4.4.patch", "@oclif/core@3.26.6": "patches/@oclif__core@3.26.6.patch", "oclif": "patches/oclif.patch", diff --git a/packages/migrations/src/actions/2025.03.26T00-00-00.graphql-eslint.v4.ts b/packages/migrations/src/actions/2025.03.26T00-00-00.graphql-eslint.v4.ts new file mode 100644 index 0000000000..508c7cca59 --- /dev/null +++ b/packages/migrations/src/actions/2025.03.26T00-00-00.graphql-eslint.v4.ts @@ -0,0 +1,141 @@ +import { z } from 'zod'; +import { type MigrationExecutor } from '../pg-migrator'; + +const ESLintRuleSchema = z.union([z.literal(0), z.literal(1), z.literal(2)]); +const RuleStructSchema = z.union([ + z.tuple([ESLintRuleSchema]), + z.tuple([ESLintRuleSchema, z.any()]), +]); +const V3ConfigSchema = z.record(z.string(), RuleStructSchema); + +const QUERY_RESULT = z.array( + z.object({ + resourceType: z.string(), + resourceId: z.string(), + jsonConfig: V3ConfigSchema, + }), +); + +type RuleStruct = z.infer; +type V3Config = z.infer; +type V4Config = z.infer; // same really here, just for semantics + +export default { + name: '2025.03.26T00-00-00.graphql-eslint.v4.ts', + noTransaction: true, + run: async ({ sql, connection }) => { + console.log('Preparing policy config table with a new column (config_v4)...'); + await connection.query( + sql`ALTER TABLE + schema_policy_config + ADD COLUMN IF NOT EXISTS "config_v4" jsonb`, + ); + + console.log('Looking for existing schema_policy_config objects...'); + + const existingV3Configs = await connection.query( + sql` + SELECT + resource_type as "resourceType", + resource_id as "resourceId", + config as "jsonConfig" + FROM schema_policy_config`, + ); + + if (existingV3Configs.rowCount === 0) { + console.log('No records found for schema_policy_config.'); + return; + } + + const rows = QUERY_RESULT.parse(existingV3Configs.rows); + + for (const config of rows) { + try { + const { resourceType, resourceId, jsonConfig } = config; + + if (jsonConfig && typeof jsonConfig === 'object') { + const v4Config = migrateConfig(jsonConfig); + + await connection.query( + sql`UPDATE schema_policy_config SET config_v4 = ${sql.json(v4Config)} WHERE resource_type = ${resourceType} AND resource_id = ${resourceId}`, + ); + console.log(`Migrated config for ${resourceType}:${resourceId}`); + } else { + console.log(`Invalid config for ${resourceType}:${resourceId}, skipping...`); + } + } catch (e) { + console.error('Error migrating config', config, e); + } + } + }, +} satisfies MigrationExecutor; + +function migrateConfig(v3Config: V3Config): V4Config { + return Object.keys(v3Config).reduce((acc, ruleName) => { + const ruleConfig = v3Config[ruleName]; + + if (Array.isArray(ruleConfig)) { + const [severity, options] = ruleConfig; + const newConfig = migrateRuleConfig(ruleName, options); + + if (newConfig.options) { + return { + ...acc, + [newConfig.ruleName]: [severity, newConfig.options], + }; + } + + return { + ...acc, + [newConfig.ruleName]: [severity], + }; + } + + return { + ...acc, + [ruleName]: ruleConfig, + }; + }, {} as V4Config); +} + +function migrateRuleConfig(ruleName: string, options: RuleStruct) { + switch (ruleName) { + case 'alphabetize': { + return { + ruleName: 'alphabetize', + options: alphabetize(options), + }; + } + // the only change here is the name of the rule. + case 'no-case-insensitive-enum-values-duplicates': { + return { + ruleName: 'unique-enum-value-names', + options, + }; + } + default: { + return { + ruleName, + options, + }; + } + } +} + +/** + * "alphabetize" changed "values" to a boolean instead of an array. If the array has value (can be only 1), we replace it with "true". + * Otherwise, "false". + */ +function alphabetize(cfgSource: RuleStruct): RuleStruct { + const cfg = JSON.parse(JSON.stringify(cfgSource)); + + if ('values' in cfg) { + if (Array.isArray(cfg.values) && cfg.values.length >= 1) { + cfg.values = true; + } else { + cfg.values = false; + } + } + + return cfg; +} diff --git a/packages/migrations/src/run-pg-migrations.ts b/packages/migrations/src/run-pg-migrations.ts index 521acf793c..fcc9fe7b33 100644 --- a/packages/migrations/src/run-pg-migrations.ts +++ b/packages/migrations/src/run-pg-migrations.ts @@ -162,5 +162,6 @@ export const runPGMigrations = async (args: { slonik: DatabasePool; runTo?: stri await import('./actions/2025.02.14T00-00-00.schema-versions-metadata'), await import('./actions/2025.02.21T00-00-00.schema-versions-metadata-attributes'), await import('./actions/2025.03.20T00-00-00.dangerous_breaking'), + await import('./actions/2025.03.26T00-00-00.graphql-eslint.v4'), ], }); diff --git a/packages/migrations/test/2025.03.26T00-00-00.policy-eslint-v4-upgrade.test.ts b/packages/migrations/test/2025.03.26T00-00-00.policy-eslint-v4-upgrade.test.ts new file mode 100644 index 0000000000..2f93ad417e --- /dev/null +++ b/packages/migrations/test/2025.03.26T00-00-00.policy-eslint-v4-upgrade.test.ts @@ -0,0 +1,262 @@ +import assert from 'node:assert'; +import { describe, test } from 'node:test'; +import { sql } from 'slonik'; +import { createStorage } from '../../services/storage/src/index'; +import { initMigrationTestingEnvironment } from './utils/testkit'; + +const TEST_CASES: Array<{ in: any; out: any }> = [ + { + in: { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition'], + values: ['EnumTypeDefinition'], + arguments: ['FieldDefinition'], + definitions: true, + }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'require-nullable-fields-with-oneof': [1], + 'no-case-insensitive-enum-values-duplicates': [1], + 'require-field-of-type-query-in-mutation-result': [1], + }, + out: { + 'input-name': [ + 1, + { + checkQueries: true, + checkInputType: true, + checkMutations: true, + caseSensitiveInputType: true, + }, + ], + alphabetize: [ + 1, + { + fields: ['ObjectTypeDefinition'], + values: true, + arguments: ['FieldDefinition'], + definitions: true, + }, + ], + 'description-style': [1, { style: 'block' }], + 'naming-convention': [ + 1, + { + types: 'PascalCase', + Argument: 'camelCase', + FieldDefinition: 'camelCase', + DirectiveDefinition: 'camelCase', + EnumValueDefinition: 'UPPER_CASE', + InputValueDefinition: 'camelCase', + 'FieldDefinition[parent.name.value=Query]': { + forbiddenPrefixes: ['query', 'get'], + forbiddenSuffixes: ['Query'], + }, + 'FieldDefinition[parent.name.value=Mutation]': { + forbiddenPrefixes: ['mutation'], + forbiddenSuffixes: ['Mutation'], + }, + 'FieldDefinition[parent.name.value=Subscription]': { + forbiddenPrefixes: ['subscription'], + forbiddenSuffixes: ['Subscription'], + }, + }, + ], + 'unique-enum-value-names': [1], + 'require-nullable-fields-with-oneof': [1], + 'require-field-of-type-query-in-mutation-result': [1], + }, + }, + { + in: { + 'input-name': [ + 2, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: true, + }, + ], + 'relay-arguments': [2, { includeBoth: true }], + 'relay-page-info': [2], + 'relay-edge-types': [ + 2, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: false }, + ], + 'naming-convention': [ + 1, + { types: 'PascalCase', FieldDefinition: 'camelCase', allowLeadingUnderscore: true }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { + exceptions: { + types: ['Aggregate', 'PageInfo', 'Color', 'Location', 'RGBA', 'RichText'], + suffixes: ['Connection', 'Edge'], + }, + acceptedIdNames: ['id'], + acceptedIdTypes: ['ID'], + }, + ], + 'no-hashtag-description': [1], + 'relay-connection-types': [2], + 'unique-enum-value-names': [1], + }, + out: { + 'input-name': [ + 2, + { + checkQueries: false, + checkInputType: true, + checkMutations: false, + caseSensitiveInputType: true, + }, + ], + 'relay-arguments': [2, { includeBoth: true }], + 'relay-page-info': [2], + 'relay-edge-types': [ + 2, + { withEdgeSuffix: true, shouldImplementNode: true, listTypeCanWrapOnlyEdgeType: false }, + ], + 'naming-convention': [ + 1, + { types: 'PascalCase', FieldDefinition: 'camelCase', allowLeadingUnderscore: true }, + ], + 'no-typename-prefix': [1], + 'strict-id-in-types': [ + 1, + { + exceptions: { + types: ['Aggregate', 'PageInfo', 'Color', 'Location', 'RGBA', 'RichText'], + suffixes: ['Connection', 'Edge'], + }, + acceptedIdNames: ['id'], + acceptedIdTypes: ['ID'], + }, + ], + 'no-hashtag-description': [1], + 'relay-connection-types': [2], + 'unique-enum-value-names': [1], + }, + }, + { + in: { + 'require-description': [ + 1, + { + types: true, + rootField: false, + FieldDefinition: false, + EnumTypeDefinition: false, + DirectiveDefinition: false, + OperationDefinition: false, + InputValueDefinition: false, + ScalarTypeDefinition: false, + InputObjectTypeDefinition: false, + }, + ], + 'require-deprecation-reason': [1], + }, + out: { + 'require-description': [ + 1, + { + types: true, + rootField: false, + FieldDefinition: false, + EnumTypeDefinition: false, + DirectiveDefinition: false, + OperationDefinition: false, + InputValueDefinition: false, + ScalarTypeDefinition: false, + InputObjectTypeDefinition: false, + }, + ], + 'require-deprecation-reason': [1], + }, + }, +]; + +await describe('migration: policy upgrade: graphql-eslint v3 -> v4', async () => { + for (const [index, testCase] of TEST_CASES.entries()) { + await test('should migrate all known breaking changes, sample ' + index, async () => { + const { db, runTo, complete, done, seed, connectionString } = + await initMigrationTestingEnvironment(); + const storage = await createStorage(connectionString, 1); + try { + // Run migrations all the way to the point before the one we are testing + await runTo('2025.03.20T00-00-00.dangerous_breaking.ts'); + + // Seed the database with some data (schema_sdl, supergraph_sdl, composite_schema_sdl) + const admin = await seed.user({ + user: { + name: 'test' + index, + email: `test_${Date.now()}@test.com`, + }, + }); + const organization = await seed.organization({ + organization: { + name: `org-${Date.now()}`, + }, + user: admin, + }); + + // Create an invitation to simulate a pending invitation + await db.query(sql` + INSERT INTO "schema_policy_config" ("resource_type", "resource_id", "config") VALUES ('ORGANIZATION', ${organization.id}, ${sql.jsonb(testCase.in)}); + `); + + // run the next migrations + await runTo('2025.03.26T00-00-00.graphql-eslint.v4.ts'); + + // assert scopes are still in place and identical + const newRecord = await db.one(sql` + SELECT config, config_v4 FROM schema_policy_config WHERE resource_id = ${organization.id}`); + + assert.deepStrictEqual(newRecord.config, testCase.in); + assert.deepStrictEqual(newRecord.config_v4, testCase.out); + + await complete(); + } finally { + await done(); + await storage.destroy(); + } + }); + } +}); diff --git a/packages/migrations/test/root.ts b/packages/migrations/test/root.ts index 345ce6570f..db8d68ecd5 100644 --- a/packages/migrations/test/root.ts +++ b/packages/migrations/test/root.ts @@ -4,3 +4,4 @@ import './2023.11.20T10-00-00.organization-member-roles.test'; import './2024.01.26T00.00.01.schema-check-purging.test'; import './2024.07.23T09.36.00.schema-cleanup-tracker.test'; import './2025.01.09T00-00-00.legacy-member-scopes.test'; +import './2025.03.26T00-00-00.policy-eslint-v4-upgrade.test'; diff --git a/packages/services/policy/package.json b/packages/services/policy/package.json index 976d026c0b..49c50c1f98 100644 --- a/packages/services/policy/package.json +++ b/packages/services/policy/package.json @@ -9,17 +9,17 @@ "typecheck": "tsc --noEmit" }, "devDependencies": { - "@graphql-eslint/eslint-plugin": "3.20.1", + "@graphql-eslint/eslint-plugin": "4.4.0", "@hive/service-common": "workspace:*", "@sentry/node": "7.120.2", "@sentry/tracing": "7.114.0", "@trpc/server": "10.45.2", - "@types/eslint": "8.56.12", "ajv": "8.17.1", "dotenv": "16.4.7", - "eslint": "8.57.1", + "eslint": "9.23.0", "fastify": "4.29.0", "graphql": "16.9.0", + "json-schema-to-ts": "3.1.1", "pino-pretty": "11.3.0", "zod": "3.24.1", "zod-validation-error": "3.4.0" diff --git a/packages/services/policy/src/api.ts b/packages/services/policy/src/api.ts index 459aff51ee..180e7545ca 100644 --- a/packages/services/policy/src/api.ts +++ b/packages/services/policy/src/api.ts @@ -64,10 +64,10 @@ export const schemaPolicyApiRouter = t.router({ availableRules: procedure.query(() => { return RELEVANT_RULES.map(([name, rule]) => ({ name, - description: rule.meta.docs?.description || '', - recommended: rule.meta.docs?.recommended ?? false, - url: rule.meta.docs?.url, - schema: normalizeAjvSchema(rule.meta.schema) as object | null, + description: rule.meta?.docs?.description || '', + recommended: rule.meta?.docs?.recommended ?? false, + url: rule.meta?.docs?.url, + schema: rule.meta?.schema ? normalizeAjvSchema(rule.meta?.schema) : undefined, })); }), validateConfig: procedure.input(CONFIG_CHECK_INPUT_VALIDATION).query(() => { diff --git a/packages/services/policy/src/policy.ts b/packages/services/policy/src/policy.ts index 828a7aa51b..0118eacd2c 100644 --- a/packages/services/policy/src/policy.ts +++ b/packages/services/policy/src/policy.ts @@ -1,7 +1,7 @@ import Ajv from 'ajv'; -import { Linter } from 'eslint'; +import { ESLint, Linter } from 'eslint'; import { z, ZodType } from 'zod'; -import { GraphQLESLintRule, parseForESLint, rules } from '@graphql-eslint/eslint-plugin'; +import { GraphQLESLintRule, parser, rules } from '@graphql-eslint/eslint-plugin'; import { RELEVANT_RULES } from './rules'; const ajv = new Ajv({ @@ -12,24 +12,23 @@ const ajv = new Ajv({ allowMatchingProperties: true, }); const linter = new Linter(); -linter.defineParser('@graphql-eslint/eslint-plugin', { parseForESLint }); -for (const [ruleId, rule] of Object.entries(rules)) { - linter.defineRule(ruleId, rule as any); -} - -const RULE_LEVEL = z.union([z.number().min(0).max(2), z.enum(['off', 'warn', 'error'])]); +const RULE_LEVEL = z.union([ + // + z.number().min(0).max(2), + z.enum(['off', 'warn', 'error']), +]); -type RulemapValidationType = { +type RuleMapValidationType = { [RuleKey in keyof typeof rules]: ZodType; }; export function normalizeAjvSchema( - schema: GraphQLESLintRule['meta']['schema'], -): GraphQLESLintRule['meta']['schema'] { + schema: NonNullable['schema'], +): NonNullable['schema'] { if (Array.isArray(schema)) { if (schema.length === 0) { - return null; + return []; } return { @@ -40,44 +39,48 @@ export function normalizeAjvSchema( }; } - return schema || null; + return schema; } export function createInputValidationSchema() { return z .object( RELEVANT_RULES.reduce((acc, [name, rule]) => { - const schema = normalizeAjvSchema(rule.meta.schema); + const schema = normalizeAjvSchema(rule.meta!.schema); const validate = schema ? ajv.compile(schema) : null; + const cfg = z.union([ + z.tuple([RULE_LEVEL]), + z.tuple( + validate + ? [ + RULE_LEVEL, + z.custom(data => { + const asArray = (Array.isArray(data) ? data : [data]).filter(Boolean); + const result = validate(asArray); + + if (result) { + return true; + } + + throw new Error( + `Failed to validate rule "${name}" configuration: ${ajv.errorsText( + validate.errors, + )}`, + ); + }), + ] + : [RULE_LEVEL], + ), + ]); return { ...acc, - [name]: z.union([ - z.tuple([RULE_LEVEL]), - z.tuple( - validate - ? [ - RULE_LEVEL, - z.custom(data => { - const asArray = (Array.isArray(data) ? data : [data]).filter(Boolean); - const result = validate(asArray); - - if (result) { - return true; - } - - throw new Error( - `Failed to validate rule "${name}" configuration: ${ajv.errorsText( - validate.errors, - )}`, - ); - }), - ] - : [RULE_LEVEL], - ), - ]), + // v3 rules were using just a raw name, and v4 rule is using the plugin name as prefix + // This fix should make sure both will work. + [name]: cfg, + [`@graphql-eslint/${name}`]: cfg, }; - }, {} as RulemapValidationType), + }, {} as RuleMapValidationType), ) .required() .partial() @@ -86,18 +89,68 @@ export function createInputValidationSchema() { export type PolicyConfigurationObject = z.infer>; +type NarrowPrefixKeys, Prefix extends string> = { + [K in keyof T as `${Prefix}${string & K}`]: T[K]; +}; + +type NormalizedPolicyConfigurationObject = NarrowPrefixKeys< + PolicyConfigurationObject, + '@graphql-eslint/' +>; + +/** + * Transforms v3/v4 policy to v4, ensuring "@graphql-eslint" prefix is used. + + * @param inputPolicy v3/v4 policy + * @returns v4 + */ +function normalizeInputPolicy( + inputPolicy: PolicyConfigurationObject, +): NormalizedPolicyConfigurationObject { + return Object.keys(inputPolicy).reduce((acc, key) => { + const normalizedKey = ( + key.startsWith('@graphql-eslint/') ? key : `@graphql-eslint/${key}` + ) as keyof NormalizedPolicyConfigurationObject; + + acc[normalizedKey] = inputPolicy[key as keyof PolicyConfigurationObject]; + return acc; + }, {} as NormalizedPolicyConfigurationObject); +} + export async function schemaPolicyCheck(input: { source: string; schema: string; policy: PolicyConfigurationObject; }) { - return linter.verify( + const normalizedPolicy = normalizeInputPolicy(input.policy); + + const rulesMap: Record = { + // "any" here is used because we have weird typing issues with v3 -> v4. + '@graphql-eslint': { rules: rules as any }, + }; + + const linterResult = linter.verify( input.source, { - parser: '@graphql-eslint/eslint-plugin', - parserOptions: { schema: input.schema }, - rules: input.policy, + files: ['*.graphql'], + plugins: rulesMap, + languageOptions: { + parser, + parserOptions: { + schemaSdl: input.schema, + filePath: 'schema.graphql', + }, + }, + rules: normalizedPolicy, }, 'schema.graphql', ); + + return linterResult.map(r => { + return { + ...r, + // v4 returns is a bit different from v3, so we need to handle it differently to keep the responses the same. + ruleId: r.ruleId?.replace('@graphql-eslint/', ''), + }; + }); } diff --git a/packages/services/policy/src/rules.ts b/packages/services/policy/src/rules.ts index 26ace4ee03..24973ad734 100644 --- a/packages/services/policy/src/rules.ts +++ b/packages/services/policy/src/rules.ts @@ -5,16 +5,16 @@ type RuleName = keyof AllRulesType; const SKIPPED_RULES: RuleName[] = [ // Skipped because in order to operate, it needs operations. - // Also it does not make sense to run it as part of a schema check. + // Also, it does not make sense to run it as part of a schema check. 'no-unused-fields', ]; -function isRelevantCategory(category?: CategoryType | CategoryType[]): boolean { - if (!category) { - return false; +function isRelevantCategory(category: CategoryType | CategoryType[]): boolean { + if (Array.isArray(category)) { + return category.includes('Schema'); } - return Array.isArray(category) ? category.includes('Schema') : category === 'Schema'; + return category === 'Schema'; } // Some rules have configurations for operations (like "alphabetize") and we do not want to expose them. @@ -22,37 +22,32 @@ function patchRulesConfig( ruleName: T, ruleDef: AllRulesType[T], ): GraphQLESLintRule { + const { schema } = ruleDef.meta as any; switch (ruleName) { case 'alphabetize': { // Remove operation-specific configurations - delete ruleDef.meta.schema.items.properties.selections; - delete ruleDef.meta.schema.items.properties.variables; + delete schema.items.properties.selections; + delete schema.items.properties.variables; break; } case 'naming-convention': { // Remove operation-specific configurations - delete ruleDef.meta.schema.items.properties.VariableDefinition; - delete ruleDef.meta.schema.items.properties.OperationDefinition; + delete schema.items.properties.VariableDefinition; + delete schema.items.properties.OperationDefinition; - // Get rid of "definitions" references becuse it's breaking Monaco editor in the frontend - Object.entries(ruleDef.meta.schema.items.properties).forEach(([, propDef]) => { + // Get rid of "definitions" references because it's breaking Monaco editor in the frontend + Object.entries(schema.items.properties).forEach(([, propDef]) => { if (propDef && typeof propDef === 'object' && 'oneOf' in propDef) { - propDef.oneOf = [ - ruleDef.meta.schema.definitions.asObject, - ruleDef.meta.schema.definitions.asString, - ]; + propDef.oneOf = [schema.definitions.asObject, schema.definitions.asString]; } }); - ruleDef.meta.schema.items.patternProperties = { + schema.items.patternProperties = { '^(Argument|DirectiveDefinition|EnumTypeDefinition|EnumValueDefinition|FieldDefinition|InputObjectTypeDefinition|InputValueDefinition|InterfaceTypeDefinition|ObjectTypeDefinition|ScalarTypeDefinition|UnionTypeDefinition)(.+)?$': { - oneOf: [ - ruleDef.meta.schema.definitions.asObject, - ruleDef.meta.schema.definitions.asString, - ], + oneOf: [schema.definitions.asObject, schema.definitions.asString], }, }; - delete ruleDef.meta.schema.definitions; + delete schema.definitions; break; } @@ -68,8 +63,8 @@ function patchRulesConfig( export const RELEVANT_RULES = Object.entries(rules) .filter( ([ruleName, rule]) => - isRelevantCategory(rule.meta.docs?.category) && - rule.meta.docs?.graphQLJSRuleName === undefined && + isRelevantCategory(rule.meta!.docs!.category!) && + rule.meta!.docs!.graphQLJSRuleName === undefined && !SKIPPED_RULES.includes(ruleName as RuleName), ) .map( diff --git a/packages/services/storage/src/db/types.ts b/packages/services/storage/src/db/types.ts index e76f4995b0..d7de0d10f1 100644 --- a/packages/services/storage/src/db/types.ts +++ b/packages/services/storage/src/db/types.ts @@ -310,6 +310,7 @@ export interface schema_log { export interface schema_policy_config { allow_overriding: boolean; config: any; + config_v4: any | null; created_at: Date; resource_id: string; resource_type: schema_policy_resource; diff --git a/packages/services/storage/src/index.ts b/packages/services/storage/src/index.ts index f04d43de5a..e57751e03b 100644 --- a/packages/services/storage/src/index.ts +++ b/packages/services/storage/src/index.ts @@ -153,7 +153,7 @@ export async function createStorage( function transformSchemaPolicy(schema_policy: schema_policy_config): SchemaPolicy { return { id: `${schema_policy.resource_type}_${schema_policy.resource_id}`, - config: schema_policy.config, + config: schema_policy.config_v4, createdAt: schema_policy.created_at, updatedAt: schema_policy.updated_at, resource: schema_policy.resource_type, @@ -3416,14 +3416,14 @@ export async function createStorage( async setSchemaPolicyForOrganization(input): Promise { const result = await pool.one(sql`/* setSchemaPolicyForOrganization */ INSERT INTO "schema_policy_config" - ("resource_type", "resource_id", "config", "allow_overriding") + ("resource_type", "resource_id", "config_v4", "allow_overriding") VALUES ('ORGANIZATION', ${input.organizationId}, ${sql.jsonb(input.policy)}, ${ input.allowOverrides }) ON CONFLICT (resource_type, resource_id) DO UPDATE - SET "config" = ${sql.jsonb(input.policy)}, + SET "config_v4" = ${sql.jsonb(input.policy)}, "allow_overriding" = ${input.allowOverrides}, "updated_at" = now() RETURNING *; @@ -3434,12 +3434,12 @@ export async function createStorage( async setSchemaPolicyForProject(input): Promise { const result = await pool.one(sql`/* setSchemaPolicyForProject */ INSERT INTO "schema_policy_config" - ("resource_type", "resource_id", "config") + ("resource_type", "resource_id", "config_v4") VALUES ('PROJECT', ${input.projectId}, ${sql.jsonb(input.policy)}) ON CONFLICT (resource_type, resource_id) DO UPDATE - SET "config" = ${sql.jsonb(input.policy)}, + SET "config_v4" = ${sql.jsonb(input.policy)}, "updated_at" = now() RETURNING *; `); diff --git a/packages/web/app/src/components/organization/billing/Billing.tsx b/packages/web/app/src/components/organization/billing/Billing.tsx index 4bc50675bf..c21cf985fd 100644 --- a/packages/web/app/src/components/organization/billing/Billing.tsx +++ b/packages/web/app/src/components/organization/billing/Billing.tsx @@ -17,6 +17,7 @@ const BillingView_OrganizationFragment = graphql(` const BillingView_QueryFragment = graphql(` fragment BillingView_QueryFragment on Query { billingPlans { + id planType ...PlanSummary_PlanFragment } diff --git a/packages/web/app/src/components/organization/billing/PlanSummary.tsx b/packages/web/app/src/components/organization/billing/PlanSummary.tsx index 05c4048402..472f470276 100644 --- a/packages/web/app/src/components/organization/billing/PlanSummary.tsx +++ b/packages/web/app/src/components/organization/billing/PlanSummary.tsx @@ -6,6 +6,7 @@ import { CurrencyFormatter } from './helpers'; const PriceEstimationTable_PlanFragment = graphql(` fragment PriceEstimationTable_PlanFragment on BillingPlan { + id includedOperationsLimit pricePerOperationsUnit basePrice diff --git a/packages/web/app/src/components/organization/billing/ProPlanBillingWarm.tsx b/packages/web/app/src/components/organization/billing/ProPlanBillingWarm.tsx index 5186d4a0c6..547dc60811 100644 --- a/packages/web/app/src/components/organization/billing/ProPlanBillingWarm.tsx +++ b/packages/web/app/src/components/organization/billing/ProPlanBillingWarm.tsx @@ -4,6 +4,7 @@ import { FragmentType, graphql, useFragment } from '@/gql'; const ProPlanBilling_OrganizationFragment = graphql(` fragment ProPlanBilling_OrganizationFragment on Organization { + id billingConfiguration { hasPaymentIssues } diff --git a/packages/web/app/src/components/organization/members/list.tsx b/packages/web/app/src/components/organization/members/list.tsx index 3c2d8ba262..433af34e96 100644 --- a/packages/web/app/src/components/organization/members/list.tsx +++ b/packages/web/app/src/components/organization/members/list.tsx @@ -289,6 +289,7 @@ const OrganizationMembers_OrganizationFragment = graphql(` nodes { id user { + id displayName } role { diff --git a/packages/web/app/src/components/project/settings/external-composition.tsx b/packages/web/app/src/components/project/settings/external-composition.tsx index 3c10e37394..ac380989ec 100644 --- a/packages/web/app/src/components/project/settings/external-composition.tsx +++ b/packages/web/app/src/components/project/settings/external-composition.tsx @@ -63,12 +63,14 @@ const ExternalCompositionForm_EnableMutation = graphql(` const ExternalCompositionForm_OrganizationFragment = graphql(` fragment ExternalCompositionForm_OrganizationFragment on Organization { + id slug } `); const ExternalCompositionForm_ProjectFragment = graphql(` fragment ExternalCompositionForm_ProjectFragment on Project { + id slug } `); diff --git a/packages/web/app/src/components/target/history/errors-and-changes.tsx b/packages/web/app/src/components/target/history/errors-and-changes.tsx index 22e317c03a..a4a8eafb48 100644 --- a/packages/web/app/src/components/target/history/errors-and-changes.tsx +++ b/packages/web/app/src/components/target/history/errors-and-changes.tsx @@ -48,6 +48,7 @@ const ChangesBlock_SchemaCheckConditionalBreakingChangeMetadataFragment = graphq settings { retentionInDays targets { + id slug target { id diff --git a/packages/web/app/src/components/ui/user-menu.tsx b/packages/web/app/src/components/ui/user-menu.tsx index a4ffd7c26d..73a7b4e240 100644 --- a/packages/web/app/src/components/ui/user-menu.tsx +++ b/packages/web/app/src/components/ui/user-menu.tsx @@ -77,6 +77,7 @@ const UserMenu_MeFragment = graphql(` const UserMenu_MemberFragment = graphql(` fragment UserMenu_MemberFragment on Member { + id canLeaveOrganization } `); diff --git a/packages/web/app/src/pages/organization-members.tsx b/packages/web/app/src/pages/organization-members.tsx index feadb9ebeb..d0e96505ce 100644 --- a/packages/web/app/src/pages/organization-members.tsx +++ b/packages/web/app/src/pages/organization-members.tsx @@ -108,6 +108,7 @@ function PageContent(props: { const OrganizationMembersPageQuery = graphql(` query OrganizationMembersPageQuery($organizationSlug: String!) { organization: organizationBySlug(organizationSlug: $organizationSlug) { + id ...OrganizationMembersPage_OrganizationFragment viewerCanSeeMembers } diff --git a/packages/web/app/src/pages/organization-settings.tsx b/packages/web/app/src/pages/organization-settings.tsx index 843c0c4b88..6a06ae15b9 100644 --- a/packages/web/app/src/pages/organization-settings.tsx +++ b/packages/web/app/src/pages/organization-settings.tsx @@ -65,6 +65,7 @@ const DeleteGitHubIntegrationMutation = graphql(` const GitHubIntegrationSection_OrganizationFragment = graphql(` fragment GitHubIntegrationSection_OrganizationFragment on Organization { + id hasGitHubIntegration slug } @@ -111,6 +112,7 @@ function GitHubIntegrationSection(props: { const SlackIntegrationSection_OrganizationFragment = graphql(` fragment SlackIntegrationSection_OrganizationFragment on Organization { + id hasSlackIntegration slug } diff --git a/packages/web/app/src/pages/target-checks-single.tsx b/packages/web/app/src/pages/target-checks-single.tsx index e300661ad4..bc15c4d75c 100644 --- a/packages/web/app/src/pages/target-checks-single.tsx +++ b/packages/web/app/src/pages/target-checks-single.tsx @@ -225,6 +225,7 @@ const ConditionalBreakingChangesMetadataSection_SchemaCheckFragment = graphql(` percentage excludedClientNames targets { + id slug target { id diff --git a/patches/@graphql-eslint__eslint-plugin@3.20.1.patch b/patches/@graphql-eslint__eslint-plugin@3.20.1.patch deleted file mode 100644 index fed5bc457e..0000000000 --- a/patches/@graphql-eslint__eslint-plugin@3.20.1.patch +++ /dev/null @@ -1,122 +0,0 @@ -diff --git a/esm/estree-converter/utils.js b/esm/estree-converter/utils.js -index f57ab7f17cfc19de13cc969ee32bf44d4f6c361f..6db8f13220171ba109b131db6d5ba5bf7249e87a 100644 ---- a/esm/estree-converter/utils.js -+++ b/esm/estree-converter/utils.js -@@ -1,11 +1,12 @@ --import { createRequire } from 'module'; --const require = createRequire(import.meta.url); -+// import { createRequire } from 'module'; -+// const require = createRequire(import.meta.url); - import "../chunk-BMTV3EA2.js"; - import { - isListType, - isNonNullType, - Source, -- TokenKind -+ TokenKind, -+ Lexer - } from "graphql"; - import { valueFromASTUntyped } from "graphql/utilities/valueFromASTUntyped.js"; - const valueFromNode = (...args) => { -@@ -41,15 +42,7 @@ function convertToken(token, type) { - }; - } - function getLexer(source) { -- const gqlLanguage = require("graphql/language"); -- if (gqlLanguage == null ? void 0 : gqlLanguage.createLexer) { -- return gqlLanguage.createLexer(source, {}); -- } -- const { Lexer: LexerCls } = require("graphql"); -- if (LexerCls && typeof LexerCls === "function") { -- return new LexerCls(source); -- } -- throw new Error("Unsupported GraphQL version! Please make sure to use GraphQL v14 or newer!"); -+ return new Lexer(source) - } - function extractTokens(filePath, code) { - const source = new Source(code, filePath); -diff --git a/esm/index.js b/esm/index.js -index c70680ab5ef5a04c71db529015e879f91aedf2cf..402b56f8d4b0109d58411e6a5c002b8f69fc40d6 100644 ---- a/esm/index.js -+++ b/esm/index.js -@@ -2,7 +2,7 @@ import "./chunk-BMTV3EA2.js"; - import { processor } from "./processor.js"; - import { parseForESLint } from "./parser.js"; - import { rules } from "./rules/index.js"; --export * from "./testkit.js"; -+// export * from "./testkit.js"; - export * from "./types.js"; - import { requireGraphQLSchemaFromContext, requireSiblingsOperations } from "./utils.js"; - const processors = { graphql: processor }; -diff --git a/esm/parser.js b/esm/parser.js -index 8dc131164b22e24c227d2296d16899a6abb4f692..b1870bc8472fe52e045eaa85b15fe0cac0f8c383 100644 ---- a/esm/parser.js -+++ b/esm/parser.js -@@ -3,10 +3,10 @@ import { parseGraphQLSDL } from "@graphql-tools/utils"; - import debugFactory from "debug"; - import { buildSchema, GraphQLError } from "graphql"; - import { convertToESTree, extractComments, extractTokens } from "./estree-converter/index.js"; --import { loadGraphQLConfig } from "./graphql-config.js"; -+// import { loadGraphQLConfig } from "./graphql-config.js"; - import { getSchema } from "./schema.js"; - import { getSiblings } from "./siblings.js"; --import { CWD, VIRTUAL_DOCUMENT_REGEX } from "./utils.js"; -+import { CWD, /*VIRTUAL_DOCUMENT_REGEX*/ } from "./utils.js"; - const debug = debugFactory("graphql-eslint:parser"); - debug("cwd %o", CWD); - function parseForESLint(code, options) { -@@ -18,9 +18,9 @@ function parseForESLint(code, options) { - ...options.graphQLParserOptions, - noLocation: false - }); -- const gqlConfig = loadGraphQLConfig(options); -- const realFilepath = filePath.replace(VIRTUAL_DOCUMENT_REGEX, ""); -- const project = gqlConfig.getProjectForFile(realFilepath); -+ // const gqlConfig = loadGraphQLConfig(options); -+ // const realFilepath = filePath.replace(VIRTUAL_DOCUMENT_REGEX, ""); -+ let project; - let schema = null; - try { - schema = project ? getSchema(project, options.schemaOptions) : typeof options.schema === "string" ? buildSchema(options.schema) : null; -diff --git a/esm/rules/graphql-js-validation.js b/esm/rules/graphql-js-validation.js -index d952cee1e10976459e7c5836b86ba6540c45fdb6..d314997bfd26477c7d823cad397eb5d65d147806 100644 ---- a/esm/rules/graphql-js-validation.js -+++ b/esm/rules/graphql-js-validation.js -@@ -1,5 +1,6 @@ --import { createRequire } from 'module'; --const require = createRequire(import.meta.url); -+// import { createRequire } from 'module'; -+// const require = createRequire(import.meta.url); -+import * as allGraphQLJSRules from 'graphql/validation/index.js' - import "../chunk-BMTV3EA2.js"; - import { - Kind, -@@ -112,16 +113,18 @@ const validationToRule = ({ - schema = [], - hasDidYouMeanSuggestions - }, docs) => { -- let ruleFn = null; -- try { -- ruleFn = require(`graphql/validation/rules/${ruleName}Rule`)[`${ruleName}Rule`]; -- } catch { -- try { -- ruleFn = require(`graphql/validation/rules/${ruleName}`)[`${ruleName}Rule`]; -- } catch { -- ruleFn = require("graphql/validation")[`${ruleName}Rule`]; -- } -- } -+ // let ruleFn = null; -+ // try { -+ // ruleFn = require(`graphql/validation/rules/${ruleName}Rule`)[`${ruleName}Rule`]; -+ // } catch { -+ // try { -+ // ruleFn = require(`graphql/validation/rules/${ruleName}`)[`${ruleName}Rule`]; -+ // } catch { -+ // ruleFn = require("graphql/validation")[`${ruleName}Rule`]; -+ // } -+ // } -+ let ruleFn = allGraphQLJSRules[`${ruleName}Rule`]; -+ - return { - [ruleId]: { - meta: { \ No newline at end of file diff --git a/patches/eslint.patch b/patches/eslint.patch new file mode 100644 index 0000000000..6706b2b74b --- /dev/null +++ b/patches/eslint.patch @@ -0,0 +1,13 @@ +diff --git a/lib/linter/node-event-generator.js b/lib/linter/node-event-generator.js +index 0eb2f8dc02bf1d602928b187915ed71d82f4a8ac..fedf8897d3e4d20761ea893878422fce6bd3a781 100644 +--- a/lib/linter/node-event-generator.js ++++ b/lib/linter/node-event-generator.js +@@ -9,7 +9,7 @@ + // Requirements + //------------------------------------------------------------------------------ + +-const esquery = require("esquery"); ++const esquery = require("esquery").default || require("esquery"); + + //------------------------------------------------------------------------------ + // Typedefs diff --git a/patches/eslint@8.57.1.patch b/patches/eslint@8.57.1.patch deleted file mode 100644 index 1ce4a26852..0000000000 --- a/patches/eslint@8.57.1.patch +++ /dev/null @@ -1,26 +0,0 @@ -diff --git a/lib/linter/node-event-generator.js b/lib/linter/node-event-generator.js -index d56bef2fa9defde5473775643accc90ced99a8a6..7262e1f41d80b883c076ad868d9afb618dd2ac7f 100644 ---- a/lib/linter/node-event-generator.js -+++ b/lib/linter/node-event-generator.js -@@ -9,7 +9,7 @@ - // Requirements - //------------------------------------------------------------------------------ - --const esquery = require("esquery"); -+const esquery = require("esquery").default || require("esquery"); - - //------------------------------------------------------------------------------ - // Typedefs -diff --git a/lib/rule-tester/rule-tester.js b/lib/rule-tester/rule-tester.js -index 48df3b79b943dc0f6138c9ca374c20bf8ed8863b..34100b71a3040cccce85690ebb292ca45ff6ab79 100644 ---- a/lib/rule-tester/rule-tester.js -+++ b/lib/rule-tester/rule-tester.js -@@ -52,7 +52,7 @@ const - - const ajv = require("../shared/ajv")({ strictDefaults: true }); - --const espreePath = require.resolve("espree"); -+const espreePath = ""; - const parserSymbol = Symbol.for("eslint.RuleTester.parser"); - - const { SourceCode } = require("../source-code"); \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efc45f86da..f8af39e695 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,9 +29,6 @@ patchedDependencies: '@graphql-codegen/schema-ast': hash: 2280c6d4f2e9268fc118d06dc95deea7e9b58200010db1b332004627d6793a9f path: patches/@graphql-codegen__schema-ast.patch - '@graphql-eslint/eslint-plugin@3.20.1': - hash: 695fba67df25ba9d46472c8398c94c6a2ccf75d902321d8f95150f68e940313e - path: patches/@graphql-eslint__eslint-plugin@3.20.1.patch '@oclif/core@3.26.6': hash: 7432c7b46bd5e3276faff9af4fc733575417c17a0ec31df3c7a229f766e3cffc path: patches/@oclif__core@3.26.6.patch @@ -47,9 +44,9 @@ patchedDependencies: countup.js: hash: 664547d4d5412a2891bfdfb34790bb773535102f8e26075dfafbd831d79f4410 path: patches/countup.js.patch - eslint@8.57.1: - hash: 08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0 - path: patches/eslint@8.57.1.patch + eslint: + hash: 31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e + path: patches/eslint.patch got@14.4.7: hash: f7660444905ddadee251ff98241119fb54f5fec1e673a428192da361d5636299 path: patches/got@14.4.7.patch @@ -116,8 +113,8 @@ importers: specifier: 3.0.0 version: 3.0.0(graphql@16.9.0) '@graphql-eslint/eslint-plugin': - specifier: 3.20.1 - version: 3.20.1(patch_hash=695fba67df25ba9d46472c8398c94c6a2ccf75d902321d8f95150f68e940313e)(@babel/core@7.22.9)(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) + specifier: 4.4.0 + version: 4.4.0(@apollo/subgraph@2.9.3(graphql@16.9.0))(@types/node@22.10.5)(encoding@0.1.13)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(graphql@16.9.0)(json-schema-to-ts@3.1.1)(typescript@5.7.3) '@graphql-inspector/cli': specifier: 4.0.3 version: 4.0.3(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) @@ -125,8 +122,8 @@ importers: specifier: 2.2.2 version: 2.2.2 '@next/eslint-plugin-next': - specifier: 14.2.23 - version: 14.2.23 + specifier: 15.0.4 + version: 15.0.4 '@parcel/watcher': specifier: 2.5.0 version: 2.5.0 @@ -138,7 +135,7 @@ importers: version: 1.10.6(@swc/helpers@0.5.15) '@theguild/eslint-config': specifier: 0.12.1 - version: 0.12.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) + version: 0.12.1(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) '@theguild/prettier-config': specifier: 2.0.7 version: 2.0.7(prettier@3.4.2) @@ -156,10 +153,10 @@ importers: version: 16.4.7 eslint: specifier: 8.57.1 - version: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + version: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) eslint-plugin-cypress: specifier: 4.1.0 - version: 4.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + version: 4.1.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) eslint-plugin-hive: specifier: file:rules version: link:rules @@ -1088,8 +1085,8 @@ importers: packages/services/policy: devDependencies: '@graphql-eslint/eslint-plugin': - specifier: 3.20.1 - version: 3.20.1(patch_hash=695fba67df25ba9d46472c8398c94c6a2ccf75d902321d8f95150f68e940313e)(@babel/core@7.26.0)(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) + specifier: 4.4.0 + version: 4.4.0(@apollo/subgraph@2.9.3(graphql@16.9.0))(@types/node@22.10.5)(encoding@0.1.13)(eslint@9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3))(graphql@16.9.0)(json-schema-to-ts@3.1.1)(typescript@5.7.3) '@hive/service-common': specifier: workspace:* version: link:../service-common @@ -1102,9 +1099,6 @@ importers: '@trpc/server': specifier: 10.45.2 version: 10.45.2 - '@types/eslint': - specifier: 8.56.12 - version: 8.56.12 ajv: specifier: 8.17.1 version: 8.17.1 @@ -1112,14 +1106,17 @@ importers: specifier: 16.4.7 version: 16.4.7 eslint: - specifier: 8.57.1 - version: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + specifier: 9.23.0 + version: 9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3) fastify: specifier: 4.29.0 version: 4.29.0 graphql: specifier: 16.9.0 version: 16.9.0 + json-schema-to-ts: + specifier: 3.1.1 + version: 3.1.1 pino-pretty: specifier: 11.3.0 version: 11.3.0 @@ -2659,6 +2656,10 @@ packages: resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.8': + resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} + engines: {node: '>=6.9.0'} + '@babel/core@7.22.9': resolution: {integrity: sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==} engines: {node: '>=6.9.0'} @@ -2667,10 +2668,18 @@ packages: resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} + '@babel/core@7.26.10': + resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.26.3': resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} engines: {node: '>=6.9.0'} + '@babel/generator@7.27.0': + resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} @@ -2679,6 +2688,10 @@ packages: resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.27.0': + resolution: {integrity: sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA==} + engines: {node: '>=6.9.0'} + '@babel/helper-create-class-features-plugin@7.24.5': resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} engines: {node: '>=6.9.0'} @@ -2749,13 +2762,13 @@ packages: resolution: {integrity: sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==} engines: {node: '>=6.9.0'} - '@babel/parser@7.26.10': - resolution: {integrity: sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==} + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.26.3': - resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + '@babel/parser@7.27.0': + resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} hasBin: true @@ -2790,6 +2803,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.23.3': resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} engines: {node: '>=6.9.0'} @@ -2945,10 +2964,18 @@ packages: resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==} engines: {node: '>=6.9.0'} + '@babel/template@7.27.0': + resolution: {integrity: sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.4': resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.0': + resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.10': resolution: {integrity: sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==} engines: {node: '>=6.9.0'} @@ -2957,6 +2984,10 @@ packages: resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} engines: {node: '>=6.9.0'} + '@babel/types@7.27.0': + resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} @@ -3471,14 +3502,46 @@ packages: resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.19.2': + resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.0': + resolution: {integrity: sha512-yJLLmLexii32mGrhW29qvU3QBVTu0GUmEf/J4XsBtVhp4JkIUFN/BjWqTF63yRvGApIDpZm5fa97LtYtINmfeQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.23.0': + resolution: {integrity: sha512-35MJ8vCPU0ZMxo7zfev2pypqTwWTofFZO6m4KAtdoFhRpLJUpHTZZ+KB3C7Hb1d7bULYwO4lJXGCi5Se+8OMbw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@esm2cjs/execa@6.1.1-cjs.1': resolution: {integrity: sha512-FHxfnmuDIjY1VS/BLzDkL8EkbcFvi8s6x1nYQ1Nyu0An0n88EJcGhDBcRWLFwt3C3nT7xwI+MwHRH1TZcAFW2w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3713,11 +3776,19 @@ packages: peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - '@graphql-eslint/eslint-plugin@3.20.1': - resolution: {integrity: sha512-RbwVlz1gcYG62sECR1u0XqMh8w5e5XMCCZoMvPQ3nJzEBCTfXLGX727GBoRmSvY1x4gJmqNZ1lsOX7lZY14RIw==} - engines: {node: '>=12'} + '@graphql-eslint/eslint-plugin@4.4.0': + resolution: {integrity: sha512-dhW6fpk3Souuaphhc38uMAGCcgKMgtCJWFygIKODw/Kns43wiQqRPVay0aNFY1JBx3aevn4KPT/BCOdm6HNncA==} + engines: {node: '>=18'} peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 + '@apollo/subgraph': ^2 + eslint: '>=8.44.0' + graphql: ^16 + json-schema-to-ts: ^3 + peerDependenciesMeta: + '@apollo/subgraph': + optional: true + json-schema-to-ts: + optional: true '@graphql-hive/signal@1.0.0': resolution: {integrity: sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==} @@ -3887,11 +3958,6 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/code-file-loader@7.3.23': - resolution: {integrity: sha512-8Wt1rTtyTEs0p47uzsPJ1vAtfAx0jmxPifiNdmo9EOCuUPyQGEbMaik/YkqZ7QUFIEYEQu+Vgfo8tElwOPtx5Q==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/code-file-loader@8.0.1': resolution: {integrity: sha512-pmg81lsIXGW3uW+nFSCIG0lFQIxWVbgDjeBkSWlnP8CZsrHTQEkB53DT7t4BHLryoxDS4G4cPxM52yNINDSL8w==} engines: {node: '>=16.0.0'} @@ -4012,11 +4078,6 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/graphql-tag-pluck@7.5.2': - resolution: {integrity: sha512-RW+H8FqOOLQw0BPXaahYepVSRjuOHw+7IL8Opaa5G5uYGOBxoXR7DceyQ7BcpMgktAOOmpDNQ2WtcboChOJSRA==} - peerDependencies: - graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 - '@graphql-tools/graphql-tag-pluck@8.0.1': resolution: {integrity: sha512-4sfBJSoXxVB4rRCCp2GTFhAYsUJgAPSKxSV+E3Voc600mK52JO+KsHCCTnPgCeyJFMNR9l94J6+tqxVKmlqKvw==} engines: {node: '>=16.0.0'} @@ -4029,6 +4090,12 @@ packages: peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/graphql-tag-pluck@8.3.19': + resolution: {integrity: sha512-LEw/6IYOUz48HjbWntZXDCzSXsOIM1AyWZrlLoJOrA8QAlhFd8h5Tny7opCypj8FO9VvpPFugWoNDh5InPOEQA==} + engines: {node: '>=16.0.0'} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 + '@graphql-tools/import@6.7.18': resolution: {integrity: sha512-XQDdyZTp+FYmT7as3xRWH/x8dx0QZA2WZqfMF5EWb36a0PiH7WwlRQYIdyYXj8YCLpiWkeBXgBRHmMnwEYR8iQ==} peerDependencies: @@ -4289,6 +4356,14 @@ packages: peerDependencies: react-hook-form: ^7.0.0 + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -4302,6 +4377,14 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} + '@ianvs/prettier-plugin-sort-imports@4.3.1': resolution: {integrity: sha512-ZHwbyjkANZOjaBm3ZosADD2OUYGFzQGxfy67HmGZU94mHqe7g1LCMA7YYKB1Cq+UTPCBqlAYapY0KXAjKEw8Sg==} peerDependencies: @@ -4729,8 +4812,8 @@ packages: '@next/env@15.2.4': resolution: {integrity: sha512-+SFtMgoiYP3WoSswuNmxJOCwi06TdWE733D+WPjpXIe4LXGULwEaofiiAy6kbS0+XjM5xF5n3lKuBwN2SnqD9g==} - '@next/eslint-plugin-next@14.2.23': - resolution: {integrity: sha512-efRC7m39GoiU1fXZRgGySqYbQi6ZyLkuGlvGst7IwkTTczehQTJA/7PoMg4MMjUZvZEGpiSEu+oJBAjPawiC3Q==} + '@next/eslint-plugin-next@15.0.4': + resolution: {integrity: sha512-rbsF17XGzHtR7SDWzWpavSfum3/UdnF8bAaisnKwP//si3KWPTedVUsflAdjyK1zW3rweBjbALfKcavFneLGvg==} '@next/swc-darwin-arm64@15.2.4': resolution: {integrity: sha512-1AnMfs655ipJEDC/FHkSr0r3lXBgpqKo4K1kiwfUf3iE68rDFXZ1TtHdMvf7D0hMItgDZ7Vuq3JgNMbt/+3bYw==} @@ -7737,9 +7820,6 @@ packages: '@types/env-ci@3.1.4': resolution: {integrity: sha512-WwSUcrqHNzRz+3nIZYO+p1OxJ/yDNSKFTpor06W+L2ie/K76a/Wb49LxHHiJMH44UeK7GM2kyWpL++e09v4qkA==} - '@types/eslint@8.56.12': - resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/estree-jsx@1.0.0': resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} @@ -10011,20 +10091,42 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.23.0: + resolution: {integrity: sha512-jV7AbNoFPAY1EkFYpLq5bslU9NLNO8xnEeQXwErNibVryjk67wHVmddTBilc5srIttJDBrB0eMHKZBFbSIABCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10192,6 +10294,10 @@ packages: fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -10306,6 +10412,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -10347,9 +10457,16 @@ packages: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flatted@3.2.7: resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flattie@1.1.1: resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} engines: {node: '>=8'} @@ -10607,11 +10724,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - glob@10.3.12: resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} engines: {node: '>=16 || 14 >=14.17'} @@ -11632,6 +11744,10 @@ packages: json-schema-ref-resolver@1.0.1: resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-to-ts@3.1.1: + resolution: {integrity: sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g==} + engines: {node: '>=16'} + json-schema-to-typescript@15.0.3: resolution: {integrity: sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==} engines: {node: '>=16.0.0'} @@ -15112,6 +15228,9 @@ packages: truncatise@0.0.8: resolution: {integrity: sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==} + ts-algebra@2.0.0: + resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} + ts-api-utils@1.3.0: resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -16330,13 +16449,13 @@ snapshots: '@ardatan/relay-compiler@12.0.0(encoding@0.1.13)(graphql@16.9.0)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/generator': 7.26.3 - '@babel/parser': 7.26.10 + '@babel/parser': 7.27.0 '@babel/runtime': 7.26.10 - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.10 - babel-preset-fbjs: 3.4.0(@babel/core@7.26.0) + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + babel-preset-fbjs: 3.4.0(@babel/core@7.26.10) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.4(encoding@0.1.13) @@ -17286,6 +17405,8 @@ snapshots: '@babel/compat-data@7.26.3': {} + '@babel/compat-data@7.26.8': {} + '@babel/core@7.22.9': dependencies: '@ampproject/remapping': 2.3.0 @@ -17326,17 +17447,45 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.26.10': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/helper-compilation-targets': 7.27.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) + '@babel/helpers': 7.26.10 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 + convert-source-map: 2.0.0 + debug: 4.4.0(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/generator@7.26.3': dependencies: - '@babel/parser': 7.26.10 + '@babel/parser': 7.27.0 '@babel/types': 7.26.10 '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + '@babel/generator@7.27.0': + dependencies: + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + '@babel/helper-annotate-as-pure@7.22.5': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.0 '@babel/helper-compilation-targets@7.25.9': dependencies: @@ -17346,36 +17495,44 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.26.0)': + '@babel/helper-compilation-targets@7.27.0': dependencies: - '@babel/core': 7.26.0 + '@babel/compat-data': 7.26.8 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.10) '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 '@babel/helper-split-export-declaration': 7.24.7 semver: 6.3.1 '@babel/helper-environment-visitor@7.24.7': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.0 '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.26.9 - '@babel/types': 7.26.10 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 '@babel/helper-member-expression-to-functions@7.24.5': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.0 '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.10 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color @@ -17397,33 +17554,42 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + '@babel/helper-optimise-call-expression@7.22.5': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.0 '@babel/helper-plugin-utils@7.25.9': {} - '@babel/helper-replace-supers@7.24.1(@babel/core@7.26.0)': + '@babel/helper-replace-supers@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.5 '@babel/helper-optimise-call-expression': 7.22.5 '@babel/helper-simple-access@7.25.7': dependencies: - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.10 + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.22.5': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.0 '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.0 '@babel/helper-string-parser@7.25.9': {} @@ -17436,37 +17602,37 @@ snapshots: '@babel/template': 7.26.9 '@babel/types': 7.26.10 - '@babel/parser@7.26.10': + '@babel/parser@7.26.3': dependencies: '@babel/types': 7.26.10 - '@babel/parser@7.26.3': + '@babel/parser@7.27.0': dependencies: - '@babel/types': 7.26.10 + '@babel/types': 7.27.0 - '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.0)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.0) + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.26.0)': + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.26.10)': dependencies: '@babel/compat-data': 7.26.3 - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.26.10) - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.26.0)': + '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.22.9)': @@ -17479,111 +17645,121 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-classes@7.24.5(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoping@7.24.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-classes@7.24.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-environment-visitor': 7.24.7 '@babel/helper-function-name': 7.24.7 '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.10) '@babel/helper-split-export-declaration': 7.24.7 globals: 11.12.0 - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/template': 7.26.9 + '@babel/template': 7.27.0 - '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.26.0)': + '@babel/plugin-transform-destructuring@7.24.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.26.0)': + '@babel/plugin-transform-flow-strip-types@7.22.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.26.0) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.26.10) - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.27.0 '@babel/helper-function-name': 7.24.7 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-literals@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/core': 7.26.10 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-simple-access': 7.25.7 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.0) + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.26.10) - '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.26.0)': + '@babel/plugin-transform-parameters@7.24.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.26.0)': + '@babel/plugin-transform-react-display-name@7.22.5(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': @@ -17596,31 +17772,31 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.26.0)': + '@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.22.5 '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.26.0) - '@babel/types': 7.26.10 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.26.10) + '@babel/types': 7.27.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-spread@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.26.0)': + '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.25.9 '@babel/runtime@7.26.10': @@ -17636,8 +17812,14 @@ snapshots: '@babel/template@7.26.9': dependencies: '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.10 - '@babel/types': 7.26.10 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 + + '@babel/template@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.27.0 + '@babel/types': 7.27.0 '@babel/traverse@7.26.4': dependencies: @@ -17651,6 +17833,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.27.0': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.27.0 + '@babel/parser': 7.27.0 + '@babel/template': 7.27.0 + '@babel/types': 7.27.0 + debug: 4.4.0(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.10': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -17661,6 +17855,11 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.27.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@balena/dockerignore@1.0.2': {} '@bentocache/plugin-prometheus@0.2.0(bentocache@1.1.0(patch_hash=98c0f93795fdd4f5eae32ee7915de8e9a346a24c3a917262b1f4551190f1a1af)(ioredis@5.4.2))(prom-client@15.1.3)': @@ -18264,13 +18463,34 @@ snapshots: graphql: 16.9.0 optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))': + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))': + dependencies: + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-visitor-keys: 3.4.3 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3))': dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.11.0': {} + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/config-array@0.19.2': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.0': {} + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -18285,8 +18505,31 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.1': + dependencies: + ajv: 6.12.6 + debug: 4.4.0(supports-color@8.1.1) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.1': {} + '@eslint/js@9.23.0': {} + + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.7': + dependencies: + '@eslint/core': 0.12.0 + levn: 0.4.1 + '@esm2cjs/execa@6.1.1-cjs.1': dependencies: '@esm2cjs/human-signals': 3.0.1 @@ -18707,50 +18950,52 @@ snapshots: - encoding - supports-color - '@graphql-eslint/eslint-plugin@3.20.1(patch_hash=695fba67df25ba9d46472c8398c94c6a2ccf75d902321d8f95150f68e940313e)(@babel/core@7.22.9)(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0)': + '@graphql-eslint/eslint-plugin@4.4.0(@apollo/subgraph@2.9.3(graphql@16.9.0))(@types/node@22.10.5)(encoding@0.1.13)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(graphql@16.9.0)(json-schema-to-ts@3.1.1)(typescript@5.7.3)': dependencies: - '@babel/code-frame': 7.26.2 - '@graphql-tools/code-file-loader': 7.3.23(@babel/core@7.22.9)(graphql@16.9.0) - '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.22.9)(graphql@16.9.0) - '@graphql-tools/utils': 9.2.1(graphql@16.9.0) - chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + '@graphql-tools/code-file-loader': 8.1.0(graphql@16.9.0) + '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.9.0) + '@graphql-tools/utils': 10.8.6(graphql@16.9.0) + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) fast-glob: 3.3.2 graphql: 16.9.0 - graphql-config: 4.5.0(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) + graphql-config: 5.1.3(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0)(typescript@5.7.3) graphql-depth-limit: 1.1.0(graphql@16.9.0) lodash.lowercase: 4.3.0 - tslib: 2.8.1 + optionalDependencies: + '@apollo/subgraph': 2.9.3(graphql@16.9.0) + json-schema-to-ts: 3.1.1 transitivePeerDependencies: - - '@babel/core' - '@types/node' - bufferutil - cosmiconfig-toml-loader - encoding - supports-color + - typescript - utf-8-validate - '@graphql-eslint/eslint-plugin@3.20.1(patch_hash=695fba67df25ba9d46472c8398c94c6a2ccf75d902321d8f95150f68e940313e)(@babel/core@7.26.0)(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0)': + '@graphql-eslint/eslint-plugin@4.4.0(@apollo/subgraph@2.9.3(graphql@16.9.0))(@types/node@22.10.5)(encoding@0.1.13)(eslint@9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3))(graphql@16.9.0)(json-schema-to-ts@3.1.1)(typescript@5.7.3)': dependencies: - '@babel/code-frame': 7.26.2 - '@graphql-tools/code-file-loader': 7.3.23(@babel/core@7.26.0)(graphql@16.9.0) - '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.26.0)(graphql@16.9.0) - '@graphql-tools/utils': 9.2.1(graphql@16.9.0) - chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + '@graphql-tools/code-file-loader': 8.1.0(graphql@16.9.0) + '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.9.0) + '@graphql-tools/utils': 10.8.6(graphql@16.9.0) + debug: 4.4.0(supports-color@8.1.1) + eslint: 9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3) fast-glob: 3.3.2 graphql: 16.9.0 - graphql-config: 4.5.0(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0) + graphql-config: 5.1.3(@types/node@22.10.5)(encoding@0.1.13)(graphql@16.9.0)(typescript@5.7.3) graphql-depth-limit: 1.1.0(graphql@16.9.0) lodash.lowercase: 4.3.0 - tslib: 2.8.1 + optionalDependencies: + '@apollo/subgraph': 2.9.3(graphql@16.9.0) + json-schema-to-ts: 3.1.1 transitivePeerDependencies: - - '@babel/core' - '@types/node' - bufferutil - cosmiconfig-toml-loader - encoding - supports-color + - typescript - utf-8-validate '@graphql-hive/signal@1.0.0': {} @@ -19040,30 +19285,6 @@ snapshots: tslib: 2.8.1 value-or-promise: 1.0.12 - '@graphql-tools/code-file-loader@7.3.23(@babel/core@7.22.9)(graphql@16.9.0)': - dependencies: - '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.22.9)(graphql@16.9.0) - '@graphql-tools/utils': 9.2.1(graphql@16.9.0) - globby: 11.1.0 - graphql: 16.9.0 - tslib: 2.8.1 - unixify: 1.0.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - - '@graphql-tools/code-file-loader@7.3.23(@babel/core@7.26.0)(graphql@16.9.0)': - dependencies: - '@graphql-tools/graphql-tag-pluck': 7.5.2(@babel/core@7.26.0)(graphql@16.9.0) - '@graphql-tools/utils': 9.2.1(graphql@16.9.0) - globby: 11.1.0 - graphql: 16.9.0 - tslib: 2.8.1 - unixify: 1.0.0 - transitivePeerDependencies: - - '@babel/core' - - supports-color - '@graphql-tools/code-file-loader@8.0.1(@babel/core@7.22.9)(graphql@16.9.0)': dependencies: '@graphql-tools/graphql-tag-pluck': 8.0.1(@babel/core@7.22.9)(graphql@16.9.0) @@ -19277,7 +19498,7 @@ snapshots: dependencies: '@ardatan/sync-fetch': 0.0.1(encoding@0.1.13) '@graphql-tools/executor-http': 1.0.0(@types/node@22.10.5)(graphql@16.9.0) - '@graphql-tools/graphql-tag-pluck': 8.2.0(graphql@16.9.0) + '@graphql-tools/graphql-tag-pluck': 8.3.19(graphql@16.9.0) '@graphql-tools/utils': 10.8.6(graphql@16.9.0) '@whatwg-node/fetch': 0.9.22 graphql: 16.9.0 @@ -19306,52 +19527,39 @@ snapshots: tslib: 2.8.1 unixify: 1.0.0 - '@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.22.9)(graphql@16.9.0)': + '@graphql-tools/graphql-tag-pluck@8.0.1(@babel/core@7.22.9)(graphql@16.9.0)': dependencies: - '@babel/parser': 7.26.3 + '@babel/parser': 7.27.0 '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.22.9) '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 - '@graphql-tools/utils': 9.2.1(graphql@16.9.0) + '@babel/types': 7.26.10 + '@graphql-tools/utils': 10.8.6(graphql@16.9.0) graphql: 16.9.0 tslib: 2.8.1 transitivePeerDependencies: - '@babel/core' - supports-color - '@graphql-tools/graphql-tag-pluck@7.5.2(@babel/core@7.26.0)(graphql@16.9.0)': + '@graphql-tools/graphql-tag-pluck@8.2.0(graphql@16.9.0)': dependencies: + '@babel/core': 7.26.0 '@babel/parser': 7.26.3 '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.26.0) '@babel/traverse': 7.26.4 '@babel/types': 7.26.3 - '@graphql-tools/utils': 9.2.1(graphql@16.9.0) - graphql: 16.9.0 - tslib: 2.8.1 - transitivePeerDependencies: - - '@babel/core' - - supports-color - - '@graphql-tools/graphql-tag-pluck@8.0.1(@babel/core@7.22.9)(graphql@16.9.0)': - dependencies: - '@babel/parser': 7.26.10 - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.22.9) - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.10 '@graphql-tools/utils': 10.8.6(graphql@16.9.0) graphql: 16.9.0 tslib: 2.8.1 transitivePeerDependencies: - - '@babel/core' - supports-color - '@graphql-tools/graphql-tag-pluck@8.2.0(graphql@16.9.0)': + '@graphql-tools/graphql-tag-pluck@8.3.19(graphql@16.9.0)': dependencies: - '@babel/core': 7.26.0 - '@babel/parser': 7.26.3 - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.26.0) - '@babel/traverse': 7.26.4 - '@babel/types': 7.26.3 + '@babel/core': 7.26.10 + '@babel/parser': 7.27.0 + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.10) + '@babel/traverse': 7.27.0 + '@babel/types': 7.27.0 '@graphql-tools/utils': 10.8.6(graphql@16.9.0) graphql: 16.9.0 tslib: 2.8.1 @@ -19739,6 +19947,13 @@ snapshots: dependencies: react-hook-form: 7.54.2(react@18.3.1) + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -19751,6 +19966,10 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} + '@ianvs/prettier-plugin-sort-imports@4.3.1(prettier@3.4.2)': dependencies: '@babel/core': 7.26.0 @@ -20209,9 +20428,9 @@ snapshots: '@next/env@15.2.4': {} - '@next/eslint-plugin-next@14.2.23': + '@next/eslint-plugin-next@15.0.4': dependencies: - glob: 10.3.10 + fast-glob: 3.3.1 '@next/swc-darwin-arm64@15.2.4': optional: true @@ -24144,25 +24363,25 @@ snapshots: - graphql - utf-8-validate - '@theguild/eslint-config@0.12.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3)': + '@theguild/eslint-config@0.12.1(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3)': dependencies: '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-config-prettier: 9.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-jsonc: 2.11.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-mdx: 3.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-n: 17.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-promise: 7.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-react: 7.33.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-sonarjs: 1.0.3(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-unicorn: 55.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-yml: 1.11.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-config-prettier: 9.1.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-jsonc: 2.11.1(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-mdx: 3.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-n: 17.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-promise: 7.1.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-react: 7.33.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-sonarjs: 1.0.3(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-unicorn: 55.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-yml: 1.11.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) typescript: 5.7.3 transitivePeerDependencies: - eslint-import-resolver-node @@ -24337,11 +24556,6 @@ snapshots: '@types/env-ci@3.1.4': {} - '@types/eslint@8.56.12': - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - '@types/estree-jsx@1.0.0': dependencies: '@types/estree': 1.0.6 @@ -24603,15 +24817,15 @@ snapshots: '@types/node': 22.10.5 optional: true - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -24621,14 +24835,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3)': + '@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3)': dependencies: '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) '@typescript-eslint/visitor-keys': 7.18.0 debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) optionalDependencies: typescript: 5.7.3 transitivePeerDependencies: @@ -24639,12 +24853,12 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3)': + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3)': dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) ts-api-utils: 1.3.0(typescript@5.7.3) optionalDependencies: typescript: 5.7.3 @@ -24668,13 +24882,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) transitivePeerDependencies: - supports-color - typescript @@ -25213,35 +25427,35 @@ snapshots: babel-plugin-syntax-trailing-function-commas@7.0.0-beta.0: {} - babel-preset-fbjs@3.4.0(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) - '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.26.0) - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.26.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.26.0) - '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.26.0) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.26.0) - '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.26.0) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.26.0) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.26.0) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.26.0) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.26.0) + babel-preset-fbjs@3.4.0(@babel/core@7.26.10): + dependencies: + '@babel/core': 7.26.10 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.10) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.10) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.10) + '@babel/plugin-syntax-flow': 7.22.5(@babel/core@7.26.10) + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.26.10) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.10) + '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoping': 7.24.5(@babel/core@7.26.10) + '@babel/plugin-transform-classes': 7.24.5(@babel/core@7.26.10) + '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-destructuring': 7.24.5(@babel/core@7.26.10) + '@babel/plugin-transform-flow-strip-types': 7.22.5(@babel/core@7.26.10) + '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.24.5(@babel/core@7.26.10) + '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-react-display-name': 7.22.5(@babel/core@7.26.10) + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.26.10) + '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.26.10) + '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.26.10) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color @@ -26793,13 +27007,13 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.1.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-compat-utils@0.1.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) - eslint-config-prettier@9.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-config-prettier@9.1.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) eslint-import-resolver-node@0.3.9: dependencies: @@ -26809,13 +27023,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: debug: 4.4.0(supports-color@8.1.1) enhanced-resolve: 5.17.1 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) fast-glob: 3.3.2 get-tsconfig: 4.7.5 is-core-module: 2.13.1 @@ -26826,11 +27040,11 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-mdx@3.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-mdx@3.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) espree: 9.6.1 estree-util-visit: 2.0.0 remark-mdx: 3.0.0 @@ -26846,30 +27060,30 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-plugin-import@2.29.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) transitivePeerDependencies: - supports-color - eslint-plugin-cypress@4.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-cypress@4.1.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) globals: 15.11.0 - eslint-plugin-es-x@7.5.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-es-x@7.5.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) '@eslint-community/regexpp': 4.11.0 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: array-includes: 3.1.7 array.prototype.findlastindex: 1.2.3 @@ -26877,9 +27091,9 @@ snapshots: array.prototype.flatmap: 1.3.2 debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) hasown: 2.0.0 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -26890,22 +27104,22 @@ snapshots: semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0))(typescript@5.7.3) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e))(typescript@5.7.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsonc@2.11.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-jsonc@2.11.1(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) graphemer: 1.4.0 jsonc-eslint-parser: 2.1.0 natural-compare: 1.4.0 - eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-jsx-a11y@6.8.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: '@babel/runtime': 7.26.10 aria-query: 5.3.0 @@ -26917,7 +27131,7 @@ snapshots: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.15 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) hasown: 2.0.0 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -26925,18 +27139,18 @@ snapshots: object.entries: 1.1.7 object.fromentries: 2.0.7 - eslint-plugin-markdown@3.0.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-markdown@3.0.1(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) mdast-util-from-markdown: 0.8.5 transitivePeerDependencies: - supports-color - eslint-plugin-mdx@3.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-mdx@3.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-mdx: 3.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) - eslint-plugin-markdown: 3.0.1(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-mdx: 3.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) + eslint-plugin-markdown: 3.0.1(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) remark-mdx: 3.0.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 @@ -26946,12 +27160,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-n@17.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-n@17.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) enhanced-resolve: 5.17.1 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-plugin-es-x: 7.5.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-plugin-es-x: 7.5.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) get-tsconfig: 4.7.5 globals: 14.0.0 ignore: 5.3.2 @@ -26959,22 +27173,22 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-promise@7.1.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-promise@7.1.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) - eslint-plugin-react@7.33.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-react@7.33.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: array-includes: 3.1.7 array.prototype.flatmap: 1.3.2 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 es-iterator-helpers: 1.0.15 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) estraverse: 5.3.0 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 @@ -26987,18 +27201,18 @@ snapshots: semver: 6.3.1 string.prototype.matchall: 4.0.8 - eslint-plugin-sonarjs@1.0.3(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-sonarjs@1.0.3(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) - eslint-plugin-unicorn@55.0.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-unicorn@55.0.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) ci-info: 4.0.0 clean-regexp: 1.0.0 core-js-compat: 3.37.1 - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) esquery: 1.5.0 globals: 15.11.0 indent-string: 4.0.0 @@ -27011,11 +27225,11 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-yml@1.11.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)): + eslint-plugin-yml@1.11.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)): dependencies: debug: 4.4.0(supports-color@8.1.1) - eslint: 8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0) - eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + eslint: 8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e) + eslint-compat-utils: 0.1.2(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.2 @@ -27027,11 +27241,18 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} - eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0): + eslint-visitor-keys@4.2.0: {} + + eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=08d9d41d21638cb74d0f9f34877a8839601a4e5a8263066ff23e7032addbcba0)) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)) '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -27072,8 +27293,56 @@ snapshots: transitivePeerDependencies: - supports-color + eslint@9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3): + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.23.0(patch_hash=31e7723d6a11708b1c0dd74a3349bc6d6ede126bdc0173ae2aad414919764b6e)(jiti@2.3.3)) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.19.2 + '@eslint/config-helpers': 0.2.0 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.23.0 + '@eslint/plugin-kit': 0.2.7 + '@humanfs/node': 0.16.6 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@8.1.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + optionalDependencies: + jiti: 2.3.3 + transitivePeerDependencies: + - supports-color + esm@3.2.25: {} + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@9.6.1: dependencies: acorn: 8.14.0 @@ -27289,6 +27558,14 @@ snapshots: fast-fifo@1.3.2: {} + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -27435,6 +27712,10 @@ snapshots: dependencies: flat-cache: 3.0.4 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + filelist@1.0.4: dependencies: minimatch: 5.1.0 @@ -27489,8 +27770,15 @@ snapshots: flatted: 3.2.7 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + flatted@3.2.7: {} + flatted@3.3.3: {} + flattie@1.1.1: {} fn-name@3.0.0: {} @@ -27747,14 +28035,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.3.10: - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.5 - minipass: 7.0.4 - path-scurry: 1.10.2 - glob@10.3.12: dependencies: foreground-child: 3.1.1 @@ -28934,6 +29214,11 @@ snapshots: dependencies: fast-deep-equal: 3.1.3 + json-schema-to-ts@3.1.1: + dependencies: + '@babel/runtime': 7.26.10 + ts-algebra: 2.0.0 + json-schema-to-typescript@15.0.3: dependencies: '@apidevtools/json-schema-ref-parser': 11.6.1 @@ -33272,6 +33557,8 @@ snapshots: truncatise@0.0.8: {} + ts-algebra@2.0.0: {} + ts-api-utils@1.3.0(typescript@5.7.3): dependencies: typescript: 5.7.3 diff --git a/rules/enforce-deps-in-dev.cjs b/rules/enforce-deps-in-dev.cjs index 3e7267fa67..543a702eef 100644 --- a/rules/enforce-deps-in-dev.cjs +++ b/rules/enforce-deps-in-dev.cjs @@ -196,9 +196,30 @@ function reportIfMissing(context, deps, node, name, scopes) { context.report(node, missingErrorMessage(importPackageName)); } +const ARRAY_DEFAULT_OPTIONS = { + type: 'array', + uniqueItems: true, + minItems: 1, + items: { + type: 'string', + }, +}; + module.exports = { meta: { type: 'problem', + schema: { + type: 'array', + maxItems: 1, + items: { + type: 'object', + additionalProperties: false, + properties: { + scopes: ARRAY_DEFAULT_OPTIONS, + ignored: ARRAY_DEFAULT_OPTIONS, + }, + }, + }, }, create(context) {