@neurodevs/ndx-cli 0.0.3 → 0.1.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.
@@ -1,19 +1,35 @@
1
1
  import AbstractSpruceTest from '@sprucelabs/test-utils';
2
2
  export default class CliCommandRunnerTest extends AbstractSpruceTest {
3
- private static instance;
3
+ private static readonly createModuleCommand;
4
+ private static readonly createPackageCommand;
4
5
  protected static beforeEach(): Promise<void>;
5
- protected static createsInstance(): Promise<void>;
6
6
  protected static throwsIfCommandIsNotSupported(): Promise<void>;
7
- protected static promptsUserForInput(): Promise<void>;
8
- protected static createsNodeAutomodule(): Promise<void>;
9
- protected static callsRunOnNodeAutomodule(): Promise<void>;
10
- protected static doesNotContinueIfPromptsIsInterrupted(): Promise<void>;
11
- private static run;
7
+ protected static createModuleCreatesInstance(): Promise<void>;
8
+ protected static createModulePromptsUserForInput(): Promise<void>;
9
+ protected static createModuleDoesNotContinueIfPromptsIsInterrupted(): Promise<void>;
10
+ protected static createModuleCreatesNodeAutomodule(): Promise<void>;
11
+ protected static createModuleRunsNodeAutomodule(): Promise<void>;
12
+ protected static createPackageCreatesInstance(): Promise<void>;
13
+ protected static createPackagePromptsUserForInput(): Promise<void>;
14
+ protected static createPackageDoesNotContinueIfPromptsIsInterrupted(): Promise<void>;
15
+ protected static createPackageCreatesNpmAutopackage(): Promise<void>;
16
+ protected static createPackageRunsNpmAutopackage(): Promise<void>;
17
+ private static expandHomeDir;
18
+ private static runCreateModule;
19
+ private static runCreatePackage;
12
20
  private static setFakeAutomodule;
21
+ private static setFakeAutopackage;
13
22
  private static setFakePrompts;
23
+ private static setFakeResponsesForCreateModule;
24
+ private static setFakePromptResponsesForCreatePackage;
14
25
  private static readonly interfaceName;
15
26
  private static readonly implName;
27
+ private static readonly packageName;
28
+ private static readonly description;
29
+ private static readonly githubToken;
16
30
  private static readonly interfaceNameMessage;
17
31
  private static readonly implNameMessage;
32
+ private static readonly packageNameMessage;
33
+ private static readonly packageDescriptionMessage;
18
34
  private static CliCommandRunner;
19
35
  }
@@ -42,6 +42,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
42
42
  return (mod && mod.__esModule) ? mod : { "default": mod };
43
43
  };
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
+ const os_1 = __importDefault(require("os"));
46
+ const path_1 = __importDefault(require("path"));
45
47
  const test_utils_1 = __importStar(require("@sprucelabs/test-utils"));
46
48
  const meta_node_1 = require("@neurodevs/meta-node");
47
49
  const CliCommandRunner_1 = __importDefault(require("../../modules/CliCommandRunner"));
