@graphql-eslint/eslint-plugin 4.0.0-alpha-20220821140530-e968cfc → 4.0.0-alpha-20230801163310-8bc4340
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +13 -253
- package/cjs/cache.d.ts +12 -0
- package/cjs/cache.js +62 -0
- package/cjs/configs/index.d.ts +148 -0
- package/cjs/configs/index.js +49 -0
- package/cjs/configs/operations-all.d.ts +22 -0
- package/cjs/configs/operations-all.js +27 -0
- package/cjs/configs/operations-recommended.d.ts +52 -0
- package/{configs/operations-recommended.json → cjs/configs/operations-recommended.js} +16 -14
- package/cjs/configs/relay.d.ts +12 -0
- package/{configs/relay.json → cjs/configs/relay.js} +6 -4
- package/cjs/configs/schema-all.d.ts +19 -0
- package/cjs/configs/schema-all.js +21 -0
- package/cjs/configs/schema-recommended.d.ts +49 -0
- package/{configs/schema-recommended.json → cjs/configs/schema-recommended.js} +19 -20
- package/cjs/documents.d.ts +6 -0
- package/cjs/documents.js +81 -0
- package/cjs/estree-converter/converter.d.ts +8 -0
- package/cjs/estree-converter/converter.js +83 -0
- package/cjs/estree-converter/index.d.ts +8 -0
- package/cjs/estree-converter/index.js +26 -0
- package/cjs/estree-converter/types.d.ts +42 -0
- package/cjs/estree-converter/types.js +16 -0
- package/cjs/estree-converter/utils.d.ts +18 -0
- package/cjs/estree-converter/utils.js +135 -0
- package/cjs/flat-configs.d.ts +260 -0
- package/cjs/flat-configs.js +60 -0
- package/cjs/graphql-config.d.ts +13 -0
- package/cjs/graphql-config.js +86 -0
- package/cjs/index.d.ts +22 -0
- package/cjs/index.js +49 -0
- package/cjs/parser.d.ts +12 -0
- package/cjs/parser.js +103 -0
- package/cjs/processor.d.ts +9 -0
- package/cjs/processor.js +127 -0
- package/cjs/rules/alphabetize.d.ts +84 -0
- package/cjs/rules/alphabetize.js +395 -0
- package/cjs/rules/description-style.d.ts +28 -0
- package/cjs/rules/description-style.js +109 -0
- package/cjs/rules/graphql-js-validation.d.ts +12 -0
- package/cjs/rules/graphql-js-validation.js +669 -0
- package/cjs/rules/index.d.ts +125 -0
- package/cjs/rules/index.js +99 -0
- package/cjs/rules/input-name.d.ts +43 -0
- package/cjs/rules/input-name.js +170 -0
- package/cjs/rules/lone-executable-definition.d.ts +34 -0
- package/cjs/rules/lone-executable-definition.js +119 -0
- package/cjs/rules/match-document-filename.d.ts +80 -0
- package/cjs/rules/match-document-filename.js +282 -0
- package/cjs/rules/naming-convention.d.ts +107 -0
- package/cjs/rules/naming-convention.js +434 -0
- package/cjs/rules/no-anonymous-operations.d.ts +12 -0
- package/cjs/rules/no-anonymous-operations.js +98 -0
- package/cjs/rules/no-case-insensitive-enum-values-duplicates.d.ts +12 -0
- package/cjs/rules/no-case-insensitive-enum-values-duplicates.js +96 -0
- package/cjs/rules/no-deprecated.d.ts +12 -0
- package/cjs/rules/no-deprecated.js +157 -0
- package/cjs/rules/no-duplicate-fields.d.ts +12 -0
- package/cjs/rules/no-duplicate-fields.js +146 -0
- package/cjs/rules/no-hashtag-description.d.ts +13 -0
- package/cjs/rules/no-hashtag-description.js +140 -0
- package/cjs/rules/no-one-place-fragments.d.ts +12 -0
- package/cjs/rules/no-one-place-fragments.js +113 -0
- package/cjs/rules/no-root-type.d.ts +33 -0
- package/cjs/rules/no-root-type.js +113 -0
- package/cjs/rules/no-scalar-result-type-on-mutation.d.ts +12 -0
- package/cjs/rules/no-scalar-result-type-on-mutation.js +100 -0
- package/cjs/rules/no-typename-prefix.d.ts +12 -0
- package/cjs/rules/no-typename-prefix.js +98 -0
- package/cjs/rules/no-unreachable-types.d.ts +12 -0
- package/cjs/rules/no-unreachable-types.js +199 -0
- package/cjs/rules/no-unused-fields.d.ts +12 -0
- package/cjs/rules/no-unused-fields.js +157 -0
- package/cjs/rules/relay-arguments.d.ts +29 -0
- package/cjs/rules/relay-arguments.js +149 -0
- package/cjs/rules/relay-connection-types.d.ts +13 -0
- package/cjs/rules/relay-connection-types.js +142 -0
- package/cjs/rules/relay-edge-types.d.ts +39 -0
- package/cjs/rules/relay-edge-types.js +212 -0
- package/cjs/rules/relay-page-info.d.ts +12 -0
- package/cjs/rules/relay-page-info.js +121 -0
- package/cjs/rules/require-deprecation-date.d.ts +26 -0
- package/cjs/rules/require-deprecation-date.js +164 -0
- package/cjs/rules/require-deprecation-reason.d.ts +12 -0
- package/cjs/rules/require-deprecation-reason.js +93 -0
- package/cjs/rules/require-description.d.ts +23 -0
- package/cjs/rules/require-description.js +205 -0
- package/cjs/rules/require-field-of-type-query-in-mutation-result.d.ts +12 -0
- package/cjs/rules/require-field-of-type-query-in-mutation-result.js +102 -0
- package/cjs/rules/require-id-when-available.d.ts +44 -0
- package/cjs/rules/require-id-when-available.js +241 -0
- package/cjs/rules/require-import-fragment.d.ts +12 -0
- package/cjs/rules/require-import-fragment.js +166 -0
- package/cjs/rules/require-nullable-fields-with-oneof.d.ts +12 -0
- package/cjs/rules/require-nullable-fields-with-oneof.js +92 -0
- package/cjs/rules/require-nullable-result-in-root.d.ts +12 -0
- package/cjs/rules/require-nullable-result-in-root.js +109 -0
- package/cjs/rules/require-type-pattern-with-oneof.d.ts +12 -0
- package/cjs/rules/require-type-pattern-with-oneof.js +91 -0
- package/cjs/rules/selection-set-depth.d.ts +36 -0
- package/cjs/rules/selection-set-depth.js +175 -0
- package/cjs/rules/strict-id-in-types.d.ts +65 -0
- package/cjs/rules/strict-id-in-types.js +186 -0
- package/cjs/rules/unique-fragment-name.d.ts +13 -0
- package/cjs/rules/unique-fragment-name.js +118 -0
- package/cjs/rules/unique-operation-name.d.ts +12 -0
- package/cjs/rules/unique-operation-name.js +95 -0
- package/cjs/schema.d.ts +12 -0
- package/cjs/schema.js +65 -0
- package/cjs/siblings.d.ts +8 -0
- package/cjs/siblings.js +136 -0
- package/cjs/types-8d5f4ae0.d.ts +107 -0
- package/cjs/types.d.ts +8 -0
- package/cjs/types.js +16 -0
- package/cjs/utils.d.ts +44 -0
- package/cjs/utils.js +205 -0
- package/esm/cache.d.mts +12 -0
- package/esm/cache.js +29 -0
- package/esm/chunk-BMTV3EA2.js +8 -0
- package/esm/configs/index.d.mts +148 -0
- package/esm/configs/index.js +16 -0
- package/esm/configs/operations-all.d.mts +22 -0
- package/esm/configs/operations-all.js +34 -0
- package/esm/configs/operations-recommended.d.mts +52 -0
- package/esm/configs/operations-recommended.js +59 -0
- package/esm/configs/relay.d.mts +12 -0
- package/esm/configs/relay.js +18 -0
- package/esm/configs/schema-all.d.mts +19 -0
- package/esm/configs/schema-all.js +28 -0
- package/esm/configs/schema-recommended.d.mts +49 -0
- package/esm/configs/schema-recommended.js +55 -0
- package/esm/documents.d.mts +6 -0
- package/esm/documents.js +48 -0
- package/esm/estree-converter/converter.d.mts +8 -0
- package/esm/estree-converter/converter.js +65 -0
- package/esm/estree-converter/index.d.mts +8 -0
- package/esm/estree-converter/index.js +3 -0
- package/esm/estree-converter/types.d.mts +42 -0
- package/esm/estree-converter/types.js +0 -0
- package/esm/estree-converter/utils.d.mts +18 -0
- package/esm/estree-converter/utils.js +114 -0
- package/esm/flat-configs.d.mts +260 -0
- package/esm/flat-configs.js +37 -0
- package/esm/graphql-config.d.mts +13 -0
- package/esm/graphql-config.js +55 -0
- package/esm/index.d.mts +22 -0
- package/esm/index.js +18 -0
- package/esm/package.json +1 -0
- package/esm/parser.d.mts +12 -0
- package/esm/parser.js +70 -0
- package/esm/processor.d.mts +9 -0
- package/esm/processor.js +106 -0
- package/esm/rules/alphabetize.d.mts +84 -0
- package/esm/rules/alphabetize.js +364 -0
- package/esm/rules/description-style.d.mts +28 -0
- package/esm/rules/description-style.js +86 -0
- package/esm/rules/graphql-js-validation.d.mts +12 -0
- package/esm/rules/graphql-js-validation.js +658 -0
- package/esm/rules/index.d.mts +125 -0
- package/esm/rules/index.js +76 -0
- package/esm/rules/input-name.d.mts +43 -0
- package/esm/rules/input-name.js +149 -0
- package/esm/rules/lone-executable-definition.d.mts +34 -0
- package/esm/rules/lone-executable-definition.js +96 -0
- package/esm/rules/match-document-filename.d.mts +80 -0
- package/esm/rules/match-document-filename.js +263 -0
- package/esm/rules/naming-convention.d.mts +107 -0
- package/esm/rules/naming-convention.js +417 -0
- package/esm/rules/no-anonymous-operations.d.mts +12 -0
- package/esm/rules/no-anonymous-operations.js +75 -0
- package/esm/rules/no-case-insensitive-enum-values-duplicates.d.mts +12 -0
- package/esm/rules/no-case-insensitive-enum-values-duplicates.js +73 -0
- package/esm/rules/no-deprecated.d.mts +12 -0
- package/esm/rules/no-deprecated.js +134 -0
- package/esm/rules/no-duplicate-fields.d.mts +12 -0
- package/esm/rules/no-duplicate-fields.js +123 -0
- package/esm/rules/no-hashtag-description.d.mts +13 -0
- package/esm/rules/no-hashtag-description.js +116 -0
- package/esm/rules/no-one-place-fragments.d.mts +12 -0
- package/esm/rules/no-one-place-fragments.js +90 -0
- package/esm/rules/no-root-type.d.mts +33 -0
- package/esm/rules/no-root-type.js +90 -0
- package/esm/rules/no-scalar-result-type-on-mutation.d.mts +12 -0
- package/esm/rules/no-scalar-result-type-on-mutation.js +77 -0
- package/esm/rules/no-typename-prefix.d.mts +12 -0
- package/esm/rules/no-typename-prefix.js +75 -0
- package/esm/rules/no-unreachable-types.d.mts +12 -0
- package/esm/rules/no-unreachable-types.js +171 -0
- package/esm/rules/no-unused-fields.d.mts +12 -0
- package/esm/rules/no-unused-fields.js +134 -0
- package/esm/rules/relay-arguments.d.mts +29 -0
- package/esm/rules/relay-arguments.js +126 -0
- package/esm/rules/relay-connection-types.d.mts +13 -0
- package/esm/rules/relay-connection-types.js +118 -0
- package/esm/rules/relay-edge-types.d.mts +39 -0
- package/esm/rules/relay-edge-types.js +194 -0
- package/esm/rules/relay-page-info.d.mts +12 -0
- package/esm/rules/relay-page-info.js +98 -0
- package/esm/rules/require-deprecation-date.d.mts +26 -0
- package/esm/rules/require-deprecation-date.js +141 -0
- package/esm/rules/require-deprecation-reason.d.mts +12 -0
- package/esm/rules/require-deprecation-reason.js +70 -0
- package/esm/rules/require-description.d.mts +23 -0
- package/esm/rules/require-description.js +186 -0
- package/esm/rules/require-field-of-type-query-in-mutation-result.d.mts +12 -0
- package/esm/rules/require-field-of-type-query-in-mutation-result.js +79 -0
- package/esm/rules/require-id-when-available.d.mts +44 -0
- package/esm/rules/require-id-when-available.js +231 -0
- package/esm/rules/require-import-fragment.d.mts +12 -0
- package/esm/rules/require-import-fragment.js +133 -0
- package/esm/rules/require-nullable-fields-with-oneof.d.mts +12 -0
- package/esm/rules/require-nullable-fields-with-oneof.js +69 -0
- package/esm/rules/require-nullable-result-in-root.d.mts +12 -0
- package/esm/rules/require-nullable-result-in-root.js +86 -0
- package/esm/rules/require-type-pattern-with-oneof.d.mts +12 -0
- package/esm/rules/require-type-pattern-with-oneof.js +68 -0
- package/esm/rules/selection-set-depth.d.mts +36 -0
- package/esm/rules/selection-set-depth.js +142 -0
- package/esm/rules/strict-id-in-types.d.mts +65 -0
- package/esm/rules/strict-id-in-types.js +169 -0
- package/esm/rules/unique-fragment-name.d.mts +13 -0
- package/esm/rules/unique-fragment-name.js +94 -0
- package/esm/rules/unique-operation-name.d.mts +12 -0
- package/esm/rules/unique-operation-name.js +72 -0
- package/esm/schema.d.mts +12 -0
- package/esm/schema.js +32 -0
- package/esm/siblings.d.mts +8 -0
- package/esm/siblings.js +116 -0
- package/esm/types-ace77d86.d.ts +107 -0
- package/esm/types.d.mts +8 -0
- package/esm/types.js +0 -0
- package/esm/utils.d.mts +44 -0
- package/esm/utils.js +155 -0
- package/package.json +47 -34
- package/configs/base.json +0 -4
- package/configs/operations-all.json +0 -24
- package/configs/schema-all.json +0 -26
- package/docs/README.md +0 -75
- package/docs/custom-rules.md +0 -148
- package/docs/deprecated-rules.md +0 -21
- package/docs/parser-options.md +0 -85
- package/docs/parser.md +0 -49
- package/docs/rules/alphabetize.md +0 -178
- package/docs/rules/description-style.md +0 -54
- package/docs/rules/executable-definitions.md +0 -17
- package/docs/rules/fields-on-correct-type.md +0 -17
- package/docs/rules/fragments-on-composite-type.md +0 -17
- package/docs/rules/input-name.md +0 -76
- package/docs/rules/known-argument-names.md +0 -17
- package/docs/rules/known-directives.md +0 -44
- package/docs/rules/known-fragment-names.md +0 -69
- package/docs/rules/known-type-names.md +0 -17
- package/docs/rules/lone-anonymous-operation.md +0 -17
- package/docs/rules/lone-schema-definition.md +0 -17
- package/docs/rules/match-document-filename.md +0 -156
- package/docs/rules/naming-convention.md +0 -300
- package/docs/rules/no-anonymous-operations.md +0 -39
- package/docs/rules/no-case-insensitive-enum-values-duplicates.md +0 -43
- package/docs/rules/no-deprecated.md +0 -85
- package/docs/rules/no-duplicate-fields.md +0 -65
- package/docs/rules/no-fragment-cycles.md +0 -17
- package/docs/rules/no-hashtag-description.md +0 -59
- package/docs/rules/no-root-type.md +0 -53
- package/docs/rules/no-scalar-result-type-on-mutation.md +0 -37
- package/docs/rules/no-typename-prefix.md +0 -39
- package/docs/rules/no-undefined-variables.md +0 -17
- package/docs/rules/no-unreachable-types.md +0 -49
- package/docs/rules/no-unused-fields.md +0 -62
- package/docs/rules/no-unused-fragments.md +0 -17
- package/docs/rules/no-unused-variables.md +0 -17
- package/docs/rules/one-field-subscriptions.md +0 -17
- package/docs/rules/overlapping-fields-can-be-merged.md +0 -17
- package/docs/rules/possible-fragment-spread.md +0 -17
- package/docs/rules/possible-type-extension.md +0 -15
- package/docs/rules/provided-required-arguments.md +0 -17
- package/docs/rules/relay-arguments.md +0 -57
- package/docs/rules/relay-connection-types.md +0 -42
- package/docs/rules/relay-edge-types.md +0 -56
- package/docs/rules/relay-page-info.md +0 -32
- package/docs/rules/require-deprecation-date.md +0 -56
- package/docs/rules/require-deprecation-reason.md +0 -47
- package/docs/rules/require-description.md +0 -115
- package/docs/rules/require-field-of-type-query-in-mutation-result.md +0 -47
- package/docs/rules/require-id-when-available.md +0 -88
- package/docs/rules/scalar-leafs.md +0 -17
- package/docs/rules/selection-set-depth.md +0 -76
- package/docs/rules/strict-id-in-types.md +0 -130
- package/docs/rules/unique-argument-names.md +0 -17
- package/docs/rules/unique-directive-names-per-location.md +0 -17
- package/docs/rules/unique-directive-names.md +0 -17
- package/docs/rules/unique-enum-value-names.md +0 -15
- package/docs/rules/unique-field-definition-names.md +0 -17
- package/docs/rules/unique-fragment-name.md +0 -51
- package/docs/rules/unique-input-field-names.md +0 -17
- package/docs/rules/unique-operation-name.md +0 -55
- package/docs/rules/unique-operation-types.md +0 -17
- package/docs/rules/unique-type-names.md +0 -17
- package/docs/rules/unique-variable-names.md +0 -17
- package/docs/rules/value-literals-of-correct-type.md +0 -17
- package/docs/rules/variables-are-input-types.md +0 -17
- package/docs/rules/variables-in-allowed-position.md +0 -17
- package/estree-converter/converter.d.ts +0 -3
- package/estree-converter/index.d.ts +0 -3
- package/estree-converter/types.d.ts +0 -40
- package/estree-converter/utils.d.ts +0 -13
- package/graphql-config.d.ts +0 -3
- package/index.d.ts +0 -16
- package/index.js +0 -4653
- package/index.mjs +0 -4641
- package/parser.d.ts +0 -2
- package/processor.d.ts +0 -7
- package/rules/alphabetize.d.ts +0 -16
- package/rules/description-style.d.ts +0 -6
- package/rules/graphql-js-validation.d.ts +0 -2
- package/rules/index.d.ts +0 -41
- package/rules/input-name.d.ts +0 -9
- package/rules/match-document-filename.d.ts +0 -18
- package/rules/naming-convention.d.ts +0 -37
- package/rules/no-anonymous-operations.d.ts +0 -3
- package/rules/no-case-insensitive-enum-values-duplicates.d.ts +0 -3
- package/rules/no-deprecated.d.ts +0 -3
- package/rules/no-duplicate-fields.d.ts +0 -3
- package/rules/no-hashtag-description.d.ts +0 -3
- package/rules/no-root-type.d.ts +0 -7
- package/rules/no-scalar-result-type-on-mutation.d.ts +0 -3
- package/rules/no-typename-prefix.d.ts +0 -3
- package/rules/no-unreachable-types.d.ts +0 -3
- package/rules/no-unused-fields.d.ts +0 -3
- package/rules/relay-arguments.d.ts +0 -6
- package/rules/relay-connection-types.d.ts +0 -5
- package/rules/relay-edge-types.d.ts +0 -8
- package/rules/relay-page-info.d.ts +0 -3
- package/rules/require-deprecation-date.d.ts +0 -5
- package/rules/require-deprecation-reason.d.ts +0 -3
- package/rules/require-description.d.ts +0 -11
- package/rules/require-field-of-type-query-in-mutation-result.d.ts +0 -3
- package/rules/require-id-when-available.d.ts +0 -6
- package/rules/selection-set-depth.d.ts +0 -7
- package/rules/strict-id-in-types.d.ts +0 -11
- package/rules/unique-fragment-name.d.ts +0 -6
- package/rules/unique-operation-name.d.ts +0 -3
- package/schema.d.ts +0 -3
- package/sibling-operations.d.ts +0 -21
- package/testkit.d.ts +0 -27
- package/types.d.ts +0 -79
- package/utils.d.ts +0 -39
@@ -0,0 +1,212 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var relay_edge_types_exports = {};
|
20
|
+
__export(relay_edge_types_exports, {
|
21
|
+
rule: () => rule
|
22
|
+
});
|
23
|
+
module.exports = __toCommonJS(relay_edge_types_exports);
|
24
|
+
var import_utils = require("@graphql-tools/utils");
|
25
|
+
var import_graphql = require("graphql");
|
26
|
+
var import_utils2 = require("../utils.js");
|
27
|
+
const RULE_ID = "relay-edge-types";
|
28
|
+
const MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE";
|
29
|
+
const MESSAGE_MISSING_EDGE_SUFFIX = "MESSAGE_MISSING_EDGE_SUFFIX";
|
30
|
+
const MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE = "MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE";
|
31
|
+
const MESSAGE_SHOULD_IMPLEMENTS_NODE = "MESSAGE_SHOULD_IMPLEMENTS_NODE";
|
32
|
+
let edgeTypesCache;
|
33
|
+
function getEdgeTypes(schema2) {
|
34
|
+
if (edgeTypesCache) {
|
35
|
+
return edgeTypesCache;
|
36
|
+
}
|
37
|
+
const edgeTypes = /* @__PURE__ */ new Set();
|
38
|
+
const visitor = {
|
39
|
+
ObjectTypeDefinition(node) {
|
40
|
+
var _a;
|
41
|
+
const typeName = node.name.value;
|
42
|
+
const hasConnectionSuffix = typeName.endsWith("Connection");
|
43
|
+
if (!hasConnectionSuffix) {
|
44
|
+
return;
|
45
|
+
}
|
46
|
+
const edges = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "edges");
|
47
|
+
if (edges) {
|
48
|
+
const edgesTypeName = (0, import_utils2.getTypeName)(edges);
|
49
|
+
const edgesType = schema2.getType(edgesTypeName);
|
50
|
+
if ((0, import_graphql.isObjectType)(edgesType)) {
|
51
|
+
edgeTypes.add(edgesTypeName);
|
52
|
+
}
|
53
|
+
}
|
54
|
+
}
|
55
|
+
};
|
56
|
+
const astNode = (0, import_utils.getDocumentNodeFromSchema)(schema2);
|
57
|
+
(0, import_graphql.visit)(astNode, visitor);
|
58
|
+
edgeTypesCache = edgeTypes;
|
59
|
+
return edgeTypesCache;
|
60
|
+
}
|
61
|
+
const schema = {
|
62
|
+
type: "array",
|
63
|
+
maxItems: 1,
|
64
|
+
items: {
|
65
|
+
type: "object",
|
66
|
+
additionalProperties: false,
|
67
|
+
minProperties: 1,
|
68
|
+
properties: {
|
69
|
+
withEdgeSuffix: {
|
70
|
+
type: "boolean",
|
71
|
+
default: true,
|
72
|
+
description: 'Edge type name must end in "Edge".'
|
73
|
+
},
|
74
|
+
shouldImplementNode: {
|
75
|
+
type: "boolean",
|
76
|
+
default: true,
|
77
|
+
description: "Edge type's field `node` must implement `Node` interface."
|
78
|
+
},
|
79
|
+
listTypeCanWrapOnlyEdgeType: {
|
80
|
+
type: "boolean",
|
81
|
+
default: true,
|
82
|
+
description: "A list type should only wrap an edge type."
|
83
|
+
}
|
84
|
+
}
|
85
|
+
}
|
86
|
+
};
|
87
|
+
const rule = {
|
88
|
+
meta: {
|
89
|
+
type: "problem",
|
90
|
+
docs: {
|
91
|
+
category: "Schema",
|
92
|
+
description: [
|
93
|
+
"Set of rules to follow Relay specification for Edge types.",
|
94
|
+
"",
|
95
|
+
"- A type that is returned in list form by a connection type's `edges` field is considered by this spec to be an Edge type",
|
96
|
+
"- Edge type must be an Object type",
|
97
|
+
"- Edge type must contain a field `node` that return either Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types. Notably, this field cannot return a list",
|
98
|
+
"- Edge type must contain a field `cursor` that return either String, Scalar, or a non-null wrapper around one of those types",
|
99
|
+
'- Edge type name must end in "Edge" _(optional)_',
|
100
|
+
"- Edge type's field `node` must implement `Node` interface _(optional)_",
|
101
|
+
"- A list type should only wrap an edge type _(optional)_"
|
102
|
+
].join("\n"),
|
103
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
104
|
+
isDisabledForAllConfig: true,
|
105
|
+
requiresSchema: true,
|
106
|
+
examples: [
|
107
|
+
{
|
108
|
+
title: "Correct",
|
109
|
+
code: (
|
110
|
+
/* GraphQL */
|
111
|
+
`
|
112
|
+
type UserConnection {
|
113
|
+
edges: [UserEdge]
|
114
|
+
pageInfo: PageInfo!
|
115
|
+
}
|
116
|
+
`
|
117
|
+
)
|
118
|
+
}
|
119
|
+
]
|
120
|
+
},
|
121
|
+
messages: {
|
122
|
+
[MESSAGE_MUST_BE_OBJECT_TYPE]: "Edge type must be an Object type.",
|
123
|
+
[MESSAGE_MISSING_EDGE_SUFFIX]: 'Edge type must have "Edge" suffix.',
|
124
|
+
[MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE]: "A list type should only wrap an edge type.",
|
125
|
+
[MESSAGE_SHOULD_IMPLEMENTS_NODE]: "Edge type's field `node` must implement `Node` interface."
|
126
|
+
},
|
127
|
+
schema
|
128
|
+
},
|
129
|
+
create(context) {
|
130
|
+
const schema2 = (0, import_utils2.requireGraphQLSchemaFromContext)(RULE_ID, context);
|
131
|
+
const edgeTypes = getEdgeTypes(schema2);
|
132
|
+
const options = {
|
133
|
+
withEdgeSuffix: true,
|
134
|
+
shouldImplementNode: true,
|
135
|
+
listTypeCanWrapOnlyEdgeType: true,
|
136
|
+
...context.options[0]
|
137
|
+
};
|
138
|
+
const isNamedOrNonNullNamed = (node) => node.kind === import_graphql.Kind.NAMED_TYPE || node.kind === import_graphql.Kind.NON_NULL_TYPE && node.gqlType.kind === import_graphql.Kind.NAMED_TYPE;
|
139
|
+
const checkNodeField = (node) => {
|
140
|
+
var _a, _b;
|
141
|
+
const nodeField = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "node");
|
142
|
+
const message = "return either a Scalar, Enum, Object, Interface, Union, or a non-null wrapper around one of those types.";
|
143
|
+
if (!nodeField) {
|
144
|
+
context.report({
|
145
|
+
node: node.name,
|
146
|
+
message: `Edge type must contain a field \`node\` that ${message}`
|
147
|
+
});
|
148
|
+
} else if (!isNamedOrNonNullNamed(nodeField.gqlType)) {
|
149
|
+
context.report({ node: nodeField.name, message: `Field \`node\` must ${message}` });
|
150
|
+
} else if (options.shouldImplementNode) {
|
151
|
+
const nodeReturnTypeName = (0, import_utils2.getTypeName)(nodeField.gqlType.rawNode());
|
152
|
+
const type = schema2.getType(nodeReturnTypeName);
|
153
|
+
if (!(0, import_graphql.isObjectType)(type)) {
|
154
|
+
return;
|
155
|
+
}
|
156
|
+
const implementsNode = (_b = type.astNode.interfaces) == null ? void 0 : _b.some((n) => n.name.value === "Node");
|
157
|
+
if (!implementsNode) {
|
158
|
+
context.report({ node: node.name, messageId: MESSAGE_SHOULD_IMPLEMENTS_NODE });
|
159
|
+
}
|
160
|
+
}
|
161
|
+
};
|
162
|
+
const checkCursorField = (node) => {
|
163
|
+
var _a;
|
164
|
+
const cursorField = (_a = node.fields) == null ? void 0 : _a.find((field) => field.name.value === "cursor");
|
165
|
+
const message = "return either a String, Scalar, or a non-null wrapper wrapper around one of those types.";
|
166
|
+
if (!cursorField) {
|
167
|
+
context.report({
|
168
|
+
node: node.name,
|
169
|
+
message: `Edge type must contain a field \`cursor\` that ${message}`
|
170
|
+
});
|
171
|
+
return;
|
172
|
+
}
|
173
|
+
const typeName = (0, import_utils2.getTypeName)(cursorField.rawNode());
|
174
|
+
if (!isNamedOrNonNullNamed(cursorField.gqlType) || typeName !== "String" && !(0, import_graphql.isScalarType)(schema2.getType(typeName))) {
|
175
|
+
context.report({ node: cursorField.name, message: `Field \`cursor\` must ${message}` });
|
176
|
+
}
|
177
|
+
};
|
178
|
+
const listeners = {
|
179
|
+
":matches(ObjectTypeDefinition, ObjectTypeExtension)[name.value=/Connection$/] > FieldDefinition[name.value=edges] > .gqlType Name"(node) {
|
180
|
+
const type = schema2.getType(node.value);
|
181
|
+
if (!(0, import_graphql.isObjectType)(type)) {
|
182
|
+
context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
|
183
|
+
}
|
184
|
+
},
|
185
|
+
":matches(ObjectTypeDefinition, ObjectTypeExtension)"(node) {
|
186
|
+
const typeName = node.name.value;
|
187
|
+
if (edgeTypes.has(typeName)) {
|
188
|
+
checkNodeField(node);
|
189
|
+
checkCursorField(node);
|
190
|
+
if (options.withEdgeSuffix && !typeName.endsWith("Edge")) {
|
191
|
+
context.report({ node: node.name, messageId: MESSAGE_MISSING_EDGE_SUFFIX });
|
192
|
+
}
|
193
|
+
}
|
194
|
+
}
|
195
|
+
};
|
196
|
+
if (options.listTypeCanWrapOnlyEdgeType) {
|
197
|
+
listeners["FieldDefinition > .gqlType"] = (node) => {
|
198
|
+
if (node.kind === import_graphql.Kind.LIST_TYPE || node.kind === import_graphql.Kind.NON_NULL_TYPE && node.gqlType.kind === import_graphql.Kind.LIST_TYPE) {
|
199
|
+
const typeName = (0, import_utils2.getTypeName)(node.rawNode());
|
200
|
+
if (!edgeTypes.has(typeName)) {
|
201
|
+
context.report({ node, messageId: MESSAGE_LIST_TYPE_ONLY_EDGE_TYPE });
|
202
|
+
}
|
203
|
+
}
|
204
|
+
};
|
205
|
+
}
|
206
|
+
return listeners;
|
207
|
+
}
|
208
|
+
};
|
209
|
+
// Annotate the CommonJS export names for ESM import in node:
|
210
|
+
0 && (module.exports = {
|
211
|
+
rule
|
212
|
+
});
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { f as GraphQLESLintRule } from '../types-8d5f4ae0.js';
|
2
|
+
import '@graphql-tools/utils';
|
3
|
+
import 'eslint';
|
4
|
+
import 'estree';
|
5
|
+
import 'graphql';
|
6
|
+
import 'graphql-config';
|
7
|
+
import 'json-schema-to-ts';
|
8
|
+
import '../estree-converter/types.js';
|
9
|
+
|
10
|
+
declare const rule: GraphQLESLintRule;
|
11
|
+
|
12
|
+
export { rule };
|
@@ -0,0 +1,121 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var relay_page_info_exports = {};
|
20
|
+
__export(relay_page_info_exports, {
|
21
|
+
rule: () => rule
|
22
|
+
});
|
23
|
+
module.exports = __toCommonJS(relay_page_info_exports);
|
24
|
+
var import_graphql = require("graphql");
|
25
|
+
var import_utils = require("../utils.js");
|
26
|
+
var import_relay_connection_types = require("./relay-connection-types.js");
|
27
|
+
const RULE_ID = "relay-page-info";
|
28
|
+
const MESSAGE_MUST_EXIST = "MESSAGE_MUST_EXIST";
|
29
|
+
const MESSAGE_MUST_BE_OBJECT_TYPE = "MESSAGE_MUST_BE_OBJECT_TYPE";
|
30
|
+
const notPageInfoTypesSelector = `:matches(${import_relay_connection_types.NON_OBJECT_TYPES})[name.value=PageInfo] > .name`;
|
31
|
+
let hasPageInfoChecked = false;
|
32
|
+
const rule = {
|
33
|
+
meta: {
|
34
|
+
type: "problem",
|
35
|
+
docs: {
|
36
|
+
category: "Schema",
|
37
|
+
description: [
|
38
|
+
"Set of rules to follow Relay specification for `PageInfo` object.",
|
39
|
+
"",
|
40
|
+
"- `PageInfo` must be an Object type",
|
41
|
+
"- `PageInfo` must contain fields `hasPreviousPage` and `hasNextPage`, that return non-null Boolean",
|
42
|
+
"- `PageInfo` must contain fields `startCursor` and `endCursor`, that return either String or Scalar, which can be null if there are no results"
|
43
|
+
].join("\n"),
|
44
|
+
url: `https://the-guild.dev/graphql/eslint/rules/${RULE_ID}`,
|
45
|
+
examples: [
|
46
|
+
{
|
47
|
+
title: "Correct",
|
48
|
+
code: (
|
49
|
+
/* GraphQL */
|
50
|
+
`
|
51
|
+
type PageInfo {
|
52
|
+
hasPreviousPage: Boolean!
|
53
|
+
hasNextPage: Boolean!
|
54
|
+
startCursor: String
|
55
|
+
endCursor: String
|
56
|
+
}
|
57
|
+
`
|
58
|
+
)
|
59
|
+
}
|
60
|
+
],
|
61
|
+
isDisabledForAllConfig: true,
|
62
|
+
requiresSchema: true
|
63
|
+
},
|
64
|
+
messages: {
|
65
|
+
[MESSAGE_MUST_EXIST]: "The server must provide a `PageInfo` object.",
|
66
|
+
[MESSAGE_MUST_BE_OBJECT_TYPE]: "`PageInfo` must be an Object type."
|
67
|
+
},
|
68
|
+
schema: []
|
69
|
+
},
|
70
|
+
create(context) {
|
71
|
+
const schema = (0, import_utils.requireGraphQLSchemaFromContext)(RULE_ID, context);
|
72
|
+
if (!hasPageInfoChecked) {
|
73
|
+
const pageInfoType = schema.getType("PageInfo");
|
74
|
+
if (!pageInfoType) {
|
75
|
+
context.report({
|
76
|
+
loc: import_utils.REPORT_ON_FIRST_CHARACTER,
|
77
|
+
messageId: MESSAGE_MUST_EXIST
|
78
|
+
});
|
79
|
+
}
|
80
|
+
hasPageInfoChecked = true;
|
81
|
+
}
|
82
|
+
return {
|
83
|
+
[notPageInfoTypesSelector](node) {
|
84
|
+
context.report({ node, messageId: MESSAGE_MUST_BE_OBJECT_TYPE });
|
85
|
+
},
|
86
|
+
"ObjectTypeDefinition[name.value=PageInfo]"(node) {
|
87
|
+
var _a;
|
88
|
+
const fieldMap = Object.fromEntries(
|
89
|
+
((_a = node.fields) == null ? void 0 : _a.map((field) => [field.name.value, field])) || []
|
90
|
+
);
|
91
|
+
const checkField = (fieldName, typeName) => {
|
92
|
+
const field = fieldMap[fieldName];
|
93
|
+
let isAllowedType = false;
|
94
|
+
if (field) {
|
95
|
+
const type = field.gqlType;
|
96
|
+
if (typeName === "Boolean") {
|
97
|
+
isAllowedType = type.kind === import_graphql.Kind.NON_NULL_TYPE && type.gqlType.kind === import_graphql.Kind.NAMED_TYPE && type.gqlType.name.value === "Boolean";
|
98
|
+
} else if (type.kind === import_graphql.Kind.NAMED_TYPE) {
|
99
|
+
isAllowedType = type.name.value === "String" || (0, import_graphql.isScalarType)(schema.getType(type.name.value));
|
100
|
+
}
|
101
|
+
}
|
102
|
+
if (!isAllowedType) {
|
103
|
+
const returnType = typeName === "Boolean" ? "non-null Boolean" : "either String or Scalar, which can be null if there are no results";
|
104
|
+
context.report({
|
105
|
+
node: field ? field.name : node.name,
|
106
|
+
message: field ? `Field \`${fieldName}\` must return ${returnType}.` : `\`PageInfo\` must contain a field \`${fieldName}\`, that return ${returnType}.`
|
107
|
+
});
|
108
|
+
}
|
109
|
+
};
|
110
|
+
checkField("hasPreviousPage", "Boolean");
|
111
|
+
checkField("hasNextPage", "Boolean");
|
112
|
+
checkField("startCursor", "String");
|
113
|
+
checkField("endCursor", "String");
|
114
|
+
}
|
115
|
+
};
|
116
|
+
}
|
117
|
+
};
|
118
|
+
// Annotate the CommonJS export names for ESM import in node:
|
119
|
+
0 && (module.exports = {
|
120
|
+
rule
|
121
|
+
});
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { FromSchema } from 'json-schema-to-ts';
|
2
|
+
import { f as GraphQLESLintRule } from '../types-8d5f4ae0.js';
|
3
|
+
import '@graphql-tools/utils';
|
4
|
+
import 'eslint';
|
5
|
+
import 'estree';
|
6
|
+
import 'graphql';
|
7
|
+
import 'graphql-config';
|
8
|
+
import '../estree-converter/types.js';
|
9
|
+
|
10
|
+
declare const schema: {
|
11
|
+
readonly type: "array";
|
12
|
+
readonly maxItems: 1;
|
13
|
+
readonly items: {
|
14
|
+
readonly type: "object";
|
15
|
+
readonly additionalProperties: false;
|
16
|
+
readonly properties: {
|
17
|
+
readonly argumentName: {
|
18
|
+
readonly type: "string";
|
19
|
+
};
|
20
|
+
};
|
21
|
+
};
|
22
|
+
};
|
23
|
+
type RuleOptions = FromSchema<typeof schema>;
|
24
|
+
declare const rule: GraphQLESLintRule<RuleOptions>;
|
25
|
+
|
26
|
+
export { RuleOptions, rule };
|
@@ -0,0 +1,164 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var require_deprecation_date_exports = {};
|
20
|
+
__export(require_deprecation_date_exports, {
|
21
|
+
rule: () => rule
|
22
|
+
});
|
23
|
+
module.exports = __toCommonJS(require_deprecation_date_exports);
|
24
|
+
var import_estree_converter = require("../estree-converter/index.js");
|
25
|
+
var import_utils = require("../utils.js");
|
26
|
+
const DATE_REGEX = /^\d{2}\/\d{2}\/\d{4}$/;
|
27
|
+
const MESSAGE_REQUIRE_DATE = "MESSAGE_REQUIRE_DATE";
|
28
|
+
const MESSAGE_INVALID_FORMAT = "MESSAGE_INVALID_FORMAT";
|
29
|
+
const MESSAGE_INVALID_DATE = "MESSAGE_INVALID_DATE";
|
30
|
+
const MESSAGE_CAN_BE_REMOVED = "MESSAGE_CAN_BE_REMOVED";
|
31
|
+
const schema = {
|
32
|
+
type: "array",
|
33
|
+
maxItems: 1,
|
34
|
+
items: {
|
35
|
+
type: "object",
|
36
|
+
additionalProperties: false,
|
37
|
+
properties: {
|
38
|
+
argumentName: {
|
39
|
+
type: "string"
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
};
|
44
|
+
const rule = {
|
45
|
+
meta: {
|
46
|
+
type: "suggestion",
|
47
|
+
hasSuggestions: true,
|
48
|
+
docs: {
|
49
|
+
category: "Schema",
|
50
|
+
description: "Require deletion date on `@deprecated` directive. Suggest removing deprecated things after deprecated date.",
|
51
|
+
url: "https://the-guild.dev/graphql/eslint/rules/require-deprecation-date",
|
52
|
+
examples: [
|
53
|
+
{
|
54
|
+
title: "Incorrect",
|
55
|
+
code: (
|
56
|
+
/* GraphQL */
|
57
|
+
`
|
58
|
+
type User {
|
59
|
+
firstname: String @deprecated
|
60
|
+
firstName: String
|
61
|
+
}
|
62
|
+
`
|
63
|
+
)
|
64
|
+
},
|
65
|
+
{
|
66
|
+
title: "Incorrect",
|
67
|
+
code: (
|
68
|
+
/* GraphQL */
|
69
|
+
`
|
70
|
+
type User {
|
71
|
+
firstname: String @deprecated(reason: "Use 'firstName' instead")
|
72
|
+
firstName: String
|
73
|
+
}
|
74
|
+
`
|
75
|
+
)
|
76
|
+
},
|
77
|
+
{
|
78
|
+
title: "Correct",
|
79
|
+
code: (
|
80
|
+
/* GraphQL */
|
81
|
+
`
|
82
|
+
type User {
|
83
|
+
firstname: String
|
84
|
+
@deprecated(reason: "Use 'firstName' instead", deletionDate: "25/12/2022")
|
85
|
+
firstName: String
|
86
|
+
}
|
87
|
+
`
|
88
|
+
)
|
89
|
+
}
|
90
|
+
]
|
91
|
+
},
|
92
|
+
messages: {
|
93
|
+
[MESSAGE_REQUIRE_DATE]: 'Directive "@deprecated" must have a deletion date for {{ nodeName }}',
|
94
|
+
[MESSAGE_INVALID_FORMAT]: 'Deletion date must be in format "DD/MM/YYYY" for {{ nodeName }}',
|
95
|
+
[MESSAGE_INVALID_DATE]: 'Invalid "{{ deletionDate }}" deletion date for {{ nodeName }}',
|
96
|
+
[MESSAGE_CAN_BE_REMOVED]: "{{ nodeName }} \u0441an be removed"
|
97
|
+
},
|
98
|
+
schema
|
99
|
+
},
|
100
|
+
create(context) {
|
101
|
+
return {
|
102
|
+
"Directive[name.value=deprecated]"(node) {
|
103
|
+
var _a, _b;
|
104
|
+
const argName = ((_a = context.options[0]) == null ? void 0 : _a.argumentName) || "deletionDate";
|
105
|
+
const deletionDateNode = (_b = node.arguments) == null ? void 0 : _b.find((arg) => arg.name.value === argName);
|
106
|
+
if (!deletionDateNode) {
|
107
|
+
context.report({
|
108
|
+
node: node.name,
|
109
|
+
messageId: MESSAGE_REQUIRE_DATE,
|
110
|
+
data: {
|
111
|
+
nodeName: (0, import_utils.getNodeName)(node.parent)
|
112
|
+
}
|
113
|
+
});
|
114
|
+
return;
|
115
|
+
}
|
116
|
+
const deletionDate = (0, import_estree_converter.valueFromNode)(deletionDateNode.value);
|
117
|
+
const isValidDate = DATE_REGEX.test(deletionDate);
|
118
|
+
if (!isValidDate) {
|
119
|
+
context.report({
|
120
|
+
node: deletionDateNode.value,
|
121
|
+
messageId: MESSAGE_INVALID_FORMAT,
|
122
|
+
data: { nodeName: (0, import_utils.getNodeName)(node.parent) }
|
123
|
+
});
|
124
|
+
return;
|
125
|
+
}
|
126
|
+
let [day, month, year] = deletionDate.split("/");
|
127
|
+
day = day.padStart(2, "0");
|
128
|
+
month = month.padStart(2, "0");
|
129
|
+
const deletionDateInMS = Date.parse(`${year}-${month}-${day}`);
|
130
|
+
if (Number.isNaN(deletionDateInMS)) {
|
131
|
+
context.report({
|
132
|
+
node: deletionDateNode.value,
|
133
|
+
messageId: MESSAGE_INVALID_DATE,
|
134
|
+
data: {
|
135
|
+
deletionDate,
|
136
|
+
nodeName: (0, import_utils.getNodeName)(node.parent)
|
137
|
+
}
|
138
|
+
});
|
139
|
+
return;
|
140
|
+
}
|
141
|
+
const canRemove = Date.now() > deletionDateInMS;
|
142
|
+
if (canRemove) {
|
143
|
+
const { parent } = node;
|
144
|
+
const nodeName = parent.name.value;
|
145
|
+
context.report({
|
146
|
+
node: parent.name,
|
147
|
+
messageId: MESSAGE_CAN_BE_REMOVED,
|
148
|
+
data: { nodeName: (0, import_utils.getNodeName)(parent) },
|
149
|
+
suggest: [
|
150
|
+
{
|
151
|
+
desc: `Remove \`${nodeName}\``,
|
152
|
+
fix: (fixer) => fixer.remove(parent)
|
153
|
+
}
|
154
|
+
]
|
155
|
+
});
|
156
|
+
}
|
157
|
+
}
|
158
|
+
};
|
159
|
+
}
|
160
|
+
};
|
161
|
+
// Annotate the CommonJS export names for ESM import in node:
|
162
|
+
0 && (module.exports = {
|
163
|
+
rule
|
164
|
+
});
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { f as GraphQLESLintRule } from '../types-8d5f4ae0.js';
|
2
|
+
import '@graphql-tools/utils';
|
3
|
+
import 'eslint';
|
4
|
+
import 'estree';
|
5
|
+
import 'graphql';
|
6
|
+
import 'graphql-config';
|
7
|
+
import 'json-schema-to-ts';
|
8
|
+
import '../estree-converter/types.js';
|
9
|
+
|
10
|
+
declare const rule: GraphQLESLintRule;
|
11
|
+
|
12
|
+
export { rule };
|
@@ -0,0 +1,93 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __defProp = Object.defineProperty;
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
6
|
+
var __export = (target, all) => {
|
7
|
+
for (var name in all)
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
9
|
+
};
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
12
|
+
for (let key of __getOwnPropNames(from))
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
15
|
+
}
|
16
|
+
return to;
|
17
|
+
};
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
19
|
+
var require_deprecation_reason_exports = {};
|
20
|
+
__export(require_deprecation_reason_exports, {
|
21
|
+
rule: () => rule
|
22
|
+
});
|
23
|
+
module.exports = __toCommonJS(require_deprecation_reason_exports);
|
24
|
+
var import_estree_converter = require("../estree-converter/index.js");
|
25
|
+
var import_utils = require("../utils.js");
|
26
|
+
const rule = {
|
27
|
+
meta: {
|
28
|
+
docs: {
|
29
|
+
description: "Require all deprecation directives to specify a reason.",
|
30
|
+
category: "Schema",
|
31
|
+
url: "https://the-guild.dev/graphql/eslint/rules/require-deprecation-reason",
|
32
|
+
recommended: true,
|
33
|
+
examples: [
|
34
|
+
{
|
35
|
+
title: "Incorrect",
|
36
|
+
code: (
|
37
|
+
/* GraphQL */
|
38
|
+
`
|
39
|
+
type MyType {
|
40
|
+
name: String @deprecated
|
41
|
+
}
|
42
|
+
`
|
43
|
+
)
|
44
|
+
},
|
45
|
+
{
|
46
|
+
title: "Incorrect",
|
47
|
+
code: (
|
48
|
+
/* GraphQL */
|
49
|
+
`
|
50
|
+
type MyType {
|
51
|
+
name: String @deprecated(reason: "")
|
52
|
+
}
|
53
|
+
`
|
54
|
+
)
|
55
|
+
},
|
56
|
+
{
|
57
|
+
title: "Correct",
|
58
|
+
code: (
|
59
|
+
/* GraphQL */
|
60
|
+
`
|
61
|
+
type MyType {
|
62
|
+
name: String @deprecated(reason: "no longer relevant, please use fullName field")
|
63
|
+
}
|
64
|
+
`
|
65
|
+
)
|
66
|
+
}
|
67
|
+
]
|
68
|
+
},
|
69
|
+
type: "suggestion",
|
70
|
+
schema: []
|
71
|
+
},
|
72
|
+
create(context) {
|
73
|
+
return {
|
74
|
+
"Directive[name.value=deprecated]"(node) {
|
75
|
+
var _a;
|
76
|
+
const reasonArgument = (_a = node.arguments) == null ? void 0 : _a.find(
|
77
|
+
(arg) => arg.name.value === "reason"
|
78
|
+
);
|
79
|
+
const value = reasonArgument && String((0, import_estree_converter.valueFromNode)(reasonArgument.value)).trim();
|
80
|
+
if (!value) {
|
81
|
+
context.report({
|
82
|
+
node: node.name,
|
83
|
+
message: `Deprecation reason is required for ${(0, import_utils.getNodeName)(node.parent)}.`
|
84
|
+
});
|
85
|
+
}
|
86
|
+
}
|
87
|
+
};
|
88
|
+
}
|
89
|
+
};
|
90
|
+
// Annotate the CommonJS export names for ESM import in node:
|
91
|
+
0 && (module.exports = {
|
92
|
+
rule
|
93
|
+
});
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import { Kind } from 'graphql';
|
2
|
+
import { f as GraphQLESLintRule } from '../types-8d5f4ae0.js';
|
3
|
+
import '@graphql-tools/utils';
|
4
|
+
import 'eslint';
|
5
|
+
import 'estree';
|
6
|
+
import 'graphql-config';
|
7
|
+
import 'json-schema-to-ts';
|
8
|
+
import '../estree-converter/types.js';
|
9
|
+
|
10
|
+
declare const RULE_ID = "require-description";
|
11
|
+
declare const ALLOWED_KINDS: readonly [Kind.OBJECT_TYPE_DEFINITION, Kind.INTERFACE_TYPE_DEFINITION, Kind.ENUM_TYPE_DEFINITION, Kind.SCALAR_TYPE_DEFINITION, Kind.INPUT_OBJECT_TYPE_DEFINITION, Kind.UNION_TYPE_DEFINITION, Kind.DIRECTIVE_DEFINITION, Kind.FIELD_DEFINITION, Kind.INPUT_VALUE_DEFINITION, Kind.ENUM_VALUE_DEFINITION, Kind.OPERATION_DEFINITION];
|
12
|
+
type AllowedKind = (typeof ALLOWED_KINDS)[number];
|
13
|
+
type RuleOptions = [
|
14
|
+
{
|
15
|
+
[key in AllowedKind]?: boolean;
|
16
|
+
} & {
|
17
|
+
types?: boolean;
|
18
|
+
rootField?: boolean;
|
19
|
+
}
|
20
|
+
];
|
21
|
+
declare const rule: GraphQLESLintRule<RuleOptions>;
|
22
|
+
|
23
|
+
export { RULE_ID, RuleOptions, rule };
|