graphql 14.0.2 → 14.1.0
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/README.md +4 -4
- package/error/GraphQLError.js +1 -1
- package/error/GraphQLError.js.flow +3 -3
- package/error/GraphQLError.mjs +1 -1
- package/error/formatError.js +1 -1
- package/error/formatError.mjs +1 -1
- package/error/index.mjs +1 -1
- package/error/locatedError.js +1 -1
- package/error/locatedError.mjs +1 -1
- package/error/printError.js +1 -1
- package/error/printError.mjs +1 -1
- package/error/syntaxError.js +1 -1
- package/error/syntaxError.mjs +1 -1
- package/execution/execute.mjs +1 -1
- package/execution/index.mjs +1 -1
- package/execution/values.js +3 -3
- package/execution/values.js.flow +1 -1
- package/execution/values.mjs +2 -2
- package/graphql.js +1 -1
- package/graphql.mjs +1 -1
- package/index.js +12 -0
- package/index.js.flow +2 -0
- package/index.mjs +2 -2
- package/jsutils/dedent.js +1 -1
- package/jsutils/dedent.mjs +1 -1
- package/jsutils/defineToJSON.js +17 -6
- package/jsutils/defineToJSON.js.flow +14 -5
- package/jsutils/defineToJSON.mjs +14 -6
- package/jsutils/defineToStringTag.js +5 -5
- package/jsutils/defineToStringTag.js.flow +3 -3
- package/jsutils/defineToStringTag.mjs +4 -4
- package/jsutils/inspect.js +22 -11
- package/jsutils/inspect.js.flow +22 -2
- package/jsutils/inspect.mjs +21 -4
- package/jsutils/instanceOf.js +1 -1
- package/jsutils/instanceOf.mjs +1 -1
- package/jsutils/invariant.js +1 -1
- package/jsutils/invariant.mjs +1 -1
- package/jsutils/isInvalid.js +1 -1
- package/jsutils/isInvalid.mjs +1 -1
- package/jsutils/isNullish.js +1 -1
- package/jsutils/isNullish.mjs +1 -1
- package/jsutils/isPromise.js +1 -1
- package/jsutils/isPromise.mjs +1 -1
- package/jsutils/keyMap.js +1 -1
- package/jsutils/keyMap.mjs +1 -1
- package/jsutils/keyValMap.js +1 -1
- package/jsutils/keyValMap.mjs +1 -1
- package/jsutils/mapValue.js +54 -0
- package/jsutils/mapValue.js.flow +27 -0
- package/jsutils/mapValue.mjs +44 -0
- package/jsutils/memoize3.js +1 -1
- package/jsutils/memoize3.mjs +1 -1
- package/jsutils/nodejsCustomInspectSymbol.js +18 -0
- package/jsutils/nodejsCustomInspectSymbol.js.flow +15 -0
- package/jsutils/nodejsCustomInspectSymbol.mjs +10 -0
- package/jsutils/orList.js +17 -4
- package/jsutils/orList.js.flow +13 -7
- package/jsutils/orList.mjs +14 -4
- package/jsutils/promiseForObject.js +1 -1
- package/jsutils/promiseForObject.mjs +1 -1
- package/jsutils/promiseReduce.js +1 -1
- package/jsutils/promiseReduce.mjs +1 -1
- package/jsutils/quotedOrList.js +1 -1
- package/jsutils/quotedOrList.mjs +1 -1
- package/jsutils/suggestionList.js +1 -1
- package/jsutils/suggestionList.mjs +1 -1
- package/language/blockStringValue.js +1 -1
- package/language/blockStringValue.mjs +1 -1
- package/language/directiveLocation.js +1 -1
- package/language/directiveLocation.mjs +1 -1
- package/language/index.mjs +1 -1
- package/language/kinds.js +1 -1
- package/language/kinds.mjs +1 -1
- package/language/lexer.js +28 -12
- package/language/lexer.js.flow +33 -19
- package/language/lexer.mjs +27 -12
- package/language/location.js +1 -1
- package/language/location.mjs +1 -1
- package/language/parser.js +31 -38
- package/language/parser.js.flow +32 -48
- package/language/parser.mjs +30 -38
- package/language/predicates.js +1 -1
- package/language/predicates.mjs +1 -1
- package/language/printer.js +13 -7
- package/language/printer.js.flow +19 -9
- package/language/printer.mjs +13 -7
- package/language/source.js +8 -7
- package/language/source.mjs +1 -9
- package/language/visitor.js +6 -5
- package/language/visitor.js.flow +2 -4
- package/language/visitor.mjs +6 -5
- package/package.json +5 -2
- package/polyfills/find.js +31 -0
- package/polyfills/find.js.flow +29 -0
- package/polyfills/find.mjs +23 -0
- package/{jsutils → polyfills}/isFinite.js +1 -1
- package/{jsutils → polyfills}/isFinite.js.flow +0 -0
- package/{jsutils → polyfills}/isFinite.mjs +1 -1
- package/{jsutils → polyfills}/isInteger.js +1 -1
- package/{jsutils → polyfills}/isInteger.js.flow +0 -0
- package/{jsutils → polyfills}/isInteger.mjs +1 -1
- package/polyfills/objectEntries.js +26 -0
- package/polyfills/objectEntries.js.flow +19 -0
- package/polyfills/objectEntries.mjs +18 -0
- package/{jsutils → polyfills}/objectValues.js +1 -1
- package/{jsutils → polyfills}/objectValues.js.flow +1 -1
- package/{jsutils → polyfills}/objectValues.mjs +1 -1
- package/subscription/asyncIteratorReject.mjs +1 -1
- package/subscription/index.mjs +1 -1
- package/subscription/mapAsyncIterator.mjs +1 -1
- package/subscription/subscribe.js +1 -1
- package/subscription/subscribe.mjs +1 -1
- package/type/definition.js +31 -130
- package/type/definition.js.flow +35 -47
- package/type/definition.mjs +30 -131
- package/type/directives.js +25 -29
- package/type/directives.js.flow +24 -20
- package/type/directives.mjs +22 -30
- package/type/index.js +12 -0
- package/type/index.js.flow +4 -0
- package/type/index.mjs +5 -3
- package/type/introspection.js +3 -3
- package/type/introspection.js.flow +1 -1
- package/type/introspection.mjs +2 -2
- package/type/scalars.js +45 -34
- package/type/scalars.js.flow +40 -26
- package/type/scalars.mjs +44 -26
- package/type/schema.js +82 -87
- package/type/schema.js.flow +17 -9
- package/type/schema.mjs +79 -86
- package/type/validate.js +168 -175
- package/type/validate.js.flow +8 -49
- package/type/validate.mjs +159 -175
- package/utilities/TypeInfo.js +10 -23
- package/utilities/TypeInfo.js.flow +1 -1
- package/utilities/TypeInfo.mjs +2 -24
- package/utilities/assertValidName.js +1 -1
- package/utilities/assertValidName.mjs +1 -1
- package/utilities/astFromValue.js +2 -2
- package/utilities/astFromValue.js.flow +1 -1
- package/utilities/astFromValue.mjs +2 -2
- package/utilities/buildASTSchema.js +53 -53
- package/utilities/buildASTSchema.js.flow +14 -30
- package/utilities/buildASTSchema.mjs +45 -55
- package/utilities/buildClientSchema.js +3 -3
- package/utilities/buildClientSchema.js.flow +6 -2
- package/utilities/buildClientSchema.mjs +3 -3
- package/utilities/coerceValue.js +38 -19
- package/utilities/coerceValue.js.flow +41 -47
- package/utilities/coerceValue.mjs +38 -20
- package/utilities/concatAST.js +1 -1
- package/utilities/concatAST.mjs +1 -1
- package/utilities/extendSchema.js +228 -312
- package/utilities/extendSchema.js.flow +27 -152
- package/utilities/extendSchema.mjs +229 -312
- package/utilities/findBreakingChanges.js +7 -5
- package/utilities/findBreakingChanges.js.flow +3 -2
- package/utilities/findBreakingChanges.mjs +6 -5
- package/utilities/findDeprecatedUsages.js +1 -1
- package/utilities/findDeprecatedUsages.mjs +1 -1
- package/utilities/getOperationAST.js +1 -1
- package/utilities/getOperationAST.mjs +1 -1
- package/utilities/getOperationRootType.js +1 -1
- package/utilities/getOperationRootType.mjs +1 -1
- package/utilities/index.mjs +1 -1
- package/utilities/introspectionFromSchema.js +1 -1
- package/utilities/introspectionFromSchema.mjs +1 -1
- package/utilities/introspectionQuery.js +1 -1
- package/utilities/introspectionQuery.mjs +1 -1
- package/utilities/isValidJSValue.js +1 -1
- package/utilities/isValidJSValue.mjs +1 -1
- package/utilities/isValidLiteralValue.js +1 -1
- package/utilities/isValidLiteralValue.mjs +1 -1
- package/utilities/lexicographicSortSchema.js +2 -2
- package/utilities/lexicographicSortSchema.js.flow +1 -1
- package/utilities/lexicographicSortSchema.mjs +2 -2
- package/utilities/schemaPrinter.js +3 -3
- package/utilities/schemaPrinter.js.flow +1 -1
- package/utilities/schemaPrinter.mjs +2 -2
- package/utilities/separateOperations.js +1 -1
- package/utilities/separateOperations.mjs +1 -1
- package/utilities/typeComparators.js +1 -1
- package/utilities/typeComparators.mjs +1 -1
- package/utilities/typeFromAST.js +1 -1
- package/utilities/typeFromAST.mjs +1 -1
- package/utilities/valueFromAST.js +3 -3
- package/utilities/valueFromAST.js.flow +1 -1
- package/utilities/valueFromAST.mjs +2 -2
- package/utilities/valueFromASTUntyped.js +1 -1
- package/utilities/valueFromASTUntyped.mjs +1 -1
- package/validation/ValidationContext.js +57 -82
- package/validation/ValidationContext.js.flow +52 -49
- package/validation/ValidationContext.mjs +52 -77
- package/validation/index.mjs +1 -1
- package/validation/rules/ExecutableDefinitions.js +1 -1
- package/validation/rules/ExecutableDefinitions.js.flow +1 -1
- package/validation/rules/ExecutableDefinitions.mjs +1 -1
- package/validation/rules/FieldsOnCorrectType.js +1 -1
- package/validation/rules/FieldsOnCorrectType.mjs +1 -1
- package/validation/rules/FragmentsOnCompositeTypes.js +1 -1
- package/validation/rules/FragmentsOnCompositeTypes.mjs +1 -1
- package/validation/rules/KnownArgumentNames.mjs +1 -1
- package/validation/rules/KnownDirectives.js +1 -1
- package/validation/rules/KnownDirectives.mjs +1 -1
- package/validation/rules/KnownFragmentNames.js +1 -1
- package/validation/rules/KnownFragmentNames.mjs +1 -1
- package/validation/rules/KnownTypeNames.js +59 -21
- package/validation/rules/KnownTypeNames.js.flow +54 -20
- package/validation/rules/KnownTypeNames.mjs +56 -21
- package/validation/rules/LoneAnonymousOperation.js +1 -1
- package/validation/rules/LoneAnonymousOperation.mjs +1 -1
- package/validation/rules/LoneSchemaDefinition.js +1 -1
- package/validation/rules/LoneSchemaDefinition.mjs +1 -1
- package/validation/rules/NoFragmentCycles.js +1 -1
- package/validation/rules/NoFragmentCycles.js.flow +2 -2
- package/validation/rules/NoFragmentCycles.mjs +1 -1
- package/validation/rules/NoUndefinedVariables.js +1 -1
- package/validation/rules/NoUndefinedVariables.mjs +1 -1
- package/validation/rules/NoUnusedFragments.js +1 -1
- package/validation/rules/NoUnusedFragments.js.flow +2 -2
- package/validation/rules/NoUnusedFragments.mjs +1 -1
- package/validation/rules/NoUnusedVariables.js +1 -1
- package/validation/rules/NoUnusedVariables.mjs +1 -1
- package/validation/rules/OverlappingFieldsCanBeMerged.js +56 -32
- package/validation/rules/OverlappingFieldsCanBeMerged.js.flow +3 -3
- package/validation/rules/OverlappingFieldsCanBeMerged.mjs +47 -32
- package/validation/rules/PossibleFragmentSpreads.js +1 -1
- package/validation/rules/PossibleFragmentSpreads.mjs +1 -1
- package/validation/rules/PossibleTypeExtensions.js +158 -0
- package/validation/rules/PossibleTypeExtensions.js.flow +160 -0
- package/validation/rules/PossibleTypeExtensions.mjs +146 -0
- package/validation/rules/ProvidedRequiredArguments.mjs +1 -1
- package/validation/rules/ScalarLeafs.js +1 -1
- package/validation/rules/ScalarLeafs.mjs +1 -1
- package/validation/rules/SingleFieldSubscriptions.js +1 -1
- package/validation/rules/SingleFieldSubscriptions.mjs +1 -1
- package/validation/rules/UniqueArgumentNames.js +1 -1
- package/validation/rules/UniqueArgumentNames.mjs +1 -1
- package/validation/rules/UniqueDirectiveNames.js +55 -0
- package/validation/rules/UniqueDirectiveNames.js.flow +64 -0
- package/validation/rules/UniqueDirectiveNames.mjs +43 -0
- package/validation/rules/UniqueDirectivesPerLocation.js +1 -1
- package/validation/rules/UniqueDirectivesPerLocation.mjs +1 -1
- package/validation/rules/UniqueEnumValueNames.js +94 -0
- package/validation/rules/UniqueEnumValueNames.js.flow +87 -0
- package/validation/rules/UniqueEnumValueNames.mjs +81 -0
- package/validation/rules/UniqueFieldDefinitionNames.js +105 -0
- package/validation/rules/UniqueFieldDefinitionNames.js.flow +101 -0
- package/validation/rules/UniqueFieldDefinitionNames.mjs +92 -0
- package/validation/rules/UniqueFragmentNames.js +1 -1
- package/validation/rules/UniqueFragmentNames.mjs +1 -1
- package/validation/rules/UniqueInputFieldNames.js +1 -1
- package/validation/rules/UniqueInputFieldNames.mjs +1 -1
- package/validation/rules/UniqueOperationNames.js +1 -1
- package/validation/rules/UniqueOperationNames.mjs +1 -1
- package/validation/rules/UniqueOperationTypes.js +85 -0
- package/validation/rules/UniqueOperationTypes.js.flow +76 -0
- package/validation/rules/UniqueOperationTypes.mjs +73 -0
- package/validation/rules/UniqueTypeNames.js +62 -0
- package/validation/rules/UniqueTypeNames.js.flow +67 -0
- package/validation/rules/UniqueTypeNames.mjs +50 -0
- package/validation/rules/UniqueVariableNames.js +1 -1
- package/validation/rules/UniqueVariableNames.mjs +1 -1
- package/validation/rules/ValuesOfCorrectType.js +29 -13
- package/validation/rules/ValuesOfCorrectType.js.flow +4 -5
- package/validation/rules/ValuesOfCorrectType.mjs +28 -13
- package/validation/rules/VariablesAreInputTypes.js +1 -1
- package/validation/rules/VariablesAreInputTypes.mjs +1 -1
- package/validation/rules/VariablesInAllowedPosition.js +4 -4
- package/validation/rules/VariablesInAllowedPosition.mjs +4 -4
- package/validation/specifiedRules.js +14 -2
- package/validation/specifiedRules.js.flow +13 -0
- package/validation/specifiedRules.mjs +8 -2
- package/validation/validate.js +1 -1
- package/validation/validate.mjs +1 -1
- package/jsutils/find.js +0 -22
- package/jsutils/find.js.flow +0 -19
- package/jsutils/find.mjs +0 -15
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.duplicateDirectiveNameMessage = duplicateDirectiveNameMessage;
|
|
7
|
+
exports.existedDirectiveNameMessage = existedDirectiveNameMessage;
|
|
8
|
+
exports.UniqueDirectiveNames = UniqueDirectiveNames;
|
|
9
|
+
|
|
10
|
+
var _GraphQLError = require("../../error/GraphQLError");
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
14
|
+
*
|
|
15
|
+
* This source code is licensed under the MIT license found in the
|
|
16
|
+
* LICENSE file in the root directory of this source tree.
|
|
17
|
+
*
|
|
18
|
+
*
|
|
19
|
+
*/
|
|
20
|
+
function duplicateDirectiveNameMessage(directiveName) {
|
|
21
|
+
return "There can be only one directive named \"".concat(directiveName, "\".");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function existedDirectiveNameMessage(directiveName) {
|
|
25
|
+
return "Directive \"".concat(directiveName, "\" already exists in the schema. ") + 'It cannot be redefined.';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Unique directive names
|
|
29
|
+
*
|
|
30
|
+
* A GraphQL document is only valid if all defined directives have unique names.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
function UniqueDirectiveNames(context) {
|
|
35
|
+
var knownDirectiveNames = Object.create(null);
|
|
36
|
+
var schema = context.getSchema();
|
|
37
|
+
return {
|
|
38
|
+
DirectiveDefinition: function DirectiveDefinition(node) {
|
|
39
|
+
var directiveName = node.name.value;
|
|
40
|
+
|
|
41
|
+
if (schema && schema.getDirective(directiveName)) {
|
|
42
|
+
context.reportError(new _GraphQLError.GraphQLError(existedDirectiveNameMessage(directiveName), node.name));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (knownDirectiveNames[directiveName]) {
|
|
47
|
+
context.reportError(new _GraphQLError.GraphQLError(duplicateDirectiveNameMessage(directiveName), [knownDirectiveNames[directiveName], node.name]));
|
|
48
|
+
} else {
|
|
49
|
+
knownDirectiveNames[directiveName] = node.name;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { SDLValidationContext } from '../ValidationContext';
|
|
11
|
+
import { GraphQLError } from '../../error/GraphQLError';
|
|
12
|
+
import type { ASTVisitor } from '../../language/visitor';
|
|
13
|
+
|
|
14
|
+
export function duplicateDirectiveNameMessage(directiveName: string): string {
|
|
15
|
+
return `There can be only one directive named "${directiveName}".`;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function existedDirectiveNameMessage(directiveName: string): string {
|
|
19
|
+
return (
|
|
20
|
+
`Directive "${directiveName}" already exists in the schema. ` +
|
|
21
|
+
'It cannot be redefined.'
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Unique directive names
|
|
27
|
+
*
|
|
28
|
+
* A GraphQL document is only valid if all defined directives have unique names.
|
|
29
|
+
*/
|
|
30
|
+
export function UniqueDirectiveNames(
|
|
31
|
+
context: SDLValidationContext,
|
|
32
|
+
): ASTVisitor {
|
|
33
|
+
const knownDirectiveNames = Object.create(null);
|
|
34
|
+
const schema = context.getSchema();
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
DirectiveDefinition(node) {
|
|
38
|
+
const directiveName = node.name.value;
|
|
39
|
+
|
|
40
|
+
if (schema && schema.getDirective(directiveName)) {
|
|
41
|
+
context.reportError(
|
|
42
|
+
new GraphQLError(
|
|
43
|
+
existedDirectiveNameMessage(directiveName),
|
|
44
|
+
node.name,
|
|
45
|
+
),
|
|
46
|
+
);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (knownDirectiveNames[directiveName]) {
|
|
51
|
+
context.reportError(
|
|
52
|
+
new GraphQLError(duplicateDirectiveNameMessage(directiveName), [
|
|
53
|
+
knownDirectiveNames[directiveName],
|
|
54
|
+
node.name,
|
|
55
|
+
]),
|
|
56
|
+
);
|
|
57
|
+
} else {
|
|
58
|
+
knownDirectiveNames[directiveName] = node.name;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return false;
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
import { GraphQLError } from '../../error/GraphQLError';
|
|
10
|
+
export function duplicateDirectiveNameMessage(directiveName) {
|
|
11
|
+
return "There can be only one directive named \"".concat(directiveName, "\".");
|
|
12
|
+
}
|
|
13
|
+
export function existedDirectiveNameMessage(directiveName) {
|
|
14
|
+
return "Directive \"".concat(directiveName, "\" already exists in the schema. ") + 'It cannot be redefined.';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Unique directive names
|
|
18
|
+
*
|
|
19
|
+
* A GraphQL document is only valid if all defined directives have unique names.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
export function UniqueDirectiveNames(context) {
|
|
23
|
+
var knownDirectiveNames = Object.create(null);
|
|
24
|
+
var schema = context.getSchema();
|
|
25
|
+
return {
|
|
26
|
+
DirectiveDefinition: function DirectiveDefinition(node) {
|
|
27
|
+
var directiveName = node.name.value;
|
|
28
|
+
|
|
29
|
+
if (schema && schema.getDirective(directiveName)) {
|
|
30
|
+
context.reportError(new GraphQLError(existedDirectiveNameMessage(directiveName), node.name));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (knownDirectiveNames[directiveName]) {
|
|
35
|
+
context.reportError(new GraphQLError(duplicateDirectiveNameMessage(directiveName), [knownDirectiveNames[directiveName], node.name]));
|
|
36
|
+
} else {
|
|
37
|
+
knownDirectiveNames[directiveName] = node.name;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
@@ -14,7 +14,7 @@ var _GraphQLError = require("../../error/GraphQLError");
|
|
|
14
14
|
* This source code is licensed under the MIT license found in the
|
|
15
15
|
* LICENSE file in the root directory of this source tree.
|
|
16
16
|
*
|
|
17
|
-
*
|
|
17
|
+
*
|
|
18
18
|
*/
|
|
19
19
|
function duplicateDirectiveMessage(directiveName) {
|
|
20
20
|
return "The directive \"".concat(directiveName, "\" can only be used once at ") + 'this location.';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* This source code is licensed under the MIT license found in the
|
|
5
5
|
* LICENSE file in the root directory of this source tree.
|
|
6
6
|
*
|
|
7
|
-
*
|
|
7
|
+
*
|
|
8
8
|
*/
|
|
9
9
|
import { GraphQLError } from '../../error/GraphQLError';
|
|
10
10
|
export function duplicateDirectiveMessage(directiveName) {
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.duplicateEnumValueNameMessage = duplicateEnumValueNameMessage;
|
|
7
|
+
exports.existedEnumValueNameMessage = existedEnumValueNameMessage;
|
|
8
|
+
exports.UniqueEnumValueNames = UniqueEnumValueNames;
|
|
9
|
+
|
|
10
|
+
var _GraphQLError = require("../../error/GraphQLError");
|
|
11
|
+
|
|
12
|
+
var _definition = require("../../type/definition");
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
16
|
+
*
|
|
17
|
+
* This source code is licensed under the MIT license found in the
|
|
18
|
+
* LICENSE file in the root directory of this source tree.
|
|
19
|
+
*
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
function duplicateEnumValueNameMessage(typeName, valueName) {
|
|
23
|
+
return "Enum value \"".concat(typeName, ".").concat(valueName, "\" can only be defined once.");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function existedEnumValueNameMessage(typeName, valueName) {
|
|
27
|
+
return "Enum value \"".concat(typeName, ".").concat(valueName, "\" already exists in the schema. ") + 'It cannot also be defined in this type extension.';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Unique enum value names
|
|
31
|
+
*
|
|
32
|
+
* A GraphQL enum type is only valid if all its values are uniquely named.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
function UniqueEnumValueNames(context) {
|
|
37
|
+
var schema = context.getSchema();
|
|
38
|
+
var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
|
|
39
|
+
var knownValueNames = Object.create(null);
|
|
40
|
+
return {
|
|
41
|
+
EnumTypeDefinition: checkValueUniqueness,
|
|
42
|
+
EnumTypeExtension: checkValueUniqueness
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
function checkValueUniqueness(node) {
|
|
46
|
+
var typeName = node.name.value;
|
|
47
|
+
|
|
48
|
+
if (!knownValueNames[typeName]) {
|
|
49
|
+
knownValueNames[typeName] = Object.create(null);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
var valueNames = knownValueNames[typeName];
|
|
53
|
+
|
|
54
|
+
if (node.values) {
|
|
55
|
+
var _iteratorNormalCompletion = true;
|
|
56
|
+
var _didIteratorError = false;
|
|
57
|
+
var _iteratorError = undefined;
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
for (var _iterator = node.values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
61
|
+
var valueDef = _step.value;
|
|
62
|
+
var valueName = valueDef.name.value;
|
|
63
|
+
var existingType = existingTypeMap[typeName];
|
|
64
|
+
|
|
65
|
+
if ((0, _definition.isEnumType)(existingType) && existingType.getValue(valueName)) {
|
|
66
|
+
context.reportError(new _GraphQLError.GraphQLError(existedEnumValueNameMessage(typeName, valueName), valueDef.name));
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (valueNames[valueName]) {
|
|
71
|
+
context.reportError(new _GraphQLError.GraphQLError(duplicateEnumValueNameMessage(typeName, valueName), [valueNames[valueName], valueDef.name]));
|
|
72
|
+
} else {
|
|
73
|
+
valueNames[valueName] = valueDef.name;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
} catch (err) {
|
|
77
|
+
_didIteratorError = true;
|
|
78
|
+
_iteratorError = err;
|
|
79
|
+
} finally {
|
|
80
|
+
try {
|
|
81
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
82
|
+
_iterator.return();
|
|
83
|
+
}
|
|
84
|
+
} finally {
|
|
85
|
+
if (_didIteratorError) {
|
|
86
|
+
throw _iteratorError;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { SDLValidationContext } from '../ValidationContext';
|
|
11
|
+
import { GraphQLError } from '../../error/GraphQLError';
|
|
12
|
+
import type { ASTVisitor } from '../../language/visitor';
|
|
13
|
+
import { isEnumType } from '../../type/definition';
|
|
14
|
+
|
|
15
|
+
export function duplicateEnumValueNameMessage(
|
|
16
|
+
typeName: string,
|
|
17
|
+
valueName: string,
|
|
18
|
+
): string {
|
|
19
|
+
return `Enum value "${typeName}.${valueName}" can only be defined once.`;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function existedEnumValueNameMessage(
|
|
23
|
+
typeName: string,
|
|
24
|
+
valueName: string,
|
|
25
|
+
): string {
|
|
26
|
+
return (
|
|
27
|
+
`Enum value "${typeName}.${valueName}" already exists in the schema. ` +
|
|
28
|
+
'It cannot also be defined in this type extension.'
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Unique enum value names
|
|
34
|
+
*
|
|
35
|
+
* A GraphQL enum type is only valid if all its values are uniquely named.
|
|
36
|
+
*/
|
|
37
|
+
export function UniqueEnumValueNames(
|
|
38
|
+
context: SDLValidationContext,
|
|
39
|
+
): ASTVisitor {
|
|
40
|
+
const schema = context.getSchema();
|
|
41
|
+
const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
|
|
42
|
+
const knownValueNames = Object.create(null);
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
EnumTypeDefinition: checkValueUniqueness,
|
|
46
|
+
EnumTypeExtension: checkValueUniqueness,
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
function checkValueUniqueness(node) {
|
|
50
|
+
const typeName = node.name.value;
|
|
51
|
+
|
|
52
|
+
if (!knownValueNames[typeName]) {
|
|
53
|
+
knownValueNames[typeName] = Object.create(null);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const valueNames = knownValueNames[typeName];
|
|
57
|
+
if (node.values) {
|
|
58
|
+
for (const valueDef of node.values) {
|
|
59
|
+
const valueName = valueDef.name.value;
|
|
60
|
+
|
|
61
|
+
const existingType = existingTypeMap[typeName];
|
|
62
|
+
if (isEnumType(existingType) && existingType.getValue(valueName)) {
|
|
63
|
+
context.reportError(
|
|
64
|
+
new GraphQLError(
|
|
65
|
+
existedEnumValueNameMessage(typeName, valueName),
|
|
66
|
+
valueDef.name,
|
|
67
|
+
),
|
|
68
|
+
);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (valueNames[valueName]) {
|
|
73
|
+
context.reportError(
|
|
74
|
+
new GraphQLError(
|
|
75
|
+
duplicateEnumValueNameMessage(typeName, valueName),
|
|
76
|
+
[valueNames[valueName], valueDef.name],
|
|
77
|
+
),
|
|
78
|
+
);
|
|
79
|
+
} else {
|
|
80
|
+
valueNames[valueName] = valueDef.name;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
import { GraphQLError } from '../../error/GraphQLError';
|
|
10
|
+
import { isEnumType } from '../../type/definition';
|
|
11
|
+
export function duplicateEnumValueNameMessage(typeName, valueName) {
|
|
12
|
+
return "Enum value \"".concat(typeName, ".").concat(valueName, "\" can only be defined once.");
|
|
13
|
+
}
|
|
14
|
+
export function existedEnumValueNameMessage(typeName, valueName) {
|
|
15
|
+
return "Enum value \"".concat(typeName, ".").concat(valueName, "\" already exists in the schema. ") + 'It cannot also be defined in this type extension.';
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Unique enum value names
|
|
19
|
+
*
|
|
20
|
+
* A GraphQL enum type is only valid if all its values are uniquely named.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export function UniqueEnumValueNames(context) {
|
|
24
|
+
var schema = context.getSchema();
|
|
25
|
+
var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
|
|
26
|
+
var knownValueNames = Object.create(null);
|
|
27
|
+
return {
|
|
28
|
+
EnumTypeDefinition: checkValueUniqueness,
|
|
29
|
+
EnumTypeExtension: checkValueUniqueness
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
function checkValueUniqueness(node) {
|
|
33
|
+
var typeName = node.name.value;
|
|
34
|
+
|
|
35
|
+
if (!knownValueNames[typeName]) {
|
|
36
|
+
knownValueNames[typeName] = Object.create(null);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
var valueNames = knownValueNames[typeName];
|
|
40
|
+
|
|
41
|
+
if (node.values) {
|
|
42
|
+
var _iteratorNormalCompletion = true;
|
|
43
|
+
var _didIteratorError = false;
|
|
44
|
+
var _iteratorError = undefined;
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
for (var _iterator = node.values[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
48
|
+
var valueDef = _step.value;
|
|
49
|
+
var valueName = valueDef.name.value;
|
|
50
|
+
var existingType = existingTypeMap[typeName];
|
|
51
|
+
|
|
52
|
+
if (isEnumType(existingType) && existingType.getValue(valueName)) {
|
|
53
|
+
context.reportError(new GraphQLError(existedEnumValueNameMessage(typeName, valueName), valueDef.name));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (valueNames[valueName]) {
|
|
58
|
+
context.reportError(new GraphQLError(duplicateEnumValueNameMessage(typeName, valueName), [valueNames[valueName], valueDef.name]));
|
|
59
|
+
} else {
|
|
60
|
+
valueNames[valueName] = valueDef.name;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
} catch (err) {
|
|
64
|
+
_didIteratorError = true;
|
|
65
|
+
_iteratorError = err;
|
|
66
|
+
} finally {
|
|
67
|
+
try {
|
|
68
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
69
|
+
_iterator.return();
|
|
70
|
+
}
|
|
71
|
+
} finally {
|
|
72
|
+
if (_didIteratorError) {
|
|
73
|
+
throw _iteratorError;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.duplicateFieldDefinitionNameMessage = duplicateFieldDefinitionNameMessage;
|
|
7
|
+
exports.existedFieldDefinitionNameMessage = existedFieldDefinitionNameMessage;
|
|
8
|
+
exports.UniqueFieldDefinitionNames = UniqueFieldDefinitionNames;
|
|
9
|
+
|
|
10
|
+
var _GraphQLError = require("../../error/GraphQLError");
|
|
11
|
+
|
|
12
|
+
var _definition = require("../../type/definition");
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
16
|
+
*
|
|
17
|
+
* This source code is licensed under the MIT license found in the
|
|
18
|
+
* LICENSE file in the root directory of this source tree.
|
|
19
|
+
*
|
|
20
|
+
*
|
|
21
|
+
*/
|
|
22
|
+
function duplicateFieldDefinitionNameMessage(typeName, fieldName) {
|
|
23
|
+
return "Field \"".concat(typeName, ".").concat(fieldName, "\" can only be defined once.");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function existedFieldDefinitionNameMessage(typeName, fieldName) {
|
|
27
|
+
return "Field \"".concat(typeName, ".").concat(fieldName, "\" already exists in the schema. ") + 'It cannot also be defined in this type extension.';
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Unique field definition names
|
|
31
|
+
*
|
|
32
|
+
* A GraphQL complex type is only valid if all its fields are uniquely named.
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
function UniqueFieldDefinitionNames(context) {
|
|
37
|
+
var schema = context.getSchema();
|
|
38
|
+
var existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
|
|
39
|
+
var knownFieldNames = Object.create(null);
|
|
40
|
+
return {
|
|
41
|
+
InputObjectTypeDefinition: checkFieldUniqueness,
|
|
42
|
+
InputObjectTypeExtension: checkFieldUniqueness,
|
|
43
|
+
InterfaceTypeDefinition: checkFieldUniqueness,
|
|
44
|
+
InterfaceTypeExtension: checkFieldUniqueness,
|
|
45
|
+
ObjectTypeDefinition: checkFieldUniqueness,
|
|
46
|
+
ObjectTypeExtension: checkFieldUniqueness
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
function checkFieldUniqueness(node) {
|
|
50
|
+
var typeName = node.name.value;
|
|
51
|
+
|
|
52
|
+
if (!knownFieldNames[typeName]) {
|
|
53
|
+
knownFieldNames[typeName] = Object.create(null);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
var fieldNames = knownFieldNames[typeName];
|
|
57
|
+
|
|
58
|
+
if (node.fields) {
|
|
59
|
+
var _iteratorNormalCompletion = true;
|
|
60
|
+
var _didIteratorError = false;
|
|
61
|
+
var _iteratorError = undefined;
|
|
62
|
+
|
|
63
|
+
try {
|
|
64
|
+
for (var _iterator = node.fields[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
65
|
+
var fieldDef = _step.value;
|
|
66
|
+
var fieldName = fieldDef.name.value;
|
|
67
|
+
|
|
68
|
+
if (hasField(existingTypeMap[typeName], fieldName)) {
|
|
69
|
+
context.reportError(new _GraphQLError.GraphQLError(existedFieldDefinitionNameMessage(typeName, fieldName), fieldDef.name));
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (fieldNames[fieldName]) {
|
|
74
|
+
context.reportError(new _GraphQLError.GraphQLError(duplicateFieldDefinitionNameMessage(typeName, fieldName), [fieldNames[fieldName], fieldDef.name]));
|
|
75
|
+
} else {
|
|
76
|
+
fieldNames[fieldName] = fieldDef.name;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
} catch (err) {
|
|
80
|
+
_didIteratorError = true;
|
|
81
|
+
_iteratorError = err;
|
|
82
|
+
} finally {
|
|
83
|
+
try {
|
|
84
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
85
|
+
_iterator.return();
|
|
86
|
+
}
|
|
87
|
+
} finally {
|
|
88
|
+
if (_didIteratorError) {
|
|
89
|
+
throw _iteratorError;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function hasField(type, fieldName) {
|
|
100
|
+
if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type) || (0, _definition.isInputObjectType)(type)) {
|
|
101
|
+
return type.getFields()[fieldName];
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2018-present, Facebook, Inc.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { SDLValidationContext } from '../ValidationContext';
|
|
11
|
+
import { GraphQLError } from '../../error/GraphQLError';
|
|
12
|
+
import type { ASTVisitor } from '../../language/visitor';
|
|
13
|
+
import {
|
|
14
|
+
isObjectType,
|
|
15
|
+
isInterfaceType,
|
|
16
|
+
isInputObjectType,
|
|
17
|
+
} from '../../type/definition';
|
|
18
|
+
|
|
19
|
+
export function duplicateFieldDefinitionNameMessage(
|
|
20
|
+
typeName: string,
|
|
21
|
+
fieldName: string,
|
|
22
|
+
): string {
|
|
23
|
+
return `Field "${typeName}.${fieldName}" can only be defined once.`;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function existedFieldDefinitionNameMessage(
|
|
27
|
+
typeName: string,
|
|
28
|
+
fieldName: string,
|
|
29
|
+
): string {
|
|
30
|
+
return (
|
|
31
|
+
`Field "${typeName}.${fieldName}" already exists in the schema. ` +
|
|
32
|
+
'It cannot also be defined in this type extension.'
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Unique field definition names
|
|
38
|
+
*
|
|
39
|
+
* A GraphQL complex type is only valid if all its fields are uniquely named.
|
|
40
|
+
*/
|
|
41
|
+
export function UniqueFieldDefinitionNames(
|
|
42
|
+
context: SDLValidationContext,
|
|
43
|
+
): ASTVisitor {
|
|
44
|
+
const schema = context.getSchema();
|
|
45
|
+
const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null);
|
|
46
|
+
const knownFieldNames = Object.create(null);
|
|
47
|
+
|
|
48
|
+
return {
|
|
49
|
+
InputObjectTypeDefinition: checkFieldUniqueness,
|
|
50
|
+
InputObjectTypeExtension: checkFieldUniqueness,
|
|
51
|
+
InterfaceTypeDefinition: checkFieldUniqueness,
|
|
52
|
+
InterfaceTypeExtension: checkFieldUniqueness,
|
|
53
|
+
ObjectTypeDefinition: checkFieldUniqueness,
|
|
54
|
+
ObjectTypeExtension: checkFieldUniqueness,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
function checkFieldUniqueness(node) {
|
|
58
|
+
const typeName = node.name.value;
|
|
59
|
+
|
|
60
|
+
if (!knownFieldNames[typeName]) {
|
|
61
|
+
knownFieldNames[typeName] = Object.create(null);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const fieldNames = knownFieldNames[typeName];
|
|
65
|
+
if (node.fields) {
|
|
66
|
+
for (const fieldDef of node.fields) {
|
|
67
|
+
const fieldName = fieldDef.name.value;
|
|
68
|
+
|
|
69
|
+
if (hasField(existingTypeMap[typeName], fieldName)) {
|
|
70
|
+
context.reportError(
|
|
71
|
+
new GraphQLError(
|
|
72
|
+
existedFieldDefinitionNameMessage(typeName, fieldName),
|
|
73
|
+
fieldDef.name,
|
|
74
|
+
),
|
|
75
|
+
);
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (fieldNames[fieldName]) {
|
|
80
|
+
context.reportError(
|
|
81
|
+
new GraphQLError(
|
|
82
|
+
duplicateFieldDefinitionNameMessage(typeName, fieldName),
|
|
83
|
+
[fieldNames[fieldName], fieldDef.name],
|
|
84
|
+
),
|
|
85
|
+
);
|
|
86
|
+
} else {
|
|
87
|
+
fieldNames[fieldName] = fieldDef.name;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function hasField(type, fieldName) {
|
|
97
|
+
if (isObjectType(type) || isInterfaceType(type) || isInputObjectType(type)) {
|
|
98
|
+
return type.getFields()[fieldName];
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|