@conduit-client/graphql-normalization 5.67.0-dev1

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.
Files changed (36) hide show
  1. package/dist/main/index.js +6 -0
  2. package/dist/main/index.js.map +1 -0
  3. package/dist/types/index.d.ts +0 -0
  4. package/dist/types/v1/__tests__/aura-normalized-cache-control-base.spec.d.ts +1 -0
  5. package/dist/types/v1/__tests__/aura-normalized-cache-control-connection.spec.d.ts +1 -0
  6. package/dist/types/v1/__tests__/aura-normalized-cache-control-directives.spec.d.ts +1 -0
  7. package/dist/types/v1/__tests__/aura-normalized-cache-control-fragments.spec.d.ts +1 -0
  8. package/dist/types/v1/__tests__/aura-normalized-cache-control-unidentifiable.spec.d.ts +1 -0
  9. package/dist/types/v1/__tests__/aura-normalized-cache-control-union.spec.d.ts +1 -0
  10. package/dist/types/v1/__tests__/connection-query-params.spec.d.ts +1 -0
  11. package/dist/types/v1/__tests__/directives.spec.d.ts +1 -0
  12. package/dist/types/v1/__tests__/identifiable-repository-cache-key-alias.spec.d.ts +1 -0
  13. package/dist/types/v1/__tests__/identifiable-repository-normalize-no-mutate.spec.d.ts +1 -0
  14. package/dist/types/v1/__tests__/query-augmentation.spec.d.ts +1 -0
  15. package/dist/types/v1/__tests__/selection-equality.spec.d.ts +1 -0
  16. package/dist/types/v1/__tests__/test-utils.d.ts +721 -0
  17. package/dist/types/v1/__tests__/utils.spec.d.ts +1 -0
  18. package/dist/types/v1/__tests__/value-extraction.spec.d.ts +1 -0
  19. package/dist/types/v1/base-object-repository.d.ts +29 -0
  20. package/dist/types/v1/cursor-connection-graphql-type-repository.d.ts +51 -0
  21. package/dist/types/v1/directives.d.ts +5 -0
  22. package/dist/types/v1/errors.d.ts +7 -0
  23. package/dist/types/v1/field-defs.d.ts +40 -0
  24. package/dist/types/v1/identifiable-object-repository.d.ts +34 -0
  25. package/dist/types/v1/index.d.ts +11 -0
  26. package/dist/types/v1/json-schema.d.ts +2 -0
  27. package/dist/types/v1/repository.d.ts +8 -0
  28. package/dist/types/v1/type-registry.d.ts +2 -0
  29. package/dist/types/v1/types.d.ts +52 -0
  30. package/dist/types/v1/unidentifiable-object-repository.d.ts +11 -0
  31. package/dist/types/v1/union-interface-repositories.d.ts +38 -0
  32. package/dist/types/v1/utils.d.ts +21 -0
  33. package/dist/types/v1/value-extraction.d.ts +61 -0
  34. package/dist/v1/index.js +1638 -0
  35. package/dist/v1/index.js.map +1 -0
  36. package/package.json +56 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/v1/value-extraction.ts","../../src/v1/utils.ts","../../src/v1/directives.ts","../../src/v1/field-defs.ts","../../src/v1/base-object-repository.ts","../../src/v1/identifiable-object-repository.ts","../../src/v1/unidentifiable-object-repository.ts","../../src/v1/union-interface-repositories.ts","../../src/v1/json-schema.ts"],"sourcesContent":["import { ArgumentNode, Kind, ValueNode } from '@conduit-client/onestore-graphql-parser/v1';\nimport { GraphQLVariables } from './types';\nimport { QueryParams } from '@conduit-client/pagination';\nimport { Result, ok, err } from '@conduit-client/utils';\n\n// Type definition for expected value validation\nexport type ExpectedType =\n | { type: 'string'; nullable?: false }\n | { type: 'string'; nullable: true }\n | { type: 'number'; nullable?: false }\n | { type: 'number'; nullable: true }\n | { type: 'boolean'; nullable?: false }\n | { type: 'boolean'; nullable: true };\n\n// Typed overloads for specific expected types\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables,\n expectedType: { type: 'string'; nullable?: false }\n): Result<string, Error>;\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables,\n expectedType: { type: 'string'; nullable: true }\n): Result<string | null, Error>;\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables,\n expectedType: { type: 'number'; nullable?: false }\n): Result<number, Error>;\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables,\n expectedType: { type: 'number'; nullable: true }\n): Result<number | null, Error>;\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables,\n expectedType: { type: 'boolean'; nullable?: false }\n): Result<boolean, Error>;\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables,\n expectedType: { type: 'boolean'; nullable: true }\n): Result<boolean | null, Error>;\n// Original untyped version for backward compatibility\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables\n): Result<unknown, Error>;\n\nexport function extractValue(\n valueNode: ValueNode,\n variableDefinitions: GraphQLVariables,\n expectedType?: ExpectedType\n): Result<unknown, Error> {\n if (valueNode.kind === Kind.VARIABLE) {\n const variableResult = extractVariableValue(valueNode.name.value, variableDefinitions);\n if (variableResult.isErr()) {\n return variableResult;\n }\n return validateExpectedType(variableResult.value, expectedType);\n } else if (valueNode.kind === Kind.NULL) {\n return validateExpectedType(null, expectedType);\n } else if (valueNode.kind === Kind.LIST) {\n const values: unknown[] = [];\n for (const val of valueNode.values) {\n const extractedResult = extractValue(val, variableDefinitions);\n if (extractedResult.isErr()) {\n return extractedResult;\n }\n values.push(extractedResult.value);\n }\n return validateExpectedType(values, expectedType);\n } else if (valueNode.kind === Kind.OBJECT) {\n const value: Record<string, unknown> = {};\n for (const field of valueNode.fields) {\n const extractedResult = extractValue(field.value, variableDefinitions);\n if (extractedResult.isErr()) {\n return extractedResult;\n }\n value[field.name.value] = extractedResult.value;\n }\n return validateExpectedType(value, expectedType);\n } else if (valueNode.kind === Kind.INT) {\n const value = parseInt(valueNode.value, 10);\n return validateExpectedType(value, expectedType);\n } else if (valueNode.kind === Kind.FLOAT) {\n const value = parseFloat(valueNode.value);\n return validateExpectedType(value, expectedType);\n } else {\n // For STRING, BOOLEAN, and other scalar types\n const value = valueNode.value;\n return validateExpectedType(value, expectedType);\n }\n}\n\nfunction extractVariableValue(\n variableName: string,\n variableDefinitions: GraphQLVariables\n): Result<unknown, Error> {\n const variable = variableDefinitions[variableName];\n\n if (!variable) {\n return err(\n new Error(`Variable '${variableName}' was used in the query but was not defined`)\n );\n }\n\n // If the variable has a value, use it\n if (variable.value !== undefined) {\n return ok(variable.value);\n }\n\n // Try to get default value\n if (variable.definition.defaultValue) {\n return extractValue(variable.definition.defaultValue, variableDefinitions);\n }\n\n // No value and no default, spec says to treat as missing and let schema decide if a missing value is allowed\n return ok(undefined);\n}\n\nfunction validateExpectedType(value: unknown, expectedType?: ExpectedType): Result<unknown, Error> {\n if (!expectedType) {\n return ok(value);\n }\n\n // Handle null values\n if (value === null) {\n if (expectedType.nullable) {\n return ok(value);\n } else {\n return err(new Error(`Expected ${expectedType.type}, but got null`));\n }\n }\n\n // Handle non-null values\n const actualType = typeof value;\n if (actualType === expectedType.type) {\n return ok(value);\n }\n\n const expectedTypeString = expectedType.nullable\n ? `${expectedType.type} | null`\n : expectedType.type;\n return err(\n new Error(`Expected ${expectedTypeString}, but got ${actualType}: ${JSON.stringify(value)}`)\n );\n}\n\n/**\n * Helper function to extract and validate a pagination argument from GraphQL arguments\n */\n\nexport function findArgumentNode(\n argName: string,\n args: readonly ArgumentNode[] | undefined\n): ArgumentNode | undefined {\n return args?.find((arg) => arg.name.value === argName);\n}\n\n/**\n * Extracts and validates GraphQL connection pagination parameters into a standardized QueryParams object.\n * Implements the Relay Cursor Pagination specification.\n *\n * @param args - The GraphQL arguments array from the query\n * @param variables - The GraphQL variables object\n * @returns QueryParams object with validated pagination parameters\n */\nexport function extractConnectionQueryParams(\n args: readonly ArgumentNode[] | undefined,\n variables: GraphQLVariables\n): Result<QueryParams, Error> {\n // Extract all pagination arguments\n const firstArgNode = findArgumentNode('first', args);\n const afterArgNode = findArgumentNode('after', args);\n const lastArgNode = findArgumentNode('last', args);\n const beforeArgNode = findArgumentNode('before', args);\n\n // Forward pagination: first + after\n if (firstArgNode !== undefined) {\n const firstResult = extractValue(firstArgNode.value, variables, {\n type: 'number',\n nullable: true,\n });\n if (firstResult.isErr()) return firstResult;\n\n const firstValue = firstResult.value;\n let pageSize: number | undefined;\n if (typeof firstValue === 'number') {\n if (firstValue < 0) {\n return err(\n new Error(\n `Invalid pagination argument: 'first' must be non-negative, got ${firstValue}`\n )\n );\n }\n pageSize = firstValue;\n }\n\n let cursor: string | undefined;\n if (afterArgNode) {\n const afterResult = extractValue(afterArgNode.value, variables, {\n type: 'string',\n nullable: true,\n });\n if (afterResult.isErr()) return afterResult;\n cursor = afterResult.value || undefined;\n }\n\n return ok({\n first: pageSize,\n after: cursor,\n });\n }\n\n // Backward pagination: last + before\n if (lastArgNode !== undefined) {\n const lastResult = extractValue(lastArgNode.value, variables, {\n type: 'number',\n nullable: true,\n });\n if (lastResult.isErr()) return lastResult;\n\n const lastValue = lastResult.value;\n let pageSize: number | undefined;\n if (typeof lastValue === 'number') {\n if (lastValue < 0) {\n return err(\n new Error(\n `Invalid pagination argument: 'last' must be non-negative, got ${lastValue}`\n )\n );\n }\n pageSize = lastValue;\n }\n\n let cursor: string | undefined;\n if (beforeArgNode) {\n const beforeResult = extractValue(beforeArgNode.value, variables, {\n type: 'string',\n nullable: true,\n });\n if (beforeResult.isErr()) return beforeResult;\n cursor = beforeResult.value || undefined;\n }\n\n return ok({\n last: pageSize,\n before: cursor,\n });\n }\n\n // Default: forward pagination\n return ok({\n first: undefined,\n after: undefined,\n });\n}\n","import {\n err,\n ObjectPrototypeHasOwnProperty,\n ok,\n Result,\n stableJSONStringify,\n} from '@conduit-client/utils';\nimport {\n GraphQLFragmentDefinitions,\n GraphQLRequestParams,\n GraphQLVariables,\n GraphQLInputExtension,\n} from './types';\nimport {\n ArgumentNode,\n FieldNode,\n FragmentDefinitionNode,\n Kind,\n OperationDefinitionNode,\n SelectionNode,\n ASTNode,\n visit,\n SelectionSetNode,\n DocumentNode,\n InlineFragmentNode,\n FragmentSpreadNode,\n DirectiveNode,\n ValueNode,\n} from '@conduit-client/onestore-graphql-parser/v1';\nimport { extractValue } from './value-extraction';\n\n// Deep merge that works on GraphQL data. It:\n// - recursively merges any Object properties that are present in both\nexport function deepMerge(target: Record<string, unknown>, ...sources: Record<string, unknown>[]) {\n for (const source of sources) {\n for (const key in source) {\n if (ObjectPrototypeHasOwnProperty.call(source, key)) {\n const targetValue = target[key];\n const sourceValue = source[key];\n\n if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n const length = sourceValue.length;\n target[key] = Array.from({ length }, (_, index) => {\n const targetItem = targetValue[index];\n const sourceItem = sourceValue[index];\n\n if (targetItem === undefined) {\n return sourceItem;\n } else if (sourceItem === undefined) {\n return targetItem;\n } else if (\n targetItem instanceof Object &&\n !Array.isArray(targetItem) &&\n sourceItem instanceof Object &&\n !Array.isArray(sourceItem)\n ) {\n return deepMerge({}, targetItem, sourceItem);\n } else {\n return sourceItem;\n }\n });\n } else if (\n targetValue instanceof Object &&\n !Array.isArray(targetValue) &&\n sourceValue instanceof Object &&\n !Array.isArray(sourceValue)\n ) {\n deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>\n );\n } else {\n target[key] = sourceValue;\n }\n }\n }\n }\n return target;\n}\n\nexport function findExecutableOperation(\n input: GraphQLRequestParams\n): Result<OperationDefinitionNode, Error> {\n const operations = input.query.definitions.filter(\n (def) => def.kind === Kind.OPERATION_DEFINITION\n ) as OperationDefinitionNode[];\n if (operations.length === 0) {\n return err(new Error('No operations found in query'));\n }\n\n if (operations.length === 1 && !input.operationName) {\n return ok(operations[0]);\n }\n\n if (input.operationName) {\n const specifiedOperation = operations.find((op) => op.name?.value === input.operationName);\n if (specifiedOperation) {\n return ok(specifiedOperation);\n }\n\n return err(new Error(`Operation \"${input.operationName}\" not found in query`));\n }\n\n return err(new Error('Multiple operations found in query, and no operation name provided'));\n}\n\nexport function buildGraphQLInputExtension(\n input: GraphQLRequestParams\n): Result<GraphQLInputExtension, Error> {\n const operationResult = findExecutableOperation(input);\n if (operationResult.isErr()) {\n return err(operationResult.error);\n }\n\n const operation = operationResult.value;\n\n const selections = operation.selectionSet.selections;\n const variableDefinitions = operation.variableDefinitions;\n\n const variables =\n variableDefinitions?.reduce((prev, def) => {\n prev[def.variable.name.value] = {\n definition: def,\n value: input.variables?.[def.variable.name.value as any],\n };\n return prev;\n }, {} as GraphQLVariables) || {};\n\n const fragments: GraphQLFragmentDefinitions = input.query.definitions\n .filter(isFragmentDefinition)\n .reduce((prev, fragment) => {\n prev[(fragment as FragmentDefinitionNode).name.value] =\n fragment as FragmentDefinitionNode;\n return prev;\n }, {} as GraphQLFragmentDefinitions);\n return ok({\n selections: selections as SelectionNode[],\n request: { definitions: { variables, fragments } },\n parentFieldSelection: undefined,\n });\n}\n\nexport function buildAugmentedFieldSelection(\n newSelection: FieldNode,\n selections: SelectionNode[],\n fragments: GraphQLFragmentDefinitions\n): FieldNode | undefined {\n // don't augment the query if the selection already exists\n if (selectionExists(newSelection, selections)) {\n return undefined;\n }\n\n const baseAlias = newSelection.alias?.value || newSelection.name.value;\n const baseInjectedAlias = `framework_augmented_${baseAlias}`;\n\n const baseAliasedSelection = {\n ...newSelection,\n alias: {\n kind: Kind.NAME,\n value: baseInjectedAlias,\n },\n } as const;\n\n if (selectionExists(baseAliasedSelection, selections)) {\n return undefined;\n }\n\n const fieldName = getUniqueSelectionName(baseInjectedAlias, selections, fragments);\n return {\n ...newSelection,\n alias: {\n kind: Kind.NAME,\n value: fieldName,\n },\n };\n}\n\nexport function selectionExists(selection: FieldNode, selections: SelectionNode[]): boolean {\n return selections.some((s) => selectionEquals(selection, s));\n}\n\nexport function selectionEquals(a: SelectionNode, b: SelectionNode): boolean {\n if (a.kind !== b.kind) {\n return false;\n }\n\n if (a.kind === Kind.FIELD) {\n const bField = b as FieldNode;\n return (\n !!(a.name.value === bField.name.value) &&\n !!(a.alias?.value === bField.alias?.value) &&\n argumentsEqual(a.arguments, bField.arguments) &&\n selectionSetsEqual(a.selectionSet?.selections, bField.selectionSet?.selections) &&\n directivesEqual(a.directives, bField.directives)\n );\n }\n\n if (a.kind === Kind.FRAGMENT_SPREAD) {\n const bFragmentSpread = b as FragmentSpreadNode;\n return (\n a.name.value === bFragmentSpread.name.value &&\n directivesEqual(a.directives, bFragmentSpread.directives)\n );\n }\n\n const bInlineFragment = b as InlineFragmentNode;\n return (\n a.typeCondition === bInlineFragment.typeCondition &&\n directivesEqual(a.directives, bInlineFragment.directives) &&\n selectionSetsEqual(a.selectionSet?.selections, bInlineFragment.selectionSet?.selections)\n );\n}\n\nexport function argumentValueEquals(a: ValueNode, b: ValueNode): boolean {\n if (a.kind !== b.kind) {\n return false;\n }\n\n switch (a.kind) {\n case Kind.STRING:\n case Kind.INT:\n case Kind.FLOAT:\n case Kind.BOOLEAN:\n case Kind.ENUM:\n return a.value === (b as any).value;\n case Kind.NULL:\n return true;\n case Kind.VARIABLE:\n return a.name.value === (b as any).name.value;\n case Kind.LIST:\n const bList = b as any;\n if (a.values.length !== bList.values.length) {\n return false;\n }\n return a.values.every((val, index) => argumentValueEquals(val, bList.values[index]));\n case Kind.OBJECT:\n const bObject = b as any;\n if (a.fields.length !== bObject.fields.length) {\n return false;\n }\n return a.fields.every((field, index) => {\n const bField = bObject.fields[index];\n return (\n field.name.value === bField.name.value &&\n argumentValueEquals(field.value, bField.value)\n );\n });\n default:\n return false;\n }\n}\n\nexport function directivesEqual(\n a: readonly DirectiveNode[] | undefined,\n b: readonly DirectiveNode[] | undefined\n): boolean {\n if (a === undefined && b === undefined) {\n return true;\n }\n if (a === undefined || b === undefined) {\n return (a?.length || 0) === (b?.length || 0);\n }\n if (a.length !== b.length) {\n return false;\n }\n return a.every((directive, index) => {\n const bDirective = b[index];\n return (\n directive.name.value === bDirective.name.value &&\n argumentsEqual(directive.arguments, bDirective.arguments)\n );\n });\n}\n\nexport function argumentsEqual(\n a: readonly ArgumentNode[] | undefined,\n b: readonly ArgumentNode[] | undefined\n): boolean {\n if (a === undefined && b === undefined) {\n return true;\n }\n if (a === undefined || b === undefined) {\n return (a?.length || 0) === (b?.length || 0);\n }\n if (a.length !== b.length) {\n return false;\n }\n return a.every((arg, index) => {\n const bArg = b[index];\n return arg.name.value === bArg.name.value && argumentValueEquals(arg.value, bArg.value);\n });\n}\n\nexport function selectionSetsEqual(\n a: readonly SelectionNode[] | undefined,\n b: readonly SelectionNode[] | undefined\n): boolean {\n return (\n a === undefined ||\n b === undefined ||\n (!!(a.length === b.length) &&\n !!a.every((selection, index) => {\n return selectionEquals(selection, b[index]);\n }))\n );\n}\n\nexport function getUniqueSelectionName(\n fieldName: string,\n selections: SelectionNode[],\n fragments: GraphQLFragmentDefinitions\n): string {\n const fieldNames = collectFieldNames(selections, fragments);\n\n // if the field name is not in the currect selections, return it, otherwise add a number to the end\n if (!fieldNames.includes(fieldName)) {\n return fieldName;\n }\n\n let i = 1;\n while (fieldNames.includes(`${fieldName}_${i}`)) {\n i++;\n }\n\n return `${fieldName}_${i}`;\n}\n\nexport function collectFieldNames(\n selections: SelectionNode[],\n fragments: GraphQLFragmentDefinitions\n): string[] {\n const fieldNames = new Set<string>();\n for (const selection of selections) {\n if (isField(selection)) {\n fieldNames.add(selection.alias?.value || selection.name.value);\n } else if (isInlineFragment(selection)) {\n collectFieldNames(\n selection.selectionSet.selections as SelectionNode[],\n fragments\n ).forEach((name) => fieldNames.add(name));\n } else if (isFragmentSpread(selection)) {\n const fragment = fragments[selection.name.value];\n if (fragment) {\n collectFieldNames(\n fragment.selectionSet.selections as SelectionNode[],\n fragments\n ).forEach((name) => fieldNames.add(name));\n }\n }\n }\n\n return Array.from(fieldNames);\n}\n\nexport function buildFieldKey(\n canonicalFieldName: string,\n fieldArguments: readonly ArgumentNode[] | undefined,\n variables: GraphQLVariables\n): Result<string, Error> {\n // The field key is built based on the canonical field name, and the variables used for that field.\n // Technically, if there is a directive that affects how the field is resolved, we may want\n // to include that in the cache key, but for now, we'll assume that directives don't affect the resolved value\n\n if (fieldArguments === undefined || fieldArguments.length === 0) {\n return ok(canonicalFieldName);\n }\n\n const formattedArguments: Record<string, unknown> = {};\n for (const arg of fieldArguments) {\n const result = extractValue(arg.value, variables);\n if (result.isErr()) {\n return err(\n new Error(\n `Failed to extract argument '${arg.name.value}' for field '${canonicalFieldName}': ${result.error.message}`\n )\n );\n }\n formattedArguments[arg.name.value] = result.value;\n }\n\n return ok(`${canonicalFieldName}::${stableJSONStringify({ args: formattedArguments })}`);\n}\n\nconst TYPENAME_FIELD: FieldNode = {\n kind: Kind.FIELD,\n name: {\n kind: Kind.NAME,\n value: '__typename',\n },\n};\n\n// Visitor function copied from Apollo Client https://github.com/apollographql/apollo-client/blob/main/src/utilities/graphql/transform.ts#L453\nexport function addTypenameToDocument(doc: DocumentNode): DocumentNode {\n return visit(doc, {\n SelectionSet: {\n enter(\n node: SelectionSetNode,\n _key: string | number | undefined,\n parent: ASTNode | readonly ASTNode[] | undefined\n ) {\n // Don't add __typename to OperationDefinitions.\n if (isOperationDefinition(parent)) {\n return;\n }\n\n // No changes if no selections.\n const { selections } = node;\n if (!selections || selections.length === 0) {\n return;\n }\n\n // If selections already have a __typename, or are part of an\n // introspection query, do nothing.\n const skip = selections.some((selection: SelectionNode) => {\n return (\n isField(selection) &&\n (selection.name.value === '__typename' ||\n selection.name.value.lastIndexOf('__', 0) === 0)\n );\n });\n if (skip) {\n return;\n }\n\n // Create and return a new SelectionSet with a __typename Field.\n return {\n ...node,\n selections: [...selections, TYPENAME_FIELD],\n };\n },\n },\n });\n}\n\nfunction isOperationDefinition(\n parent: ASTNode | readonly ASTNode[] | undefined\n): parent is OperationDefinitionNode {\n return (\n !!parent && !Array.isArray(parent) && (parent as ASTNode).kind === Kind.OPERATION_DEFINITION\n );\n}\n\nexport function isField(node: ASTNode): node is FieldNode {\n return node.kind === Kind.FIELD;\n}\n\nexport function isFragmentSpread(node: ASTNode): node is FragmentSpreadNode {\n return node.kind === Kind.FRAGMENT_SPREAD;\n}\n\nexport function isInlineFragment(node: ASTNode): node is InlineFragmentNode {\n return node.kind === Kind.INLINE_FRAGMENT;\n}\n\nexport function isFragmentDefinition(node: ASTNode): node is FragmentDefinitionNode {\n return node.kind === Kind.FRAGMENT_DEFINITION;\n}\n","import {\n FragmentDefinitionNode,\n InlineFragmentNode,\n FieldNode,\n ArgumentNode,\n DirectiveNode,\n} from '@conduit-client/onestore-graphql-parser/v1';\nimport { GraphQLVariables } from './types';\nimport { extractValue } from './value-extraction';\nimport { Result, ok, err } from '@conduit-client/utils';\n\nexport type SkipableNode = FragmentDefinitionNode | InlineFragmentNode | FieldNode;\n\n/**\n * Helper function to extract and validate the 'if' argument from a directive\n */\nfunction extractIfArgument(\n directive: DirectiveNode,\n variables: GraphQLVariables,\n directiveName: string\n): Result<boolean, Error> {\n const ifArg = directive.arguments?.find((arg) => arg.name.value === 'if');\n if (!ifArg) {\n return err(new Error(`@${directiveName} directive requires an 'if' argument`));\n }\n\n const result = extractValue(ifArg.value, variables, { type: 'boolean', nullable: false });\n if (result.isErr()) {\n return err(result.error);\n }\n\n return ok(result.value);\n}\n\nexport function shouldSkip(\n selection: SkipableNode,\n variables: GraphQLVariables\n): Result<boolean, Error> {\n if (!selection.directives || selection.directives.length === 0) {\n return ok(false);\n }\n\n for (const directive of selection.directives) {\n if (directive.name.value === 'skip') {\n const ifResult = extractIfArgument(directive, variables, 'skip');\n if (ifResult.isErr()) {\n return ifResult;\n }\n\n if (ifResult.value === true) {\n return ok(true);\n }\n }\n\n if (directive.name.value === 'include') {\n const ifResult = extractIfArgument(directive, variables, 'include');\n if (ifResult.isErr()) {\n return ifResult;\n }\n\n if (ifResult.value === false) {\n return ok(true);\n }\n }\n }\n\n return ok(false);\n}\n","import type { AugmentSelectionsData, GraphQLFieldInputExtension, GraphQLVariables } from './types';\nimport type { GraphQLTypeRepository } from './repository';\nimport { FieldNode, SelectionNode } from '@conduit-client/onestore-graphql-parser/v1';\nimport { buildFieldKey } from './utils';\nimport {\n DenormalizeDataInput,\n NormalizeDataInput,\n ReadErrors,\n ReadResult,\n WriteErrors,\n WriteResult,\n} from '@conduit-client/type-normalization/v1';\nimport { Cache, ReadonlyCache } from '@conduit-client/service-cache/v1';\nimport { err, ok, Result } from '@conduit-client/utils';\n\nexport type FieldDef<\n Data = unknown,\n NormalizedData = unknown,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> = {\n write(\n cache: Cache,\n input: NormalizeDataInput<Data, NormalizedData, ExtraInputExtension>\n ): WriteResult<NormalizedData>;\n read(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, ExtraInputExtension>\n ): ReadResult<Data>;\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error>;\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData;\n};\n\nexport type FieldDefs<\n Data = unknown,\n NormalizedData = unknown,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> = Record<string, FieldDef<Data, NormalizedData, ExtraInputExtension>>;\n\nexport class BaseScalarFieldDef<\n Data = unknown,\n NormalizedData = unknown,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> implements FieldDef<Data, NormalizedData, ExtraInputExtension>\n{\n constructor(public readonly nullable: boolean) {}\n\n write(\n _cache: Cache,\n input: NormalizeDataInput<\n Data,\n NormalizedData,\n GraphQLFieldInputExtension & ExtraInputExtension\n >\n ): WriteResult<NormalizedData> {\n if (input.data === undefined) {\n return ok({ type: 'missing' } as any);\n }\n\n if (input.data === null) {\n if (!this.nullable) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Got a null value for non-nullable field \"${input.selection.name.value}\"`\n ),\n },\n ]);\n }\n }\n return ok({ type: 'data', data: input.data } as any);\n }\n\n read(\n _cache: ReadonlyCache,\n input: DenormalizeDataInput<\n NormalizedData,\n GraphQLFieldInputExtension & ExtraInputExtension\n >\n ): ReadResult<Data> {\n const normalizedData = input.normalizedData as any;\n if (normalizedData.type === 'missing') {\n return ok(undefined as any);\n }\n\n return ok(normalizedData.data);\n }\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n return input;\n }\n\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error> {\n return buildFieldKey(selection.name.value, selection.arguments, variables);\n }\n}\n\nexport class BaseArrayFieldDef<\n Data = unknown,\n NormalizedData = unknown,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> implements FieldDef<Data, NormalizedData, ExtraInputExtension>\n{\n constructor(\n public readonly items: FieldDef<Data, NormalizedData, ExtraInputExtension>,\n public readonly nullable: boolean\n ) {}\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n return this.items.augmentSelections(input);\n }\n\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error> {\n return this.items.buildFieldKey(selection, variables);\n }\n\n write(\n cache: Cache,\n input: NormalizeDataInput<\n Data,\n NormalizedData,\n GraphQLFieldInputExtension & ExtraInputExtension\n >\n ): WriteResult<NormalizedData> {\n if (input.data === undefined) {\n return ok({ type: 'missing' } as any);\n }\n\n if (input.data === null) {\n if (!this.nullable) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Got a null value for non-nullable field \"${input.selection.name.value}\"`\n ),\n },\n ]);\n }\n\n return ok({ type: 'data', data: input.data } as any);\n }\n\n if (!Array.isArray(input.data)) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Got a non array value for array field \"${input.selection.name.value}\"`\n ),\n },\n ]);\n }\n\n const arrayNormalizationErrors: WriteErrors = [];\n const normalizedArray: any[] = [];\n input.data.forEach((item: unknown, index: number) => {\n // For arrays, existing data might be an array too\n const existingItemData = (input.existingNormalizedData as any[])?.[index];\n\n const normalizedItemResult = this.items.write(cache, {\n ...input,\n data: item as unknown as Data,\n existingNormalizedData: existingItemData,\n request: input.request,\n selection: input.selection,\n });\n\n if (normalizedItemResult.isOk()) {\n normalizedArray.push(normalizedItemResult.value);\n } else {\n arrayNormalizationErrors.push(...normalizedItemResult.error);\n }\n });\n\n if (arrayNormalizationErrors.length > 0) {\n return err(arrayNormalizationErrors);\n }\n\n return ok({ type: 'data', data: normalizedArray } as any);\n }\n\n read(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<\n NormalizedData,\n GraphQLFieldInputExtension & ExtraInputExtension\n >\n ): ReadResult<Data> {\n const normalizedData = input.normalizedData as any;\n if (normalizedData.type === 'missing') {\n return ok(undefined as any);\n }\n\n if (normalizedData.data === null) {\n if (!this.nullable) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Got a null value for non-nullable field \"${input.selection.name.value}\"`\n ),\n },\n ]);\n }\n\n return ok({ type: 'data', data: null } as any);\n }\n\n if (!Array.isArray(normalizedData.data)) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Got a non array value for array field \"${input.selection.name.value}\"`\n ),\n },\n ]);\n }\n\n const arrayDenormalizationErrors: ReadErrors = [];\n const denormalizedArray: any[] = [];\n normalizedData.data.forEach((item: unknown) => {\n const denormalizedItemResult = this.items.read(cache, {\n ...input,\n normalizedData: item as unknown as NormalizedData,\n request: input.request,\n selection: input.selection,\n });\n\n if (denormalizedItemResult.isOk()) {\n denormalizedArray.push(denormalizedItemResult.value);\n } else {\n arrayDenormalizationErrors.push(...denormalizedItemResult.error);\n }\n });\n\n if (arrayDenormalizationErrors.length > 0) {\n return err(arrayDenormalizationErrors);\n }\n\n return ok(denormalizedArray as any);\n }\n}\n\nexport class BaseObjectFieldDef<\n Data = unknown,\n NormalizedData = unknown,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> implements FieldDef<Data, NormalizedData, ExtraInputExtension>\n{\n constructor(\n public readonly repository: GraphQLTypeRepository<\n Data,\n NormalizedData,\n ExtraInputExtension\n >,\n public readonly nullable: boolean\n ) {}\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n return this.repository.augmentSelections(input);\n }\n\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error> {\n return this.repository.buildFieldKey(selection, variables);\n }\n\n write(\n cache: Cache,\n input: NormalizeDataInput<\n Data,\n NormalizedData,\n GraphQLFieldInputExtension & ExtraInputExtension\n >\n ): WriteResult<NormalizedData> {\n if (!input.selection.selectionSet) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Selection set required for object type found on field \"${input.selection.name.value}\" in type ${this.repository.typeName}`\n ),\n },\n ]);\n }\n\n if (input.data === undefined) {\n return ok({ type: 'missing' } as any);\n }\n\n if (input.data === null) {\n if (!this.nullable) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Got a null value for non-nullable field \"${input.selection.name.value}\"`\n ),\n },\n ]);\n }\n\n return ok({ type: 'data', data: null } as any);\n }\n\n const writeResult = this.repository.write(cache, {\n ...input,\n data: input.data as unknown as Data,\n existingNormalizedData: (input.existingNormalizedData as any)?.data,\n request: input.request,\n selections: input.selection.selectionSet.selections as SelectionNode[],\n parentFieldSelection: input.selection,\n });\n\n if (writeResult.isErr()) {\n return writeResult;\n }\n\n return ok({ type: 'data', data: writeResult.value } as any);\n }\n\n read(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<\n NormalizedData,\n GraphQLFieldInputExtension & ExtraInputExtension\n >\n ): ReadResult<Data> {\n if (!input.selection.selectionSet) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Selection set required for object type found on field \"${input.selection.name.value}\" in type ${this.repository.typeName}`\n ),\n },\n ]);\n }\n\n const normalizedData = input.normalizedData as any;\n if (normalizedData.type === 'missing') {\n return ok(undefined as any);\n }\n\n if (normalizedData.data === null) {\n if (!this.nullable) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Got a null value for non-nullable field \"${input.selection.name.value}\"`\n ),\n },\n ]);\n }\n\n return ok(null as any);\n }\n\n return this.repository.read(cache, {\n ...input,\n normalizedData: normalizedData.data,\n request: input.request,\n selections: input.selection.selectionSet?.selections as SelectionNode[],\n parentFieldSelection: input.selection,\n });\n }\n}\n\nexport const missingFieldDef = new BaseScalarFieldDef<any, any, any>(false);\n","import { isField, isInlineFragment } from './utils';\nimport {\n DenormalizeDataInput,\n ReadErrors,\n WriteErrors,\n buildReadWriteResult,\n extractReadWriteData,\n NormalizeDataInput,\n} from '@conduit-client/type-normalization/v1';\nimport { buildFieldKey, buildAugmentedFieldSelection, deepMerge } from './utils';\nimport {\n AugmentSelectionsData,\n GraphQLData,\n GraphQLFragmentDefinitions,\n GraphQLInputExtension,\n GraphQLVariables,\n} from './types';\nimport { ReadonlyCache, Cache } from '@conduit-client/service-cache/v1';\nimport {\n FieldNode,\n FragmentDefinitionNode,\n FragmentSpreadNode,\n InlineFragmentNode,\n Kind,\n} from '@conduit-client/onestore-graphql-parser/v1';\nimport { SelectionNode } from '@conduit-client/onestore-graphql-parser/v1';\nimport { ok, Result, deepEquals, err } from '@conduit-client/utils';\nimport { shouldSkip } from './directives';\nimport { FieldDef, FieldDefs, missingFieldDef } from './field-defs';\n\nexport abstract class BaseGraphQLTypeRepository<\n Data extends GraphQLData = GraphQLData,\n NormalizedData extends GraphQLData = GraphQLData,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> {\n abstract readonly namespace: string;\n abstract readonly typeName: string;\n abstract readonly fields: FieldDefs<any, any, ExtraInputExtension>;\n abstract readonly implementedInterfaces: string[];\n\n equals(x: Data, y: Data) {\n return deepEquals(x, y);\n }\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n const augmentedSelections: SelectionNode[] = [];\n let augmentedFragments = { ...input.fragments };\n for (const selection of input.selections) {\n if (isField(selection)) {\n const result = this.augmentFieldSelection(selection, augmentedFragments);\n augmentedSelections.push(...result.selections);\n augmentedFragments = result.fragments;\n } else if (isInlineFragment(selection)) {\n const augmentedFragmentSelections = this.augmentInlineFragmentSelection(\n selection,\n augmentedFragments\n );\n augmentedSelections.push(...augmentedFragmentSelections.selections);\n augmentedFragments = augmentedFragmentSelections.fragments;\n } else {\n const augmentedFragmentSelections = this.augmentFragmentSpreadSelection(\n selection,\n augmentedFragments\n );\n augmentedSelections.push(...augmentedFragmentSelections.selections);\n augmentedFragments = augmentedFragmentSelections.fragments;\n }\n }\n\n const newTypenameSelection = buildAugmentedFieldSelection(\n {\n kind: Kind.FIELD,\n name: {\n kind: Kind.NAME,\n value: '__typename',\n },\n },\n [...augmentedSelections, ...input.selections],\n augmentedFragments\n );\n\n if (newTypenameSelection) {\n augmentedSelections.push(newTypenameSelection);\n }\n return { selections: augmentedSelections, fragments: augmentedFragments };\n }\n\n augmentFieldSelection(\n selection: FieldNode,\n fragments: GraphQLFragmentDefinitions\n ): AugmentSelectionsData {\n const field = this.getFieldDef(undefined, selection);\n // If the type is unknown, we don't know how to augment it, so just return the selection as is\n // If the type is a scalar, no augmentations are needed\n if (field === undefined) {\n return { selections: [selection], fragments };\n }\n\n const result = field.augmentSelections({\n selections: (selection.selectionSet?.selections as SelectionNode[]) || [],\n fragments,\n });\n\n return {\n selections: [\n {\n ...selection,\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: result.selections,\n },\n },\n ],\n fragments: result.fragments,\n };\n }\n\n augmentInlineFragmentSelection(\n fragment: InlineFragmentNode,\n fragments: GraphQLFragmentDefinitions\n ): AugmentSelectionsData {\n // if this type doesn't satisfy the fragment type condition, don't process the fragment\n const satisfiedFragmentTypeConditionResult = this.satisfiesFragmentTypeCondition(\n undefined,\n fragment\n );\n if (\n satisfiedFragmentTypeConditionResult.isErr() ||\n !satisfiedFragmentTypeConditionResult.value\n ) {\n return { selections: [], fragments };\n }\n\n const augmentedFragmentSelections = this.augmentSelections({\n selections: (fragment.selectionSet?.selections as SelectionNode[]) || [],\n fragments,\n });\n\n return {\n selections: [\n {\n ...fragment,\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: augmentedFragmentSelections.selections,\n },\n },\n ],\n fragments: augmentedFragmentSelections.fragments,\n };\n }\n\n augmentFragmentSpreadSelection(\n selection: FragmentSpreadNode,\n fragments: GraphQLFragmentDefinitions\n ): AugmentSelectionsData {\n const fragment = fragments[selection.name.value];\n // If the fragment is undefined, we don't know how to augment it, so just return the selection as is\n if (fragment === undefined) {\n return { selections: [selection], fragments };\n }\n\n // if this type doesn't satisfy the fragment type condition, don't process the fragment\n const satisfiedFragmentTypeConditionResult = this.satisfiesFragmentTypeCondition(\n undefined,\n fragment\n );\n if (\n satisfiedFragmentTypeConditionResult.isErr() ||\n !satisfiedFragmentTypeConditionResult.value\n ) {\n return { selections: [selection], fragments };\n }\n\n const augmentedFragment = this.augmentSelections({\n selections: (fragment.selectionSet?.selections as SelectionNode[]) || [],\n fragments,\n });\n\n return {\n selections: [selection],\n fragments: {\n ...augmentedFragment.fragments,\n [fragment.name.value]: {\n ...fragment,\n selectionSet: {\n kind: Kind.SELECTION_SET,\n selections: augmentedFragment.selections,\n },\n },\n },\n };\n }\n\n normalizeSelections(\n cache: Cache,\n input: NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): Result<NormalizedData, WriteErrors> {\n const normalized: Record<string, unknown> = {};\n const errors: WriteErrors = [];\n\n // Iterate through all selection nodes to find fields\n for (const selection of input.selections) {\n if (isField(selection)) {\n deepMerge(\n normalized,\n this.normalizeFieldSelection(cache, input, selection, errors)\n );\n } else {\n let fragment: FragmentDefinitionNode | InlineFragmentNode;\n\n if (isInlineFragment(selection)) {\n fragment = selection;\n } else {\n const fragmentDefinition: FragmentDefinitionNode | undefined =\n input.request.definitions.fragments[selection.name.value];\n if (fragmentDefinition === undefined) {\n // should we error here?\n continue;\n }\n\n // Must merge the directives from the fragment definition and the usage\n fragment = {\n ...fragmentDefinition,\n directives: [\n ...(selection.directives || []),\n ...(fragmentDefinition.directives || []),\n ],\n };\n }\n\n deepMerge(normalized, this.normalizeFragment(cache, input, fragment, errors));\n }\n }\n\n return buildReadWriteResult<NormalizedData, WriteErrors>(normalized, errors);\n }\n\n protected normalizeFieldSelection(\n cache: Cache,\n input: NormalizeDataInput<\n Data,\n NormalizedData,\n GraphQLInputExtension & ExtraInputExtension\n >,\n selection: FieldNode,\n errorCollector: WriteErrors\n ): GraphQLData {\n const canonicalFieldName = selection.name.value;\n const dataInstanceFieldName = selection.alias?.value ?? selection.name.value;\n const value = input.data[dataInstanceFieldName];\n const fieldDef = this.getFieldDef(input, selection);\n\n if (!fieldDef) {\n errorCollector.push({\n type: 'unknown',\n error: new Error(\n `GraphQL query requests unknown field \"${canonicalFieldName}\" on type \"${this.typeName}\". Expected one of fields ${Object.keys(this.fields)}.`\n ),\n });\n return {};\n }\n\n const shouldSkipResult = shouldSkip(selection, input.request.definitions.variables);\n if (shouldSkipResult.isErr()) {\n errorCollector.push({\n type: 'unknown',\n error: shouldSkipResult.error,\n });\n return {};\n }\n\n if (shouldSkipResult.value) {\n return {};\n }\n\n // Extract existing normalized data for this specific field\n const existingFieldDataResult = this.getNormalizedFieldData(selection, input);\n if (existingFieldDataResult.isErr()) {\n errorCollector.push({\n type: 'unknown',\n error: existingFieldDataResult.error,\n });\n return {};\n }\n\n const existingFieldData = existingFieldDataResult.value;\n const cacheFieldKeyResult = fieldDef.buildFieldKey(\n selection,\n input.request.definitions.variables\n );\n if (cacheFieldKeyResult.isErr()) {\n errorCollector.push({\n type: 'unknown',\n error: cacheFieldKeyResult.error,\n });\n return {};\n }\n\n const cacheFieldKey = cacheFieldKeyResult.value;\n return {\n [cacheFieldKey]: extractReadWriteData(\n fieldDef.write(cache, {\n ...input,\n data: value as any,\n existingNormalizedData: existingFieldData as any,\n request: input.request,\n selection,\n }),\n errorCollector\n ),\n };\n }\n\n protected normalizeFragment(\n cache: Cache,\n input: NormalizeDataInput<\n Data,\n NormalizedData,\n GraphQLInputExtension & ExtraInputExtension\n >,\n fragment: InlineFragmentNode | FragmentDefinitionNode,\n errorCollector: WriteErrors\n ) {\n // We are making an assumption here that any fragment level directives do not affect\n // field resolution of the nested data. However, this strictly true, as a fragment directive\n // can affect both the inclusion/exclusion of fields within the fragment scope, as well as how those\n // fields are resolved, e.g. string formatting.\n // Because of this assumption, we theoretically can have issues if a custom directive is introduced that affects\n // field resolution\n // The most conservative way to handle this would be to include directives for the current \"scope\", and build that\n // into the field cache key, however, we're short circuiting that and assuming that fragment directives only affect\n // what fields are included, e.g. the way @skip & @include work on fragments\n const shouldProcessResult = this.shouldProcessFragment(input, fragment);\n if (shouldProcessResult.isErr()) {\n errorCollector.push({\n type: 'unknown',\n error: shouldProcessResult.error,\n });\n return {};\n }\n\n if (shouldProcessResult.value) {\n return (\n extractReadWriteData(\n this.normalizeSelections(cache, {\n ...input,\n selections: fragment.selectionSet.selections as SelectionNode[], // readonly casting, todo\n }),\n errorCollector\n ) || {}\n );\n }\n\n return {};\n }\n\n denormalizeSelections(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): Result<Data, ReadErrors> {\n const errors: ReadErrors = [];\n const denormalized: Record<string, unknown> = {};\n // Iterate through all selection nodes to find fields\n for (const selection of input.selections) {\n if (isField(selection)) {\n deepMerge(\n denormalized,\n this.denormalizeFieldSelection(cache, input, selection, errors)\n );\n } else {\n let fragment: FragmentDefinitionNode | InlineFragmentNode;\n\n if (isInlineFragment(selection)) {\n fragment = selection;\n } else {\n const fragmentDefinition: FragmentDefinitionNode | undefined =\n input.request.definitions.fragments[selection.name.value];\n if (fragmentDefinition === undefined) {\n // should we error here?\n continue;\n }\n\n fragment = {\n ...fragmentDefinition,\n directives: [\n ...(selection.directives || []),\n ...(fragmentDefinition.directives || []),\n ],\n };\n }\n\n deepMerge(denormalized, this.denormalizeFragment(cache, input, fragment, errors));\n }\n }\n return buildReadWriteResult<Data, ReadErrors>(denormalized, errors);\n }\n\n protected getNormalizedFieldData(\n selection: FieldNode,\n input:\n | NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n | DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): Result<unknown, Error> {\n const fieldDef = this.getFieldDef(input, selection);\n if (!fieldDef) {\n return err(\n new Error(\n `Unknown field \"${selection.name.value}\" on type \"${this.typeName}\". Expected one of fields ${Object.keys(this.fields)}.`\n )\n );\n }\n\n const cacheFieldKeyResult = fieldDef.buildFieldKey(\n selection,\n input.request.definitions.variables\n );\n\n if (cacheFieldKeyResult.isErr()) {\n return err(cacheFieldKeyResult.error);\n }\n\n const cacheFieldKey = cacheFieldKeyResult.value;\n return ok((input.existingNormalizedData || input.normalizedData)?.[cacheFieldKey]);\n }\n\n protected denormalizeFieldSelection(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>,\n selection: FieldNode,\n errorCollector: ReadErrors\n ): GraphQLData {\n const canonicalFieldName = selection.name.value;\n const fieldDef = this.getFieldDef(input, selection);\n if (!fieldDef) {\n errorCollector.push({\n type: 'unknown',\n error: new Error(\n `GraphQL query requests unknown field \"${canonicalFieldName}\" on type \"${this.typeName}\". Expected one of fields ${Object.keys(this.fields)}.`\n ),\n });\n return {};\n }\n const dataInstanceFieldName = selection.alias?.value ?? selection.name.value;\n\n const normalizedFieldDataResult = this.getNormalizedFieldData(selection, input);\n if (normalizedFieldDataResult.isErr()) {\n errorCollector.push({\n type: 'unknown',\n error: normalizedFieldDataResult.error,\n });\n return {};\n }\n\n const shouldSkipResult = shouldSkip(selection, input.request.definitions.variables);\n if (shouldSkipResult.isErr()) {\n errorCollector.push({\n type: 'unknown',\n error: shouldSkipResult.error,\n });\n return {};\n }\n\n if (shouldSkipResult.value) {\n return {};\n }\n\n const normalizedFieldValue = normalizedFieldDataResult.value;\n if (normalizedFieldValue === undefined) {\n errorCollector.push({\n type: 'missingData',\n namespace: this.namespace,\n typeName: this.typeName,\n data: canonicalFieldName,\n });\n return {};\n }\n\n const fieldData = extractReadWriteData(\n fieldDef.read(cache, {\n ...input,\n normalizedData: normalizedFieldValue as NormalizedData,\n request: input.request,\n selection,\n }),\n errorCollector\n );\n\n if (fieldData === undefined) {\n return {};\n }\n\n return {\n [dataInstanceFieldName]: fieldData,\n };\n }\n\n protected denormalizeFragment(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>,\n fragment: InlineFragmentNode | FragmentDefinitionNode,\n errorCollector: ReadErrors\n ) {\n // We are making an assumption here that any fragment level directives do not affect\n // field resolution of the nested data. However, this is not strictly true, as a fragment directive\n // can affect both the inclusion/exclusion of fields within the fragment scope, as well as how those\n // fields are resolved, e.g. string formatting.\n // Because of this assumption, we theoretically can have issues if a custom directive is introduced that affects\n // field resolution\n // The most conservative way to handle this would be to include directives for the current \"scope\", and build that\n // into the field cache key, however, we're short circuiting that and assuming that fragment directives only affect\n // what fields are included, e.g. the way @skip & @include work on fragments\n const shouldProcessResult = this.shouldProcessFragment(input, fragment);\n if (shouldProcessResult.isErr()) {\n errorCollector.push({\n type: 'unknown',\n error: shouldProcessResult.error,\n });\n return {};\n }\n\n if (shouldProcessResult.value) {\n return (\n extractReadWriteData(\n this.denormalizeSelections(cache, {\n ...input,\n selections: fragment.selectionSet.selections as SelectionNode[], // readonly casting, todo\n }),\n errorCollector\n ) || {}\n );\n }\n\n return {};\n }\n\n protected getFieldDef(\n input:\n | NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n | DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n | undefined,\n selection: FieldNode\n ): FieldDef<Data, NormalizedData> | undefined {\n // input can be used here to do a dynamic determination of what field to use, e.g. interface types\n const canonicalFieldName = selection.name.value;\n const fieldDef = this.fields[canonicalFieldName];\n if (fieldDef) {\n return fieldDef;\n }\n\n const dataInstanceFieldName = selection.alias?.value ?? selection.name.value;\n\n if (input === undefined) {\n return undefined;\n }\n\n // if we don't know what the field is, but the data is missing, we can defer to a missing field def\n if ('data' in input && input.data[dataInstanceFieldName] === undefined) {\n return missingFieldDef;\n } else if (\n 'normalizedData' in input &&\n input.normalizedData?.[dataInstanceFieldName]?.type === 'missing'\n ) {\n return missingFieldDef;\n }\n\n return undefined;\n }\n\n shouldProcessFragment(\n input:\n | NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n | DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>,\n fragment: InlineFragmentNode | FragmentDefinitionNode\n ): Result<boolean, Error> {\n const shouldSkipResult = shouldSkip(fragment, input.request.definitions.variables);\n if (shouldSkipResult.isErr()) {\n return shouldSkipResult;\n }\n\n if (shouldSkipResult.value) {\n return ok(false);\n }\n\n return this.satisfiesFragmentTypeCondition(input, fragment);\n }\n\n satisfiesFragmentTypeCondition(\n _input:\n | NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n | DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n | undefined,\n fragment: InlineFragmentNode | FragmentDefinitionNode\n ): Result<boolean, Error> {\n // If no type condition, fragment applies to all types\n if (!fragment.typeCondition) {\n return ok(true);\n }\n\n const conditionalTypeName = fragment.typeCondition.name.value;\n\n // Check if this type repository's name, the type condition on the fragment\n if (conditionalTypeName === this.typeName) {\n return ok(true);\n }\n\n if (this.implementedInterfaces.includes(conditionalTypeName)) {\n return ok(true);\n }\n\n return ok(false);\n }\n\n protected getCacheKeyFieldArguments(selection: FieldNode) {\n return selection.arguments;\n }\n\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error> {\n return buildFieldKey(\n selection.name.value,\n this.getCacheKeyFieldArguments(selection),\n variables\n );\n }\n}\n","import { Cache, ReadonlyCache } from '@conduit-client/service-cache/v1';\nimport {\n DenormalizeDataInput,\n IdentifiableTypeRepository,\n NormalizedLink,\n ReadResult,\n WriteInput,\n WriteResult,\n} from '@conduit-client/type-normalization/v1';\nimport { BaseGraphQLTypeRepository } from './base-object-repository';\nimport {\n GraphQLData,\n GraphQLInputExtension,\n GraphQLRequestParams,\n AugmentSelectionsData,\n GraphQLFragmentDefinitions,\n GraphQLVariables,\n} from './types';\nimport { buildAugmentedFieldSelection, deepMerge, findExecutableOperation } from './utils';\nimport { deepEquals, err, ok, Result } from '@conduit-client/utils';\nimport {\n DocumentNode,\n FieldNode,\n FragmentDefinitionNode,\n Kind,\n OperationDefinitionNode,\n SelectionNode,\n} from '@conduit-client/onestore-graphql-parser/v1';\nimport { FieldDefs } from './field-defs';\nimport { GraphQLTypeRepository } from './repository';\n\nexport abstract class IdentifiableGraphQLTypeRepository<\n Data extends GraphQLData,\n NormalizedData extends GraphQLData,\n KeyParams extends Record<string, unknown> | null = Record<string, unknown>,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n >\n extends IdentifiableTypeRepository<\n Data,\n NormalizedData,\n KeyParams,\n GraphQLInputExtension & ExtraInputExtension,\n GraphQLInputExtension & ExtraInputExtension\n >\n implements GraphQLTypeRepository\n{\n abstract readonly namespace: string;\n abstract readonly typeName: string;\n abstract readonly implementedInterfaces: string[];\n abstract readonly fields: FieldDefs<any, any, ExtraInputExtension>;\n readonly idField: string = 'id';\n\n private _graphqlRepository: BaseGraphQLTypeRepository<Data, NormalizedData> | undefined =\n undefined;\n protected get graphqlRepository() {\n if (this._graphqlRepository === undefined) {\n this._graphqlRepository = new this.LocalGraphQLRepository<\n Data,\n NormalizedData,\n ExtraInputExtension\n >(this.namespace, this.typeName, this.implementedInterfaces, this.fields, this.idField);\n }\n\n return this._graphqlRepository;\n }\n private LocalGraphQLRepository = class<\n Data extends GraphQLData,\n NormalizedData extends GraphQLData,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n > extends BaseGraphQLTypeRepository<Data, NormalizedData, ExtraInputExtension> {\n constructor(\n public readonly namespace: string,\n public readonly typeName: string,\n public readonly implementedInterfaces: string[],\n public readonly fields: FieldDefs<any, any, ExtraInputExtension>,\n public readonly idField: string\n ) {\n super();\n }\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n const result = super.augmentSelections(input);\n const augmentedSelections = result.selections;\n let augmentedFragments = result.fragments;\n const newSelection = buildAugmentedFieldSelection(\n {\n kind: Kind.FIELD,\n name: {\n kind: Kind.NAME,\n value: this.idField,\n },\n } satisfies FieldNode,\n [...augmentedSelections, ...input.selections],\n augmentedFragments\n );\n if (newSelection) {\n augmentedSelections.push(newSelection);\n }\n return { selections: augmentedSelections, fragments: augmentedFragments };\n }\n };\n\n write(\n cache: Cache,\n input: WriteInput<Data, GraphQLInputExtension & ExtraInputExtension>\n ): WriteResult<NormalizedLink> {\n const key = this.buildKey(this.buildKeyParams(input));\n const normalized = this.normalizeData(cache, input);\n if (normalized.isErr()) {\n return err(normalized.error);\n }\n\n const existing = cache.get(key);\n\n // only write to the cache if data has changed\n if (!deepEquals(existing?.value, normalized.value)) {\n cache.set<NormalizedData>(key, {\n value: normalized.value,\n metadata: this.cacheMetadata,\n });\n }\n\n return ok({\n type: 'link',\n linkedKey: key,\n } as const);\n }\n\n normalizeData(\n cache: Cache,\n input: WriteInput<Data, GraphQLInputExtension & ExtraInputExtension>\n ): WriteResult<NormalizedData> {\n const key = this.buildKey(this.buildKeyParams(input));\n const existingNormalizedData = cache.get<GraphQLData>(key, { copy: true });\n const normalizeDataResult = this.graphqlRepository.normalizeSelections(cache, {\n ...input,\n existingNormalizedData: existingNormalizedData?.value as NormalizedData | undefined,\n });\n\n if (normalizeDataResult.isErr()) {\n return normalizeDataResult;\n }\n\n return ok(\n deepMerge(\n {},\n existingNormalizedData?.value || {},\n normalizeDataResult.value\n ) as NormalizedData\n );\n }\n\n denormalizeData(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): ReadResult<Data> {\n return this.graphqlRepository.denormalizeSelections(cache, input);\n }\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n return this.graphqlRepository.augmentSelections(input);\n }\n\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error> {\n return this.graphqlRepository.buildFieldKey(selection, variables);\n }\n\n buildKeyParams(\n input: WriteInput<Data, GraphQLInputExtension & ExtraInputExtension>\n ): KeyParams {\n // lookup the id field property name from the selections\n const idField = input.selections.find(\n (selection) => selection.kind === Kind.FIELD && selection.name.value === this.idField\n ) as FieldNode;\n if (!idField) {\n throw new Error(`Id field ${this.idField} not found in selections`);\n }\n\n const idFieldDataProperty = idField.alias?.value || idField.name.value;\n return {\n [this.idField]: input.data[idFieldDataProperty],\n } as KeyParams;\n }\n}\n\nexport abstract class GraphQLDocumentRootTypeRepository<\n Data extends GraphQLData,\n NormalizedData extends GraphQLData,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> extends IdentifiableGraphQLTypeRepository<Data, NormalizedData, null, ExtraInputExtension> {\n implementedInterfaces = [];\n\n private _rootGraphqlRepository: BaseGraphQLTypeRepository<Data, NormalizedData> | undefined =\n undefined;\n protected get graphqlRepository() {\n if (this._rootGraphqlRepository === undefined) {\n this._rootGraphqlRepository = new this.LocalRootGraphQLRepository(\n this.namespace,\n this.typeName,\n this.implementedInterfaces,\n this.fields,\n this.idField\n );\n }\n\n return this._rootGraphqlRepository;\n }\n private LocalRootGraphQLRepository = class<\n Data extends GraphQLData,\n NormalizedData extends GraphQLData,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n > extends BaseGraphQLTypeRepository<Data, NormalizedData, ExtraInputExtension> {\n constructor(\n public readonly namespace: string,\n public readonly typeName: string,\n public readonly implementedInterfaces: string[],\n public readonly fields: FieldDefs<any, any, ExtraInputExtension>,\n public readonly idField: string\n ) {\n super();\n }\n };\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n return this.graphqlRepository.augmentSelections(input);\n }\n\n buildKeyParams(_input: WriteInput<Data, GraphQLInputExtension & ExtraInputExtension>) {\n return null;\n }\n\n denormalizeData(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): ReadResult<Data> {\n const result = super.denormalizeData(cache, input);\n if (result.isErr()) {\n return result;\n }\n\n return ok({\n data: result.value,\n } as any);\n }\n\n buildAugmentedQuery(input: GraphQLRequestParams): Result<DocumentNode, Error> {\n const operationResult = findExecutableOperation(input);\n if (operationResult.isErr()) {\n return err(operationResult.error);\n }\n\n const operation = operationResult.value;\n const fragmentDefinitions = input.query.definitions.filter(\n (def) => def.kind === Kind.FRAGMENT_DEFINITION\n ) as FragmentDefinitionNode[];\n const fragments = fragmentDefinitions.reduce(\n (acc, def) => {\n acc[def.name.value] = def;\n return acc;\n },\n {} as Record<string, FragmentDefinitionNode>\n ) satisfies GraphQLFragmentDefinitions;\n\n const result = this.augmentSelections({\n selections: (operationResult.value.selectionSet?.selections as SelectionNode[]) || [],\n fragments,\n });\n const augmentedOperationSelections = result.selections;\n let augmentedFragments = result.fragments;\n\n const augmentedOperation = {\n ...operation,\n selectionSet: { kind: Kind.SELECTION_SET, selections: augmentedOperationSelections },\n } satisfies OperationDefinitionNode;\n\n // Filter out the old operation and fragments, and add the augmented ones\n return ok({\n ...input.query,\n definitions: [\n ...input.query.definitions\n .filter((def) => def.kind !== Kind.FRAGMENT_DEFINITION)\n .map((def) => {\n if (def.kind !== Kind.OPERATION_DEFINITION || def !== operation) {\n return def;\n }\n\n return augmentedOperation;\n }),\n ...Object.values(augmentedFragments),\n ],\n } satisfies DocumentNode);\n }\n}\n","import { Cache, ReadonlyCache } from '@conduit-client/service-cache/v1';\nimport {\n DenormalizeDataInput,\n NormalizeDataInput,\n ReadResult,\n WriteResult,\n} from '@conduit-client/type-normalization/v1';\nimport { BaseGraphQLTypeRepository } from './base-object-repository';\nimport { GraphQLData, GraphQLInputExtension } from './types';\nimport { GraphQLTypeRepository } from './repository';\n\nexport abstract class UnidentifiableGraphQLTypeRepository<\n Data extends GraphQLData,\n NormalizedData extends GraphQLData,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n >\n extends BaseGraphQLTypeRepository<Data, NormalizedData, ExtraInputExtension>\n implements GraphQLTypeRepository\n{\n constructor(protected services: {}) {\n super();\n }\n\n write(\n cache: Cache,\n input: NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): WriteResult<NormalizedData> {\n return this.normalizeSelections(cache, input);\n }\n\n read(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): ReadResult<Data> {\n return this.denormalizeSelections(cache, input);\n }\n}\n","import { AugmentSelectionsData, GraphQLInputExtension, GraphQLVariables } from './types';\nimport { GraphQLTypeRepository } from './repository';\nimport { FieldDefs } from './field-defs';\nimport { FieldNode, SelectionNode } from '@conduit-client/onestore-graphql-parser/v1';\nimport { Kind } from '@conduit-client/onestore-graphql-parser/v1';\nimport { buildFieldKey, buildAugmentedFieldSelection } from './utils';\nimport { deepEquals } from '@conduit-client/utils';\nimport { Cache, ReadonlyCache } from '@conduit-client/service-cache/v1';\nimport {\n DenormalizeDataInput,\n NormalizeDataInput,\n ReadErrors,\n ReadResult,\n UnionRepresentation,\n WriteErrors,\n WriteResult,\n} from '@conduit-client/type-normalization/v1';\nimport { err, ok, Result } from '@conduit-client/utils';\n\nexport abstract class BaseInterfaceRepository<\n Data = unknown,\n NormalizedData = unknown,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> implements GraphQLTypeRepository<Data, NormalizedData, ExtraInputExtension>\n{\n abstract namespace: string;\n abstract typeName: string;\n abstract get possibleTypes(): Record<\n string,\n GraphQLTypeRepository<any, any, ExtraInputExtension>\n >;\n abstract fields: FieldDefs<Data, NormalizedData, ExtraInputExtension>;\n\n constructor(protected services: {}) {}\n\n equals(x: unknown, y: unknown) {\n return deepEquals(x, y);\n }\n\n write(\n cache: Cache,\n input: NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): WriteResult<NormalizedData> {\n if (typeof input.data !== 'object') {\n return err([\n {\n type: 'unknown',\n error: new Error(`Got a non-object value for ${this.typeName} field\"`),\n },\n ]);\n }\n\n const discriminator = this.getTypeDiscriminator(input.data, input.selections);\n // Get the object type definition for the concrete type\n const concreteTypeRepository = this.possibleTypes[discriminator];\n if (!concreteTypeRepository) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Unknown discriminator \"${discriminator}\" for ${this.typeName} field, expected one of ${Object.keys(this.possibleTypes)}`\n ),\n },\n ]);\n }\n\n const selectionErr = this.verifyInterfaceFields(input.selections);\n\n if (selectionErr) {\n return err(selectionErr);\n }\n\n const normalizeInput: NormalizeDataInput<\n Data,\n NormalizedData,\n GraphQLInputExtension & ExtraInputExtension\n > = {\n ...input,\n data: input.data,\n existingNormalizedData: input.existingNormalizedData,\n selections: input.selections,\n request: input.request,\n parentFieldSelection: input.parentFieldSelection,\n };\n\n const result = concreteTypeRepository.write(cache, normalizeInput);\n if (result.isOk()) {\n return ok({ discriminator, data: result.value } as any);\n }\n return result as Result<NormalizedData, WriteErrors>;\n }\n\n read(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): ReadResult<Data> {\n // Handle union and interface types\n const unionRep = input.normalizedData as UnionRepresentation<string, NormalizedData>;\n if (typeof unionRep.data !== 'object' || unionRep.data === null) {\n return err([\n {\n type: 'unknown',\n error: new Error(`Got a non-object value for ${this.typeName} field.`),\n },\n ]);\n }\n\n const discriminator = unionRep.discriminator;\n\n // Get the object type definition for the concrete type\n const concreteRepository = this.possibleTypes[discriminator];\n if (!concreteRepository) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Unknown discriminator \"${discriminator}\" for ${this.typeName} field, expected one of ${Object.keys(this.possibleTypes)}`\n ),\n },\n ]);\n }\n\n const selectionErr = this.verifyInterfaceFields(input.selections);\n\n if (selectionErr) {\n return err(selectionErr);\n }\n\n const denormalizeInput: DenormalizeDataInput<\n NormalizedData,\n GraphQLInputExtension & ExtraInputExtension\n > = {\n ...input,\n normalizedData: unionRep.data,\n selections: input.selections,\n request: input.request,\n parentFieldSelection: input.parentFieldSelection,\n };\n\n const result = concreteRepository.read(cache, denormalizeInput);\n return result as Result<Data, ReadErrors>;\n }\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n // interfaces must use an inline fragment to get any fields besides __typename or the fields of the interface itself\n // lets add typename to the top level of the interface selections, and then filter it out of the possible type selections\n const augmentedSelections: SelectionNode[] = [];\n\n // augment the selections for the fields of the interface itself\n let augmentedFragments = { ...input.fragments };\n input.selections.forEach((selection) => {\n if (selection.kind === Kind.FIELD) {\n // augment the fields of the interface itself\n if (Object.keys(this.fields).includes(selection.name.value)) {\n const field = this.fields[selection.name.value];\n const result = field.augmentSelections({\n selections: (selection.selectionSet?.selections as SelectionNode[]) || [],\n fragments: input.fragments,\n });\n augmentedSelections.push({\n ...selection,\n selectionSet: { kind: Kind.SELECTION_SET, selections: result.selections },\n });\n augmentedFragments = result.fragments;\n } else {\n // if there are any other top level fields that are not in the interface\n // we expect the server to error, so don't augment anything\n augmentedSelections.push(selection);\n }\n } else {\n // fragments should be handled by the possible types below\n }\n });\n\n const result = augmentUnionLikeSelections(\n {\n selections: [...input.selections, ...augmentedSelections],\n fragments: augmentedFragments,\n },\n this.possibleTypes\n );\n augmentedSelections.push(...result.selections);\n augmentedFragments = result.fragments;\n\n const newSelection = buildAugmentedFieldSelection(\n { kind: Kind.FIELD, name: { kind: Kind.NAME, value: '__typename' } },\n augmentedSelections,\n input.fragments\n );\n if (newSelection) {\n augmentedSelections.push(newSelection);\n }\n return { selections: augmentedSelections, fragments: augmentedFragments };\n }\n\n protected getTypeDiscriminator(data: any, selections: SelectionNode[]) {\n const typenameSelection: FieldNode | undefined = selections.find(\n (selection) => selection.kind === Kind.FIELD && selection.name.value === '__typename'\n ) as FieldNode | undefined;\n if (typenameSelection) {\n return data[typenameSelection.alias?.value || typenameSelection.name.value];\n } else {\n return data.__typename; // fallback to __typename if we can't find the selection for some reason\n }\n }\n\n protected verifyInterfaceFields(\n selections: readonly SelectionNode[]\n ): (ReadErrors & WriteErrors) | void {\n let selectionErr;\n selections.forEach((selection) => {\n if (selection.kind === Kind.FIELD) {\n const fieldName = selection.name.value;\n const selectionAllowed =\n fieldName === '__typename' || Object.keys(this.fields).includes(fieldName);\n if (!selectionAllowed) {\n selectionErr = [\n {\n type: 'unknown',\n error: new Error(\n `Dissallowed selection \"${fieldName}\" used outside of an inline fragment for interface type ${this.typeName}\"`\n ),\n },\n ];\n return;\n }\n }\n\n // have to check fragments as well\n });\n return selectionErr;\n }\n\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error> {\n return buildFieldKey(\n selection.name.value,\n this.getCacheKeyFieldArguments(selection),\n variables\n );\n }\n\n protected getCacheKeyFieldArguments(selection: FieldNode) {\n return selection.arguments;\n }\n}\n\nexport abstract class BaseUnionRepository<\n Data = unknown,\n NormalizedData = unknown,\n ExtraInputExtension extends Record<string, any> = Record<string, unknown>,\n> implements GraphQLTypeRepository<Data, NormalizedData, ExtraInputExtension>\n{\n abstract namespace: string;\n abstract typeName: string;\n abstract get possibleTypes(): Record<\n string,\n GraphQLTypeRepository<any, any, ExtraInputExtension>\n >;\n\n constructor(protected services: {}) {}\n\n equals(x: unknown, y: unknown) {\n return deepEquals(x, y);\n }\n\n write(\n cache: Cache,\n input: NormalizeDataInput<Data, NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): WriteResult<NormalizedData> {\n if (typeof input.data !== 'object') {\n return err([\n {\n type: 'unknown',\n error: new Error(`Got a non-object value for ${this.typeName} field\"`),\n },\n ]);\n }\n\n const discriminator = this.getTypeDiscriminator(input.data, input.selections);\n // Get the object type definition for the concrete type\n const concreteTypeRepository = this.possibleTypes[discriminator];\n if (!concreteTypeRepository) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Unknown discriminator \"${discriminator}\" for ${this.typeName} field, expected one of ${Object.keys(this.possibleTypes)}`\n ),\n },\n ]);\n }\n\n const selectionErr = this.verifyUnionFields(input.selections);\n\n if (selectionErr) {\n return err(selectionErr);\n }\n\n const normalizeInput: NormalizeDataInput<\n Data,\n NormalizedData,\n GraphQLInputExtension & ExtraInputExtension\n > = {\n ...input,\n data: input.data,\n existingNormalizedData: input.existingNormalizedData,\n selections: input.selections,\n request: input.request,\n parentFieldSelection: input.parentFieldSelection,\n };\n\n const result = concreteTypeRepository.write(cache, normalizeInput);\n if (result.isOk()) {\n return ok({ discriminator, data: result.value } as any);\n }\n return result as Result<NormalizedData, WriteErrors>;\n }\n\n read(\n cache: ReadonlyCache,\n input: DenormalizeDataInput<NormalizedData, GraphQLInputExtension & ExtraInputExtension>\n ): ReadResult<Data> {\n // Handle union and interface types\n const unionRep = input.normalizedData as UnionRepresentation<string, NormalizedData>;\n if (typeof unionRep.data !== 'object' || unionRep.data === null) {\n return err([\n {\n type: 'unknown',\n error: new Error(`Got a non-object value for ${this.typeName} field.`),\n },\n ]);\n }\n\n const discriminator = unionRep.discriminator;\n\n // Get the object type definition for the concrete type\n const concreteRepository = this.possibleTypes[discriminator];\n if (!concreteRepository) {\n return err([\n {\n type: 'unknown',\n error: new Error(\n `Unknown discriminator \"${discriminator}\" for ${this.typeName} field, expected one of ${Object.keys(this.possibleTypes)}`\n ),\n },\n ]);\n }\n\n const selectionErr = this.verifyUnionFields(input.selections);\n\n if (selectionErr) {\n return err(selectionErr);\n }\n\n const denormalizeInput: DenormalizeDataInput<\n NormalizedData,\n GraphQLInputExtension & ExtraInputExtension\n > = {\n ...input,\n normalizedData: unionRep.data,\n selections: input.selections,\n request: input.request,\n parentFieldSelection: input.parentFieldSelection,\n };\n\n const result = concreteRepository.read(cache, denormalizeInput);\n return result as Result<Data, ReadErrors>;\n }\n\n augmentSelections(input: AugmentSelectionsData): AugmentSelectionsData {\n // union must use an inline fragment to get any fields besides __typename\n // lets add typename to the top level of the interface selections, and then filter it out of the possible type selections\n const augmentedSelections: SelectionNode[] = [];\n let augmentedFragments = { ...input.fragments };\n\n const result = augmentUnionLikeSelections(\n {\n selections: [...input.selections, ...augmentedSelections],\n fragments: augmentedFragments,\n },\n this.possibleTypes\n );\n augmentedSelections.push(...result.selections);\n augmentedFragments = result.fragments;\n\n const newSelection = buildAugmentedFieldSelection(\n { kind: Kind.FIELD, name: { kind: Kind.NAME, value: '__typename' } },\n augmentedSelections,\n input.fragments\n );\n if (newSelection) {\n augmentedSelections.push(newSelection);\n }\n return { selections: augmentedSelections, fragments: augmentedFragments };\n }\n\n protected getTypeDiscriminator(data: any, selections: SelectionNode[]) {\n const typenameSelection: FieldNode | undefined = selections.find(\n (selection) => selection.kind === Kind.FIELD && selection.name.value === '__typename'\n ) as FieldNode | undefined;\n if (typenameSelection) {\n return data[typenameSelection.alias?.value || typenameSelection.name.value];\n } else {\n return data.__typename; // fallback to __typename if we can't find the selection for some reason\n }\n }\n\n protected verifyUnionFields(\n selections: readonly SelectionNode[]\n ): (ReadErrors & WriteErrors) | void {\n let selectionErr;\n selections.forEach((selection) => {\n if (selection.kind === Kind.FIELD) {\n const fieldName = selection.name.value;\n const selectionAllowed = fieldName === '__typename';\n if (!selectionAllowed) {\n selectionErr = [\n {\n type: 'unknown',\n error: new Error(\n `Dissallowed selection \"${fieldName}\" used outside of an inline fragment for union type ${this.typeName}\"`\n ),\n },\n ];\n return;\n }\n }\n\n // have to check fragments as well\n });\n return selectionErr;\n }\n\n buildFieldKey(selection: FieldNode, variables: GraphQLVariables): Result<string, Error> {\n return buildFieldKey(\n selection.name.value,\n this.getCacheKeyFieldArguments(selection),\n variables\n );\n }\n\n protected getCacheKeyFieldArguments(selection: FieldNode) {\n return selection.arguments;\n }\n}\n\nfunction augmentUnionLikeSelections(\n input: AugmentSelectionsData,\n possibleTypes: Record<string, GraphQLTypeRepository>\n) {\n const augmentedSelections: SelectionNode[] = [];\n let augmentedFragments = { ...input.fragments };\n // augment the selections for the possible types of the union\n Object.values(possibleTypes).forEach((repository) => {\n const result = repository.augmentSelections({\n selections: [...input.selections, ...augmentedSelections],\n fragments: augmentedFragments,\n });\n const typeSelections = result.selections\n // top level fields are handled elsewhere since union types in general don't allow top level fields\n .filter((selection) => selection.kind !== Kind.FIELD)\n .map((selection) => {\n if (selection.kind === Kind.INLINE_FRAGMENT) {\n return {\n ...selection,\n selectionSet: {\n kind: Kind.SELECTION_SET as const,\n selections: selection.selectionSet.selections,\n },\n };\n }\n\n // fragment spreads are handled via augmentedFragments, so nothing to do here\n return selection;\n });\n\n augmentedSelections.push(...typeSelections);\n augmentedFragments = result.fragments;\n });\n return { selections: augmentedSelections, fragments: augmentedFragments };\n}\n","import { JSONSchema } from '@conduit-client/jsonschema-validate';\n\nexport const GraphQLQueryJsonSchema: JSONSchema = {\n type: 'object',\n properties: {\n query: true,\n variables: { type: 'object', properties: {}, required: [], additionalProperties: true },\n operationName: { type: 'string' },\n },\n required: ['query'],\n additionalProperties: true,\n};\n"],"names":["result"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@conduit-client/graphql-normalization",
