New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@aws-amplify/graphql-searchable-transformer

Package Overview
Dependencies
Maintainers
10
Versions
451
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@aws-amplify/graphql-searchable-transformer - npm Package Compare versions

Comparing version 0.15.3 to 0.15.4-alpha.0

2

lib/cdk/create-cfnOutput.js

@@ -15,3 +15,3 @@ "use strict";

new core_2.CfnOutput(stack, OpenSearchDomainEndpoint, {
value: 'https://' + endpoint,
value: `https://${endpoint}`,
description: 'OpenSearch instance Domain Endpoint.',

@@ -18,0 +18,0 @@ exportName: core_1.Fn.join(':', [apiId, 'GetAtt', 'OpenSearch', 'DomainEndpoint']).toString(),

import { CfnParameter, Stack } from '@aws-cdk/core';
export declare function createParametersStack(stack: Stack): Map<string, CfnParameter>;
export declare const createParametersStack: (stack: Stack) => Map<string, CfnParameter>;
//# sourceMappingURL=create-cfnParameters.d.ts.map

@@ -6,3 +6,3 @@ "use strict";

const core_1 = require("@aws-cdk/core");
function createParametersStack(stack) {
const createParametersStack = (stack) => {
const { OpenSearchAccessIAMRoleName, OpenSearchStreamingLambdaHandlerName, OpenSearchStreamingLambdaRuntime, OpenSearchStreamingFunctionName, OpenSearchStreamBatchSize, OpenSearchStreamMaximumBatchingWindowInSeconds, OpenSearchStreamingIAMRoleName, OpenSearchDebugStreamingLambda, OpenSearchInstanceCount, OpenSearchInstanceType, OpenSearchEBSVolumeGB, } = graphql_transformer_common_1.ResourceConstants.PARAMETERS;

@@ -27,4 +27,4 @@ return new Map([

new core_1.CfnParameter(stack, OpenSearchStreamingLambdaRuntime, {
description: `The lambda runtime \
(https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html#SSS-CreateFunction-request-Runtime)`,
description: 'The lambda runtime \
(https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html#SSS-CreateFunction-request-Runtime)',
default: 'python3.6',

@@ -193,4 +193,4 @@ }),

]);
}
};
exports.createParametersStack = createParametersStack;
//# sourceMappingURL=create-cfnParameters.js.map
import { CfnMapping, Construct } from '@aws-cdk/core';
export declare function setMappings(scope: Construct): CfnMapping;
export declare const setMappings: (scope: Construct) => CfnMapping;
//# sourceMappingURL=create-layer-cfnMapping.d.ts.map

@@ -5,78 +5,76 @@ "use strict";

const core_1 = require("@aws-cdk/core");
function setMappings(scope) {
return new core_1.CfnMapping(scope, 'LayerResourceMapping', {
mapping: {
'ap-northeast-1': {
layerRegion: 'arn:aws:lambda:ap-northeast-1:249908578461:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-east-1': {
layerRegion: 'arn:aws:lambda:us-east-1:668099181075:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-southeast-1': {
layerRegion: 'arn:aws:lambda:ap-southeast-1:468957933125:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-west-1': {
layerRegion: 'arn:aws:lambda:eu-west-1:399891621064:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-west-1': {
layerRegion: 'arn:aws:lambda:us-west-1:325793726646:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-east-1': {
layerRegion: 'arn:aws:lambda:ap-east-1:118857876118:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-northeast-2': {
layerRegion: 'arn:aws:lambda:ap-northeast-2:296580773974:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-northeast-3': {
layerRegion: 'arn:aws:lambda:ap-northeast-3:961244031340:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-south-1': {
layerRegion: 'arn:aws:lambda:ap-south-1:631267018583:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-southeast-2': {
layerRegion: 'arn:aws:lambda:ap-southeast-2:817496625479:layer:AWSLambda-Python-AWS-SDK:1',
},
'ca-central-1': {
layerRegion: 'arn:aws:lambda:ca-central-1:778625758767:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-central-1': {
layerRegion: 'arn:aws:lambda:eu-central-1:292169987271:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-north-1': {
layerRegion: 'arn:aws:lambda:eu-north-1:642425348156:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-west-2': {
layerRegion: 'arn:aws:lambda:eu-west-2:142628438157:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-west-3': {
layerRegion: 'arn:aws:lambda:eu-west-3:959311844005:layer:AWSLambda-Python-AWS-SDK:1',
},
'sa-east-1': {
layerRegion: 'arn:aws:lambda:sa-east-1:640010853179:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-east-2': {
layerRegion: 'arn:aws:lambda:us-east-2:259788987135:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-west-2': {
layerRegion: 'arn:aws:lambda:us-west-2:420165488524:layer:AWSLambda-Python-AWS-SDK:1',
},
'cn-north-1': {
layerRegion: 'arn:aws-cn:lambda:cn-north-1:683298794825:layer:AWSLambda-Python-AWS-SDK:1',
},
'cn-northwest-1': {
layerRegion: 'arn:aws-cn:lambda:cn-northwest-1:382066503313:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-gov-west-1': {
layerRegion: 'arn:aws-us-gov:lambda:us-gov-west-1:556739011827:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-gov-east-1': {
layerRegion: 'arn:aws-us-gov:lambda:us-gov-east-1:138526772879:layer:AWSLambda-Python-AWS-SDK:1',
},
'me-south-1': {
layerRegion: 'arn:aws:lambda:me-south-1:507411403535:layer:AWSLambda-Python-AWS-SDK:1',
},
const setMappings = (scope) => new core_1.CfnMapping(scope, 'LayerResourceMapping', {
mapping: {
'ap-northeast-1': {
layerRegion: 'arn:aws:lambda:ap-northeast-1:249908578461:layer:AWSLambda-Python-AWS-SDK:1',
},
});
}
'us-east-1': {
layerRegion: 'arn:aws:lambda:us-east-1:668099181075:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-southeast-1': {
layerRegion: 'arn:aws:lambda:ap-southeast-1:468957933125:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-west-1': {
layerRegion: 'arn:aws:lambda:eu-west-1:399891621064:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-west-1': {
layerRegion: 'arn:aws:lambda:us-west-1:325793726646:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-east-1': {
layerRegion: 'arn:aws:lambda:ap-east-1:118857876118:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-northeast-2': {
layerRegion: 'arn:aws:lambda:ap-northeast-2:296580773974:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-northeast-3': {
layerRegion: 'arn:aws:lambda:ap-northeast-3:961244031340:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-south-1': {
layerRegion: 'arn:aws:lambda:ap-south-1:631267018583:layer:AWSLambda-Python-AWS-SDK:1',
},
'ap-southeast-2': {
layerRegion: 'arn:aws:lambda:ap-southeast-2:817496625479:layer:AWSLambda-Python-AWS-SDK:1',
},
'ca-central-1': {
layerRegion: 'arn:aws:lambda:ca-central-1:778625758767:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-central-1': {
layerRegion: 'arn:aws:lambda:eu-central-1:292169987271:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-north-1': {
layerRegion: 'arn:aws:lambda:eu-north-1:642425348156:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-west-2': {
layerRegion: 'arn:aws:lambda:eu-west-2:142628438157:layer:AWSLambda-Python-AWS-SDK:1',
},
'eu-west-3': {
layerRegion: 'arn:aws:lambda:eu-west-3:959311844005:layer:AWSLambda-Python-AWS-SDK:1',
},
'sa-east-1': {
layerRegion: 'arn:aws:lambda:sa-east-1:640010853179:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-east-2': {
layerRegion: 'arn:aws:lambda:us-east-2:259788987135:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-west-2': {
layerRegion: 'arn:aws:lambda:us-west-2:420165488524:layer:AWSLambda-Python-AWS-SDK:1',
},
'cn-north-1': {
layerRegion: 'arn:aws-cn:lambda:cn-north-1:683298794825:layer:AWSLambda-Python-AWS-SDK:1',
},
'cn-northwest-1': {
layerRegion: 'arn:aws-cn:lambda:cn-northwest-1:382066503313:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-gov-west-1': {
layerRegion: 'arn:aws-us-gov:lambda:us-gov-west-1:556739011827:layer:AWSLambda-Python-AWS-SDK:1',
},
'us-gov-east-1': {
layerRegion: 'arn:aws-us-gov:lambda:us-gov-east-1:138526772879:layer:AWSLambda-Python-AWS-SDK:1',
},
'me-south-1': {
layerRegion: 'arn:aws:lambda:me-south-1:507411403535:layer:AWSLambda-Python-AWS-SDK:1',
},
},
});
exports.setMappings = setMappings;
//# sourceMappingURL=create-layer-cfnMapping.js.map

@@ -12,3 +12,3 @@ "use strict";

(0, assert_1.default)(region);
const dsEndpoint = 'https://' + domainEndpoint;
const dsEndpoint = `https://${domainEndpoint}`;
return graphqlApiProvider.host.addSearchableDataSource(OpenSearchDataSourceLogicalID, region, dsEndpoint, {

@@ -15,0 +15,0 @@ serviceRole: role,

@@ -28,4 +28,4 @@ "use strict";

},
domainName: core_1.Fn.conditionIf(HasEnvironmentParameter, core_1.Fn.ref('AWS::NoValue'), 'd' + apiId).toString(),
removalPolicy: core_1.RemovalPolicy.DESTROY
domainName: core_1.Fn.conditionIf(HasEnvironmentParameter, core_1.Fn.ref('AWS::NoValue'), `d${apiId}`).toString(),
removalPolicy: core_1.RemovalPolicy.DESTROY,
});

@@ -32,0 +32,0 @@ domain.node.defaultChild.elasticsearchClusterConfig = {

@@ -41,3 +41,3 @@ "use strict";

const enviroment = {
OPENSEARCH_ENDPOINT: 'https://' + endpoint,
OPENSEARCH_ENDPOINT: `https://${endpoint}`,
OPENSEARCH_REGION: region,

@@ -47,3 +47,3 @@ DEBUG: parameterMap.get(OpenSearchDebugStreamingLambda).valueAsString,

};
return apiGraphql.host.addLambdaFunction(OpenSearchStreamingLambdaFunctionLogicalID, 'functions/' + OpenSearchStreamingLambdaFunctionLogicalID + '.zip', parameterMap.get(OpenSearchStreamingLambdaHandlerName).valueAsString, path.resolve(__dirname, '..', '..', 'lib', 'streaming-lambda.zip'), aws_lambda_1.Runtime.PYTHON_3_8, [
return apiGraphql.host.addLambdaFunction(OpenSearchStreamingLambdaFunctionLogicalID, `functions/${OpenSearchStreamingLambdaFunctionLogicalID}.zip`, parameterMap.get(OpenSearchStreamingLambdaHandlerName).valueAsString, path.resolve(__dirname, '..', '..', 'lib', 'streaming-lambda.zip'), aws_lambda_1.Runtime.PYTHON_3_8, [
aws_lambda_1.LayerVersion.fromLayerVersionArn(stack, 'LambdaLayerVersion', core_1.Fn.findInMap('LayerResourceMapping', core_1.Fn.ref('AWS::Region'), 'layerRegion')),

@@ -50,0 +50,0 @@ ], lambdaRole, enviroment, undefined, stack);

@@ -5,10 +5,10 @@ import { ObjectTypeDefinitionNode, InputObjectTypeDefinitionNode, DocumentNode, EnumTypeDefinitionNode, DirectiveNode } from 'graphql';

export declare const DATASTORE_SYNC_FIELDS: string[];
export declare function makeSearchableScalarInputObject(type: string): InputObjectTypeDefinitionNode;
export declare function makeSearchableXFilterInputObject(obj: ObjectTypeDefinitionNode, document: DocumentNode): InputObjectTypeDefinitionNode;
export declare function makeSearchableSortDirectionEnumObject(): EnumTypeDefinitionNode;
export declare function makeSearchableXSortableFieldsEnumObject(obj: ObjectTypeDefinitionNode): EnumTypeDefinitionNode;
export declare function makeSearchableXAggregateFieldEnumObject(obj: ObjectTypeDefinitionNode, document: DocumentNode): EnumTypeDefinitionNode;
export declare function makeSearchableXSortInputObject(obj: ObjectTypeDefinitionNode): InputObjectTypeDefinitionNode;
export declare function makeSearchableAggregateTypeEnumObject(): EnumTypeDefinitionNode;
export declare function makeSearchableXAggregationInputObject(obj: ObjectTypeDefinitionNode): InputObjectTypeDefinitionNode;
export declare const makeSearchableScalarInputObject: (type: string) => InputObjectTypeDefinitionNode;
export declare const makeSearchableXFilterInputObject: (obj: ObjectTypeDefinitionNode, document: DocumentNode) => InputObjectTypeDefinitionNode;
export declare const makeSearchableSortDirectionEnumObject: () => EnumTypeDefinitionNode;
export declare const makeSearchableXSortableFieldsEnumObject: (obj: ObjectTypeDefinitionNode) => EnumTypeDefinitionNode;
export declare const makeSearchableXAggregateFieldEnumObject: (obj: ObjectTypeDefinitionNode, document: DocumentNode) => EnumTypeDefinitionNode;
export declare const makeSearchableXSortInputObject: (obj: ObjectTypeDefinitionNode) => InputObjectTypeDefinitionNode;
export declare const makeSearchableAggregateTypeEnumObject: () => EnumTypeDefinitionNode;
export declare const makeSearchableXAggregationInputObject: (obj: ObjectTypeDefinitionNode) => InputObjectTypeDefinitionNode;
export declare const extendTypeWithDirectives: (ctx: TransformerTransformSchemaStepContextProvider, typeName: string, directives: Array<DirectiveNode>) => void;

@@ -15,0 +15,0 @@ export declare const addDirectivesToField: (ctx: TransformerTransformSchemaStepContextProvider, typeName: string, fieldName: string, directives: Array<DirectiveNode>) => void;

@@ -37,3 +37,29 @@ "use strict";

exports.DATASTORE_SYNC_FIELDS = ['_version', '_deleted', '_lastChangedAt'];
function makeSearchableScalarInputObject(type) {
const getScalarFilterInputType = (condition, type) => {
switch (condition) {
case 'range':
return (0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)(type));
case 'exists':
return (0, graphql_transformer_common_1.makeNamedType)('Boolean');
default:
return (0, graphql_transformer_common_1.makeNamedType)(type);
}
};
const getScalarConditions = (type) => {
switch (type) {
case 'String':
return STRING_CONDITIONS;
case 'ID':
return ID_CONDITIONS;
case 'Int':
return INT_CONDITIONS;
case 'Float':
return FLOAT_CONDITIONS;
case 'Boolean':
return BOOLEAN_CONDITIONS;
default:
throw new Error('Valid types are String, ID, Int, Float, Boolean');
}
};
const makeSearchableScalarInputObject = (type) => {
const name = graphql_transformer_common_1.SearchableResourceIDs.SearchableFilterInputTypeName(type);

@@ -44,3 +70,3 @@ const conditions = getScalarConditions(type);

name: { kind: 'Name', value: condition },
type: getScalarFilterInputType(condition, type, name),
type: getScalarFilterInputType(condition, type),
directives: [],

@@ -57,5 +83,5 @@ }));

};
}
};
exports.makeSearchableScalarInputObject = makeSearchableScalarInputObject;
function makeSearchableXFilterInputObject(obj, document) {
const makeSearchableXFilterInputObject = (obj, document) => {
const name = graphql_transformer_common_1.SearchableResourceIDs.SearchableFilterInputTypeName(obj.name.value);

@@ -113,6 +139,6 @@ (0, assert_1.default)(obj.fields);

};
}
};
exports.makeSearchableXFilterInputObject = makeSearchableXFilterInputObject;
function makeSearchableSortDirectionEnumObject() {
const name = (0, graphql_transformer_common_1.graphqlName)(`SearchableSortDirection`);
const makeSearchableSortDirectionEnumObject = () => {
const name = (0, graphql_transformer_common_1.graphqlName)('SearchableSortDirection');
return {

@@ -138,5 +164,5 @@ kind: graphql_1.Kind.ENUM_TYPE_DEFINITION,

};
}
};
exports.makeSearchableSortDirectionEnumObject = makeSearchableSortDirectionEnumObject;
function makeSearchableXSortableFieldsEnumObject(obj) {
const makeSearchableXSortableFieldsEnumObject = (obj) => {
const name = (0, graphql_transformer_common_1.graphqlName)(`Searchable${obj.name.value}SortableFields`);

@@ -160,5 +186,5 @@ (0, assert_1.default)(obj.fields);

};
}
};
exports.makeSearchableXSortableFieldsEnumObject = makeSearchableXSortableFieldsEnumObject;
function makeSearchableXAggregateFieldEnumObject(obj, document) {
const makeSearchableXAggregateFieldEnumObject = (obj, document) => {
const name = (0, graphql_transformer_common_1.graphqlName)(`Searchable${obj.name.value}AggregateField`);

@@ -182,5 +208,5 @@ (0, assert_1.default)(obj.fields);

};
}
};
exports.makeSearchableXAggregateFieldEnumObject = makeSearchableXAggregateFieldEnumObject;
function makeSearchableXSortInputObject(obj) {
const makeSearchableXSortInputObject = (obj) => {
const name = (0, graphql_transformer_common_1.graphqlName)(`Searchable${obj.name.value}SortInput`);

@@ -209,5 +235,5 @@ return {

};
}
};
exports.makeSearchableXSortInputObject = makeSearchableXSortInputObject;
function makeSearchableAggregateTypeEnumObject() {
const makeSearchableAggregateTypeEnumObject = () => {
const name = (0, graphql_transformer_common_1.graphqlName)('SearchableAggregateType');

@@ -228,5 +254,5 @@ const values = ['terms', 'avg', 'min', 'max', 'sum'].map((type) => ({

};
}
};
exports.makeSearchableAggregateTypeEnumObject = makeSearchableAggregateTypeEnumObject;
function makeSearchableXAggregationInputObject(obj) {
const makeSearchableXAggregationInputObject = (obj) => {
const name = (0, graphql_transformer_common_1.graphqlName)(`Searchable${obj.name.value}AggregationInput`);

@@ -261,30 +287,4 @@ return {

};
}
};
exports.makeSearchableXAggregationInputObject = makeSearchableXAggregationInputObject;
function getScalarFilterInputType(condition, type, filterInputName) {
switch (condition) {
case 'range':
return (0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)(type));
case 'exists':
return (0, graphql_transformer_common_1.makeNamedType)('Boolean');
default:
return (0, graphql_transformer_common_1.makeNamedType)(type);
}
}
function getScalarConditions(type) {
switch (type) {
case 'String':
return STRING_CONDITIONS;
case 'ID':
return ID_CONDITIONS;
case 'Int':
return INT_CONDITIONS;
case 'Float':
return FLOAT_CONDITIONS;
case 'Boolean':
return BOOLEAN_CONDITIONS;
default:
throw 'Valid types are String, ID, Int, Float, Boolean';
}
}
const extendTypeWithDirectives = (ctx, typeName, directives) => {

@@ -300,5 +300,5 @@ let objectTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(typeName);

if (type) {
const field = (_a = type.fields) === null || _a === void 0 ? void 0 : _a.find(f => f.name.value === fieldName);
const field = (_a = type.fields) === null || _a === void 0 ? void 0 : _a.find((f) => f.name.value === fieldName);
if (field) {
const newFields = [...type.fields.filter(f => f.name.value !== field.name.value), (0, graphql_transformer_common_1.extendFieldWithDirectives)(field, directives)];
const newFields = [...type.fields.filter((f) => f.name.value !== field.name.value), (0, graphql_transformer_common_1.extendFieldWithDirectives)(field, directives)];
const newType = {

@@ -317,3 +317,3 @@ ...type,

if (type) {
const field = type.fields.find(f => f.name.value === operationName);
const field = type.fields.find((f) => f.name.value === operationName);
if (field) {

@@ -320,0 +320,0 @@ const returnFieldType = field.type;

import { Expression } from 'graphql-mapping-template';
export declare function requestTemplate(primaryKey: string, nonKeywordFields: Expression[], includeVersion: boolean | undefined, indexName: string, type: string, keyFields?: Expression[]): string;
export declare function responseTemplate(includeVersion?: boolean): string;
export declare function sandboxMappingTemplate(enabled: boolean, fields: Array<string>): string;
export declare const sandboxMappingTemplate: (enabled: boolean, fields: Array<string>) => string;
export declare const requestTemplate: (primaryKey: string, nonKeywordFields: Expression[], includeVersion: boolean | undefined, indexName: string, keyFields?: Expression[]) => string;
export declare const responseTemplate: (includeVersion?: boolean) => string;
//# sourceMappingURL=generate-resolver-vtl.d.ts.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sandboxMappingTemplate = exports.responseTemplate = exports.requestTemplate = void 0;
exports.responseTemplate = exports.requestTemplate = exports.sandboxMappingTemplate = void 0;
const graphql_mapping_template_1 = require("graphql-mapping-template");

@@ -9,97 +9,3 @@ const graphql_transformer_common_1 = require("graphql-transformer-common");

const allowedAggFieldsList = 'allowedAggFields';
function requestTemplate(primaryKey, nonKeywordFields, includeVersion = false, indexName, type, keyFields = []) {
return (0, graphql_mapping_template_1.print)((0, graphql_mapping_template_1.compoundExpression)([
graphql_transformer_common_1.setArgs,
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('indexPath'), (0, graphql_mapping_template_1.str)(`/${indexName.toLowerCase()}/_search`)),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('allowedAggFields'), (0, graphql_mapping_template_1.methodCall)((0, graphql_mapping_template_1.ref)('util.defaultIfNull'), (0, graphql_mapping_template_1.ref)('ctx.stash.allowedAggFields'), (0, graphql_mapping_template_1.list)([]))),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggFieldsFilterMap'), (0, graphql_mapping_template_1.methodCall)((0, graphql_mapping_template_1.ref)('util.defaultIfNull'), (0, graphql_mapping_template_1.ref)('ctx.stash.aggFieldsFilterMap'), (0, graphql_mapping_template_1.obj)({}))),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('nonKeywordFields'), (0, graphql_mapping_template_1.list)(nonKeywordFields)),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('keyFields'), (0, graphql_mapping_template_1.list)(keyFields)),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortValues'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortFields'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggregateValues'), (0, graphql_mapping_template_1.obj)({})),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('primaryKey'), (0, graphql_mapping_template_1.str)(primaryKey)),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($args.sort)')), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('sortItem'), (0, graphql_mapping_template_1.ref)('args.sort'), [
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($sortItem.field)'), (0, graphql_mapping_template_1.qref)('$sortFields.add($primaryKey)'), (0, graphql_mapping_template_1.qref)('$sortFields.add($sortItem.field)')),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($sortItem.field)'), (0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($primaryKey)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson($primaryKey)')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson("${primaryKey}.keyword")'))), (0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($sortItem.field)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson($sortItem.field)')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson("${sortItem.field}.keyword")')))),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($sortItem.direction)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortDirection'), (0, graphql_mapping_template_1.ref)('util.toJson({"order": "desc"})')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortDirection'), (0, graphql_mapping_template_1.ref)('util.toJson({"order": $sortItem.direction})'))),
(0, graphql_mapping_template_1.qref)('$sortValues.add("{$sortField: $sortDirection}")'),
]),
])),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('keyItem'), (0, graphql_mapping_template_1.ref)('keyFields'), [
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.ref)('sortFields.contains($keyItem)')), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($keyItem)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson($keyItem)')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson("${keyItem}.keyword")'))),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortDirection'), (0, graphql_mapping_template_1.ref)('util.toJson({"order": "desc"})')),
(0, graphql_mapping_template_1.qref)('$sortValues.add("{$sortField: $sortDirection}")'),
])),
]),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('aggItem'), (0, graphql_mapping_template_1.ref)('args.aggregates'), [
(0, graphql_mapping_template_1.raw)('#if( $allowedAggFields.contains($aggItem.field) )\n' +
' #set( $aggFilter = { "match_all": {} } )\n' +
' #elseif( $aggFieldsFilterMap.containsKey($aggItem.field) )\n' +
' #set( $aggFilter = { "bool": { "should": $aggFieldsFilterMap.get($aggItem.field) } } )\n' +
' #else\n' +
' $util.error("Unauthorized to run aggregation on field: ${aggItem.field}", "Unauthorized")\n' +
' #end'),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($aggItem.field)'), (0, graphql_mapping_template_1.qref)('$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "$aggItem.field" }}} })'), (0, graphql_mapping_template_1.qref)('$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "${aggItem.field}.keyword" }}} })')),
]),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.isNullOrEmpty)(authFilter)), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), authFilter),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.isNullOrEmpty)((0, graphql_mapping_template_1.ref)('args.filter'))), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), (0, graphql_mapping_template_1.obj)({
bool: (0, graphql_mapping_template_1.obj)({
must: (0, graphql_mapping_template_1.list)([(0, graphql_mapping_template_1.ref)('ctx.stash.authFilter'), (0, graphql_mapping_template_1.ref)('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')]),
}),
}))),
]), (0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.isNullOrEmpty)((0, graphql_mapping_template_1.ref)('args.filter'))), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), (0, graphql_mapping_template_1.ref)('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')))),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.isNullOrEmpty)((0, graphql_mapping_template_1.ref)('filter')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), (0, graphql_mapping_template_1.obj)({ match_all: (0, graphql_mapping_template_1.obj)({}) }))),
graphql_mapping_template_1.SearchableMappingTemplate.searchTemplate({
path: (0, graphql_mapping_template_1.str)('$indexPath'),
size: (0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('args.limit'), (0, graphql_mapping_template_1.ref)('args.limit'), (0, graphql_mapping_template_1.int)(graphql_transformer_common_1.ResourceConstants.DEFAULT_SEARCHABLE_PAGE_LIMIT), true),
search_after: (0, graphql_mapping_template_1.ref)('util.base64Decode($args.nextToken)'),
from: (0, graphql_mapping_template_1.ref)('args.from'),
version: (0, graphql_mapping_template_1.bool)(includeVersion),
query: (0, graphql_mapping_template_1.methodCall)((0, graphql_mapping_template_1.ref)('util.toJson'), (0, graphql_mapping_template_1.ref)('filter')),
sort: (0, graphql_mapping_template_1.ref)('sortValues'),
aggs: (0, graphql_mapping_template_1.ref)('util.toJson($aggregateValues)'),
}),
]));
}
exports.requestTemplate = requestTemplate;
function responseTemplate(includeVersion = false) {
return (0, graphql_mapping_template_1.print)((0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('es_items'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggregateValues'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('entry'), (0, graphql_mapping_template_1.ref)('context.result.hits.hits'), [
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$foreach.hasNext'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('nextToken'), (0, graphql_mapping_template_1.ref)('util.base64Encode($util.toJson($entry.sort))'))),
...getSourceMapper(includeVersion),
]),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('aggItem'), (0, graphql_mapping_template_1.ref)('context.result.aggregations.keySet()'), [
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggResult'), (0, graphql_mapping_template_1.obj)({})),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggResultValue'), (0, graphql_mapping_template_1.obj)({})),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('currentAggItem'), (0, graphql_mapping_template_1.ref)('ctx.result.aggregations.get($aggItem)')),
(0, graphql_mapping_template_1.qref)('$aggResult.put("name", $aggItem)'),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$util.isNullOrEmpty($currentAggItem)'), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$util.isNullOrEmpty($currentAggItem.get($aggItem).buckets)'), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("__typename", "SearchableAggregateBucketResult")'),
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("buckets", $currentAggItem.get($aggItem).buckets)'),
])),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$util.isNullOrEmpty($currentAggItem.get($aggItem).value)'), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("__typename", "SearchableAggregateScalarResult")'),
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("value", $currentAggItem.get($aggItem).value)'),
])),
])),
(0, graphql_mapping_template_1.qref)('$aggResult.put("result", $aggResultValue)'),
(0, graphql_mapping_template_1.qref)('$aggregateValues.add($aggResult)'),
]),
(0, graphql_mapping_template_1.toJson)((0, graphql_mapping_template_1.obj)({
items: (0, graphql_mapping_template_1.ref)('es_items'),
total: (0, graphql_mapping_template_1.ref)('ctx.result.hits.total.value'),
nextToken: (0, graphql_mapping_template_1.ref)('nextToken'),
aggregateItems: (0, graphql_mapping_template_1.ref)('aggregateValues'),
})),
]));
}
exports.responseTemplate = responseTemplate;
function sandboxMappingTemplate(enabled, fields) {
const sandboxMappingTemplate = (enabled, fields) => {
let sandboxExp;

@@ -113,5 +19,5 @@ if (enabled) {

return (0, graphql_mapping_template_1.printBlock)(`Sandbox Mode ${enabled ? 'Enabled' : 'Disabled'}`)((0, graphql_mapping_template_1.compoundExpression)([(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.ref)('ctx.stash.get("hasAuth")')), sandboxExp), (0, graphql_mapping_template_1.toJson)((0, graphql_mapping_template_1.obj)({}))]));
}
};
exports.sandboxMappingTemplate = sandboxMappingTemplate;
function getSourceMapper(includeVersion) {
const getSourceMapper = (includeVersion) => {
if (includeVersion) {

@@ -125,3 +31,93 @@ return [

return [(0, graphql_mapping_template_1.qref)('$es_items.add($entry.get("_source"))')];
}
};
const requestTemplate = (primaryKey, nonKeywordFields, includeVersion = false, indexName, keyFields = []) => (0, graphql_mapping_template_1.print)((0, graphql_mapping_template_1.compoundExpression)([
graphql_transformer_common_1.setArgs,
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('indexPath'), (0, graphql_mapping_template_1.str)(`/${indexName.toLowerCase()}/_search`)),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('allowedAggFields'), (0, graphql_mapping_template_1.methodCall)((0, graphql_mapping_template_1.ref)('util.defaultIfNull'), (0, graphql_mapping_template_1.ref)('ctx.stash.allowedAggFields'), (0, graphql_mapping_template_1.list)([]))),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggFieldsFilterMap'), (0, graphql_mapping_template_1.methodCall)((0, graphql_mapping_template_1.ref)('util.defaultIfNull'), (0, graphql_mapping_template_1.ref)('ctx.stash.aggFieldsFilterMap'), (0, graphql_mapping_template_1.obj)({}))),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('nonKeywordFields'), (0, graphql_mapping_template_1.list)(nonKeywordFields)),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('keyFields'), (0, graphql_mapping_template_1.list)(keyFields)),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortValues'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortFields'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggregateValues'), (0, graphql_mapping_template_1.obj)({})),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('primaryKey'), (0, graphql_mapping_template_1.str)(primaryKey)),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($args.sort)')), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('sortItem'), (0, graphql_mapping_template_1.ref)('args.sort'), [
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($sortItem.field)'), (0, graphql_mapping_template_1.qref)('$sortFields.add($primaryKey)'), (0, graphql_mapping_template_1.qref)('$sortFields.add($sortItem.field)')),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($sortItem.field)'), (0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($primaryKey)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson($primaryKey)')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson("${primaryKey}.keyword")'))), (0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($sortItem.field)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson($sortItem.field)')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson("${sortItem.field}.keyword")')))),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('util.isNullOrEmpty($sortItem.direction)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortDirection'), (0, graphql_mapping_template_1.ref)('util.toJson({"order": "desc"})')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortDirection'), (0, graphql_mapping_template_1.ref)('util.toJson({"order": $sortItem.direction})'))),
(0, graphql_mapping_template_1.qref)('$sortValues.add("{$sortField: $sortDirection}")'),
]),
])),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('keyItem'), (0, graphql_mapping_template_1.ref)('keyFields'), [
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.ref)('sortFields.contains($keyItem)')), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($keyItem)'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson($keyItem)')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortField'), (0, graphql_mapping_template_1.ref)('util.toJson("${keyItem}.keyword")'))),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('sortDirection'), (0, graphql_mapping_template_1.ref)('util.toJson({"order": "desc"})')),
(0, graphql_mapping_template_1.qref)('$sortValues.add("{$sortField: $sortDirection}")'),
])),
]),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('aggItem'), (0, graphql_mapping_template_1.ref)('args.aggregates'), [
(0, graphql_mapping_template_1.raw)('#if( $allowedAggFields.contains($aggItem.field) )\n'
+ ' #set( $aggFilter = { "match_all": {} } )\n'
+ ' #elseif( $aggFieldsFilterMap.containsKey($aggItem.field) )\n'
+ ' #set( $aggFilter = { "bool": { "should": $aggFieldsFilterMap.get($aggItem.field) } } )\n'
+ ' #else\n'
+ ' $util.error("Unauthorized to run aggregation on field: ${aggItem.field}", "Unauthorized")\n'
+ ' #end'),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('nonKeywordFields.contains($aggItem.field)'), (0, graphql_mapping_template_1.qref)('$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "$aggItem.field" }}} })'), (0, graphql_mapping_template_1.qref)('$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "${aggItem.field}.keyword" }}} })')),
]),
(0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.isNullOrEmpty)(authFilter)), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), authFilter),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.isNullOrEmpty)((0, graphql_mapping_template_1.ref)('args.filter'))), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), (0, graphql_mapping_template_1.obj)({
bool: (0, graphql_mapping_template_1.obj)({
must: (0, graphql_mapping_template_1.list)([(0, graphql_mapping_template_1.ref)('ctx.stash.authFilter'), (0, graphql_mapping_template_1.ref)('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')]),
}),
}))),
]), (0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.not)((0, graphql_mapping_template_1.isNullOrEmpty)((0, graphql_mapping_template_1.ref)('args.filter'))), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), (0, graphql_mapping_template_1.ref)('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')))),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.isNullOrEmpty)((0, graphql_mapping_template_1.ref)('filter')), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('filter'), (0, graphql_mapping_template_1.obj)({ match_all: (0, graphql_mapping_template_1.obj)({}) }))),
graphql_mapping_template_1.SearchableMappingTemplate.searchTemplate({
path: (0, graphql_mapping_template_1.str)('$indexPath'),
size: (0, graphql_mapping_template_1.ifElse)((0, graphql_mapping_template_1.ref)('args.limit'), (0, graphql_mapping_template_1.ref)('args.limit'), (0, graphql_mapping_template_1.int)(graphql_transformer_common_1.ResourceConstants.DEFAULT_SEARCHABLE_PAGE_LIMIT), true),
search_after: (0, graphql_mapping_template_1.ref)('util.base64Decode($args.nextToken)'),
from: (0, graphql_mapping_template_1.ref)('args.from'),
version: (0, graphql_mapping_template_1.bool)(includeVersion),
query: (0, graphql_mapping_template_1.methodCall)((0, graphql_mapping_template_1.ref)('util.toJson'), (0, graphql_mapping_template_1.ref)('filter')),
sort: (0, graphql_mapping_template_1.ref)('sortValues'),
aggs: (0, graphql_mapping_template_1.ref)('util.toJson($aggregateValues)'),
}),
]));
exports.requestTemplate = requestTemplate;
const responseTemplate = (includeVersion = false) => (0, graphql_mapping_template_1.print)((0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('es_items'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggregateValues'), (0, graphql_mapping_template_1.list)([])),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('entry'), (0, graphql_mapping_template_1.ref)('context.result.hits.hits'), [
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$foreach.hasNext'), (0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('nextToken'), (0, graphql_mapping_template_1.ref)('util.base64Encode($util.toJson($entry.sort))'))),
...getSourceMapper(includeVersion),
]),
(0, graphql_mapping_template_1.forEach)((0, graphql_mapping_template_1.ref)('aggItem'), (0, graphql_mapping_template_1.ref)('context.result.aggregations.keySet()'), [
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggResult'), (0, graphql_mapping_template_1.obj)({})),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('aggResultValue'), (0, graphql_mapping_template_1.obj)({})),
(0, graphql_mapping_template_1.set)((0, graphql_mapping_template_1.ref)('currentAggItem'), (0, graphql_mapping_template_1.ref)('ctx.result.aggregations.get($aggItem)')),
(0, graphql_mapping_template_1.qref)('$aggResult.put("name", $aggItem)'),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$util.isNullOrEmpty($currentAggItem)'), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$util.isNullOrEmpty($currentAggItem.get($aggItem).buckets)'), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("__typename", "SearchableAggregateBucketResult")'),
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("buckets", $currentAggItem.get($aggItem).buckets)'),
])),
(0, graphql_mapping_template_1.iff)((0, graphql_mapping_template_1.raw)('!$util.isNullOrEmpty($currentAggItem.get($aggItem).value)'), (0, graphql_mapping_template_1.compoundExpression)([
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("__typename", "SearchableAggregateScalarResult")'),
(0, graphql_mapping_template_1.qref)('$aggResultValue.put("value", $currentAggItem.get($aggItem).value)'),
])),
])),
(0, graphql_mapping_template_1.qref)('$aggResult.put("result", $aggResultValue)'),
(0, graphql_mapping_template_1.qref)('$aggregateValues.add($aggResult)'),
]),
(0, graphql_mapping_template_1.toJson)((0, graphql_mapping_template_1.obj)({
items: (0, graphql_mapping_template_1.ref)('es_items'),
total: (0, graphql_mapping_template_1.ref)('ctx.result.hits.total.value'),
nextToken: (0, graphql_mapping_template_1.ref)('nextToken'),
aggregateItems: (0, graphql_mapping_template_1.ref)('aggregateValues'),
})),
]));
exports.responseTemplate = responseTemplate;
//# sourceMappingURL=generate-resolver-vtl.js.map

