@lightdash/common 0.1921.0 → 0.1922.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/cjs/schemas/json/lightdash-project-config-1.0.json +21 -1
  2. package/dist/cjs/utils/loadLightdashProjectConfig.d.ts.map +1 -1
  3. package/dist/cjs/utils/loadLightdashProjectConfig.js +4 -1
  4. package/dist/cjs/utils/loadLightdashProjectConfig.js.map +1 -1
  5. package/dist/cjs/utils/loadLightdashProjectConfig.mock.d.ts +12 -0
  6. package/dist/cjs/utils/loadLightdashProjectConfig.mock.d.ts.map +1 -0
  7. package/dist/cjs/utils/loadLightdashProjectConfig.mock.js +68 -0
  8. package/dist/cjs/utils/loadLightdashProjectConfig.mock.js.map +1 -0
  9. package/dist/cjs/utils/loadLightdashProjectConfig.test.d.ts +2 -0
  10. package/dist/cjs/utils/loadLightdashProjectConfig.test.d.ts.map +1 -0
  11. package/dist/cjs/utils/loadLightdashProjectConfig.test.js +73 -0
  12. package/dist/cjs/utils/loadLightdashProjectConfig.test.js.map +1 -0
  13. package/dist/esm/schemas/json/lightdash-project-config-1.0.json +21 -1
  14. package/dist/esm/utils/loadLightdashProjectConfig.d.ts.map +1 -1
  15. package/dist/esm/utils/loadLightdashProjectConfig.js +4 -1
  16. package/dist/esm/utils/loadLightdashProjectConfig.js.map +1 -1
  17. package/dist/esm/utils/loadLightdashProjectConfig.mock.d.ts +12 -0
  18. package/dist/esm/utils/loadLightdashProjectConfig.mock.d.ts.map +1 -0
  19. package/dist/esm/utils/loadLightdashProjectConfig.mock.js +65 -0
  20. package/dist/esm/utils/loadLightdashProjectConfig.mock.js.map +1 -0
  21. package/dist/esm/utils/loadLightdashProjectConfig.test.d.ts +2 -0
  22. package/dist/esm/utils/loadLightdashProjectConfig.test.d.ts.map +1 -0
  23. package/dist/esm/utils/loadLightdashProjectConfig.test.js +71 -0
  24. package/dist/esm/utils/loadLightdashProjectConfig.test.js.map +1 -0
  25. package/dist/tsconfig.types.tsbuildinfo +1 -1
  26. package/dist/types/utils/loadLightdashProjectConfig.d.ts.map +1 -1
  27. package/dist/types/utils/loadLightdashProjectConfig.mock.d.ts +12 -0
  28. package/dist/types/utils/loadLightdashProjectConfig.mock.d.ts.map +1 -0
  29. package/dist/types/utils/loadLightdashProjectConfig.test.d.ts +2 -0
  30. package/dist/types/utils/loadLightdashProjectConfig.test.d.ts.map +1 -0
  31. package/package.json +3 -2
@@ -64,6 +64,7 @@
64
64
  "options": {
65
65
  "description": "A list of possible values for the parameter",
66
66
  "type": "array",
67
+ "minItems": 1,
67
68
  "items": {
68
69
  "type": "string"
69
70
  }
@@ -104,7 +105,26 @@
104
105
  "required": ["model", "dimension"]
105
106
  }
106
107
  },
107
- "required": ["label"]
108
+ "required": ["label"],
109
+ "anyOf": [
110
+ {
111
+ "required": ["options_from_dimension"],
112
+ "errorMessage": "Must have one of the following properties: allow_custom_values, options, options_from_dimension"
113
+ },
114
+ {
115
+ "required": ["options"],
116
+ "errorMessage": "Must have one of the following properties: allow_custom_values, options, options_from_dimension"
117
+ },
118
+ {
119
+ "properties": {
120
+ "allow_custom_values": {
121
+ "enum": [true]
122
+ }
123
+ },
124
+ "required": ["allow_custom_values"],
125
+ "errorMessage": "Must have one of the following properties: allow_custom_values, options, options_from_dimension"
126
+ }
127
+ ]
108
128
  }
