Skip to content

Commit

Permalink
Allow type-checking to be disabled via typeChecking
Browse files Browse the repository at this point in the history
  • Loading branch information
rubensworks committed Feb 8, 2022
1 parent 2b72914 commit a553310
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 9 deletions.
11 changes: 10 additions & 1 deletion lib/loading/ComponentsManagerBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ export class ComponentsManagerBuilder<Instance = any> {
private readonly logger: Logger;
private readonly moduleState?: IModuleState;
private readonly skipContextValidation: boolean;
private readonly typeChecking: boolean;

public constructor(options: IComponentsManagerBuilderOptions<Instance>) {
this.mainModulePath = options.mainModulePath;
Expand All @@ -44,6 +45,9 @@ export class ComponentsManagerBuilder<Instance = any> {
this.skipContextValidation = options.skipContextValidation === undefined ?
true :
Boolean(options.skipContextValidation);
this.typeChecking = options.typeChecking === undefined ?
true :
Boolean(options.typeChecking);
}

public static createLogger(logLevel: LogLevel = 'warn'): Logger {
Expand Down Expand Up @@ -117,7 +121,7 @@ export class ComponentsManagerBuilder<Instance = any> {

// Build constructor pool
const runTypeConfigs = {};
const parameterHandler = new ParameterHandler({ objectLoader });
const parameterHandler = new ParameterHandler({ objectLoader, typeChecking: this.typeChecking });
const configConstructorPool: IConfigConstructorPool<Instance> = new ConfigConstructorPool({
objectLoader,
configPreprocessors: [
Expand Down Expand Up @@ -198,4 +202,9 @@ export interface IComponentsManagerBuilderOptions<Instance> {
* Defaults to `true`.
*/
skipContextValidation?: boolean;
/**
* If values for parameters should be type-checked.
* Defaults to `true`.
*/
typeChecking?: boolean;
}
3 changes: 2 additions & 1 deletion lib/preprocess/ParameterHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export class ParameterHandler {
new ParameterPropertyHandlerDefaultScoped(this.objectLoader),
new ParameterPropertyHandlerDefault(this.objectLoader),
new ParameterPropertyHandlerFixed(this.objectLoader),
this.parameterPropertyHandlerRange = new ParameterPropertyHandlerRange(this.objectLoader),
this.parameterPropertyHandlerRange = new ParameterPropertyHandlerRange(this.objectLoader, options.typeChecking),
new ParameterPropertyHandlerLazy(),
];
}
Expand Down Expand Up @@ -70,4 +70,5 @@ export class ParameterHandler {

export interface IParameterHandlerOptions {
objectLoader: RdfObjectLoader;
typeChecking: boolean;
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ import type { IParameterPropertyHandler } from './IParameterPropertyHandler';
*/
export class ParameterPropertyHandlerRange implements IParameterPropertyHandler {
private readonly objectLoader: RdfObjectLoader;
private readonly typeChecking: boolean;

public constructor(objectLoader: RdfObjectLoader) {
public constructor(objectLoader: RdfObjectLoader, typeChecking: boolean) {
this.objectLoader = objectLoader;
this.typeChecking = typeChecking;
}

public canHandle(value: Resource | undefined, configRoot: Resource, parameter: Resource): boolean {
Expand Down Expand Up @@ -46,7 +48,7 @@ export class ParameterPropertyHandlerRange implements IParameterPropertyHandler
): Resource | undefined {
const errorContext: IErrorContext = { param };
const conflict = this.hasValueType(value, param.property.range, errorContext, genericsContext);
if (!conflict) {
if (!conflict || !this.typeChecking) {
return value;
}
ParameterPropertyHandlerRange.throwIncorrectTypeError(value, param, genericsContext, conflict);
Expand Down
2 changes: 1 addition & 1 deletion test/unit/construction/ConfigConstructorPool-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ describe('ConfigConstructorPool', () => {
moduleState,
});
creationSettings = {};
parameterHandler = new ParameterHandler({ objectLoader });
parameterHandler = new ParameterHandler({ objectLoader, typeChecking: true });
});

describe('with no preprocessors', () => {
Expand Down
26 changes: 26 additions & 0 deletions test/unit/loading/ComponentsManagerBuilder-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -301,4 +301,30 @@ describe('ComponentsManagerBuilder', () => {
transports: expect.anything(),
});
});

it('should build with false typeChecking', async() => {
const componentsManagerBuilder = new ComponentsManagerBuilder({
mainModulePath,
typeChecking: false,
});
const mgr = await componentsManagerBuilder.build();

expect(mgr).toBeTruthy();
expect(mgr.moduleState).toBe(dummyModuleState);
expect(mgr.objectLoader).toBeInstanceOf(RdfObjectLoader);
expect(Object.keys(mgr.componentResources).length).toBe(2);
expect(mgr.configRegistry).toBeInstanceOf(ConfigRegistry);
expect(mgr.dumpErrorState).toBe(true);
expect(mgr.configConstructorPool).toBeInstanceOf(ConfigConstructorPool);
expect((<any> mgr.configConstructorPool).constructionStrategy).toBeInstanceOf(ConstructionStrategyCommonJs);
expect((<any> mgr.configConstructorPool).configPreprocessors.length).toBe(2);
expect((<any> mgr.configConstructorPool).configPreprocessors[0]).toBeInstanceOf(ConfigPreprocessorComponentMapped);
expect((<any> mgr.configConstructorPool).configPreprocessors[1]).toBeInstanceOf(ConfigPreprocessorComponent);
expect(mgr.logger).toBeTruthy();
expect(createLogger).toBeCalledTimes(1);
expect(createLogger).toHaveBeenCalledWith({
level: 'warn',
transports: expect.anything(),
});
});
});
2 changes: 1 addition & 1 deletion test/unit/preprocess/ConfigPreprocessorComponent-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ describe('ConfigPreprocessorComponent', () => {
objectLoader,
componentResources,
runTypeConfigs: {},
parameterHandler: new ParameterHandler({ objectLoader }),
parameterHandler: new ParameterHandler({ objectLoader, typeChecking: true }),
logger,
});
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ describe('ConfigPreprocessorComponentMapped', () => {
objectLoader,
componentResources,
runTypeConfigs: {},
parameterHandler: new ParameterHandler({ objectLoader }),
parameterHandler: new ParameterHandler({ objectLoader, typeChecking: true }),
logger: <any> { warn: jest.fn() },
});
});
Expand Down
2 changes: 1 addition & 1 deletion test/unit/preprocess/ParameterHandler-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ describe('ParameterHandler', () => {
});
await objectLoader.context;
genericsContext = new GenericsContext(objectLoader, []);
handler = new ParameterHandler({ objectLoader });
handler = new ParameterHandler({ objectLoader, typeChecking: true });

configRoot = objectLoader.createCompactedResource({
types: 'ex:Component1',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ describe('ParameterPropertyHandlerRange', () => {
});
await objectLoader.context;
genericsContext = new GenericsContext(objectLoader, []);
handler = new ParameterPropertyHandlerRange(objectLoader);
handler = new ParameterPropertyHandlerRange(objectLoader, true);
});

describe('canHandle', () => {
Expand Down Expand Up @@ -66,6 +66,17 @@ describe('ParameterPropertyHandlerRange', () => {
genericsContext,
)).toThrow(/The value "aaa" for parameter ".*" is not of required range type ".*integer"/u);
});

it('does not throw on an invalid value when type-checking is disabled', () => {
handler = new ParameterPropertyHandlerRange(objectLoader, false);
expect(() => handler.handle(
objectLoader.createCompactedResource('"aaa"'),
objectLoader.createCompactedResource({}),
objectLoader.createCompactedResource({ range: IRIS_XSD.integer }),
objectLoader.createCompactedResource({}),
genericsContext,
)).not.toThrow();
});
});

describe('hasValueType', () => {
Expand Down

0 comments on commit a553310

Please sign in to comment.