@@ -50,11 +52,9 @@ class CliCommandRunnerTest extends test_utils_1.default {
50
52
  static async beforeEach() {
51
53
  await super.beforeEach();
52
54
  this.setFakeAutomodule();
55
+ this.setFakeAutopackage();
53
56
  this.setFakePrompts();
54
- this.instance = this.CliCommandRunner();
55
- }
56
- static async createsInstance() {
57
- test_utils_1.assert.isTruthy(this.instance, 'Failed to create instance!');
57
+ process.env.GITHUB_TOKEN = this.githubToken;
58
58
  }
59
59
  static async throwsIfCommandIsNotSupported() {
60
60
  const invalidArg = (0, test_utils_1.generateId)();
@@ -62,8 +62,12 @@ class CliCommandRunnerTest extends test_utils_1.default {
62
62
  const err = await test_utils_1.assert.doesThrowAsync(async () => await instance.run());
63
63
  test_utils_1.assert.isEqual(err.message, `The command "${invalidArg}" is not supported!`, 'Did not receive the expected error!');
64
64
  }
65
- static async promptsUserForInput() {
66
- await this.run();
65
+ static async createModuleCreatesInstance() {
66
+ const instance = await this.runCreateModule();
67
+ test_utils_1.assert.isTruthy(instance, `Failed to create instance for ${this.createModuleCommand}!`);
68
+ }
69
+ static async createModulePromptsUserForInput() {
70
+ await this.runCreateModule();
67
71
  test_utils_1.assert.isEqualDeep(fakePrompts_1.callsToFakePrompts[0], [
68
72
  {
69
73
  type: 'text',
@@ -75,69 +79,161 @@ class CliCommandRunnerTest extends test_utils_1.default {
75
79
  name: 'implName',
76
80
  message: this.implNameMessage,
77
81
  },
78
- ]);
82
+ ], 'Did not prompt user for expected input!');
83
+ }
84
+ static async createModuleDoesNotContinueIfPromptsIsInterrupted() {
85
+ await this.runCreateModule({
86
+ interfaceName: '',
87
+ implName: '',
88
+ });
89
+ test_utils_1.assert.isEqual(meta_node_1.FakeAutomodule.numCallsToRun, 0, 'Should not have called run on NodeAutomodule!');
79
90
  }
80
- static async createsNodeAutomodule() {
81
- await this.run();
91
+ static async createModuleCreatesNodeAutomodule() {
92
+ await this.runCreateModule();
82
93
  test_utils_1.assert.isEqualDeep(meta_node_1.FakeAutomodule.callsToConstructor[0], {
83
94
  testSaveDir: 'src/__tests__/modules',
84
95
  moduleSaveDir: 'src/modules',
85
96
  interfaceName: this.interfaceName,
86
97
  implName: this.implName,
87
- });
98
+ }, 'Did not create NodeAutomodule with expected options!');
88
99
  }
89
- static async callsRunOnNodeAutomodule() {
90
- await this.run();
91
- test_utils_1.assert.isEqual(meta_node_1.FakeAutomodule.numCallsToRun, 1, 'Did not call run on Automodule!');
100
+ static async createModuleRunsNodeAutomodule() {
101
+ await this.runCreateModule();
102
+ test_utils_1.assert.isEqual(meta_node_1.FakeAutomodule.numCallsToRun, 1, 'Did not call run on NodeAutomodule!');
92
103
  }
93
- static async doesNotContinueIfPromptsIsInterrupted() {
94
- (0, fakePrompts_1.setFakePromptsResponses)({
95
- interfaceName: '',
96
- implName: '',
104
+ static async createPackageCreatesInstance() {
105
+ const instance = await this.runCreatePackage();
106
+ test_utils_1.assert.isTruthy(instance, `Failed to create instance for ${this.createPackageCommand}!`);
107
+ }
108
+ static async createPackagePromptsUserForInput() {
109
+ await this.runCreatePackage();
110
+ test_utils_1.assert.isEqualDeep(fakePrompts_1.callsToFakePrompts[0], [
111
+ {
112
+ type: 'text',
113
+ name: 'packageName',
114
+ message: this.packageNameMessage,
115
+ },
116
+ {
117
+ type: 'text',
118
+ name: 'description',
119
+ message: this.packageDescriptionMessage,
120
+ },
121
+ ], 'Did not prompt user for expected input!');
122
+ }
123
+ static async createPackageDoesNotContinueIfPromptsIsInterrupted() {
124
+ await this.runCreatePackage({
125
+ packageName: '',
126
+ description: '',
97
127
  });
98
- await this.run();
99
- test_utils_1.assert.isEqual(meta_node_1.FakeAutomodule.numCallsToRun, 0, 'Should not have called run on Automodule!');
128
+ test_utils_1.assert.isEqual(meta_node_1.FakeAutopackage.numCallsToRun, 0, 'Should not have called run on Autopackage!');
129
+ }
130
+ static async createPackageCreatesNpmAutopackage() {
131
+ this.setFakePromptResponsesForCreatePackage();
132
+ await this.runCreatePackage();
133
+ test_utils_1.assert.isEqualDeep(meta_node_1.FakeAutopackage.callsToConstructor[0], {
134
+ name: this.packageName,
135
+ description: this.description,
136
+ gitNamespace: 'neurodevs',
137
+ npmNamespace: 'neurodevs',
138
+ installDir: this.expandHomeDir('~/dev'),
139
+ license: 'MIT',
140
+ author: 'Eric Yates <hello@ericthecurious.com>',
141
+ }, 'Did not create NpmAutopackage with expected options!');
100
142
  }
101
- static run() {
102
- return this.instance.run();
143
+ static async createPackageRunsNpmAutopackage() {
144
+ await this.runCreatePackage();
145
+ test_utils_1.assert.isEqual(meta_node_1.FakeAutopackage.numCallsToRun, 1, 'Did not call run on Autopackage!');
146
+ }
147
+ static expandHomeDir(inputPath) {
148
+ return inputPath.startsWith('~')
149
+ ? path_1.default.join(os_1.default.homedir(), inputPath.slice(1))
150
+ : inputPath;
151
+ }
152
+ static async runCreateModule(responses) {
153
+ this.setFakeResponsesForCreateModule(responses);
154
+ const instance = this.CliCommandRunner([this.createModuleCommand]);
155
+ await instance.run();
156
+ return instance;
157
+ }
158
+ static async runCreatePackage(responses) {
159
+ this.setFakePromptResponsesForCreatePackage(responses);
160
+ const instance = this.CliCommandRunner([this.createPackageCommand]);
161
+ await instance.run();
162
+ return instance;
103
163
  }
104
164
  static setFakeAutomodule() {
105
165
  meta_node_1.NodeAutomodule.Class = meta_node_1.FakeAutomodule;
106
166
  meta_node_1.FakeAutomodule.resetTestDouble();
107
167
  }
168
+ static setFakeAutopackage() {
169
+ meta_node_1.NpmAutopackage.Class = meta_node_1.FakeAutopackage;
170
+ meta_node_1.FakeAutopackage.resetTestDouble();
171
+ }
108
172
  static setFakePrompts() {
109
173
  CliCommandRunner_1.default.prompts = fakePrompts_1.fakePrompts;
110
174
  (0, fakePrompts_1.resetCallsToFakePrompts)();
111
- (0, fakePrompts_1.setFakePromptsResponses)({
175
+ }
176
+ static setFakeResponsesForCreateModule(responses) {
177
+ (0, fakePrompts_1.setFakeResponses)({
112
178
  interfaceName: this.interfaceName,
113
179
  implName: this.implName,
180
+ ...responses,
181
+ });
182
+ }
183
+ static setFakePromptResponsesForCreatePackage(responses) {
184
+ (0, fakePrompts_1.setFakeResponses)({
185
+ packageName: this.packageName,
186
+ description: this.description,
187
+ ...responses,
114
188
  });
115
189
  }
116
190
  static CliCommandRunner(args) {
117
191
  return CliCommandRunner_1.default.Create(args ?? ['create.module']);
118
192
  }
119
193
  }
194
+ CliCommandRunnerTest.createModuleCommand = 'create.module';
195
+ CliCommandRunnerTest.createPackageCommand = 'create.package';
120
196
  CliCommandRunnerTest.interfaceName = (0, test_utils_1.generateId)();
121
197
  CliCommandRunnerTest.implName = (0, test_utils_1.generateId)();
198
+ CliCommandRunnerTest.packageName = (0, test_utils_1.generateId)();
199
+ CliCommandRunnerTest.description = (0, test_utils_1.generateId)();
200
+ CliCommandRunnerTest.githubToken = (0, test_utils_1.generateId)();
122
201
  CliCommandRunnerTest.interfaceNameMessage = 'What should the interface be called? Example: YourInterface';
123
202
  CliCommandRunnerTest.implNameMessage = 'What should the implementation class be called? Example: YourInterfaceImpl';
203
+ CliCommandRunnerTest.packageNameMessage = 'What should the package be called? Example: useful-package';
204
+ CliCommandRunnerTest.packageDescriptionMessage = 'What should the package description be? Example: A useful package.';
124
205
  exports.default = CliCommandRunnerTest;
125
206
  __decorate([
126
207
  (0, test_utils_1.test)()
127
- ], CliCommandRunnerTest, "createsInstance", null);
208
+ ], CliCommandRunnerTest, "throwsIfCommandIsNotSupported", null);
128
209
  __decorate([
129
210
  (0, test_utils_1.test)()
130
- ], CliCommandRunnerTest, "throwsIfCommandIsNotSupported", null);
211
+ ], CliCommandRunnerTest, "createModuleCreatesInstance", null);
212
+ __decorate([
213
+ (0, test_utils_1.test)()
214
+ ], CliCommandRunnerTest, "createModulePromptsUserForInput", null);
215
+ __decorate([
216
+ (0, test_utils_1.test)()
217
+ ], CliCommandRunnerTest, "createModuleDoesNotContinueIfPromptsIsInterrupted", null);
218
+ __decorate([
219
+ (0, test_utils_1.test)()
220
+ ], CliCommandRunnerTest, "createModuleCreatesNodeAutomodule", null);
221
+ __decorate([
222
+ (0, test_utils_1.test)()
223
+ ], CliCommandRunnerTest, "createModuleRunsNodeAutomodule", null);
224
+ __decorate([
225
+ (0, test_utils_1.test)()
226
+ ], CliCommandRunnerTest, "createPackageCreatesInstance", null);
131
227
  __decorate([
132
228
  (0, test_utils_1.test)()
133
- ], CliCommandRunnerTest, "promptsUserForInput", null);
229
+ ], CliCommandRunnerTest, "createPackagePromptsUserForInput", null);
134
230
  __decorate([
135
231
  (0, test_utils_1.test)()
136
- ], CliCommandRunnerTest, "createsNodeAutomodule", null);
232
+ ], CliCommandRunnerTest, "createPackageDoesNotContinueIfPromptsIsInterrupted", null);
137
233
  __decorate([
138
234
  (0, test_utils_1.test)()
139
- ], CliCommandRunnerTest, "callsRunOnNodeAutomodule", null);
235
+ ], CliCommandRunnerTest, "createPackageCreatesNpmAutopackage", null);
140
236
  __decorate([
141
237
  (0, test_utils_1.test)()
142
- ], CliCommandRunnerTest, "doesNotContinueIfPromptsIsInterrupted", null);
238
+ ], CliCommandRunnerTest, "createPackageRunsNpmAutopackage", null);
143
239
  //# sourceMappingURL=CliCommandRunner.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CliCommandRunner.test.js","sourceRoot":"","sources":["../../../src/__tests__/modules/CliCommandRunner.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CliCommandRunner.test.js","sourceRoot":"","sources":["../../../src/__tests__/modules/CliCommandRunner.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAAmB;AACnB,gDAAuB;AACvB,qEAI+B;AAC/B,oDAK6B;AAE7B,sFAA6D;AAC7D,uEAK8C;AAE9C,MAAqB,oBAAqB,SAAQ,oBAAkB;IAItD,MAAM,CAAC,KAAK,CAAC,UAAU;QAC7B,MAAM,KAAK,CAAC,UAAU,EAAE,CAAA;QAExB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,IAAI,CAAC,kBAAkB,EAAE,CAAA;QACzB,IAAI,CAAC,cAAc,EAAE,CAAA;QAErB,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,WAAW,CAAA;IAC/C,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,6BAA6B;QAChD,MAAM,UAAU,GAAG,IAAA,uBAAU,GAAE,CAAA;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;QAEpD,MAAM,GAAG,GAAG,MAAM,mBAAM,CAAC,cAAc,CACnC,KAAK,IAAI,EAAE,CAAC,MAAM,QAAQ,CAAC,GAAG,EAAE,CACnC,CAAA;QAED,mBAAM,CAAC,OAAO,CACV,GAAG,CAAC,OAAO,EACX,gBAAgB,UAAU,qBAAqB,EAC/C,qCAAqC,CACxC,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,2BAA2B;QAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAE7C,mBAAM,CAAC,QAAQ,CACX,QAAQ,EACR,iCAAiC,IAAI,CAAC,mBAAmB,GAAG,CAC/D,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,+BAA+B;QAClD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAE5B,mBAAM,CAAC,WAAW,CACd,gCAAkB,CAAC,CAAC,CAAC,EACrB;YACI;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,oBAAoB;aACrC;YACD;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,CAAC,eAAe;aAChC;SACJ,EACD,yCAAyC,CAC5C,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,iDAAiD;QACpE,MAAM,IAAI,CAAC,eAAe,CAAC;YACvB,aAAa,EAAE,EAAE;YACjB,QAAQ,EAAE,EAAE;SACf,CAAC,CAAA;QAEF,mBAAM,CAAC,OAAO,CACV,0BAAc,CAAC,aAAa,EAC5B,CAAC,EACD,+CAA+C,CAClD,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,iCAAiC;QACpD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAE5B,mBAAM,CAAC,WAAW,CACd,0BAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,EACpC;YACI,WAAW,EAAE,uBAAuB;YACpC,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;SAC1B,EACD,sDAAsD,CACzD,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,8BAA8B;QACjD,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAE5B,mBAAM,CAAC,OAAO,CACV,0BAAc,CAAC,aAAa,EAC5B,CAAC,EACD,qCAAqC,CACxC,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,4BAA4B;QAC/C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAE9C,mBAAM,CAAC,QAAQ,CACX,QAAQ,EACR,iCAAiC,IAAI,CAAC,oBAAoB,GAAG,CAChE,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,gCAAgC;QACnD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAE7B,mBAAM,CAAC,WAAW,CACd,gCAAkB,CAAC,CAAC,CAAC,EACrB;YACI;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,IAAI,CAAC,kBAAkB;aACnC;YACD;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,IAAI,CAAC,yBAAyB;aAC1C;SACJ,EACD,yCAAyC,CAC5C,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,kDAAkD;QACrE,MAAM,IAAI,CAAC,gBAAgB,CAAC;YACxB,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;SAClB,CAAC,CAAA;QAEF,mBAAM,CAAC,OAAO,CACV,2BAAe,CAAC,aAAa,EAC7B,CAAC,EACD,4CAA4C,CAC/C,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,kCAAkC;QACrD,IAAI,CAAC,sCAAsC,EAAE,CAAA;QAE7C,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAE7B,mBAAM,CAAC,WAAW,CACd,2BAAe,CAAC,kBAAkB,CAAC,CAAC,CAAC,EACrC;YACI,IAAI,EAAE,IAAI,CAAC,WAAW;YACtB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,WAAW;YACzB,YAAY,EAAE,WAAW;YACzB,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;YACvC,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,uCAAuC;SAClD,EACD,sDAAsD,CACzD,CAAA;IACL,CAAC;IAGsB,AAAb,MAAM,CAAC,KAAK,CAAC,+BAA+B;QAClD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAA;QAE7B,mBAAM,CAAC,OAAO,CACV,2BAAe,CAAC,aAAa,EAC7B,CAAC,EACD,kCAAkC,CACrC,CAAA;IACL,CAAC;IAEO,MAAM,CAAC,aAAa,CAAC,SAAiB;QAC1C,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;YAC5B,CAAC,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7C,CAAC,CAAC,SAAS,CAAA;IACnB,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,SAAkC;QACnE,IAAI,CAAC,+BAA+B,CAAC,SAAS,CAAC,CAAA;QAE/C,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAClE,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAA;QAEpB,OAAO,QAAQ,CAAA;IACnB,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,SAAkC;QACpE,IAAI,CAAC,sCAAsC,CAAC,SAAS,CAAC,CAAA;QAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAA;QACnE,MAAM,QAAQ,CAAC,GAAG,EAAE,CAAA;QAEpB,OAAO,QAAQ,CAAA;IACnB,CAAC;IAEO,MAAM,CAAC,iBAAiB;QAC5B,0BAAc,CAAC,KAAK,GAAG,0BAAc,CAAA;QACrC,0BAAc,CAAC,eAAe,EAAE,CAAA;IACpC,CAAC;IAEO,MAAM,CAAC,kBAAkB;QAC7B,0BAAc,CAAC,KAAK,GAAG,2BAAe,CAAA;QACtC,2BAAe,CAAC,eAAe,EAAE,CAAA;IACrC,CAAC;IAEO,MAAM,CAAC,cAAc;QACzB,0BAAgB,CAAC,OAAO,GAAG,yBAAwC,CAAA;QACnE,IAAA,qCAAuB,GAAE,CAAA;IAC7B,CAAC;IAEO,MAAM,CAAC,+BAA+B,CAC1C,SAAkC;QAElC,IAAA,8BAAgB,EAAC;YACb,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,GAAG,SAAS;SACf,CAAC,CAAA;IACN,CAAC;IAEO,MAAM,CAAC,sCAAsC,CACjD,SAAkC;QAElC,IAAA,8BAAgB,EAAC;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,SAAS;SACf,CAAC,CAAA;IACN,CAAC;IAoBO,MAAM,CAAC,gBAAgB,CAAC,IAAe;QAC3C,OAAO,0BAAgB,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;IAC7D,CAAC;;AAnQuB,wCAAmB,GAAG,eAAe,CAAA;AACrC,yCAAoB,GAAG,gBAAgB,CAAA;AA8OvC,kCAAa,GAAG,IAAA,uBAAU,GAAE,CAAA;AAC5B,6BAAQ,GAAG,IAAA,uBAAU,GAAE,CAAA;AACvB,gCAAW,GAAG,IAAA,uBAAU,GAAE,CAAA;AAC1B,gCAAW,GAAG,IAAA,uBAAU,GAAE,CAAA;AAC1B,gCAAW,GAAG,IAAA,uBAAU,GAAE,CAAA;AAE1B,yCAAoB,GACxC,6DAA6D,CAAA;AAEzC,oCAAe,GACnC,4EAA4E,CAAA;AAExD,uCAAkB,GACtC,4DAA4D,CAAA;AAExC,8CAAyB,GAC7C,oEAAoE,CAAA;kBAhQvD,oBAAoB;AAed;IADtB,IAAA,iBAAI,GAAE;+DAcN;AAGsB;IADtB,IAAA,iBAAI,GAAE;6DAQN;AAGsB;IADtB,IAAA,iBAAI,GAAE;iEAoBN;AAGsB;IADtB,IAAA,iBAAI,GAAE;mFAYN;AAGsB;IADtB,IAAA,iBAAI,GAAE;mEAcN;AAGsB;IADtB,IAAA,iBAAI,GAAE;gEASN;AAGsB;IADtB,IAAA,iBAAI,GAAE;8DAQN;AAGsB;IADtB,IAAA,iBAAI,GAAE;kEAoBN;AAGsB;IADtB,IAAA,iBAAI,GAAE;oFAYN;AAGsB;IADtB,IAAA,iBAAI,GAAE;oEAmBN;AAGsB;IADtB,IAAA,iBAAI,GAAE;iEASN"}