3
+ "version": "5.67.0-dev1",
4
+ "private": false,
5
+ "description": "Luvio GraphQL Normalization",
6
+ "type": "module",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/salesforce-experience-platform-emu/luvio-next.git",
10
+ "directory": "packages/@conduit-client/graphql-normalization"
11
+ },
12
+ "license": "SEE LICENSE IN LICENSE.txt",
13
+ "exports": {
14
+ "./v1": {
15
+ "import": "./dist/v1/index.js",
16
+ "types": "./dist/types/v1/index.d.ts",
17
+ "require": "./dist/v1/index.js"
18
+ }
19
+ },
20
+ "main": "./dist/main/index.js",
21
+ "module": "./dist/main/index.js",
22
+ "types": "./dist/main/index.d.ts",
23
+ "files": [
24
+ "dist/"
25
+ ],
26
+ "scripts": {
27
+ "build": "vite build && tsc --build --emitDeclarationOnly",
28
+ "clean": "rm -rf dist",
29
+ "test": "vitest run",
30
+ "test:perf": "vitest bench",
31
+ "test:size": "size-limit",
32
+ "watch": "npm run build --watch"
33
+ },
34
+ "dependencies": {
35
+ "@conduit-client/onestore-graphql-parser": "5.67.0-dev1",
36
+ "@conduit-client/pagination": "5.67.0-dev1",
37
+ "@conduit-client/service-cache": "5.67.0-dev1",
38
+ "@conduit-client/service-pubsub": "5.67.0-dev1",
39
+ "@conduit-client/type-normalization": "5.67.0-dev1",
40
+ "@conduit-client/utils": "5.67.0-dev1"
41
+ },
42
+ "devDependencies": {
43
+ "@conduit-client/command-aura-normalized-cache-control": "5.67.0-dev1",
44
+ "@conduit-client/service-cache-control": "5.67.0-dev1",
45
+ "@conduit-client/service-cache-inclusion-policy": "5.67.0-dev1"
46
+ },
47
+ "volta": {
48
+ "extends": "../../../package.json"
49
+ },
50
+ "size-limit": [
51
+ {
52
+ "path": "./dist/v1/index.js",
53
+ "limit": "8 kB"
54
+ }
55
+ ]
56
+ }