summaryrefslogtreecommitdiff
path: root/alarm/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-10-18 08:59:09 +0200
committerMinteck <contact@minteck.org>2022-10-18 08:59:09 +0200
commit2c4ae43e688a9873e86211ea0e7aeb9ba770dd77 (patch)
tree17848d95522dab25d3cdeb9c4a6450e2a234861f /alarm/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow
parent108525534c28013cfe1897c30e4565f9893f3766 (diff)
downloadpluralconnect-2c4ae43e688a9873e86211ea0e7aeb9ba770dd77.tar.gz
pluralconnect-2c4ae43e688a9873e86211ea0e7aeb9ba770dd77.tar.bz2
pluralconnect-2c4ae43e688a9873e86211ea0e7aeb9ba770dd77.zip
Update
Diffstat (limited to 'alarm/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow')
-rw-r--r--alarm/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow115
1 files changed, 115 insertions, 0 deletions
diff --git a/alarm/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow b/alarm/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow
new file mode 100644
index 0000000..a5a6aa9
--- /dev/null
+++ b/alarm/node_modules/graphql/utilities/stripIgnoredCharacters.js.flow
@@ -0,0 +1,115 @@
+// @flow strict
+import { Source, isSource } from '../language/source';
+import { TokenKind } from '../language/tokenKind';
+import { Lexer, isPunctuatorTokenKind } from '../language/lexer';
+import {
+ dedentBlockStringValue,
+ getBlockStringIndentation,
+} from '../language/blockString';
+
+/**
+ * Strips characters that are not significant to the validity or execution
+ * of a GraphQL document:
+ * - UnicodeBOM
+ * - WhiteSpace
+ * - LineTerminator
+ * - Comment
+ * - Comma
+ * - BlockString indentation
+ *
+ * Note: It is required to have a delimiter character between neighboring
+ * non-punctuator tokens and this function always uses single space as delimiter.
+ *
+ * It is guaranteed that both input and output documents if parsed would result
+ * in the exact same AST except for nodes location.
+ *
+ * Warning: It is guaranteed that this function will always produce stable results.
+ * However, it's not guaranteed that it will stay the same between different
+ * releases due to bugfixes or changes in the GraphQL specification.
+ *
+ * Query example:
+ *
+ * query SomeQuery($foo: String!, $bar: String) {
+ * someField(foo: $foo, bar: $bar) {
+ * a
+ * b {
+ * c
+ * d
+ * }
+ * }
+ * }
+ *
+ * Becomes:
+ *
+ * query SomeQuery($foo:String!$bar:String){someField(foo:$foo bar:$bar){a b{c d}}}
+ *
+ * SDL example:
+ *
+ * """
+ * Type description
+ * """
+ * type Foo {
+ * """
+ * Field description
+ * """
+ * bar: String
+ * }
+ *
+ * Becomes:
+ *
+ * """Type description""" type Foo{"""Field description""" bar:String}
+ */
+export function stripIgnoredCharacters(source: string | Source): string {
+ const sourceObj = isSource(source) ? source : new Source(source);
+
+ const body = sourceObj.body;
+ const lexer = new Lexer(sourceObj);
+ let strippedBody = '';
+
+ let wasLastAddedTokenNonPunctuator = false;
+ while (lexer.advance().kind !== TokenKind.EOF) {
+ const currentToken = lexer.token;
+ const tokenKind = currentToken.kind;
+
+ /**
+ * Every two non-punctuator tokens should have space between them.
+ * Also prevent case of non-punctuator token following by spread resulting
+ * in invalid token (e.g. `1...` is invalid Float token).
+ */
+ const isNonPunctuator = !isPunctuatorTokenKind(currentToken.kind);
+ if (wasLastAddedTokenNonPunctuator) {
+ if (isNonPunctuator || currentToken.kind === TokenKind.SPREAD) {
+ strippedBody += ' ';
+ }
+ }
+
+ const tokenBody = body.slice(currentToken.start, currentToken.end);
+ if (tokenKind === TokenKind.BLOCK_STRING) {
+ strippedBody += dedentBlockString(tokenBody);
+ } else {
+ strippedBody += tokenBody;
+ }
+
+ wasLastAddedTokenNonPunctuator = isNonPunctuator;
+ }
+
+ return strippedBody;
+}
+
+function dedentBlockString(blockStr: string): string {
+ // skip leading and trailing triple quotations
+ const rawStr = blockStr.slice(3, -3);
+ let body = dedentBlockStringValue(rawStr);
+
+ if (getBlockStringIndentation(body) > 0) {
+ body = '\n' + body;
+ }
+
+ const lastChar = body[body.length - 1];
+ const hasTrailingQuote = lastChar === '"' && body.slice(-4) !== '\\"""';
+ if (hasTrailingQuote || lastChar === '\\') {
+ body += '\n';
+ }
+
+ return '"""' + body + '"""';
+}