109
129
  }
110
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loadLightdashProjectConfig.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,sBAAsB,EAC9B,MAAM,iCAAiC,CAAC;AAKzC,eAAO,MAAM,0BAA0B,qBACjB,MAAM,aACb,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,KAC7D,OAAO,CAAC,sBAAsB,CAuChC,CAAC"}
1
+ {"version":3,"file":"loadLightdashProjectConfig.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":"AAMA,OAAO,EAEH,KAAK,sBAAsB,EAC9B,MAAM,iCAAiC,CAAC;AAKzC,eAAO,MAAM,0BAA0B,qBACjB,MAAM,aACb,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,KAC7D,OAAO,CAAC,sBAAsB,CAyChC,CAAC"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.loadLightdashProjectConfig = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  const ajv_1 = tslib_1.__importDefault(require("ajv"));
6
+ const ajv_errors_1 = tslib_1.__importDefault(require("ajv-errors"));
6
7
  const better_ajv_errors_1 = tslib_1.__importDefault(require("better-ajv-errors"));
7
8
  const yaml = tslib_1.__importStar(require("js-yaml"));
8
9
  const lightdash_project_config_1_0_json_1 = tslib_1.__importDefault(require("../schemas/json/lightdash-project-config-1.0.json"));
@@ -22,7 +23,9 @@ const loadLightdashProjectConfig = async (yamlFileContents, onLoaded) => {
22
23
  ...defaultConfig,
23
24
  ...loadedConfig,
24
25
  };
25
- const ajv = new ajv_1.default({ coerceTypes: true });
26
+ const ajv = new ajv_1.default({ coerceTypes: true, allErrors: true });
27
+ // This method call extends JSON schema to utilize AJV Errors
28
+ (0, ajv_errors_1.default)(ajv);
26
29
  const validate = ajv.compile(lightdash_project_config_1_0_json_1.default);
27
30
  if (!validate(configFile)) {
28
31
  const errors = (0, better_ajv_errors_1.default)(lightdash_project_config_1_0_json_1.default, configFile, validate.errors || [], { indent: 2 });
@@ -1 +1 @@
1
- {"version":3,"file":"loadLightdashProjectConfig.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":";;;;AAAA,sDAAsB;AACtB,kFAAgD;AAChD,sDAAgC;AAChC,kIAA6F;AAC7F,4CAA6C;AAC7C,4EAGyC;AAEzC,MAAM,aAAa,GAA2B;IAC1C,SAAS,EAAE,iDAAwB;CACtC,CAAC;AACK,MAAM,0BAA0B,GAAG,KAAK,EAC3C,gBAAwB,EACxB,QAA4D,EAC7B,EAAE;IACjC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,4CAA4C;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC1B,gBAAgB,CACgB,CAAC;IACrC,kDAAkD;IAClD,MAAM,UAAU,GAA2B;QACvC,GAAG,aAAa;QAChB,GAAG,YAAY;KAClB,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CACxB,2CAA4B,CAC/B,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAA,2BAAe,EAC1B,2CAA4B,EAC5B,UAAU,EACV,QAAQ,CAAC,MAAM,IAAI,EAAE,EACrB,EAAE,MAAM,EAAE,CAAC,EAAE,CAChB,CAAC;QACF,MAAM,IAAI,mBAAU,CAChB,8CAA8C,MAAM,EAAE,CACzD,CAAC;IACN,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChC,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AA1CW,QAAA,0BAA0B,8BA0CrC"}
1
+ {"version":3,"file":"loadLightdashProjectConfig.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":";;;;AAAA,sDAAsB;AACtB,oEAAmC;AACnC,kFAAgD;AAChD,sDAAgC;AAChC,kIAA6F;AAC7F,4CAA6C;AAC7C,4EAGyC;AAEzC,MAAM,aAAa,GAA2B;IAC1C,SAAS,EAAE,iDAAwB;CACtC,CAAC;AACK,MAAM,0BAA0B,GAAG,KAAK,EAC3C,gBAAwB,EACxB,QAA4D,EAC7B,EAAE;IACjC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,4CAA4C;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC1B,gBAAgB,CACgB,CAAC;IACrC,kDAAkD;IAClD,MAAM,UAAU,GAA2B;QACvC,GAAG,aAAa;QAChB,GAAG,YAAY;KAClB,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,aAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,6DAA6D;IAC7D,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;IACf,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CACxB,2CAA4B,CAC/B,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAA,2BAAe,EAC1B,2CAA4B,EAC5B,UAAU,EACV,QAAQ,CAAC,MAAM,IAAI,EAAE,EACrB,EAAE,MAAM,EAAE,CAAC,EAAE,CAChB,CAAC;QACF,MAAM,IAAI,mBAAU,CAChB,8CAA8C,MAAM,EAAE,CACzD,CAAC;IACN,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChC,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC;AA5CW,QAAA,0BAA0B,8BA4CrC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Mock YAML content for lightdash project config tests
3
+ */
4
+ export declare const emptyConfig = "";
5
+ export declare const validConfigWithParameters = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options:\n - option1\n - option2\n";
6
+ export declare const validConfigWithOptionsFromDimension = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options_from_dimension:\n model: test_model\n dimension: test_dimension\n";
7
+ export declare const validConfigWithAllowCustomValues = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n allow_custom_values: true\n";
8
+ export declare const invalidConfigWithNoOptions = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n";
9
+ export declare const invalidConfigWithAllowCustomValuesFalse = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n allow_custom_values: false\n";
10
+ export declare const configWithEmptyOptionsArray = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options: []\n";
11
+ export declare const invalidConfigWithIncompleteOptionsFromDimension = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options_from_dimension:\n model: test_model\n";
12
+ //# sourceMappingURL=loadLightdashProjectConfig.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.mock.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,WAAW,KAAK,CAAC;AAE9B,eAAO,MAAM,yBAAyB,sJASrC,CAAC;AAEF,eAAO,MAAM,mCAAmC,6LAS/C,CAAC;AAEF,eAAO,MAAM,gCAAgC,qIAO5C,CAAC;AAEF,eAAO,MAAM,0BAA0B,sGAMtC,CAAC;AAEF,eAAO,MAAM,uCAAuC,sIAOnD,CAAC;AAEF,eAAO,MAAM,2BAA2B,uHAOvC,CAAC;AAEF,eAAO,MAAM,+CAA+C,4JAQ3D,CAAC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * Mock YAML content for lightdash project config tests
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.invalidConfigWithIncompleteOptionsFromDimension = exports.configWithEmptyOptionsArray = exports.invalidConfigWithAllowCustomValuesFalse = exports.invalidConfigWithNoOptions = exports.validConfigWithAllowCustomValues = exports.validConfigWithOptionsFromDimension = exports.validConfigWithParameters = exports.emptyConfig = void 0;
7
+ exports.emptyConfig = '';
8
+ exports.validConfigWithParameters = `
9
+ spotlight:
10
+ default_visibility: show
11
+ parameters:
12
+ test_param:
13
+ label: Test Parameter
14
+ options:
15
+ - option1
16
+ - option2
17
+ `;
18
+ exports.validConfigWithOptionsFromDimension = `
19
+ spotlight:
20
+ default_visibility: show
21
+ parameters:
22
+ test_param:
23
+ label: Test Parameter
24
+ options_from_dimension:
25
+ model: test_model
26
+ dimension: test_dimension
27
+ `;
28
+ exports.validConfigWithAllowCustomValues = `
29
+ spotlight:
30
+ default_visibility: show
31
+ parameters:
32
+ test_param:
33
+ label: Test Parameter
34
+ allow_custom_values: true
35
+ `;
36
+ exports.invalidConfigWithNoOptions = `
37
+ spotlight:
38
+ default_visibility: show
39
+ parameters:
40
+ test_param:
41
+ label: Test Parameter
42
+ `;
43
+ exports.invalidConfigWithAllowCustomValuesFalse = `
44
+ spotlight:
45
+ default_visibility: show
46
+ parameters:
47
+ test_param:
48
+ label: Test Parameter
49
+ allow_custom_values: false
50
+ `;
51
+ exports.configWithEmptyOptionsArray = `
52
+ spotlight:
53
+ default_visibility: show
54
+ parameters:
55
+ test_param:
56
+ label: Test Parameter
57
+ options: []
58
+ `;
59
+ exports.invalidConfigWithIncompleteOptionsFromDimension = `
60
+ spotlight:
61
+ default_visibility: show
62
+ parameters:
63
+ test_param:
64
+ label: Test Parameter
65
+ options_from_dimension:
66
+ model: test_model
67
+ `;
68
+ //# sourceMappingURL=loadLightdashProjectConfig.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.mock.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.mock.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEU,QAAA,WAAW,GAAG,EAAE,CAAC;AAEjB,QAAA,yBAAyB,GAAG;;;;;;;;;CASxC,CAAC;AAEW,QAAA,mCAAmC,GAAG;;;;;;;;;CASlD,CAAC;AAEW,QAAA,gCAAgC,GAAG;;;;;;;CAO/C,CAAC;AAEW,QAAA,0BAA0B,GAAG;;;;;;CAMzC,CAAC;AAEW,QAAA,uCAAuC,GAAG;;;;;;;CAOtD,CAAC;AAEW,QAAA,2BAA2B,GAAG;;;;;;;CAO1C,CAAC;AAEW,QAAA,+CAA+C,GAAG;;;;;;;;CAQ9D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loadLightdashProjectConfig.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.test.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const errors_1 = require("../types/errors");
4
+ const loadLightdashProjectConfig_1 = require("./loadLightdashProjectConfig");
5
+ const loadLightdashProjectConfig_mock_1 = require("./loadLightdashProjectConfig.mock");
6
+ describe('loadLightdashProjectConfig', () => {
7
+ it('should load an empty config', async () => {
8
+ const config = await (0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.emptyConfig);
9
+ expect(config).toEqual({
10
+ spotlight: {
11
+ default_visibility: 'show',
12
+ },
13
+ });
14
+ });
15
+ it('should load a valid config with parameters', async () => {
16
+ const config = await (0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.validConfigWithParameters);
17
+ expect(config).toEqual({
18
+ spotlight: {
19
+ default_visibility: 'show',
20
+ },
21
+ parameters: {
22
+ test_param: {
23
+ label: 'Test Parameter',
24
+ options: ['option1', 'option2'],
25
+ },
26
+ },
27
+ });
28
+ });
29
+ it('should load a valid config with parameters using options_from_dimension', async () => {
30
+ const config = await (0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.validConfigWithOptionsFromDimension);
31
+ expect(config).toEqual({
32
+ spotlight: {
33
+ default_visibility: 'show',
34
+ },
35
+ parameters: {
36
+ test_param: {
37
+ label: 'Test Parameter',
38
+ options_from_dimension: {
39
+ model: 'test_model',
40
+ dimension: 'test_dimension',
41
+ },
42
+ },
43
+ },
44
+ });
45
+ });
46
+ it('should load a valid config with parameters using allow_custom_values', async () => {
47
+ const config = await (0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.validConfigWithAllowCustomValues);
48
+ expect(config).toEqual({
49
+ spotlight: {
50
+ default_visibility: 'show',
51
+ },
52
+ parameters: {
53
+ test_param: {
54
+ label: 'Test Parameter',
55
+ allow_custom_values: true,
56
+ },
57
+ },
58
+ });
59
+ });
60
+ it('should throw an error for invalid parameter with no options', async () => {
61
+ await expect((0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.invalidConfigWithNoOptions)).rejects.toThrow(errors_1.ParseError);
62
+ });
63
+ it('should throw an error for invalid parameter with allow_custom_values set to false', async () => {
64
+ await expect((0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.invalidConfigWithAllowCustomValuesFalse)).rejects.toThrow(errors_1.ParseError);
65
+ });
66
+ it('should throw an error for parameter with empty options array', async () => {
67
+ await expect((0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.configWithEmptyOptionsArray)).rejects.toThrow(errors_1.ParseError);
68
+ });
69
+ it('should throw an error for invalid parameter with incomplete options_from_dimension', async () => {
70
+ await expect((0, loadLightdashProjectConfig_1.loadLightdashProjectConfig)(loadLightdashProjectConfig_mock_1.invalidConfigWithIncompleteOptionsFromDimension)).rejects.toThrow(errors_1.ParseError);
71
+ });
72
+ });
73
+ //# sourceMappingURL=loadLightdashProjectConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.test.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.test.ts"],"names":[],"mappings":";;AAAA,4CAA6C;AAC7C,6EAA0E;AAC1E,uFAS2C;AAE3C,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,IAAA,uDAA0B,EAAC,6CAAW,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACnB,SAAS,EAAE;gBACP,kBAAkB,EAAE,MAAM;aAC7B;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,MAAM,GAAG,MAAM,IAAA,uDAA0B,EAC3C,2DAAyB,CAC5B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACnB,SAAS,EAAE;gBACP,kBAAkB,EAAE,MAAM;aAC7B;YACD,UAAU,EAAE;gBACR,UAAU,EAAE;oBACR,KAAK,EAAE,gBAAgB;oBACvB,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC;iBAClC;aACJ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,MAAM,GAAG,MAAM,IAAA,uDAA0B,EAC3C,qEAAmC,CACtC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACnB,SAAS,EAAE;gBACP,kBAAkB,EAAE,MAAM;aAC7B;YACD,UAAU,EAAE;gBACR,UAAU,EAAE;oBACR,KAAK,EAAE,gBAAgB;oBACvB,sBAAsB,EAAE;wBACpB,KAAK,EAAE,YAAY;wBACnB,SAAS,EAAE,gBAAgB;qBAC9B;iBACJ;aACJ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,MAAM,GAAG,MAAM,IAAA,uDAA0B,EAC3C,kEAAgC,CACnC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACnB,SAAS,EAAE;gBACP,kBAAkB,EAAE,MAAM;aAC7B;YACD,UAAU,EAAE;gBACR,UAAU,EAAE;oBACR,KAAK,EAAE,gBAAgB;oBACvB,mBAAmB,EAAE,IAAI;iBAC5B;aACJ;SACJ,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,MAAM,CACR,IAAA,uDAA0B,EAAC,4DAA0B,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,MAAM,CACR,IAAA,uDAA0B,EAAC,yEAAuC,CAAC,CACtE,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC1E,MAAM,MAAM,CACR,IAAA,uDAA0B,EAAC,6DAA2B,CAAC,CAC1D,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,MAAM,CACR,IAAA,uDAA0B,EACtB,iFAA+C,CAClD,CACJ,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAU,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -64,6 +64,7 @@
64
64
  "options": {
65
65
  "description": "A list of possible values for the parameter",
66
66
  "type": "array",
67
+ "minItems": 1,
67
68
  "items": {
68
69
  "type": "string"
69
70
  }
@@ -104,7 +105,26 @@
104
105
  "required": ["model", "dimension"]
105
106
  }
106
107
  },
107
- "required": ["label"]
108
+ "required": ["label"],
109
+ "anyOf": [
110
+ {
111
+ "required": ["options_from_dimension"],
112
+ "errorMessage": "Must have one of the following properties: allow_custom_values, options, options_from_dimension"
113
+ },
114
+ {
115
+ "required": ["options"],
116
+ "errorMessage": "Must have one of the following properties: allow_custom_values, options, options_from_dimension"
117
+ },
118
+ {
119
+ "properties": {
120
+ "allow_custom_values": {
121
+ "enum": [true]
122
+ }
123
+ },
124
+ "required": ["allow_custom_values"],
125
+ "errorMessage": "Must have one of the following properties: allow_custom_values, options, options_from_dimension"
126
+ }
127
+ ]
108
128
  }
109
129
  }
