@commercetools-frontend/application-config 21.3.3 → 21.6.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.
@@ -27,6 +27,7 @@ var _possibleConstructorReturn = require('@babel/runtime-corejs3/helpers/possibl
27
27
  var _getPrototypeOf = require('@babel/runtime-corejs3/helpers/getPrototypeOf');
28
28
  var _wrapNativeSuper = require('@babel/runtime-corejs3/helpers/wrapNativeSuper');
29
29
  var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
30
+ var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
30
31
  var Ajv = require('ajv');
31
32
  var _slicedToArray = require('@babel/runtime-corejs3/helpers/slicedToArray');
32
33
  var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
@@ -37,6 +38,8 @@ var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/i
37
38
  var uniq = require('lodash/uniq');
38
39
  var _startsWithInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/starts-with');
39
40
  var formatters = require('./formatters-41584280.cjs.dev.js');
41
+ var createDOMPurify = require('dompurify');
42
+ var jsdom$1 = require('jsdom');
40
43
  require('lodash/upperFirst');
41
44
 
42
45
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
@@ -56,6 +59,7 @@ var omitEmpty__default = /*#__PURE__*/_interopDefault(omitEmpty);
56
59
  var path__default = /*#__PURE__*/_interopDefault(path);
57
60
  var _Reflect$construct__default = /*#__PURE__*/_interopDefault(_Reflect$construct);
58
61
  var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
62
+ var _Set__default = /*#__PURE__*/_interopDefault(_Set);
59
63
  var Ajv__default = /*#__PURE__*/_interopDefault(Ajv);
60
64
  var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
61
65
  var _JSON$stringify__default = /*#__PURE__*/_interopDefault(_JSON$stringify);
@@ -63,6 +67,7 @@ var _Object$values__default = /*#__PURE__*/_interopDefault(_Object$values);
63
67
  var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
64
68
  var uniq__default = /*#__PURE__*/_interopDefault(uniq);
65
69
  var _startsWithInstanceProperty__default = /*#__PURE__*/_interopDefault(_startsWithInstanceProperty);
70
+ var createDOMPurify__default = /*#__PURE__*/_interopDefault(createDOMPurify);
66
71
 
67
72
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = _Reflect$construct__default["default"](Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
68
73
 
@@ -182,7 +187,7 @@ var schemaJson = {
182
187
  oneOf: [
183
188
  {
184
189
  type: "string",
185
- pattern: "^[^\\-_]([0-9a-z]|[\\-_](?![\\-_])){2,64}[^\\-_]$"
190
+ pattern: "^[^\\-_#]([0-9a-z]|[\\-_](?![\\-_])){0,62}[^\\-_#]$"
186
191
  },
187
192
  {
188
193
  $ref: "#/definitions/envVariablePlaceholder"
@@ -524,6 +529,21 @@ var validateConfig = function validateConfig(config) {
524
529
  throw new Error(printErrors(validate.errors));
525
530
  }
526
531
  };
532
+ var validateSubmenuLinks = function validateSubmenuLinks(config) {
533
+ var _context4;
534
+
535
+ var uriPathSet = new _Set__default["default"]();
536
+
537
+ _forEachInstanceProperty__default["default"](_context4 = config.submenuLinks).call(_context4, function (_ref) {
538
+ var uriPath = _ref.uriPath;
539
+
540
+ if (uriPathSet.has(uriPath)) {
541
+ throw new Error('Duplicate URI path. Every submenu link must have a unique URI path value');
542
+ }
543
+
544
+ uriPathSet.add(uriPath);
545
+ });
546
+ };
527
547
 
528
548
  /**
529
549
  * NOTE:
@@ -715,6 +735,19 @@ var getOrThrow = function getOrThrow(fn, errorMessage) {
715
735
  }
716
736
  };
717
737
 
738
+ var jsdom = new jsdom$1.JSDOM(''); // @ts-expect-error: jsdom returns DOMWindow, which doesn't match Window dompurify expects
739
+
740
+ var DOMPurify = createDOMPurify__default["default"](jsdom.window);
741
+ function sanitizeSvg(data) {
742
+ return DOMPurify.sanitize(data, {
743
+ USE_PROFILES: {
744
+ svg: true
745
+ },
746
+ FORBID_ATTR: [// To avoid injection by using `style="filter:url(\"data:image/svg+xml,<svg`
747
+ 'style']
748
+ });
749
+ }
750
+
718
751
  function ownKeys$1(object, enumerableOnly) { var keys = _Object$keys__default["default"](object); if (_Object$getOwnPropertySymbols__default["default"]) { var symbols = _Object$getOwnPropertySymbols__default["default"](object); enumerableOnly && (symbols = _filterInstanceProperty__default["default"](symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor__default["default"](object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
719
752
 
720
753
  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var _context3, _context4; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty__default["default"](_context3 = ownKeys$1(Object(source), !0)).call(_context3, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](target, _Object$getOwnPropertyDescriptors__default["default"](source)) : _forEachInstanceProperty__default["default"](_context4 = ownKeys$1(Object(source))).call(_context4, function (key) { _Object$defineProperty__default["default"](target, key, _Object$getOwnPropertyDescriptor__default["default"](source, key)); }); } return target; }
@@ -739,6 +772,7 @@ function transformCustomApplicationConfigToData(appConfig) {
739
772
  var _context2;
740
773
 
741
774
  var permissionKeys = formatters.entryPointUriPathToResourceAccesses(appConfig.entryPointUriPath);
775
+ validateSubmenuLinks(appConfig);
742
776
  return {
743
777
  id: appConfig.env.production.applicationId,
744
778
  name: appConfig.name,
@@ -752,7 +786,7 @@ function transformCustomApplicationConfigToData(appConfig) {
752
786
  name: permissionKeys.manage,
753
787
  oAuthScopes: appConfig.oAuthScopes.manage
754
788
  }],
755
- icon: appConfig.icon,
789
+ icon: sanitizeSvg(appConfig.icon),
756
790
  mainMenuLink: appConfig.mainMenuLink,
757
791
  submenuLinks: _mapInstanceProperty__default["default"](_context2 = appConfig.submenuLinks).call(_context2, function (submenuLink) {
758
792
  return _objectSpread$1(_objectSpread$1({}, submenuLink), {}, {
@@ -27,6 +27,7 @@ var _possibleConstructorReturn = require('@babel/runtime-corejs3/helpers/possibl
27
27
  var _getPrototypeOf = require('@babel/runtime-corejs3/helpers/getPrototypeOf');
28
28
  var _wrapNativeSuper = require('@babel/runtime-corejs3/helpers/wrapNativeSuper');
29
29
  var _mapInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/map');
30
+ var _Set = require('@babel/runtime-corejs3/core-js-stable/set');
30
31
  var Ajv = require('ajv');
31
32
  var _slicedToArray = require('@babel/runtime-corejs3/helpers/slicedToArray');
32
33
  var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/trim');
@@ -37,6 +38,8 @@ var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/i
37
38
  var uniq = require('lodash/uniq');
38
39
  var _startsWithInstanceProperty = require('@babel/runtime-corejs3/core-js-stable/instance/starts-with');
39
40
  var formatters = require('./formatters-40251cfd.cjs.prod.js');
41
+ var createDOMPurify = require('dompurify');
42
+ var jsdom$1 = require('jsdom');
40
43
  require('lodash/upperFirst');
41
44
 
42
45
  function _interopDefault (e) { return e && e.__esModule ? e : { 'default': e }; }
@@ -56,6 +59,7 @@ var omitEmpty__default = /*#__PURE__*/_interopDefault(omitEmpty);
56
59
  var path__default = /*#__PURE__*/_interopDefault(path);
57
60
  var _Reflect$construct__default = /*#__PURE__*/_interopDefault(_Reflect$construct);
58
61
  var _mapInstanceProperty__default = /*#__PURE__*/_interopDefault(_mapInstanceProperty);
62
+ var _Set__default = /*#__PURE__*/_interopDefault(_Set);
59
63
  var Ajv__default = /*#__PURE__*/_interopDefault(Ajv);
60
64
  var _trimInstanceProperty__default = /*#__PURE__*/_interopDefault(_trimInstanceProperty);
61
65
  var _JSON$stringify__default = /*#__PURE__*/_interopDefault(_JSON$stringify);
@@ -63,6 +67,7 @@ var _Object$values__default = /*#__PURE__*/_interopDefault(_Object$values);
63
67
  var _includesInstanceProperty__default = /*#__PURE__*/_interopDefault(_includesInstanceProperty);
64
68
  var uniq__default = /*#__PURE__*/_interopDefault(uniq);
65
69
  var _startsWithInstanceProperty__default = /*#__PURE__*/_interopDefault(_startsWithInstanceProperty);
70
+ var createDOMPurify__default = /*#__PURE__*/_interopDefault(createDOMPurify);
66
71
 
67
72
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = _Reflect$construct__default["default"](Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
68
73
 
@@ -182,7 +187,7 @@ var schemaJson = {
182
187
  oneOf: [
183
188
  {
184
189
  type: "string",
185
- pattern: "^[^\\-_]([0-9a-z]|[\\-_](?![\\-_])){2,64}[^\\-_]$"
190
+ pattern: "^[^\\-_#]([0-9a-z]|[\\-_](?![\\-_])){0,62}[^\\-_#]$"
186
191
  },
187
192
  {
188
193
  $ref: "#/definitions/envVariablePlaceholder"
@@ -524,6 +529,21 @@ var validateConfig = function validateConfig(config) {
524
529
  throw new Error(printErrors(validate.errors));
525
530
  }
526
531
  };
532
+ var validateSubmenuLinks = function validateSubmenuLinks(config) {
533
+ var _context4;
534
+
535
+ var uriPathSet = new _Set__default["default"]();
536
+
537
+ _forEachInstanceProperty__default["default"](_context4 = config.submenuLinks).call(_context4, function (_ref) {
538
+ var uriPath = _ref.uriPath;
539
+
540
+ if (uriPathSet.has(uriPath)) {
541
+ throw new Error('Duplicate URI path. Every submenu link must have a unique URI path value');
542
+ }
543
+
544
+ uriPathSet.add(uriPath);
545
+ });
546
+ };
527
547
 
528
548
  /**
529
549
  * NOTE:
@@ -715,6 +735,19 @@ var getOrThrow = function getOrThrow(fn, errorMessage) {
715
735
  }
716
736
  };
717
737
 
738
+ var jsdom = new jsdom$1.JSDOM(''); // @ts-expect-error: jsdom returns DOMWindow, which doesn't match Window dompurify expects
739
+
740
+ var DOMPurify = createDOMPurify__default["default"](jsdom.window);
741
+ function sanitizeSvg(data) {
742
+ return DOMPurify.sanitize(data, {
743
+ USE_PROFILES: {
744
+ svg: true
745
+ },
746
+ FORBID_ATTR: [// To avoid injection by using `style="filter:url(\"data:image/svg+xml,<svg`
747
+ 'style']
748
+ });
749
+ }
750
+
718
751
  function ownKeys$1(object, enumerableOnly) { var keys = _Object$keys__default["default"](object); if (_Object$getOwnPropertySymbols__default["default"]) { var symbols = _Object$getOwnPropertySymbols__default["default"](object); enumerableOnly && (symbols = _filterInstanceProperty__default["default"](symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor__default["default"](object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
719
752
 
720
753
  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var _context3, _context4; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty__default["default"](_context3 = ownKeys$1(Object(source), !0)).call(_context3, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors__default["default"] ? _Object$defineProperties__default["default"](target, _Object$getOwnPropertyDescriptors__default["default"](source)) : _forEachInstanceProperty__default["default"](_context4 = ownKeys$1(Object(source))).call(_context4, function (key) { _Object$defineProperty__default["default"](target, key, _Object$getOwnPropertyDescriptor__default["default"](source, key)); }); } return target; }
@@ -739,6 +772,7 @@ function transformCustomApplicationConfigToData(appConfig) {
739
772
  var _context2;
740
773
 
741
774
  var permissionKeys = formatters.entryPointUriPathToResourceAccesses(appConfig.entryPointUriPath);
775
+ validateSubmenuLinks(appConfig);
742
776
  return {
743
777
  id: appConfig.env.production.applicationId,
744
778
  name: appConfig.name,
@@ -752,7 +786,7 @@ function transformCustomApplicationConfigToData(appConfig) {
752
786
  name: permissionKeys.manage,
753
787
  oAuthScopes: appConfig.oAuthScopes.manage
754
788
  }],
755
- icon: appConfig.icon,
789
+ icon: sanitizeSvg(appConfig.icon),
756
790
  mainMenuLink: appConfig.mainMenuLink,
757
791
  submenuLinks: _mapInstanceProperty__default["default"](_context2 = appConfig.submenuLinks).call(_context2, function (submenuLink) {
758
792
  return _objectSpread$1(_objectSpread$1({}, submenuLink), {}, {
@@ -23,6 +23,7 @@ import _possibleConstructorReturn from '@babel/runtime-corejs3/helpers/esm/possi
23
23
  import _getPrototypeOf from '@babel/runtime-corejs3/helpers/esm/getPrototypeOf';
24
24
  import _wrapNativeSuper from '@babel/runtime-corejs3/helpers/esm/wrapNativeSuper';
25
25
  import _mapInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/map';
26
+ import _Set from '@babel/runtime-corejs3/core-js-stable/set';
26
27
  import Ajv from 'ajv';
27
28
  import _slicedToArray from '@babel/runtime-corejs3/helpers/esm/slicedToArray';
28
29
  import _trimInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/trim';
@@ -33,6 +34,8 @@ import _includesInstanceProperty from '@babel/runtime-corejs3/core-js-stable/ins
33
34
  import uniq from 'lodash/uniq';
34
35
  import _startsWithInstanceProperty from '@babel/runtime-corejs3/core-js-stable/instance/starts-with';
35
36
  import { e as entryPointUriPathToResourceAccesses } from './formatters-62af6993.esm.js';
37
+ import createDOMPurify from 'dompurify';
38
+ import { JSDOM } from 'jsdom';
36
39
  import 'lodash/upperFirst';
37
40
 
38
41
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
@@ -153,7 +156,7 @@ var schemaJson = {
153
156
  oneOf: [
154
157
  {
155
158
  type: "string",
156
- pattern: "^[^\\-_]([0-9a-z]|[\\-_](?![\\-_])){2,64}[^\\-_]$"
159
+ pattern: "^[^\\-_#]([0-9a-z]|[\\-_](?![\\-_])){0,62}[^\\-_#]$"
157
160
  },
158
161
  {
159
162
  $ref: "#/definitions/envVariablePlaceholder"
@@ -495,6 +498,21 @@ var validateConfig = function validateConfig(config) {
495
498
  throw new Error(printErrors(validate.errors));
496
499
  }
497
500
  };
501
+ var validateSubmenuLinks = function validateSubmenuLinks(config) {
502
+ var _context4;
503
+
504
+ var uriPathSet = new _Set();
505
+
506
+ _forEachInstanceProperty(_context4 = config.submenuLinks).call(_context4, function (_ref) {
507
+ var uriPath = _ref.uriPath;
508
+
509
+ if (uriPathSet.has(uriPath)) {
510
+ throw new Error('Duplicate URI path. Every submenu link must have a unique URI path value');
511
+ }
512
+
513
+ uriPathSet.add(uriPath);
514
+ });
515
+ };
498
516
 
499
517
  /**
500
518
  * NOTE:
@@ -686,6 +704,19 @@ var getOrThrow = function getOrThrow(fn, errorMessage) {
686
704
  }
687
705
  };
688
706
 
707
+ var jsdom = new JSDOM(''); // @ts-expect-error: jsdom returns DOMWindow, which doesn't match Window dompurify expects
708
+
709
+ var DOMPurify = createDOMPurify(jsdom.window);
710
+ function sanitizeSvg(data) {
711
+ return DOMPurify.sanitize(data, {
712
+ USE_PROFILES: {
713
+ svg: true
714
+ },
715
+ FORBID_ATTR: [// To avoid injection by using `style="filter:url(\"data:image/svg+xml,<svg`
716
+ 'style']
717
+ });
718
+ }
719
+
689
720
  function ownKeys$1(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
690
721
 
691
722
  function _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var _context3, _context4; var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? _forEachInstanceProperty(_context3 = ownKeys$1(Object(source), !0)).call(_context3, function (key) { _defineProperty(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : _forEachInstanceProperty(_context4 = ownKeys$1(Object(source))).call(_context4, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } return target; }
@@ -710,6 +741,7 @@ function transformCustomApplicationConfigToData(appConfig) {
710
741
  var _context2;
711
742
 
712
743
  var permissionKeys = entryPointUriPathToResourceAccesses(appConfig.entryPointUriPath);
744
+ validateSubmenuLinks(appConfig);
713
745
  return {
714
746
  id: appConfig.env.production.applicationId,
715
747
  name: appConfig.name,
@@ -723,7 +755,7 @@ function transformCustomApplicationConfigToData(appConfig) {
723
755
  name: permissionKeys.manage,
724
756
  oAuthScopes: appConfig.oAuthScopes.manage
725
757
  }],
726
- icon: appConfig.icon,
758
+ icon: sanitizeSvg(appConfig.icon),
727
759
  mainMenuLink: appConfig.mainMenuLink,
728
760
  submenuLinks: _mapInstanceProperty(_context2 = appConfig.submenuLinks).call(_context2, function (submenuLink) {
729
761
  return _objectSpread$1(_objectSpread$1({}, submenuLink), {}, {
@@ -0,0 +1 @@
1
+ export default function sanitizeSvg(data: string): string;
@@ -34,9 +34,9 @@ export declare type CustomApplicationData = {
34
34
  mainMenuLink: CustomApplicationMenuLinkData;
35
35
  submenuLinks: CustomApplicationSubmenuLinkData[];
36
36
  };
37
- export declare type ApplicationRuntimeConfig = {
37
+ export declare type ApplicationRuntimeConfig<AdditionalEnvironmentProperties extends {} = {}> = {
38
38
  data: CustomApplicationData;
39
- env: ApplicationWindow['app'];
39
+ env: AdditionalEnvironmentProperties & ApplicationWindow['app'];
40
40
  headers: JSONSchemaForCustomApplicationConfigurationFiles['headers'];
41
41
  };
42
42
  export declare type LoadingConfigOptions = {
@@ -0,0 +1,3 @@
1
+ import type { JSONSchemaForCustomApplicationConfigurationFiles } from './schema';
2
+ export declare const validateConfig: (config: JSONSchemaForCustomApplicationConfigurationFiles) => void;
3
+ export declare const validateSubmenuLinks: (config: JSONSchemaForCustomApplicationConfigurationFiles) => void;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@commercetools-frontend/application-config",
3
- "version": "21.3.3",
3
+ "version": "21.6.0",
4
4
  "description": "Configuration utilities for building Custom Applications",
5
5
  "bugs": "https://github.com/commercetools/merchant-center-application-kit/issues",
6
6
  "repository": {
@@ -33,16 +33,19 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@babel/register": "^7.17.7",
36
- "@babel/runtime": "^7.17.8",
37
- "@babel/runtime-corejs3": "^7.17.8",
38
- "@commercetools-frontend/babel-preset-mc-app": "21.3.2",
36
+ "@babel/runtime": "^7.17.9",
37
+ "@babel/runtime-corejs3": "^7.17.9",
38
+ "@commercetools-frontend/babel-preset-mc-app": "21.3.4",
39
39
  "ajv": "8.11.0",
40
40
  "core-js": "^3.21.1",
41
41
  "cosmiconfig": "7.0.1",
42
+ "dompurify": "^2.3.6",
43
+ "jsdom": "^19.0.0",
42
44
  "lodash": "4.17.21",
43
45
  "omit-empty-es": "1.1.3"
44
46
  },
45
47
  "devDependencies": {
48
+ "@types/jsdom": "^16.2.14",
46
49
  "json-schema-to-typescript": "10.1.5",
47
50
  "shelljs": "0.8.5"
48
51
  },
package/schema.json CHANGED
@@ -30,7 +30,7 @@
30
30
  "oneOf": [
31
31
  {
32
32
  "type": "string",
33
- "pattern": "^[^\\-_]([0-9a-z]|[\\-_](?![\\-_])){2,64}[^\\-_]$"
33
+ "pattern": "^[^\\-_#]([0-9a-z]|[\\-_](?![\\-_])){0,62}[^\\-_#]$"
34
34
  },
35
35
  {
36
36
  "$ref": "#/definitions/envVariablePlaceholder"
@@ -1,3 +0,0 @@
1
- import type { JSONSchemaForCustomApplicationConfigurationFiles } from './schema';
2
- declare const validateConfig: (config: JSONSchemaForCustomApplicationConfigurationFiles) => void;
3
- export default validateConfig;