diff --git a/.changeset/friendly-singers-rush.md b/.changeset/friendly-singers-rush.md new file mode 100644 index 00000000000..b4b33a25174 --- /dev/null +++ b/.changeset/friendly-singers-rush.md @@ -0,0 +1,22 @@ +--- +'@graphql-eslint/eslint-plugin': patch +--- + +- rename flat configs exports + +```diff +-graphql.flatConfigs['schema-recommended'] ++graphql.configs['flat/schema-recommended'] +-graphql.flatConfigs['schema-relay'] ++graphql.configs['flat/schema-relay'] +-graphql.flatConfigs['schema-all'] ++graphql.configs['flat/schema-all'] +-graphql.flatConfigs['operations-recommended'] ++graphql.configs['flat/operations-recommended'] +-graphql.flatConfigs['operations-all'] ++graphql.configs['flat/operations-all'] +``` + +- fix with programmatic usage when passing large schema as string causes `pattern too long` error + +- fix loading ESM `graphql.config.js` configs diff --git a/examples/code-file/eslint.config.js b/examples/code-file/eslint.config.js index 5d891c7aa2c..88e524c0af0 100644 --- a/examples/code-file/eslint.config.js +++ b/examples/code-file/eslint.config.js @@ -12,12 +12,12 @@ export default [ }, { files: ['**/*.graphql'], - plugins: { - '@graphql-eslint': { rules: graphql.rules }, - }, languageOptions: { parser: graphql.parser, }, + plugins: { + '@graphql-eslint': { rules: graphql.rules }, + }, rules: { '@graphql-eslint/no-anonymous-operations': 'error', '@graphql-eslint/naming-convention': [ diff --git a/examples/graphql-config/eslint.config.js b/examples/graphql-config/eslint.config.js index 7408693ba90..7470e524e47 100644 --- a/examples/graphql-config/eslint.config.js +++ b/examples/graphql-config/eslint.config.js @@ -8,12 +8,12 @@ export default [ }, { files: ['**/*.graphql'], - plugins: { - '@graphql-eslint': { rules: graphql.rules }, - }, languageOptions: { parser: graphql.parser, }, + plugins: { + '@graphql-eslint': { rules: graphql.rules }, + }, rules: { '@graphql-eslint/no-anonymous-operations': 'error', '@graphql-eslint/no-duplicate-fields': 'error', diff --git a/examples/monorepo/eslint.config.js b/examples/monorepo/eslint.config.js index 713d01f582e..fc172770eb3 100644 --- a/examples/monorepo/eslint.config.js +++ b/examples/monorepo/eslint.config.js @@ -23,21 +23,21 @@ export default [ { // Setup GraphQL Parser files: ['**/*.{graphql,gql}'], - plugins: { - '@graphql-eslint': { rules: graphql.rules }, - }, languageOptions: { parser: graphql.parser, }, + plugins: { + '@graphql-eslint': { rules: graphql.rules }, + }, }, { // Setup recommended config for schema files files: [SCHEMA_PATH], - ...graphql.flatConfigs['schema-recommended'], + rules: graphql.configs['flat/schema-recommended'], }, { // Setup recommended config for operations files files: ['client/**/*.{graphql,gql}'], - ...graphql.flatConfigs['operations-recommended'], + rules: graphql.configs['flat/operations-recommended'], }, ]; diff --git a/examples/multiple-projects-graphql-config/eslint.config.js b/examples/multiple-projects-graphql-config/eslint.config.js index 5e03caa73fe..d77663a31d0 100644 --- a/examples/multiple-projects-graphql-config/eslint.config.js +++ b/examples/multiple-projects-graphql-config/eslint.config.js @@ -10,22 +10,22 @@ export default [ { // Setup GraphQL Parser files: ['**/*.graphql'], - plugins: { - '@graphql-eslint': { rules: graphql.rules }, - }, languageOptions: { parser: graphql.parser, }, + plugins: { + '@graphql-eslint': { rules: graphql.rules }, + }, }, { files: ['schema.*.graphql'], rules: { - ...graphql.flatConfigs['schema-recommended'].rules, + ...graphql.configs['flat/schema-recommended'], '@graphql-eslint/require-description': 'off', }, }, { files: ['**/*.js/*.graphql'], - rules: graphql.flatConfigs['operations-recommended'].rules, + rules: graphql.configs['flat/operations-recommended'], }, ]; diff --git a/examples/programmatic/eslint.config.js b/examples/programmatic/eslint.config.js index a45bde26b94..e724d8c3011 100644 --- a/examples/programmatic/eslint.config.js +++ b/examples/programmatic/eslint.config.js @@ -8,9 +8,6 @@ export default [ }, { files: ['**/*.graphql'], - plugins: { - '@graphql-eslint': { rules: graphql.rules }, - }, languageOptions: { parser: graphql.parser, parserOptions: { @@ -20,6 +17,9 @@ export default [ }, }, }, + plugins: { + '@graphql-eslint': { rules: graphql.rules }, + }, rules: { '@graphql-eslint/require-selections': ['error', { fieldName: '_id' }], '@graphql-eslint/unique-fragment-name': 'error', diff --git a/packages/plugin/package.json b/packages/plugin/package.json index 095f59ed19b..13d8f3ab12a 100644 --- a/packages/plugin/package.json +++ b/packages/plugin/package.json @@ -49,7 +49,7 @@ "@graphql-tools/utils": "^10.0.0", "debug": "^4.3.4", "fast-glob": "^3.2.12", - "graphql-config": "^5.0.0", + "graphql-config": "^5.1.0", "graphql-depth-limit": "^1.1.0", "lodash.lowercase": "^4.3.0" }, diff --git a/packages/plugin/src/cache.ts b/packages/plugin/src/cache.ts index 439ab1eb41e..4a7180d6339 100644 --- a/packages/plugin/src/cache.ts +++ b/packages/plugin/src/cache.ts @@ -8,11 +8,17 @@ export class ModuleCache { map = new Map(); set(cacheKey: K, result: T): void { + // Remove server-side cache code in browser + if (typeof window !== 'undefined') return; + this.map.set(cacheKey, { lastSeen: process.hrtime(), result }); log('setting entry for', cacheKey); } get(cacheKey: K, settings = { lifetime: 10 /* seconds */ }): T | void { + // Remove server-side cache code in browser + if (typeof window !== 'undefined') return; + const value = this.map.get(cacheKey); if (!value) { log('cache miss for', cacheKey); diff --git a/packages/plugin/src/configs/index.ts b/packages/plugin/src/configs/index.ts index 6356ec06447..fa4535ffcc9 100644 --- a/packages/plugin/src/configs/index.ts +++ b/packages/plugin/src/configs/index.ts @@ -16,4 +16,15 @@ export const configs = { 'schema-relay': relayConfig, 'operations-recommended': operationsRecommendedConfig, 'operations-all': operationsAllConfig, -} satisfies Record; + 'flat/schema-recommended': schemaRecommendedConfig.rules, + 'flat/schema-all': { + ...schemaRecommendedConfig.rules, + ...schemaAllConfig.rules, + }, + 'flat/schema-relay': relayConfig.rules, + 'flat/operations-recommended': operationsRecommendedConfig.rules, + 'flat/operations-all': { + ...operationsRecommendedConfig.rules, + ...operationsAllConfig.rules, + }, +} satisfies Record; diff --git a/packages/plugin/src/flat-configs.ts b/packages/plugin/src/flat-configs.ts deleted file mode 100644 index f10494cfc24..00000000000 --- a/packages/plugin/src/flat-configs.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { configs } from './configs/index.js'; -import { parser } from './parser.js'; -import { ConfigName } from './types.js'; - -const languageOptions = { parser }; - -export const flatConfigs = { - 'operations-all': { - languageOptions, - rules: { - ...configs['operations-recommended'].rules, - ...configs['operations-all'].rules, - }, - }, - 'operations-recommended': { - languageOptions, - rules: configs['operations-recommended'].rules, - }, - 'schema-relay': { - languageOptions, - rules: configs['schema-relay'].rules, - }, - 'schema-all': { - languageOptions, - rules: { - ...configs['schema-recommended'].rules, - ...configs['schema-all'].rules, - }, - }, - 'schema-recommended': { - languageOptions, - rules: configs['schema-recommended'].rules, - }, -} satisfies Record; diff --git a/packages/plugin/src/index.browser.ts b/packages/plugin/src/index.browser.ts index cb4cd0320ff..00b80a90016 100644 --- a/packages/plugin/src/index.browser.ts +++ b/packages/plugin/src/index.browser.ts @@ -3,4 +3,4 @@ export { parser } from './parser.js'; export { rules } from './rules/index.js'; export * from './types.js'; -export { flatConfigs } from './flat-configs.js'; +export { configs } from './configs/index.js'; diff --git a/packages/plugin/src/index.ts b/packages/plugin/src/index.ts index e4dc5eb7eff..a949c1af731 100644 --- a/packages/plugin/src/index.ts +++ b/packages/plugin/src/index.ts @@ -8,4 +8,3 @@ export { requireGraphQLSchemaFromContext, requireSiblingsOperations } from './ut export const processors = { graphql: processor }; export { configs } from './configs/index.js'; -export { flatConfigs } from './flat-configs.js'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb0489ac183..b952c28bd05 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -256,8 +256,8 @@ importers: specifier: ^3.2.12 version: 3.3.2 graphql-config: - specifier: ^5.0.0 - version: 5.0.3(@types/node@20.14.14)(graphql@16.9.0)(typescript@5.5.4) + specifier: ^5.1.0 + version: 5.1.0(@types/node@20.14.14)(graphql@16.9.0)(typescript@5.5.4) graphql-depth-limit: specifier: ^1.1.0 version: 1.1.0(graphql@16.9.0) @@ -3356,8 +3356,8 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - graphql-config@5.0.3: - resolution: {integrity: sha512-BNGZaoxIBkv9yy6Y7omvsaBUHOzfFcII3UN++tpH8MGOKFPFkCPZuwx09ggANMt8FgyWP1Od8SWPmrUEZca4NQ==} + graphql-config@5.1.0: + resolution: {integrity: sha512-g4mNs1OZmZI+LHwRly3BbHO3mRZryyRCbmFKDGsFGde3U0F7TlIwJ0mhX1KTJlQzGQVDZDexZWnvIwodFERPvg==} engines: {node: '>= 16.0.0'} peerDependencies: cosmiconfig-toml-loader: ^1.0.0 @@ -9855,7 +9855,7 @@ snapshots: graphemer@1.4.0: {} - graphql-config@5.0.3(@types/node@20.14.14)(graphql@16.9.0)(typescript@5.5.4): + graphql-config@5.1.0(@types/node@20.14.14)(graphql@16.9.0)(typescript@5.5.4): dependencies: '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0) '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0) diff --git a/website/src/components/play-page.tsx b/website/src/components/play-page.tsx index f1e079a0dd0..b3d6e0548b1 100644 --- a/website/src/components/play-page.tsx +++ b/website/src/components/play-page.tsx @@ -3,7 +3,7 @@ import { clsx } from 'clsx'; import { Linter } from 'eslint'; import debounce from 'lodash.debounce'; import { StringParam, useQueryParam, withDefault } from 'use-query-params'; -import { ConfigName, flatConfigs, parser, rules } from '@graphql-eslint/eslint-plugin'; +import { ConfigName, configs, parser, rules } from '@graphql-eslint/eslint-plugin'; import { asArray } from '@graphql-tools/utils'; import { GraphQLEditor } from './graphql-editor'; import { Select } from './select'; @@ -163,10 +163,10 @@ export function PlayPage(): ReactElement { documents={operation} selectedRules={{ // @ts-expect-error -- TODO: fix type error - ...(schemaConfig && flatConfigs[schemaConfig].rules), + ...(schemaConfig && configs[`flat/${schemaConfig}`]), ...(schemaRule && { [`@graphql-eslint/${schemaRule}`]: - flatConfigs['schema-all'].rules[`@graphql-eslint/${schemaRule}`], + configs['flat/schema-all'][`@graphql-eslint/${schemaRule}`], }), }} onChange={setSchema} @@ -179,10 +179,10 @@ export function PlayPage(): ReactElement { documents={operation} selectedRules={{ // @ts-expect-error -- TODO: fix type error - ...(operationConfig && flatConfigs[operationConfig].rules), + ...(operationConfig && configs[`flat/${operationConfig}`]), ...(operationRule && { [`@graphql-eslint/${operationRule}`]: - flatConfigs['operations-all'].rules[`@graphql-eslint/${operationRule}`], + configs['flat/operations-all'][`@graphql-eslint/${operationRule}`], }), }} onChange={setOperation}