110
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"loadLightdashProjectConfig.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":"AAKA,OAAO,EAEH,KAAK,sBAAsB,EAC9B,MAAM,iCAAiC,CAAC;AAKzC,eAAO,MAAM,0BAA0B,qBACjB,MAAM,aACb,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,KAC7D,OAAO,CAAC,sBAAsB,CAuChC,CAAC"}
1
+ {"version":3,"file":"loadLightdashProjectConfig.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":"AAMA,OAAO,EAEH,KAAK,sBAAsB,EAC9B,MAAM,iCAAiC,CAAC;AAKzC,eAAO,MAAM,0BAA0B,qBACjB,MAAM,aACb,CAAC,MAAM,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,KAC7D,OAAO,CAAC,sBAAsB,CAyChC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import Ajv from 'ajv';
2
+ import AjvErrors from 'ajv-errors';
2
3
  import betterAjvErrors from 'better-ajv-errors';
3
4
  import * as yaml from 'js-yaml';
4
5
  import lightdashProjectConfigSchema from '../schemas/json/lightdash-project-config-1.0.json';
@@ -18,7 +19,9 @@ export const loadLightdashProjectConfig = async (yamlFileContents, onLoaded) =>
18
19
  ...defaultConfig,
19
20
  ...loadedConfig,
20
21
  };
