@knocklabs/cli 0.1.22 → 0.2.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 (66) hide show
  1. package/README.md +191 -106
  2. package/bin/dev.js +4 -4
  3. package/dist/commands/commit/list.js +21 -1
  4. package/dist/commands/guide/activate.js +121 -0
  5. package/dist/commands/guide/generate-types.js +148 -0
  6. package/dist/commands/guide/get.js +139 -0
  7. package/dist/commands/guide/list.js +112 -0
  8. package/dist/commands/guide/pull.js +209 -0
  9. package/dist/commands/guide/push.js +171 -0
  10. package/dist/commands/guide/validate.js +148 -0
  11. package/dist/commands/knock.js +3 -0
  12. package/dist/commands/login.js +50 -0
  13. package/dist/commands/logout.js +48 -0
  14. package/dist/commands/whoami.js +6 -2
  15. package/dist/commands/workflow/generate-types.js +6 -5
  16. package/dist/lib/api-v1.js +74 -4
  17. package/dist/lib/auth.js +256 -0
  18. package/dist/lib/base-command.js +85 -12
  19. package/dist/lib/helpers/browser.js +25 -0
  20. package/dist/lib/helpers/const.js +4 -4
  21. package/dist/lib/helpers/date.js +3 -3
  22. package/dist/lib/helpers/error.js +8 -8
  23. package/dist/lib/helpers/flag.js +7 -7
  24. package/dist/lib/helpers/json.js +5 -5
  25. package/dist/lib/helpers/object.isomorphic.js +8 -8
  26. package/dist/lib/helpers/page.js +9 -9
  27. package/dist/lib/helpers/request.js +4 -4
  28. package/dist/lib/helpers/string.js +3 -3
  29. package/dist/lib/helpers/typegen.js +59 -0
  30. package/dist/lib/helpers/ux.js +3 -3
  31. package/dist/lib/marshal/email-layout/helpers.js +5 -5
  32. package/dist/lib/marshal/email-layout/processor.isomorphic.js +3 -3
  33. package/dist/lib/marshal/email-layout/reader.js +5 -5
  34. package/dist/lib/marshal/email-layout/writer.js +4 -4
  35. package/dist/lib/marshal/guide/helpers.js +283 -0
  36. package/dist/lib/marshal/guide/index.js +3 -0
  37. package/dist/lib/marshal/guide/processor.isomorphic.js +3 -3
  38. package/dist/lib/marshal/guide/reader.js +193 -0
  39. package/dist/lib/marshal/guide/writer.js +175 -0
  40. package/dist/lib/marshal/index.isomorphic.js +7 -7
  41. package/dist/lib/marshal/message-type/helpers.js +5 -5
  42. package/dist/lib/marshal/message-type/processor.isomorphic.js +3 -3
  43. package/dist/lib/marshal/message-type/reader.js +5 -5
  44. package/dist/lib/marshal/message-type/writer.js +4 -4
  45. package/dist/lib/marshal/partial/helpers.js +5 -5
  46. package/dist/lib/marshal/partial/processor.isomorphic.js +3 -3
  47. package/dist/lib/marshal/partial/reader.js +5 -5
  48. package/dist/lib/marshal/partial/writer.js +4 -4
  49. package/dist/lib/marshal/shared/const.isomorphic.js +3 -3
  50. package/dist/lib/marshal/shared/helpers.isomorphic.js +9 -2
  51. package/dist/lib/marshal/shared/helpers.js +4 -4
  52. package/dist/lib/marshal/translation/helpers.js +10 -10
  53. package/dist/lib/marshal/translation/processor.isomorphic.js +6 -6
  54. package/dist/lib/marshal/translation/writer.js +3 -3
  55. package/dist/lib/marshal/workflow/generator.js +4 -4
  56. package/dist/lib/marshal/workflow/helpers.js +53 -10
  57. package/dist/lib/marshal/workflow/processor.isomorphic.js +5 -5
  58. package/dist/lib/marshal/workflow/reader.js +5 -5
  59. package/dist/lib/marshal/workflow/writer.js +5 -5
  60. package/dist/lib/resources.js +3 -3
  61. package/dist/lib/types.js +4 -0
  62. package/dist/lib/urls.js +32 -0
  63. package/dist/lib/user-config.js +69 -31
  64. package/oclif.manifest.json +749 -114
  65. package/package.json +12 -11
  66. package/dist/lib/type-generator.js +0 -100
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- checkIfValidExtractedFilePathFormat: function() {
12
+ get checkIfValidExtractedFilePathFormat () {
13
13
  return checkIfValidExtractedFilePathFormat;
14
14
  },
15
- readExtractedFileSync: function() {
15
+ get readExtractedFileSync () {
16
16
  return readExtractedFileSync;
17
17
  },
18
- validateExtractedFilePath: function() {
18
+ get validateExtractedFilePath () {
19
19
  return validateExtractedFilePath;
20
20
  }
21
21
  });
@@ -5,35 +5,35 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- SYSTEM_NAMESPACE: function() {
12
+ get SYSTEM_NAMESPACE () {
13
13
  return SYSTEM_NAMESPACE;
14
14
  },
15
- buildTranslationFileCtx: function() {
15
+ get buildTranslationFileCtx () {
16
16
  return buildTranslationFileCtx;
17
17
  },
18
- ensureValidCommandTarget: function() {
18
+ get ensureValidCommandTarget () {
19
19
  return ensureValidCommandTarget;
20
20
  },
21
- formatLanguage: function() {
21
+ get formatLanguage () {
22
22
  return formatLanguage;
23
23
  },
24
- isTranslationDir: function() {
24
+ get isTranslationDir () {
25
25
  return isTranslationDir;
26
26
  },
27
- isValidLocale: function() {
27
+ get isValidLocale () {
28
28
  return isValidLocale;
29
29
  },
30
- lsTranslationDir: function() {
30
+ get lsTranslationDir () {
31
31
  return lsTranslationDir;
32
32
  },
33
- parseTranslationRef: function() {
33
+ get parseTranslationRef () {
34
34
  return parseTranslationRef;
35
35
  },
36
- translationRefDescription: function() {
36
+ get translationRefDescription () {
37
37
  return translationRefDescription;
38
38
  }
39
39
  });
@@ -5,23 +5,23 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- DEFAULT_TRANSLATION_FORMAT: function() {
12
+ get DEFAULT_TRANSLATION_FORMAT () {
13
13
  return DEFAULT_TRANSLATION_FORMAT;
14
14
  },
15
- SUPPORTED_TRANSLATION_FORMATS: function() {
15
+ get SUPPORTED_TRANSLATION_FORMATS () {
16
16
  return SUPPORTED_TRANSLATION_FORMATS;
17
17
  },
18
- buildTranslationDirBundle: function() {
18
+ get buildTranslationDirBundle () {
19
19
  return buildTranslationDirBundle;
20
20
  },
21
- formatFileName: function() {
21
+ get formatFileName () {
22
22
  return formatFileName;
23
23
  },
24
- formatRef: function() {
24
+ get formatRef () {
25
25
  return formatRef;
26
26
  }
27
27
  });
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- writeTranslationFile: function() {
12
+ get writeTranslationFile () {
13
13
  return writeTranslationFile;
14
14
  },
15
- writeTranslationFiles: function() {
15
+ get writeTranslationFiles () {
16
16
  return writeTranslationFiles;
17
17
  }
18
18
  });
@@ -5,17 +5,17 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- generateWorkflowDir: function() {
12
+ get generateWorkflowDir () {
13
13
  return generateWorkflowDir;
14
14
  },
15
- parseStepsInput: function() {
15
+ get parseStepsInput () {
16
16
  return parseStepsInput;
17
17
  },
18
- scaffoldWorkflowDirBundle: function() {
18
+ get scaffoldWorkflowDirBundle () {
19
19
  return scaffoldWorkflowDirBundle;
20
20
  }
21
21
  });
@@ -5,35 +5,38 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- countSteps: function() {
12
+ get countSteps () {
13
13
  return countSteps;
14
14
  },
15
- ensureValidCommandTarget: function() {
15
+ get ensureValidCommandTarget () {
16
16
  return ensureValidCommandTarget;
17
17
  },
18
- formatCategories: function() {
18
+ get formatCategories () {
19
19
  return formatCategories;
20
20
  },
21
- formatStatus: function() {
21
+ get formatStatus () {
22
22
  return formatStatus;
23
23
  },
24
- formatStepSummary: function() {
24
+ get formatStepSummary () {
25
25
  return formatStepSummary;
26
26
  },
27
- isWorkflowDir: function() {
27
+ get generateWorkflowTypes () {
28
+ return generateWorkflowTypes;
29
+ },
30
+ get isWorkflowDir () {
28
31
  return isWorkflowDir;
29
32
  },
30
- lsWorkflowJson: function() {
33
+ get lsWorkflowJson () {
31
34
  return lsWorkflowJson;
32
35
  },
33
- validateWorkflowKey: function() {
36
+ get validateWorkflowKey () {
34
37
  return validateWorkflowKey;
35
38
  },
36
- workflowJsonPath: function() {
39
+ get workflowJsonPath () {
37
40
  return workflowJsonPath;
38
41
  }
39
42
  });
@@ -41,7 +44,9 @@ const _nodepath = /*#__PURE__*/ _interop_require_wildcard(require("node:path"));
41
44
  const _core = require("@oclif/core");
42
45
  const _fsextra = /*#__PURE__*/ _interop_require_wildcard(require("fs-extra"));
43
46
  const _lodash = require("lodash");
47
+ const _quicktypecore = require("quicktype-core");
44
48
  const _string = require("../../helpers/string");
49
+ const _typegen = require("../../helpers/typegen");
45
50
  const _processorisomorphic = require("./processor.isomorphic");
46
51
  const _types = require("./types");
47
52
  function _getRequireWildcardCache(nodeInterop) {
@@ -263,3 +268,41 @@ const doCountSteps = (steps)=>{
263
268
  return count;
264
269
  };
265
270
  const countSteps = (workflow)=>doCountSteps(workflow.steps);
271
+ async function generateWorkflowTypes(workflows, targetLanguage) {
272
+ const validWorkflows = workflows.filter((workflow)=>workflow.trigger_data_json_schema);
273
+ if (validWorkflows.length === 0) {
274
+ return {
275
+ result: undefined,
276
+ workflows: []
277
+ };
278
+ }
279
+ const schemaInput = new _quicktypecore.JSONSchemaInput(new _quicktypecore.FetchingJSONSchemaStore());
280
+ for (const workflow of validWorkflows){
281
+ const pascalCaseWorkflowKey = workflow.key.split(/[_-]/).map((part)=>part.charAt(0).toUpperCase() + part.slice(1)).join("");
282
+ const schema = (0, _typegen.transformSchema)({
283
+ ...workflow.trigger_data_json_schema,
284
+ title: `${pascalCaseWorkflowKey}Data`
285
+ });
286
+ schemaInput.addSource({
287
+ name: `${pascalCaseWorkflowKey}Data`,
288
+ schema: JSON.stringify(schema)
289
+ });
290
+ }
291
+ const inputData = new _quicktypecore.InputData();
292
+ inputData.addInput(schemaInput);
293
+ const result = await (0, _quicktypecore.quicktype)({
294
+ inputData,
295
+ lang: targetLanguage,
296
+ allPropertiesOptional: false,
297
+ alphabetizeProperties: true,
298
+ rendererOptions: {
299
+ "just-types": true,
300
+ "no-extra-properties": true,
301
+ "no-optional-null": true
302
+ }
303
+ });
304
+ return {
305
+ result,
306
+ workflows: validWorkflows
307
+ };
308
+ }
@@ -12,20 +12,20 @@ Object.defineProperty(exports, "__esModule", {
12
12
  function _export(target, all) {
13
13
  for(var name in all)Object.defineProperty(target, name, {
14
14
  enumerable: true,
15
- get: all[name]
15
+ get: Object.getOwnPropertyDescriptor(all, name).get
16
16
  });
17
17
  }
18
18
  _export(exports, {
19
- VISUAL_BLOCKS_JSON: function() {
19
+ get VISUAL_BLOCKS_JSON () {
20
20
  return VISUAL_BLOCKS_JSON;
21
21
  },
22
- WORKFLOW_JSON: function() {
22
+ get WORKFLOW_JSON () {
23
23
  return WORKFLOW_JSON;
24
24
  },
25
- buildWorkflowDirBundle: function() {
25
+ get buildWorkflowDirBundle () {
26
26
  return buildWorkflowDirBundle;
27
27
  },
28
- formatExtractedFilePath: function() {
28
+ get formatExtractedFilePath () {
29
29
  return formatExtractedFilePath;
30
30
  }
31
31
  });
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- readAllForCommandTarget: function() {
12
+ get readAllForCommandTarget () {
13
13
  return readAllForCommandTarget;
14
14
  },
15
- readWorkflowDir: function() {
15
+ get readWorkflowDir () {
16
16
  return readWorkflowDir;
17
17
  }
18
18
  });
@@ -143,7 +143,7 @@ const joinExtractedFiles = async (workflowDirCtx, workflowJson)=>{
143
143
  };
144
144
  const readWorkflowDir = async (workflowDirCtx, opts = {})=>{
145
145
  const { abspath } = workflowDirCtx;
146
- const { withExtractedFiles = false, withReadonlyField = false } = opts;
146
+ const { withExtractedFiles = false } = opts;
147
147
  const dirExists = await _fsextra.pathExists(abspath);
148
148
  if (!dirExists) throw new Error(`${abspath} does not exist`);
149
149
  const workflowJsonPath = await (0, _helpers1.lsWorkflowJson)(abspath);
@@ -151,7 +151,7 @@ const readWorkflowDir = async (workflowDirCtx, opts = {})=>{
151
151
  const result = await (0, _json.readJson)(workflowJsonPath);
152
152
  if (!result[0]) return result;
153
153
  let [workflowJson] = result;
154
- workflowJson = withReadonlyField ? workflowJson : (0, _objectisomorphic.omitDeep)(workflowJson, [
154
+ workflowJson = (0, _objectisomorphic.omitDeep)(workflowJson, [
155
155
  "__readonly"
156
156
  ]);
157
157
  return withExtractedFiles ? joinExtractedFiles(workflowDirCtx, workflowJson) : [
@@ -5,20 +5,20 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- pruneWorkflowsIndexDir: function() {
12
+ get pruneWorkflowsIndexDir () {
13
13
  return pruneWorkflowsIndexDir;
14
14
  },
15
- writeWorkflowDirFromBundle: function() {
15
+ get writeWorkflowDirFromBundle () {
16
16
  return writeWorkflowDirFromBundle;
17
17
  },
18
- writeWorkflowDirFromData: function() {
18
+ get writeWorkflowDirFromData () {
19
19
  return writeWorkflowDirFromData;
20
20
  },
21
- writeWorkflowsIndexDir: function() {
21
+ get writeWorkflowsIndexDir () {
22
22
  return writeWorkflowsIndexDir;
23
23
  }
24
24
  });
@@ -5,14 +5,14 @@ Object.defineProperty(exports, "__esModule", {
5
5
  function _export(target, all) {
6
6
  for(var name in all)Object.defineProperty(target, name, {
7
7
  enumerable: true,
8
- get: all[name]
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
9
  });
10
10
  }
11
11
  _export(exports, {
12
- ALL_RESOURCE_TYPES: function() {
12
+ get ALL_RESOURCE_TYPES () {
13
13
  return ALL_RESOURCE_TYPES;
14
14
  },
15
- RESOURCE_SUBDIRS: function() {
15
+ get RESOURCE_SUBDIRS () {
16
16
  return RESOURCE_SUBDIRS;
17
17
  }
18
18
  });
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get DEFAULT_API_URL () {
13
+ return DEFAULT_API_URL;
14
+ },
15
+ get DEFAULT_AUTH_URL () {
16
+ return DEFAULT_AUTH_URL;
17
+ },
18
+ get DEFAULT_DASHBOARD_URL () {
19
+ return DEFAULT_DASHBOARD_URL;
20
+ },
21
+ get authErrorUrl () {
22
+ return authErrorUrl;
23
+ },
24
+ get authSuccessUrl () {
25
+ return authSuccessUrl;
26
+ }
27
+ });
28
+ const DEFAULT_DASHBOARD_URL = "https://dashboard.knock.app";
29
+ const DEFAULT_AUTH_URL = "https://signin.knock.app";
30
+ const DEFAULT_API_URL = "https://control.knock.app";
31
+ const authSuccessUrl = (dashboardUrl)=>`${dashboardUrl}/auth/oauth/cli`;
32
+ const authErrorUrl = (dashboardUrl, error)=>`${dashboardUrl}/auth/oauth/cli?error=${error}`;
@@ -4,16 +4,29 @@
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- Object.defineProperty(exports, "default", {
7
+ Object.defineProperty(exports, "UserConfigStore", {
8
8
  enumerable: true,
9
9
  get: function() {
10
- return _default;
10
+ return UserConfigStore;
11
11
  }
12
12
  });
13
13
  const _nodepath = /*#__PURE__*/ _interop_require_wildcard(require("node:path"));
14
14
  const _fsextra = /*#__PURE__*/ _interop_require_wildcard(require("fs-extra"));
15
- const _yup = /*#__PURE__*/ _interop_require_wildcard(require("yup"));
15
+ const _zod = require("zod");
16
16
  const _const = require("./helpers/const");
17
+ function _define_property(obj, key, value) {
18
+ if (key in obj) {
19
+ Object.defineProperty(obj, key, {
20
+ value: value,
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true
24
+ });
25
+ } else {
26
+ obj[key] = value;
27
+ }
28
+ return obj;
29
+ }
17
30
  function _getRequireWildcardCache(nodeInterop) {
18
31
  if (typeof WeakMap !== "function") return null;
19
32
  var cacheBabelInterop = new WeakMap();
@@ -55,33 +68,58 @@ function _interop_require_wildcard(obj, nodeInterop) {
55
68
  }
56
69
  return newObj;
57
70
  }
58
- const userConfigSchema = _yup.object({
59
- serviceToken: _yup.string(),
60
- apiOrigin: _yup.string()
71
+ // When a user has authenticated via OAuth, we store the session in the user config.
72
+ const userSessionSchema = _zod.z.object({
73
+ accessToken: _zod.z.string(),
74
+ clientId: _zod.z.string(),
75
+ refreshToken: _zod.z.string()
76
+ });
77
+ const userConfigSchema = _zod.z.object({
78
+ serviceToken: _zod.z.string().optional(),
79
+ apiOrigin: _zod.z.string().optional(),
80
+ dashboardOrigin: _zod.z.string().optional(),
81
+ authOrigin: _zod.z.string().optional(),
82
+ userSession: userSessionSchema.optional()
61
83
  });
62
- let USER_CONFIG;
63
- const maybeReadJsonConfig = async (configDir)=>{
64
- // Don't use a user config file in tests.
65
- if (_const.isTestEnv) return null;
66
- const pathToJsonConfig = _nodepath.resolve(configDir, "config.json");
67
- const exists = await _fsextra.pathExists(pathToJsonConfig);
68
- if (!exists) return null;
69
- return _fsextra.readJSON(pathToJsonConfig);
70
- };
71
- const load = async (configDir)=>{
72
- const readConfig = await maybeReadJsonConfig(configDir);
73
- const validConfig = await userConfigSchema.validate(readConfig || {});
74
- // If no valid user config was available, give it an empty map.
75
- USER_CONFIG = validConfig || {};
76
- return USER_CONFIG;
77
- };
78
- const get = ()=>{
79
- if (!USER_CONFIG) {
80
- throw new Error("User config must be loaded first.");
84
+ class UserConfigStore {
85
+ async load() {
86
+ const readConfig = await this.maybeReadJsonConfig();
87
+ const validConfig = userConfigSchema.parse(readConfig || {});
88
+ this.userConfig = validConfig || {};
89
+ return this.userConfig;
90
+ }
91
+ get() {
92
+ return this.userConfig;
93
+ }
94
+ async set(updatedConfig) {
95
+ this.userConfig = {
96
+ ...this.userConfig,
97
+ ...updatedConfig
98
+ };
99
+ await this.maybeWriteJsonConfig();
100
+ return this.userConfig;
81
101
  }
82
- return USER_CONFIG;
83
- };
84
- const _default = {
85
- load,
86
- get
87
- };
102
+ configPath() {
103
+ return _nodepath.resolve(this.configDir, "config.json");
104
+ }
105
+ async maybeReadJsonConfig() {
106
+ if (_const.isTestEnv) return {};
107
+ const path = this.configPath();
108
+ const exists = await _fsextra.pathExists(path);
109
+ if (!exists) return {};
110
+ return _fsextra.readJSON(path);
111
+ }
112
+ async maybeWriteJsonConfig() {
113
+ if (_const.isTestEnv) return;
114
+ const path = this.configPath();
115
+ await _fsextra.outputJson(path, this.userConfig, {
116
+ spaces: 2
117
+ });
118
+ }
119
+ constructor(configDir){
120
+ _define_property(this, "configDir", void 0);
121
+ _define_property(this, "userConfig", void 0);
122
+ this.configDir = configDir;
123
+ this.userConfig = {};
124
+ }
125
+ }