apollo-cache-inmemory
Version:
Core abstract of Caching layer for Apollo Client
1,050 lines • 71.9 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var lodash_1 = require("lodash");
var graphql_tag_1 = tslib_1.__importDefault(require("graphql-tag"));
var apollo_utilities_1 = require("apollo-utilities");
var writeToStore_1 = require("../writeToStore");
var objectCache_1 = require("../objectCache");
var __1 = require("../");
function withWarning(func, regex) {
var message = null;
var oldWarn = console.warn;
console.warn = function (m) { return (message = m); };
return Promise.resolve(func()).then(function (val) {
expect(message).toMatch(regex);
console.warn = oldWarn;
return val;
});
}
exports.withWarning = withWarning;
var getIdField = function (_a) {
var id = _a.id;
return id;
};
describe('writing to the store', function () {
var writer = new writeToStore_1.StoreWriter();
it('properly normalizes a trivial item', function () {
var query = graphql_tag_1.default(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
})
.toObject()).toEqual({
ROOT_QUERY: result,
});
});
it('properly normalizes an aliased field', function () {
var query = graphql_tag_1.default(templateObject_2 || (templateObject_2 = tslib_1.__makeTemplateObject(["\n {\n id\n aliasedField: stringField\n numberField\n nullField\n }\n "], ["\n {\n id\n aliasedField: stringField\n numberField\n nullField\n }\n "])));
var result = {
id: 'abcd',
aliasedField: 'This is a string!',
numberField: 5,
nullField: null,
};
var normalized = writer.writeQueryToStore({
result: result,
query: query,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
},
});
});
it('properly normalizes a aliased fields with arguments', function () {
var query = graphql_tag_1.default(templateObject_3 || (templateObject_3 = tslib_1.__makeTemplateObject(["\n {\n id\n aliasedField1: stringField(arg: 1)\n aliasedField2: stringField(arg: 2)\n numberField\n nullField\n }\n "], ["\n {\n id\n aliasedField1: stringField(arg: 1)\n aliasedField2: stringField(arg: 2)\n numberField\n nullField\n }\n "])));
var result = {
id: 'abcd',
aliasedField1: 'The arg was 1!',
aliasedField2: 'The arg was 2!',
numberField: 5,
nullField: null,
};
var normalized = writer.writeQueryToStore({
result: result,
query: query,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'abcd',
'stringField({"arg":1})': 'The arg was 1!',
'stringField({"arg":2})': 'The arg was 2!',
numberField: 5,
nullField: null,
},
});
});
it('properly normalizes a query with variables', function () {
var query = graphql_tag_1.default(templateObject_4 || (templateObject_4 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "], ["\n {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "])));
var variables = {
intArg: 5,
floatArg: 3.14,
stringArg: 'This is a string!',
};
var result = {
id: 'abcd',
stringField: 'Heyo',
numberField: 5,
nullField: null,
};
var normalized = writer.writeQueryToStore({
result: result,
query: query,
variables: variables,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'abcd',
nullField: null,
'numberField({"floatArg":3.14,"intArg":5})': 5,
'stringField({"arg":"This is a string!"})': 'Heyo',
},
});
});
it('properly normalizes a query with default values', function () {
var query = graphql_tag_1.default(templateObject_5 || (templateObject_5 = tslib_1.__makeTemplateObject(["\n query someBigQuery(\n $stringArg: String = \"This is a default string!\"\n $intArg: Int\n $floatArg: Float\n ) {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "], ["\n query someBigQuery(\n $stringArg: String = \"This is a default string!\"\n $intArg: Int\n $floatArg: Float\n ) {\n id\n stringField(arg: $stringArg)\n numberField(intArg: $intArg, floatArg: $floatArg)\n nullField\n }\n "])));
var variables = {
intArg: 5,
floatArg: 3.14,
};
var result = {
id: 'abcd',
stringField: 'Heyo',
numberField: 5,
nullField: null,
};
var normalized = writer.writeQueryToStore({
result: result,
query: query,
variables: variables,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'abcd',
nullField: null,
'numberField({"floatArg":3.14,"intArg":5})': 5,
'stringField({"arg":"This is a default string!"})': 'Heyo',
},
});
});
it('properly normalizes a query with custom directives', function () {
var query = graphql_tag_1.default(templateObject_6 || (templateObject_6 = tslib_1.__makeTemplateObject(["\n query {\n id\n firstName @include(if: true)\n lastName @upperCase\n birthDate @dateFormat(format: \"DD-MM-YYYY\")\n }\n "], ["\n query {\n id\n firstName @include(if: true)\n lastName @upperCase\n birthDate @dateFormat(format: \"DD-MM-YYYY\")\n }\n "])));
var result = {
id: 'abcd',
firstName: 'James',
lastName: 'BOND',
birthDate: '20-05-1940',
};
var normalized = writer.writeQueryToStore({
result: result,
query: query,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'abcd',
firstName: 'James',
'lastName@upperCase': 'BOND',
'birthDate@dateFormat({"format":"DD-MM-YYYY"})': '20-05-1940',
},
});
});
it('properly normalizes a nested object with an ID', function () {
var _a;
var query = graphql_tag_1.default(templateObject_7 || (templateObject_7 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedObj {\n id\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedObj {\n id\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedObj: {
id: 'abcde',
stringField: 'This is a string too!',
numberField: 6,
nullField: null,
},
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
})
.toObject()).toEqual((_a = {
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedObj')), {
nestedObj: {
type: 'id',
id: result.nestedObj.id,
generated: false,
},
})
},
_a[result.nestedObj.id] = result.nestedObj,
_a));
});
it('properly normalizes a nested object without an ID', function () {
var _a;
var query = graphql_tag_1.default(templateObject_8 || (templateObject_8 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedObj {\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedObj {\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedObj: {
stringField: 'This is a string too!',
numberField: 6,
nullField: null,
},
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
})
.toObject()).toEqual((_a = {
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedObj')), {
nestedObj: {
type: 'id',
id: "$ROOT_QUERY.nestedObj",
generated: true,
},
})
},
_a["$ROOT_QUERY.nestedObj"] = result.nestedObj,
_a));
});
it('properly normalizes a nested object with arguments but without an ID', function () {
var _a;
var query = graphql_tag_1.default(templateObject_9 || (templateObject_9 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedObj(arg: \"val\") {\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedObj(arg: \"val\") {\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedObj: {
stringField: 'This is a string too!',
numberField: 6,
nullField: null,
},
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
})
.toObject()).toEqual((_a = {
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedObj')), {
'nestedObj({"arg":"val"})': {
type: 'id',
id: "$ROOT_QUERY.nestedObj({\"arg\":\"val\"})",
generated: true,
},
})
},
_a["$ROOT_QUERY.nestedObj({\"arg\":\"val\"})"] = result.nestedObj,
_a));
});
it('properly normalizes a nested array with IDs', function () {
var _a;
var query = graphql_tag_1.default(templateObject_10 || (templateObject_10 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n id\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n id\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedArray: [
{
id: 'abcde',
stringField: 'This is a string too!',
numberField: 6,
nullField: null,
},
{
id: 'abcdef',
stringField: 'This is a string also!',
numberField: 7,
nullField: null,
},
],
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
})
.toObject()).toEqual((_a = {
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedArray')), {
nestedArray: result.nestedArray.map(function (obj) { return ({
type: 'id',
id: obj.id,
generated: false,
}); }),
})
},
_a[result.nestedArray[0].id] = result.nestedArray[0],
_a[result.nestedArray[1].id] = result.nestedArray[1],
_a));
});
it('properly normalizes a nested array with IDs and a null', function () {
var _a;
var query = graphql_tag_1.default(templateObject_11 || (templateObject_11 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n id\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n id\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedArray: [
{
id: 'abcde',
stringField: 'This is a string too!',
numberField: 6,
nullField: null,
},
null,
],
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
})
.toObject()).toEqual((_a = {
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedArray')), {
nestedArray: [
{ type: 'id', id: result.nestedArray[0].id, generated: false },
null,
],
})
},
_a[result.nestedArray[0].id] = result.nestedArray[0],
_a));
});
it('properly normalizes a nested array without IDs', function () {
var _a;
var query = graphql_tag_1.default(templateObject_12 || (templateObject_12 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedArray: [
{
stringField: 'This is a string too!',
numberField: 6,
nullField: null,
},
{
stringField: 'This is a string also!',
numberField: 7,
nullField: null,
},
],
};
var normalized = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
});
expect(normalized.toObject()).toEqual((_a = {
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedArray')), {
nestedArray: [
{ type: 'id', generated: true, id: "ROOT_QUERY.nestedArray.0" },
{ type: 'id', generated: true, id: "ROOT_QUERY.nestedArray.1" },
],
})
},
_a["ROOT_QUERY.nestedArray.0"] = result.nestedArray[0],
_a["ROOT_QUERY.nestedArray.1"] = result.nestedArray[1],
_a));
});
it('properly normalizes a nested array without IDs and a null item', function () {
var _a;
var query = graphql_tag_1.default(templateObject_13 || (templateObject_13 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedArray {\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedArray: [
null,
{
stringField: 'This is a string also!',
numberField: 7,
nullField: null,
},
],
};
var normalized = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
});
expect(normalized.toObject()).toEqual((_a = {
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedArray')), {
nestedArray: [
null,
{ type: 'id', generated: true, id: "ROOT_QUERY.nestedArray.1" },
],
})
},
_a["ROOT_QUERY.nestedArray.1"] = result.nestedArray[1],
_a));
});
it('properly normalizes an array of non-objects', function () {
var query = graphql_tag_1.default(templateObject_14 || (templateObject_14 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n simpleArray\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n simpleArray\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
simpleArray: ['one', 'two', 'three'],
};
var normalized = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'simpleArray')), {
simpleArray: {
type: 'json',
json: [
result.simpleArray[0],
result.simpleArray[1],
result.simpleArray[2],
],
},
}),
});
});
it('properly normalizes an array of non-objects with null', function () {
var query = graphql_tag_1.default(templateObject_15 || (templateObject_15 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n simpleArray\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n simpleArray\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
simpleArray: [null, 'two', 'three'],
};
var normalized = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'simpleArray')), {
simpleArray: {
type: 'json',
json: [
result.simpleArray[0],
result.simpleArray[1],
result.simpleArray[2],
],
},
}),
});
});
it('properly normalizes an object occurring in different graphql paths twice', function () {
var query = graphql_tag_1.default(templateObject_16 || (templateObject_16 = tslib_1.__makeTemplateObject(["\n {\n id\n object1 {\n id\n stringField\n }\n object2 {\n id\n numberField\n }\n }\n "], ["\n {\n id\n object1 {\n id\n stringField\n }\n object2 {\n id\n numberField\n }\n }\n "])));
var result = {
id: 'a',
object1: {
id: 'aa',
stringField: 'string',
},
object2: {
id: 'aa',
numberField: 1,
},
};
var normalized = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'a',
object1: {
type: 'id',
id: 'aa',
generated: false,
},
object2: {
type: 'id',
id: 'aa',
generated: false,
},
},
aa: {
id: 'aa',
stringField: 'string',
numberField: 1,
},
});
});
it('properly normalizes an object occurring in different graphql array paths twice', function () {
var query = graphql_tag_1.default(templateObject_17 || (templateObject_17 = tslib_1.__makeTemplateObject(["\n {\n id\n array1 {\n id\n stringField\n obj {\n id\n stringField\n }\n }\n array2 {\n id\n stringField\n obj {\n id\n numberField\n }\n }\n }\n "], ["\n {\n id\n array1 {\n id\n stringField\n obj {\n id\n stringField\n }\n }\n array2 {\n id\n stringField\n obj {\n id\n numberField\n }\n }\n }\n "])));
var result = {
id: 'a',
array1: [
{
id: 'aa',
stringField: 'string',
obj: {
id: 'aaa',
stringField: 'string',
},
},
],
array2: [
{
id: 'ab',
stringField: 'string2',
obj: {
id: 'aaa',
numberField: 1,
},
},
],
};
var normalized = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'a',
array1: [
{
type: 'id',
id: 'aa',
generated: false,
},
],
array2: [
{
type: 'id',
id: 'ab',
generated: false,
},
],
},
aa: {
id: 'aa',
stringField: 'string',
obj: {
type: 'id',
id: 'aaa',
generated: false,
},
},
ab: {
id: 'ab',
stringField: 'string2',
obj: {
type: 'id',
id: 'aaa',
generated: false,
},
},
aaa: {
id: 'aaa',
stringField: 'string',
numberField: 1,
},
});
});
it('properly normalizes an object occurring in the same graphql array path twice', function () {
var query = graphql_tag_1.default(templateObject_18 || (templateObject_18 = tslib_1.__makeTemplateObject(["\n {\n id\n array1 {\n id\n stringField\n obj {\n id\n stringField\n numberField\n }\n }\n }\n "], ["\n {\n id\n array1 {\n id\n stringField\n obj {\n id\n stringField\n numberField\n }\n }\n }\n "])));
var result = {
id: 'a',
array1: [
{
id: 'aa',
stringField: 'string',
obj: {
id: 'aaa',
stringField: 'string',
numberField: 1,
},
},
{
id: 'ab',
stringField: 'string2',
obj: {
id: 'aaa',
stringField: 'should not be written',
numberField: 2,
},
},
],
};
var normalized = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
});
expect(normalized.toObject()).toEqual({
ROOT_QUERY: {
id: 'a',
array1: [
{
type: 'id',
id: 'aa',
generated: false,
},
{
type: 'id',
id: 'ab',
generated: false,
},
],
},
aa: {
id: 'aa',
stringField: 'string',
obj: {
type: 'id',
id: 'aaa',
generated: false,
},
},
ab: {
id: 'ab',
stringField: 'string2',
obj: {
type: 'id',
id: 'aaa',
generated: false,
},
},
aaa: {
id: 'aaa',
stringField: 'string',
numberField: 1,
},
});
});
it('merges nodes', function () {
var query = graphql_tag_1.default(templateObject_19 || (templateObject_19 = tslib_1.__makeTemplateObject(["\n {\n id\n numberField\n nullField\n }\n "], ["\n {\n id\n numberField\n nullField\n }\n "])));
var result = {
id: 'abcd',
numberField: 5,
nullField: null,
};
var store = writer.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
dataIdFromObject: getIdField,
});
var query2 = graphql_tag_1.default(templateObject_20 || (templateObject_20 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n nullField\n }\n "], ["\n {\n id\n stringField\n nullField\n }\n "])));
var result2 = {
id: 'abcd',
stringField: 'This is a string!',
nullField: null,
};
var store2 = writer.writeQueryToStore({
store: store,
query: query2,
result: result2,
dataIdFromObject: getIdField,
});
expect(store2.toObject()).toEqual({
ROOT_QUERY: lodash_1.assign({}, result, result2),
});
});
it('properly normalizes a nested object that returns null', function () {
var query = graphql_tag_1.default(templateObject_21 || (templateObject_21 = tslib_1.__makeTemplateObject(["\n {\n id\n stringField\n numberField\n nullField\n nestedObj {\n id\n stringField\n numberField\n nullField\n }\n }\n "], ["\n {\n id\n stringField\n numberField\n nullField\n nestedObj {\n id\n stringField\n numberField\n nullField\n }\n }\n "])));
var result = {
id: 'abcd',
stringField: 'This is a string!',
numberField: 5,
nullField: null,
nestedObj: null,
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
})
.toObject()).toEqual({
ROOT_QUERY: lodash_1.assign({}, lodash_1.assign({}, lodash_1.omit(result, 'nestedObj')), {
nestedObj: null,
}),
});
});
it('properly normalizes an object with an ID when no extension is passed', function () {
var query = graphql_tag_1.default(templateObject_22 || (templateObject_22 = tslib_1.__makeTemplateObject(["\n {\n people_one(id: \"5\") {\n id\n stringField\n }\n }\n "], ["\n {\n people_one(id: \"5\") {\n id\n stringField\n }\n }\n "])));
var result = {
people_one: {
id: 'abcd',
stringField: 'This is a string!',
},
};
expect(writer
.writeQueryToStore({
query: query,
result: lodash_1.cloneDeep(result),
})
.toObject()).toEqual({
ROOT_QUERY: {
'people_one({"id":"5"})': {
type: 'id',
id: '$ROOT_QUERY.people_one({"id":"5"})',
generated: true,
},
},
'$ROOT_QUERY.people_one({"id":"5"})': {
id: 'abcd',
stringField: 'This is a string!',
},
});
});
it('consistently serialize different types of input when passed inlined or as variable', function () {
var testData = [
{
mutation: graphql_tag_1.default(templateObject_23 || (templateObject_23 = tslib_1.__makeTemplateObject(["\n mutation mut($in: Int!) {\n mut(inline: 5, variable: $in) {\n id\n }\n }\n "], ["\n mutation mut($in: Int!) {\n mut(inline: 5, variable: $in) {\n id\n }\n }\n "]))),
variables: { in: 5 },
expected: 'mut({"inline":5,"variable":5})',
},
{
mutation: graphql_tag_1.default(templateObject_24 || (templateObject_24 = tslib_1.__makeTemplateObject(["\n mutation mut($in: Float!) {\n mut(inline: 5.5, variable: $in) {\n id\n }\n }\n "], ["\n mutation mut($in: Float!) {\n mut(inline: 5.5, variable: $in) {\n id\n }\n }\n "]))),
variables: { in: 5.5 },
expected: 'mut({"inline":5.5,"variable":5.5})',
},
{
mutation: graphql_tag_1.default(templateObject_25 || (templateObject_25 = tslib_1.__makeTemplateObject(["\n mutation mut($in: String!) {\n mut(inline: \"abc\", variable: $in) {\n id\n }\n }\n "], ["\n mutation mut($in: String!) {\n mut(inline: \"abc\", variable: $in) {\n id\n }\n }\n "]))),
variables: { in: 'abc' },
expected: 'mut({"inline":"abc","variable":"abc"})',
},
{
mutation: graphql_tag_1.default(templateObject_26 || (templateObject_26 = tslib_1.__makeTemplateObject(["\n mutation mut($in: Array!) {\n mut(inline: [1, 2], variable: $in) {\n id\n }\n }\n "], ["\n mutation mut($in: Array!) {\n mut(inline: [1, 2], variable: $in) {\n id\n }\n }\n "]))),
variables: { in: [1, 2] },
expected: 'mut({"inline":[1,2],"variable":[1,2]})',
},
{
mutation: graphql_tag_1.default(templateObject_27 || (templateObject_27 = tslib_1.__makeTemplateObject(["\n mutation mut($in: Object!) {\n mut(inline: { a: 1 }, variable: $in) {\n id\n }\n }\n "], ["\n mutation mut($in: Object!) {\n mut(inline: { a: 1 }, variable: $in) {\n id\n }\n }\n "]))),
variables: { in: { a: 1 } },
expected: 'mut({"inline":{"a":1},"variable":{"a":1}})',
},
{
mutation: graphql_tag_1.default(templateObject_28 || (templateObject_28 = tslib_1.__makeTemplateObject(["\n mutation mut($in: Boolean!) {\n mut(inline: true, variable: $in) {\n id\n }\n }\n "], ["\n mutation mut($in: Boolean!) {\n mut(inline: true, variable: $in) {\n id\n }\n }\n "]))),
variables: { in: true },
expected: 'mut({"inline":true,"variable":true})',
},
];
function isOperationDefinition(definition) {
return definition.kind === 'OperationDefinition';
}
function isField(selection) {
return selection.kind === 'Field';
}
testData.forEach(function (data) {
data.mutation.definitions.forEach(function (definition) {
if (isOperationDefinition(definition)) {
definition.selectionSet.selections.forEach(function (selection) {
if (isField(selection)) {
expect(apollo_utilities_1.storeKeyNameFromField(selection, data.variables)).toEqual(data.expected);
}
});
}
});
});
});
it('properly normalizes a mutation with object or array parameters and variables', function () {
var mutation = graphql_tag_1.default(templateObject_29 || (templateObject_29 = tslib_1.__makeTemplateObject(["\n mutation some_mutation($nil: ID, $in: Object) {\n some_mutation(\n input: {\n id: \"5\"\n arr: [1, { a: \"b\" }]\n obj: { a: \"b\" }\n num: 5.5\n nil: $nil\n bo: true\n }\n ) {\n id\n }\n some_mutation_with_variables(input: $in) {\n id\n }\n }\n "], ["\n mutation some_mutation($nil: ID, $in: Object) {\n some_mutation(\n input: {\n id: \"5\"\n arr: [1, { a: \"b\" }]\n obj: { a: \"b\" }\n num: 5.5\n nil: $nil\n bo: true\n }\n ) {\n id\n }\n some_mutation_with_variables(input: $in) {\n id\n }\n }\n "])));
var result = {
some_mutation: {
id: 'id',
},
some_mutation_with_variables: {
id: 'id',
},
};
var variables = {
nil: null,
in: {
id: '5',
arr: [1, { a: 'b' }],
obj: { a: 'b' },
num: 5.5,
nil: null,
bo: true,
},
};
function isOperationDefinition(value) {
return value.kind === 'OperationDefinition';
}
mutation.definitions.map(function (def) {
if (isOperationDefinition(def)) {
expect(writer
.writeSelectionSetToStore({
dataId: '5',
selectionSet: def.selectionSet,
result: lodash_1.cloneDeep(result),
context: {
store: objectCache_1.defaultNormalizedCacheFactory(),
variables: variables,
dataIdFromObject: function () { return '5'; },
},
})
.toObject()).toEqual({
'5': {
id: 'id',
'some_mutation({"input":{"arr":[1,{"a":"b"}],"bo":true,"id":"5","nil":null,"num":5.5,"obj":{"a":"b"}}})': {
generated: false,
id: '5',
type: 'id',
},
'some_mutation_with_variables({"input":{"arr":[1,{"a":"b"}],"bo":true,"id":"5","nil":null,"num":5.5,"obj":{"a":"b"}}})': {
generated: false,
id: '5',
type: 'id',
},
},
});
}
else {
throw 'No operation definition found';
}
});
});
it('should write to store if `dataIdFromObject` returns an ID of 0', function () {
var query = graphql_tag_1.default(templateObject_30 || (templateObject_30 = tslib_1.__makeTemplateObject(["\n query {\n author {\n firstName\n id\n __typename\n }\n }\n "], ["\n query {\n author {\n firstName\n id\n __typename\n }\n }\n "])));
var data = {
author: {
id: 0,
__typename: 'Author',
firstName: 'John',
},
};
var expStore = objectCache_1.defaultNormalizedCacheFactory({
ROOT_QUERY: {
author: {
id: 0,
typename: 'Author',
type: 'id',
generated: false,
},
},
0: {
id: data.author.id,
__typename: data.author.__typename,
firstName: data.author.firstName,
},
});
expect(writer
.writeQueryToStore({
result: data,
query: query,
dataIdFromObject: function () { return 0; },
})
.toObject()).toEqual(expStore.toObject());
});
describe('type escaping', function () {
var dataIdFromObject = function (object) {
if (object.__typename && object.id) {
return object.__typename + '__' + object.id;
}
return undefined;
};
it('should correctly escape generated ids', function () {
var query = graphql_tag_1.default(templateObject_31 || (templateObject_31 = tslib_1.__makeTemplateObject(["\n query {\n author {\n firstName\n lastName\n }\n }\n "], ["\n query {\n author {\n firstName\n lastName\n }\n }\n "])));
var data = {
author: {
firstName: 'John',
lastName: 'Smith',
},
};
var expStore = objectCache_1.defaultNormalizedCacheFactory({
ROOT_QUERY: {
author: {
type: 'id',
id: '$ROOT_QUERY.author',
generated: true,
},
},
'$ROOT_QUERY.author': data.author,
});
expect(writer
.writeQueryToStore({
result: data,
query: query,
})
.toObject()).toEqual(expStore.toObject());
});
it('should correctly escape real ids', function () {
var _a;
var query = graphql_tag_1.default(templateObject_32 || (templateObject_32 = tslib_1.__makeTemplateObject(["\n query {\n author {\n firstName\n id\n __typename\n }\n }\n "], ["\n query {\n author {\n firstName\n id\n __typename\n }\n }\n "])));
var data = {
author: {
firstName: 'John',
id: '129',
__typename: 'Author',
},
};
var expStore = objectCache_1.defaultNormalizedCacheFactory((_a = {
ROOT_QUERY: {
author: {
type: 'id',
id: dataIdFromObject(data.author),
generated: false,
typename: 'Author',
},
}
},
_a[dataIdFromObject(data.author)] = {
firstName: data.author.firstName,
id: data.author.id,
__typename: data.author.__typename,
},
_a));
expect(writer
.writeQueryToStore({
result: data,
query: query,
dataIdFromObject: dataIdFromObject,
})
.toObject()).toEqual(expStore.toObject());
});
it('should correctly escape json blobs', function () {
var _a;
var query = graphql_tag_1.default(templateObject_33 || (templateObject_33 = tslib_1.__makeTemplateObject(["\n query {\n author {\n info\n id\n __typename\n }\n }\n "], ["\n query {\n author {\n info\n id\n __typename\n }\n }\n "])));
var data = {
author: {
info: {
name: 'John',
},
id: '129',
__typename: 'Author',
},
};
var expStore = objectCache_1.defaultNormalizedCacheFactory((_a = {
ROOT_QUERY: {
author: {
type: 'id',
id: dataIdFromObject(data.author),
generated: false,
typename: 'Author',
},
}
},
_a[dataIdFromObject(data.author)] = {
__typename: data.author.__typename,
id: data.author.id,
info: {
type: 'json',
json: data.author.info,
},
},
_a));
expect(writer
.writeQueryToStore({
result: data,
query: query,
dataIdFromObject: dataIdFromObject,
})
.toObject()).toEqual(expStore.toObject());
});
});
it('should merge objects when overwriting a generated id with a real id', function () {
var dataWithoutId = {
author: {
firstName: 'John',
lastName: 'Smith',
__typename: 'Author',
},
};
var dataWithId = {
author: {
firstName: 'John',
id: '129',
__typename: 'Author',
},
};
var dataIdFromObject = function (object) {
if (object.__typename && object.id) {
return object.__typename + '__' + object.id;
}
return undefined;
};
var queryWithoutId = graphql_tag_1.default(templateObject_34 || (templateObject_34 = tslib_1.__makeTemplateObject(["\n query {\n author {\n firstName\n lastName\n __typename\n }\n }\n "], ["\n query {\n author {\n firstName\n lastName\n __typename\n }\n }\n "])));
var queryWithId = graphql_tag_1.default(templateObject_35 || (templateObject_35 = tslib_1.__makeTemplateObject(["\n query {\n author {\n firstName\n id\n __typename\n }\n }\n "], ["\n query {\n author {\n firstName\n id\n __typename\n }\n }\n "])));
var expStoreWithoutId = objectCache_1.defaultNormalizedCacheFactory({
'$ROOT_QUERY.author': {
firstName: 'John',
lastName: 'Smith',
__typename: 'Author',
},
ROOT_QUERY: {
author: {
type: 'id',
id: '$ROOT_QUERY.author',
generated: true,
typename: 'Author',
},
},
});
var expStoreWithId = objectCache_1.defaultNormalizedCacheFactory({
Author__129: {
firstName: 'John',
lastName: 'Smith',
id: '129',
__typename: 'Author',
},
ROOT_QUERY: {
author: {
type: 'id',
id: 'Author__129',
generated: false,
typename: 'Author',
},
},
});
var storeWithoutId = writer.writeQueryToStore({
result: dataWithoutId,
query: queryWithoutId,
dataIdFromObject: dataIdFromObject,
});
expect(storeWithoutId.toObject()).toEqual(expStoreWithoutId.toObject());
var storeWithId = writer.writeQueryToStore({
result: dataWithId,
query: queryWithId,
store: storeWithoutId,
dataIdFromObject: dataIdFromObject,
});
expect(storeWithId.toObject()).toEqual(expStoreWithId.toObject());
});
it('should allow a union of objects of a different type, when overwriting a generated id with a real id', function () {
var dataWithPlaceholder = {
author: {
hello: 'Foo',
__typename: 'Placeholder',
},
};
var dataWithAuthor = {
author: {
firstName: 'John',
lastName: 'Smith',
id: '129',
__typename: 'Author',
},
};
var dataIdFromObject = function (object) {
if (object.__typename && object.id) {
return object.__typename + '__' + object.id;
}
return undefined;
};
var query = graphql_tag_1.default(templateObject_36 || (templateObject_36 = tslib_1.__makeTemplateObject(["\n query {\n author {\n ... on Author {\n firstName\n lastName\n id\n __typename\n }\n