@@ -3,20 +3,34 @@ export default class CliCommandRunner implements CommandRunner {
3
3
  static Class?: CommandRunnerConstructor;
4
4
  static prompts: typeof prompts;
5
5
  private args;
6
- private currentInterfaceName;
7
- private currentImplName;
6
+ private interfaceName;
7
+ private implName;
8
+ private packageName;
9
+ private description;
10
+ private readonly createModuleCommand;
11
+ private readonly createPackageCommand;
12
+ private readonly supportedCommands;
8
13
  protected constructor(args: string[]);
9
14
  static Create(args: string[]): CommandRunner;
10
15
  run(): Promise<void>;
11
16
  private throwIfCommandIsNotSupported;
17
+ private get commandIsSupported();
12
18
  private get command();
13
- private promptUserInput;
19
+ private runCommand;
20
+ private createModule;
21
+ private promptForAutomodule;
14
22
  private readonly interfaceNameMessage;
15
23
  private readonly implNameMessage;
24
+ private get userInputExistsForCreateModule();
25
+ private createPackage;
26
+ private promptForAutopackage;
27
+ private readonly packageNameMessage;
28
+ private readonly packageDescriptionMessage;
29
+ private get userInputExistsForCreatePackage();
30
+ private expandHomeDir;
16
31
  private get prompts();
17
- private get userInputExists();
18
- private createModule;
19
32
  private NodeAutomodule;
33
+ private NpmAutopackage;
20
34
  }
21
35
  export interface CommandRunner {
22
36
  run(): Promise<void>;
@@ -3,12 +3,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const os_1 = __importDefault(require("os"));
7
+ const path_1 = __importDefault(require("path"));
6
8
  const meta_node_1 = require("@neurodevs/meta-node");
7
9
  const prompts_1 = __importDefault(require("prompts"));
8
10
  class CliCommandRunner {
9
11
  constructor(args) {
12
+ this.createModuleCommand = 'create.module';
13
+ this.createPackageCommand = 'create.package';
14
+ this.supportedCommands = [
15
+ this.createModuleCommand,
16
+ this.createPackageCommand,
17
+ ];
10
18
  this.interfaceNameMessage = 'What should the interface be called? Example: YourInterface';
11
19
  this.implNameMessage = 'What should the implementation class be called? Example: YourInterfaceImpl';
20
+ this.packageNameMessage = 'What should the package be called? Example: useful-package';
21
+ this.packageDescriptionMessage = 'What should the package description be? Example: A useful package.';
12
22
  this.args = args;
13
23
  }
14
24
  static Create(args) {
@@ -16,23 +26,38 @@ class CliCommandRunner {
16
26
  }
17
27
  async run() {
18
28
  this.throwIfCommandIsNotSupported();
19
- const { interfaceName, implName } = await this.promptUserInput();
20
- this.currentInterfaceName = interfaceName;
21
- this.currentImplName = implName;
22
- if (!this.userInputExists) {
23
- return;
24
- }
25
- await this.createModule();
29
+ await this.runCommand();
26
30
  }
27
31
  throwIfCommandIsNotSupported() {
28
- if (this.command !== 'create.module') {
32
+ if (!this.commandIsSupported) {
29
33
  throw new Error(`The command "${this.command}" is not supported!`);
30
34
  }
31
35
  }
36
+ get commandIsSupported() {
37
+ return this.supportedCommands.includes(this.command);
38
+ }
32
39
  get command() {
33
40
  return this.args[0];
34
41
  }
35
- async promptUserInput() {
42
+ async runCommand() {
43
+ if (this.command === 'create.module') {
44
+ await this.createModule();
45
+ }
46
+ else if (this.command === 'create.package') {
47
+ await this.createPackage();
48
+ }
49
+ }
50
+ async createModule() {
51
+ const { interfaceName, implName } = await this.promptForAutomodule();
52
+ this.interfaceName = interfaceName;
53
+ this.implName = implName;
54
+ if (!this.userInputExistsForCreateModule) {
55
+ return;
56
+ }
57
+ const automodule = this.NodeAutomodule();
58
+ await automodule.run();
59
+ }
60
+ async promptForAutomodule() {
36
61
  return await this.prompts([
37
62
  {
38
63
  type: 'text',
@@ -46,22 +71,61 @@ class CliCommandRunner {
46
71
  },
47
72
  ]);
48
73
  }
49
- get prompts() {
50
- return CliCommandRunner.prompts;
74
+ get userInputExistsForCreateModule() {
75
+ return this.interfaceName && this.implName;
51
76
  }
52
- get userInputExists() {
53
- return this.currentInterfaceName && this.currentImplName;
77
+ async createPackage() {
78
+ const { packageName, description } = await this.promptForAutopackage();
79
+ this.packageName = packageName;
80
+ this.description = description;
81
+ if (!this.userInputExistsForCreatePackage) {
82
+ return;
83
+ }
84
+ const autopackage = this.NpmAutopackage();
85
+ await autopackage.run();
54
86
  }
55
- async createModule() {
56
- const automodule = this.NodeAutomodule();
57
- await automodule.run();
87
+ async promptForAutopackage() {
88
+ return await this.prompts([
89
+ {
90
+ type: 'text',
91
+ name: 'packageName',
92
+ message: this.packageNameMessage,
93
+ },
94
+ {
95
+ type: 'text',
96
+ name: 'description',
97
+ message: this.packageDescriptionMessage,
98
+ },
99
+ ]);
100
+ }
101
+ get userInputExistsForCreatePackage() {
102
+ return this.packageName && this.description;
103
+ }
104
+ expandHomeDir(inputPath) {
105
+ return inputPath.startsWith('~')
106
+ ? path_1.default.join(os_1.default.homedir(), inputPath.slice(1))
107
+ : inputPath;
108
+ }
109
+ get prompts() {
110
+ return CliCommandRunner.prompts;
58
111
  }
59
112
  NodeAutomodule() {
60
113
  return meta_node_1.NodeAutomodule.Create({
61
114
  testSaveDir: 'src/__tests__/modules',
62
115
  moduleSaveDir: 'src/modules',
63
- interfaceName: this.currentInterfaceName,
64
- implName: this.currentImplName,
116
+ interfaceName: this.interfaceName,
117
+ implName: this.implName,
118
+ });
119
+ }
120
+ NpmAutopackage() {
121
+ return meta_node_1.NpmAutopackage.Create({
122
+ name: this.packageName,
123
+ description: this.description,
124
+ gitNamespace: 'neurodevs',
125
+ npmNamespace: 'neurodevs',
126
+ installDir: this.expandHomeDir('~/dev'),
127
+ license: 'MIT',
128
+ author: 'Eric Yates <hello@ericthecurious.com>',
65
129
  });
66
130
  }
67
131
  }
@@ -1 +1 @@
1
- {"version":3,"file":"CliCommandRunner.js","sourceRoot":"","sources":["../../src/modules/CliCommandRunner.ts"],"names":[],"mappings":";;;;;AAAA,oDAAqD;AACrD,sDAA6B;AAE7B,MAAqB,gBAAgB;IASjC,YAAsB,IAAc;QAgDnB,yBAAoB,GACjC,6DAA6D,CAAA;QAEhD,oBAAe,GAC5B,4EAA4E,CAAA;QAnD5E,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IACpB,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,IAAc;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,CAAA;IACzC,CAAC;IAEM,KAAK,CAAC,GAAG;QACZ,IAAI,CAAC,4BAA4B,EAAE,CAAA;QAEnC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAA;QAEhE,IAAI,CAAC,oBAAoB,GAAG,aAAa,CAAA;QACzC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAA;QAE/B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,OAAM;QACV,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;IAC7B,CAAC;IAEO,4BAA4B;QAChC,IAAI,IAAI,CAAC,OAAO,KAAK,eAAe,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,CAAC,OAAO,qBAAqB,CAAC,CAAA;QACtE,CAAC;IACL,CAAC;IAED,IAAY,OAAO;QACf,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvB,CAAC;IAEO,KAAK,CAAC,eAAe;QACzB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC;YACtB;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,IAAI,CAAC,oBAAoB;aACrC;YACD;gBACI,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,UAAU;gBAChB,OAAO,EAAE,IAAI,CAAC,eAAe;aAChC;SACJ,CAAC,CAAA;IACN,CAAC;IAQD,IAAY,OAAO;QACf,OAAO,gBAAgB,CAAC,OAAO,CAAA;IACnC,CAAC;IAED,IAAY,eAAe;QACvB,OAAO,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,eAAe,CAAA;IAC5D,CAAC;IAEO,KAAK,CAAC,YAAY;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QACxC,MAAM,UAAU,CAAC,GAAG,EAAE,CAAA;IAC1B,CAAC;IAEO,cAAc;QAClB,OAAO,0BAAc,CAAC,MAAM,CAAC;YACzB,WAAW,EAAE,uBAAuB;YACpC,aAAa,EAAE,aAAa;YAC5B,aAAa,EAAE,IAAI,CAAC,oBAAoB;YACxC,QAAQ,EAAE,IAAI,CAAC,eAAe;SACjC,CAAC,CAAA;IACN,CAAC;;AAjFa,wBAAO,GAAG,iBAAO,AAAV,CAAU;kBAFd,gBAAgB"}
1
+ {"version":3,"file":"CliCommandRunner.js","sourceRoot":"","sources":["../../src/modules/CliCommandRunner.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  export declare let callsToFakePrompts: Record<string, string>[][];
2
2
  export declare function resetCallsToFakePrompts(): void;
3
3
  export declare let fakeResponses: Record<string, string>;
4
- export declare function setFakePromptsResponses(responses: Record<string, string>): void;
4
+ export declare function setFakeResponses(responses: Record<string, string>): void;
5
5
  export declare function fakePrompts(questions: Record<string, string>[]): Record<string, string>;
@@ -2,14 +2,14 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.fakeResponses = exports.callsToFakePrompts = void 0;
4
4
  exports.resetCallsToFakePrompts = resetCallsToFakePrompts;
5
- exports.setFakePromptsResponses = setFakePromptsResponses;
5
+ exports.setFakeResponses = setFakeResponses;
6
6
  exports.fakePrompts = fakePrompts;
7
7
  exports.callsToFakePrompts = [];
8
8
  function resetCallsToFakePrompts() {
9
9
  exports.callsToFakePrompts = [];
10
10
  }
11
11
  exports.fakeResponses = {};
12
- function setFakePromptsResponses(responses) {
12
+ function setFakeResponses(responses) {
13
13
  exports.fakeResponses = responses;
14
14
  }
15
15
  function fakePrompts(questions) {
@@ -1 +1 @@
1
- {"version":3,"file":"fakePrompts.js","sourceRoot":"","sources":["../../../src/testDoubles/prompts/fakePrompts.ts"],"names":[],"mappings":";;;AAEA,0DAEC;AAID,0DAEC;AAED,kCAGC;AAfU,QAAA,kBAAkB,GAA+B,EAAE,CAAA;AAE9D,SAAgB,uBAAuB;IACnC,0BAAkB,GAAG,EAAE,CAAA;AAC3B,CAAC;AAEU,QAAA,aAAa,GAA2B,EAAE,CAAA;AAErD,SAAgB,uBAAuB,CAAC,SAAiC;IACrE,qBAAa,GAAG,SAAS,CAAA;AAC7B,CAAC;AAED,SAAgB,WAAW,CAAC,SAAmC;IAC3D,0BAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAClC,OAAO,qBAAa,CAAA;AACxB,CAAC"}
1
+ {"version":3,"file":"fakePrompts.js","sourceRoot":"","sources":["../../../src/testDoubles/prompts/fakePrompts.ts"],"names":[],"mappings":";;;AAEA,0DAEC;AAID,4CAEC;AAED,kCAGC;AAfU,QAAA,kBAAkB,GAA+B,EAAE,CAAA;AAE9D,SAAgB,uBAAuB;IACnC,0BAAkB,GAAG,EAAE,CAAA;AAC3B,CAAC;AAEU,QAAA,aAAa,GAA2B,EAAE,CAAA;AAErD,SAAgB,gBAAgB,CAAC,SAAiC;IAC9D,qBAAa,GAAG,SAAS,CAAA;AAC7B,CAAC;AAED,SAAgB,WAAW,CAAC,SAAmC;IAC3D,0BAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAClC,OAAO,qBAAa,CAAA;AACxB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neurodevs/ndx-cli",
3
- "version": "0.0.3",
3
+ "version": "0.1.0",
4
4
  "main": "build/index.js",
5
5
  "repository": "https://github.com/neurodevs/ndx-cli.git",
6
6
  "license": "MIT",
@@ -30,7 +30,7 @@
30
30
  "watch.tsc": "tsc -w"
31
31
  },
32
32
  "dependencies": {
33
- "@neurodevs/meta-node": "^0.1.0",
33
+ "@neurodevs/meta-node": "^0.4.1",
34
34
  "prompts": "^2.4.2"
35
35
  },
36
36
  "devDependencies": {
@@ -1,38 +1,42 @@
1
+ import os from 'os'
2
+ import path from 'path'
1
3
  import AbstractSpruceTest, {
2
4
  test,
3
5
  assert,
4
6
  generateId,
5
7
  } from '@sprucelabs/test-utils'
6
- import { FakeAutomodule, NodeAutomodule } from '@neurodevs/meta-node'
7
- import CliCommandRunner, { CommandRunner } from '../../modules/CliCommandRunner'
8
+ import {
9
+ FakeAutomodule,
10
+ FakeAutopackage,
11
+ NodeAutomodule,
12
+ NpmAutopackage,
13
+ } from '@neurodevs/meta-node'
14
+ import prompts from 'prompts'
15
+ import CliCommandRunner from '../../modules/CliCommandRunner'
8
16
  import {
9
17
  callsToFakePrompts,
10
18
  fakePrompts,
11
19
  resetCallsToFakePrompts,
12
- setFakePromptsResponses,
20
+ setFakeResponses,
13
21
  } from '../../testDoubles/prompts/fakePrompts'
14
22
 
15
23
  export default class CliCommandRunnerTest extends AbstractSpruceTest {
16
- private static instance: CommandRunner
24
+ private static readonly createModuleCommand = 'create.module'
25
+ private static readonly createPackageCommand = 'create.package'
17
26
 
18
27
  protected static async beforeEach() {
19
28
  await super.beforeEach()
20
29
 
21
30
  this.setFakeAutomodule()
31
+ this.setFakeAutopackage()
22
32
  this.setFakePrompts()
23
33
 
24
- this.instance = this.CliCommandRunner()
25
- }
26
-
27
- @test()
28
- protected static async createsInstance() {
29
- assert.isTruthy(this.instance, 'Failed to create instance!')
34
+ process.env.GITHUB_TOKEN = this.githubToken
30
35
  }
31
36
 
32
37
  @test()
33
38
  protected static async throwsIfCommandIsNotSupported() {
34
39
  const invalidArg = generateId()
35
-
36
40
  const instance = this.CliCommandRunner([invalidArg])
37
41
 
38
42
  const err = await assert.doesThrowAsync(
@@ -47,64 +51,178 @@ export default class CliCommandRunnerTest extends AbstractSpruceTest {
47
51
  }
48
52
 
49
53
  @test()
50
- protected static async promptsUserForInput() {
51
- await this.run()
54
+ protected static async createModuleCreatesInstance() {
55
+ const instance = await this.runCreateModule()
52
56
 
53
- assert.isEqualDeep(callsToFakePrompts[0], [
54
- {
55
- type: 'text',
56
- name: 'interfaceName',
57
- message: this.interfaceNameMessage,
58
- },
59
- {
60
- type: 'text',
61
- name: 'implName',
62
- message: this.implNameMessage,
63
- },
64
- ])
57
+ assert.isTruthy(
58
+ instance,
59
+ `Failed to create instance for ${this.createModuleCommand}!`
60
+ )
65
61
  }
66
62
 
67
63
  @test()
68
- protected static async createsNodeAutomodule() {
69
- await this.run()
64
+ protected static async createModulePromptsUserForInput() {
65
+ await this.runCreateModule()
70
66
 
71
- assert.isEqualDeep(FakeAutomodule.callsToConstructor[0], {
72
- testSaveDir: 'src/__tests__/modules',
73
- moduleSaveDir: 'src/modules',
74
- interfaceName: this.interfaceName,
75
- implName: this.implName,
67
+ assert.isEqualDeep(
68
+ callsToFakePrompts[0],
69
+ [
70
+ {
71
+ type: 'text',
72
+ name: 'interfaceName',
73
+ message: this.interfaceNameMessage,
74
+ },
75
+ {
76
+ type: 'text',
77
+ name: 'implName',
78
+ message: this.implNameMessage,
79
+ },
80
+ ],
81
+ 'Did not prompt user for expected input!'
82
+ )
83
+ }
84
+
85
+ @test()
86
+ protected static async createModuleDoesNotContinueIfPromptsIsInterrupted() {
87
+ await this.runCreateModule({
88
+ interfaceName: '',
89
+ implName: '',
76
90
  })
91
+
92
+ assert.isEqual(
93
+ FakeAutomodule.numCallsToRun,
94
+ 0,
95
+ 'Should not have called run on NodeAutomodule!'
96
+ )
77
97
  }
78
98
 
79
99
  @test()
80
- protected static async callsRunOnNodeAutomodule() {
81
- await this.run()
100
+ protected static async createModuleCreatesNodeAutomodule() {
101
+ await this.runCreateModule()
102
+
103
+ assert.isEqualDeep(
104
+ FakeAutomodule.callsToConstructor[0],
105
+ {
106
+ testSaveDir: 'src/__tests__/modules',
107
+ moduleSaveDir: 'src/modules',
108
+ interfaceName: this.interfaceName,
109
+ implName: this.implName,
110
+ },
111
+ 'Did not create NodeAutomodule with expected options!'
112
+ )
113
+ }
114
+
115
+ @test()
116
+ protected static async createModuleRunsNodeAutomodule() {
117
+ await this.runCreateModule()
82
118
 
83
119
  assert.isEqual(
84
120
  FakeAutomodule.numCallsToRun,
85
121
  1,
86
- 'Did not call run on Automodule!'
122
+ 'Did not call run on NodeAutomodule!'
87
123
  )
88
124
  }
89
125
 
90
126
  @test()
91
- protected static async doesNotContinueIfPromptsIsInterrupted() {
92
- setFakePromptsResponses({
93
- interfaceName: '',
94
- implName: '',
95
- })
127
+ protected static async createPackageCreatesInstance() {
128
+ const instance = await this.runCreatePackage()
96
129
 
97
- await this.run()
130
+ assert.isTruthy(
131
+ instance,
132
+ `Failed to create instance for ${this.createPackageCommand}!`
133
+ )
134
+ }
135
+
136
+ @test()
137
+ protected static async createPackagePromptsUserForInput() {
138
+ await this.runCreatePackage()
139
+
140
+ assert.isEqualDeep(
141
+ callsToFakePrompts[0],
142
+ [
143
+ {
144
+ type: 'text',
145
+ name: 'packageName',
146
+ message: this.packageNameMessage,
147
+ },
148
+ {
149
+ type: 'text',
150
+ name: 'description',
151
+ message: this.packageDescriptionMessage,
152
+ },
153
+ ],
154
+ 'Did not prompt user for expected input!'
155
+ )
156
+ }
157
+
158
+ @test()
159
+ protected static async createPackageDoesNotContinueIfPromptsIsInterrupted() {
160
+ await this.runCreatePackage({
161
+ packageName: '',
162
+ description: '',
163
+ })
98
164
 
99
165
  assert.isEqual(
100
- FakeAutomodule.numCallsToRun,
166
+ FakeAutopackage.numCallsToRun,
101
167
  0,
102
- 'Should not have called run on Automodule!'
168
+ 'Should not have called run on Autopackage!'
103
169
  )
104
170
  }
105
171
 
106
- private static run() {
107
- return this.instance.run()
172
+ @test()
173
+ protected static async createPackageCreatesNpmAutopackage() {
174
+ this.setFakePromptResponsesForCreatePackage()
175
+
176
+ await this.runCreatePackage()
177
+
178
+ assert.isEqualDeep(
179
+ FakeAutopackage.callsToConstructor[0],
180
+ {
181
+ name: this.packageName,
182
+ description: this.description,
183
+ gitNamespace: 'neurodevs',
184
+ npmNamespace: 'neurodevs',
185
+ installDir: this.expandHomeDir('~/dev'),
186
+ license: 'MIT',
187
+ author: 'Eric Yates <hello@ericthecurious.com>',
188
+ },
189
+ 'Did not create NpmAutopackage with expected options!'
190
+ )
191
+ }
192
+
193
+ @test()
194
+ protected static async createPackageRunsNpmAutopackage() {
195
+ await this.runCreatePackage()
196
+
197
+ assert.isEqual(
198
+ FakeAutopackage.numCallsToRun,
199
+ 1,
200
+ 'Did not call run on Autopackage!'
201
+ )
202
+ }
203
+
204
+ private static expandHomeDir(inputPath: string): string {
205
+ return inputPath.startsWith('~')
206
+ ? path.join(os.homedir(), inputPath.slice(1))
207
+ : inputPath
208
+ }
209
+
210
+ private static async runCreateModule(responses?: Record<string, string>) {
211
+ this.setFakeResponsesForCreateModule(responses)
212
+
213
+ const instance = this.CliCommandRunner([this.createModuleCommand])
214
+ await instance.run()
215
+
216
+ return instance
217
+ }
218
+
219
+ private static async runCreatePackage(responses?: Record<string, string>) {
220
+ this.setFakePromptResponsesForCreatePackage(responses)
221
+
222
+ const instance = this.CliCommandRunner([this.createPackageCommand])
223
+ await instance.run()
224
+
225
+ return instance
108
226
  }
109
227
 
110
228
  private static setFakeAutomodule() {
@@ -112,18 +230,41 @@ export default class CliCommandRunnerTest extends AbstractSpruceTest {
112
230
  FakeAutomodule.resetTestDouble()
113
231
  }
114
232
 
233
+ private static setFakeAutopackage() {
234
+ NpmAutopackage.Class = FakeAutopackage
235
+ FakeAutopackage.resetTestDouble()
236
+ }
237
+
115
238
  private static setFakePrompts() {
116
- CliCommandRunner.prompts = fakePrompts as any
239
+ CliCommandRunner.prompts = fakePrompts as unknown as typeof prompts
117
240
  resetCallsToFakePrompts()
241
+ }
118
242
 
119
- setFakePromptsResponses({
243
+ private static setFakeResponsesForCreateModule(
244
+ responses?: Record<string, string>
245
+ ) {
246
+ setFakeResponses({
120
247
  interfaceName: this.interfaceName,
121
248
  implName: this.implName,
249
+ ...responses,
250
+ })
251
+ }
252
+
253
+ private static setFakePromptResponsesForCreatePackage(
254
+ responses?: Record<string, string>
255
+ ) {
256
+ setFakeResponses({
257
+ packageName: this.packageName,
258
+ description: this.description,
259
+ ...responses,
122
260
  })
123
261
  }
124
262
 
125
263
  private static readonly interfaceName = generateId()
126
264
  private static readonly implName = generateId()
265
+ private static readonly packageName = generateId()
266
+ private static readonly description = generateId()
267
+ private static readonly githubToken = generateId()
127
268
 
128
269
  private static readonly interfaceNameMessage =
129
270
  'What should the interface be called? Example: YourInterface'
@@ -131,6 +272,12 @@ export default class CliCommandRunnerTest extends AbstractSpruceTest {
131
272
  private static readonly implNameMessage =
132
273
  'What should the implementation class be called? Example: YourInterfaceImpl'
133
274
 
275
+ private static readonly packageNameMessage =
276
+ 'What should the package be called? Example: useful-package'
277
+
278
+ private static readonly packageDescriptionMessage =
279
+ 'What should the package description be? Example: A useful package.'
280
+
134
281
  private static CliCommandRunner(args?: string[]) {
135
282
  return CliCommandRunner.Create(args ?? ['create.module'])
136
283
  }
@@ -1,4 +1,6 @@
1
- import { NodeAutomodule } from '@neurodevs/meta-node'
1
+ import os from 'os'
2
+ import path from 'path'
3
+ import { NodeAutomodule, NpmAutopackage } from '@neurodevs/meta-node'
2
4
  import prompts from 'prompts'
3
5
 
4
6
  export default class CliCommandRunner implements CommandRunner {
@@ -7,8 +9,18 @@ export default class CliCommandRunner implements CommandRunner {
7
9
 
8
10
  private args: string[]
9
11
 
10
- private currentInterfaceName!: string
11
- private currentImplName!: string
12
+ private interfaceName!: string
13
+ private implName!: string
14
+ private packageName!: string
15
+ private description!: string
16
+
17
+ private readonly createModuleCommand = 'create.module'
18
+ private readonly createPackageCommand = 'create.package'
19
+
20
+ private readonly supportedCommands = [
21
+ this.createModuleCommand,
22
+ this.createPackageCommand,
23
+ ]
12
24
 
13
25
  protected constructor(args: string[]) {
14
26
  this.args = args
@@ -20,30 +32,46 @@ export default class CliCommandRunner implements CommandRunner {
20
32
 
21
33
  public async run() {
22
34
  this.throwIfCommandIsNotSupported()
23
-
24
- const { interfaceName, implName } = await this.promptUserInput()
25
-
26
- this.currentInterfaceName = interfaceName
27
- this.currentImplName = implName
28
-
29
- if (!this.userInputExists) {
30
- return
31
- }
32
-
33
- await this.createModule()
35
+ await this.runCommand()
34
36
  }
35
37
 
36
38
  private throwIfCommandIsNotSupported() {
37
- if (this.command !== 'create.module') {
39
+ if (!this.commandIsSupported) {
38
40
  throw new Error(`The command "${this.command}" is not supported!`)
39
41
  }
40
42
  }
41
43
 
44
+ private get commandIsSupported() {
45
+ return this.supportedCommands.includes(this.command)
46
+ }
47
+
42
48
  private get command() {
43
49
  return this.args[0]
44
50
  }
45
51
 
46
- private async promptUserInput() {
52
+ private async runCommand() {
53
+ if (this.command === 'create.module') {
54
+ await this.createModule()
55
+ } else if (this.command === 'create.package') {
56
+ await this.createPackage()
57
+ }
58
+ }
59
+
60
+ private async createModule() {
61
+ const { interfaceName, implName } = await this.promptForAutomodule()
62
+
63
+ this.interfaceName = interfaceName
64
+ this.implName = implName
65
+
66
+ if (!this.userInputExistsForCreateModule) {
67
+ return
68
+ }
69
+
70
+ const automodule = this.NodeAutomodule()
71
+ await automodule.run()
72
+ }
73
+
74
+ private async promptForAutomodule() {
47
75
  return await this.prompts([
48
76
  {
49
77
  type: 'text',
@@ -64,25 +92,77 @@ export default class CliCommandRunner implements CommandRunner {
64
92
  private readonly implNameMessage =
65
93
  'What should the implementation class be called? Example: YourInterfaceImpl'
66
94
 
67
- private get prompts() {
68
- return CliCommandRunner.prompts
95
+ private get userInputExistsForCreateModule() {
96
+ return this.interfaceName && this.implName
97
+ }
98
+
99
+ private async createPackage() {
100
+ const { packageName, description } = await this.promptForAutopackage()
101
+
102
+ this.packageName = packageName
103
+ this.description = description
104
+
105
+ if (!this.userInputExistsForCreatePackage) {
106
+ return
107
+ }
108
+
109
+ const autopackage = this.NpmAutopackage()
110
+ await autopackage.run()
69
111
  }
70
112
 
71
- private get userInputExists() {
72
- return this.currentInterfaceName && this.currentImplName
113
+ private async promptForAutopackage() {
114
+ return await this.prompts([
115
+ {
116
+ type: 'text',
117
+ name: 'packageName',
118
+ message: this.packageNameMessage,
119
+ },
120
+ {
121
+ type: 'text',
122
+ name: 'description',
123
+ message: this.packageDescriptionMessage,
124
+ },
125
+ ])
73
126
  }
74
127
 
75
- private async createModule() {
76
- const automodule = this.NodeAutomodule()
77
- await automodule.run()
128
+ private readonly packageNameMessage =
129
+ 'What should the package be called? Example: useful-package'
130
+
131
+ private readonly packageDescriptionMessage =
132
+ 'What should the package description be? Example: A useful package.'
133
+
134
+ private get userInputExistsForCreatePackage() {
135
+ return this.packageName && this.description
136
+ }
137
+
138
+ private expandHomeDir(inputPath: string): string {
139
+ return inputPath.startsWith('~')
140
+ ? path.join(os.homedir(), inputPath.slice(1))
141
+ : inputPath
142
+ }
143
+
144
+ private get prompts() {
145
+ return CliCommandRunner.prompts
78
146
  }
79
147
 
80
148
  private NodeAutomodule() {
81
149
  return NodeAutomodule.Create({
82
150
  testSaveDir: 'src/__tests__/modules',
83
151
  moduleSaveDir: 'src/modules',
84
- interfaceName: this.currentInterfaceName,
85
- implName: this.currentImplName,
152
+ interfaceName: this.interfaceName,
153
+ implName: this.implName,
154
+ })
155
+ }
156
+
157
+ private NpmAutopackage() {
158
+ return NpmAutopackage.Create({
159
+ name: this.packageName,
160
+ description: this.description,
161
+ gitNamespace: 'neurodevs',
162
+ npmNamespace: 'neurodevs',
163
+ installDir: this.expandHomeDir('~/dev'),
164
+ license: 'MIT',
165
+ author: 'Eric Yates <hello@ericthecurious.com>',
86
166
  })
87
167
  }
88
168
  }
@@ -6,7 +6,7 @@ export function resetCallsToFakePrompts() {
6
6
 
7
7
  export let fakeResponses: Record<string, string> = {}
8
8
 
9
- export function setFakePromptsResponses(responses: Record<string, string>) {
9
+ export function setFakeResponses(responses: Record<string, string>) {
10
10
  fakeResponses = responses
11
11
  }
12
12