diff --git a/docs/pages/reference/data-model/cube.mdx b/docs/pages/reference/data-model/cube.mdx
index 577a1a80ff917..ff8e4cd81d5a7 100644
--- a/docs/pages/reference/data-model/cube.mdx
+++ b/docs/pages/reference/data-model/cube.mdx
@@ -158,6 +158,33 @@ cubes:
+### meta
+
+Custom metadata. Can be used to pass any information to the frontend.
+
+
+
+```javascript
+cube(`orders`, {
+ sql_table: `orders`,
+ title: `Product Orders`,
+ meta: {
+ any: `value`,
+ }
+});
+```
+
+```yaml
+cubes:
+ - name: orders
+ sql_table: orders
+ title: Product Orders
+ meta:
+ any: value
+```
+
+
+
### extends
You can extend cubes in order to reuse all declared members of a cube. In the
diff --git a/docs/pages/reference/data-model/view.mdx b/docs/pages/reference/data-model/view.mdx
index 2caaf1a742683..06b15ba95f392 100644
--- a/docs/pages/reference/data-model/view.mdx
+++ b/docs/pages/reference/data-model/view.mdx
@@ -154,6 +154,29 @@ views:
+### meta
+
+Custom metadata. Can be used to pass any information to the frontend.
+
+
+
+```javascript
+view(`active_users`, {
+ meta: {
+ any: "value",
+ }
+});
+```
+
+```yaml
+views:
+ - name: active_users
+ meta:
+ any: value
+```
+
+
+
### `cubes`
Use `cubes` parameter in view to include exposed cubes in bulk. You can build
diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js
index 673222b42a870..eec66bcdd0cd5 100644
--- a/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js
+++ b/packages/cubejs-schema-compiler/src/compiler/CubeToMetaTransformer.js
@@ -51,6 +51,7 @@ export class CubeToMetaTransformer {
public: isCubeVisible,
description: cube.description,
connectedComponent: this.joinGraph.connectedComponents()[cube.name],
+ meta: cube.meta,
measures: R.compose(
R.map((nameToMetric) => ({
...this.measureConfig(cube.name, cubeTitle, nameToMetric),
diff --git a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts
index 9c2d45b97ec91..49ea3c827acd3 100644
--- a/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts
+++ b/packages/cubejs-schema-compiler/src/compiler/CubeValidator.ts
@@ -492,6 +492,7 @@ const baseSchema = {
rewriteQueries: Joi.boolean().strict(),
shown: Joi.boolean().strict(),
public: Joi.boolean().strict(),
+ meta: Joi.any(),
joins: Joi.object().pattern(identifierRegex, Joi.object().keys({
sql: Joi.func().required(),
relationship: Joi.any().valid(
diff --git a/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts b/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts
index 600356984781b..cd87a39eb4547 100644
--- a/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts
+++ b/packages/cubejs-schema-compiler/src/compiler/YamlCompiler.ts
@@ -169,6 +169,10 @@ export class YamlCompiler {
return this.extractProgramBodyIfNeeded(ast);
} else if (typeof obj === 'boolean') {
return t.booleanLiteral(obj);
+ } else if (typeof obj === 'number') {
+ return t.numericLiteral(obj);
+ } else if (obj === null && propertyPath.includes('meta')) {
+ return t.nullLiteral();
}
if (typeof obj === 'object' && obj !== null) {
diff --git a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts
index 92bc7de0e8789..aa01c170e6d9f 100644
--- a/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts
+++ b/packages/cubejs-schema-compiler/test/unit/yaml-schema.test.ts
@@ -110,4 +110,36 @@ describe('Yaml Schema Testing', () => {
expect(e.message).toContain('name isn\'t defined for dimension: ');
}
});
+
+ it('accepts cube meta', async () => {
+ const { compiler } = prepareYamlCompiler(
+ `
+ cubes:
+ - name: Users
+ sql: SELECT * FROM e2e.users
+ meta:
+ scalars:
+ example_string: "foo"
+ example_integer: 1
+ example_float: 1.0
+ example_boolean: true
+ example_null: null
+ sequence:
+ - 1
+ - 2
+ - 3
+ mixed_sequence:
+ - 1
+ - "foo"
+ - 3
+ dimensions:
+ - name: id
+ sql: id
+ type: number
+ primaryKey: true
+ `
+ );
+
+ await compiler.compile();
+ });
});