diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts index 126247c5f42af..dbe755aa1bb42 100644 --- a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts +++ b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts @@ -792,8 +792,8 @@ const viewSchema = inherit(baseSchema, { Joi.array().items(Joi.alternatives([ Joi.string().required(), Joi.object().keys({ - name: Joi.string().required(), - alias: Joi.string() + name: identifier.required(), + alias: identifier }) ])) ]).required(), diff --git a/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts b/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts index 7e03f95594dc5..628a5189883b9 100644 --- a/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts +++ b/packages/cubejs-schema-compiler/test/unit/cube-validator.test.ts @@ -134,6 +134,37 @@ describe('Cube Validation', () => { expect(validationResult.error).toBeFalsy(); }); + it('view with incorrect included member with alias', async () => { + const cubeValidator = new CubeValidator(new CubeSymbols()); + const cube = { + name: 'name', + // it's a hidden field which we use internally + isView: true, + fileName: 'fileName', + cubes: [ + { + joinPath: () => '', + prefix: false, + includes: [ + 'member-by-name', + { + name: 'member-by-alias', + alias: 'incorrect Alias' + } + ] + } + ] + }; + + const validationResult = cubeValidator.validate(cube, { + error: (message: any, _e: any) => { + console.log(message); + } + } as any); + + expect(validationResult.error).toBeTruthy(); + }); + it('refreshKey alternatives', async () => { const cubeValidator = new CubeValidator(new CubeSymbols()); const cube = {