@@ -15,11 +15,3 @@ import { TransformerPluginBase } from '@aws-amplify/graphql-transformer-core';

transformSchema: (ctx: TransformerTransformSchemaStepContextProvider) => void;
private generateSearchableXConnectionType;
private generateSearchableAggregateTypes;
private generateSearchableGenericResultType;
private generateSearchableAggregateScalarResultType;
private generateSearchableAggregateBucketResultItemType;
private generateSearchableAggregateBucketResultType;
private generateSearchableAggregateResultType;
private generateSearchableInputs;
}
//# sourceMappingURL=graphql-searchable-transformer.d.ts.map

@@ -11,6 +11,6 @@ "use strict";

const graphql_transformer_common_1 = require("graphql-transformer-common");
const assert_1 = __importDefault(require("assert"));
const create_cfnParameters_1 = require("./cdk/create-cfnParameters");
const generate_resolver_vtl_1 = require("./generate-resolver-vtl");
const definitions_1 = require("./definitions");
const assert_1 = __importDefault(require("assert"));
const create_layer_cfnMapping_1 = require("./cdk/create-layer-cfnMapping");

@@ -23,2 +23,150 @@ const create_searchable_domain_1 = require("./cdk/create-searchable-domain");

const STACK_NAME = 'SearchableStack';
const getTable = (context, definition) => {
const ddbDataSource = context.dataSources.get(definition);
const tableName = graphql_transformer_common_1.ModelResourceIDs.ModelTableResourceID(definition.name.value);
const table = ddbDataSource.ds.stack.node.findChild(tableName);
return table;
};
const getNonKeywordFields = (def) => {
var _a;
const nonKeywordTypeSet = new Set(nonKeywordTypes);
return ((_a = def.fields) === null || _a === void 0 ? void 0 : _a.filter((field) => nonKeywordTypeSet.has((0, graphql_transformer_common_1.getBaseType)(field.type))
&& !definitions_1.DATASTORE_SYNC_FIELDS.includes(field.name.value)).map((field) => (0, graphql_mapping_template_1.str)(field.name.value))) || [];
};
const getKeyFields = (primaryKey, table) => {
const keyFields = [];
keyFields.push(primaryKey);
const { attributeName } = table.keySchema.find((att) => att.keyType === 'RANGE') || {};
if (attributeName) {
keyFields.push(...attributeName.split('#'));
}
return keyFields.map((key) => (0, graphql_mapping_template_1.str)(key));
};
const generateSearchableXConnectionType = (ctx, definition) => {
const searchableXConnectionName = `Searchable${definition.name.value}Connection`;
if (ctx.output.hasType(searchableXConnectionName)) {
return;
}
const connectionType = (0, graphql_transformer_common_1.blankObject)(searchableXConnectionName);
ctx.output.addObject(connectionType);
let connectionTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableXConnectionName);
connectionTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(connectionTypeExtension, [
(0, graphql_transformer_common_1.makeField)('items', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)(definition.name.value)))),
]);
connectionTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(connectionTypeExtension, [
(0, graphql_transformer_common_1.makeField)('nextToken', [], (0, graphql_transformer_common_1.makeNamedType)('String')),
(0, graphql_transformer_common_1.makeField)('total', [], (0, graphql_transformer_common_1.makeNamedType)('Int')),
(0, graphql_transformer_common_1.makeField)('aggregateItems', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)('SearchableAggregateResult')))),
]);
ctx.output.addObjectExtension(connectionTypeExtension);
};
const generateSearchableAggregateScalarResultType = (ctx) => {
const searchableAggregateScalarResult = 'SearchableAggregateScalarResult';
if (ctx.output.hasType(searchableAggregateScalarResult)) {
return searchableAggregateScalarResult;
}
const aggregateScalarType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateScalarResult);
ctx.output.addObject(aggregateScalarType);
let aggregateScalarTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateScalarResult);
aggregateScalarTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateScalarTypeExtension, [
(0, graphql_transformer_common_1.makeField)('value', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('Float'))),
]);
ctx.output.addObjectExtension(aggregateScalarTypeExtension);
return searchableAggregateScalarResult;
};
const generateSearchableAggregateBucketResultItemType = (ctx) => {
const searchableAggregateBucketResultItem = 'SearchableAggregateBucketResultItem';
if (ctx.output.hasType(searchableAggregateBucketResultItem)) {
return searchableAggregateBucketResultItem;
}
const aggregateBucketResultItemType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateBucketResultItem);
ctx.output.addObject(aggregateBucketResultItemType);
let aggregateBucketResultItemTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateBucketResultItem);
aggregateBucketResultItemTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateBucketResultItemTypeExtension, [
(0, graphql_transformer_common_1.makeField)('key', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('String'))),
(0, graphql_transformer_common_1.makeField)('doc_count', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('Int'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultItemTypeExtension);
return searchableAggregateBucketResultItem;
};
const generateSearchableAggregateBucketResultType = (ctx) => {
const searchableAggregateBucketResult = 'SearchableAggregateBucketResult';
if (ctx.output.hasType(searchableAggregateBucketResult)) {
return searchableAggregateBucketResult;
}
const aggregateBucketResultType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateBucketResult);
ctx.output.addObject(aggregateBucketResultType);
generateSearchableAggregateBucketResultItemType(ctx);
let aggregateBucketResultTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateBucketResult);
aggregateBucketResultTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateBucketResultTypeExtension, [
(0, graphql_transformer_common_1.makeField)('buckets', [], (0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)('SearchableAggregateBucketResultItem'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultTypeExtension);
return searchableAggregateBucketResult;
};
const generateSearchableGenericResultType = (ctx) => {
const searchableAggregateGenericResult = 'SearchableAggregateGenericResult';
if (ctx.output.hasType(searchableAggregateGenericResult)) {
return;
}
const searchableAggregateGenericResultNode = (0, graphql_transformer_common_1.defineUnionType)(searchableAggregateGenericResult, [
(0, graphql_transformer_common_1.makeNamedType)(generateSearchableAggregateScalarResultType(ctx)),
(0, graphql_transformer_common_1.makeNamedType)(generateSearchableAggregateBucketResultType(ctx)),
]);
ctx.output.addUnion(searchableAggregateGenericResultNode);
};
const generateSearchableAggregateResultType = (ctx) => {
const searchableAggregateResult = 'SearchableAggregateResult';
if (ctx.output.hasType(searchableAggregateResult)) {
return searchableAggregateResult;
}
const aggregateResultType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateResult);
ctx.output.addObject(aggregateResultType);
let aggregateResultTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateResult);
aggregateResultTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateResultTypeExtension, [
(0, graphql_transformer_common_1.makeField)('name', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('String'))),
(0, graphql_transformer_common_1.makeField)('result', [], (0, graphql_transformer_common_1.makeNamedType)('SearchableAggregateGenericResult')),
]);
ctx.output.addObjectExtension(aggregateResultTypeExtension);
return searchableAggregateResult;
};
const generateSearchableAggregateTypes = (ctx) => {
generateSearchableAggregateResultType(ctx);
generateSearchableGenericResultType(ctx);
};
const generateSearchableInputs = (ctx, definition) => {
const inputs = Object.keys(graphql_transformer_common_1.STANDARD_SCALARS);
inputs
.filter((input) => !ctx.output.hasType(`Searchable${input}FilterInput`))
.map(definitions_1.makeSearchableScalarInputObject)
.forEach((node) => ctx.output.addInput(node));
const searchableXQueryFilterInput = (0, definitions_1.makeSearchableXFilterInputObject)(definition, ctx.inputDocument);
if (!ctx.output.hasType(searchableXQueryFilterInput.name.value)) {
ctx.output.addInput(searchableXQueryFilterInput);
}
if (!ctx.output.hasType('SearchableSortDirection')) {
const searchableSortDirection = (0, definitions_1.makeSearchableSortDirectionEnumObject)();
ctx.output.addEnum(searchableSortDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortableFields`)) {
const searchableXSortableFieldsDirection = (0, definitions_1.makeSearchableXSortableFieldsEnumObject)(definition);
ctx.output.addEnum(searchableXSortableFieldsDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortInput`)) {
const searchableXSortableInputDirection = (0, definitions_1.makeSearchableXSortInputObject)(definition);
ctx.output.addInput(searchableXSortableInputDirection);
}
if (!ctx.output.hasType('SearchableAggregateType')) {
const searchableAggregateTypeEnum = (0, definitions_1.makeSearchableAggregateTypeEnumObject)();
ctx.output.addEnum(searchableAggregateTypeEnum);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregateField`)) {
const searchableXAggregationField = (0, definitions_1.makeSearchableXAggregateFieldEnumObject)(definition, ctx.inputDocument);
ctx.output.addEnum(searchableXAggregationField);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregationInput`)) {
const searchableXAggregationInput = (0, definitions_1.makeSearchableXAggregationInputObject)(definition);
ctx.output.addInput(searchableXAggregationInput);
}
};
class SearchableModelTransformer extends graphql_transformer_core_1.TransformerPluginBase {

@@ -56,3 +204,3 @@ constructor() {

const openSearchIndexName = context.resourceHelper.getModelNameMapping(type);
const fields = (_b = (_a = def.node.fields) === null || _a === void 0 ? void 0 : _a.map(f => f.name.value)) !== null && _b !== void 0 ? _b : [];
const fields = (_b = (_a = def.node.fields) === null || _a === void 0 ? void 0 : _a.map((f) => f.name.value)) !== null && _b !== void 0 ? _b : [];
const typeName = context.output.getQueryTypeName();

@@ -67,3 +215,3 @@ const table = getTable(context, def.node);

(0, assert_1.default)(typeName);
const resolver = context.resolvers.generateQueryResolver(typeName, def.fieldName, graphql_transformer_common_1.ResolverResourceIDs.ElasticsearchSearchResolverResourceID(type), datasource, graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString((0, generate_resolver_vtl_1.requestTemplate)(attributeName, getNonKeywordFields((context.output.getObject(type))), context.isProjectUsingDataStore(), openSearchIndexName, type, keyFields), `${typeName}.${def.fieldName}.req.vtl`), graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString((0, generate_resolver_vtl_1.responseTemplate)(context.isProjectUsingDataStore()), `${typeName}.${def.fieldName}.res.vtl`));
const resolver = context.resolvers.generateQueryResolver(typeName, def.fieldName, graphql_transformer_common_1.ResolverResourceIDs.ElasticsearchSearchResolverResourceID(type), datasource, graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString((0, generate_resolver_vtl_1.requestTemplate)(attributeName, getNonKeywordFields((context.output.getObject(type))), context.isProjectUsingDataStore(), openSearchIndexName, keyFields), `${typeName}.${def.fieldName}.req.vtl`), graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString((0, generate_resolver_vtl_1.responseTemplate)(context.isProjectUsingDataStore()), `${typeName}.${def.fieldName}.res.vtl`));
resolver.addToSlot('postAuth', graphql_transformer_core_1.MappingTemplate.s3MappingTemplateFromString((0, generate_resolver_vtl_1.sandboxMappingTemplate)(context.sandboxModeEnabled, fields), `${typeName}.${def.fieldName}.{slotName}.{slotIndex}.res.vtl`));

@@ -77,4 +225,4 @@ resolver.mapToStack(stack);

var _a, _b, _c;
const modelDirective = (_a = definition === null || definition === void 0 ? void 0 : definition.directives) === null || _a === void 0 ? void 0 : _a.find(dir => dir.name.value === 'model');
const hasAuth = (_c = (_b = definition.directives) === null || _b === void 0 ? void 0 : _b.some(dir => dir.name.value === 'auth')) !== null && _c !== void 0 ? _c : false;
const modelDirective = (_a = definition === null || definition === void 0 ? void 0 : definition.directives) === null || _a === void 0 ? void 0 : _a.find((dir) => dir.name.value === 'model');
const hasAuth = (_c = (_b = definition.directives) === null || _b === void 0 ? void 0 : _b.some((dir) => dir.name.value === 'auth')) !== null && _c !== void 0 ? _c : false;
if (!modelDirective) {

@@ -86,3 +234,3 @@ throw new graphql_transformer_core_1.InvalidDirectiveError('Types annotated with @searchable must also be annotated with @model.');

let shouldMakeSearch = true;
let searchFieldNameOverride = undefined;
let searchFieldNameOverride;
if (directiveArguments.queries) {

@@ -96,5 +244,3 @@ if (!directiveArguments.queries.search) {

}
const fieldName = searchFieldNameOverride
? searchFieldNameOverride
: (0, graphql_transformer_common_1.graphqlName)(`search${(0, graphql_transformer_common_1.plurality)((0, graphql_transformer_common_1.toUpper)(definition.name.value), true)}`);
const fieldName = searchFieldNameOverride !== null && searchFieldNameOverride !== void 0 ? searchFieldNameOverride : (0, graphql_transformer_common_1.graphqlName)(`search${(0, graphql_transformer_common_1.plurality)((0, graphql_transformer_common_1.toUpper)(definition.name.value), true)}`);
this.searchableObjectTypeDefinitions.push({

@@ -106,4 +252,4 @@ node: definition,

this.searchableObjectNames.push(definition.name.value);
this.generateSearchableXConnectionType(ctx, definition);
this.generateSearchableAggregateTypes(ctx);
generateSearchableXConnectionType(ctx, definition);
generateSearchableAggregateTypes(ctx);
const directives = [];

@@ -134,8 +280,8 @@ if (!hasAuth && ctx.sandboxModeEnabled && ctx.authConfig.defaultAuthentication.authenticationType !== 'API_KEY') {

const searchObject = ctx.output.getObject(name);
this.generateSearchableInputs(ctx, searchObject);
generateSearchableInputs(ctx, searchObject);
}
if (ctx.sandboxModeEnabled && ctx.authConfig.defaultAuthentication.authenticationType !== 'API_KEY') {
for (let aggType of definitions_1.AGGREGATE_TYPES) {
for (const aggType of definitions_1.AGGREGATE_TYPES) {
const aggObject = ctx.output.getObject(aggType);
const hasApiKey = (_b = (_a = aggObject.directives) === null || _a === void 0 ? void 0 : _a.some(dir => dir.name.value === 'aws_api_key')) !== null && _b !== void 0 ? _b : false;
const hasApiKey = (_b = (_a = aggObject.directives) === null || _a === void 0 ? void 0 : _a.some((dir) => dir.name.value === 'aws_api_key')) !== null && _b !== void 0 ? _b : false;
if (!hasApiKey) {

@@ -150,151 +296,4 @@ (0, definitions_1.extendTypeWithDirectives)(ctx, aggType, [(0, graphql_transformer_common_1.makeDirective)('aws_api_key', [])]);

}
generateSearchableXConnectionType(ctx, definition) {
const searchableXConnectionName = `Searchable${definition.name.value}Connection`;
if (ctx.output.hasType(searchableXConnectionName)) {
return;
}
const connectionType = (0, graphql_transformer_common_1.blankObject)(searchableXConnectionName);
ctx.output.addObject(connectionType);
let connectionTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableXConnectionName);
connectionTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(connectionTypeExtension, [
(0, graphql_transformer_common_1.makeField)('items', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)(definition.name.value)))),
]);
connectionTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(connectionTypeExtension, [
(0, graphql_transformer_common_1.makeField)('nextToken', [], (0, graphql_transformer_common_1.makeNamedType)('String')),
(0, graphql_transformer_common_1.makeField)('total', [], (0, graphql_transformer_common_1.makeNamedType)('Int')),
(0, graphql_transformer_common_1.makeField)('aggregateItems', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)(`SearchableAggregateResult`)))),
]);
ctx.output.addObjectExtension(connectionTypeExtension);
}
generateSearchableAggregateTypes(ctx) {
this.generateSearchableAggregateResultType(ctx);
this.generateSearchableGenericResultType(ctx);
}
generateSearchableGenericResultType(ctx) {
const searchableAggregateGenericResult = `SearchableAggregateGenericResult`;
if (ctx.output.hasType(searchableAggregateGenericResult)) {
return;
}
let searchableAggregateGenericResultNode = (0, graphql_transformer_common_1.defineUnionType)(searchableAggregateGenericResult, [
(0, graphql_transformer_common_1.makeNamedType)(this.generateSearchableAggregateScalarResultType(ctx)),
(0, graphql_transformer_common_1.makeNamedType)(this.generateSearchableAggregateBucketResultType(ctx)),
]);
ctx.output.addUnion(searchableAggregateGenericResultNode);
}
generateSearchableAggregateScalarResultType(ctx) {
const searchableAggregateScalarResult = `SearchableAggregateScalarResult`;
if (ctx.output.hasType(searchableAggregateScalarResult)) {
return searchableAggregateScalarResult;
}
const aggregateScalarType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateScalarResult);
ctx.output.addObject(aggregateScalarType);
let aggregateScalarTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateScalarResult);
aggregateScalarTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateScalarTypeExtension, [
(0, graphql_transformer_common_1.makeField)('value', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('Float'))),
]);
ctx.output.addObjectExtension(aggregateScalarTypeExtension);
return searchableAggregateScalarResult;
}
generateSearchableAggregateBucketResultItemType(ctx) {
const searchableAggregateBucketResultItem = `SearchableAggregateBucketResultItem`;
if (ctx.output.hasType(searchableAggregateBucketResultItem)) {
return searchableAggregateBucketResultItem;
}
const aggregateBucketResultItemType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateBucketResultItem);
ctx.output.addObject(aggregateBucketResultItemType);
let aggregateBucketResultItemTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateBucketResultItem);
aggregateBucketResultItemTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateBucketResultItemTypeExtension, [
(0, graphql_transformer_common_1.makeField)('key', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('String'))),
(0, graphql_transformer_common_1.makeField)('doc_count', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('Int'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultItemTypeExtension);
return searchableAggregateBucketResultItem;
}
generateSearchableAggregateBucketResultType(ctx) {
const searchableAggregateBucketResult = `SearchableAggregateBucketResult`;
if (ctx.output.hasType(searchableAggregateBucketResult)) {
return searchableAggregateBucketResult;
}
const aggregateBucketResultType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateBucketResult);
ctx.output.addObject(aggregateBucketResultType);
this.generateSearchableAggregateBucketResultItemType(ctx);
let aggregateBucketResultTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateBucketResult);
aggregateBucketResultTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateBucketResultTypeExtension, [
(0, graphql_transformer_common_1.makeField)('buckets', [], (0, graphql_transformer_common_1.makeListType)((0, graphql_transformer_common_1.makeNamedType)('SearchableAggregateBucketResultItem'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultTypeExtension);
return searchableAggregateBucketResult;
}
generateSearchableAggregateResultType(ctx) {
const searchableAggregateResult = `SearchableAggregateResult`;
if (ctx.output.hasType(searchableAggregateResult)) {
return searchableAggregateResult;
}
const aggregateResultType = (0, graphql_transformer_common_1.blankObject)(searchableAggregateResult);
ctx.output.addObject(aggregateResultType);
let aggregateResultTypeExtension = (0, graphql_transformer_common_1.blankObjectExtension)(searchableAggregateResult);
aggregateResultTypeExtension = (0, graphql_transformer_common_1.extensionWithFields)(aggregateResultTypeExtension, [
(0, graphql_transformer_common_1.makeField)('name', [], (0, graphql_transformer_common_1.makeNonNullType)((0, graphql_transformer_common_1.makeNamedType)('String'))),
(0, graphql_transformer_common_1.makeField)('result', [], (0, graphql_transformer_common_1.makeNamedType)('SearchableAggregateGenericResult')),
]);
ctx.output.addObjectExtension(aggregateResultTypeExtension);
return searchableAggregateResult;
}
generateSearchableInputs(ctx, definition) {
const inputs = Object.keys(graphql_transformer_common_1.STANDARD_SCALARS);
inputs
.filter(input => !ctx.output.hasType(`Searchable${input}FilterInput`))
.map(definitions_1.makeSearchableScalarInputObject)
.forEach((node) => ctx.output.addInput(node));
const searchableXQueryFilterInput = (0, definitions_1.makeSearchableXFilterInputObject)(definition, ctx.inputDocument);
if (!ctx.output.hasType(searchableXQueryFilterInput.name.value)) {
ctx.output.addInput(searchableXQueryFilterInput);
}
if (!ctx.output.hasType('SearchableSortDirection')) {
const searchableSortDirection = (0, definitions_1.makeSearchableSortDirectionEnumObject)();
ctx.output.addEnum(searchableSortDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortableFields`)) {
const searchableXSortableFieldsDirection = (0, definitions_1.makeSearchableXSortableFieldsEnumObject)(definition);
ctx.output.addEnum(searchableXSortableFieldsDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortInput`)) {
const searchableXSortableInputDirection = (0, definitions_1.makeSearchableXSortInputObject)(definition);
ctx.output.addInput(searchableXSortableInputDirection);
}
if (!ctx.output.hasType('SearchableAggregateType')) {
const searchableAggregateTypeEnum = (0, definitions_1.makeSearchableAggregateTypeEnumObject)();
ctx.output.addEnum(searchableAggregateTypeEnum);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregateField`)) {
const searchableXAggregationField = (0, definitions_1.makeSearchableXAggregateFieldEnumObject)(definition, ctx.inputDocument);
ctx.output.addEnum(searchableXAggregationField);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregationInput`)) {
const searchableXAggregationInput = (0, definitions_1.makeSearchableXAggregationInputObject)(definition);
ctx.output.addInput(searchableXAggregationInput);
}
}
}
exports.SearchableModelTransformer = SearchableModelTransformer;
function getTable(context, definition) {
const ddbDataSource = context.dataSources.get(definition);
const tableName = graphql_transformer_common_1.ModelResourceIDs.ModelTableResourceID(definition.name.value);
const table = ddbDataSource.ds.stack.node.findChild(tableName);
return table;
}
function getNonKeywordFields(def) {
var _a;
const nonKeywordTypeSet = new Set(nonKeywordTypes);
return ((_a = def.fields) === null || _a === void 0 ? void 0 : _a.filter(field => nonKeywordTypeSet.has((0, graphql_transformer_common_1.getBaseType)(field.type)) && !definitions_1.DATASTORE_SYNC_FIELDS.includes(field.name.value)).map(field => (0, graphql_mapping_template_1.str)(field.name.value))) || [];
}
function getKeyFields(primaryKey, table) {
let keyFields = [];
keyFields.push(primaryKey);
let { attributeName } = table.keySchema.find((att) => att.keyType === 'RANGE') || {};
if (attributeName) {
keyFields.push(...attributeName.split('#'));
}
return keyFields.map(key => (0, graphql_mapping_template_1.str)(key));
}
//# sourceMappingURL=graphql-searchable-transformer.js.map
{
"name": "@aws-amplify/graphql-searchable-transformer",
"version": "0.15.3",
"version": "0.15.4-alpha.0+fc53f1c2e",
"description": "Amplfy GraphQL @searchable transformer",

@@ -30,5 +30,5 @@ "repository": {

"dependencies": {
"@aws-amplify/graphql-model-transformer": "0.15.3",
"@aws-amplify/graphql-transformer-core": "0.17.9",
"@aws-amplify/graphql-transformer-interfaces": "1.14.6",
"@aws-amplify/graphql-model-transformer": "0.15.4-alpha.0+fc53f1c2e",
"@aws-amplify/graphql-transformer-core": "0.17.10-alpha.3+fc53f1c2e",
"@aws-amplify/graphql-transformer-interfaces": "1.14.7-alpha.3+fc53f1c2e",
"@aws-cdk/aws-appsync": "~1.124.0",

@@ -42,4 +42,4 @@ "@aws-cdk/aws-dynamodb": "~1.124.0",

"graphql": "^14.5.8",
"graphql-mapping-template": "4.20.5",
"graphql-transformer-common": "4.24.0"
"graphql-mapping-template": "4.20.6-alpha.62+fc53f1c2e",
"graphql-transformer-common": "4.24.1-alpha.27+fc53f1c2e"
},

@@ -69,3 +69,3 @@ "devDependencies": {

},
"gitHead": "f6fb8c3a51b6ec066924a2e3e1756dadea9802ee"
"gitHead": "fc53f1c2ee63f40d3bb8a50660d0269b3e5657c2"
}

@@ -8,11 +8,10 @@ import { ModelTransformer } from '@aws-amplify/graphql-model-transformer';

const featureFlags = {
getBoolean: jest.fn().mockImplementation((name, defaultValue) => {
getBoolean: jest.fn().mockImplementation((name): boolean => {
if (name === 'improvePluralization') {
return true;
}
return false;
}),
getNumber: jest.fn(),
getObject: jest.fn(),
};

@@ -19,0 +18,0 @@

import { ConflictHandlerType, GraphQLTransform } from '@aws-amplify/graphql-transformer-core';
import { ModelTransformer } from '@aws-amplify/graphql-model-transformer';
import {
anything, countResources, expect as cdkExpect, haveResource, ResourcePart
anything, countResources, expect as cdkExpect, haveResource, ResourcePart,
} from '@aws-cdk/assert';

@@ -10,11 +10,10 @@ import { parse } from 'graphql';

const featureFlags = {
getBoolean: jest.fn().mockImplementation((name, defaultValue) => {
getBoolean: jest.fn().mockImplementation((name): boolean => {
if (name === 'improvePluralization') {
return true;
}
return false;
}),
getNumber: jest.fn(),
getObject: jest.fn(),
};

@@ -235,5 +234,6 @@

haveResource('AWS::Elasticsearch::Domain', {
UpdateReplacePolicy: "Delete",
DeletionPolicy: "Delete"
}, ResourcePart.CompleteDefinition));
UpdateReplacePolicy: 'Delete',
DeletionPolicy: 'Delete',
}, ResourcePart.CompleteDefinition),
);
cdkExpect(searchableStack).to(

@@ -403,3 +403,3 @@ haveResource('AWS::AppSync::DataSource', {

});
const out = transformer.transform(validSchema);

@@ -406,0 +406,0 @@ expect(parse(out.schema)).toBeDefined();

@@ -0,1 +1,2 @@

/* eslint-disable no-new */
import { Construct, Fn } from '@aws-cdk/core';

@@ -13,3 +14,3 @@ import { CfnOutput } from '@aws-cdk/core';

new CfnOutput(stack, OpenSearchDomainEndpoint, {
value: 'https://' + endpoint,
value: `https://${endpoint}`,
description: 'OpenSearch instance Domain Endpoint.',

@@ -16,0 +17,0 @@ exportName: Fn.join(':', [apiId, 'GetAtt', 'OpenSearch', 'DomainEndpoint']).toString(),

import { ResourceConstants } from 'graphql-transformer-common';
import { CfnParameter, Stack } from '@aws-cdk/core';
export function createParametersStack(stack: Stack): Map<string, CfnParameter> {
export const createParametersStack = (stack: Stack): Map<string, CfnParameter> => {
const {

@@ -39,4 +39,5 @@ OpenSearchAccessIAMRoleName,

new CfnParameter(stack, OpenSearchStreamingLambdaRuntime, {
description: `The lambda runtime \
(https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html#SSS-CreateFunction-request-Runtime)`,
// eslint-disable-next-line no-multi-str
description: 'The lambda runtime \
(https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html#SSS-CreateFunction-request-Runtime)',
default: 'python3.6',

@@ -213,2 +214,2 @@ }),

]);
}
};
import { CfnMapping, Construct } from '@aws-cdk/core';
export function setMappings(scope: Construct): CfnMapping {
return new CfnMapping(scope, 'LayerResourceMapping', {
export const setMappings = (scope: Construct): CfnMapping => new CfnMapping(
scope,
'LayerResourceMapping',
{
mapping: {

@@ -76,3 +78,3 @@ 'ap-northeast-1': {

},
});
}
},
);

@@ -17,3 +17,3 @@ import { GraphQLAPIProvider } from '@aws-amplify/graphql-transformer-interfaces';

assert(region);
const dsEndpoint = 'https://' + domainEndpoint;
const dsEndpoint = `https://${domainEndpoint}`;
return graphqlApiProvider.host.addSearchableDataSource(

@@ -20,0 +20,0 @@ OpenSearchDataSourceLogicalID,

@@ -5,5 +5,8 @@ import { TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';

import { IRole, Role, ServicePrincipal } from '@aws-cdk/aws-iam';
import { CfnParameter, Construct, Fn, RemovalPolicy } from '@aws-cdk/core';
import {
CfnParameter, Construct, Fn, RemovalPolicy,
} from '@aws-cdk/core';
import { ResourceConstants } from 'graphql-transformer-common';
import assert from 'assert';
export const createSearchableDomain = (stack: Construct, parameterMap: Map<string, CfnParameter>, apiId: string): Domain => {

@@ -24,4 +27,4 @@ const { OpenSearchEBSVolumeGB, OpenSearchInstanceType, OpenSearchInstanceCount } = ResourceConstants.PARAMETERS;

},
domainName: Fn.conditionIf(HasEnvironmentParameter, Fn.ref('AWS::NoValue'), 'd' + apiId).toString(),
removalPolicy: RemovalPolicy.DESTROY
domainName: Fn.conditionIf(HasEnvironmentParameter, Fn.ref('AWS::NoValue'), `d${apiId}`).toString(),
removalPolicy: RemovalPolicy.DESTROY,
});

@@ -28,0 +31,0 @@

import { GraphQLAPIProvider, TransformerContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
import { EventSourceMapping, IFunction, LayerVersion, Runtime, StartingPosition } from '@aws-cdk/aws-lambda';
import { CfnParameter, Construct, Fn, Stack, Duration } from '@aws-cdk/core';
import { Effect, IRole, Policy, PolicyStatement, Role, ServicePrincipal } from '@aws-cdk/aws-iam';
import {
EventSourceMapping, IFunction, LayerVersion, Runtime, StartingPosition,
} from '@aws-cdk/aws-lambda';
import {
CfnParameter, Construct, Fn, Stack, Duration,
} from '@aws-cdk/core';
import {
Effect, IRole, Policy, PolicyStatement, Role, ServicePrincipal,
} from '@aws-cdk/aws-iam';
import { ResourceConstants, SearchableResourceIDs } from 'graphql-transformer-common';

@@ -22,3 +28,3 @@ import * as path from 'path';

const enviroment: { [key: string]: string } = {
OPENSEARCH_ENDPOINT: 'https://' + endpoint,
OPENSEARCH_ENDPOINT: `https://${endpoint}`,
OPENSEARCH_REGION: region,

@@ -31,3 +37,3 @@ DEBUG: parameterMap.get(OpenSearchDebugStreamingLambda)!.valueAsString,

OpenSearchStreamingLambdaFunctionLogicalID,
'functions/' + OpenSearchStreamingLambdaFunctionLogicalID + '.zip',
`functions/${OpenSearchStreamingLambdaFunctionLogicalID}.zip`,
parameterMap.get(OpenSearchStreamingLambdaHandlerName)!.valueAsString,

@@ -34,0 +40,0 @@ path.resolve(__dirname, '..', '..', 'lib', 'streaming-lambda.zip'),

@@ -29,2 +29,3 @@ import {

import { TransformerTransformSchemaStepContextProvider } from '@aws-amplify/graphql-transformer-interfaces';
const ID_CONDITIONS = [

@@ -60,3 +61,31 @@ 'ne',

export function makeSearchableScalarInputObject(type: string): InputObjectTypeDefinitionNode {
const getScalarFilterInputType = (condition: string, type: string): TypeNode => {
switch (condition) {
case 'range':
return makeListType(makeNamedType(type));
case 'exists':
return makeNamedType('Boolean');
default:
return makeNamedType(type);
}
};
const getScalarConditions = (type: string): string[] => {
switch (type) {
case 'String':
return STRING_CONDITIONS;
case 'ID':
return ID_CONDITIONS;
case 'Int':
return INT_CONDITIONS;
case 'Float':
return FLOAT_CONDITIONS;
case 'Boolean':
return BOOLEAN_CONDITIONS;
default:
throw new Error('Valid types are String, ID, Int, Float, Boolean');
}
};
export const makeSearchableScalarInputObject = (type: string): InputObjectTypeDefinitionNode => {
const name = SearchableResourceIDs.SearchableFilterInputTypeName(type);

@@ -67,3 +96,3 @@ const conditions = getScalarConditions(type);

name: { kind: 'Name' as const, value: condition },
type: getScalarFilterInputType(condition, type, name),
type: getScalarFilterInputType(condition, type),
// TODO: Service does not support new style descriptions so wait.

@@ -87,5 +116,5 @@ // description: field.description,

};
}
};
export function makeSearchableXFilterInputObject(obj: ObjectTypeDefinitionNode, document: DocumentNode): InputObjectTypeDefinitionNode {
export const makeSearchableXFilterInputObject = (obj: ObjectTypeDefinitionNode, document: DocumentNode): InputObjectTypeDefinitionNode => {
const name = SearchableResourceIDs.SearchableFilterInputTypeName(obj.name.value);

@@ -96,7 +125,20 @@ assert(obj.fields);

.map(
(field: FieldDefinitionNode) =>
({
(field: FieldDefinitionNode) => ({
kind: Kind.INPUT_VALUE_DEFINITION,
name: field.name,
type: makeNamedType(SearchableResourceIDs.SearchableFilterInputTypeName(getBaseType(field.type))),
// TODO: Service does not support new style descriptions so wait.
// description: field.description,
directives: [],
} as InputValueDefinitionNode),
);
fields.push(
...obj.fields
.filter((field: FieldDefinitionNode) => isEnum(field.type, document))
.map(
(field: FieldDefinitionNode) => ({
kind: Kind.INPUT_VALUE_DEFINITION,
name: field.name,
type: makeNamedType(SearchableResourceIDs.SearchableFilterInputTypeName(getBaseType(field.type))),
type: makeNamedType(SearchableResourceIDs.SearchableFilterInputTypeName('String')),
// TODO: Service does not support new style descriptions so wait.

@@ -106,17 +148,2 @@ // description: field.description,

} as InputValueDefinitionNode),
);
fields.push(
...obj.fields
.filter((field: FieldDefinitionNode) => isEnum(field.type, document))
.map(
(field: FieldDefinitionNode) =>
({
kind: Kind.INPUT_VALUE_DEFINITION,
name: field.name,
type: makeNamedType(SearchableResourceIDs.SearchableFilterInputTypeName('String')),
// TODO: Service does not support new style descriptions so wait.
// description: field.description,
directives: [],
} as InputValueDefinitionNode),
),

@@ -169,6 +196,6 @@ );

};
}
};
export function makeSearchableSortDirectionEnumObject(): EnumTypeDefinitionNode {
const name = graphqlName(`SearchableSortDirection`);
export const makeSearchableSortDirectionEnumObject = (): EnumTypeDefinitionNode => {
const name = graphqlName('SearchableSortDirection');
return {

@@ -194,5 +221,5 @@ kind: Kind.ENUM_TYPE_DEFINITION,

};
}
};
export function makeSearchableXSortableFieldsEnumObject(obj: ObjectTypeDefinitionNode): EnumTypeDefinitionNode {
export const makeSearchableXSortableFieldsEnumObject = (obj: ObjectTypeDefinitionNode): EnumTypeDefinitionNode => {
const name = graphqlName(`Searchable${obj.name.value}SortableFields`);

@@ -217,5 +244,5 @@ assert(obj.fields);

};
}
};
export function makeSearchableXAggregateFieldEnumObject(obj: ObjectTypeDefinitionNode, document: DocumentNode): EnumTypeDefinitionNode {
export const makeSearchableXAggregateFieldEnumObject = (obj: ObjectTypeDefinitionNode, document: DocumentNode): EnumTypeDefinitionNode => {
const name = graphqlName(`Searchable${obj.name.value}AggregateField`);

@@ -240,5 +267,5 @@ assert(obj.fields);

};
}
};
export function makeSearchableXSortInputObject(obj: ObjectTypeDefinitionNode): InputObjectTypeDefinitionNode {
export const makeSearchableXSortInputObject = (obj: ObjectTypeDefinitionNode): InputObjectTypeDefinitionNode => {
const name = graphqlName(`Searchable${obj.name.value}SortInput`);

@@ -282,5 +309,5 @@ return {

};
}
};
export function makeSearchableAggregateTypeEnumObject(): EnumTypeDefinitionNode {
export const makeSearchableAggregateTypeEnumObject = (): EnumTypeDefinitionNode => {
const name = graphqlName('SearchableAggregateType');

@@ -302,5 +329,5 @@ const values: EnumValueDefinitionNode[] = ['terms', 'avg', 'min', 'max', 'sum'].map((type: string) => ({

};
}
};
export function makeSearchableXAggregationInputObject(obj: ObjectTypeDefinitionNode): InputObjectTypeDefinitionNode {
export const makeSearchableXAggregationInputObject = (obj: ObjectTypeDefinitionNode): InputObjectTypeDefinitionNode => {
const name = graphqlName(`Searchable${obj.name.value}AggregationInput`);

@@ -335,31 +362,4 @@ return {

};
}
};
function getScalarFilterInputType(condition: string, type: string, filterInputName: string): TypeNode {
switch (condition) {
case 'range':
return makeListType(makeNamedType(type));
case 'exists':
return makeNamedType('Boolean');
default:
return makeNamedType(type);
}
}
function getScalarConditions(type: string): string[] {
switch (type) {
case 'String':
return STRING_CONDITIONS;
case 'ID':
return ID_CONDITIONS;
case 'Int':
return INT_CONDITIONS;
case 'Float':
return FLOAT_CONDITIONS;
case 'Boolean':
return BOOLEAN_CONDITIONS;
default:
throw 'Valid types are String, ID, Int, Float, Boolean';
}
}
export const extendTypeWithDirectives = (

@@ -380,8 +380,8 @@ ctx: TransformerTransformSchemaStepContextProvider,

directives: Array<DirectiveNode>,
) => {
): void => {
const type = ctx.output.getType(typeName) as ObjectTypeDefinitionNode;
if (type) {
const field = type.fields?.find(f => f.name.value === fieldName);
const field = type.fields?.find((f) => f.name.value === fieldName);
if (field) {
const newFields = [...type.fields!.filter(f => f.name.value !== field.name.value), extendFieldWithDirectives(field, directives)];
const newFields = [...type.fields!.filter((f) => f.name.value !== field.name.value), extendFieldWithDirectives(field, directives)];

@@ -403,3 +403,3 @@ const newType = {

directives: Array<DirectiveNode>,
) => {
): void => {
// add directives to the given operation

@@ -411,3 +411,3 @@ addDirectivesToField(ctx, typeName, operationName, directives);

if (type) {
const field = type.fields!.find(f => f.name.value === operationName);
const field = type.fields!.find((f) => f.name.value === operationName);

@@ -414,0 +414,0 @@ if (field) {

@@ -0,1 +1,2 @@

/* eslint-disable no-template-curly-in-string */
import {

@@ -31,198 +32,193 @@ SearchableMappingTemplate,

export function requestTemplate(
export const sandboxMappingTemplate = (enabled: boolean, fields: Array<string>): string => {
let sandboxExp: Expression;
if (enabled) {
sandboxExp = ifElse(
notEquals(methodCall(ref('util.authType')), str(API_KEY)),
methodCall(ref('util.unauthorized')),
qref(methodCall(ref('ctx.stash.put'), str(allowedAggFieldsList), raw(JSON.stringify(fields)))),
);
} else {
sandboxExp = methodCall(ref('util.unauthorized'));
}
return printBlock(`Sandbox Mode ${enabled ? 'Enabled' : 'Disabled'}`)(
compoundExpression([iff(not(ref('ctx.stash.get("hasAuth")')), sandboxExp), toJson(obj({}))]),
);
};
const getSourceMapper = (includeVersion: boolean): Expression[] => {
if (includeVersion) {
return [
set(ref('row'), methodCall(ref('entry.get'), str('_source'))),
qref('$row.put("_version", $entry.get("_version"))'),
qref('$es_items.add($row)'),
];
}
return [qref('$es_items.add($entry.get("_source"))')];
};
export const requestTemplate = (
primaryKey: string,
nonKeywordFields: Expression[],
includeVersion: boolean = false,
includeVersion = false,
indexName: string,
type: string,
keyFields: Expression[] = [],
): string {
return print(
compoundExpression([
setArgs,
set(ref('indexPath'), str(`/${indexName.toLowerCase()}/_search`)),
set(ref('allowedAggFields'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.allowedAggFields'), list([]))),
set(ref('aggFieldsFilterMap'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.aggFieldsFilterMap'), obj({}))),
set(ref('nonKeywordFields'), list(nonKeywordFields)),
set(ref('keyFields'), list(keyFields)),
set(ref('sortValues'), list([])),
set(ref('sortFields'), list([])),
set(ref('aggregateValues'), obj({})),
set(ref('primaryKey'), str(primaryKey)),
iff(
not(ref('util.isNullOrEmpty($args.sort)')),
compoundExpression([
// Sort based on the config passed on the request
forEach(ref('sortItem'), ref('args.sort'), [
): string => print(
compoundExpression([
setArgs,
set(ref('indexPath'), str(`/${indexName.toLowerCase()}/_search`)),
set(ref('allowedAggFields'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.allowedAggFields'), list([]))),
set(ref('aggFieldsFilterMap'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.aggFieldsFilterMap'), obj({}))),
set(ref('nonKeywordFields'), list(nonKeywordFields)),
set(ref('keyFields'), list(keyFields)),
set(ref('sortValues'), list([])),
set(ref('sortFields'), list([])),
set(ref('aggregateValues'), obj({})),
set(ref('primaryKey'), str(primaryKey)),
iff(
not(ref('util.isNullOrEmpty($args.sort)')),
compoundExpression([
// Sort based on the config passed on the request
forEach(ref('sortItem'), ref('args.sort'), [
ifElse(
ref('util.isNullOrEmpty($sortItem.field)'),
qref('$sortFields.add($primaryKey)'),
qref('$sortFields.add($sortItem.field)'),
),
ifElse(
ref('util.isNullOrEmpty($sortItem.field)'),
ifElse(
ref('util.isNullOrEmpty($sortItem.field)'),
qref('$sortFields.add($primaryKey)'),
qref('$sortFields.add($sortItem.field)'),
ref('nonKeywordFields.contains($primaryKey)'),
set(ref('sortField'), ref('util.toJson($primaryKey)')),
set(ref('sortField'), ref('util.toJson("${primaryKey}.keyword")')),
),
ifElse(
ref('util.isNullOrEmpty($sortItem.field)'),
ifElse(
ref('nonKeywordFields.contains($primaryKey)'),
set(ref('sortField'), ref('util.toJson($primaryKey)')),
set(ref('sortField'), ref('util.toJson("${primaryKey}.keyword")')),
),
ifElse(
ref('nonKeywordFields.contains($sortItem.field)'),
set(ref('sortField'), ref('util.toJson($sortItem.field)')),
set(ref('sortField'), ref('util.toJson("${sortItem.field}.keyword")')),
),
ref('nonKeywordFields.contains($sortItem.field)'),
set(ref('sortField'), ref('util.toJson($sortItem.field)')),
set(ref('sortField'), ref('util.toJson("${sortItem.field}.keyword")')),
),
ifElse(
ref('util.isNullOrEmpty($sortItem.direction)'),
set(ref('sortDirection'), ref('util.toJson({"order": "desc"})')),
set(ref('sortDirection'), ref('util.toJson({"order": $sortItem.direction})')),
),
qref('$sortValues.add("{$sortField: $sortDirection}")'),
]),
]),
),
// Add the key field to sort if not included already
forEach(ref('keyItem'), ref('keyFields'), [
iff(
not(ref('sortFields.contains($keyItem)')),
compoundExpression([
ifElse(
ref('nonKeywordFields.contains($keyItem)'),
set(ref('sortField'), ref('util.toJson($keyItem)')),
set(ref('sortField'), ref('util.toJson("${keyItem}.keyword")')),
),
),
ifElse(
ref('util.isNullOrEmpty($sortItem.direction)'),
set(ref('sortDirection'), ref('util.toJson({"order": "desc"})')),
qref('$sortValues.add("{$sortField: $sortDirection}")'),
]),
),
]),
forEach(ref('aggItem'), ref('args.aggregates'), [
raw(
'#if( $allowedAggFields.contains($aggItem.field) )\n' +
' #set( $aggFilter = { "match_all": {} } )\n' +
' #elseif( $aggFieldsFilterMap.containsKey($aggItem.field) )\n' +
' #set( $aggFilter = { "bool": { "should": $aggFieldsFilterMap.get($aggItem.field) } } )\n' +
' #else\n' +
' $util.error("Unauthorized to run aggregation on field: ${aggItem.field}", "Unauthorized")\n' +
' #end',
),
ifElse(
ref('nonKeywordFields.contains($aggItem.field)'),
qref(
'$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "$aggItem.field" }}} })',
set(ref('sortDirection'), ref('util.toJson({"order": $sortItem.direction})')),
),
qref(
'$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "${aggItem.field}.keyword" }}} })',
),
),
qref('$sortValues.add("{$sortField: $sortDirection}")'),
]),
]),
ifElse(
not(isNullOrEmpty(authFilter)),
),
// Add the key field to sort if not included already
forEach(ref('keyItem'), ref('keyFields'), [
iff(
not(ref('sortFields.contains($keyItem)')),
compoundExpression([
set(ref('filter'), authFilter),
iff(
not(isNullOrEmpty(ref('args.filter'))),
set(
ref('filter'),
obj({
bool: obj({
must: list([ref('ctx.stash.authFilter'), ref('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')]),
}),
}),
),
ifElse(
ref('nonKeywordFields.contains($keyItem)'),
set(ref('sortField'), ref('util.toJson($keyItem)')),
set(ref('sortField'), ref('util.toJson("${keyItem}.keyword")')),
),
set(ref('sortDirection'), ref('util.toJson({"order": "desc"})')),
qref('$sortValues.add("{$sortField: $sortDirection}")'),
]),
iff(
not(isNullOrEmpty(ref('args.filter'))),
set(ref('filter'), ref('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')),
),
]),
forEach(ref('aggItem'), ref('args.aggregates'), [
raw(
'#if( $allowedAggFields.contains($aggItem.field) )\n'
+ ' #set( $aggFilter = { "match_all": {} } )\n'
+ ' #elseif( $aggFieldsFilterMap.containsKey($aggItem.field) )\n'
+ ' #set( $aggFilter = { "bool": { "should": $aggFieldsFilterMap.get($aggItem.field) } } )\n'
+ ' #else\n'
+ ' $util.error("Unauthorized to run aggregation on field: ${aggItem.field}", "Unauthorized")\n'
+ ' #end',
),
ifElse(
ref('nonKeywordFields.contains($aggItem.field)'),
qref(
'$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "$aggItem.field" }}} })',
),
qref(
'$aggregateValues.put("$aggItem.name", { "filter": $aggFilter, "aggs": { "$aggItem.name": { "$aggItem.type": { "field": "${aggItem.field}.keyword" }}} })',
),
),
iff(isNullOrEmpty(ref('filter')), set(ref('filter'), obj({ match_all: obj({}) }))),
SearchableMappingTemplate.searchTemplate({
path: str('$indexPath'),
size: ifElse(ref('args.limit'), ref('args.limit'), int(ResourceConstants.DEFAULT_SEARCHABLE_PAGE_LIMIT), true),
search_after: ref('util.base64Decode($args.nextToken)'),
from: ref('args.from'),
version: bool(includeVersion),
query: methodCall(ref('util.toJson'), ref('filter')),
sort: ref('sortValues'),
aggs: ref('util.toJson($aggregateValues)'),
}),
]),
);
}
export function responseTemplate(includeVersion = false) {
return print(
compoundExpression([
set(ref('es_items'), list([])),
set(ref('aggregateValues'), list([])),
forEach(ref('entry'), ref('context.result.hits.hits'), [
iff(raw('!$foreach.hasNext'), set(ref('nextToken'), ref('util.base64Encode($util.toJson($entry.sort))'))),
...getSourceMapper(includeVersion),
]),
forEach(ref('aggItem'), ref('context.result.aggregations.keySet()'), [
set(ref('aggResult'), obj({})),
set(ref('aggResultValue'), obj({})),
set(ref('currentAggItem'), ref('ctx.result.aggregations.get($aggItem)')),
qref('$aggResult.put("name", $aggItem)'),
ifElse(
not(isNullOrEmpty(authFilter)),
compoundExpression([
set(ref('filter'), authFilter),
iff(
raw('!$util.isNullOrEmpty($currentAggItem)'),
compoundExpression([
iff(
raw('!$util.isNullOrEmpty($currentAggItem.get($aggItem).buckets)'),
compoundExpression([
qref('$aggResultValue.put("__typename", "SearchableAggregateBucketResult")'),
qref('$aggResultValue.put("buckets", $currentAggItem.get($aggItem).buckets)'),
]),
),
iff(
raw('!$util.isNullOrEmpty($currentAggItem.get($aggItem).value)'),
compoundExpression([
qref('$aggResultValue.put("__typename", "SearchableAggregateScalarResult")'),
qref('$aggResultValue.put("value", $currentAggItem.get($aggItem).value)'),
]),
),
]),
not(isNullOrEmpty(ref('args.filter'))),
set(
ref('filter'),
obj({
bool: obj({
must: list([ref('ctx.stash.authFilter'), ref('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')]),
}),
}),
),
),
qref('$aggResult.put("result", $aggResultValue)'),
qref('$aggregateValues.add($aggResult)'),
]),
toJson(
obj({
items: ref('es_items'),
total: ref('ctx.result.hits.total.value'),
nextToken: ref('nextToken'),
aggregateItems: ref('aggregateValues'),
}),
iff(
not(isNullOrEmpty(ref('args.filter'))),
set(ref('filter'), ref('util.parseJson($util.transform.toElasticsearchQueryDSL($args.filter))')),
),
),
iff(isNullOrEmpty(ref('filter')), set(ref('filter'), obj({ match_all: obj({}) }))),
SearchableMappingTemplate.searchTemplate({
path: str('$indexPath'),
size: ifElse(ref('args.limit'), ref('args.limit'), int(ResourceConstants.DEFAULT_SEARCHABLE_PAGE_LIMIT), true),
search_after: ref('util.base64Decode($args.nextToken)'),
from: ref('args.from'),
version: bool(includeVersion),
query: methodCall(ref('util.toJson'), ref('filter')),
sort: ref('sortValues'),
aggs: ref('util.toJson($aggregateValues)'),
}),
]),
);
export const responseTemplate = (includeVersion = false): string => print(
compoundExpression([
set(ref('es_items'), list([])),
set(ref('aggregateValues'), list([])),
forEach(ref('entry'), ref('context.result.hits.hits'), [
iff(raw('!$foreach.hasNext'), set(ref('nextToken'), ref('util.base64Encode($util.toJson($entry.sort))'))),
...getSourceMapper(includeVersion),
]),
);
}
export function sandboxMappingTemplate(enabled: boolean, fields: Array<string>) {
let sandboxExp: Expression;
if (enabled) {
sandboxExp = ifElse(
notEquals(methodCall(ref('util.authType')), str(API_KEY)),
methodCall(ref('util.unauthorized')),
qref(methodCall(ref('ctx.stash.put'), str(allowedAggFieldsList), raw(JSON.stringify(fields)))),
);
} else {
sandboxExp = methodCall(ref('util.unauthorized'));
}
return printBlock(`Sandbox Mode ${enabled ? 'Enabled' : 'Disabled'}`)(
compoundExpression([iff(not(ref('ctx.stash.get("hasAuth")')), sandboxExp), toJson(obj({}))]),
);
}
function getSourceMapper(includeVersion: boolean) {
if (includeVersion) {
return [
set(ref('row'), methodCall(ref('entry.get'), str('_source'))),
qref('$row.put("_version", $entry.get("_version"))'),
qref('$es_items.add($row)'),
];
}
return [qref('$es_items.add($entry.get("_source"))')];
}
forEach(ref('aggItem'), ref('context.result.aggregations.keySet()'), [
set(ref('aggResult'), obj({})),
set(ref('aggResultValue'), obj({})),
set(ref('currentAggItem'), ref('ctx.result.aggregations.get($aggItem)')),
qref('$aggResult.put("name", $aggItem)'),
iff(
raw('!$util.isNullOrEmpty($currentAggItem)'),
compoundExpression([
iff(
raw('!$util.isNullOrEmpty($currentAggItem.get($aggItem).buckets)'),
compoundExpression([
qref('$aggResultValue.put("__typename", "SearchableAggregateBucketResult")'),
qref('$aggResultValue.put("buckets", $currentAggItem.get($aggItem).buckets)'),
]),
),
iff(
raw('!$util.isNullOrEmpty($currentAggItem.get($aggItem).value)'),
compoundExpression([
qref('$aggResultValue.put("__typename", "SearchableAggregateScalarResult")'),
qref('$aggResultValue.put("value", $currentAggItem.get($aggItem).value)'),
]),
),
]),
),
qref('$aggResult.put("result", $aggResultValue)'),
qref('$aggregateValues.add($aggResult)'),
]),
toJson(
obj({
items: ref('es_items'),
total: ref('ctx.result.hits.total.value'),
nextToken: ref('nextToken'),
aggregateItems: ref('aggregateValues'),
}),
),
]),
);

@@ -1,3 +0,5 @@

import { TransformerPluginBase, InvalidDirectiveError, MappingTemplate, DirectiveWrapper } from '@aws-amplify/graphql-transformer-core';
import {
TransformerPluginBase, InvalidDirectiveError, MappingTemplate, DirectiveWrapper,
} from '@aws-amplify/graphql-transformer-core';
import {
DataSourceProvider,

@@ -11,3 +13,5 @@ TransformerContextProvider,

import { Table } from '@aws-cdk/aws-dynamodb';
import { CfnCondition, CfnParameter, Fn, IConstruct } from '@aws-cdk/core';
import {
CfnCondition, CfnParameter, Fn, IConstruct,
} from '@aws-cdk/core';
import { DirectiveNode, InputObjectTypeDefinitionNode, ObjectTypeDefinitionNode } from 'graphql';

@@ -35,2 +39,3 @@ import { Expression, str } from 'graphql-mapping-template';

} from 'graphql-transformer-common';
import assert from 'assert';
import { createParametersStack as createParametersInStack } from './cdk/create-cfnParameters';

@@ -51,3 +56,2 @@ import { requestTemplate, responseTemplate, sandboxMappingTemplate } from './generate-resolver-vtl';

} from './definitions';
import assert from 'assert';
import { setMappings } from './cdk/create-layer-cfnMapping';

@@ -61,2 +65,196 @@ import { createSearchableDomain, createSearchableDomainRole } from './cdk/create-searchable-domain';

const STACK_NAME = 'SearchableStack';
const getTable = (context: TransformerContextProvider, definition: ObjectTypeDefinitionNode): IConstruct => {
const ddbDataSource = context.dataSources.get(definition) as DynamoDbDataSource;
const tableName = ModelResourceIDs.ModelTableResourceID(definition.name.value);
const table = ddbDataSource.ds.stack.node.findChild(tableName);
return table;
};
const getNonKeywordFields = (def: ObjectTypeDefinitionNode): Expression[] => {
const nonKeywordTypeSet = new Set(nonKeywordTypes);
return def.fields?.filter((field) => nonKeywordTypeSet.has(getBaseType(field.type))
&& !DATASTORE_SYNC_FIELDS.includes(field.name.value)).map((field) => str(field.name.value)) || [];
};
/**
* Returns all the keys fields - primaryKey and sortKeys
* @param primaryKey primary key field name
* @param table model table
* @returns Expression[] keyFields
*/
const getKeyFields = (primaryKey: string, table: IConstruct): Expression[] => {
const keyFields = [];
keyFields.push(primaryKey);
const { attributeName } = (table as any).keySchema.find((att: any) => att.keyType === 'RANGE') || {};
if (attributeName) {
keyFields.push(...attributeName.split('#'));
}
return keyFields.map((key) => str(key));
};
const generateSearchableXConnectionType = (ctx: TransformerSchemaVisitStepContextProvider, definition: ObjectTypeDefinitionNode): void => {
const searchableXConnectionName = `Searchable${definition.name.value}Connection`;
if (ctx.output.hasType(searchableXConnectionName)) {
return;
}
// Create the TableXConnection
const connectionType = blankObject(searchableXConnectionName);
ctx.output.addObject(connectionType);
// Create TableXConnection type with items and nextToken
let connectionTypeExtension = blankObjectExtension(searchableXConnectionName);
connectionTypeExtension = extensionWithFields(connectionTypeExtension, [
makeField('items', [], makeNonNullType(makeListType(makeNamedType(definition.name.value)))),
]);
connectionTypeExtension = extensionWithFields(connectionTypeExtension, [
makeField('nextToken', [], makeNamedType('String')),
makeField('total', [], makeNamedType('Int')),
makeField('aggregateItems', [], makeNonNullType(makeListType(makeNamedType('SearchableAggregateResult')))),
]);
ctx.output.addObjectExtension(connectionTypeExtension);
};
const generateSearchableAggregateScalarResultType = (ctx: TransformerSchemaVisitStepContextProvider): string => {
const searchableAggregateScalarResult = 'SearchableAggregateScalarResult';
if (ctx.output.hasType(searchableAggregateScalarResult)) {
return searchableAggregateScalarResult;
}
// Create the SearchableAggregateScalarResult
const aggregateScalarType = blankObject(searchableAggregateScalarResult);
ctx.output.addObject(aggregateScalarType);
// Create SearchableAggregateScalarResult type with value
let aggregateScalarTypeExtension = blankObjectExtension(searchableAggregateScalarResult);
aggregateScalarTypeExtension = extensionWithFields(aggregateScalarTypeExtension, [
makeField('value', [], makeNonNullType(makeNamedType('Float'))),
]);
ctx.output.addObjectExtension(aggregateScalarTypeExtension);
return searchableAggregateScalarResult;
};
const generateSearchableAggregateBucketResultItemType = (ctx: TransformerSchemaVisitStepContextProvider): string => {
const searchableAggregateBucketResultItem = 'SearchableAggregateBucketResultItem';
if (ctx.output.hasType(searchableAggregateBucketResultItem)) {
return searchableAggregateBucketResultItem;
}
// Create the SearchableAggregateBucketResultItem
const aggregateBucketResultItemType = blankObject(searchableAggregateBucketResultItem);
ctx.output.addObject(aggregateBucketResultItemType);
// Create SearchableAggregateBucketResultItem type with key and doc_count
let aggregateBucketResultItemTypeExtension = blankObjectExtension(searchableAggregateBucketResultItem);
aggregateBucketResultItemTypeExtension = extensionWithFields(aggregateBucketResultItemTypeExtension, [
makeField('key', [], makeNonNullType(makeNamedType('String'))),
makeField('doc_count', [], makeNonNullType(makeNamedType('Int'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultItemTypeExtension);
return searchableAggregateBucketResultItem;
};
const generateSearchableAggregateBucketResultType = (ctx: TransformerSchemaVisitStepContextProvider): string => {
const searchableAggregateBucketResult = 'SearchableAggregateBucketResult';
if (ctx.output.hasType(searchableAggregateBucketResult)) {
return searchableAggregateBucketResult;
}
// Create the SearchableAggregateBucketResultItem
const aggregateBucketResultType = blankObject(searchableAggregateBucketResult);
ctx.output.addObject(aggregateBucketResultType);
generateSearchableAggregateBucketResultItemType(ctx);
// Create SearchableAggregateBucketResultItem type with buckets
let aggregateBucketResultTypeExtension = blankObjectExtension(searchableAggregateBucketResult);
aggregateBucketResultTypeExtension = extensionWithFields(aggregateBucketResultTypeExtension, [
makeField('buckets', [], makeListType(makeNamedType('SearchableAggregateBucketResultItem'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultTypeExtension);
return searchableAggregateBucketResult;
};
const generateSearchableGenericResultType = (ctx: TransformerSchemaVisitStepContextProvider): void => {
const searchableAggregateGenericResult = 'SearchableAggregateGenericResult';
if (ctx.output.hasType(searchableAggregateGenericResult)) {
return;
}
const searchableAggregateGenericResultNode = defineUnionType(searchableAggregateGenericResult, [
makeNamedType(generateSearchableAggregateScalarResultType(ctx)),
makeNamedType(generateSearchableAggregateBucketResultType(ctx)),
]);
ctx.output.addUnion(searchableAggregateGenericResultNode);
};
const generateSearchableAggregateResultType = (ctx: TransformerSchemaVisitStepContextProvider): string => {
const searchableAggregateResult = 'SearchableAggregateResult';
if (ctx.output.hasType(searchableAggregateResult)) {
return searchableAggregateResult;
}
// Create the SearchableAggregateResult
const aggregateResultType = blankObject(searchableAggregateResult);
ctx.output.addObject(aggregateResultType);
// Create SearchableAggregateResult type with name and result
let aggregateResultTypeExtension = blankObjectExtension(searchableAggregateResult);
aggregateResultTypeExtension = extensionWithFields(aggregateResultTypeExtension, [
makeField('name', [], makeNonNullType(makeNamedType('String'))),
makeField('result', [], makeNamedType('SearchableAggregateGenericResult')),
]);
ctx.output.addObjectExtension(aggregateResultTypeExtension);
return searchableAggregateResult;
};
const generateSearchableAggregateTypes = (ctx: TransformerSchemaVisitStepContextProvider): void => {
generateSearchableAggregateResultType(ctx);
generateSearchableGenericResultType(ctx);
};
const generateSearchableInputs = (ctx: TransformerSchemaVisitStepContextProvider, definition: ObjectTypeDefinitionNode): void => {
const inputs: string[] = Object.keys(STANDARD_SCALARS);
inputs
.filter((input) => !ctx.output.hasType(`Searchable${input}FilterInput`))
.map(makeSearchableScalarInputObject)
.forEach((node: InputObjectTypeDefinitionNode) => ctx.output.addInput(node));
const searchableXQueryFilterInput = makeSearchableXFilterInputObject(definition, ctx.inputDocument);
if (!ctx.output.hasType(searchableXQueryFilterInput.name.value)) {
ctx.output.addInput(searchableXQueryFilterInput);
}
if (!ctx.output.hasType('SearchableSortDirection')) {
const searchableSortDirection = makeSearchableSortDirectionEnumObject();
ctx.output.addEnum(searchableSortDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortableFields`)) {
const searchableXSortableFieldsDirection = makeSearchableXSortableFieldsEnumObject(definition);
ctx.output.addEnum(searchableXSortableFieldsDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortInput`)) {
const searchableXSortableInputDirection = makeSearchableXSortInputObject(definition);
ctx.output.addInput(searchableXSortableInputDirection);
}
if (!ctx.output.hasType('SearchableAggregateType')) {
const searchableAggregateTypeEnum = makeSearchableAggregateTypeEnumObject();
ctx.output.addEnum(searchableAggregateTypeEnum);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregateField`)) {
const searchableXAggregationField = makeSearchableXAggregateFieldEnumObject(definition, ctx.inputDocument);
ctx.output.addEnum(searchableXAggregationField);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregationInput`)) {
const searchableXAggregationInput = makeSearchableXAggregationInputObject(definition);
ctx.output.addInput(searchableXAggregationInput);
}
};
export class SearchableModelTransformer extends TransformerPluginBase {

@@ -90,2 +288,3 @@ searchableObjectTypeDefinitions: { node: ObjectTypeDefinitionNode; fieldName: string }[];

// eslint-disable-next-line no-new
new CfnCondition(stack, HasEnvironmentParameter, {

@@ -134,3 +333,3 @@ expression: Fn.conditionNot(Fn.conditionEquals(envParam, ResourceConstants.NONE)),

const openSearchIndexName = context.resourceHelper.getModelNameMapping(type);
const fields = def.node.fields?.map(f => f.name.value) ?? [];
const fields = def.node.fields?.map((f) => f.name.value) ?? [];
const typeName = context.output.getQueryTypeName();

@@ -161,3 +360,2 @@ const table = getTable(context, def.node);

openSearchIndexName,
type,
keyFields,

@@ -169,3 +367,3 @@ ),

responseTemplate(context.isProjectUsingDataStore()),
`${typeName}.${def.fieldName}.res.vtl`
`${typeName}.${def.fieldName}.res.vtl`,
),

@@ -189,4 +387,4 @@ );

object = (definition: ObjectTypeDefinitionNode, directive: DirectiveNode, ctx: TransformerSchemaVisitStepContextProvider): void => {
const modelDirective = definition?.directives?.find(dir => dir.name.value === 'model');
const hasAuth = definition.directives?.some(dir => dir.name.value === 'auth') ?? false;
const modelDirective = definition?.directives?.find((dir) => dir.name.value === 'model');
const hasAuth = definition.directives?.some((dir) => dir.name.value === 'auth') ?? false;
if (!modelDirective) {

@@ -199,3 +397,3 @@ throw new InvalidDirectiveError('Types annotated with @searchable must also be annotated with @model.');

let shouldMakeSearch = true;
let searchFieldNameOverride = undefined;
let searchFieldNameOverride;

@@ -209,5 +407,3 @@ if (directiveArguments.queries) {

}
const fieldName = searchFieldNameOverride
? searchFieldNameOverride
: graphqlName(`search${plurality(toUpper(definition.name.value), true)}`);
const fieldName = searchFieldNameOverride ?? graphqlName(`search${plurality(toUpper(definition.name.value), true)}`);
this.searchableObjectTypeDefinitions.push({

@@ -220,4 +416,4 @@ node: definition,

this.searchableObjectNames.push(definition.name.value);
this.generateSearchableXConnectionType(ctx, definition);
this.generateSearchableAggregateTypes(ctx);
generateSearchableXConnectionType(ctx, definition);
generateSearchableAggregateTypes(ctx);
const directives = [];

@@ -244,3 +440,3 @@ if (!hasAuth && ctx.sandboxModeEnabled && ctx.authConfig.defaultAuthentication.authenticationType !== 'API_KEY') {

prepare = (ctx: TransformerPrepareStepContextProvider) => {
prepare = (ctx: TransformerPrepareStepContextProvider): void => {
// register search query resolvers in field mapping

@@ -255,12 +451,12 @@ // if no mappings are registered elsewhere, this won't do anything

transformSchema = (ctx: TransformerTransformSchemaStepContextProvider) => {
transformSchema = (ctx: TransformerTransformSchemaStepContextProvider): void => {
for (const name of this.searchableObjectNames) {
const searchObject = ctx.output.getObject(name) as ObjectTypeDefinitionNode;
this.generateSearchableInputs(ctx, searchObject);
generateSearchableInputs(ctx, searchObject);
}
// add api key to aggregate types if sandbox mode is enabled
if (ctx.sandboxModeEnabled && ctx.authConfig.defaultAuthentication.authenticationType !== 'API_KEY') {
for (let aggType of AGGREGATE_TYPES) {
for (const aggType of AGGREGATE_TYPES) {
const aggObject = ctx.output.getObject(aggType)!;
const hasApiKey = aggObject.directives?.some(dir => dir.name.value === 'aws_api_key') ?? false;
const hasApiKey = aggObject.directives?.some((dir) => dir.name.value === 'aws_api_key') ?? false;
if (!hasApiKey) {

@@ -272,203 +468,2 @@ extendTypeWithDirectives(ctx, aggType, [makeDirective('aws_api_key', [])]);

};
private generateSearchableXConnectionType(ctx: TransformerSchemaVisitStepContextProvider, definition: ObjectTypeDefinitionNode): void {
const searchableXConnectionName = `Searchable${definition.name.value}Connection`;
if (ctx.output.hasType(searchableXConnectionName)) {
return;
}
// Create the TableXConnection
const connectionType = blankObject(searchableXConnectionName);
ctx.output.addObject(connectionType);
// Create TableXConnection type with items and nextToken
let connectionTypeExtension = blankObjectExtension(searchableXConnectionName);
connectionTypeExtension = extensionWithFields(connectionTypeExtension, [
makeField('items', [], makeNonNullType(makeListType(makeNamedType(definition.name.value)))),
]);
connectionTypeExtension = extensionWithFields(connectionTypeExtension, [
makeField('nextToken', [], makeNamedType('String')),
makeField('total', [], makeNamedType('Int')),
makeField('aggregateItems', [], makeNonNullType(makeListType(makeNamedType(`SearchableAggregateResult`)))),
]);
ctx.output.addObjectExtension(connectionTypeExtension);
}
private generateSearchableAggregateTypes(ctx: TransformerSchemaVisitStepContextProvider): void {
this.generateSearchableAggregateResultType(ctx);
this.generateSearchableGenericResultType(ctx);
}
private generateSearchableGenericResultType(ctx: TransformerSchemaVisitStepContextProvider): void {
const searchableAggregateGenericResult = `SearchableAggregateGenericResult`;
if (ctx.output.hasType(searchableAggregateGenericResult)) {
return;
}
let searchableAggregateGenericResultNode = defineUnionType(searchableAggregateGenericResult, [
makeNamedType(this.generateSearchableAggregateScalarResultType(ctx)),
makeNamedType(this.generateSearchableAggregateBucketResultType(ctx)),
]);
ctx.output.addUnion(searchableAggregateGenericResultNode);
}
private generateSearchableAggregateScalarResultType(ctx: TransformerSchemaVisitStepContextProvider): string {
const searchableAggregateScalarResult = `SearchableAggregateScalarResult`;
if (ctx.output.hasType(searchableAggregateScalarResult)) {
return searchableAggregateScalarResult;
}
// Create the SearchableAggregateScalarResult
const aggregateScalarType = blankObject(searchableAggregateScalarResult);
ctx.output.addObject(aggregateScalarType);
// Create SearchableAggregateScalarResult type with value
let aggregateScalarTypeExtension = blankObjectExtension(searchableAggregateScalarResult);
aggregateScalarTypeExtension = extensionWithFields(aggregateScalarTypeExtension, [
makeField('value', [], makeNonNullType(makeNamedType('Float'))),
]);
ctx.output.addObjectExtension(aggregateScalarTypeExtension);
return searchableAggregateScalarResult;
}
private generateSearchableAggregateBucketResultItemType(ctx: TransformerSchemaVisitStepContextProvider): string {
const searchableAggregateBucketResultItem = `SearchableAggregateBucketResultItem`;
if (ctx.output.hasType(searchableAggregateBucketResultItem)) {
return searchableAggregateBucketResultItem;
}
// Create the SearchableAggregateBucketResultItem
const aggregateBucketResultItemType = blankObject(searchableAggregateBucketResultItem);
ctx.output.addObject(aggregateBucketResultItemType);
// Create SearchableAggregateBucketResultItem type with key and doc_count
let aggregateBucketResultItemTypeExtension = blankObjectExtension(searchableAggregateBucketResultItem);
aggregateBucketResultItemTypeExtension = extensionWithFields(aggregateBucketResultItemTypeExtension, [
makeField('key', [], makeNonNullType(makeNamedType('String'))),
makeField('doc_count', [], makeNonNullType(makeNamedType('Int'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultItemTypeExtension);
return searchableAggregateBucketResultItem;
}
private generateSearchableAggregateBucketResultType(ctx: TransformerSchemaVisitStepContextProvider): string {
const searchableAggregateBucketResult = `SearchableAggregateBucketResult`;
if (ctx.output.hasType(searchableAggregateBucketResult)) {
return searchableAggregateBucketResult;
}
// Create the SearchableAggregateBucketResultItem
const aggregateBucketResultType = blankObject(searchableAggregateBucketResult);
ctx.output.addObject(aggregateBucketResultType);
this.generateSearchableAggregateBucketResultItemType(ctx);
// Create SearchableAggregateBucketResultItem type with buckets
let aggregateBucketResultTypeExtension = blankObjectExtension(searchableAggregateBucketResult);
aggregateBucketResultTypeExtension = extensionWithFields(aggregateBucketResultTypeExtension, [
makeField('buckets', [], makeListType(makeNamedType('SearchableAggregateBucketResultItem'))),
]);
ctx.output.addObjectExtension(aggregateBucketResultTypeExtension);
return searchableAggregateBucketResult;
}
private generateSearchableAggregateResultType(ctx: TransformerSchemaVisitStepContextProvider): string {
const searchableAggregateResult = `SearchableAggregateResult`;
if (ctx.output.hasType(searchableAggregateResult)) {
return searchableAggregateResult;
}
// Create the SearchableAggregateResult
const aggregateResultType = blankObject(searchableAggregateResult);
ctx.output.addObject(aggregateResultType);
// Create SearchableAggregateResult type with name and result
let aggregateResultTypeExtension = blankObjectExtension(searchableAggregateResult);
aggregateResultTypeExtension = extensionWithFields(aggregateResultTypeExtension, [
makeField('name', [], makeNonNullType(makeNamedType('String'))),
makeField('result', [], makeNamedType('SearchableAggregateGenericResult')),
]);
ctx.output.addObjectExtension(aggregateResultTypeExtension);
return searchableAggregateResult;
}
private generateSearchableInputs(ctx: TransformerSchemaVisitStepContextProvider, definition: ObjectTypeDefinitionNode): void {
const inputs: string[] = Object.keys(STANDARD_SCALARS);
inputs
.filter(input => !ctx.output.hasType(`Searchable${input}FilterInput`))
.map(makeSearchableScalarInputObject)
.forEach((node: InputObjectTypeDefinitionNode) => ctx.output.addInput(node));
const searchableXQueryFilterInput = makeSearchableXFilterInputObject(definition, ctx.inputDocument);
if (!ctx.output.hasType(searchableXQueryFilterInput.name.value)) {
ctx.output.addInput(searchableXQueryFilterInput);
}
if (!ctx.output.hasType('SearchableSortDirection')) {
const searchableSortDirection = makeSearchableSortDirectionEnumObject();
ctx.output.addEnum(searchableSortDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortableFields`)) {
const searchableXSortableFieldsDirection = makeSearchableXSortableFieldsEnumObject(definition);
ctx.output.addEnum(searchableXSortableFieldsDirection);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}SortInput`)) {
const searchableXSortableInputDirection = makeSearchableXSortInputObject(definition);
ctx.output.addInput(searchableXSortableInputDirection);
}
if (!ctx.output.hasType('SearchableAggregateType')) {
const searchableAggregateTypeEnum = makeSearchableAggregateTypeEnumObject();
ctx.output.addEnum(searchableAggregateTypeEnum);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregateField`)) {
const searchableXAggregationField = makeSearchableXAggregateFieldEnumObject(definition, ctx.inputDocument);
ctx.output.addEnum(searchableXAggregationField);
}
if (!ctx.output.hasType(`Searchable${definition.name.value}AggregationInput`)) {
const searchableXAggregationInput = makeSearchableXAggregationInputObject(definition);
ctx.output.addInput(searchableXAggregationInput);
}
}
}
function getTable(context: TransformerContextProvider, definition: ObjectTypeDefinitionNode): IConstruct {
const ddbDataSource = context.dataSources.get(definition) as DynamoDbDataSource;
const tableName = ModelResourceIDs.ModelTableResourceID(definition.name.value);
const table = ddbDataSource.ds.stack.node.findChild(tableName);
return table;
}
function getNonKeywordFields(def: ObjectTypeDefinitionNode): Expression[] {
const nonKeywordTypeSet = new Set(nonKeywordTypes);
return def.fields?.filter(field => nonKeywordTypeSet.has(getBaseType(field.type)) && !DATASTORE_SYNC_FIELDS.includes(field.name.value)).map(field => str(field.name.value)) || [];
}
/**
* Returns all the keys fields - primaryKey and sortKeys
* @param primaryKey
* @param table
* @returns Expression[] keyFields
*/
function getKeyFields(primaryKey: string, table: IConstruct): Expression[] {
let keyFields = [];
keyFields.push(primaryKey);
let { attributeName } = (table as any).keySchema.find((att: any) => att.keyType === 'RANGE') || {};
if (attributeName) {
keyFields.push(...attributeName.split('#'));
}
return keyFields.map(key => str(key));
}
interface SearchableQueryMap {
search?: string;
}
interface SearchableDirectiveArgs {
queries?: SearchableQueryMap;
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc