tyranid-graphql
Advanced tools
Comparing version 0.0.6 to 0.0.7
@@ -9,5 +9,2 @@ import { Tyr } from 'tyranid'; | ||
export declare function graphqlize(tyr: typeof Tyr): void; | ||
/** | ||
* tyranid schema -> graphql schema | ||
*/ | ||
export declare function createGraphQLSchema(tyr: typeof Tyr): GraphQLSchema; | ||
@@ -24,3 +21,3 @@ /** | ||
*/ | ||
export declare function createProjection(info: GraphQLResolveInfo): any; | ||
export declare function createProjection(col: Tyr.CollectionInstance, info: GraphQLResolveInfo): any; | ||
/** | ||
@@ -35,3 +32,4 @@ * map properties of collections to argumements | ||
/** | ||
* Create lazy value to contain fields for a particular tyranid field definition object | ||
* Create lazy value to contain fields for a | ||
* particular tyranid field definition object | ||
*/ | ||
@@ -44,2 +42,2 @@ export declare function createFieldThunk(fields: { | ||
*/ | ||
export declare function createGraphQLFieldConfig(field: Tyr.TyranidFieldDefinition, map: GraphQLOutputTypeMap, fieldName: string, path: string, single: boolean): GraphQLFieldConfig | undefined; | ||
export declare function createGraphQLFieldConfig(field: Tyr.TyranidFieldDefinition | string, map: GraphQLOutputTypeMap, fieldName: string, path: string, single: boolean): GraphQLFieldConfig | undefined; |
@@ -5,2 +5,8 @@ "use strict"; | ||
const graphql_1 = require('graphql'); | ||
function warn(message) { | ||
console.warn(`tyranid-graphql: WARNING -- ${message}`); | ||
} | ||
function error(message) { | ||
throw new Error(`tyranid-graphql: ERROR -- ${message}`); | ||
} | ||
/** | ||
@@ -21,11 +27,2 @@ * adds a `graphql(query)` method to tyranid which returns | ||
exports.graphqlize = graphqlize; | ||
function warn(message) { | ||
console.warn(`tyranid-graphql: WARNING -- ${message}`); | ||
} | ||
function error(message) { | ||
throw new Error(`tyranid-graphql: ERROR -- ${message}`); | ||
} | ||
/** | ||
* tyranid schema -> graphql schema | ||
*/ | ||
function createGraphQLSchema(tyr) { | ||
@@ -43,3 +40,5 @@ const typeMap = new Map(); | ||
queryFields[name] = collectionFieldConfig(col, typeMap, true); | ||
queryFields[name + 's'] = collectionFieldConfig(col, typeMap, false); | ||
// TODO: less hacky... | ||
const suffix = name[name.length - 1] === 's' ? 'es' : 's'; | ||
queryFields[name + suffix] = collectionFieldConfig(col, typeMap, false); | ||
}); | ||
@@ -64,2 +63,3 @@ return new graphql_1.GraphQLSchema({ | ||
const fields = col.def.fields; | ||
const isEnum = col.def.enum; | ||
if (!fields) { | ||
@@ -84,2 +84,12 @@ return error(`Collection "${col.def.name}" has no fields property.`); | ||
const query = argParser(parent, args); | ||
if (isEnum) { | ||
if (!(args && args['_id'])) { | ||
console.log(col.def.values); | ||
const ids = (col.def.values || []).map((row) => row['_id']); | ||
args = { _id: ids }; | ||
} | ||
return single | ||
? col.byId(args['_id'][0]) | ||
: col.byIds(args['_id']); | ||
} | ||
// default to full projection | ||
@@ -92,3 +102,3 @@ let project; | ||
if (operation) { | ||
project = createProjection(operation); | ||
project = createProjection(col, operation); | ||
} | ||
@@ -110,24 +120,33 @@ return queryFunction({ | ||
*/ | ||
function createProjection(info) { | ||
// TODO: PR graphql typings to add path prop | ||
const path = info.path; | ||
let selections = info.operation.selectionSet.selections; | ||
for (const fieldName of path) { | ||
for (const selection of selections) { | ||
const field = selection; | ||
if (fieldName === field.name.value) { | ||
if (field.selectionSet) { | ||
selections = field.selectionSet.selections; | ||
continue; | ||
} | ||
function createProjection(col, info) { | ||
const projection = { _id: 1 }; | ||
const ast = info.fieldASTs[0]; | ||
const collectionFields = col && col.def && col.def.fields; | ||
const selections = ast.selectionSet && ast.selectionSet.selections.slice(); | ||
if (!collectionFields || !selections || !selections.length) | ||
return; | ||
let selection; | ||
while (selection = selections.shift()) { | ||
switch (selection.kind) { | ||
case 'Field': { | ||
const graphQlField = selection; | ||
const graphQLFieldName = graphQlField.name.value; | ||
const tyrField = collectionFields[graphQLFieldName]; | ||
// computed property found, no projection | ||
if (tyrField.def && tyrField.def.get) | ||
return; | ||
projection[graphQLFieldName] = 1; | ||
break; | ||
} | ||
/** | ||
* For fragments, add selection set to array and continue | ||
*/ | ||
case 'FragmentSpread': { | ||
const fragmentSpread = selection; | ||
const fragment = info.fragments[fragmentSpread.name.value]; | ||
selections.push(...fragment.selectionSet.selections); | ||
break; | ||
} | ||
} | ||
} | ||
if (!selections || !selections.length) | ||
return; | ||
const projection = { _id: 1 }; | ||
for (const selection of selections) { | ||
const field = selection; | ||
projection[field.name.value] = 1; | ||
} | ||
return projection; | ||
@@ -191,3 +210,4 @@ } | ||
/** | ||
* Create lazy value to contain fields for a particular tyranid field definition object | ||
* Create lazy value to contain fields for a | ||
* particular tyranid field definition object | ||
*/ | ||
@@ -219,8 +239,6 @@ function createFieldThunk(fields, map, path = '') { | ||
if (typeof field === 'string') { | ||
warn(`Ignoring field: "${field}" at path "${path}" as it is a string`); | ||
return; | ||
return createGraphQLFieldConfig({ is: field }, map, fieldName, path, single); | ||
} | ||
// TODO: determine why this is necessary | ||
if ('def' in field) { | ||
// grab def property on field and recast | ||
field = field.def; | ||
@@ -241,3 +259,3 @@ } | ||
args: createArguments(colFields, map), | ||
resolve(parent, args, context, ast) { | ||
resolve(parent, args, context, info) { | ||
const linkField = parent[fieldName]; | ||
@@ -257,3 +275,4 @@ args = args || {}; | ||
const argIdSet = new Set(argIds); | ||
linkArgs['_id'] = linkIds.filter((id) => argIdSet.has(id.toString())); | ||
linkArgs['_id'] = linkIds | ||
.filter((id) => argIdSet.has(id.toString())); | ||
} | ||
@@ -263,3 +282,3 @@ else { | ||
} | ||
return linkType.resolve(parent, linkArgs, context, ast); | ||
return linkType.resolve(parent, linkArgs, context, info); | ||
} | ||
@@ -328,3 +347,3 @@ }; | ||
if (!defFields) { | ||
warn(`Ignoring object field at path "${path}" as it has poorly defined schema`); | ||
warn(`Ignoring object field at path "${path}" as it has no schema`); | ||
return; | ||
@@ -340,6 +359,6 @@ } | ||
} | ||
default: return error(`Unable to map type "${field.is}" for field at path "${path}" to GraphQLType instance`); | ||
default: return error(`Unable to map type "${field.is}" for field at path "${path}"`); | ||
} | ||
} | ||
exports.createGraphQLFieldConfig = createGraphQLFieldConfig; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBCQUFvQixTQUFTLENBQUMsQ0FBQTtBQUM5QiwwQkFBeUIsU0FBUyxDQUFDLENBQUE7QUFDbkMsMEJBa0JPLFNBQVMsQ0FBQyxDQUFBO0FBS2pCOzs7R0FHRztBQUNILG9CQUEyQixHQUFlO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLEdBQUcsQ0FBQyxPQUFPLEdBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQ3RELFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEdBQUcsTUFBTSxFQUFrQztRQUNqRixNQUFNLE9BQU8sR0FBRztZQUNkLElBQUk7WUFDSixJQUFJO1NBQ0wsQ0FBQztRQUVGLE1BQU0sQ0FBQyxpQkFBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDLEVBQ0QsRUFBRSxNQUFNLEVBQUUsQ0FDWCxDQUFDO0FBQ0osQ0FBQztBQWRlLGtCQUFVLGFBY3pCLENBQUE7QUFHRCxjQUFjLE9BQWU7SUFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsT0FBTyxFQUFFLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsZUFBZSxPQUFlO0lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUdEOztHQUVHO0FBQ0gsNkJBQW9DLEdBQWU7SUFDakQsTUFBTSxPQUFPLEdBQXlCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDaEQsTUFBTSxXQUFXLEdBQTBCLEVBQUUsQ0FBQztJQUU5QyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxHQUFHO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQzFCLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsSUFBSSxrQkFBa0IsQ0FBQyxDQUFDO1FBRXpFLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7UUFFckUsTUFBTSxjQUFjLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRS9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRWxDLG9EQUFvRDtRQUNwRCxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcscUJBQXFCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM5RCxXQUFXLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLENBQUMsSUFBSSx1QkFBYSxDQUFDO1FBQ3ZCLEtBQUssRUFBRSxJQUFJLDJCQUFpQixDQUFDO1lBQzNCLElBQUksRUFBRSxPQUFPO1lBQ2IsTUFBTSxFQUFFLFdBQVc7U0FDcEIsQ0FBQztLQUNILENBQUMsQ0FBQztBQUNMLENBQUM7QUF6QmUsMkJBQW1CLHNCQXlCbEMsQ0FBQTtBQUdEOzs7R0FHRztBQUNILCtCQUNFLEdBQTJCLEVBQzNCLEdBQXlCLEVBQ3pCLE1BQU0sR0FBRyxJQUFJO0lBRWIsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRTdDLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLGtDQUFrQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBRTlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNaLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksMkJBQTJCLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztJQUUxQyxNQUFNLGFBQWEsR0FDakIsTUFBTTtVQUNGLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztVQUNyQixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU1QixNQUFNLElBQUksR0FBRyxNQUFNO1VBQ2YsY0FBYztVQUNkLElBQUkscUJBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVwQyxNQUFNLFNBQVMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUvQyxNQUFNLENBQUM7UUFDTCxJQUFJO1FBQ0osSUFBSTtRQUNKLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTO1lBQ3RDOztlQUVHO1lBQ0gsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUV0Qyw2QkFBNkI7WUFDN0IsSUFBSSxPQUFZLENBQUM7WUFFakI7OztlQUdHO1lBQ0gsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDZCxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEMsQ0FBQztZQUVELE1BQU0sQ0FBQyxhQUFhLENBQUM7Z0JBQ25CLEtBQUs7Z0JBQ0wsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsSUFBSSxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSTtnQkFDN0IsSUFBSSxFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSTthQUM5QixDQUFDLENBQUM7UUFDTCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUExRGUsNkJBQXFCLHdCQTBEcEMsQ0FBQTtBQUdEOzs7O0dBSUc7QUFDSCwwQkFBaUMsSUFBd0I7SUFDdkQsNENBQTRDO0lBQzVDLE1BQU0sSUFBSSxHQUFJLElBQVksQ0FBQyxJQUFnQixDQUFDO0lBRTVDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztJQUN4RCxHQUFHLENBQUMsQ0FBQyxNQUFNLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdCLEdBQUcsQ0FBQyxDQUFDLE1BQU0sU0FBUyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsU0FBa0IsQ0FBQztZQUNqQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztvQkFDdkIsVUFBVSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUMzQyxRQUFRLENBQUM7Z0JBQ1gsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUFDLE1BQU0sQ0FBQztJQUU5QyxNQUFNLFVBQVUsR0FBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQztJQUVuQyxHQUFHLENBQUMsQ0FBQyxNQUFNLFNBQVMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sS0FBSyxHQUFHLFNBQWtCLENBQUM7UUFDakMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUEzQmUsd0JBQWdCLG1CQTJCL0IsQ0FBQTtBQUdEOztHQUVHO0FBQ0gseUJBQ0UsTUFBK0IsRUFDL0IsR0FBeUI7SUFFekIsTUFBTSxNQUFNLEdBQWtDLEVBQUUsQ0FBQztJQUVqRCxHQUFHLENBQUMsQ0FBQyxNQUFNLFNBQVMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQy9CLDBDQUEwQztRQUMxQyxNQUFNLEtBQUssR0FBaUMsTUFBTSxDQUFDLFNBQVMsQ0FBUyxDQUFDLEdBQUcsQ0FBQztRQUUxRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sU0FBUyxHQUFHLHdCQUF3QixDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1RSxFQUFFLENBQUMsQ0FBQyxTQUFTLElBQUksb0JBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUc7b0JBQ2xCLElBQUksRUFBRSxJQUFJLHFCQUFXLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztpQkFDdEMsQ0FBQztZQUNKLENBQUM7WUFBQSxDQUFDO1FBQ0osQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RFLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRztnQkFDbEIsSUFBSSxFQUFFLElBQUkscUJBQVcsQ0FBQyxtQkFBUyxDQUFDO2FBQ2pDLENBQUM7UUFDSixDQUFDO0lBRUgsQ0FBQztJQUNELE1BQU0sQ0FBQyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQTNCZSx1QkFBZSxrQkEyQjlCLENBQUE7QUFHRDs7R0FFRztBQUNILDhCQUNFLE1BQStCO0lBRS9CLE1BQU0sQ0FBQyxVQUFVLE1BQVcsRUFBRSxJQUFTO1FBQ3JDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUVyQixNQUFNLEtBQUssR0FBUSxFQUFFLENBQUM7UUFDdEIsR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUN4QiwrQkFBK0I7WUFDL0IsTUFBTSxLQUFLLEdBQWlDLE1BQU0sQ0FBQyxJQUFJLENBQVMsQ0FBQyxHQUFHLENBQUM7WUFDckUsRUFBRSxDQUFDLENBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ1gsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQztnQkFDeEIsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUc7b0JBQ1osR0FBRyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBTyxLQUFLLElBQUksa0JBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDOUQsQ0FBQztZQUNKLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUc7b0JBQ1osR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQ2hCLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDO0FBekJlLDRCQUFvQix1QkF5Qm5DLENBQUE7QUFHRDs7R0FFRztBQUNILDBCQUNFLE1BQXFELEVBQ3JELEdBQXlCLEVBQ3pCLElBQUksR0FBRyxFQUFFO0lBRVQsTUFBTSxDQUFDO1FBQ0wsTUFBTSxTQUFTLEdBQTBCLEVBQUUsQ0FBQztRQUU1QyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUVsRSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsR0FBRyxDQUFDLENBQUMsTUFBTSxTQUFTLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQztZQUMvQixTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ2pCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxNQUFNLFdBQVcsR0FBRyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksR0FBRyxTQUFTLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxDQUFDO1lBQ3JDLENBQUM7UUFDSCxDQUFDO1FBRUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSx3Q0FBd0MsQ0FBQyxDQUFDO1FBRXBGLE1BQU0sQ0FBQyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXhCZSx3QkFBZ0IsbUJBd0IvQixDQUFBO0FBR0Q7O0dBRUc7QUFDSCxrQ0FDRSxLQUFpQyxFQUNqQyxHQUF5QixFQUN6QixTQUFpQixFQUNqQixJQUFZLEVBQ1osTUFBZTtJQUdmLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDOUIsSUFBSSxDQUFDLG9CQUFvQixLQUFLLGNBQWMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sQ0FBQztJQUNULENBQUM7SUFFRCx3Q0FBd0M7SUFDeEMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkIsd0NBQXdDO1FBQ3hDLEtBQUssR0FBSyxLQUFhLENBQUMsR0FBa0MsQ0FBQztJQUM3RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLElBQUksR0FBRyxDQUFDLElBQXVCLEtBQ25DLE1BQU0sR0FBRyxJQUFJLEdBQUcsSUFBSSxxQkFBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBR3hDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2YsTUFBTSxHQUFHLEdBQUcsYUFBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcscUJBQXFCLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztRQUVqQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0NBQWtDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUvRSxNQUFNLENBQUM7WUFDTCxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUk7WUFDbkIsSUFBSSxFQUFFLGVBQWUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHO2dCQUNoQyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUVsQixFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztvQkFBQyxNQUFNLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBRTFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7b0JBQ3RCLE1BQU0sQ0FBQyxLQUFLLENBQUMsc0RBQXNELEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNuRixDQUFDO2dCQUVELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sUUFBUSxHQUFRLEVBQUUsQ0FBQztnQkFFekIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsTUFBTSxNQUFNLEdBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzswQkFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQzswQkFDWCxDQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBRSxDQUFDLENBQUM7b0JBRXJCLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUVqQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQU8sS0FBSyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdFLENBQUM7Z0JBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ04sUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztnQkFDNUIsQ0FBQztnQkFFRCxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUMxRCxDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2QsTUFBTSxDQUFDLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFakIsS0FBSyxRQUFRLENBQUM7UUFDZCxLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxPQUFPLENBQUM7UUFDYixLQUFLLFVBQVUsQ0FBQztRQUNoQixLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssS0FBSztZQUNSLE1BQU0sQ0FBQztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLHVCQUFhLENBQUM7YUFDMUIsQ0FBQztRQUVKLEtBQUssU0FBUztZQUNaLE1BQU0sQ0FBQztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLHdCQUFjLENBQUM7YUFDM0IsQ0FBQztRQUVKLEtBQUssUUFBUTtZQUNYLE1BQU0sQ0FBQztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLHNCQUFZLENBQUM7YUFDekIsQ0FBQztRQUVKLEtBQUssU0FBUztZQUNaLE1BQU0sQ0FBQztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLG9CQUFVLENBQUM7YUFDdkIsQ0FBQztRQUVKLEtBQUssU0FBUztZQUNaLE1BQU0sQ0FBQztnQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFTLENBQUM7YUFDdEIsQ0FBQztRQUVKLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNkLE1BQU0sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDekQsQ0FBQztZQUVELE1BQU0sT0FBTyxHQUFHLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBRXRGLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsMkJBQTJCLElBQUksa0NBQWtDLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxDQUFDO1lBQ1QsQ0FBQztZQUVELEVBQUUsQ0FBQyxDQUFDLG9CQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDN0IsTUFBTSxDQUFDO29CQUNMLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtpQkFDbkIsQ0FBQztZQUNKLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixNQUFNLENBQUM7b0JBQ0wsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7b0JBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztpQkFDekIsQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFFNUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNaLElBQUksQ0FBQyxrQ0FBa0MsSUFBSSx1QkFBdUIsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLENBQUM7WUFDVCxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7WUFFNUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxrQ0FBa0MsSUFBSSxtQ0FBbUMsQ0FBQyxDQUFDO2dCQUNoRixNQUFNLENBQUM7WUFDVCxDQUFDO1lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSwyQkFBaUIsQ0FBQztnQkFDakMsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLFNBQVMsRUFBRTtnQkFDNUIsTUFBTSxFQUFFLFNBQVM7YUFDbEIsQ0FBQyxDQUFDO1lBRUgsTUFBTSxDQUFDO2dCQUNMLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO2FBQ2pCLENBQUM7UUFDSixDQUFDO1FBRUQsU0FBUyxNQUFNLENBQUMsS0FBSyxDQUNuQix1QkFBdUIsS0FBSyxDQUFDLEVBQUUsd0JBQXdCLElBQUksMkJBQTJCLENBQ3ZGLENBQUM7SUFDSixDQUFDO0FBRUgsQ0FBQztBQTlKZSxnQ0FBd0IsMkJBOEp2QyxDQUFBIn0= | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDBCQUFvQixTQUFTLENBQUMsQ0FBQTtBQUM5QiwwQkFBeUIsU0FBUyxDQUFDLENBQUE7QUFFbkMsMEJBb0JPLFNBQVMsQ0FBQyxDQUFBO0FBU2pCLGNBQ0UsT0FBZTtJQUVmLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUdELGVBQ0UsT0FBZTtJQUVmLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUdEOzs7R0FHRztBQUNILG9CQUNFLEdBQWU7SUFFZixNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV4QyxHQUFHLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQ3pCLFVBQVUsRUFDUixLQUFLLEVBQ0wsSUFBSSxFQUNKLFNBQVMsRUFDVCxJQUFJLEdBQUcsTUFBTSxFQUNrQjtRQUMvQixNQUFNLE9BQU8sR0FBRztZQUNkLElBQUk7WUFDSixJQUFJO1NBQ0wsQ0FBQztRQUVGLE1BQU0sQ0FBQyxpQkFBTyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDLEVBQ0QsRUFBRSxNQUFNLEVBQUUsQ0FDbUIsQ0FBQztBQUNsQyxDQUFDO0FBckJlLGtCQUFVLGFBcUJ6QixDQUFBO0FBSUQsNkJBQ0UsR0FBZTtJQUVmLE1BQU0sT0FBTyxHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hELE1BQU0sV0FBVyxHQUEwQixFQUFFLENBQUM7SUFFOUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRztRQUN6QixNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsR0FB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 |
"use strict"; | ||
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } | ||
const tyranid_1 = require('tyranid'); | ||
const mongodb_1 = require('mongodb'); | ||
const graphql_1 = require('graphql'); | ||
function warn(message) { | ||
console.warn(`tyranid-graphql: WARNING -- ${ message }`); | ||
} | ||
function error(message) { | ||
throw new Error(`tyranid-graphql: ERROR -- ${ message }`); | ||
} | ||
/** | ||
@@ -27,11 +35,2 @@ * adds a `graphql(query)` method to tyranid which returns | ||
exports.graphqlize = graphqlize; | ||
function warn(message) { | ||
console.warn(`tyranid-graphql: WARNING -- ${ message }`); | ||
} | ||
function error(message) { | ||
throw new Error(`tyranid-graphql: ERROR -- ${ message }`); | ||
} | ||
/** | ||
* tyranid schema -> graphql schema | ||
*/ | ||
function createGraphQLSchema(tyr) { | ||
@@ -48,3 +47,5 @@ const typeMap = new Map(); | ||
queryFields[name] = collectionFieldConfig(col, typeMap, true); | ||
queryFields[name + 's'] = collectionFieldConfig(col, typeMap, false); | ||
// TODO: less hacky... | ||
const suffix = name[name.length - 1] === 's' ? 'es' : 's'; | ||
queryFields[name + suffix] = collectionFieldConfig(col, typeMap, false); | ||
}); | ||
@@ -71,2 +72,3 @@ return new graphql_1.GraphQLSchema({ | ||
const fields = col.def.fields; | ||
const isEnum = col.def.enum; | ||
if (!fields) { | ||
@@ -87,2 +89,10 @@ return error(`Collection "${ col.def.name }" has no fields property.`); | ||
const query = argParser(parent, args); | ||
if (isEnum) { | ||
if (!(args && args['_id'])) { | ||
console.log(col.def.values); | ||
const ids = (col.def.values || []).map(row => row['_id']); | ||
args = { _id: ids }; | ||
} | ||
return single ? col.byId(args['_id'][0]) : col.byIds(args['_id']); | ||
} | ||
// default to full projection | ||
@@ -95,3 +105,3 @@ let project; | ||
if (operation) { | ||
project = createProjection(operation); | ||
project = createProjection(col, operation); | ||
} | ||
@@ -113,23 +123,33 @@ return queryFunction({ | ||
*/ | ||
function createProjection(info) { | ||
// TODO: PR graphql typings to add path prop | ||
const path = info.path; | ||
let selections = info.operation.selectionSet.selections; | ||
for (const fieldName of path) { | ||
for (const selection of selections) { | ||
const field = selection; | ||
if (fieldName === field.name.value) { | ||
if (field.selectionSet) { | ||
selections = field.selectionSet.selections; | ||
continue; | ||
function createProjection(col, info) { | ||
const projection = { _id: 1 }; | ||
const ast = info.fieldASTs[0]; | ||
const collectionFields = col && col.def && col.def.fields; | ||
const selections = ast.selectionSet && ast.selectionSet.selections.slice(); | ||
if (!collectionFields || !selections || !selections.length) return; | ||
let selection; | ||
while (selection = selections.shift()) { | ||
switch (selection.kind) { | ||
case 'Field': | ||
{ | ||
const graphQlField = selection; | ||
const graphQLFieldName = graphQlField.name.value; | ||
const tyrField = collectionFields[graphQLFieldName]; | ||
// computed property found, no projection | ||
if (tyrField.def && tyrField.def.get) return; | ||
projection[graphQLFieldName] = 1; | ||
break; | ||
} | ||
} | ||
/** | ||
* For fragments, add selection set to array and continue | ||
*/ | ||
case 'FragmentSpread': | ||
{ | ||
const fragmentSpread = selection; | ||
const fragment = info.fragments[fragmentSpread.name.value]; | ||
selections.push.apply(selections, _toConsumableArray(fragment.selectionSet.selections)); | ||
break; | ||
} | ||
} | ||
} | ||
if (!selections || !selections.length) return; | ||
const projection = { _id: 1 }; | ||
for (const selection of selections) { | ||
const field = selection; | ||
projection[field.name.value] = 1; | ||
} | ||
return projection; | ||
@@ -189,3 +209,4 @@ } | ||
/** | ||
* Create lazy value to contain fields for a particular tyranid field definition object | ||
* Create lazy value to contain fields for a | ||
* particular tyranid field definition object | ||
*/ | ||
@@ -217,8 +238,6 @@ function createFieldThunk(fields, map) { | ||
if (typeof field === 'string') { | ||
warn(`Ignoring field: "${ field }" at path "${ path }" as it is a string`); | ||
return; | ||
return createGraphQLFieldConfig({ is: field }, map, fieldName, path, single); | ||
} | ||
// TODO: determine why this is necessary | ||
if ('def' in field) { | ||
// grab def property on field and recast | ||
field = field.def; | ||
@@ -238,3 +257,3 @@ } | ||
args: createArguments(colFields, map), | ||
resolve: function resolve(parent, args, context, ast) { | ||
resolve: function resolve(parent, args, context, info) { | ||
const linkField = parent[fieldName]; | ||
@@ -255,3 +274,3 @@ args = args || {}; | ||
} | ||
return linkType.resolve(parent, linkArgs, context, ast); | ||
return linkType.resolve(parent, linkArgs, context, info); | ||
} | ||
@@ -321,3 +340,3 @@ }; | ||
if (!defFields) { | ||
warn(`Ignoring object field at path "${ path }" as it has poorly defined schema`); | ||
warn(`Ignoring object field at path "${ path }" as it has no schema`); | ||
return; | ||
@@ -334,6 +353,6 @@ } | ||
default: | ||
return error(`Unable to map type "${ field.is }" for field at path "${ path }" to GraphQLType instance`); | ||
return error(`Unable to map type "${ field.is }" for field at path "${ path }"`); | ||
} | ||
} | ||
exports.createGraphQLFieldConfig = createGraphQLFieldConfig; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwwQkFBb0IsQUFBUyxBQUFDO0FBQzlCLDBCQUF5QixBQUFTLEFBQUM7QUFDbkMsMEJBa0JPLEFBQVMsQUFBQztBQUtqQixBQUdHOzs7O0FBQ0gsb0JBQTJCLEFBQWU7QUFDeEMsVUFBTSxBQUFNLFNBQUcsQUFBbUIsb0JBQUMsQUFBRyxBQUFDLEFBQUM7QUFFeEMsQUFBRyxRQUFDLEFBQU8saUJBQXVDLEFBQU0sT0FDdEQsQUFBVTtZQUFFLEFBQUs7WUFBRSxBQUFJO1lBQUUsQUFBUzs7WUFBRSxBQUFJLGlDQUFHLEFBQU0sQUFBa0M7O0FBQ2pGLGNBQU0sQUFBTztBQUNYLEFBQUk7QUFDSixBQUFJLEFBQ0wsQUFBQztBQUhjO0FBS2hCLEFBQU0sZUFBQyxVQUFPLFFBQUMsQUFBTSxRQUFFLEFBQUssT0FBRSxBQUFJLE1BQUUsQUFBTyxTQUFFLEFBQVMsQUFBQyxBQUFDLEFBQzFEO0FBQUMsS0FSd0MsQUFBTSxFQVMvQyxFQUFFLEFBQU0sQUFBRSxBQUNYLEFBQUMsQUFDSjtBQUFDO0FBZGUsUUFBVSxhQWN6QjtBQUdELGNBQWMsQUFBZTtBQUMzQixBQUFPLFlBQUMsQUFBSSxBQUFDLHFDQUErQixBQUFPLE9BQUUsQUFBQyxBQUFDLEFBQ3pEO0FBQUM7QUFFRCxlQUFlLEFBQWU7QUFDNUIsVUFBTSxJQUFJLEFBQUssQUFBQyxvQ0FBNkIsQUFBTyxPQUFFLEFBQUMsQUFBQyxBQUMxRDtBQUFDO0FBR0QsQUFFRzs7O0FBQ0gsNkJBQW9DLEFBQWU7QUFDakQsVUFBTSxBQUFPLFVBQXlCLElBQUksQUFBRyxBQUFFLEFBQUM7QUFDaEQsVUFBTSxBQUFXLGNBQTBCLEFBQUUsQUFBQztBQUU5QyxBQUFHLFFBQUMsQUFBVyxZQUFDLEFBQU8sUUFBQyxBQUFHO0FBQ3pCLGNBQU0sQUFBSSxPQUFHLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBSSxBQUFDO0FBQzFCLEFBQUUsQUFBQyxZQUFDLENBQUMsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFNLEFBQUMsUUFBQyxBQUFNLE9BQUMsQUFBSyxBQUFDLHNCQUFlLEFBQUksSUFBa0IsQUFBQyxBQUFDO0FBRXpFLGNBQU0sQUFBTSxTQUFHLEFBQWdCLGlCQUFDLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBTSxRQUFFLEFBQU8sQUFBRSxhQUFHLEFBQUksSUFBRyxBQUFDLEFBQUM7QUFFckUsY0FBTSxBQUFjLGlCQUFHLElBQUksVUFBaUIsa0JBQUMsRUFBRSxBQUFJLFlBQUUsQUFBTSxBQUFFLEFBQUMsQUFBQztBQUUvRCxBQUFPLGdCQUFDLEFBQUcsSUFBQyxBQUFJLE1BQUUsQUFBYyxBQUFDLEFBQUM7QUFFbEMsQUFBb0Q7QUFDcEQsQUFBVyxvQkFBQyxBQUFJLEFBQUMsUUFBRyxBQUFxQixzQkFBQyxBQUFHLEtBQUUsQUFBTyxTQUFFLEFBQUksQUFBQyxBQUFDO0FBQzlELEFBQVcsb0JBQUMsQUFBSSxPQUFHLEFBQUcsQUFBQyxPQUFHLEFBQXFCLHNCQUFDLEFBQUcsS0FBRSxBQUFPLFNBQUUsQUFBSyxBQUFDLEFBQUMsQUFDdkU7QUFBQyxBQUFDLEFBQUM7QUFFSCxBQUFNLGVBQUssVUFBYTtBQUN0QixBQUFLLG1CQUFNLFVBQWlCO0FBQzFCLEFBQUksa0JBQUUsQUFBTztBQUNiLEFBQU0sb0JBQUUsQUFBVyxBQUNwQixBQUFDLEFBQ0gsQUFBQyxBQUFDLEFBQ0w7QUFMaUMsU0FBdEI7QUFEZ0IsS0FBbEI7QUFNUjtBQXpCZSxRQUFtQixzQkF5QmxDO0FBR0QsQUFHRzs7OztBQUNILCtCQUNFLEFBQTJCLEtBQzNCLEFBQXlCO1FBQ3pCLEFBQU0sK0RBQUcsQUFBSTs7QUFFYixVQUFNLEFBQWMsaUJBQUcsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBRyxJQUFDLEFBQUksQUFBQyxBQUFDO0FBRTdDLEFBQUUsQUFBQyxRQUFDLENBQUMsQUFBYyxBQUFDLGdCQUFDLEFBQUM7QUFDcEIsQUFBTSxlQUFDLEFBQUssQUFBQyxzQkFBZSxBQUFHLElBQUMsQUFBRyxJQUFDLEFBQUksSUFBa0MsQUFBQyxBQUFDLEFBQzlFO0FBQUM7QUFFRCxVQUFNLEFBQU0sU0FBRyxBQUFHLElBQUMsQUFBRyxJQUFDLEFBQU0sQUFBQztBQUU5QixBQUFFLEFBQUMsUUFBQyxDQUFDLEFBQU0sQUFBQyxRQUFDLEFBQUM7QUFDWixBQUFNLGVBQUMsQUFBSyxBQUFDLHNCQUFlLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBSSxJQUEyQixBQUFDLEFBQUMsQUFDdkU7QUFBQztBQUVELFVBQU0sQUFBSSxPQUFHLEFBQWUsZ0JBQUMsQUFBTSxRQUFFLEFBQUcsQUFBQyxBQUFDO0FBRTFDLFVBQU0sQUFBYSxnQkFDakIsQUFBTSxTQUNGLEFBQUcsSUFBQyxBQUFPLFFBQUMsQUFBSSxLQUFDLEFBQUcsQUFBQyxPQUNyQixBQUFHLElBQUMsQUFBTyxRQUFDLEFBQUksS0FBQyxBQUFHLEFBQUMsQUFBQztBQUU1QixVQUFNLEFBQUksT0FBRyxBQUFNLFNBQ2YsQUFBYyxpQkFDZCxJQUFJLFVBQVcsWUFBQyxBQUFjLEFBQUMsQUFBQztBQUVwQyxVQUFNLEFBQVMsWUFBRyxBQUFvQixxQkFBQyxBQUFNLEFBQUMsQUFBQztBQUUvQyxBQUFNO0FBQ0osQUFBSTtBQUNKLEFBQUk7QUFDSixBQUFPLGtDQUFDLEFBQU0sUUFBRSxBQUFJLE1BQUUsQUFBTyxTQUFFLEFBQVM7QUFDdEMsQUFFRzs7O0FBQ0gsa0JBQU0sQUFBSyxRQUFHLEFBQVMsVUFBQyxBQUFNLFFBQUUsQUFBSSxBQUFDLEFBQUM7QUFFdEMsQUFBNkI7QUFDN0IsZ0JBQUksQUFBWSxBQUFDO0FBRWpCLEFBR0c7Ozs7QUFDSCxBQUFFLEFBQUMsZ0JBQUMsQUFBUyxBQUFDLFdBQUMsQUFBQztBQUNkLEFBQU8sMEJBQUcsQUFBZ0IsaUJBQUMsQUFBUyxBQUFDLEFBQUMsQUFDeEM7QUFBQztBQUVELEFBQU07QUFDSixBQUFLO0FBQ0wsQUFBTSx3QkFBRSxBQUFPO0FBQ2YsQUFBSSxzQkFBRSxBQUFPLFdBQUksQUFBTyxRQUFDLEFBQUk7QUFDN0IsQUFBSSxzQkFBRSxBQUFPLFdBQUksQUFBTyxRQUFDLEFBQUksQUFDOUIsQUFBQyxBQUFDLEFBQ0w7QUFOdUIsYUFBZCxBQUFhO0FBTXJCLEFBQ0YsQUFBQyxBQUNKO0FBNUJTO0FBNEJSO0FBMURlLFFBQXFCLHdCQTBEcEM7QUFHRCxBQUlHOzs7OztBQUNILDBCQUFpQyxBQUF3QjtBQUN2RCxBQUE0QztBQUM1QyxVQUFNLEFBQUksT0FBSSxBQUFZLEtBQUMsQUFBZ0IsQUFBQztBQUU1QyxRQUFJLEFBQVUsYUFBRyxBQUFJLEtBQUMsQUFBUyxVQUFDLEFBQVksYUFBQyxBQUFVLEFBQUM7QUFDeEQsQUFBRyxBQUFDLFNBQUMsTUFBTSxBQUFTLGFBQUksQUFBSSxBQUFDLE1BQUMsQUFBQztBQUM3QixBQUFHLEFBQUMsYUFBQyxNQUFNLEFBQVMsYUFBSSxBQUFVLEFBQUMsWUFBQyxBQUFDO0FBQ25DLGtCQUFNLEFBQUssUUFBRyxBQUFrQixBQUFDO0FBQ2pDLEFBQUUsQUFBQyxnQkFBQyxBQUFTLGNBQUssQUFBSyxNQUFDLEFBQUksS0FBQyxBQUFLLEFBQUMsT0FBQyxBQUFDO0FBQ25DLEFBQUUsQUFBQyxvQkFBQyxBQUFLLE1BQUMsQUFBWSxBQUFDLGNBQUMsQUFBQztBQUN2QixBQUFVLGlDQUFHLEFBQUssTUFBQyxBQUFZLGFBQUMsQUFBVSxBQUFDO0FBQzNDLEFBQVEsQUFBQyxBQUNYO0FBQUMsQUFDSDtBQUFDLEFBQ0g7QUFBQyxBQUNIO0FBQUM7QUFFRCxBQUFFLEFBQUMsUUFBQyxDQUFDLEFBQVUsY0FBSSxDQUFDLEFBQVUsV0FBQyxBQUFNLEFBQUMsUUFBQyxBQUFNLEFBQUM7QUFFOUMsVUFBTSxBQUFVLGFBQVEsRUFBRSxBQUFHLEtBQUUsQUFBQyxBQUFFLEFBQUM7QUFFbkMsQUFBRyxBQUFDLFNBQUMsTUFBTSxBQUFTLGFBQUksQUFBVSxBQUFDLFlBQUMsQUFBQztBQUNuQyxjQUFNLEFBQUssUUFBRyxBQUFrQixBQUFDO0FBQ2pDLEFBQVUsbUJBQUMsQUFBSyxNQUFDLEFBQUksS0FBQyxBQUFLLEFBQUMsU0FBRyxBQUFDLEFBQUMsQUFDbkM7QUFBQztBQUVELEFBQU0sV0FBQyxBQUFVLEFBQUMsQUFDcEI7QUFBQztBQTNCZSxRQUFnQixtQkEyQi9CO0FBR0QsQUFFRzs7O0FBQ0gseUJBQ0UsQUFBK0IsUUFDL0IsQUFBeUI7QUFFekIsVUFBTSxBQUFNLFNBQWtDLEFBQUUsQUFBQztBQUVqRCxBQUFHLEFBQUMsU0FBQyxNQUFNLEFBQVMsYUFBSSxBQUFNLEFBQUMsUUFBQyxBQUFDO0FBQy9CLEFBQTBDO0FBQzFDLGNBQU0sQUFBSyxRQUFpQyxBQUFNLE9BQUMsQUFBUyxBQUFTLFdBQUMsQUFBRyxBQUFDO0FBRTFFLEFBQUUsQUFBQyxZQUFDLEFBQUssTUFBQyxBQUFFLEFBQUksTUFBQyxBQUFLLE1BQUMsQUFBRSxPQUFLLEFBQVEsQUFBQyxBQUFJLFlBQUMsQUFBSyxNQUFDLEFBQUUsT0FBSyxBQUFPLEFBQUMsQUFBQyxTQUFDLEFBQUM7QUFDbEUsa0JBQU0sQUFBUyxZQUFHLEFBQXdCLHlCQUFDLEFBQUssT0FBRSxBQUFHLEtBQUUsQUFBUyxXQUFFLEFBQUUsSUFBRSxBQUFJLEFBQUMsQUFBQztBQUM1RSxBQUFFLEFBQUMsZ0JBQUMsQUFBUyxhQUFJLFVBQVUsV0FBQyxBQUFTLFVBQUMsQUFBSSxBQUFDLEFBQUMsT0FBQyxBQUFDO0FBQzVDLEFBQU0sdUJBQUMsQUFBUyxBQUFDO0FBQ2YsQUFBSSwwQkFBRSxJQUFJLFVBQVcsWUFBQyxBQUFTLFVBQUMsQUFBSSxBQUFDLEFBQ3RDLEFBQUMsQUFDSjtBQUhzQjtBQUdyQjtBQUFBLEFBQUMsQUFDSjtBQUFDO0FBRUQsQUFBRSxBQUFDLFlBQUMsQUFBSyxNQUFDLEFBQUksQUFBSSxRQUFDLEFBQUssTUFBQyxBQUFFLE9BQUssQUFBTyxXQUFJLEFBQUssTUFBQyxBQUFFLE1BQUksQUFBSyxNQUFDLEFBQUUsR0FBQyxBQUFJLEFBQUMsQUFBQyxNQUFDLEFBQUM7QUFDdEUsQUFBTSxtQkFBQyxBQUFTLEFBQUM7QUFDZixBQUFJLHNCQUFFLElBQUksVUFBVyxZQUFDLFVBQVMsQUFBQyxBQUNqQyxBQUFDLEFBQ0o7QUFIc0I7QUFHckIsQUFFSDtBQUFDO0FBQ0QsQUFBTSxXQUFDLEFBQU0sQUFBQyxBQUNoQjtBQUFDO0FBM0JlLFFBQWUsa0JBMkI5QjtBQUdELEFBRUc7OztBQUNILDhCQUNFLEFBQStCO0FBRS9CLEFBQU0sV0FBQyxVQUFVLEFBQVcsUUFBRSxBQUFTO0FBQ3JDLEFBQUUsQUFBQyxZQUFDLENBQUMsQUFBSSxBQUFDLE1BQUMsQUFBTSxPQUFDLEFBQUUsQUFBQztBQUVyQixjQUFNLEFBQUssUUFBUSxBQUFFLEFBQUM7QUFDdEIsQUFBRyxBQUFDLGFBQUMsTUFBTSxBQUFJLFFBQUksQUFBSSxBQUFDLE1BQUMsQUFBQztBQUN4QixBQUErQjtBQUMvQixrQkFBTSxBQUFLLFFBQWlDLEFBQU0sT0FBQyxBQUFJLEFBQVMsTUFBQyxBQUFHLEFBQUM7QUFDckUsQUFBRSxBQUFDLGdCQUFFLEFBQUssTUFBQyxBQUFJLEFBQ1gsUUFBQyxBQUFLLE1BQUMsQUFBRSxPQUFLLEFBQVMsQUFBQyxBQUN4QixhQUFDLEFBQUssTUFBQyxBQUFFLE9BQUssQUFBTyxXQUFJLEFBQUssTUFBQyxBQUFFLE1BQUksQUFBSyxNQUFDLEFBQUUsR0FBQyxBQUFJLEFBQUMsQUFBQyxNQUFDLEFBQUM7QUFDeEQsQUFBSyxzQkFBQyxBQUFJLEFBQUM7QUFDVCxBQUFHLHlCQUFFLEFBQUUsR0FBQyxBQUFNLE9BQUMsQUFBSSxLQUFDLEFBQUksQUFBQyxBQUFDLE9BQUMsQUFBRyxJQUFFLEFBQU8sRUFBUixJQUFhLElBQUksVUFBUSxTQUFDLEFBQUUsQUFBQyxBQUFDLEFBQzlELEFBQUMsQUFDSjtBQUhnQjtBQUdmLEFBQUMsQUFBSSxtQkFBQyxBQUFDO0FBQ04sQUFBSyxzQkFBQyxBQUFJLEFBQUM7QUFDVCxBQUFHLHlCQUFFLEFBQUksS0FBQyxBQUFJLEFBQUMsQUFDaEIsQUFBQyxBQUNKO0FBSGdCO0FBR2YsQUFDSDtBQUFDO0FBRUQsQUFBTSxlQUFDLEFBQUssQUFBQyxBQUNmO0FBQUMsQUFBQyxBQUNKO0FBQUM7QUF6QmUsUUFBb0IsdUJBeUJuQztBQUdELEFBRUc7OztBQUNILDBCQUNFLEFBQXFELFFBQ3JELEFBQXlCO1FBQ3pCLEFBQUksNkRBQUcsQUFBRTs7QUFFVCxBQUFNLFdBQUM7QUFDTCxjQUFNLEFBQVMsWUFBMEIsQUFBRSxBQUFDO0FBRTVDLEFBQUUsQUFBQyxZQUFDLENBQUMsQUFBTSxBQUFDLFFBQUMsQUFBTSxPQUFDLEFBQUssQUFBQyxNQUFzQyxBQUFDLEFBQUM7QUFFbEUsWUFBSSxBQUFTLFlBQUcsQUFBSyxBQUFDO0FBQ3RCLEFBQUcsQUFBQyxhQUFDLE1BQU0sQUFBUyxhQUFJLEFBQU0sQUFBQyxRQUFDLEFBQUM7QUFDL0IsQUFBUyx3QkFBRyxBQUFJLEFBQUM7QUFDakIsa0JBQU0sQUFBSyxRQUFHLEFBQU0sT0FBQyxBQUFTLEFBQUMsQUFBQztBQUNoQyxrQkFBTSxBQUFXLGNBQUcsQUFBd0IseUJBQUMsQUFBSyxPQUFFLEFBQUcsS0FBRSxBQUFTLEFBQUUsZUFBRyxBQUFJLFNBQUcsQUFBUyxTQUFFLEtBQUUsQUFBSSxBQUFDLEFBQUM7QUFDakcsQUFBRSxBQUFDLGdCQUFDLEFBQVcsQUFBQyxhQUFDLEFBQUM7QUFDaEIsQUFBUywwQkFBQyxBQUFTLEFBQUMsYUFBRyxBQUFXLEFBQUMsQUFDckM7QUFBQyxBQUNIO0FBQUM7QUFFRCxBQUFFLEFBQUMsWUFBQyxDQUFDLEFBQVMsQUFBQyxXQUFDLEFBQU0sT0FBQyxBQUFLLEFBQUMsZ0JBQVMsQUFBSSxJQUF3QyxBQUFDLEFBQUM7QUFFcEYsQUFBTSxlQUFDLEFBQVMsQUFBQyxBQUNuQjtBQUFDLEFBQUMsQUFDSjtBQUFDO0FBeEJlLFFBQWdCLG1CQXdCL0I7QUFHRCxBQUVHOzs7QUFDSCxrQ0FDRSxBQUFpQyxPQUNqQyxBQUF5QixLQUN6QixBQUFpQixXQUNqQixBQUFZLE1BQ1osQUFBZTtBQUdmLEFBQUUsQUFBQyxRQUFDLE9BQU8sQUFBSyxVQUFLLEFBQVEsQUFBQyxVQUFDLEFBQUM7QUFDOUIsQUFBSSxBQUFDLGtDQUFvQixBQUFLLHFCQUFjLEFBQUksSUFBcUIsQUFBQyxBQUFDO0FBQ3ZFLEFBQU0sQUFBQyxBQUNUO0FBQUM7QUFFRCxBQUF3QztBQUN4QyxBQUFFLEFBQUMsUUFBQyxBQUFLLFNBQUksQUFBSyxBQUFDLE9BQUMsQUFBQztBQUNuQixBQUF3QztBQUN4QyxBQUFLLGdCQUFLLEFBQWEsTUFBQyxBQUFrQyxBQUFDLEFBQzdEO0FBQUM7QUFFRCxBQUVHOzs7QUFDSCxVQUFNLEFBQUksT0FBSSxBQUF1QixJQUF4QixJQUNYLEFBQU0sU0FBRyxBQUFJLE9BQUcsSUFBSSxVQUFXLFlBQUMsQUFBSSxBQUFDLEFBQUM7QUFHeEMsQUFBRSxBQUFDLFFBQUMsQUFBSyxNQUFDLEFBQUksQUFBQyxNQUFDLEFBQUM7QUFDZixjQUFNLEFBQUcsTUFBRyxVQUFHLElBQUMsQUFBTSxPQUFDLEFBQUssTUFBQyxBQUFJLEFBQUMsQUFBQztBQUNuQyxjQUFNLEFBQVEsV0FBRyxBQUFxQixzQkFBQyxBQUFHLEtBQUUsQUFBRyxLQUFFLEFBQU0sQUFBQyxBQUFDO0FBQ3pELGNBQU0sQUFBUyxZQUFHLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBTSxBQUFDO0FBRWpDLEFBQUUsQUFBQyxZQUFDLENBQUMsQUFBUyxBQUFDLFdBQUMsQUFBTSxPQUFDLEFBQUssQUFBQyx5Q0FBa0MsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFJLElBQUUsQUFBQyxBQUFDO0FBRS9FLEFBQU07QUFDSixBQUFJLGtCQUFFLEFBQVEsU0FBQyxBQUFJO0FBQ25CLEFBQUksa0JBQUUsQUFBZSxnQkFBQyxBQUFTLFdBQUUsQUFBRyxBQUFDO0FBQ3JDLEFBQU8sc0NBQUMsQUFBTSxRQUFFLEFBQUksTUFBRSxBQUFPLFNBQUUsQUFBRztBQUNoQyxzQkFBTSxBQUFTLFlBQUcsQUFBTSxPQUFDLEFBQVMsQUFBQyxBQUFDO0FBQ3BDLEFBQUksdUJBQUcsQUFBSSxRQUFJLEFBQUUsQUFBQztBQUVsQixBQUFFLEFBQUMsb0JBQUMsQ0FBQyxBQUFTLEFBQUMsV0FBQyxBQUFNLE9BQUMsQUFBTSxTQUFHLEFBQUksT0FBRyxBQUFFLEFBQUM7QUFFMUMsQUFBRSxBQUFDLG9CQUFDLENBQUMsQUFBUSxTQUFDLEFBQU8sQUFBQyxTQUFDLEFBQUM7QUFDdEIsQUFBTSwyQkFBQyxBQUFLLEFBQUMsNkRBQXNELEFBQUssTUFBQyxBQUFJLElBQUUsQUFBQyxBQUFDLEFBQ25GO0FBQUM7QUFFRCxzQkFBTSxBQUFPLFVBQUcsQUFBRSxHQUFDLEFBQU0sT0FBQyxBQUFTLEFBQUMsQUFBQztBQUNyQyxzQkFBTSxBQUFRLFdBQVEsQUFBRSxBQUFDO0FBRXpCLEFBQUUsQUFBQyxvQkFBQyxBQUFJLEtBQUMsQUFBSyxBQUFDLEFBQUMsUUFBQyxBQUFDO0FBQ2hCLDBCQUFNLEFBQU0sQUFBYyxTQUFDLEFBQUssTUFBQyxBQUFPLFFBQUMsQUFBSSxLQUFDLEFBQUssQUFBQyxBQUFDLFVBQ2pELEFBQUksS0FBQyxBQUFLLEFBQUMsU0FDWCxDQUFFLEFBQUksS0FBQyxBQUFLLEFBQUMsQUFBRSxBQUFDLEFBQUM7QUFFckIsMEJBQU0sQUFBUSxXQUFHLElBQUksQUFBRyxJQUFDLEFBQU0sQUFBQyxBQUFDO0FBRWpDLEFBQVEsNkJBQUMsQUFBSyxBQUFDLFNBQUcsQUFBTyxRQUFDLEFBQU0sT0FBRSxBQUFPLEVBQVIsSUFBYSxBQUFRLFNBQUMsQUFBRyxJQUFDLEFBQUUsR0FBQyxBQUFRLEFBQUUsQUFBQyxBQUFDLEFBQUMsQUFDN0U7QUFBQyxBQUFDLEFBQUksdUJBQUMsQUFBQztBQUNOLEFBQVEsNkJBQUMsQUFBSyxBQUFDLFNBQUcsQUFBTyxBQUFDLEFBQzVCO0FBQUM7QUFFRCxBQUFNLHVCQUFDLEFBQVEsU0FBQyxBQUFPLFFBQUMsQUFBTSxRQUFFLEFBQVEsVUFBRSxBQUFPLFNBQUUsQUFBRyxBQUFDLEFBQUMsQUFDMUQ7QUFBQyxBQUNGLEFBQUMsQUFDSjtBQS9CUztBQStCUjtBQUVELEFBQUUsQUFBQyxRQUFDLENBQUMsQUFBSyxNQUFDLEFBQUUsQUFBQyxJQUFDLEFBQUM7QUFDZCxBQUFNLGVBQUMsQUFBSyxBQUFDLHNDQUErQixBQUFJLElBQUcsQUFBQyxBQUFDLEFBQ3ZEO0FBQUM7QUFFRCxBQUFNLEFBQUMsWUFBQyxBQUFLLE1BQUMsQUFBRSxBQUFDLEFBQUMsQUFBQztBQUVqQixhQUFLLEFBQVEsQUFBQztBQUNkLGFBQUssQUFBSyxBQUFDO0FBQ1gsYUFBSyxBQUFPLEFBQUM7QUFDYixhQUFLLEFBQU8sQUFBQztBQUNiLGFBQUssQUFBVSxBQUFDO0FBQ2hCLGFBQUssQUFBTSxBQUFDO0FBQ1osYUFBSyxBQUFLO0FBQ1IsQUFBTTtBQUNKLEFBQUksc0JBQUUsQUFBSSxLQUFDLFVBQWEsQUFBQyxBQUMxQixBQUFDO0FBRks7QUFJVCxhQUFLLEFBQVM7QUFDWixBQUFNO0FBQ0osQUFBSSxzQkFBRSxBQUFJLEtBQUMsVUFBYyxBQUFDLEFBQzNCLEFBQUM7QUFGSztBQUlULGFBQUssQUFBUTtBQUNYLEFBQU07QUFDSixBQUFJLHNCQUFFLEFBQUksS0FBQyxVQUFZLEFBQUMsQUFDekIsQUFBQztBQUZLO0FBSVQsYUFBSyxBQUFTO0FBQ1osQUFBTTtBQUNKLEFBQUksc0JBQUUsQUFBSSxLQUFDLFVBQVUsQUFBQyxBQUN2QixBQUFDO0FBRks7QUFJVCxhQUFLLEFBQVM7QUFDWixBQUFNO0FBQ0osQUFBSSxzQkFBRSxBQUFJLEtBQUMsVUFBUyxBQUFDLEFBQ3RCLEFBQUM7QUFGSztBQUlULGFBQUssQUFBTztBQUFFLEFBQUM7QUFDYixBQUFFLEFBQUMsb0JBQUMsQ0FBQyxBQUFLLE1BQUMsQUFBRSxBQUFDLElBQUMsQUFBQztBQUNkLEFBQU0sMkJBQUMsQUFBSyxBQUFDLHdDQUFpQyxBQUFJLElBQUcsQUFBQyxBQUFDLEFBQ3pEO0FBQUM7QUFFRCxzQkFBTSxBQUFPLFVBQUcsQUFBd0IseUJBQUMsQUFBSyxNQUFDLEFBQUUsSUFBRSxBQUFHLEtBQUUsQUFBUyxBQUFFLGVBQUcsQUFBSSxJQUFHLE1BQUUsQUFBSyxBQUFDLEFBQUM7QUFFdEYsQUFBRSxBQUFDLG9CQUFDLENBQUMsQUFBTyxBQUFDLFNBQUMsQUFBQztBQUNiLEFBQUksQUFBQyxxREFBMkIsQUFBSSxJQUFrQyxBQUFDLEFBQUM7QUFDeEUsQUFBTSxBQUFDLEFBQ1Q7QUFBQztBQUVELEFBQUUsQUFBQyxvQkFBQyxVQUFVLFdBQUMsQUFBTyxRQUFDLEFBQUksQUFBQyxBQUFDLE9BQUMsQUFBQztBQUM3QixBQUFNO0FBQ0osQUFBSSw4QkFBRSxBQUFPLFFBQUMsQUFBSSxBQUNuQixBQUFDLEFBQ0o7QUFIUztBQUdSLEFBQUMsQUFBSSx1QkFBQyxBQUFDO0FBQ04sQUFBTTtBQUNKLEFBQUksOEJBQUUsQUFBTyxRQUFDLEFBQUk7QUFDbEIsQUFBSSw4QkFBRSxBQUFPLFFBQUMsQUFBSTtBQUNsQixBQUFPLGlDQUFFLEFBQU8sUUFBQyxBQUFPLEFBQ3pCLEFBQUMsQUFDSjtBQUxTO0FBS1IsQUFDSDtBQUFDO0FBRUQsYUFBSyxBQUFRO0FBQUUsQUFBQztBQUNkLHNCQUFNLEFBQU0sU0FBRyxBQUFLLE1BQUMsQUFBTSxBQUFDO0FBRTVCLEFBQUUsQUFBQyxvQkFBQyxDQUFDLEFBQU0sQUFBQyxRQUFDLEFBQUM7QUFDWixBQUFJLEFBQUMsNERBQWtDLEFBQUksSUFBdUIsQUFBQyxBQUFDO0FBQ3BFLEFBQU0sQUFBQyxBQUNUO0FBQUM7QUFFRCxzQkFBTSxBQUFTLFlBQUcsQUFBZ0IsaUJBQUMsQUFBTSxRQUFFLEFBQUcsQUFBRSxTQUFHLEFBQUksSUFBRyxBQUFDLEFBQUM7QUFFNUQsQUFBRSxBQUFDLG9CQUFDLENBQUMsQUFBUyxBQUFDLFdBQUMsQUFBQztBQUNmLEFBQUksQUFBQyw0REFBa0MsQUFBSSxJQUFtQyxBQUFDLEFBQUM7QUFDaEYsQUFBTSxBQUFDLEFBQ1Q7QUFBQztBQUVELHNCQUFNLEFBQUksV0FBTyxVQUFpQjtBQUNoQyxBQUFJLEFBQUUsOEJBQUcsQUFBSSxVQUFJLEFBQVMsU0FBRTtBQUM1QixBQUFNLDRCQUFFLEFBQVMsQUFDbEIsQUFBQyxBQUFDO0FBSGdDLGlCQUF0QjtBQUtiLEFBQU07QUFDSixBQUFJLDBCQUFFLEFBQUksS0FBQyxBQUFJLEFBQUMsQUFDakIsQUFBQyxBQUNKO0FBSFM7QUFHUjtBQUVEO0FBQVMsQUFBTSxtQkFBQyxBQUFLLEFBQ25CLDhCQUF1QixBQUFLLE1BQUMsQUFBRSw0QkFBd0IsQUFBSSxJQUEyQixBQUN2RixBQUFDLEFBQ0osQUFBQyxBQUVIOztBQUFDO0FBOUplLFFBQXdCLDJCQThKdkMifQ== | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDBCQUFvQixBQUFTLEFBQUM7QUFDOUIsMEJBQXlCLEFBQVMsQUFBQztBQUVuQywwQkFvQk8sQUFBUyxBQUFDO0FBU2pCLGNBQ0UsQUFBZTtBQUVmLEFBQU8sWUFBQyxBQUFJLEFBQUMscUNBQStCLEFBQU8sT0FBRSxBQUFDLEFBQUMsQUFDekQ7QUFBQztBQUdELGVBQ0UsQUFBZTtBQUVmLFVBQU0sSUFBSSxBQUFLLEFBQUMsb0NBQTZCLEFBQU8sT0FBRSxBQUFDLEFBQUMsQUFDMUQ7QUFBQztBQUdELEFBR0c7Ozs7QUFDSCxvQkFDRSxBQUFlO0FBRWYsVUFBTSxBQUFNLFNBQUcsQUFBbUIsb0JBQUMsQUFBRyxBQUFDLEFBQUM7QUFFeEMsQUFBRyxRQUFDLEFBQU8saUJBQVUsQUFBTSxPQUN6QixBQUFVO1lBQ1IsQUFBSztZQUNMLEFBQUk7WUFDSixBQUFTOztZQUNULEFBQUksaUNBQUcsQUFBTSxBQUNrQjs7QUFDL0IsY0FBTSxBQUFPO0FBQ1gsQUFBSTtBQUNKLEFBQUksQUFDTCxBQUFDO0FBSGM7QUFLaEIsQUFBTSxlQUFDLFVBQU8sUUFBQyxBQUFNLFFBQUUsQUFBSyxPQUFFLEFBQUksTUFBRSxBQUFPLFNBQUUsQUFBUyxBQUFDLEFBQUMsQUFDMUQ7QUFBQyxLQWJXLEFBQU0sRUFjbEIsRUFBRSxBQUFNLEFBQUUsQUFDbUIsQUFBQyxBQUNsQztBQUFDO0FBckJlLFFBQVUsYUFxQnpCO0FBSUQsNkJBQ0UsQUFBZTtBQUVmLFVBQU0sQUFBTyxVQUF5QixJQUFJLEFBQUcsQUFBRSxBQUFDO0FBQ2hELFVBQU0sQUFBVyxjQUEwQixBQUFFLEFBQUM7QUFFOUMsQUFBRyxRQUFDLEFBQVcsWUFBQyxBQUFPLFFBQUMsQUFBRztBQUN6QixjQUFNLEFBQUksT0FBRyxBQUFHLElBQUMsQUFBRyxJQUFDLEFBQUksQUFBQztBQUMxQixBQUFFLEFBQUMsWUFBQyxDQUFDLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBTSxBQUFDLFFBQUMsQUFBTSxPQUFDLEFBQUssQUFBQyxzQkFBZSxBQUFJLElBQWtCLEFBQUMsQUFBQztBQUV6RSxjQUFNLEFBQU0sU0FBRyxBQUFnQixpQkFBQyxBQUFHLElBQUMsQUFBRyxJQUFDLEFBQU0sUUFBRSxBQUFPLEFBQUUsYUFBRyxBQUFJLElBQUcsQUFBQyxBQUFDO0FBRXJFLGNBQU0sQUFBYyxpQkFBRyxJQUFJLFVBQWlCLGtCQUFDLEVBQUUsQUFBSSxZQUFFLEFBQU0sQUFBRSxBQUFDLEFBQUM7QUFFL0QsQUFBTyxnQkFBQyxBQUFHLElBQUMsQUFBSSxNQUFFLEFBQWMsQUFBQyxBQUFDO0FBRWxDLEFBQW9EO0FBQ3BELEFBQVcsb0JBQUMsQUFBSSxBQUFDLFFBQUcsQUFBcUIsc0JBQUMsQUFBRyxLQUFFLEFBQU8sU0FBRSxBQUFJLEFBQUMsQUFBQztBQUU5RCxBQUFzQjtBQUN0QixjQUFNLEFBQU0sU0FBRyxBQUFJLEtBQUMsQUFBSSxLQUFDLEFBQU0sU0FBRyxBQUFDLEFBQUMsT0FBSyxBQUFHLE1BQUcsQUFBSSxPQUFHLEFBQUcsQUFBQztBQUMxRCxBQUFXLG9CQUFDLEFBQUksT0FBRyxBQUFNLEFBQUMsVUFBRyxBQUFxQixzQkFBQyxBQUFHLEtBQUUsQUFBTyxTQUFFLEFBQUssQUFBQyxBQUFDLEFBQzFFO0FBQUMsQUFBQyxBQUFDO0FBRUgsQUFBTSxlQUFLLFVBQWE7QUFDdEIsQUFBSyxtQkFBTSxVQUFpQjtBQUMxQixBQUFJLGtCQUFFLEFBQU87QUFDYixBQUFNLG9CQUFFLEFBQVcsQUFDcEIsQUFBQyxBQUNILEFBQUMsQUFBQyxBQUNMO0FBTGlDLFNBQXRCO0FBRGdCLEtBQWxCO0FBTVI7QUE5QmUsUUFBbUIsc0JBOEJsQztBQUdELEFBR0c7Ozs7QUFDSCwrQkFDRSxBQUEyQixLQUMzQixBQUF5QjtRQUN6QixBQUFNLCtEQUFHLEFBQUk7O0FBRWIsVUFBTSxBQUFjLGlCQUFHLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFJLEFBQUMsQUFBQztBQUU3QyxBQUFFLEFBQUMsUUFBQyxDQUFDLEFBQWMsQUFBQyxnQkFBQyxBQUFDO0FBQ3BCLEFBQU0sZUFBQyxBQUFLLEFBQUMsc0JBQWUsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFJLElBQWtDLEFBQUMsQUFBQyxBQUM5RTtBQUFDO0FBRUQsVUFBTSxBQUFNLFNBQUcsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFNLEFBQUM7QUFDOUIsVUFBTSxBQUFNLFNBQUcsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFJLEFBQUM7QUFFNUIsQUFBRSxBQUFDLFFBQUMsQ0FBQyxBQUFNLEFBQUMsUUFBQyxBQUFDO0FBQ1osQUFBTSxlQUFDLEFBQUssQUFBQyxzQkFBZSxBQUFHLElBQUMsQUFBRyxJQUFDLEFBQUksSUFBMkIsQUFBQyxBQUFDLEFBQ3ZFO0FBQUM7QUFFRCxVQUFNLEFBQUksT0FBRyxBQUFlLGdCQUFDLEFBQU0sUUFBRSxBQUFHLEFBQUMsQUFBQztBQUUxQyxVQUFNLEFBQWEsZ0JBQ2pCLEFBQU0sU0FDRixBQUFHLElBQUMsQUFBTyxRQUFDLEFBQUksS0FBQyxBQUFHLEFBQUMsT0FDckIsQUFBRyxJQUFDLEFBQU8sUUFBQyxBQUFJLEtBQUMsQUFBRyxBQUFDLEFBQUM7QUFFNUIsVUFBTSxBQUFJLE9BQUcsQUFBTSxTQUNmLEFBQWMsaUJBQ2QsSUFBSSxVQUFXLFlBQUMsQUFBYyxBQUFDLEFBQUM7QUFFcEMsVUFBTSxBQUFTLFlBQUcsQUFBb0IscUJBQUMsQUFBTSxBQUFDLEFBQUM7QUFFL0MsQUFBTTtBQUNKLEFBQUk7QUFDSixBQUFJO0FBQ0osQUFBTyxrQ0FBQyxBQUFNLFFBQUUsQUFBSSxNQUFFLEFBQU8sU0FBRSxBQUFTO0FBQ3RDLEFBRUc7OztBQUNILGtCQUFNLEFBQUssUUFBRyxBQUFTLFVBQUMsQUFBTSxRQUFFLEFBQUksQUFBQyxBQUFDO0FBRXRDLEFBQUUsQUFBQyxnQkFBQyxBQUFNLEFBQUMsUUFBQyxBQUFDO0FBQ1gsQUFBRSxBQUFDLG9CQUFDLEFBQUMsRUFBQyxBQUFJLFFBQUksQUFBSSxLQUFDLEFBQUssQUFBQyxBQUFDLEFBQUMsU0FBQyxBQUFDO0FBQzNCLEFBQU8sNEJBQUMsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBTSxBQUFDLEFBQUM7QUFDNUIsMEJBQU0sQUFBRyxNQUFHLENBQUMsQUFBRyxJQUFDLEFBQUcsSUFBQyxBQUFNLFVBQUksQUFBRSxBQUFDLElBQUMsQUFBRyxJQUFFLEFBQVEsR0FBVCxJQUFjLEFBQUcsSUFBQyxBQUFLLEFBQUMsQUFBQyxBQUFDO0FBQ2pFLEFBQUksMkJBQUcsRUFBRSxBQUFHLEtBQUUsQUFBRyxBQUFFLEFBQUMsQUFDdEI7QUFBQztBQUVELEFBQU0sdUJBQUMsQUFBTSxTQUNULEFBQUcsSUFBQyxBQUFJLEtBQUMsQUFBSSxLQUFDLEFBQUssQUFBQyxPQUFDLEFBQUMsQUFBQyxBQUFDLE1BQ3hCLEFBQUcsSUFBQyxBQUFLLE1BQUMsQUFBSSxLQUFDLEFBQUssQUFBQyxBQUFDLEFBQUMsQUFDN0I7QUFBQztBQUVELEFBQTZCO0FBQzdCLGdCQUFJLEFBQVksQUFBQztBQUVqQixBQUdHOzs7O0FBQ0gsQUFBRSxBQUFDLGdCQUFDLEFBQVMsQUFBQyxXQUFDLEFBQUM7QUFDZCxBQUFPLDBCQUFHLEFBQWdCLGlCQUFDLEFBQUcsS0FBRSxBQUFTLEFBQUMsQUFBQyxBQUM3QztBQUFDO0FBRUQsQUFBTTtBQUNKLEFBQUs7QUFDTCxBQUFNLHdCQUFFLEFBQU87QUFDZixBQUFJLHNCQUFFLEFBQU8sV0FBSSxBQUFPLFFBQUMsQUFBSTtBQUM3QixBQUFJLHNCQUFFLEFBQU8sV0FBSSxBQUFPLFFBQUMsQUFBSSxBQUM5QixBQUFDLEFBQUMsQUFDTDtBQU51QixhQUFkLEFBQWE7QUFNckIsQUFDRixBQUFDLEFBQ0o7QUF4Q1M7QUF3Q1I7QUF2RWUsUUFBcUIsd0JBdUVwQztBQUdELEFBSUc7Ozs7O0FBQ0gsMEJBQ0UsQUFBMkIsS0FDM0IsQUFBd0I7QUFHeEIsVUFBTSxBQUFVLGFBQVEsRUFBRSxBQUFHLEtBQUUsQUFBQyxBQUFFLEFBQUM7QUFDbkMsVUFBTSxBQUFHLE1BQUcsQUFBSSxLQUFDLEFBQVMsVUFBQyxBQUFDLEFBQUMsQUFBQztBQUM5QixVQUFNLEFBQWdCLG1CQUFHLEFBQUcsT0FBSSxBQUFHLElBQUMsQUFBRyxPQUFJLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBTSxBQUFDO0FBQzFELFVBQU0sQUFBVSxhQUFHLEFBQUcsSUFBQyxBQUFZLGdCQUFJLEFBQUcsSUFBQyxBQUFZLGFBQUMsQUFBVSxXQUFDLEFBQUssQUFBRSxBQUFDO0FBRTNFLEFBQUUsQUFBQyxRQUFDLENBQUMsQUFBZ0Isb0JBQUksQ0FBQyxBQUFVLGNBQUksQ0FBQyxBQUFVLFdBQUMsQUFBTSxBQUFDLFFBQUMsQUFBTSxBQUFDO0FBRW5FLFFBQUksQUFBZ0MsQUFBQztBQUNyQyxXQUFPLEFBQVMsWUFBRyxBQUFVLFdBQUMsQUFBSyxBQUFFLFNBQUUsQUFBQztBQUV0QyxBQUFNLEFBQUMsZ0JBQUMsQUFBUyxVQUFDLEFBQUksQUFBQyxBQUFDLEFBQUM7QUFFdkIsaUJBQUssQUFBTztBQUFFLEFBQUM7QUFDYiwwQkFBTSxBQUFZLGVBQUcsQUFBa0IsQUFBQztBQUN4QywwQkFBTSxBQUFnQixtQkFBRyxBQUFZLGFBQUMsQUFBSSxLQUFDLEFBQUssQUFBQztBQUNqRCwwQkFBTSxBQUFRLFdBQUcsQUFBZ0IsaUJBQUMsQUFBZ0IsQUFBUSxBQUFDO0FBRTNELEFBQXlDO0FBQ3pDLEFBQUUsQUFBQyx3QkFBQyxBQUFRLFNBQUMsQUFBRyxPQUFJLEFBQVEsU0FBQyxBQUFHLElBQUMsQUFBRyxBQUFDLEtBQUMsQUFBTSxBQUFDO0FBRTdDLEFBQVUsK0JBQUMsQUFBZ0IsQUFBQyxvQkFBRyxBQUFDLEFBQUM7QUFDakMsQUFBSyxBQUFDLEFBQ1I7QUFBQztBQUVELEFBRUc7OztBQUNILGlCQUFLLEFBQWdCO0FBQUUsQUFBQztBQUN0QiwwQkFBTSxBQUFjLGlCQUFHLEFBQTJCLEFBQUM7QUFDbkQsMEJBQU0sQUFBUSxXQUFHLEFBQUksS0FBQyxBQUFTLFVBQUMsQUFBYyxlQUFDLEFBQUksS0FBQyxBQUFLLEFBQUMsQUFBQztBQUMzRCxBQUFVLCtCQUFDLEFBQUksQUFBQywwQ0FBRyxBQUFRLFNBQUMsQUFBWSxhQUFDLEFBQVUsQUFBQyxBQUFDO0FBQ3JELEFBQUssQUFBQyxBQUNSO0FBQUMsQUFFSCxBQUFDLEFBRUg7O0FBQUM7QUFFRCxBQUFNLFdBQUMsQUFBVSxBQUFDLEFBQ3BCO0FBQUM7QUE1Q2UsUUFBZ0IsbUJBNEMvQjtBQUdELEFBRUc7OztBQUNILHlCQUNFLEFBQStCLFFBQy9CLEFBQXlCO0FBRXpCLFVBQU0sQUFBTSxTQUFrQyxBQUFFLEFBQUM7QUFFakQsQUFBRyxBQUFDLFNBQUMsTUFBTSxBQUFTLGFBQUksQUFBTSxBQUFDLFFBQUMsQUFBQztBQUMvQixBQUEwQztBQUMxQyxjQUFNLEFBQUssUUFBSSxBQUFNLE9BQUMsQUFBUyxBQUFTLFdBQUMsQUFBaUMsQUFBQztBQUUzRSxBQUFFLEFBQUMsWUFBQyxBQUFLLE1BQUMsQUFBRSxBQUFJLE1BQUMsQUFBSyxNQUFDLEFBQUUsT0FBSyxBQUFRLEFBQUMsQUFBSSxZQUFDLEFBQUssTUFBQyxBQUFFLE9BQUssQUFBTyxBQUFDLEFBQUMsU0FBQyxBQUFDO0FBQ2xFLGtCQUFNLEFBQVMsWUFBRyxBQUF3Qix5QkFDeEMsQUFBSyxPQUFFLEFBQUcsS0FBRSxBQUFTLFdBQUUsQUFBRSxJQUFFLEFBQUksQUFDaEMsQUFBQztBQUVGLEFBQUUsQUFBQyxnQkFBQyxBQUFTLGFBQUksVUFBVSxXQUFDLEFBQVMsVUFBQyxBQUFJLEFBQUMsQUFBQyxPQUFDLEFBQUM7QUFDNUMsQUFBTSx1QkFBQyxBQUFTLEFBQUM7QUFDZixBQUFJLDBCQUFFLElBQUksVUFBVyxZQUFDLEFBQVMsVUFBQyxBQUFJLEFBQUMsQUFDdEMsQUFBQyxBQUNKO0FBSHNCO0FBR3JCO0FBQUEsQUFBQyxBQUNKO0FBQUM7QUFFRCxBQUFFLEFBQUMsWUFBQyxBQUFLLE1BQUMsQUFBSSxBQUFJLFFBQUMsQUFBSyxNQUFDLEFBQUUsT0FBSyxBQUFPLFdBQUksQUFBSyxNQUFDLEFBQUUsTUFBSSxBQUFLLE1BQUMsQUFBRSxHQUFDLEFBQUksQUFBQyxBQUFDLE1BQUMsQUFBQztBQUN0RSxBQUFNLG1CQUFDLEFBQVMsQUFBQztBQUNmLEFBQUksc0JBQUUsSUFBSSxVQUFXLFlBQUMsVUFBUyxBQUFDLEFBQ2pDLEFBQUMsQUFDSjtBQUhzQjtBQUdyQixBQUVIO0FBQUM7QUFDRCxBQUFNLFdBQUMsQUFBTSxBQUFDLEFBQ2hCO0FBQUM7QUE5QmUsUUFBZSxrQkE4QjlCO0FBR0QsQUFFRzs7O0FBQ0gsOEJBQ0UsQUFBK0I7QUFFL0IsQUFBTSxXQUFDLFVBQVUsQUFBVyxRQUFFLEFBQVM7QUFDckMsQUFBRSxBQUFDLFlBQUMsQ0FBQyxBQUFJLEFBQUMsTUFBQyxBQUFNLE9BQUMsQUFBRSxBQUFDO0FBRXJCLGNBQU0sQUFBSyxRQUFRLEFBQUUsQUFBQztBQUN0QixBQUFHLEFBQUMsYUFBQyxNQUFNLEFBQUksUUFBSSxBQUFJLEFBQUMsTUFBQyxBQUFDO0FBQ3hCLEFBQStCO0FBQy9CLGtCQUFNLEFBQUssUUFBSSxBQUFNLE9BQUMsQUFBSSxBQUFTLE1BQUMsQUFBaUMsQUFBQztBQUN0RSxBQUFFLEFBQUMsZ0JBQUUsQUFBSyxNQUFDLEFBQUksQUFDWCxRQUFDLEFBQUssTUFBQyxBQUFFLE9BQUssQUFBUyxBQUFDLEFBQ3hCLGFBQUMsQUFBSyxNQUFDLEFBQUUsT0FBSyxBQUFPLFdBQUksQUFBSyxNQUFDLEFBQUUsTUFBSSxBQUFLLE1BQUMsQUFBRSxHQUFDLEFBQUksQUFBQyxBQUFDLE1BQUMsQUFBQztBQUN4RCxBQUFLLHNCQUFDLEFBQUksQUFBQztBQUNULEFBQUcseUJBQUUsQUFBRSxHQUFDLEFBQU0sT0FBQyxBQUFJLEtBQUMsQUFBSSxBQUFDLEFBQUMsT0FBQyxBQUFHLElBQUUsQUFBTyxFQUFSLElBQWEsSUFBSSxVQUFRLFNBQUMsQUFBRSxBQUFDLEFBQUMsQUFDOUQsQUFBQyxBQUNKO0FBSGdCO0FBR2YsQUFBQyxBQUFJLG1CQUFDLEFBQUM7QUFDTixBQUFLLHNCQUFDLEFBQUksQUFBQztBQUNULEFBQUcseUJBQUUsQUFBSSxLQUFDLEFBQUksQUFBQyxBQUNoQixBQUFDLEFBQ0o7QUFIZ0I7QUFHZixBQUNIO0FBQUM7QUFFRCxBQUFNLGVBQUMsQUFBSyxBQUFDLEFBQ2Y7QUFBQyxBQUFDLEFBQ0o7QUFBQztBQXpCZSxRQUFvQix1QkF5Qm5DO0FBR0QsQUFHRzs7OztBQUNILDBCQUNFLEFBQXFELFFBQ3JELEFBQXlCO1FBQ3pCLEFBQUksNkRBQUcsQUFBRTs7QUFFVCxBQUFNLFdBQUM7QUFDTCxjQUFNLEFBQVMsWUFBMEIsQUFBRSxBQUFDO0FBRTVDLEFBQUUsQUFBQyxZQUFDLENBQUMsQUFBTSxBQUFDLFFBQUMsQUFBTSxPQUFDLEFBQUssQUFBQyxNQUFzQyxBQUFDLEFBQUM7QUFFbEUsWUFBSSxBQUFTLFlBQUcsQUFBSyxBQUFDO0FBQ3RCLEFBQUcsQUFBQyxhQUFDLE1BQU0sQUFBUyxhQUFJLEFBQU0sQUFBQyxRQUFDLEFBQUM7QUFDL0IsQUFBUyx3QkFBRyxBQUFJLEFBQUM7QUFDakIsa0JBQU0sQUFBSyxRQUFHLEFBQU0sT0FBQyxBQUFTLEFBQUMsQUFBQztBQUNoQyxrQkFBTSxBQUFXLGNBQUcsQUFBd0IseUJBQzFDLEFBQUssT0FBRSxBQUFHLEtBQUUsQUFBUyxBQUFFLGVBQUcsQUFBSSxTQUFHLEFBQVMsU0FBRSxLQUFFLEFBQUksQUFDbkQsQUFBQztBQUNGLEFBQUUsQUFBQyxnQkFBQyxBQUFXLEFBQUMsYUFBQyxBQUFDO0FBQ2hCLEFBQVMsMEJBQUMsQUFBUyxBQUFDLGFBQUcsQUFBVyxBQUFDLEFBQ3JDO0FBQUMsQUFDSDtBQUFDO0FBRUQsQUFBRSxBQUFDLFlBQUMsQ0FBQyxBQUFTLEFBQUMsV0FBQyxBQUFNLE9BQUMsQUFBSyxBQUMxQixnQkFBUyxBQUFJLElBQXdDLEFBQ3RELEFBQUM7QUFFRixBQUFNLGVBQUMsQUFBUyxBQUFDLEFBQ25CO0FBQUMsQUFBQyxBQUNKO0FBQUM7QUE1QmUsUUFBZ0IsbUJBNEIvQjtBQUdELEFBRUc7OztBQUNILGtDQUNFLEFBQTBDLE9BQzFDLEFBQXlCLEtBQ3pCLEFBQWlCLFdBQ2pCLEFBQVksTUFDWixBQUFlO0FBR2YsQUFBRSxBQUFDLFFBQUMsT0FBTyxBQUFLLFVBQUssQUFBUSxBQUFDLFVBQUMsQUFBQztBQUM5QixBQUFNLGVBQUMsQUFBd0IseUJBQzdCLEVBQUUsQUFBRSxJQUFFLEFBQUssQUFBRSxTQUFFLEFBQUcsS0FBRSxBQUFTLFdBQUUsQUFBSSxNQUFFLEFBQU0sQUFDNUMsQUFBQyxBQUNKO0FBQUM7QUFFRCxBQUF3QztBQUN4QyxBQUFFLEFBQUMsUUFBQyxBQUFLLFNBQUksQUFBSyxBQUFDLE9BQUMsQUFBQztBQUNuQixBQUFLLGdCQUFJLEFBQWEsTUFBQyxBQUFpQyxBQUFDLEFBQzNEO0FBQUM7QUFFRCxBQUVHOzs7QUFDSCxVQUFNLEFBQUksT0FBSSxBQUF1QixJQUF4QixJQUNYLEFBQU0sU0FBRyxBQUFJLE9BQUcsSUFBSSxVQUFXLFlBQUMsQUFBSSxBQUFDLEFBQUM7QUFHeEMsQUFBRSxBQUFDLFFBQUMsQUFBSyxNQUFDLEFBQUksQUFBQyxNQUFDLEFBQUM7QUFDZixjQUFNLEFBQUcsTUFBRyxVQUFHLElBQUMsQUFBTSxPQUFDLEFBQUssTUFBQyxBQUFJLEFBQUMsQUFBQztBQUNuQyxjQUFNLEFBQVEsV0FBRyxBQUFxQixzQkFBQyxBQUFHLEtBQUUsQUFBRyxLQUFFLEFBQU0sQUFBQyxBQUFDO0FBQ3pELGNBQU0sQUFBUyxZQUFHLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBTSxBQUFDO0FBRWpDLEFBQUUsQUFBQyxZQUFDLENBQUMsQUFBUyxBQUFDLFdBQUMsQUFBTSxPQUFDLEFBQUssQUFDMUIseUNBQWtDLEFBQUcsSUFBQyxBQUFHLElBQUMsQUFBSSxJQUFFLEFBQ2pELEFBQUM7QUFFRixBQUFNO0FBQ0osQUFBSSxrQkFBRSxBQUFRLFNBQUMsQUFBSTtBQUNuQixBQUFJLGtCQUFFLEFBQWUsZ0JBQUMsQUFBUyxXQUFFLEFBQUcsQUFBQztBQUNyQyxBQUFPLHNDQUFDLEFBQU0sUUFBRSxBQUFJLE1BQUUsQUFBTyxTQUFFLEFBQUk7QUFDakMsc0JBQU0sQUFBUyxZQUFHLEFBQU0sT0FBQyxBQUFTLEFBQUMsQUFBQztBQUNwQyxBQUFJLHVCQUFHLEFBQUksUUFBSSxBQUFFLEFBQUM7QUFFbEIsQUFBRSxBQUFDLG9CQUFDLENBQUMsQUFBUyxBQUFDLFdBQUMsQUFBTSxPQUFDLEFBQU0sU0FBRyxBQUFJLE9BQUcsQUFBRSxBQUFDO0FBRTFDLEFBQUUsQUFBQyxvQkFBQyxDQUFDLEFBQVEsU0FBQyxBQUFPLEFBQUMsU0FBQyxBQUFDO0FBQ3RCLEFBQU0sMkJBQUMsQUFBSyxBQUNWLDZEQUFzRCxBQUFLLE1BQUMsQUFBSSxJQUFFLEFBQ25FLEFBQUMsQUFDSjtBQUFDO0FBRUQsc0JBQU0sQUFBTyxVQUFHLEFBQUUsR0FBQyxBQUFNLE9BQUMsQUFBUyxBQUFDLEFBQUM7QUFDckMsc0JBQU0sQUFBUSxXQUFRLEFBQUUsQUFBQztBQUV6QixBQUFFLEFBQUMsb0JBQUMsQUFBSSxLQUFDLEFBQUssQUFBQyxBQUFDLFFBQUMsQUFBQztBQUNoQiwwQkFBTSxBQUFNLEFBQUcsU0FBQyxBQUFLLE1BQUMsQUFBTyxRQUFDLEFBQUksS0FBQyxBQUFLLEFBQUMsQUFBQyxVQUN0QyxBQUFJLEtBQUMsQUFBSyxBQUFDLFNBQ1gsQ0FBRSxBQUFJLEtBQUMsQUFBSyxBQUFDLEFBQUUsQUFBYSxBQUFDO0FBRWpDLDBCQUFNLEFBQVEsV0FBRyxJQUFJLEFBQUcsSUFBQyxBQUFNLEFBQUMsQUFBQztBQUVqQyxBQUFRLDZCQUFDLEFBQUssQUFBQyxTQUFHLEFBQU8sUUFDdEIsQUFBTSxPQUFFLEFBQU8sRUFBUixJQUFhLEFBQVEsU0FBQyxBQUFHLElBQUMsQUFBRSxHQUFDLEFBQVEsQUFBRSxBQUFDLEFBQUMsQUFBQyxBQUV0RDtBQUFDLEFBQUMsQUFBSSx1QkFBQyxBQUFDO0FBQ04sQUFBUSw2QkFBQyxBQUFLLEFBQUMsU0FBRyxBQUFPLEFBQUMsQUFDNUI7QUFBQztBQUVELEFBQU0sdUJBQUMsQUFBUSxTQUFDLEFBQU8sUUFBQyxBQUFNLFFBQUUsQUFBUSxVQUFFLEFBQU8sU0FBRSxBQUFJLEFBQUMsQUFBQyxBQUMzRDtBQUFDLEFBQ0YsQUFBQyxBQUNKO0FBbkNTO0FBbUNSO0FBRUQsQUFBRSxBQUFDLFFBQUMsQ0FBQyxBQUFLLE1BQUMsQUFBRSxBQUFDLElBQUMsQUFBQztBQUNkLEFBQU0sZUFBQyxBQUFLLEFBQUMsc0NBQStCLEFBQUksSUFBRyxBQUFDLEFBQUMsQUFDdkQ7QUFBQztBQUVELEFBQU0sQUFBQyxZQUFDLEFBQUssTUFBQyxBQUFFLEFBQUMsQUFBQyxBQUFDO0FBRWpCLGFBQUssQUFBUSxBQUFDO0FBQ2QsYUFBSyxBQUFLLEFBQUM7QUFDWCxhQUFLLEFBQU8sQUFBQztBQUNiLGFBQUssQUFBTyxBQUFDO0FBQ2IsYUFBSyxBQUFVLEFBQUM7QUFDaEIsYUFBSyxBQUFNLEFBQUM7QUFDWixhQUFLLEFBQUs7QUFDUixBQUFNO0FBQ0osQUFBSSxzQkFBRSxBQUFJLEtBQUMsVUFBYSxBQUFDLEFBQzFCLEFBQUM7QUFGSztBQUlULGFBQUssQUFBUztBQUNaLEFBQU07QUFDSixBQUFJLHNCQUFFLEFBQUksS0FBQyxVQUFjLEFBQUMsQUFDM0IsQUFBQztBQUZLO0FBSVQsYUFBSyxBQUFRO0FBQ1gsQUFBTTtBQUNKLEFBQUksc0JBQUUsQUFBSSxLQUFDLFVBQVksQUFBQyxBQUN6QixBQUFDO0FBRks7QUFJVCxhQUFLLEFBQVM7QUFDWixBQUFNO0FBQ0osQUFBSSxzQkFBRSxBQUFJLEtBQUMsVUFBVSxBQUFDLEFBQ3ZCLEFBQUM7QUFGSztBQUlULGFBQUssQUFBUztBQUNaLEFBQU07QUFDSixBQUFJLHNCQUFFLEFBQUksS0FBQyxVQUFTLEFBQUMsQUFDdEIsQUFBQztBQUZLO0FBSVQsYUFBSyxBQUFPO0FBQUUsQUFBQztBQUNiLEFBQUUsQUFBQyxvQkFBQyxDQUFDLEFBQUssTUFBQyxBQUFFLEFBQUMsSUFBQyxBQUFDO0FBQ2QsQUFBTSwyQkFBQyxBQUFLLEFBQUMsd0NBQWlDLEFBQUksSUFBRyxBQUFDLEFBQUMsQUFDekQ7QUFBQztBQUVELHNCQUFNLEFBQU8sVUFBRyxBQUF3Qix5QkFDdEMsQUFBSyxNQUFDLEFBQUUsSUFBRSxBQUFHLEtBQUUsQUFBUyxBQUFFLGVBQUcsQUFBSSxJQUFHLE1BQUUsQUFBSyxBQUM1QyxBQUFDO0FBRUYsQUFBRSxBQUFDLG9CQUFDLENBQUMsQUFBTyxBQUFDLFNBQUMsQUFBQztBQUNiLEFBQUksQUFBQyxxREFBMkIsQUFBSSxJQUFrQyxBQUFDLEFBQUM7QUFDeEUsQUFBTSxBQUFDLEFBQ1Q7QUFBQztBQUVELEFBQUUsQUFBQyxvQkFBQyxVQUFVLFdBQUMsQUFBTyxRQUFDLEFBQUksQUFBQyxBQUFDLE9BQUMsQUFBQztBQUM3QixBQUFNO0FBQ0osQUFBSSw4QkFBRSxBQUFPLFFBQUMsQUFBSSxBQUNuQixBQUFDLEFBQ0o7QUFIUztBQUdSLEFBQUMsQUFBSSx1QkFBQyxBQUFDO0FBQ04sQUFBTTtBQUNKLEFBQUksOEJBQUUsQUFBTyxRQUFDLEFBQUk7QUFDbEIsQUFBSSw4QkFBRSxBQUFPLFFBQUMsQUFBSTtBQUNsQixBQUFPLGlDQUFFLEFBQU8sUUFBQyxBQUFPLEFBQ3pCLEFBQUMsQUFDSjtBQUxTO0FBS1IsQUFDSDtBQUFDO0FBRUQsYUFBSyxBQUFRO0FBQUUsQUFBQztBQUNkLHNCQUFNLEFBQU0sU0FBRyxBQUFLLE1BQUMsQUFBTSxBQUFDO0FBRTVCLEFBQUUsQUFBQyxvQkFBQyxDQUFDLEFBQU0sQUFBQyxRQUFDLEFBQUM7QUFDWixBQUFJLEFBQUMsNERBQWtDLEFBQUksSUFBdUIsQUFBQyxBQUFDO0FBQ3BFLEFBQU0sQUFBQyxBQUNUO0FBQUM7QUFFRCxzQkFBTSxBQUFTLFlBQUcsQUFBZ0IsaUJBQUMsQUFBTSxRQUFFLEFBQUcsQUFBRSxTQUFHLEFBQUksSUFBRyxBQUFDLEFBQUM7QUFFNUQsQUFBRSxBQUFDLG9CQUFDLENBQUMsQUFBUyxBQUFDLFdBQUMsQUFBQztBQUNmLEFBQUksQUFBQyw0REFBa0MsQUFBSSxJQUF1QixBQUFDLEFBQUM7QUFDcEUsQUFBTSxBQUFDLEFBQ1Q7QUFBQztBQUVELHNCQUFNLEFBQUksV0FBTyxVQUFpQjtBQUNoQyxBQUFJLEFBQUUsOEJBQUcsQUFBSSxVQUFJLEFBQVMsU0FBRTtBQUM1QixBQUFNLDRCQUFFLEFBQVMsQUFDbEIsQUFBQyxBQUFDO0FBSGdDLGlCQUF0QjtBQUtiLEFBQU07QUFDSixBQUFJLDBCQUFFLEFBQUksS0FBQyxBQUFJLEFBQUMsQUFDakIsQUFBQyxBQUNKO0FBSFM7QUFHUjtBQUVEO0FBQVMsQUFBTSxtQkFBQyxBQUFLLEFBQ25CLDhCQUF1QixBQUFLLE1BQUMsQUFBRSw0QkFBd0IsQUFBSSxJQUFHLEFBQy9ELEFBQUMsQUFDSixBQUFDLEFBRUg7O0FBQUM7QUF0S2UsUUFBd0IsMkJBc0t2QyJ9 |
{ | ||
"name": "tyranid-graphql", | ||
"version": "0.0.6", | ||
"version": "0.0.7", | ||
"description": "GraphQL plugin for tyranid", | ||
@@ -18,3 +18,3 @@ "main": "dist-node4/src/index.js", | ||
"author": "bsouthga@gmail.com", | ||
"license": "MIT", | ||
"license": "Apache-2.0", | ||
"devDependencies": { | ||
@@ -40,3 +40,3 @@ "@types/body-parser": "0.0.32", | ||
"typescript": "^2.0.2", | ||
"tyranid": "^0.1.6" | ||
"tyranid": "^0.1.7" | ||
}, | ||
@@ -43,0 +43,0 @@ "dependencies": { |
186
src/index.ts
import { Tyr } from 'tyranid'; | ||
import { ObjectID } from 'mongodb'; | ||
import { | ||
@@ -19,9 +20,29 @@ graphql, | ||
GraphQLResolveInfo, | ||
Selection, | ||
Field, | ||
FragmentSpread, | ||
isLeafType | ||
} from 'graphql'; | ||
export type GraphQLOutputTypeMap = Map<string, GraphQLOutputType>; | ||
export type GraphQLOutputTypeMap = | ||
Map<string, GraphQLOutputType>; | ||
function warn( | ||
message: string | ||
) { | ||
console.warn(`tyranid-graphql: WARNING -- ${message}`); | ||
} | ||
function error( | ||
message: string | ||
): never { | ||
throw new Error(`tyranid-graphql: ERROR -- ${message}`); | ||
} | ||
/** | ||
@@ -31,7 +52,14 @@ * adds a `graphql(query)` method to tyranid which returns | ||
*/ | ||
export function graphqlize(tyr: typeof Tyr) { | ||
export function graphqlize( | ||
tyr: typeof Tyr | ||
): void { | ||
const schema = createGraphQLSchema(tyr); | ||
tyr.graphql = <Tyr.TyranidGraphQLFunction> Object.assign( | ||
function ({ query, auth, variables, perm = 'view' }: Tyr.TyranidGraphQlQueryOptions) { | ||
tyr.graphql = Object.assign( | ||
function ({ | ||
query, | ||
auth, | ||
variables, | ||
perm = 'view' | ||
}: Tyr.TyranidGraphQlQueryOptions) { | ||
const context = { | ||
@@ -45,19 +73,10 @@ auth, | ||
{ schema } | ||
); | ||
) as Tyr.TyranidGraphQLFunction; | ||
} | ||
function warn(message: string) { | ||
console.warn(`tyranid-graphql: WARNING -- ${message}`); | ||
} | ||
function error(message: string): never { | ||
throw new Error(`tyranid-graphql: ERROR -- ${message}`); | ||
} | ||
/** | ||
* tyranid schema -> graphql schema | ||
*/ | ||
export function createGraphQLSchema(tyr: typeof Tyr) { | ||
export function createGraphQLSchema( | ||
tyr: typeof Tyr | ||
): GraphQLSchema { | ||
const typeMap: GraphQLOutputTypeMap = new Map(); | ||
@@ -78,3 +97,6 @@ const queryFields: GraphQLFieldConfigMap = {}; | ||
queryFields[name] = collectionFieldConfig(col, typeMap, true); | ||
queryFields[name + 's'] = collectionFieldConfig(col, typeMap, false); | ||
// TODO: less hacky... | ||
const suffix = name[name.length - 1] === 's' ? 'es' : 's'; | ||
queryFields[name + suffix] = collectionFieldConfig(col, typeMap, false); | ||
}); | ||
@@ -107,2 +129,3 @@ | ||
const fields = col.def.fields; | ||
const isEnum = col.def.enum; | ||
@@ -135,2 +158,14 @@ if (!fields) { | ||
if (isEnum) { | ||
if (!(args && args['_id'])) { | ||
console.log(col.def.values); | ||
const ids = (col.def.values || []).map((row: any) => row['_id']); | ||
args = { _id: ids }; | ||
} | ||
return single | ||
? col.byId(args['_id'][0]) | ||
: col.byIds(args['_id']); | ||
} | ||
// default to full projection | ||
@@ -144,3 +179,3 @@ let project: any; | ||
if (operation) { | ||
project = createProjection(operation); | ||
project = createProjection(col, operation); | ||
} | ||
@@ -164,26 +199,43 @@ | ||
*/ | ||
export function createProjection(info: GraphQLResolveInfo): any { | ||
// TODO: PR graphql typings to add path prop | ||
const path = (info as any).path as string[]; | ||
export function createProjection( | ||
col: Tyr.CollectionInstance, | ||
info: GraphQLResolveInfo | ||
): any { | ||
let selections = info.operation.selectionSet.selections; | ||
for (const fieldName of path) { | ||
for (const selection of selections) { | ||
const field = selection as Field; | ||
if (fieldName === field.name.value) { | ||
if (field.selectionSet) { | ||
selections = field.selectionSet.selections; | ||
continue; | ||
} | ||
const projection: any = { _id: 1 }; | ||
const ast = info.fieldASTs[0]; | ||
const collectionFields = col && col.def && col.def.fields; | ||
const selections = ast.selectionSet && ast.selectionSet.selections.slice(); | ||
if (!collectionFields || !selections || !selections.length) return; | ||
let selection: Selection | undefined; | ||
while (selection = selections.shift()) { | ||
switch (selection.kind) { | ||
case 'Field': { | ||
const graphQlField = selection as Field; | ||
const graphQLFieldName = graphQlField.name.value; | ||
const tyrField = collectionFields[graphQLFieldName] as any; | ||
// computed property found, no projection | ||
if (tyrField.def && tyrField.def.get) return; | ||
projection[graphQLFieldName] = 1; | ||
break; | ||
} | ||
} | ||
} | ||
if (!selections || !selections.length) return; | ||
/** | ||
* For fragments, add selection set to array and continue | ||
*/ | ||
case 'FragmentSpread': { | ||
const fragmentSpread = selection as FragmentSpread; | ||
const fragment = info.fragments[fragmentSpread.name.value]; | ||
selections.push(...fragment.selectionSet.selections); | ||
break; | ||
} | ||
const projection: any = { _id: 1 }; | ||
} | ||
for (const selection of selections) { | ||
const field = selection as Field; | ||
projection[field.name.value] = 1; | ||
} | ||
@@ -206,6 +258,9 @@ | ||
// TODO: why do we need to grab def again? | ||
const field = <Tyr.TyranidFieldDefinition> (fields[fieldName] as any).def; | ||
const field = (fields[fieldName] as any).def as Tyr.TyranidFieldDefinition; | ||
if (field.is && (field.is !== 'object') && (field.is !== 'array')) { | ||
const fieldType = createGraphQLFieldConfig(field, map, fieldName, '', true); | ||
const fieldType = createGraphQLFieldConfig( | ||
field, map, fieldName, '', true | ||
); | ||
if (fieldType && isLeafType(fieldType.type)) { | ||
@@ -241,3 +296,3 @@ argMap[fieldName] = { | ||
// TODO: fix typings on tyranid | ||
const field = <Tyr.TyranidFieldDefinition> (fields[prop] as any).def; | ||
const field = (fields[prop] as any).def as Tyr.TyranidFieldDefinition; | ||
if ( field.link || | ||
@@ -262,3 +317,4 @@ (field.is === 'mongoid') || | ||
/** | ||
* Create lazy value to contain fields for a particular tyranid field definition object | ||
* Create lazy value to contain fields for a | ||
* particular tyranid field definition object | ||
*/ | ||
@@ -279,3 +335,5 @@ export function createFieldThunk( | ||
const field = fields[fieldName]; | ||
const fieldConfig = createGraphQLFieldConfig(field, map, fieldName, `${path}${fieldName}`, true); | ||
const fieldConfig = createGraphQLFieldConfig( | ||
field, map, fieldName, `${path}${fieldName}`, true | ||
); | ||
if (fieldConfig) { | ||
@@ -286,3 +344,5 @@ fieldsObj[fieldName] = fieldConfig; | ||
if (!hasFields) return error(`path "${path}" has no entries in its fields object!`); | ||
if (!hasFields) return error( | ||
`path "${path}" has no entries in its fields object!` | ||
); | ||
@@ -298,3 +358,3 @@ return fieldsObj; | ||
export function createGraphQLFieldConfig( | ||
field: Tyr.TyranidFieldDefinition, | ||
field: Tyr.TyranidFieldDefinition | string, | ||
map: GraphQLOutputTypeMap, | ||
@@ -307,4 +367,5 @@ fieldName: string, | ||
if (typeof field === 'string') { | ||
warn(`Ignoring field: "${field}" at path "${path}" as it is a string`); | ||
return; | ||
return createGraphQLFieldConfig( | ||
{ is: field }, map, fieldName, path, single | ||
); | ||
} | ||
@@ -314,4 +375,3 @@ | ||
if ('def' in field) { | ||
// grab def property on field and recast | ||
field = ((field as any).def as Tyr.TyranidFieldDefinition); | ||
field = (field as any).def as Tyr.TyranidFieldDefinition; | ||
} | ||
@@ -331,3 +391,5 @@ | ||
if (!colFields) return error(`No fields found for collection ${col.def.name}`); | ||
if (!colFields) return error( | ||
`No fields found for collection ${col.def.name}` | ||
); | ||
@@ -337,3 +399,3 @@ return { | ||
args: createArguments(colFields, map), | ||
resolve(parent, args, context, ast) { | ||
resolve(parent, args, context, info) { | ||
const linkField = parent[fieldName]; | ||
@@ -345,3 +407,5 @@ args = args || {}; | ||
if (!linkType.resolve) { | ||
return error(`No linkType resolve function found for collection: ${field.link}`); | ||
return error( | ||
`No linkType resolve function found for collection: ${field.link}` | ||
); | ||
} | ||
@@ -353,9 +417,11 @@ | ||
if (args['_id']) { | ||
const argIds = <string[]> (Array.isArray(args['_id']) | ||
const argIds = (Array.isArray(args['_id']) | ||
? args['_id'] | ||
: [ args['_id'] ]); | ||
: [ args['_id'] ]) as string[]; | ||
const argIdSet = new Set(argIds); | ||
linkArgs['_id'] = linkIds.filter((id: any) => argIdSet.has(id.toString())); | ||
linkArgs['_id'] = linkIds | ||
.filter((id: any) => argIdSet.has(id.toString())); | ||
} else { | ||
@@ -365,3 +431,3 @@ linkArgs['_id'] = linkIds; | ||
return linkType.resolve(parent, linkArgs, context, ast); | ||
return linkType.resolve(parent, linkArgs, context, info); | ||
} | ||
@@ -413,3 +479,5 @@ }; | ||
const subtype = createGraphQLFieldConfig(field.of, map, fieldName, `${path}_`, false); | ||
const subtype = createGraphQLFieldConfig( | ||
field.of, map, fieldName, `${path}_`, false | ||
); | ||
@@ -445,3 +513,3 @@ if (!subtype) { | ||
if (!defFields) { | ||
warn(`Ignoring object field at path "${path}" as it has poorly defined schema`); | ||
warn(`Ignoring object field at path "${path}" as it has no schema`); | ||
return; | ||
@@ -461,3 +529,3 @@ } | ||
default: return error( | ||
`Unable to map type "${field.is}" for field at path "${path}" to GraphQLType instance` | ||
`Unable to map type "${field.is}" for field at path "${path}"` | ||
); | ||
@@ -464,0 +532,0 @@ } |
88646
12
1233