Skip to content

Commit f932be0

Browse files
committed
Default isFlexSearchIndeCaseSensitive to false
Also, add a model option to change this.
1 parent c3bbff9 commit f932be0

File tree

9 files changed

+49
-31
lines changed

9 files changed

+49
-31
lines changed

core-exports.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export { RequestProfile, ProjectOptions, RequestContext, ModelValidationOptions } from './src/config/interfaces';
1+
export { RequestProfile, ProjectOptions, RequestContext, ModelOptions } from './src/config/interfaces';
22
export { FieldResolverParameters } from './src/graphql/operation-based-resolvers';
33
export { Project, ProjectConfig } from './src/project/project';
44
export { InvalidProjectError } from './src/project/invalid-project-error';

spec/regression/regression-suite.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ export class RegressionSuite {
7171
authRoles: context.authRoles,
7272
flexSearchMaxFilterableAndSortableAmount: context.flexSearchMaxFilterableAndSortableAmount
7373
}),
74-
modelValidationOptions: {
74+
modelOptions: {
7575
forbiddenRootEntityNames: []
7676
},
7777
...options,

src/config/interfaces.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,25 @@ export interface SchemaOptions {
2525
readonly maxOrderByRootEntityDepth?: number;
2626
}
2727

28-
export interface ModelValidationOptions {
29-
/**
30-
* A list of root entity names that are not allowed.
31-
*/
32-
readonly forbiddenRootEntityNames?: ReadonlyArray<string>;
33-
}
34-
3528
export interface ModelOptions {
3629
/**
3730
* Determines whether a slash in a source name indicates the target namespace for that source
3831
*
3932
* Defaults to true. Explicitly specify false to disable this.
4033
*/
4134
readonly useSourceDirectoriesAsNamespaces?: boolean;
35+
36+
/**
37+
* Specifies the default for case-sensitiveness of flexSearch fields (can be overridden with the decorator)
38+
*
39+
* Default is false
40+
*/
41+
readonly isFlexSearchIndexCaseSensitiveByDefault?: boolean;
42+
43+
/**
44+
* A list of root entity names that are not allowed.
45+
*/
46+
readonly forbiddenRootEntityNames?: ReadonlyArray<string>;
4247
}
4348

4449
export interface ProjectOptions {
@@ -47,7 +52,7 @@ export interface ProjectOptions {
4752
readonly getExecutionOptions?: (args: ExecutionOptionsCallbackArgs) => ExecutionOptions;
4853

4954
readonly schemaOptions?: SchemaOptions;
50-
readonly modelValidationOptions?: ModelValidationOptions;
55+
5156
readonly modelOptions?: ModelOptions;
5257

5358
/**

src/model/config/model.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ModelValidationOptions } from '../../config/interfaces';
1+
import { ModelOptions } from '../../config/interfaces';
22
import { ValidationMessage } from '../validation';
33
import { BillingConfig } from './billing';
44
import { LocalizationConfig } from './i18n';
@@ -11,6 +11,6 @@ export interface ModelConfig {
1111
readonly validationMessages?: ReadonlyArray<ValidationMessage>;
1212
readonly i18n?: ReadonlyArray<LocalizationConfig>;
1313
readonly billing?: BillingConfig;
14-
readonly modelValidationOptions?: ModelValidationOptions;
1514
readonly timeToLiveConfigs?: ReadonlyArray<TimeToLiveConfig>;
15+
readonly options?: ModelOptions;
1616
}

src/model/create-model.ts

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
TypeDefinitionNode,
1717
valueFromAST
1818
} from 'graphql';
19-
import { ModelValidationOptions } from '../config/interfaces';
19+
import { ModelOptions } from '../config/interfaces';
2020
import {
2121
ParsedGraphQLProjectSource,
2222
ParsedObjectProjectSource,
@@ -115,16 +115,16 @@ import { parseI18nConfigs } from './parse-i18n';
115115
import { parseTTLConfigs } from './parse-ttl';
116116
import { ValidationContext, ValidationMessage } from './validation';
117117

118-
export function createModel(parsedProject: ParsedProject, modelValidationOptions?: ModelValidationOptions): Model {
118+
export function createModel(parsedProject: ParsedProject, options?: ModelOptions): Model {
119119
const validationContext = new ValidationContext();
120120
return new Model({
121-
types: createTypeInputs(parsedProject, validationContext),
121+
types: createTypeInputs(parsedProject, validationContext, options ?? {}),
122122
permissionProfiles: extractPermissionProfiles(parsedProject),
123123
i18n: extractI18n(parsedProject),
124124
validationMessages: validationContext.validationMessages,
125125
billing: extractBilling(parsedProject),
126-
modelValidationOptions,
127-
timeToLiveConfigs: extractTimeToLive(parsedProject)
126+
timeToLiveConfigs: extractTimeToLive(parsedProject),
127+
options
128128
});
129129
}
130130

@@ -144,7 +144,11 @@ const VALIDATION_ERROR_MISSING_OBJECT_TYPE_DIRECTIVE = `Add one of @${ROOT_ENTIT
144144
const VALIDATION_ERROR_INVALID_DEFINITION_KIND =
145145
'This kind of definition is not allowed. Only object and enum type definitions are allowed.';
146146

147-
function createTypeInputs(parsedProject: ParsedProject, context: ValidationContext): ReadonlyArray<TypeConfig> {
147+
function createTypeInputs(
148+
parsedProject: ParsedProject,
149+
context: ValidationContext,
150+
options: ModelOptions
151+
): ReadonlyArray<TypeConfig> {
148152
const graphQLSchemaParts = parsedProject.sources.filter(
149153
parsedSource => parsedSource.kind === ParsedProjectSourceBaseKind.GRAPHQL
150154
) as ReadonlyArray<ParsedGraphQLProjectSource>;
@@ -173,7 +177,7 @@ function createTypeInputs(parsedProject: ParsedProject, context: ValidationConte
173177
};
174178
return enumTypeInput;
175179
case OBJECT_TYPE_DEFINITION:
176-
return createObjectTypeInput(definition, schemaPart, context);
180+
return createObjectTypeInput(definition, schemaPart, context, options);
177181
default:
178182
return undefined;
179183
}
@@ -196,15 +200,16 @@ function createEnumValues(valueNodes: ReadonlyArray<EnumValueDefinitionNode>): R
196200
function createObjectTypeInput(
197201
definition: ObjectTypeDefinitionNode,
198202
schemaPart: ParsedGraphQLProjectSource,
199-
context: ValidationContext
203+
context: ValidationContext,
204+
options: ModelOptions
200205
): ObjectTypeConfig {
201206
const entityType = getKindOfObjectTypeNode(definition, context);
202207

203208
const common = {
204209
name: definition.name.value,
205210
description: definition.description ? definition.description.value : undefined,
206211
astNode: definition,
207-
fields: (definition.fields || []).map(field => createFieldInput(field, context)),
212+
fields: (definition.fields || []).map(field => createFieldInput(field, context, options)),
208213
namespacePath: getNamespacePath(definition, schemaPart.namespacePath),
209214
flexSearchLanguage: getDefaultLanguage(definition, context)
210215
};
@@ -457,7 +462,11 @@ function getLanguage(fieldNode: FieldDefinitionNode, context: ValidationContext)
457462
}
458463
}
459464

460-
function createFieldInput(fieldNode: FieldDefinitionNode, context: ValidationContext): FieldConfig {
465+
function createFieldInput(
466+
fieldNode: FieldDefinitionNode,
467+
context: ValidationContext,
468+
options: ModelOptions
469+
): FieldConfig {
461470
const inverseOfASTNode = getInverseOfASTNode(fieldNode, context);
462471
const relationDeleteActionASTNode = getRelationDeleteActionASTNode(fieldNode, context);
463472
const referenceDirectiveASTNode = findDirectiveWithName(fieldNode, REFERENCE_DIRECTIVE);
@@ -500,7 +509,7 @@ function createFieldInput(fieldNode: FieldDefinitionNode, context: ValidationCon
500509
isFlexSearchIndexCaseSensitive:
501510
flexSearchIndexCaseSensitiveNode?.value.kind === 'BooleanValue'
502511
? flexSearchIndexCaseSensitiveNode.value.value
503-
: undefined,
512+
: options.isFlexSearchIndexCaseSensitiveByDefault,
504513
isFlexSearchIndexedASTNode: findDirectiveWithName(fieldNode, FLEX_SEARCH_INDEXED_DIRECTIVE),
505514
isFlexSearchFulltextIndexed: hasDirectiveWithName(fieldNode, FLEX_SEARCH_FULLTEXT_INDEXED_DIRECTIVE),
506515
isFlexSearchFulltextIndexedASTNode: findDirectiveWithName(fieldNode, FLEX_SEARCH_FULLTEXT_INDEXED_DIRECTIVE),

src/model/implementation/field.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1522,7 +1522,7 @@ export class Field implements ModelComponent {
15221522
}
15231523

15241524
get isFlexSearchIndexCaseSensitive(): boolean {
1525-
return this.input.isFlexSearchIndexCaseSensitive ?? true;
1525+
return this.input.isFlexSearchIndexCaseSensitive ?? false;
15261526
}
15271527

15281528
get flexSearchAnalyzer(): string | undefined {

src/model/implementation/model.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { groupBy, uniqBy } from 'lodash';
22
import memorize from 'memorize-decorator';
3-
import { ModelValidationOptions } from '../../config/interfaces';
3+
import { ModelOptions } from '../../config/interfaces';
44
import { flatMap, objectEntries, objectValues } from '../../utils/utils';
55
import { ModelConfig, TypeKind } from '../config';
66
import { NamespacedPermissionProfileConfigMap } from '../index';
@@ -31,7 +31,11 @@ export class Model implements ModelComponent {
3131
readonly i18n: ModelI18n;
3232
readonly permissionProfiles: ReadonlyArray<PermissionProfile>;
3333
readonly billingEntityTypes: ReadonlyArray<BillingEntityType>;
34-
readonly modelValidationOptions?: ModelValidationOptions;
34+
/**
35+
* @deprecated use options
36+
*/
37+
readonly modelValidationOptions?: ModelOptions;
38+
readonly options?: ModelOptions;
3539
readonly timeToLiveTypes: ReadonlyArray<TimeToLiveType>;
3640

3741
constructor(private input: ModelConfig) {
@@ -50,7 +54,8 @@ export class Model implements ModelComponent {
5054
this.billingEntityTypes = input.billing
5155
? input.billing.billingEntities.map(value => new BillingEntityType(value, this))
5256
: [];
53-
this.modelValidationOptions = input.modelValidationOptions;
57+
this.options = input.options;
58+
this.modelValidationOptions = input.options;
5459
this.timeToLiveTypes = input.timeToLiveConfigs
5560
? input.timeToLiveConfigs.map(ttlConfig => new TimeToLiveType(ttlConfig, this))
5661
: [];
@@ -243,10 +248,10 @@ export class Model implements ModelComponent {
243248
}
244249

245250
get forbiddenRootEntityNames(): ReadonlyArray<string> {
246-
if (!this.modelValidationOptions || !this.modelValidationOptions.forbiddenRootEntityNames) {
251+
if (!this.options || !this.options.forbiddenRootEntityNames) {
247252
return ['BillingEntity'];
248253
}
249-
return this.modelValidationOptions!.forbiddenRootEntityNames;
254+
return this.options!.forbiddenRootEntityNames;
250255
}
251256
}
252257

src/project/project.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ export class Project {
118118
getOperationIdentifier: config.getOperationIdentifier,
119119
processError: config.processError,
120120
schemaOptions: config.schemaOptions,
121-
modelValidationOptions: config.modelValidationOptions,
122121
modelOptions: config.modelOptions
123122
};
124123
}

src/schema/schema-builder.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ export function validateAndPrepareSchema(project: Project): { validationResult:
8181

8282
const preparedProject = executePreMergeTransformationPipeline({ sources: validParsedSources });
8383

84-
const model = createModel(preparedProject, project.options.modelValidationOptions);
84+
const model = createModel(preparedProject, project.options.modelOptions);
8585

8686
const mergedSchema: DocumentNode = mergeSchemaDefinition(preparedProject);
8787

0 commit comments

Comments
 (0)