21
- const ajv = new Ajv({ coerceTypes: true });
22
+ const ajv = new Ajv({ coerceTypes: true, allErrors: true });
23
+ // This method call extends JSON schema to utilize AJV Errors
24
+ AjvErrors(ajv);
22
25
  const validate = ajv.compile(lightdashProjectConfigSchema);
23
26
  if (!validate(configFile)) {
24
27
  const errors = betterAjvErrors(lightdashProjectConfigSchema, configFile, validate.errors || [], { indent: 2 });
@@ -1 +1 @@
1
- {"version":3,"file":"loadLightdashProjectConfig.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,4BAA4B,MAAM,mDAAmD,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACH,wBAAwB,GAE3B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,aAAa,GAA2B;IAC1C,SAAS,EAAE,wBAAwB;CACtC,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAC3C,gBAAwB,EACxB,QAA4D,EAC7B,EAAE;IACjC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,4CAA4C;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC1B,gBAAgB,CACgB,CAAC;IACrC,kDAAkD;IAClD,MAAM,UAAU,GAA2B;QACvC,GAAG,aAAa;QAChB,GAAG,YAAY;KAClB,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CACxB,4BAA4B,CAC/B,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,eAAe,CAC1B,4BAA4B,EAC5B,UAAU,EACV,QAAQ,CAAC,MAAM,IAAI,EAAE,EACrB,EAAE,MAAM,EAAE,CAAC,EAAE,CAChB,CAAC;QACF,MAAM,IAAI,UAAU,CAChB,8CAA8C,MAAM,EAAE,CACzD,CAAC;IACN,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChC,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC"}
1
+ {"version":3,"file":"loadLightdashProjectConfig.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,4BAA4B,MAAM,mDAAmD,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACH,wBAAwB,GAE3B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,aAAa,GAA2B;IAC1C,SAAS,EAAE,wBAAwB;CACtC,CAAC;AACF,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAK,EAC3C,gBAAwB,EACxB,QAA4D,EAC7B,EAAE;IACjC,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACjC,OAAO,aAAa,CAAC;IACzB,CAAC;IACD,4CAA4C;IAC5C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC1B,gBAAgB,CACgB,CAAC;IACrC,kDAAkD;IAClD,MAAM,UAAU,GAA2B;QACvC,GAAG,aAAa;QAChB,GAAG,YAAY;KAClB,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,6DAA6D;IAC7D,SAAS,CAAC,GAAG,CAAC,CAAC;IACf,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CACxB,4BAA4B,CAC/B,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,eAAe,CAC1B,4BAA4B,EAC5B,UAAU,EACV,QAAQ,CAAC,MAAM,IAAI,EAAE,EACrB,EAAE,MAAM,EAAE,CAAC,EAAE,CAChB,CAAC;QACF,MAAM,IAAI,UAAU,CAChB,8CAA8C,MAAM,EAAE,CACzD,CAAC;IACN,CAAC;IAED,IAAI,UAAU,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;QAChC,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC;IACtC,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Mock YAML content for lightdash project config tests
3
+ */
4
+ export declare const emptyConfig = "";
5
+ export declare const validConfigWithParameters = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options:\n - option1\n - option2\n";
6
+ export declare const validConfigWithOptionsFromDimension = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options_from_dimension:\n model: test_model\n dimension: test_dimension\n";
7
+ export declare const validConfigWithAllowCustomValues = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n allow_custom_values: true\n";
8
+ export declare const invalidConfigWithNoOptions = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n";
9
+ export declare const invalidConfigWithAllowCustomValuesFalse = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n allow_custom_values: false\n";
10
+ export declare const configWithEmptyOptionsArray = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options: []\n";
11
+ export declare const invalidConfigWithIncompleteOptionsFromDimension = "\nspotlight:\n default_visibility: show\nparameters:\n test_param:\n label: Test Parameter\n options_from_dimension:\n model: test_model\n";
12
+ //# sourceMappingURL=loadLightdashProjectConfig.mock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.mock.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,WAAW,KAAK,CAAC;AAE9B,eAAO,MAAM,yBAAyB,sJASrC,CAAC;AAEF,eAAO,MAAM,mCAAmC,6LAS/C,CAAC;AAEF,eAAO,MAAM,gCAAgC,qIAO5C,CAAC;AAEF,eAAO,MAAM,0BAA0B,sGAMtC,CAAC;AAEF,eAAO,MAAM,uCAAuC,sIAOnD,CAAC;AAEF,eAAO,MAAM,2BAA2B,uHAOvC,CAAC;AAEF,eAAO,MAAM,+CAA+C,4JAQ3D,CAAC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Mock YAML content for lightdash project config tests
3
+ */
4
+ export const emptyConfig = '';
5
+ export const validConfigWithParameters = `
6
+ spotlight:
7
+ default_visibility: show
8
+ parameters:
9
+ test_param:
10
+ label: Test Parameter
11
+ options:
12
+ - option1
13
+ - option2
14
+ `;
15
+ export const validConfigWithOptionsFromDimension = `
16
+ spotlight:
17
+ default_visibility: show
18
+ parameters:
19
+ test_param:
20
+ label: Test Parameter
21
+ options_from_dimension:
22
+ model: test_model
23
+ dimension: test_dimension
24
+ `;
25
+ export const validConfigWithAllowCustomValues = `
26
+ spotlight:
27
+ default_visibility: show
28
+ parameters:
29
+ test_param:
30
+ label: Test Parameter
31
+ allow_custom_values: true
32
+ `;
33
+ export const invalidConfigWithNoOptions = `
34
+ spotlight:
35
+ default_visibility: show
36
+ parameters:
37
+ test_param:
38
+ label: Test Parameter
39
+ `;
40
+ export const invalidConfigWithAllowCustomValuesFalse = `
41
+ spotlight:
42
+ default_visibility: show
43
+ parameters:
44
+ test_param:
45
+ label: Test Parameter
46
+ allow_custom_values: false
47
+ `;
48
+ export const configWithEmptyOptionsArray = `
49
+ spotlight:
50
+ default_visibility: show
51
+ parameters:
52
+ test_param:
53
+ label: Test Parameter
54
+ options: []
55
+ `;
56
+ export const invalidConfigWithIncompleteOptionsFromDimension = `
57
+ spotlight:
58
+ default_visibility: show
59
+ parameters:
60
+ test_param:
61
+ label: Test Parameter
62
+ options_from_dimension:
63
+ model: test_model
64
+ `;
65
+ //# sourceMappingURL=loadLightdashProjectConfig.mock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.mock.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.mock.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,CAAC;AAE9B,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;CASxC,CAAC;AAEF,MAAM,CAAC,MAAM,mCAAmC,GAAG;;;;;;;;;CASlD,CAAC;AAEF,MAAM,CAAC,MAAM,gCAAgC,GAAG;;;;;;;CAO/C,CAAC;AAEF,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;CAMzC,CAAC;AAEF,MAAM,CAAC,MAAM,uCAAuC,GAAG;;;;;;;CAOtD,CAAC;AAEF,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;CAO1C,CAAC;AAEF,MAAM,CAAC,MAAM,+CAA+C,GAAG;;;;;;;;CAQ9D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loadLightdashProjectConfig.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.test.d.ts","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import { ParseError } from '../types/errors';
2
+ import { loadLightdashProjectConfig } from './loadLightdashProjectConfig';
3
+ import { configWithEmptyOptionsArray, emptyConfig, invalidConfigWithAllowCustomValuesFalse, invalidConfigWithIncompleteOptionsFromDimension, invalidConfigWithNoOptions, validConfigWithAllowCustomValues, validConfigWithOptionsFromDimension, validConfigWithParameters, } from './loadLightdashProjectConfig.mock';
4
+ describe('loadLightdashProjectConfig', () => {
5
+ it('should load an empty config', async () => {
6
+ const config = await loadLightdashProjectConfig(emptyConfig);
7
+ expect(config).toEqual({
8
+ spotlight: {
9
+ default_visibility: 'show',
10
+ },
11
+ });
12
+ });
13
+ it('should load a valid config with parameters', async () => {
14
+ const config = await loadLightdashProjectConfig(validConfigWithParameters);
15
+ expect(config).toEqual({
16
+ spotlight: {
17
+ default_visibility: 'show',
18
+ },
19
+ parameters: {
20
+ test_param: {
21
+ label: 'Test Parameter',
22
+ options: ['option1', 'option2'],
23
+ },
24
+ },
25
+ });
26
+ });
27
+ it('should load a valid config with parameters using options_from_dimension', async () => {
28
+ const config = await loadLightdashProjectConfig(validConfigWithOptionsFromDimension);
29
+ expect(config).toEqual({
30
+ spotlight: {
31
+ default_visibility: 'show',
32
+ },
33
+ parameters: {
34
+ test_param: {
35
+ label: 'Test Parameter',
36
+ options_from_dimension: {
37
+ model: 'test_model',
38
+ dimension: 'test_dimension',
39
+ },
40
+ },
41
+ },
42
+ });
43
+ });
44
+ it('should load a valid config with parameters using allow_custom_values', async () => {
45
+ const config = await loadLightdashProjectConfig(validConfigWithAllowCustomValues);
46
+ expect(config).toEqual({
47
+ spotlight: {
48
+ default_visibility: 'show',
49
+ },
50
+ parameters: {
51
+ test_param: {
52
+ label: 'Test Parameter',
53
+ allow_custom_values: true,
54
+ },
55
+ },
56
+ });
57
+ });
58
+ it('should throw an error for invalid parameter with no options', async () => {
59
+ await expect(loadLightdashProjectConfig(invalidConfigWithNoOptions)).rejects.toThrow(ParseError);
60
+ });
61
+ it('should throw an error for invalid parameter with allow_custom_values set to false', async () => {
62
+ await expect(loadLightdashProjectConfig(invalidConfigWithAllowCustomValuesFalse)).rejects.toThrow(ParseError);
63
+ });
64
+ it('should throw an error for parameter with empty options array', async () => {
65
+ await expect(loadLightdashProjectConfig(configWithEmptyOptionsArray)).rejects.toThrow(ParseError);
66
+ });
67
+ it('should throw an error for invalid parameter with incomplete options_from_dimension', async () => {
68
+ await expect(loadLightdashProjectConfig(invalidConfigWithIncompleteOptionsFromDimension)).rejects.toThrow(ParseError);
69
+ });
70
+ });
71
+ //# sourceMappingURL=loadLightdashProjectConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadLightdashProjectConfig.test.js","sourceRoot":"","sources":["../../../src/utils/loadLightdashProjectConfig.test.ts"],"names":[],"mappings":"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"}