diff --git a/packages/cubejs-schema-compiler/compiler/DataSchemaCompiler.js b/packages/cubejs-schema-compiler/compiler/DataSchemaCompiler.js index 1551ee323f652..8382bdba3cf67 100644 --- a/packages/cubejs-schema-compiler/compiler/DataSchemaCompiler.js +++ b/packages/cubejs-schema-compiler/compiler/DataSchemaCompiler.js @@ -206,6 +206,9 @@ class DataSchemaCompiler { } else { const foundFile = self.resolveModuleFile(file, extensionName, toCompile, errorsReport); if (!foundFile && this.allowNodeRequire) { + if (extensionName.indexOf('.') === 0) { + extensionName = path.resolve(this.repository.localPath(), extensionName); + } // eslint-disable-next-line global-require,import/no-dynamic-require return require(extensionName); } diff --git a/packages/cubejs-schema-compiler/test/AsyncModuleTest.js b/packages/cubejs-schema-compiler/test/AsyncModuleTest.js index 01c3f4477b8fe..9debe6be527d3 100644 --- a/packages/cubejs-schema-compiler/test/AsyncModuleTest.js +++ b/packages/cubejs-schema-compiler/test/AsyncModuleTest.js @@ -62,4 +62,53 @@ describe('AsyncModule', () => { }); }); }); + + it('import local node module', () => { + const { joinGraph, cubeEvaluator, compiler } = prepareCompiler(` + import { foo } from '../test/TestHelperForImport.js'; + + cube(foo(), { + sql: \` + select * from visitors + \`, + + measures: { + visitor_count: { + type: 'count', + sql: 'id' + }, + visitor_revenue: { + type: 'sum', + sql: 'amount' + } + }, + + dimensions: { + source: { + type: 'string', + sql: 'source' + }, + created_at: { + type: 'time', + sql: 'created_at' + } + } + }) + `, { allowNodeRequire: true }); + return compiler.compile().then(() => { + const query = new PostgresQuery({ joinGraph, cubeEvaluator, compiler }, { + measures: ['bar.visitor_count'], + timezone: 'America/Los_Angeles' + }); + + console.log(query.buildSqlAndParams()); + return dbRunner.testQuery(query.buildSqlAndParams()).then(res => { + res.should.be.deepEqual( + [ + { "bar__visitor_count": "6" } + ] + ); + }); + }); + }); }); diff --git a/packages/cubejs-schema-compiler/test/PrepareCompiler.js b/packages/cubejs-schema-compiler/test/PrepareCompiler.js index 541caf59a2ea5..6cc481a204b30 100644 --- a/packages/cubejs-schema-compiler/test/PrepareCompiler.js +++ b/packages/cubejs-schema-compiler/test/PrepareCompiler.js @@ -1,6 +1,7 @@ const PrepareCompiler = require('../compiler/PrepareCompiler'); exports.prepareCompiler = (content, options) => PrepareCompiler.prepareCompiler({ + localPath: () => __dirname, dataSchemaFiles: () => Promise.resolve([ { fileName: "main.js", content } ]) diff --git a/packages/cubejs-schema-compiler/test/TestHelperForImport.js b/packages/cubejs-schema-compiler/test/TestHelperForImport.js new file mode 100644 index 0000000000000..42ebc8e5c78b7 --- /dev/null +++ b/packages/cubejs-schema-compiler/test/TestHelperForImport.js @@ -0,0 +1 @@ +exports.foo = () => 'bar';